{"version":3,"file":"mustache.min.js","sources":["../../../../node_modules/mustache/mustache.js"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.Mustache = factory());\n}(this, (function () { 'use strict';\n\n /*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\n var objectToString = Object.prototype.toString;\n var isArray = Array.isArray || function isArrayPolyfill (object) {\n return objectToString.call(object) === '[object Array]';\n };\n\n function isFunction (object) {\n return typeof object === 'function';\n }\n\n /**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\n function typeStr (obj) {\n return isArray(obj) ? 'array' : typeof obj;\n }\n\n function escapeRegExp (string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n }\n\n /**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\n function hasProperty (obj, propName) {\n return obj != null && typeof obj === 'object' && (propName in obj);\n }\n\n /**\n * Safe way of detecting whether or not the given thing is a primitive and\n * whether it has the given property\n */\n function primitiveHasOwnProperty (primitive, propName) {\n return (\n primitive != null\n && typeof primitive !== 'object'\n && primitive.hasOwnProperty\n && primitive.hasOwnProperty(propName)\n );\n }\n\n // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n // See https://github.com/janl/mustache.js/issues/189\n var regExpTest = RegExp.prototype.test;\n function testRegExp (re, string) {\n return regExpTest.call(re, string);\n }\n\n var nonSpaceRe = /\\S/;\n function isWhitespace (string) {\n return !testRegExp(nonSpaceRe, string);\n }\n\n var entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n };\n\n function escapeHtml (string) {\n return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap (s) {\n return entityMap[s];\n });\n }\n\n var whiteRe = /\\s*/;\n var spaceRe = /\\s+/;\n var equalsRe = /\\s*=/;\n var curlyRe = /\\s*\\}/;\n var tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n /**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n *\n * Tokens for partials also contain two more elements: 1) a string value of\n * indendation prior to that tag and 2) the index of that tag on that line -\n * eg a value of 2 indicates the partial is the third tag on this line.\n */\n function parseTemplate (template, tags) {\n if (!template)\n return [];\n var lineHasNonSpace = false;\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n var indentation = ''; // Tracks indentation for tags that use it\n var tagIndex = 0; // Stores a count of number of tags encountered on a line\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace () {\n if (hasTag && !nonSpace) {\n while (spaces.length)\n delete tokens[spaces.pop()];\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n function compileTags (tagsToCompile) {\n if (typeof tagsToCompile === 'string')\n tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n throw new Error('Invalid tags: ' + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + '\\\\s*');\n closingTagRe = new RegExp('\\\\s*' + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + tagsToCompile[1]));\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n indentation += chr;\n } else {\n nonSpace = true;\n lineHasNonSpace = true;\n indentation += ' ';\n }\n\n tokens.push([ 'text', chr, start, start + 1 ]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === '\\n') {\n stripSpace();\n indentation = '';\n tagIndex = 0;\n lineHasNonSpace = false;\n }\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe))\n break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || 'name';\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === '=') {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === '{') {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = '&';\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe))\n throw new Error('Unclosed tag at ' + scanner.pos);\n\n if (type == '>') {\n token = [ type, value, start, scanner.pos, indentation, tagIndex, lineHasNonSpace ];\n } else {\n token = [ type, value, start, scanner.pos ];\n }\n tagIndex++;\n tokens.push(token);\n\n if (type === '#' || type === '^') {\n sections.push(token);\n } else if (type === '/') {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection)\n throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value)\n throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + start);\n } else if (type === 'name' || type === '{' || type === '&') {\n nonSpace = true;\n } else if (type === '=') {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n stripSpace();\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection)\n throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos);\n\n return nestTokens(squashTokens(tokens));\n }\n\n /**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\n function squashTokens (tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n /**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\n function nestTokens (tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case '#':\n case '^':\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case '/':\n section = sections.pop();\n section[5] = token[2];\n collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n /**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\n function Scanner (string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n /**\n * Returns `true` if the tail is empty (end of string).\n */\n Scanner.prototype.eos = function eos () {\n return this.tail === '';\n };\n\n /**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\n Scanner.prototype.scan = function scan (re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0)\n return '';\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n };\n\n /**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\n Scanner.prototype.scanUntil = function scanUntil (re) {\n var index = this.tail.search(re), match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = '';\n break;\n case 0:\n match = '';\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n };\n\n /**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\n function Context (view, parentContext) {\n this.view = view;\n this.cache = { '.': this.view };\n this.parent = parentContext;\n }\n\n /**\n * Creates a new context using the given view with this context\n * as the parent.\n */\n Context.prototype.push = function push (view) {\n return new Context(view, this);\n };\n\n /**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\n Context.prototype.lookup = function lookup (name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this, intermediateValue, names, index, lookupHit = false;\n\n while (context) {\n if (name.indexOf('.') > 0) {\n intermediateValue = context.view;\n names = name.split('.');\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n *\n * In the case where dot notation is used, we consider the lookup\n * to be successful even if the last \"object\" in the path is\n * not actually an object but a primitive (e.g., a string, or an\n * integer), because it is sometimes useful to access a property\n * of an autoboxed primitive, such as the length of a string.\n **/\n while (intermediateValue != null && index < names.length) {\n if (index === names.length - 1)\n lookupHit = (\n hasProperty(intermediateValue, names[index])\n || primitiveHasOwnProperty(intermediateValue, names[index])\n );\n\n intermediateValue = intermediateValue[names[index++]];\n }\n } else {\n intermediateValue = context.view[name];\n\n /**\n * Only checking against `hasProperty`, which always returns `false` if\n * `context.view` is not an object. Deliberately omitting the check\n * against `primitiveHasOwnProperty` if dot notation is not used.\n *\n * Consider this example:\n * ```\n * Mustache.render(\"The length of a football field is {{#length}}{{length}}{{/length}}.\", {length: \"100 yards\"})\n * ```\n *\n * If we were to check also against `primitiveHasOwnProperty`, as we do\n * in the dot notation case, then render call would return:\n *\n * \"The length of a football field is 9.\"\n *\n * rather than the expected:\n *\n * \"The length of a football field is 100 yards.\"\n **/\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) {\n value = intermediateValue;\n break;\n }\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value))\n value = value.call(this.view);\n\n return value;\n };\n\n /**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\n function Writer () {\n this.templateCache = {\n _cache: {},\n set: function set (key, value) {\n this._cache[key] = value;\n },\n get: function get (key) {\n return this._cache[key];\n },\n clear: function clear () {\n this._cache = {};\n }\n };\n }\n\n /**\n * Clears all cached templates in this writer.\n */\n Writer.prototype.clearCache = function clearCache () {\n if (typeof this.templateCache !== 'undefined') {\n this.templateCache.clear();\n }\n };\n\n /**\n * Parses and caches the given `template` according to the given `tags` or\n * `mustache.tags` if `tags` is omitted, and returns the array of tokens\n * that is generated from the parse.\n */\n Writer.prototype.parse = function parse (template, tags) {\n var cache = this.templateCache;\n var cacheKey = template + ':' + (tags || mustache.tags).join(':');\n var isCacheEnabled = typeof cache !== 'undefined';\n var tokens = isCacheEnabled ? cache.get(cacheKey) : undefined;\n\n if (tokens == undefined) {\n tokens = parseTemplate(template, tags);\n isCacheEnabled && cache.set(cacheKey, tokens);\n }\n return tokens;\n };\n\n /**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n *\n * If the optional `config` argument is given here, then it should be an\n * object with a `tags` attribute or an `escape` attribute or both.\n * If an array is passed, then it will be interpreted the same way as\n * a `tags` attribute on a `config` object.\n *\n * The `tags` attribute of a `config` object must be an array with two\n * string values: the opening and closing tags used in the template (e.g.\n * [ \"<%\", \"%>\" ]). The default is to mustache.tags.\n *\n * The `escape` attribute of a `config` object must be a function which\n * accepts a string as input and outputs a safely escaped string.\n * If an `escape` function is not provided, then an HTML-safe string\n * escaping function is used as the default.\n */\n Writer.prototype.render = function render (template, view, partials, config) {\n var tags = this.getConfigTags(config);\n var tokens = this.parse(template, tags);\n var context = (view instanceof Context) ? view : new Context(view, undefined);\n return this.renderTokens(tokens, context, partials, template, config);\n };\n\n /**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\n Writer.prototype.renderTokens = function renderTokens (tokens, context, partials, originalTemplate, config) {\n var buffer = '';\n\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === '#') value = this.renderSection(token, context, partials, originalTemplate, config);\n else if (symbol === '^') value = this.renderInverted(token, context, partials, originalTemplate, config);\n else if (symbol === '>') value = this.renderPartial(token, context, partials, config);\n else if (symbol === '&') value = this.unescapedValue(token, context);\n else if (symbol === 'name') value = this.escapedValue(token, context, config);\n else if (symbol === 'text') value = this.rawValue(token);\n\n if (value !== undefined)\n buffer += value;\n }\n\n return buffer;\n };\n\n Writer.prototype.renderSection = function renderSection (token, context, partials, originalTemplate, config) {\n var self = this;\n var buffer = '';\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender (template) {\n return self.render(template, context, partials, config);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate, config);\n }\n } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate, config);\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== 'string')\n throw new Error('Cannot use higher-order sections without the original template');\n\n // Extract the portion of the original template that the section contains.\n value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender);\n\n if (value != null)\n buffer += value;\n } else {\n buffer += this.renderTokens(token[4], context, partials, originalTemplate, config);\n }\n return buffer;\n };\n\n Writer.prototype.renderInverted = function renderInverted (token, context, partials, originalTemplate, config) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || (isArray(value) && value.length === 0))\n return this.renderTokens(token[4], context, partials, originalTemplate, config);\n };\n\n Writer.prototype.indentPartial = function indentPartial (partial, indentation, lineHasNonSpace) {\n var filteredIndentation = indentation.replace(/[^ \\t]/g, '');\n var partialByNl = partial.split('\\n');\n for (var i = 0; i < partialByNl.length; i++) {\n if (partialByNl[i].length && (i > 0 || !lineHasNonSpace)) {\n partialByNl[i] = filteredIndentation + partialByNl[i];\n }\n }\n return partialByNl.join('\\n');\n };\n\n Writer.prototype.renderPartial = function renderPartial (token, context, partials, config) {\n if (!partials) return;\n var tags = this.getConfigTags(config);\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null) {\n var lineHasNonSpace = token[6];\n var tagIndex = token[5];\n var indentation = token[4];\n var indentedValue = value;\n if (tagIndex == 0 && indentation) {\n indentedValue = this.indentPartial(value, indentation, lineHasNonSpace);\n }\n var tokens = this.parse(indentedValue, tags);\n return this.renderTokens(tokens, context, partials, indentedValue, config);\n }\n };\n\n Writer.prototype.unescapedValue = function unescapedValue (token, context) {\n var value = context.lookup(token[1]);\n if (value != null)\n return value;\n };\n\n Writer.prototype.escapedValue = function escapedValue (token, context, config) {\n var escape = this.getConfigEscape(config) || mustache.escape;\n var value = context.lookup(token[1]);\n if (value != null)\n return (typeof value === 'number' && escape === mustache.escape) ? String(value) : escape(value);\n };\n\n Writer.prototype.rawValue = function rawValue (token) {\n return token[1];\n };\n\n Writer.prototype.getConfigTags = function getConfigTags (config) {\n if (isArray(config)) {\n return config;\n }\n else if (config && typeof config === 'object') {\n return config.tags;\n }\n else {\n return undefined;\n }\n };\n\n Writer.prototype.getConfigEscape = function getConfigEscape (config) {\n if (config && typeof config === 'object' && !isArray(config)) {\n return config.escape;\n }\n else {\n return undefined;\n }\n };\n\n var mustache = {\n name: 'mustache.js',\n version: '4.2.0',\n tags: [ '{{', '}}' ],\n clearCache: undefined,\n escape: undefined,\n parse: undefined,\n render: undefined,\n Scanner: undefined,\n Context: undefined,\n Writer: undefined,\n /**\n * Allows a user to override the default caching strategy, by providing an\n * object with set, get and clear methods. This can also be used to disable\n * the cache by setting it to the literal `undefined`.\n */\n set templateCache (cache) {\n defaultWriter.templateCache = cache;\n },\n /**\n * Gets the default or overridden caching object from the default writer.\n */\n get templateCache () {\n return defaultWriter.templateCache;\n }\n };\n\n // All high-level mustache.* functions use this writer.\n var defaultWriter = new Writer();\n\n /**\n * Clears all cached templates in the default writer.\n */\n mustache.clearCache = function clearCache () {\n return defaultWriter.clearCache();\n };\n\n /**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\n mustache.parse = function parse (template, tags) {\n return defaultWriter.parse(template, tags);\n };\n\n /**\n * Renders the `template` with the given `view`, `partials`, and `config`\n * using the default writer.\n */\n mustache.render = function render (template, view, partials, config) {\n if (typeof template !== 'string') {\n throw new TypeError('Invalid template! Template should be a \"string\" ' +\n 'but \"' + typeStr(template) + '\" was given as the first ' +\n 'argument for mustache#render(template, view, partials)');\n }\n\n return defaultWriter.render(template, view, partials, config);\n };\n\n // Export the escaping function so that the user may override it.\n // See https://github.com/janl/mustache.js/issues/244\n mustache.escape = escapeHtml;\n\n // Export these mainly for testing, but also for advanced usage.\n mustache.Scanner = Scanner;\n mustache.Context = Context;\n mustache.Writer = Writer;\n\n return mustache;\n\n})));\n"],"names":["global","factory","exports","module","define","amd","self","Mustache","this","objectToString","Object","prototype","toString","isArray","Array","isArrayPolyfill","object","call","isFunction","typeStr","obj","escapeRegExp","string","replace","hasProperty","propName","primitiveHasOwnProperty","primitive","hasOwnProperty","regExpTest","RegExp","test","testRegExp","re","nonSpaceRe","isWhitespace","entityMap","escapeHtml","String","fromEntityMap","s","whiteRe","spaceRe","equalsRe","curlyRe","tagRe","parseTemplate","template","tags","lineHasNonSpace","sections","tokens","spaces","hasTag","nonSpace","indentation","tagIndex","stripSpace","length","pop","openingTagRe","closingTagRe","closingCurlyRe","compileTags","tagsToCompile","split","Error","mustache","scanner","Scanner","start","type","value","chr","token","openSection","eos","pos","scanUntil","i","valueLength","charAt","push","scan","nestTokens","squashTokens","squashedTokens","lastToken","numTokens","nestedTokens","collector","section","tail","match","index","substring","search","Context","view","parentContext","cache","parent","lookup","name","context","intermediateValue","names","lookupHit","indexOf","Writer","templateCache","_cache","set","key","get","clear","clearCache","parse","cacheKey","join","isCacheEnabled","undefined","render","partials","config","getConfigTags","renderTokens","originalTemplate","buffer","symbol","renderSection","renderInverted","renderPartial","unescapedValue","escapedValue","rawValue","subRender","j","slice","indentPartial","partial","filteredIndentation","partialByNl","indentedValue","escape","getConfigEscape","version","defaultWriter","TypeError"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2xpdmVjaGF0LXJlc291cmNlcy9saXZlY2hhdC1yZXNvdXJjZXMvbm9kZV9tb2R1bGVzL211c3RhY2hlL211c3RhY2hlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTXVzdGFjaGUgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgLyohXG4gICAqIG11c3RhY2hlLmpzIC0gTG9naWMtbGVzcyB7e211c3RhY2hlfX0gdGVtcGxhdGVzIHdpdGggSmF2YVNjcmlwdFxuICAgKiBodHRwOi8vZ2l0aHViLmNvbS9qYW5sL211c3RhY2hlLmpzXG4gICAqL1xuXG4gIHZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5UG9seWZpbGwgKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gIH07XG5cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICAvKipcbiAgICogTW9yZSBjb3JyZWN0IHR5cGVvZiBzdHJpbmcgaGFuZGxpbmcgYXJyYXlcbiAgICogd2hpY2ggbm9ybWFsbHkgcmV0dXJucyB0eXBlb2YgJ29iamVjdCdcbiAgICovXG4gIGZ1bmN0aW9uIHR5cGVTdHIgKG9iaikge1xuICAgIHJldHVybiBpc0FycmF5KG9iaikgPyAnYXJyYXknIDogdHlwZW9mIG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bXFwtXFxbXFxde30oKSorPy4sXFxcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE51bGwgc2FmZSB3YXkgb2YgY2hlY2tpbmcgd2hldGhlciBvciBub3QgYW4gb2JqZWN0LFxuICAgKiBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZSwgaGFzIGEgZ2l2ZW4gcHJvcGVydHlcbiAgICovXG4gIGZ1bmN0aW9uIGhhc1Byb3BlcnR5IChvYmosIHByb3BOYW1lKSB7XG4gICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIChwcm9wTmFtZSBpbiBvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhZmUgd2F5IG9mIGRldGVjdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gdGhpbmcgaXMgYSBwcmltaXRpdmUgYW5kXG4gICAqIHdoZXRoZXIgaXQgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eVxuICAgKi9cbiAgZnVuY3Rpb24gcHJpbWl0aXZlSGFzT3duUHJvcGVydHkgKHByaW1pdGl2ZSwgcHJvcE5hbWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJpbWl0aXZlICE9IG51bGxcbiAgICAgICYmIHR5cGVvZiBwcmltaXRpdmUgIT09ICdvYmplY3QnXG4gICAgICAmJiBwcmltaXRpdmUuaGFzT3duUHJvcGVydHlcbiAgICAgICYmIHByaW1pdGl2ZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSlcbiAgICApO1xuICB9XG5cbiAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DT1VDSERCLTU3N1xuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phbmwvbXVzdGFjaGUuanMvaXNzdWVzLzE4OVxuICB2YXIgcmVnRXhwVGVzdCA9IFJlZ0V4cC5wcm90b3R5cGUudGVzdDtcbiAgZnVuY3Rpb24gdGVzdFJlZ0V4cCAocmUsIHN0cmluZykge1xuICAgIHJldHVybiByZWdFeHBUZXN0LmNhbGwocmUsIHN0cmluZyk7XG4gIH1cblxuICB2YXIgbm9uU3BhY2VSZSA9IC9cXFMvO1xuICBmdW5jdGlvbiBpc1doaXRlc3BhY2UgKHN0cmluZykge1xuICAgIHJldHVybiAhdGVzdFJlZ0V4cChub25TcGFjZVJlLCBzdHJpbmcpO1xuICB9XG5cbiAgdmFyIGVudGl0eU1hcCA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJy8nOiAnJiN4MkY7JyxcbiAgICAnYCc6ICcmI3g2MDsnLFxuICAgICc9JzogJyYjeDNEOydcbiAgfTtcblxuICBmdW5jdGlvbiBlc2NhcGVIdG1sIChzdHJpbmcpIHtcbiAgICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZSgvWyY8PlwiJ2A9XFwvXS9nLCBmdW5jdGlvbiBmcm9tRW50aXR5TWFwIChzKSB7XG4gICAgICByZXR1cm4gZW50aXR5TWFwW3NdO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHdoaXRlUmUgPSAvXFxzKi87XG4gIHZhciBzcGFjZVJlID0gL1xccysvO1xuICB2YXIgZXF1YWxzUmUgPSAvXFxzKj0vO1xuICB2YXIgY3VybHlSZSA9IC9cXHMqXFx9LztcbiAgdmFyIHRhZ1JlID0gLyN8XFxefFxcL3w+fFxce3wmfD18IS87XG5cbiAgLyoqXG4gICAqIEJyZWFrcyB1cCB0aGUgZ2l2ZW4gYHRlbXBsYXRlYCBzdHJpbmcgaW50byBhIHRyZWUgb2YgdG9rZW5zLiBJZiB0aGUgYHRhZ3NgXG4gICAqIGFyZ3VtZW50IGlzIGdpdmVuIGhlcmUgaXQgbXVzdCBiZSBhbiBhcnJheSB3aXRoIHR3byBzdHJpbmcgdmFsdWVzOiB0aGVcbiAgICogb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIChlLmcuIFsgXCI8JVwiLCBcIiU+XCIgXSkuIE9mXG4gICAqIGNvdXJzZSwgdGhlIGRlZmF1bHQgaXMgdG8gdXNlIG11c3RhY2hlcyAoaS5lLiBtdXN0YWNoZS50YWdzKS5cbiAgICpcbiAgICogQSB0b2tlbiBpcyBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IDQgZWxlbWVudHMuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZVxuICAgKiBtdXN0YWNoZSBzeW1ib2wgdGhhdCB3YXMgdXNlZCBpbnNpZGUgdGhlIHRhZywgZS5nLiBcIiNcIiBvciBcIiZcIi4gSWYgdGhlIHRhZ1xuICAgKiBkaWQgbm90IGNvbnRhaW4gYSBzeW1ib2wgKGkuZS4ge3tteVZhbHVlfX0pIHRoaXMgZWxlbWVudCBpcyBcIm5hbWVcIi4gRm9yXG4gICAqIGFsbCB0ZXh0IHRoYXQgYXBwZWFycyBvdXRzaWRlIGEgc3ltYm9sIHRoaXMgZWxlbWVudCBpcyBcInRleHRcIi5cbiAgICpcbiAgICogVGhlIHNlY29uZCBlbGVtZW50IG9mIGEgdG9rZW4gaXMgaXRzIFwidmFsdWVcIi4gRm9yIG11c3RhY2hlIHRhZ3MgdGhpcyBpc1xuICAgKiB3aGF0ZXZlciBlbHNlIHdhcyBpbnNpZGUgdGhlIHRhZyBiZXNpZGVzIHRoZSBvcGVuaW5nIHN5bWJvbC4gRm9yIHRleHQgdG9rZW5zXG4gICAqIHRoaXMgaXMgdGhlIHRleHQgaXRzZWxmLlxuICAgKlxuICAgKiBUaGUgdGhpcmQgYW5kIGZvdXJ0aCBlbGVtZW50cyBvZiB0aGUgdG9rZW4gYXJlIHRoZSBzdGFydCBhbmQgZW5kIGluZGljZXMsXG4gICAqIHJlc3BlY3RpdmVseSwgb2YgdGhlIHRva2VuIGluIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZS5cbiAgICpcbiAgICogVG9rZW5zIHRoYXQgYXJlIHRoZSByb290IG5vZGUgb2YgYSBzdWJ0cmVlIGNvbnRhaW4gdHdvIG1vcmUgZWxlbWVudHM6IDEpIGFuXG4gICAqIGFycmF5IG9mIHRva2VucyBpbiB0aGUgc3VidHJlZSBhbmQgMikgdGhlIGluZGV4IGluIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSBhdFxuICAgKiB3aGljaCB0aGUgY2xvc2luZyB0YWcgZm9yIHRoYXQgc2VjdGlvbiBiZWdpbnMuXG4gICAqXG4gICAqIFRva2VucyBmb3IgcGFydGlhbHMgYWxzbyBjb250YWluIHR3byBtb3JlIGVsZW1lbnRzOiAxKSBhIHN0cmluZyB2YWx1ZSBvZlxuICAgKiBpbmRlbmRhdGlvbiBwcmlvciB0byB0aGF0IHRhZyBhbmQgMikgdGhlIGluZGV4IG9mIHRoYXQgdGFnIG9uIHRoYXQgbGluZSAtXG4gICAqIGVnIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgdGhlIHBhcnRpYWwgaXMgdGhlIHRoaXJkIHRhZyBvbiB0aGlzIGxpbmUuXG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZVRlbXBsYXRlICh0ZW1wbGF0ZSwgdGFncykge1xuICAgIGlmICghdGVtcGxhdGUpXG4gICAgICByZXR1cm4gW107XG4gICAgdmFyIGxpbmVIYXNOb25TcGFjZSA9IGZhbHNlO1xuICAgIHZhciBzZWN0aW9ucyA9IFtdOyAgICAgLy8gU3RhY2sgdG8gaG9sZCBzZWN0aW9uIHRva2Vuc1xuICAgIHZhciB0b2tlbnMgPSBbXTsgICAgICAgLy8gQnVmZmVyIHRvIGhvbGQgdGhlIHRva2Vuc1xuICAgIHZhciBzcGFjZXMgPSBbXTsgICAgICAgLy8gSW5kaWNlcyBvZiB3aGl0ZXNwYWNlIHRva2VucyBvbiB0aGUgY3VycmVudCBsaW5lXG4gICAgdmFyIGhhc1RhZyA9IGZhbHNlOyAgICAvLyBJcyB0aGVyZSBhIHt7dGFnfX0gb24gdGhlIGN1cnJlbnQgbGluZT9cbiAgICB2YXIgbm9uU3BhY2UgPSBmYWxzZTsgIC8vIElzIHRoZXJlIGEgbm9uLXNwYWNlIGNoYXIgb24gdGhlIGN1cnJlbnQgbGluZT9cbiAgICB2YXIgaW5kZW50YXRpb24gPSAnJzsgIC8vIFRyYWNrcyBpbmRlbnRhdGlvbiBmb3IgdGFncyB0aGF0IHVzZSBpdFxuICAgIHZhciB0YWdJbmRleCA9IDA7ICAgICAgLy8gU3RvcmVzIGEgY291bnQgb2YgbnVtYmVyIG9mIHRhZ3MgZW5jb3VudGVyZWQgb24gYSBsaW5lXG5cbiAgICAvLyBTdHJpcHMgYWxsIHdoaXRlc3BhY2UgdG9rZW5zIGFycmF5IGZvciB0aGUgY3VycmVudCBsaW5lXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEge3sjdGFnfX0gb24gaXQgYW5kIG90aGVyd2lzZSBvbmx5IHNwYWNlLlxuICAgIGZ1bmN0aW9uIHN0cmlwU3BhY2UgKCkge1xuICAgICAgaWYgKGhhc1RhZyAmJiAhbm9uU3BhY2UpIHtcbiAgICAgICAgd2hpbGUgKHNwYWNlcy5sZW5ndGgpXG4gICAgICAgICAgZGVsZXRlIHRva2Vuc1tzcGFjZXMucG9wKCldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BhY2VzID0gW107XG4gICAgICB9XG5cbiAgICAgIGhhc1RhZyA9IGZhbHNlO1xuICAgICAgbm9uU3BhY2UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgb3BlbmluZ1RhZ1JlLCBjbG9zaW5nVGFnUmUsIGNsb3NpbmdDdXJseVJlO1xuICAgIGZ1bmN0aW9uIGNvbXBpbGVUYWdzICh0YWdzVG9Db21waWxlKSB7XG4gICAgICBpZiAodHlwZW9mIHRhZ3NUb0NvbXBpbGUgPT09ICdzdHJpbmcnKVxuICAgICAgICB0YWdzVG9Db21waWxlID0gdGFnc1RvQ29tcGlsZS5zcGxpdChzcGFjZVJlLCAyKTtcblxuICAgICAgaWYgKCFpc0FycmF5KHRhZ3NUb0NvbXBpbGUpIHx8IHRhZ3NUb0NvbXBpbGUubGVuZ3RoICE9PSAyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFnczogJyArIHRhZ3NUb0NvbXBpbGUpO1xuXG4gICAgICBvcGVuaW5nVGFnUmUgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cCh0YWdzVG9Db21waWxlWzBdKSArICdcXFxccyonKTtcbiAgICAgIGNsb3NpbmdUYWdSZSA9IG5ldyBSZWdFeHAoJ1xcXFxzKicgKyBlc2NhcGVSZWdFeHAodGFnc1RvQ29tcGlsZVsxXSkpO1xuICAgICAgY2xvc2luZ0N1cmx5UmUgPSBuZXcgUmVnRXhwKCdcXFxccyonICsgZXNjYXBlUmVnRXhwKCd9JyArIHRhZ3NUb0NvbXBpbGVbMV0pKTtcbiAgICB9XG5cbiAgICBjb21waWxlVGFncyh0YWdzIHx8IG11c3RhY2hlLnRhZ3MpO1xuXG4gICAgdmFyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcih0ZW1wbGF0ZSk7XG5cbiAgICB2YXIgc3RhcnQsIHR5cGUsIHZhbHVlLCBjaHIsIHRva2VuLCBvcGVuU2VjdGlvbjtcbiAgICB3aGlsZSAoIXNjYW5uZXIuZW9zKCkpIHtcbiAgICAgIHN0YXJ0ID0gc2Nhbm5lci5wb3M7XG5cbiAgICAgIC8vIE1hdGNoIGFueSB0ZXh0IGJldHdlZW4gdGFncy5cbiAgICAgIHZhbHVlID0gc2Nhbm5lci5zY2FuVW50aWwob3BlbmluZ1RhZ1JlKTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IHZhbHVlTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjaHIgPSB2YWx1ZS5jaGFyQXQoaSk7XG5cbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNocikpIHtcbiAgICAgICAgICAgIHNwYWNlcy5wdXNoKHRva2Vucy5sZW5ndGgpO1xuICAgICAgICAgICAgaW5kZW50YXRpb24gKz0gY2hyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub25TcGFjZSA9IHRydWU7XG4gICAgICAgICAgICBsaW5lSGFzTm9uU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgaW5kZW50YXRpb24gKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRva2Vucy5wdXNoKFsgJ3RleHQnLCBjaHIsIHN0YXJ0LCBzdGFydCArIDEgXSk7XG4gICAgICAgICAgc3RhcnQgKz0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGZvciB3aGl0ZXNwYWNlIG9uIHRoZSBjdXJyZW50IGxpbmUuXG4gICAgICAgICAgaWYgKGNociA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIHN0cmlwU3BhY2UoKTtcbiAgICAgICAgICAgIGluZGVudGF0aW9uID0gJyc7XG4gICAgICAgICAgICB0YWdJbmRleCA9IDA7XG4gICAgICAgICAgICBsaW5lSGFzTm9uU3BhY2UgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWF0Y2ggdGhlIG9wZW5pbmcgdGFnLlxuICAgICAgaWYgKCFzY2FubmVyLnNjYW4ob3BlbmluZ1RhZ1JlKSlcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGhhc1RhZyA9IHRydWU7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFnIHR5cGUuXG4gICAgICB0eXBlID0gc2Nhbm5lci5zY2FuKHRhZ1JlKSB8fCAnbmFtZSc7XG4gICAgICBzY2FubmVyLnNjYW4od2hpdGVSZSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdGFnIHZhbHVlLlxuICAgICAgaWYgKHR5cGUgPT09ICc9Jykge1xuICAgICAgICB2YWx1ZSA9IHNjYW5uZXIuc2NhblVudGlsKGVxdWFsc1JlKTtcbiAgICAgICAgc2Nhbm5lci5zY2FuKGVxdWFsc1JlKTtcbiAgICAgICAgc2Nhbm5lci5zY2FuVW50aWwoY2xvc2luZ1RhZ1JlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3snKSB7XG4gICAgICAgIHZhbHVlID0gc2Nhbm5lci5zY2FuVW50aWwoY2xvc2luZ0N1cmx5UmUpO1xuICAgICAgICBzY2FubmVyLnNjYW4oY3VybHlSZSk7XG4gICAgICAgIHNjYW5uZXIuc2NhblVudGlsKGNsb3NpbmdUYWdSZSk7XG4gICAgICAgIHR5cGUgPSAnJic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHNjYW5uZXIuc2NhblVudGlsKGNsb3NpbmdUYWdSZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hdGNoIHRoZSBjbG9zaW5nIHRhZy5cbiAgICAgIGlmICghc2Nhbm5lci5zY2FuKGNsb3NpbmdUYWdSZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5jbG9zZWQgdGFnIGF0ICcgKyBzY2FubmVyLnBvcyk7XG5cbiAgICAgIGlmICh0eXBlID09ICc+Jykge1xuICAgICAgICB0b2tlbiA9IFsgdHlwZSwgdmFsdWUsIHN0YXJ0LCBzY2FubmVyLnBvcywgaW5kZW50YXRpb24sIHRhZ0luZGV4LCBsaW5lSGFzTm9uU3BhY2UgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2VuID0gWyB0eXBlLCB2YWx1ZSwgc3RhcnQsIHNjYW5uZXIucG9zIF07XG4gICAgICB9XG4gICAgICB0YWdJbmRleCsrO1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJyMnIHx8IHR5cGUgPT09ICdeJykge1xuICAgICAgICBzZWN0aW9ucy5wdXNoKHRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJy8nKSB7XG4gICAgICAgIC8vIENoZWNrIHNlY3Rpb24gbmVzdGluZy5cbiAgICAgICAgb3BlblNlY3Rpb24gPSBzZWN0aW9ucy5wb3AoKTtcblxuICAgICAgICBpZiAoIW9wZW5TZWN0aW9uKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5vcGVuZWQgc2VjdGlvbiBcIicgKyB2YWx1ZSArICdcIiBhdCAnICsgc3RhcnQpO1xuXG4gICAgICAgIGlmIChvcGVuU2VjdGlvblsxXSAhPT0gdmFsdWUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmNsb3NlZCBzZWN0aW9uIFwiJyArIG9wZW5TZWN0aW9uWzFdICsgJ1wiIGF0ICcgKyBzdGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICduYW1lJyB8fCB0eXBlID09PSAneycgfHwgdHlwZSA9PT0gJyYnKSB7XG4gICAgICAgIG5vblNwYWNlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJz0nKSB7XG4gICAgICAgIC8vIFNldCB0aGUgdGFncyBmb3IgdGhlIG5leHQgdGltZSBhcm91bmQuXG4gICAgICAgIGNvbXBpbGVUYWdzKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdHJpcFNwYWNlKCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG9wZW4gc2VjdGlvbnMgd2hlbiB3ZSdyZSBkb25lLlxuICAgIG9wZW5TZWN0aW9uID0gc2VjdGlvbnMucG9wKCk7XG5cbiAgICBpZiAob3BlblNlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuY2xvc2VkIHNlY3Rpb24gXCInICsgb3BlblNlY3Rpb25bMV0gKyAnXCIgYXQgJyArIHNjYW5uZXIucG9zKTtcblxuICAgIHJldHVybiBuZXN0VG9rZW5zKHNxdWFzaFRva2Vucyh0b2tlbnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lcyB0aGUgdmFsdWVzIG9mIGNvbnNlY3V0aXZlIHRleHQgdG9rZW5zIGluIHRoZSBnaXZlbiBgdG9rZW5zYCBhcnJheVxuICAgKiB0byBhIHNpbmdsZSB0b2tlbi5cbiAgICovXG4gIGZ1bmN0aW9uIHNxdWFzaFRva2VucyAodG9rZW5zKSB7XG4gICAgdmFyIHNxdWFzaGVkVG9rZW5zID0gW107XG5cbiAgICB2YXIgdG9rZW4sIGxhc3RUb2tlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbnVtVG9rZW5zID0gdG9rZW5zLmxlbmd0aDsgaSA8IG51bVRva2VuczsgKytpKSB7XG4gICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcblxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlblswXSA9PT0gJ3RleHQnICYmIGxhc3RUb2tlbiAmJiBsYXN0VG9rZW5bMF0gPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGxhc3RUb2tlblsxXSArPSB0b2tlblsxXTtcbiAgICAgICAgICBsYXN0VG9rZW5bM10gPSB0b2tlblszXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcXVhc2hlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzcXVhc2hlZFRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtcyB0aGUgZ2l2ZW4gYXJyYXkgb2YgYHRva2Vuc2AgaW50byBhIG5lc3RlZCB0cmVlIHN0cnVjdHVyZSB3aGVyZVxuICAgKiB0b2tlbnMgdGhhdCByZXByZXNlbnQgYSBzZWN0aW9uIGhhdmUgdHdvIGFkZGl0aW9uYWwgaXRlbXM6IDEpIGFuIGFycmF5IG9mXG4gICAqIGFsbCB0b2tlbnMgdGhhdCBhcHBlYXIgaW4gdGhhdCBzZWN0aW9uIGFuZCAyKSB0aGUgaW5kZXggaW4gdGhlIG9yaWdpbmFsXG4gICAqIHRlbXBsYXRlIHRoYXQgcmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoYXQgc2VjdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIG5lc3RUb2tlbnMgKHRva2Vucykge1xuICAgIHZhciBuZXN0ZWRUb2tlbnMgPSBbXTtcbiAgICB2YXIgY29sbGVjdG9yID0gbmVzdGVkVG9rZW5zO1xuICAgIHZhciBzZWN0aW9ucyA9IFtdO1xuXG4gICAgdmFyIHRva2VuLCBzZWN0aW9uO1xuICAgIGZvciAodmFyIGkgPSAwLCBudW1Ub2tlbnMgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbnVtVG9rZW5zOyArK2kpIHtcbiAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICBzd2l0Y2ggKHRva2VuWzBdKSB7XG4gICAgICAgIGNhc2UgJyMnOlxuICAgICAgICBjYXNlICdeJzpcbiAgICAgICAgICBjb2xsZWN0b3IucHVzaCh0b2tlbik7XG4gICAgICAgICAgc2VjdGlvbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgY29sbGVjdG9yID0gdG9rZW5bNF0gPSBbXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgc2VjdGlvbiA9IHNlY3Rpb25zLnBvcCgpO1xuICAgICAgICAgIHNlY3Rpb25bNV0gPSB0b2tlblsyXTtcbiAgICAgICAgICBjb2xsZWN0b3IgPSBzZWN0aW9ucy5sZW5ndGggPiAwID8gc2VjdGlvbnNbc2VjdGlvbnMubGVuZ3RoIC0gMV1bNF0gOiBuZXN0ZWRUb2tlbnM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29sbGVjdG9yLnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXN0ZWRUb2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogQSBzaW1wbGUgc3RyaW5nIHNjYW5uZXIgdGhhdCBpcyB1c2VkIGJ5IHRoZSB0ZW1wbGF0ZSBwYXJzZXIgdG8gZmluZFxuICAgKiB0b2tlbnMgaW4gdGVtcGxhdGUgc3RyaW5ncy5cbiAgICovXG4gIGZ1bmN0aW9uIFNjYW5uZXIgKHN0cmluZykge1xuICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIHRoaXMudGFpbCA9IHN0cmluZztcbiAgICB0aGlzLnBvcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhaWwgaXMgZW1wdHkgKGVuZCBvZiBzdHJpbmcpLlxuICAgKi9cbiAgU2Nhbm5lci5wcm90b3R5cGUuZW9zID0gZnVuY3Rpb24gZW9zICgpIHtcbiAgICByZXR1cm4gdGhpcy50YWlsID09PSAnJztcbiAgfTtcblxuICAvKipcbiAgICogVHJpZXMgdG8gbWF0Y2ggdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICogUmV0dXJucyB0aGUgbWF0Y2hlZCB0ZXh0IGlmIGl0IGNhbiBtYXRjaCwgdGhlIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuXG4gICAqL1xuICBTY2FubmVyLnByb3RvdHlwZS5zY2FuID0gZnVuY3Rpb24gc2NhbiAocmUpIHtcbiAgICB2YXIgbWF0Y2ggPSB0aGlzLnRhaWwubWF0Y2gocmUpO1xuXG4gICAgaWYgKCFtYXRjaCB8fCBtYXRjaC5pbmRleCAhPT0gMClcbiAgICAgIHJldHVybiAnJztcblxuICAgIHZhciBzdHJpbmcgPSBtYXRjaFswXTtcblxuICAgIHRoaXMudGFpbCA9IHRoaXMudGFpbC5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCk7XG4gICAgdGhpcy5wb3MgKz0gc3RyaW5nLmxlbmd0aDtcblxuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNraXBzIGFsbCB0ZXh0IHVudGlsIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gY2FuIGJlIG1hdGNoZWQuIFJldHVybnNcbiAgICogdGhlIHNraXBwZWQgc3RyaW5nLCB3aGljaCBpcyB0aGUgZW50aXJlIHRhaWwgaWYgbm8gbWF0Y2ggY2FuIGJlIG1hZGUuXG4gICAqL1xuICBTY2FubmVyLnByb3RvdHlwZS5zY2FuVW50aWwgPSBmdW5jdGlvbiBzY2FuVW50aWwgKHJlKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy50YWlsLnNlYXJjaChyZSksIG1hdGNoO1xuXG4gICAgc3dpdGNoIChpbmRleCkge1xuICAgICAgY2FzZSAtMTpcbiAgICAgICAgbWF0Y2ggPSB0aGlzLnRhaWw7XG4gICAgICAgIHRoaXMudGFpbCA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgbWF0Y2ggPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBtYXRjaCA9IHRoaXMudGFpbC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgICAgICB0aGlzLnRhaWwgPSB0aGlzLnRhaWwuc3Vic3RyaW5nKGluZGV4KTtcbiAgICB9XG5cbiAgICB0aGlzLnBvcyArPSBtYXRjaC5sZW5ndGg7XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSByZW5kZXJpbmcgY29udGV4dCBieSB3cmFwcGluZyBhIHZpZXcgb2JqZWN0IGFuZFxuICAgKiBtYWludGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IGNvbnRleHQuXG4gICAqL1xuICBmdW5jdGlvbiBDb250ZXh0ICh2aWV3LCBwYXJlbnRDb250ZXh0KSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLmNhY2hlID0geyAnLic6IHRoaXMudmlldyB9O1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50Q29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIHZpZXcgd2l0aCB0aGlzIGNvbnRleHRcbiAgICogYXMgdGhlIHBhcmVudC5cbiAgICovXG4gIENvbnRleHQucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoICh2aWV3KSB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0KHZpZXcsIHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGlzIGNvbnRleHQsIHRyYXZlcnNpbmdcbiAgICogdXAgdGhlIGNvbnRleHQgaGllcmFyY2h5IGlmIHRoZSB2YWx1ZSBpcyBhYnNlbnQgaW4gdGhpcyBjb250ZXh0J3Mgdmlldy5cbiAgICovXG4gIENvbnRleHQucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIGxvb2t1cCAobmFtZSkge1xuICAgIHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cbiAgICB2YXIgdmFsdWU7XG4gICAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICB2YWx1ZSA9IGNhY2hlW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29udGV4dCA9IHRoaXMsIGludGVybWVkaWF0ZVZhbHVlLCBuYW1lcywgaW5kZXgsIGxvb2t1cEhpdCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoY29udGV4dCkge1xuICAgICAgICBpZiAobmFtZS5pbmRleE9mKCcuJykgPiAwKSB7XG4gICAgICAgICAgaW50ZXJtZWRpYXRlVmFsdWUgPSBjb250ZXh0LnZpZXc7XG4gICAgICAgICAgbmFtZXMgPSBuYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgICAgaW5kZXggPSAwO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVXNpbmcgdGhlIGRvdCBub3Rpb24gcGF0aCBpbiBgbmFtZWAsIHdlIGRlc2NlbmQgdGhyb3VnaCB0aGVcbiAgICAgICAgICAgKiBuZXN0ZWQgb2JqZWN0cy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFRvIGJlIGNlcnRhaW4gdGhhdCB0aGUgbG9va3VwIGhhcyBiZWVuIHN1Y2Nlc3NmdWwsIHdlIGhhdmUgdG9cbiAgICAgICAgICAgKiBjaGVjayBpZiB0aGUgbGFzdCBvYmplY3QgaW4gdGhlIHBhdGggYWN0dWFsbHkgaGFzIHRoZSBwcm9wZXJ0eVxuICAgICAgICAgICAqIHdlIGFyZSBsb29raW5nIGZvci4gV2Ugc3RvcmUgdGhlIHJlc3VsdCBpbiBgbG9va3VwSGl0YC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFRoaXMgaXMgc3BlY2lhbGx5IG5lY2Vzc2FyeSBmb3Igd2hlbiB0aGUgdmFsdWUgaGFzIGJlZW4gc2V0IHRvXG4gICAgICAgICAgICogYHVuZGVmaW5lZGAgYW5kIHdlIHdhbnQgdG8gYXZvaWQgbG9va2luZyB1cCBwYXJlbnQgY29udGV4dHMuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBJbiB0aGUgY2FzZSB3aGVyZSBkb3Qgbm90YXRpb24gaXMgdXNlZCwgd2UgY29uc2lkZXIgdGhlIGxvb2t1cFxuICAgICAgICAgICAqIHRvIGJlIHN1Y2Nlc3NmdWwgZXZlbiBpZiB0aGUgbGFzdCBcIm9iamVjdFwiIGluIHRoZSBwYXRoIGlzXG4gICAgICAgICAgICogbm90IGFjdHVhbGx5IGFuIG9iamVjdCBidXQgYSBwcmltaXRpdmUgKGUuZy4sIGEgc3RyaW5nLCBvciBhblxuICAgICAgICAgICAqIGludGVnZXIpLCBiZWNhdXNlIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gYWNjZXNzIGEgcHJvcGVydHlcbiAgICAgICAgICAgKiBvZiBhbiBhdXRvYm94ZWQgcHJpbWl0aXZlLCBzdWNoIGFzIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcuXG4gICAgICAgICAgICoqL1xuICAgICAgICAgIHdoaWxlIChpbnRlcm1lZGlhdGVWYWx1ZSAhPSBudWxsICYmIGluZGV4IDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IG5hbWVzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgIGxvb2t1cEhpdCA9IChcbiAgICAgICAgICAgICAgICBoYXNQcm9wZXJ0eShpbnRlcm1lZGlhdGVWYWx1ZSwgbmFtZXNbaW5kZXhdKVxuICAgICAgICAgICAgICAgIHx8IHByaW1pdGl2ZUhhc093blByb3BlcnR5KGludGVybWVkaWF0ZVZhbHVlLCBuYW1lc1tpbmRleF0pXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGludGVybWVkaWF0ZVZhbHVlID0gaW50ZXJtZWRpYXRlVmFsdWVbbmFtZXNbaW5kZXgrK11dO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnRlcm1lZGlhdGVWYWx1ZSA9IGNvbnRleHQudmlld1tuYW1lXTtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIE9ubHkgY2hlY2tpbmcgYWdhaW5zdCBgaGFzUHJvcGVydHlgLCB3aGljaCBhbHdheXMgcmV0dXJucyBgZmFsc2VgIGlmXG4gICAgICAgICAgICogYGNvbnRleHQudmlld2AgaXMgbm90IGFuIG9iamVjdC4gRGVsaWJlcmF0ZWx5IG9taXR0aW5nIHRoZSBjaGVja1xuICAgICAgICAgICAqIGFnYWluc3QgYHByaW1pdGl2ZUhhc093blByb3BlcnR5YCBpZiBkb3Qgbm90YXRpb24gaXMgbm90IHVzZWQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBDb25zaWRlciB0aGlzIGV4YW1wbGU6XG4gICAgICAgICAgICogYGBgXG4gICAgICAgICAgICogTXVzdGFjaGUucmVuZGVyKFwiVGhlIGxlbmd0aCBvZiBhIGZvb3RiYWxsIGZpZWxkIGlzIHt7I2xlbmd0aH19e3tsZW5ndGh9fXt7L2xlbmd0aH19LlwiLCB7bGVuZ3RoOiBcIjEwMCB5YXJkc1wifSlcbiAgICAgICAgICAgKiBgYGBcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIElmIHdlIHdlcmUgdG8gY2hlY2sgYWxzbyBhZ2FpbnN0IGBwcmltaXRpdmVIYXNPd25Qcm9wZXJ0eWAsIGFzIHdlIGRvXG4gICAgICAgICAgICogaW4gdGhlIGRvdCBub3RhdGlvbiBjYXNlLCB0aGVuIHJlbmRlciBjYWxsIHdvdWxkIHJldHVybjpcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFwiVGhlIGxlbmd0aCBvZiBhIGZvb3RiYWxsIGZpZWxkIGlzIDkuXCJcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIHJhdGhlciB0aGFuIHRoZSBleHBlY3RlZDpcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFwiVGhlIGxlbmd0aCBvZiBhIGZvb3RiYWxsIGZpZWxkIGlzIDEwMCB5YXJkcy5cIlxuICAgICAgICAgICAqKi9cbiAgICAgICAgICBsb29rdXBIaXQgPSBoYXNQcm9wZXJ0eShjb250ZXh0LnZpZXcsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvb2t1cEhpdCkge1xuICAgICAgICAgIHZhbHVlID0gaW50ZXJtZWRpYXRlVmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlW25hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKVxuICAgICAgdmFsdWUgPSB2YWx1ZS5jYWxsKHRoaXMudmlldyk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgV3JpdGVyIGtub3dzIGhvdyB0byB0YWtlIGEgc3RyZWFtIG9mIHRva2VucyBhbmQgcmVuZGVyIHRoZW0gdG8gYVxuICAgKiBzdHJpbmcsIGdpdmVuIGEgY29udGV4dC4gSXQgYWxzbyBtYWludGFpbnMgYSBjYWNoZSBvZiB0ZW1wbGF0ZXMgdG9cbiAgICogYXZvaWQgdGhlIG5lZWQgdG8gcGFyc2UgdGhlIHNhbWUgdGVtcGxhdGUgdHdpY2UuXG4gICAqL1xuICBmdW5jdGlvbiBXcml0ZXIgKCkge1xuICAgIHRoaXMudGVtcGxhdGVDYWNoZSA9IHtcbiAgICAgIF9jYWNoZToge30sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jYWNoZVtrZXldID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQgKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVba2V5XTtcbiAgICAgIH0sXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBjYWNoZWQgdGVtcGxhdGVzIGluIHRoaXMgd3JpdGVyLlxuICAgKi9cbiAgV3JpdGVyLnByb3RvdHlwZS5jbGVhckNhY2hlID0gZnVuY3Rpb24gY2xlYXJDYWNoZSAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnRlbXBsYXRlQ2FjaGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbmQgY2FjaGVzIHRoZSBnaXZlbiBgdGVtcGxhdGVgIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gYHRhZ3NgIG9yXG4gICAqIGBtdXN0YWNoZS50YWdzYCBpZiBgdGFnc2AgaXMgb21pdHRlZCwgIGFuZCByZXR1cm5zIHRoZSBhcnJheSBvZiB0b2tlbnNcbiAgICogdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGFyc2UuXG4gICAqL1xuICBXcml0ZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UgKHRlbXBsYXRlLCB0YWdzKSB7XG4gICAgdmFyIGNhY2hlID0gdGhpcy50ZW1wbGF0ZUNhY2hlO1xuICAgIHZhciBjYWNoZUtleSA9IHRlbXBsYXRlICsgJzonICsgKHRhZ3MgfHwgbXVzdGFjaGUudGFncykuam9pbignOicpO1xuICAgIHZhciBpc0NhY2hlRW5hYmxlZCA9IHR5cGVvZiBjYWNoZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgdmFyIHRva2VucyA9IGlzQ2FjaGVFbmFibGVkID8gY2FjaGUuZ2V0KGNhY2hlS2V5KSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICh0b2tlbnMgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0b2tlbnMgPSBwYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCB0YWdzKTtcbiAgICAgIGlzQ2FjaGVFbmFibGVkICYmIGNhY2hlLnNldChjYWNoZUtleSwgdG9rZW5zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VucztcbiAgfTtcblxuICAvKipcbiAgICogSGlnaC1sZXZlbCBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgZ2l2ZW4gYHRlbXBsYXRlYCB3aXRoXG4gICAqIHRoZSBnaXZlbiBgdmlld2AuXG4gICAqXG4gICAqIFRoZSBvcHRpb25hbCBgcGFydGlhbHNgIGFyZ3VtZW50IG1heSBiZSBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGVcbiAgICogbmFtZXMgYW5kIHRlbXBsYXRlcyBvZiBwYXJ0aWFscyB0aGF0IGFyZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZS4gSXQgbWF5XG4gICAqIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gbG9hZCBwYXJ0aWFsIHRlbXBsYXRlcyBvbiB0aGUgZmx5XG4gICAqIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQ6IHRoZSBuYW1lIG9mIHRoZSBwYXJ0aWFsLlxuICAgKlxuICAgKiBJZiB0aGUgb3B0aW9uYWwgYGNvbmZpZ2AgYXJndW1lbnQgaXMgZ2l2ZW4gaGVyZSwgdGhlbiBpdCBzaG91bGQgYmUgYW5cbiAgICogb2JqZWN0IHdpdGggYSBgdGFnc2AgYXR0cmlidXRlIG9yIGFuIGBlc2NhcGVgIGF0dHJpYnV0ZSBvciBib3RoLlxuICAgKiBJZiBhbiBhcnJheSBpcyBwYXNzZWQsIHRoZW4gaXQgd2lsbCBiZSBpbnRlcnByZXRlZCB0aGUgc2FtZSB3YXkgYXNcbiAgICogYSBgdGFnc2AgYXR0cmlidXRlIG9uIGEgYGNvbmZpZ2Agb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgYHRhZ3NgIGF0dHJpYnV0ZSBvZiBhIGBjb25maWdgIG9iamVjdCBtdXN0IGJlIGFuIGFycmF5IHdpdGggdHdvXG4gICAqIHN0cmluZyB2YWx1ZXM6IHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgdXNlZCBpbiB0aGUgdGVtcGxhdGUgKGUuZy5cbiAgICogWyBcIjwlXCIsIFwiJT5cIiBdKS4gVGhlIGRlZmF1bHQgaXMgdG8gbXVzdGFjaGUudGFncy5cbiAgICpcbiAgICogVGhlIGBlc2NhcGVgIGF0dHJpYnV0ZSBvZiBhIGBjb25maWdgIG9iamVjdCBtdXN0IGJlIGEgZnVuY3Rpb24gd2hpY2hcbiAgICogYWNjZXB0cyBhIHN0cmluZyBhcyBpbnB1dCBhbmQgb3V0cHV0cyBhIHNhZmVseSBlc2NhcGVkIHN0cmluZy5cbiAgICogSWYgYW4gYGVzY2FwZWAgZnVuY3Rpb24gaXMgbm90IHByb3ZpZGVkLCB0aGVuIGFuIEhUTUwtc2FmZSBzdHJpbmdcbiAgICogZXNjYXBpbmcgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgZGVmYXVsdC5cbiAgICovXG4gIFdyaXRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyICh0ZW1wbGF0ZSwgdmlldywgcGFydGlhbHMsIGNvbmZpZykge1xuICAgIHZhciB0YWdzID0gdGhpcy5nZXRDb25maWdUYWdzKGNvbmZpZyk7XG4gICAgdmFyIHRva2VucyA9IHRoaXMucGFyc2UodGVtcGxhdGUsIHRhZ3MpO1xuICAgIHZhciBjb250ZXh0ID0gKHZpZXcgaW5zdGFuY2VvZiBDb250ZXh0KSA/IHZpZXcgOiBuZXcgQ29udGV4dCh2aWV3LCB1bmRlZmluZWQpO1xuICAgIHJldHVybiB0aGlzLnJlbmRlclRva2Vucyh0b2tlbnMsIGNvbnRleHQsIHBhcnRpYWxzLCB0ZW1wbGF0ZSwgY29uZmlnKTtcbiAgfTtcblxuICAvKipcbiAgICogTG93LWxldmVsIG1ldGhvZCB0aGF0IHJlbmRlcnMgdGhlIGdpdmVuIGFycmF5IG9mIGB0b2tlbnNgIHVzaW5nXG4gICAqIHRoZSBnaXZlbiBgY29udGV4dGAgYW5kIGBwYXJ0aWFsc2AuXG4gICAqXG4gICAqIE5vdGU6IFRoZSBgb3JpZ2luYWxUZW1wbGF0ZWAgaXMgb25seSBldmVyIHVzZWQgdG8gZXh0cmFjdCB0aGUgcG9ydGlvblxuICAgKiBvZiB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgdGhhdCB3YXMgY29udGFpbmVkIGluIGEgaGlnaGVyLW9yZGVyIHNlY3Rpb24uXG4gICAqIElmIHRoZSB0ZW1wbGF0ZSBkb2Vzbid0IHVzZSBoaWdoZXItb3JkZXIgc2VjdGlvbnMsIHRoaXMgYXJndW1lbnQgbWF5XG4gICAqIGJlIG9taXR0ZWQuXG4gICAqL1xuICBXcml0ZXIucHJvdG90eXBlLnJlbmRlclRva2VucyA9IGZ1bmN0aW9uIHJlbmRlclRva2VucyAodG9rZW5zLCBjb250ZXh0LCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSwgY29uZmlnKSB7XG4gICAgdmFyIGJ1ZmZlciA9ICcnO1xuXG4gICAgdmFyIHRva2VuLCBzeW1ib2wsIHZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwLCBudW1Ub2tlbnMgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbnVtVG9rZW5zOyArK2kpIHtcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICBzeW1ib2wgPSB0b2tlblswXTtcblxuICAgICAgaWYgKHN5bWJvbCA9PT0gJyMnKSB2YWx1ZSA9IHRoaXMucmVuZGVyU2VjdGlvbih0b2tlbiwgY29udGV4dCwgcGFydGlhbHMsIG9yaWdpbmFsVGVtcGxhdGUsIGNvbmZpZyk7XG4gICAgICBlbHNlIGlmIChzeW1ib2wgPT09ICdeJykgdmFsdWUgPSB0aGlzLnJlbmRlckludmVydGVkKHRva2VuLCBjb250ZXh0LCBwYXJ0aWFscywgb3JpZ2luYWxUZW1wbGF0ZSwgY29uZmlnKTtcbiAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gJz4nKSB2YWx1ZSA9IHRoaXMucmVuZGVyUGFydGlhbCh0b2tlbiwgY29udGV4dCwgcGFydGlhbHMsIGNvbmZpZyk7XG4gICAgICBlbHNlIGlmIChzeW1ib2wgPT09ICcmJykgdmFsdWUgPSB0aGlzLnVuZXNjYXBlZFZhbHVlKHRva2VuLCBjb250ZXh0KTtcbiAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gJ25hbWUnKSB2YWx1ZSA9IHRoaXMuZXNjYXBlZFZhbHVlKHRva2VuLCBjb250ZXh0LCBjb25maWcpO1xuICAgICAgZWxzZSBpZiAoc3ltYm9sID09PSAndGV4dCcpIHZhbHVlID0gdGhpcy5yYXdWYWx1ZSh0b2tlbik7XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBidWZmZXIgKz0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfTtcblxuICBXcml0ZXIucHJvdG90eXBlLnJlbmRlclNlY3Rpb24gPSBmdW5jdGlvbiByZW5kZXJTZWN0aW9uICh0b2tlbiwgY29udGV4dCwgcGFydGlhbHMsIG9yaWdpbmFsVGVtcGxhdGUsIGNvbmZpZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYnVmZmVyID0gJyc7XG4gICAgdmFyIHZhbHVlID0gY29udGV4dC5sb29rdXAodG9rZW5bMV0pO1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbmRlciBhbiBhcmJpdHJhcnkgdGVtcGxhdGVcbiAgICAvLyBpbiB0aGUgY3VycmVudCBjb250ZXh0IGJ5IGhpZ2hlci1vcmRlciBzZWN0aW9ucy5cbiAgICBmdW5jdGlvbiBzdWJSZW5kZXIgKHRlbXBsYXRlKSB7XG4gICAgICByZXR1cm4gc2VsZi5yZW5kZXIodGVtcGxhdGUsIGNvbnRleHQsIHBhcnRpYWxzLCBjb25maWcpO1xuICAgIH1cblxuICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yICh2YXIgaiA9IDAsIHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoOyBqIDwgdmFsdWVMZW5ndGg7ICsraikge1xuICAgICAgICBidWZmZXIgKz0gdGhpcy5yZW5kZXJUb2tlbnModG9rZW5bNF0sIGNvbnRleHQucHVzaCh2YWx1ZVtqXSksIHBhcnRpYWxzLCBvcmlnaW5hbFRlbXBsYXRlLCBjb25maWcpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGJ1ZmZlciArPSB0aGlzLnJlbmRlclRva2Vucyh0b2tlbls0XSwgY29udGV4dC5wdXNoKHZhbHVlKSwgcGFydGlhbHMsIG9yaWdpbmFsVGVtcGxhdGUsIGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiBvcmlnaW5hbFRlbXBsYXRlICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIGhpZ2hlci1vcmRlciBzZWN0aW9ucyB3aXRob3V0IHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZScpO1xuXG4gICAgICAvLyBFeHRyYWN0IHRoZSBwb3J0aW9uIG9mIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zLlxuICAgICAgdmFsdWUgPSB2YWx1ZS5jYWxsKGNvbnRleHQudmlldywgb3JpZ2luYWxUZW1wbGF0ZS5zbGljZSh0b2tlblszXSwgdG9rZW5bNV0pLCBzdWJSZW5kZXIpO1xuXG4gICAgICBpZiAodmFsdWUgIT0gbnVsbClcbiAgICAgICAgYnVmZmVyICs9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgKz0gdGhpcy5yZW5kZXJUb2tlbnModG9rZW5bNF0sIGNvbnRleHQsIHBhcnRpYWxzLCBvcmlnaW5hbFRlbXBsYXRlLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9O1xuXG4gIFdyaXRlci5wcm90b3R5cGUucmVuZGVySW52ZXJ0ZWQgPSBmdW5jdGlvbiByZW5kZXJJbnZlcnRlZCAodG9rZW4sIGNvbnRleHQsIHBhcnRpYWxzLCBvcmlnaW5hbFRlbXBsYXRlLCBjb25maWcpIHtcbiAgICB2YXIgdmFsdWUgPSBjb250ZXh0Lmxvb2t1cCh0b2tlblsxXSk7XG5cbiAgICAvLyBVc2UgSmF2YVNjcmlwdCdzIGRlZmluaXRpb24gb2YgZmFsc3kuIEluY2x1ZGUgZW1wdHkgYXJyYXlzLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFubC9tdXN0YWNoZS5qcy9pc3N1ZXMvMTg2XG4gICAgaWYgKCF2YWx1ZSB8fCAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSlcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRva2Vucyh0b2tlbls0XSwgY29udGV4dCwgcGFydGlhbHMsIG9yaWdpbmFsVGVtcGxhdGUsIGNvbmZpZyk7XG4gIH07XG5cbiAgV3JpdGVyLnByb3RvdHlwZS5pbmRlbnRQYXJ0aWFsID0gZnVuY3Rpb24gaW5kZW50UGFydGlhbCAocGFydGlhbCwgaW5kZW50YXRpb24sIGxpbmVIYXNOb25TcGFjZSkge1xuICAgIHZhciBmaWx0ZXJlZEluZGVudGF0aW9uID0gaW5kZW50YXRpb24ucmVwbGFjZSgvW14gXFx0XS9nLCAnJyk7XG4gICAgdmFyIHBhcnRpYWxCeU5sID0gcGFydGlhbC5zcGxpdCgnXFxuJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0aWFsQnlObC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhcnRpYWxCeU5sW2ldLmxlbmd0aCAmJiAoaSA+IDAgfHwgIWxpbmVIYXNOb25TcGFjZSkpIHtcbiAgICAgICAgcGFydGlhbEJ5TmxbaV0gPSBmaWx0ZXJlZEluZGVudGF0aW9uICsgcGFydGlhbEJ5TmxbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWFsQnlObC5qb2luKCdcXG4nKTtcbiAgfTtcblxuICBXcml0ZXIucHJvdG90eXBlLnJlbmRlclBhcnRpYWwgPSBmdW5jdGlvbiByZW5kZXJQYXJ0aWFsICh0b2tlbiwgY29udGV4dCwgcGFydGlhbHMsIGNvbmZpZykge1xuICAgIGlmICghcGFydGlhbHMpIHJldHVybjtcbiAgICB2YXIgdGFncyA9IHRoaXMuZ2V0Q29uZmlnVGFncyhjb25maWcpO1xuXG4gICAgdmFyIHZhbHVlID0gaXNGdW5jdGlvbihwYXJ0aWFscykgPyBwYXJ0aWFscyh0b2tlblsxXSkgOiBwYXJ0aWFsc1t0b2tlblsxXV07XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhciBsaW5lSGFzTm9uU3BhY2UgPSB0b2tlbls2XTtcbiAgICAgIHZhciB0YWdJbmRleCA9IHRva2VuWzVdO1xuICAgICAgdmFyIGluZGVudGF0aW9uID0gdG9rZW5bNF07XG4gICAgICB2YXIgaW5kZW50ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKHRhZ0luZGV4ID09IDAgJiYgaW5kZW50YXRpb24pIHtcbiAgICAgICAgaW5kZW50ZWRWYWx1ZSA9IHRoaXMuaW5kZW50UGFydGlhbCh2YWx1ZSwgaW5kZW50YXRpb24sIGxpbmVIYXNOb25TcGFjZSk7XG4gICAgICB9XG4gICAgICB2YXIgdG9rZW5zID0gdGhpcy5wYXJzZShpbmRlbnRlZFZhbHVlLCB0YWdzKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRva2Vucyh0b2tlbnMsIGNvbnRleHQsIHBhcnRpYWxzLCBpbmRlbnRlZFZhbHVlLCBjb25maWcpO1xuICAgIH1cbiAgfTtcblxuICBXcml0ZXIucHJvdG90eXBlLnVuZXNjYXBlZFZhbHVlID0gZnVuY3Rpb24gdW5lc2NhcGVkVmFsdWUgKHRva2VuLCBjb250ZXh0KSB7XG4gICAgdmFyIHZhbHVlID0gY29udGV4dC5sb29rdXAodG9rZW5bMV0pO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIFdyaXRlci5wcm90b3R5cGUuZXNjYXBlZFZhbHVlID0gZnVuY3Rpb24gZXNjYXBlZFZhbHVlICh0b2tlbiwgY29udGV4dCwgY29uZmlnKSB7XG4gICAgdmFyIGVzY2FwZSA9IHRoaXMuZ2V0Q29uZmlnRXNjYXBlKGNvbmZpZykgfHwgbXVzdGFjaGUuZXNjYXBlO1xuICAgIHZhciB2YWx1ZSA9IGNvbnRleHQubG9va3VwKHRva2VuWzFdKTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbClcbiAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBlc2NhcGUgPT09IG11c3RhY2hlLmVzY2FwZSkgPyBTdHJpbmcodmFsdWUpIDogZXNjYXBlKHZhbHVlKTtcbiAgfTtcblxuICBXcml0ZXIucHJvdG90eXBlLnJhd1ZhbHVlID0gZnVuY3Rpb24gcmF3VmFsdWUgKHRva2VuKSB7XG4gICAgcmV0dXJuIHRva2VuWzFdO1xuICB9O1xuXG4gIFdyaXRlci5wcm90b3R5cGUuZ2V0Q29uZmlnVGFncyA9IGZ1bmN0aW9uIGdldENvbmZpZ1RhZ3MgKGNvbmZpZykge1xuICAgIGlmIChpc0FycmF5KGNvbmZpZykpIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGNvbmZpZy50YWdzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIFdyaXRlci5wcm90b3R5cGUuZ2V0Q29uZmlnRXNjYXBlID0gZnVuY3Rpb24gZ2V0Q29uZmlnRXNjYXBlIChjb25maWcpIHtcbiAgICBpZiAoY29uZmlnICYmIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmICFpc0FycmF5KGNvbmZpZykpIHtcbiAgICAgIHJldHVybiBjb25maWcuZXNjYXBlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIHZhciBtdXN0YWNoZSA9IHtcbiAgICBuYW1lOiAnbXVzdGFjaGUuanMnLFxuICAgIHZlcnNpb246ICc0LjIuMCcsXG4gICAgdGFnczogWyAne3snLCAnfX0nIF0sXG4gICAgY2xlYXJDYWNoZTogdW5kZWZpbmVkLFxuICAgIGVzY2FwZTogdW5kZWZpbmVkLFxuICAgIHBhcnNlOiB1bmRlZmluZWQsXG4gICAgcmVuZGVyOiB1bmRlZmluZWQsXG4gICAgU2Nhbm5lcjogdW5kZWZpbmVkLFxuICAgIENvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICBXcml0ZXI6IHVuZGVmaW5lZCxcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgYSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNhY2hpbmcgc3RyYXRlZ3ksIGJ5IHByb3ZpZGluZyBhblxuICAgICAqIG9iamVjdCB3aXRoIHNldCwgZ2V0IGFuZCBjbGVhciBtZXRob2RzLiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGlzYWJsZVxuICAgICAqIHRoZSBjYWNoZSBieSBzZXR0aW5nIGl0IHRvIHRoZSBsaXRlcmFsIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIHNldCB0ZW1wbGF0ZUNhY2hlIChjYWNoZSkge1xuICAgICAgZGVmYXVsdFdyaXRlci50ZW1wbGF0ZUNhY2hlID0gY2FjaGU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IG9yIG92ZXJyaWRkZW4gY2FjaGluZyBvYmplY3QgZnJvbSB0aGUgZGVmYXVsdCB3cml0ZXIuXG4gICAgICovXG4gICAgZ2V0IHRlbXBsYXRlQ2FjaGUgKCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRXcml0ZXIudGVtcGxhdGVDYWNoZTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQWxsIGhpZ2gtbGV2ZWwgbXVzdGFjaGUuKiBmdW5jdGlvbnMgdXNlIHRoaXMgd3JpdGVyLlxuICB2YXIgZGVmYXVsdFdyaXRlciA9IG5ldyBXcml0ZXIoKTtcblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBjYWNoZWQgdGVtcGxhdGVzIGluIHRoZSBkZWZhdWx0IHdyaXRlci5cbiAgICovXG4gIG11c3RhY2hlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiBjbGVhckNhY2hlICgpIHtcbiAgICByZXR1cm4gZGVmYXVsdFdyaXRlci5jbGVhckNhY2hlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbmQgY2FjaGVzIHRoZSBnaXZlbiB0ZW1wbGF0ZSBpbiB0aGUgZGVmYXVsdCB3cml0ZXIgYW5kIHJldHVybnMgdGhlXG4gICAqIGFycmF5IG9mIHRva2VucyBpdCBjb250YWlucy4gRG9pbmcgdGhpcyBhaGVhZCBvZiB0aW1lIGF2b2lkcyB0aGUgbmVlZCB0b1xuICAgKiBwYXJzZSB0ZW1wbGF0ZXMgb24gdGhlIGZseSBhcyB0aGV5IGFyZSByZW5kZXJlZC5cbiAgICovXG4gIG11c3RhY2hlLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UgKHRlbXBsYXRlLCB0YWdzKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRXcml0ZXIucGFyc2UodGVtcGxhdGUsIHRhZ3MpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBgdGVtcGxhdGVgIHdpdGggdGhlIGdpdmVuIGB2aWV3YCwgYHBhcnRpYWxzYCwgYW5kIGBjb25maWdgXG4gICAqIHVzaW5nIHRoZSBkZWZhdWx0IHdyaXRlci5cbiAgICovXG4gIG11c3RhY2hlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlciAodGVtcGxhdGUsIHZpZXcsIHBhcnRpYWxzLCBjb25maWcpIHtcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB0ZW1wbGF0ZSEgVGVtcGxhdGUgc2hvdWxkIGJlIGEgXCJzdHJpbmdcIiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1dCBcIicgKyB0eXBlU3RyKHRlbXBsYXRlKSArICdcIiB3YXMgZ2l2ZW4gYXMgdGhlIGZpcnN0ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnQgZm9yIG11c3RhY2hlI3JlbmRlcih0ZW1wbGF0ZSwgdmlldywgcGFydGlhbHMpJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRXcml0ZXIucmVuZGVyKHRlbXBsYXRlLCB2aWV3LCBwYXJ0aWFscywgY29uZmlnKTtcbiAgfTtcblxuICAvLyBFeHBvcnQgdGhlIGVzY2FwaW5nIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIHVzZXIgbWF5IG92ZXJyaWRlIGl0LlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phbmwvbXVzdGFjaGUuanMvaXNzdWVzLzI0NFxuICBtdXN0YWNoZS5lc2NhcGUgPSBlc2NhcGVIdG1sO1xuXG4gIC8vIEV4cG9ydCB0aGVzZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBhbHNvIGZvciBhZHZhbmNlZCB1c2FnZS5cbiAgbXVzdGFjaGUuU2Nhbm5lciA9IFNjYW5uZXI7XG4gIG11c3RhY2hlLkNvbnRleHQgPSBDb250ZXh0O1xuICBtdXN0YWNoZS5Xcml0ZXIgPSBXcml0ZXI7XG5cbiAgcmV0dXJuIG11c3RhY2hlO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbImdsb2JhbCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsIk11c3RhY2hlIiwidGhpcyIsIm9iamVjdFRvU3RyaW5nIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJpc0FycmF5IiwiQXJyYXkiLCJpc0FycmF5UG9seWZpbGwiLCJvYmplY3QiLCJjYWxsIiwiaXNGdW5jdGlvbiIsInR5cGVTdHIiLCJvYmoiLCJlc2NhcGVSZWdFeHAiLCJzdHJpbmciLCJyZXBsYWNlIiwiaGFzUHJvcGVydHkiLCJwcm9wTmFtZSIsInByaW1pdGl2ZUhhc093blByb3BlcnR5IiwicHJpbWl0aXZlIiwiaGFzT3duUHJvcGVydHkiLCJyZWdFeHBUZXN0IiwiUmVnRXhwIiwidGVzdCIsInRlc3RSZWdFeHAiLCJyZSIsIm5vblNwYWNlUmUiLCJpc1doaXRlc3BhY2UiLCJlbnRpdHlNYXAiLCJlc2NhcGVIdG1sIiwiU3RyaW5nIiwiZnJvbUVudGl0eU1hcCIsInMiLCJ3aGl0ZVJlIiwic3BhY2VSZSIsImVxdWFsc1JlIiwiY3VybHlSZSIsInRhZ1JlIiwicGFyc2VUZW1wbGF0ZSIsInRlbXBsYXRlIiwidGFncyIsImxpbmVIYXNOb25TcGFjZSIsInNlY3Rpb25zIiwidG9rZW5zIiwic3BhY2VzIiwiaGFzVGFnIiwibm9uU3BhY2UiLCJpbmRlbnRhdGlvbiIsInRhZ0luZGV4Iiwic3RyaXBTcGFjZSIsImxlbmd0aCIsInBvcCIsIm9wZW5pbmdUYWdSZSIsImNsb3NpbmdUYWdSZSIsImNsb3NpbmdDdXJseVJlIiwiY29tcGlsZVRhZ3MiLCJ0YWdzVG9Db21waWxlIiwic3BsaXQiLCJFcnJvciIsIm11c3RhY2hlIiwic2Nhbm5lciIsIlNjYW5uZXIiLCJzdGFydCIsInR5cGUiLCJ2YWx1ZSIsImNociIsInRva2VuIiwib3BlblNlY3Rpb24iLCJlb3MiLCJwb3MiLCJzY2FuVW50aWwiLCJpIiwidmFsdWVMZW5ndGgiLCJjaGFyQXQiLCJwdXNoIiwic2NhbiIsIm5lc3RUb2tlbnMiLCJzcXVhc2hUb2tlbnMiLCJzcXVhc2hlZFRva2VucyIsImxhc3RUb2tlbiIsIm51bVRva2VucyIsIm5lc3RlZFRva2VucyIsImNvbGxlY3RvciIsInNlY3Rpb24iLCJ0YWlsIiwibWF0Y2giLCJpbmRleCIsInN1YnN0cmluZyIsInNlYXJjaCIsIkNvbnRleHQiLCJ2aWV3IiwicGFyZW50Q29udGV4dCIsImNhY2hlIiwicGFyZW50IiwibG9va3VwIiwibmFtZSIsImNvbnRleHQiLCJpbnRlcm1lZGlhdGVWYWx1ZSIsIm5hbWVzIiwibG9va3VwSGl0IiwiaW5kZXhPZiIsIldyaXRlciIsInRlbXBsYXRlQ2FjaGUiLCJfY2FjaGUiLCJzZXQiLCJrZXkiLCJnZXQiLCJjbGVhciIsImNsZWFyQ2FjaGUiLCJwYXJzZSIsImNhY2hlS2V5Iiwiam9pbiIsImlzQ2FjaGVFbmFibGVkIiwidW5kZWZpbmVkIiwicmVuZGVyIiwicGFydGlhbHMiLCJjb25maWciLCJnZXRDb25maWdUYWdzIiwicmVuZGVyVG9rZW5zIiwib3JpZ2luYWxUZW1wbGF0ZSIsImJ1ZmZlciIsInN5bWJvbCIsInJlbmRlclNlY3Rpb24iLCJyZW5kZXJJbnZlcnRlZCIsInJlbmRlclBhcnRpYWwiLCJ1bmVzY2FwZWRWYWx1ZSIsImVzY2FwZWRWYWx1ZSIsInJhd1ZhbHVlIiwic3ViUmVuZGVyIiwiaiIsInNsaWNlIiwiaW5kZW50UGFydGlhbCIsInBhcnRpYWwiLCJmaWx0ZXJlZEluZGVudGF0aW9uIiwicGFydGlhbEJ5TmwiLCJpbmRlbnRlZFZhbHVlIiwiZXNjYXBlIiwiZ2V0Q29uZmlnRXNjYXBlIiwidmVyc2lvbiIsImRlZmF1bHRXcml0ZXIiLCJUeXBlRXJyb3IiXSwibWFwcGluZ3MiOiI7OztBQUFDLFdBQVVBLE1BQU0sRUFBRUMsT0FBTyxFQUFFO0VBQzFCLE9BQU9DLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBT0MsTUFBTSxLQUFLLFdBQVcsR0FBR0EsTUFBTSxDQUFDRCxP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"}