vendor/interactivate/build/main.js in ruby-wisp-source-0.7.0 vs vendor/interactivate/build/main.js in ruby-wisp-source-0.8.0

- old
+ new

@@ -1,11 +1,12 @@ require=(function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({"wisp/runtime":[function(require,module,exports){ module.exports=require('YbrU3i'); },{}],"YbrU3i":[function(require,module,exports){ -(function(){var _ns_ = "wisp.runtime"; -module.namespace = _ns_; -module.description = "Core primitives required for runtime";; +(function(){var _ns_ = { + "id": "wisp.runtime", + "doc": "Core primitives required for runtime" +};; var identity = function identity(x) { return x; }; exports.identity = identity; @@ -612,28 +613,30 @@ var print = function print() { var more = Array.prototype.slice.call(arguments, 0); return console.log.apply(console.log, more); }; exports.print = print - })() },{}],"wisp/sequence":[function(require,module,exports){ module.exports=require('gdziIz'); },{}],"gdziIz":[function(require,module,exports){ -var _ns_ = "wisp.sequence"; -module.namespace = _ns_; -var isNil = (require("./runtime")).isNil; -var isVector = (require("./runtime")).isVector; -var isFn = (require("./runtime")).isFn; -var isNumber = (require("./runtime")).isNumber; -var isString = (require("./runtime")).isString; -var isDictionary = (require("./runtime")).isDictionary; -var keyValues = (require("./runtime")).keyValues; -var str = (require("./runtime")).str; -var dec = (require("./runtime")).dec; -var inc = (require("./runtime")).inc; -var merge = (require("./runtime")).merge;; +var _ns_ = { + "id": "wisp.sequence" +}; +var wisp_runtime = require("./runtime"); +var isNil = wisp_runtime.isNil; +var isVector = wisp_runtime.isVector; +var isFn = wisp_runtime.isFn; +var isNumber = wisp_runtime.isNumber; +var isString = wisp_runtime.isString; +var isDictionary = wisp_runtime.isDictionary; +var keyValues = wisp_runtime.keyValues; +var str = wisp_runtime.str; +var dec = wisp_runtime.dec; +var inc = wisp_runtime.inc; +var merge = wisp_runtime.merge; +var dictionary = wisp_runtime.dictionary;;; var List = function List(head, tail) { this.head = head; this.tail = tail || (list()); this.length = inc(count(this.tail)); @@ -1076,10 +1079,16 @@ (function() { throw TypeError("" + "Type can't be conjoined " + sequence); })() : void(0); }; exports.conj = conj; +var assoc = function assoc(source) { + var keyValues = Array.prototype.slice.call(arguments, 1); + return conj(source, dictionary.apply(dictionary, keyValues)); +}; +exports.assoc = assoc; + var concat = function concat() { var sequences = Array.prototype.slice.call(arguments, 0); return reverse(reduce(function(result, sequence) { return reduce(function(result, item) { return cons(item, result); @@ -1172,23 +1181,25 @@ }; return recur; })(n, []); }; exports.repeat = repeat - },{"./runtime":"YbrU3i"}],"wisp/string":[function(require,module,exports){ module.exports=require('BI22ma'); },{}],"BI22ma":[function(require,module,exports){ -var _ns_ = "wisp.string"; -module.namespace = _ns_; -var str = (require("./runtime")).str; -var subs = (require("./runtime")).subs; -var reMatches = (require("./runtime")).reMatches; -var isNil = (require("./runtime")).isNil; -var isString = (require("./runtime")).isString; -var vec = (require("./sequence")).vec; -var isEmpty = (require("./sequence")).isEmpty;; +var _ns_ = { + "id": "wisp.string" +}; +var wisp_runtime = require("./runtime"); +var str = wisp_runtime.str; +var subs = wisp_runtime.subs; +var reMatches = wisp_runtime.reMatches; +var isNil = wisp_runtime.isNil; +var isString = wisp_runtime.isString;; +var wisp_sequence = require("./sequence"); +var vec = wisp_sequence.vec; +var isEmpty = wisp_sequence.isEmpty;;; var split = function split(string, pattern, limit) { return string.split(pattern, limit); }; exports.split = split; @@ -1273,65 +1284,68 @@ var isBlank = function isBlank(string) { return (isNil(string)) || (isEmpty(string)) || (reMatches(__SPACES__, string)); }; exports.isBlank = isBlank - },{"./runtime":"YbrU3i","./sequence":"gdziIz"}],"wisp/reader":[function(require,module,exports){ module.exports=require('yCUXAg'); },{}],"yCUXAg":[function(require,module,exports){ -var _ns_ = "wisp.reader"; -module.namespace = _ns_; -module.description = "Reader module provides functions for reading text input\n as wisp data structures"; -var list = (require("./sequence")).list; -var isList = (require("./sequence")).isList; -var count = (require("./sequence")).count; -var isEmpty = (require("./sequence")).isEmpty; -var first = (require("./sequence")).first; -var second = (require("./sequence")).second; -var third = (require("./sequence")).third; -var rest = (require("./sequence")).rest; -var map = (require("./sequence")).map; -var vec = (require("./sequence")).vec; -var cons = (require("./sequence")).cons; -var conj = (require("./sequence")).conj; -var rest = (require("./sequence")).rest; -var concat = (require("./sequence")).concat; -var last = (require("./sequence")).last; -var butlast = (require("./sequence")).butlast; -var sort = (require("./sequence")).sort; -var lazySeq = (require("./sequence")).lazySeq; -var isOdd = (require("./runtime")).isOdd; -var dictionary = (require("./runtime")).dictionary; -var keys = (require("./runtime")).keys; -var isNil = (require("./runtime")).isNil; -var inc = (require("./runtime")).inc; -var dec = (require("./runtime")).dec; -var isVector = (require("./runtime")).isVector; -var isString = (require("./runtime")).isString; -var isNumber = (require("./runtime")).isNumber; -var isBoolean = (require("./runtime")).isBoolean; -var isObject = (require("./runtime")).isObject; -var isDictionary = (require("./runtime")).isDictionary; -var rePattern = (require("./runtime")).rePattern; -var reMatches = (require("./runtime")).reMatches; -var reFind = (require("./runtime")).reFind; -var str = (require("./runtime")).str; -var subs = (require("./runtime")).subs; -var char = (require("./runtime")).char; -var vals = (require("./runtime")).vals; -var isEqual = (require("./runtime")).isEqual; -var isSymbol = (require("./ast")).isSymbol; -var symbol = (require("./ast")).symbol; -var isKeyword = (require("./ast")).isKeyword; -var keyword = (require("./ast")).keyword; -var meta = (require("./ast")).meta; -var withMeta = (require("./ast")).withMeta; -var name = (require("./ast")).name; -var gensym = (require("./ast")).gensym; -var split = (require("./string")).split; -var join = (require("./string")).join;; +var _ns_ = { + "id": "wisp.reader", + "doc": "Reader module provides functions for reading text input\n as wisp data structures" +}; +var wisp_sequence = require("./sequence"); +var list = wisp_sequence.list; +var isList = wisp_sequence.isList; +var count = wisp_sequence.count; +var isEmpty = wisp_sequence.isEmpty; +var first = wisp_sequence.first; +var second = wisp_sequence.second; +var third = wisp_sequence.third; +var rest = wisp_sequence.rest; +var map = wisp_sequence.map; +var vec = wisp_sequence.vec; +var cons = wisp_sequence.cons; +var conj = wisp_sequence.conj; +var concat = wisp_sequence.concat; +var last = wisp_sequence.last; +var butlast = wisp_sequence.butlast; +var sort = wisp_sequence.sort; +var lazySeq = wisp_sequence.lazySeq;; +var wisp_runtime = require("./runtime"); +var isOdd = wisp_runtime.isOdd; +var dictionary = wisp_runtime.dictionary; +var keys = wisp_runtime.keys; +var isNil = wisp_runtime.isNil; +var inc = wisp_runtime.inc; +var dec = wisp_runtime.dec; +var isVector = wisp_runtime.isVector; +var isString = wisp_runtime.isString; +var isNumber = wisp_runtime.isNumber; +var isBoolean = wisp_runtime.isBoolean; +var isObject = wisp_runtime.isObject; +var isDictionary = wisp_runtime.isDictionary; +var rePattern = wisp_runtime.rePattern; +var reMatches = wisp_runtime.reMatches; +var reFind = wisp_runtime.reFind; +var str = wisp_runtime.str; +var subs = wisp_runtime.subs; +var char = wisp_runtime.char; +var vals = wisp_runtime.vals; +var isEqual = wisp_runtime.isEqual;; +var wisp_ast = require("./ast"); +var isSymbol = wisp_ast.isSymbol; +var symbol = wisp_ast.symbol; +var isKeyword = wisp_ast.isKeyword; +var keyword = wisp_ast.keyword; +var meta = wisp_ast.meta; +var withMeta = wisp_ast.withMeta; +var name = wisp_ast.name; +var gensym = wisp_ast.gensym;; +var wisp_string = require("./string"); +var split = wisp_string.split; +var join = wisp_string.join;;; var pushBackReader = function pushBackReader(source, uri) { return { "lines": split(source, "\n"), "buffer": "", @@ -2061,39 +2075,42 @@ return pfn ? pfn(read(reader, true, void(0), false)) : readerError(reader, "" + "Could not find tag parser for " + (name(tag)) + " in " + ("" + (keys(__tagTable__)))); }; exports.maybeReadTaggedType = maybeReadTaggedType - },{"./sequence":"gdziIz","./runtime":"YbrU3i","./ast":"nw8hg9","./string":"BI22ma"}],"wisp/ast":[function(require,module,exports){ module.exports=require('nw8hg9'); },{}],"nw8hg9":[function(require,module,exports){ -var _ns_ = "wisp.ast"; -module.namespace = _ns_; -var isList = (require("./sequence")).isList; -var isSequential = (require("./sequence")).isSequential; -var first = (require("./sequence")).first; -var second = (require("./sequence")).second; -var count = (require("./sequence")).count; -var last = (require("./sequence")).last; -var map = (require("./sequence")).map; -var vec = (require("./sequence")).vec; -var split = (require("./string")).split; -var join = (require("./string")).join; -var isNil = (require("./runtime")).isNil; -var isVector = (require("./runtime")).isVector; -var isNumber = (require("./runtime")).isNumber; -var isString = (require("./runtime")).isString; -var isBoolean = (require("./runtime")).isBoolean; -var isObject = (require("./runtime")).isObject; -var isDate = (require("./runtime")).isDate; -var isRePattern = (require("./runtime")).isRePattern; -var isDictionary = (require("./runtime")).isDictionary; -var str = (require("./runtime")).str; -var inc = (require("./runtime")).inc; -var subs = (require("./runtime")).subs; -var isEqual = (require("./runtime")).isEqual;; +var _ns_ = { + "id": "wisp.ast" +}; +var wisp_sequence = require("./sequence"); +var isList = wisp_sequence.isList; +var isSequential = wisp_sequence.isSequential; +var first = wisp_sequence.first; +var second = wisp_sequence.second; +var count = wisp_sequence.count; +var last = wisp_sequence.last; +var map = wisp_sequence.map; +var vec = wisp_sequence.vec;; +var wisp_string = require("./string"); +var split = wisp_string.split; +var join = wisp_string.join;; +var wisp_runtime = require("./runtime"); +var isNil = wisp_runtime.isNil; +var isVector = wisp_runtime.isVector; +var isNumber = wisp_runtime.isNumber; +var isString = wisp_runtime.isString; +var isBoolean = wisp_runtime.isBoolean; +var isObject = wisp_runtime.isObject; +var isDate = wisp_runtime.isDate; +var isRePattern = wisp_runtime.isRePattern; +var isDictionary = wisp_runtime.isDictionary; +var str = wisp_runtime.str; +var inc = wisp_runtime.inc; +var subs = wisp_runtime.subs; +var isEqual = wisp_runtime.isEqual;;; var withMeta = function withMeta(value, metadata) { Object.defineProperty(value, "metadata", { "value": metadata, "configurable": true @@ -2279,90 +2296,96 @@ "else" ? "" + x : void(0); }; exports.prStr = prStr - },{"./sequence":"gdziIz","./string":"BI22ma","./runtime":"YbrU3i"}],"wisp/compiler":[function(require,module,exports){ module.exports=require('baogts'); },{}],"baogts":[function(require,module,exports){ -var _ns_ = "wisp.compiler"; -module.namespace = _ns_; -module.description = "wisp language compiler"; -var readFromString = (require("./reader")).readFromString; -var meta = (require("./ast")).meta; -var withMeta = (require("./ast")).withMeta; -var isSymbol = (require("./ast")).isSymbol; -var symbol = (require("./ast")).symbol; -var isKeyword = (require("./ast")).isKeyword; -var keyword = (require("./ast")).keyword; -var namespace = (require("./ast")).namespace; -var isUnquote = (require("./ast")).isUnquote; -var isUnquoteSplicing = (require("./ast")).isUnquoteSplicing; -var isQuote = (require("./ast")).isQuote; -var isSyntaxQuote = (require("./ast")).isSyntaxQuote; -var name = (require("./ast")).name; -var gensym = (require("./ast")).gensym; -var prStr = (require("./ast")).prStr; -var isEmpty = (require("./sequence")).isEmpty; -var count = (require("./sequence")).count; -var isList = (require("./sequence")).isList; -var list = (require("./sequence")).list; -var first = (require("./sequence")).first; -var second = (require("./sequence")).second; -var third = (require("./sequence")).third; -var rest = (require("./sequence")).rest; -var cons = (require("./sequence")).cons; -var conj = (require("./sequence")).conj; -var reverse = (require("./sequence")).reverse; -var reduce = (require("./sequence")).reduce; -var vec = (require("./sequence")).vec; -var last = (require("./sequence")).last; -var repeat = (require("./sequence")).repeat; -var map = (require("./sequence")).map; -var filter = (require("./sequence")).filter; -var take = (require("./sequence")).take; -var concat = (require("./sequence")).concat; -var isOdd = (require("./runtime")).isOdd; -var isDictionary = (require("./runtime")).isDictionary; -var dictionary = (require("./runtime")).dictionary; -var merge = (require("./runtime")).merge; -var keys = (require("./runtime")).keys; -var vals = (require("./runtime")).vals; -var isContainsVector = (require("./runtime")).isContainsVector; -var mapDictionary = (require("./runtime")).mapDictionary; -var isString = (require("./runtime")).isString; -var isNumber = (require("./runtime")).isNumber; -var isVector = (require("./runtime")).isVector; -var isBoolean = (require("./runtime")).isBoolean; -var subs = (require("./runtime")).subs; -var reFind = (require("./runtime")).reFind; -var isTrue = (require("./runtime")).isTrue; -var isFalse = (require("./runtime")).isFalse; -var isNil = (require("./runtime")).isNil; -var isRePattern = (require("./runtime")).isRePattern; -var inc = (require("./runtime")).inc; -var dec = (require("./runtime")).dec; -var str = (require("./runtime")).str; -var char = (require("./runtime")).char; -var int = (require("./runtime")).int; -var isEqual = (require("./runtime")).isEqual; -var isStrictEqual = (require("./runtime")).isStrictEqual; -var split = (require("./string")).split; -var join = (require("./string")).join; -var upperCase = (require("./string")).upperCase; -var replace = (require("./string")).replace; -var writeReference = (require("./backend/javascript/writer")).writeReference; -var writeKeywordReference = (require("./backend/javascript/writer")).writeKeywordReference; -var writeKeyword = (require("./backend/javascript/writer")).writeKeyword; -var writeSymbol = (require("./backend/javascript/writer")).writeSymbol; -var writeNil = (require("./backend/javascript/writer")).writeNil; -var writeComment = (require("./backend/javascript/writer")).writeComment; -var writeNumber = (require("./backend/javascript/writer")).writeNumber; -var writeString = (require("./backend/javascript/writer")).writeString; -var writeNumber = (require("./backend/javascript/writer")).writeNumber; -var writeBoolean = (require("./backend/javascript/writer")).writeBoolean;; +var _ns_ = { + "id": "wisp.compiler", + "doc": "wisp language compiler" +}; +var wisp_reader = require("./reader"); +var readFromString = wisp_reader.readFromString;; +var wisp_ast = require("./ast"); +var meta = wisp_ast.meta; +var withMeta = wisp_ast.withMeta; +var isSymbol = wisp_ast.isSymbol; +var symbol = wisp_ast.symbol; +var isKeyword = wisp_ast.isKeyword; +var keyword = wisp_ast.keyword; +var namespace = wisp_ast.namespace; +var isUnquote = wisp_ast.isUnquote; +var isUnquoteSplicing = wisp_ast.isUnquoteSplicing; +var isQuote = wisp_ast.isQuote; +var isSyntaxQuote = wisp_ast.isSyntaxQuote; +var name = wisp_ast.name; +var gensym = wisp_ast.gensym; +var prStr = wisp_ast.prStr;; +var wisp_sequence = require("./sequence"); +var isEmpty = wisp_sequence.isEmpty; +var count = wisp_sequence.count; +var isList = wisp_sequence.isList; +var list = wisp_sequence.list; +var first = wisp_sequence.first; +var second = wisp_sequence.second; +var third = wisp_sequence.third; +var rest = wisp_sequence.rest; +var cons = wisp_sequence.cons; +var conj = wisp_sequence.conj; +var reverse = wisp_sequence.reverse; +var reduce = wisp_sequence.reduce; +var vec = wisp_sequence.vec; +var last = wisp_sequence.last; +var repeat = wisp_sequence.repeat; +var map = wisp_sequence.map; +var filter = wisp_sequence.filter; +var take = wisp_sequence.take; +var concat = wisp_sequence.concat; +var isSeq = wisp_sequence.isSeq;; +var wisp_runtime = require("./runtime"); +var isOdd = wisp_runtime.isOdd; +var isDictionary = wisp_runtime.isDictionary; +var dictionary = wisp_runtime.dictionary; +var merge = wisp_runtime.merge; +var keys = wisp_runtime.keys; +var vals = wisp_runtime.vals; +var isContainsVector = wisp_runtime.isContainsVector; +var mapDictionary = wisp_runtime.mapDictionary; +var isString = wisp_runtime.isString; +var isNumber = wisp_runtime.isNumber; +var isVector = wisp_runtime.isVector; +var isBoolean = wisp_runtime.isBoolean; +var subs = wisp_runtime.subs; +var reFind = wisp_runtime.reFind; +var isTrue = wisp_runtime.isTrue; +var isFalse = wisp_runtime.isFalse; +var isNil = wisp_runtime.isNil; +var isRePattern = wisp_runtime.isRePattern; +var inc = wisp_runtime.inc; +var dec = wisp_runtime.dec; +var str = wisp_runtime.str; +var char = wisp_runtime.char; +var int = wisp_runtime.int; +var isEqual = wisp_runtime.isEqual; +var isStrictEqual = wisp_runtime.isStrictEqual;; +var wisp_string = require("./string"); +var split = wisp_string.split; +var join = wisp_string.join; +var upperCase = wisp_string.upperCase; +var replace = wisp_string.replace;; +var wisp_backend_javascript_writer = require("./backend/javascript/writer"); +var writeReference = wisp_backend_javascript_writer.writeReference; +var writeKeywordReference = wisp_backend_javascript_writer.writeKeywordReference; +var writeKeyword = wisp_backend_javascript_writer.writeKeyword; +var writeSymbol = wisp_backend_javascript_writer.writeSymbol; +var writeNil = wisp_backend_javascript_writer.writeNil; +var writeComment = wisp_backend_javascript_writer.writeComment; +var writeNumber = wisp_backend_javascript_writer.writeNumber; +var writeString = wisp_backend_javascript_writer.writeString; +var writeBoolean = wisp_backend_javascript_writer.writeBoolean;;; var isSelfEvaluating = function isSelfEvaluating(form) { return (isNumber(form)) || ((isString(form)) && (!(isSymbol(form))) && (!(isKeyword(form)))) || (isBoolean(form)) || (isNil(form)) || (isRePattern(form)); }; exports.isSelfEvaluating = isSelfEvaluating; @@ -3195,158 +3218,165 @@ second(x) : x; return list(symbol(void(0), "do"), list(symbol(void(0), "if"), list(symbol(void(0), "and"), list(symbol(void(0), "not"), list(symbol(void(0), "identical?"), list(symbol(void(0), "typeof"), symbol(void(0), "**verbose**")), "undefined")), symbol(void(0), "**verbose**")), list(symbol(void(0), ".log"), symbol(void(0), "console"), "Assert:", assertion)), list(symbol(void(0), "if"), list(symbol(void(0), "not"), x), list(symbol(void(0), "throw"), list(symbol(void(0), "Error."), list(symbol(void(0), "str"), "Assert failed: ", title, "\n\nAssertion:\n\n", assertion, "\n\nActual:\n\n", form, "\n--------------\n"), uri)))); }); -installMacro(symbol(void(0), "import"), function(imports, path) { - return isNil(path) ? - list(symbol(void(0), "require"), imports) : - isSymbol(imports) ? - list(symbol(void(0), "def"), withMeta(imports, { - "private": true - }), list(symbol(void(0), "require"), path)) : - (function loop(form, names) { +var parseReferences = function parseReferences(forms) { + return reduce(function(references, form) { + isSeq(form) ? + (references || 0)[name(first(form))] = vec(rest(form)) : + void(0); + return references; + }, {}, forms); +}; +exports.parseReferences = parseReferences; + +var parseRequire = function parseRequire(form) { + var requirement = isSymbol(form) ? + [form] : + vec(form); + var id = first(requirement); + var params = dictionary.apply(dictionary, rest(requirement)); + var imports = reduce(function(imports, name) { + (imports || 0)[name] = ((imports || 0)[name]) || name; + return imports; + }, conj({}, (params || 0)["꞉rename"]), (params || 0)["꞉refer"]); + return conj({ + "id": id, + "imports": imports + }, params); +}; +exports.parseRequire = parseRequire; + +var analyzeNs = function analyzeNs(form) { + var id = first(form); + var params = rest(form); + var doc = isString(first(params)) ? + first(params) : + void(0); + var references = parseReferences(doc ? + rest(params) : + params); + return withMeta(form, { + "id": id, + "doc": doc, + "require": (references || 0)["require"] ? + map(parseRequire, (references || 0)["require"]) : + void(0) + }); +}; +exports.analyzeNs = analyzeNs; + +var idToNs = function idToNs(id) { + return symbol(void(0), join("*", split("" + id, "."))); +}; +exports.idToNs = idToNs; + +var nameToField = function nameToField(name) { + return symbol(void(0), "" + "-" + name); +}; +exports.nameToField = nameToField; + +var compileImport = function compileImport(module) { + return function(form) { + return list(symbol(void(0), "def"), second(form), list(symbol(void(0), "."), module, nameToField(first(form)))); + }; +}; +exports.compileImport = compileImport; + +var compileRequire = function compileRequire(requirer) { + return function(form) { + var id = (form || 0)["id"]; + var requirement = idToNs(((form || 0)["꞉as"]) || id); + var path = resolve(requirer, id); + var imports = (form || 0)["imports"]; + return concat([symbol(void(0), "do*"), list(symbol(void(0), "def"), requirement, list(symbol(void(0), "require"), path))], imports ? + map(compileImport(requirement), imports) : + void(0)); + }; +}; +exports.compileRequire = compileRequire; + +var resolve = function resolve(from, to) { + var requirer = split("" + from, "."); + var requirement = split("" + to, "."); + var isRelative = (!("" + from === "" + to)) && (first(requirer) === first(requirement)); + return isRelative ? + (function loop(from, to) { var recur = loop; while (recur === loop) { - recur = isEmpty(names) ? - concat(list(symbol(void(0), "do*")), form) : - (function() { - var alias = first(names); - var id = symbol("" + ".-" + (name(alias))); - return (form = cons(list(symbol(void(0), "def"), withMeta(alias, { - "private": true - }), list(id, list(symbol(void(0), "require"), path))), form), names = rest(names), loop); - })(); + recur = first(from) === first(to) ? + (from = rest(from), to = rest(to), loop) : + join("/", concat(["."], repeat(dec(count(from)), ".."), to)); }; return recur; - })(list(), imports); -}); + })(requirer, requirement) : + join("/", requirement); +}; +exports.resolve = resolve; -var expandNs = function expandNs(id) { - var params = Array.prototype.slice.call(arguments, 1); +var compileNs = function compileNs() { + var form = Array.prototype.slice.call(arguments, 0); return (function() { - var ns = "" + id; - var requirer = split(ns, "."); - var doc = isString(first(params)) ? - first(params) : - void(0); - var args = doc ? - rest(params) : - params; - var parseReferences = function(forms) { - return reduce(function(references, form) { - (references || 0)[name(first(form))] = vec(rest(form)); - return references; - }, {}, forms); - }; - var references = parseReferences(args); - var idToPath = function idToPath(id) { - var requirement = split("" + id, "."); - var isRelative = first(requirer) === first(requirement); - return isRelative ? - (function loop(from, to) { - var recur = loop; - while (recur === loop) { - recur = first(from) === first(to) ? - (from = rest(from), to = rest(to), loop) : - join("/", concat(["."], repeat(dec(count(from)), ".."), to)); - }; - return recur; - })(requirer, requirement) : - join("/", requirement); - }; - var makeRequire = function(from, as, name) { - var path = idToPath(from); - var requirement = name ? - list(symbol(void(0), "."), list(symbol(void(0), "require"), path), symbol(void(0), "" + "-" + name)) : - list(symbol(void(0), "require"), path); - return as ? - list(symbol(void(0), "def"), as, requirement) : - requirement; - }; - var expandRequirement = function(form) { - var from = first(form); - var as = ("꞉as" === second(form)) && (third(form)); - return makeRequire(from, as); - }; - var expandUse = function(form) { - var from = first(form); - var directives = dictionary.apply(dictionary, vec(rest(form))); - var names = (directives || 0)["꞉only"]; - var renames = (directives || 0)["꞉rename"]; - var namedImports = names && (map(function(name) { - return makeRequire(from, name, name); - }, names)); - var renamedImports = renames && (map(function(pair) { - return makeRequire(from, second(pair), first(pair)); - }, renames)); - (function() { - (!(typeof(__verbose__) === "undefined")) && __verbose__ ? - console.log("Assert:", "(or names renames)") : - void(0); - return !(names || renames) ? - (function() { throw new Error("" + "Assert failed: " + ("" + "Only [my.lib :only [foo bar]] form & " + "[clojure.string :rename {replace str-replace} are supported") + "\n\nAssertion:\n\n" + "(or names renames)" + "\n\nActual:\n\n" + names + "\n--------------\n", void(0)); })() : - void(0); - })(); - return concat([], namedImports, renamedImports); - }; - var requireForms = (references || 0)["require"]; - var useForms = (references || 0)["use"]; - var requirements = requireForms ? - map(expandRequirement, requireForms) : - void(0); - var uses = useForms ? - concat.apply(concat, map(expandUse, useForms)) : - void(0); - return concat(list(symbol(void(0), "do*"), list(symbol(void(0), "def"), symbol(void(0), "*ns*"), ns), list(symbol(void(0), "set!"), list(symbol(void(0), ".-namespace"), symbol(void(0), "module")), symbol(void(0), "*ns*"))), doc ? - [list(symbol(void(0), "set!"), list(symbol(void(0), ".-description"), symbol(void(0), "module")), doc)] : - void(0), requirements, uses); + var metadata = meta(analyzeNs(form)); + var id = "" + ((metadata || 0)["id"]); + var doc = (metadata || 0)["doc"]; + var requirements = (metadata || 0)["require"]; + var ns = doc ? + { + "id": id, + "doc": doc + } : + { + "id": id + }; + return concat([symbol(void(0), "do*"), list(symbol(void(0), "def"), symbol(void(0), "*ns*"), ns)], requirements ? + map(compileRequire(id), requirements) : + void(0)); })(); }; -exports.expandNs = expandNs; +exports.compileNs = compileNs; -installMacro(symbol(void(0), "ns"), expandNs); +installMacro(symbol(void(0), "ns"), compileNs); installMacro(symbol(void(0), "print"), function() { var more = Array.prototype.slice.call(arguments, 0); "Prints the object(s) to the output for human consumption."; return concat(list(symbol(void(0), ".log"), symbol(void(0), "console")), more); }) - },{"./reader":"yCUXAg","./ast":"nw8hg9","./sequence":"gdziIz","./runtime":"YbrU3i","./string":"BI22ma","./backend/javascript/writer":1}],"wisp/analyzer":[function(require,module,exports){ module.exports=require('KkLEpA'); },{}],"KkLEpA":[function(require,module,exports){ -var namespace = (require("./ast")).namespace; -var name = (require("./ast")).name; -var meta = (require("./ast")).meta; -var isKeyword = (require("./ast")).isKeyword; +var _ns_ = "wisp.analyzer"; +module.namespace = _ns_; +var symbol = (require("./ast")).symbol; var isSymbol = (require("./ast")).isSymbol; -var symbol = (require("./ast")).symbol;; - -var count = (require("./sequence")).count; -var rest = (require("./sequence")).rest; -var last = (require("./sequence")).last; -var first = (require("./sequence")).first; -var list = (require("./sequence")).list; -var list_ = (require("./sequence")).list_; -var isEmpty = (require("./sequence")).isEmpty; -var interleave = (require("./sequence")).interleave; -var isEvery = (require("./sequence")).isEvery; -var map = (require("./sequence")).map; -var conj = (require("./sequence")).conj; +var isKeyword = (require("./ast")).isKeyword; +var meta = (require("./ast")).meta; +var name = (require("./ast")).name; +var namespace = (require("./ast")).namespace; +var isSeq = (require("./sequence")).isSeq; var seq = (require("./sequence")).seq; -var isSeq = (require("./sequence")).isSeq;; - -var merge = (require("./runtime")).merge; -var isNil = (require("./runtime")).isNil; -var isEqual = (require("./runtime")).isEqual; -var vals = (require("./runtime")).vals; -var keys = (require("./runtime")).keys; -var isString = (require("./runtime")).isString; +var conj = (require("./sequence")).conj; +var map = (require("./sequence")).map; +var isEvery = (require("./sequence")).isEvery; +var interleave = (require("./sequence")).interleave; +var isEmpty = (require("./sequence")).isEmpty; +var list_ = (require("./sequence")).list_; +var list = (require("./sequence")).list; +var first = (require("./sequence")).first; +var last = (require("./sequence")).last; +var rest = (require("./sequence")).rest; +var count = (require("./sequence")).count; +var isVector = (require("./runtime")).isVector; var isDictionary = (require("./runtime")).isDictionary; -var isVector = (require("./runtime")).isVector;; - +var isString = (require("./runtime")).isString; +var keys = (require("./runtime")).keys; +var vals = (require("./runtime")).vals; +var isEqual = (require("./runtime")).isEqual; +var isNil = (require("./runtime")).isNil; +var merge = (require("./runtime")).merge; var split = (require("./string")).split;; var getIn = function getIn(dictionary, keys, notFound) { return (function loop(target, sentinel, keys) { var recur = loop; @@ -3700,16 +3730,18 @@ return void(0); }; exports.analyze = analyze },{"./ast":"nw8hg9","./sequence":"gdziIz","./runtime":"YbrU3i","./string":"BI22ma"}],2:[function(require,module,exports){ -(function(global){var _ns_ = "interactivate-wisp.main"; -module.namespace = _ns_; -var interactivate = require("interactivate"); -var hashare = require("codemirror-hashare"); -var persist = require("codemirror-persist"); -var startHost = (require("./host")).startHost;; +(function(global){var _ns_ = { + "id": "interactivate-wisp.main" +}; +var interactivate = require("interactivate");; +var hashare = require("codemirror-hashare");; +var persist = require("codemirror-persist");; +var interactivateWisp_host = require("./host"); +var startHost = interactivateWisp_host.startHost;;; interactivate(CodeMirror); hashare(CodeMirror); @@ -3734,11 +3766,11 @@ }); exports.editor = editor; global.editor = editor })(window) -},{"./host":3,"interactivate":4,"codemirror-hashare":5,"codemirror-persist":6}],7:[function(require,module,exports){ +},{"./host":3,"codemirror-hashare":4,"codemirror-persist":5,"interactivate":6}],7:[function(require,module,exports){ var events = require('events'); exports.isArray = isArray; exports.isDate = function(obj){return Object.prototype.toString.call(obj) === '[object Date]'}; exports.isRegExp = function(obj){return Object.prototype.toString.call(obj) === '[object RegExp]'}; @@ -4087,11 +4119,11 @@ } } return str; }; -},{"events":8}],5:[function(require,module,exports){ +},{"events":8}],4:[function(require,module,exports){ "use strict"; var save = "save@hashare" var load = "load@hashare" @@ -4120,50 +4152,30 @@ }) } module.exports = plugin -},{}],6:[function(require,module,exports){ -"use strict"; - -function onChange(editor) { - localStorage[window.location.href.split("#")[0]] = editor.getValue() -} - -function setup(editor, value) { - /** - Takes editor and enables persists changes to the buffer across the sessions. - **/ - if (value) { - var address = window.location.href.split("#")[0] - var persisted = localStorage[address] || editor.getValue() - editor.setValue(persisted) - editor.on("change", onChange) - } else { - editor.off("change", onChange) - } -} - -function plugin(CodeMirror) { - CodeMirror.defineOption("persist", false, setup) -} - -module.exports = plugin - },{}],3:[function(require,module,exports){ -var _ns_ = "interactivate-wisp.host"; -module.namespace = _ns_; -var render = require("interactivate/render"); -var read_ = (require("wisp/reader")).read_; -var compile_ = (require("wisp/compiler")).compile_; -var first = (require("wisp/sequence")).first; -var rest = (require("wisp/sequence")).rest; -var list = (require("wisp/sequence")).list; -var symbol = (require("wisp/ast")).symbol; -var prStr = (require("wisp/ast")).prStr; -var subs = (require("wisp/runtime")).subs; -var inspect = (require("util")).inspect;; +var _ns_ = { + "id": "interactivate-wisp.host" +}; +var render = require("interactivate/render");; +var wisp_reader = require("wisp/reader"); +var read_ = wisp_reader.read_;; +var wisp_compiler = require("wisp/compiler"); +var compile_ = wisp_compiler.compile_;; +var wisp_sequence = require("wisp/sequence"); +var first = wisp_sequence.first; +var rest = wisp_sequence.rest; +var list = wisp_sequence.list;; +var wisp_ast = require("wisp/ast"); +var symbol = wisp_ast.symbol; +var prStr = wisp_ast.prStr;; +var wisp_runtime = require("wisp/runtime"); +var subs = wisp_runtime.subs;; +var util = require("util"); +var inspect = util.inspect;;; var __out__ = function __out__() { return void(0); }; exports.__out__ = __out__; @@ -4251,11 +4263,256 @@ "error": error }; }})(); }; exports.evaluate = evaluate -},{"wisp/reader":"yCUXAg","wisp/compiler":"baogts","wisp/sequence":"gdziIz","wisp/ast":"nw8hg9","wisp/runtime":"YbrU3i","util":7,"interactivate/render":9}],10:[function(require,module,exports){ +},{"wisp/reader":"yCUXAg","wisp/compiler":"baogts","wisp/sequence":"gdziIz","wisp/ast":"nw8hg9","wisp/runtime":"YbrU3i","util":7,"interactivate/render":9}],5:[function(require,module,exports){ +"use strict"; + +function onChange(editor) { + localStorage[window.location.href.split("#")[0]] = editor.getValue() +} + +function setup(editor, value) { + /** + Takes editor and enables persists changes to the buffer across the sessions. + **/ + if (value) { + var address = window.location.href.split("#")[0] + var persisted = localStorage[address] || editor.getValue() + editor.setValue(persisted) + editor.on("change", onChange) + } else { + editor.off("change", onChange) + } +} + +function plugin(CodeMirror) { + CodeMirror.defineOption("persist", false, setup) +} + +module.exports = plugin + +},{}],1:[function(require,module,exports){ +var _ns_ = { + "id": "wisp.backend.javascript.writer", + "doc": "Compiler backend for for writing JS output" +}; +var wisp_ast = require("./../../ast"); +var name = wisp_ast.name; +var namespace = wisp_ast.namespace; +var symbol = wisp_ast.symbol; +var isSymbol = wisp_ast.isSymbol; +var isKeyword = wisp_ast.isKeyword;; +var wisp_sequence = require("./../../sequence"); +var list = wisp_sequence.list; +var first = wisp_sequence.first; +var rest = wisp_sequence.rest; +var isList = wisp_sequence.isList; +var vec = wisp_sequence.vec; +var map = wisp_sequence.map; +var count = wisp_sequence.count; +var last = wisp_sequence.last; +var reduce = wisp_sequence.reduce; +var isEmpty = wisp_sequence.isEmpty;; +var wisp_runtime = require("./../../runtime"); +var isTrue = wisp_runtime.isTrue; +var isNil = wisp_runtime.isNil; +var isString = wisp_runtime.isString; +var isNumber = wisp_runtime.isNumber; +var isVector = wisp_runtime.isVector; +var isDictionary = wisp_runtime.isDictionary; +var isBoolean = wisp_runtime.isBoolean; +var isRePattern = wisp_runtime.isRePattern; +var reFind = wisp_runtime.reFind; +var dec = wisp_runtime.dec; +var subs = wisp_runtime.subs;; +var wisp_string = require("./../../string"); +var replace = wisp_string.replace; +var join = wisp_string.join; +var split = wisp_string.split; +var upperCase = wisp_string.upperCase;;; + +var writeReference = function writeReference(form) { + "Translates references from clojure convention to JS:\n\n **macros** __macros__\n list->vector listToVector\n set! set\n foo_bar foo_bar\n number? isNumber\n create-server createServer"; + return (function() { + var id = name(form); + id = id === "*" ? + "multiply" : + id === "/" ? + "divide" : + id === "+" ? + "sum" : + id === "-" ? + "subtract" : + id === "=" ? + "equal?" : + id === "==" ? + "strict-equal?" : + id === "<=" ? + "not-greater-than" : + id === ">=" ? + "not-less-than" : + id === ">" ? + "greater-than" : + id === "<" ? + "less-than" : + "else" ? + id : + void(0); + id = join("_", split(id, "*")); + id = join("-to-", split(id, "->")); + id = join(split(id, "!")); + id = join("$", split(id, "%")); + id = join("-plus-", split(id, "+")); + id = join("-and-", split(id, "&")); + id = last(id) === "?" ? + "" + "is-" + (subs(id, 0, dec(count(id)))) : + id; + id = reduce(function(result, key) { + return "" + result + ((!(isEmpty(result))) && (!(isEmpty(key))) ? + "" + (upperCase((key || 0)[0])) + (subs(key, 1)) : + key); + }, "", split(id, "-")); + return id; + })(); +}; +exports.writeReference = writeReference; + +var writeKeywordReference = function writeKeywordReference(form) { + return "" + "\"" + (name(form)) + "\""; +}; +exports.writeKeywordReference = writeKeywordReference; + +var writeKeyword = function writeKeyword(form) { + return "" + "\"" + "꞉" + (name(form)) + "\""; +}; +exports.writeKeyword = writeKeyword; + +var writeSymbol = function writeSymbol(form) { + return write(list(symbol(void(0), "symbol"), namespace(form), name(form))); +}; +exports.writeSymbol = writeSymbol; + +var writeNil = function writeNil(form) { + return "void(0)"; +}; +exports.writeNil = writeNil; + +var writeNumber = function writeNumber(form) { + return form; +}; +exports.writeNumber = writeNumber; + +var writeBoolean = function writeBoolean(form) { + return isTrue(form) ? + "true" : + "false"; +}; +exports.writeBoolean = writeBoolean; + +var writeString = function writeString(form) { + form = replace(form, RegExp("\\\\", "g"), "\\\\"); + form = replace(form, RegExp("\n", "g"), "\\n"); + form = replace(form, RegExp("\r", "g"), "\\r"); + form = replace(form, RegExp("\t", "g"), "\\t"); + form = replace(form, RegExp("\"", "g"), "\\\""); + return "" + "\"" + form + "\""; +}; +exports.writeString = writeString; + +var writeTemplate = function writeTemplate() { + var form = Array.prototype.slice.call(arguments, 0); + return (function() { + var indentPattern = /\n *$/; + var lineBreakPatter = RegExp("\n", "g"); + var getIndentation = function(code) { + return (reFind(indentPattern, code)) || "\n"; + }; + return (function loop(code, parts, values) { + var recur = loop; + while (recur === loop) { + recur = count(parts) > 1 ? + (code = "" + code + (first(parts)) + (replace("" + "" + (first(values)), lineBreakPatter, getIndentation(first(parts)))), parts = rest(parts), values = rest(values), loop) : + "" + code + (first(parts)); + }; + return recur; + })("", split(first(form), "~{}"), rest(form)); + })(); +}; +exports.writeTemplate = writeTemplate; + +var writeGroup = function writeGroup() { + var forms = Array.prototype.slice.call(arguments, 0); + return join(", ", forms); +}; +exports.writeGroup = writeGroup; + +var writeInvoke = function writeInvoke(callee) { + var params = Array.prototype.slice.call(arguments, 1); + return writeTemplate("~{}(~{})", callee, writeGroup.apply(writeGroup, params)); +}; +exports.writeInvoke = writeInvoke; + +var writeError = function writeError(message) { + return function() { + return (function() { throw Error(message); })(); + }; +}; +exports.writeError = writeError; + +var writeVector = writeError("Vectors are not supported"); +exports.writeVector = writeVector; + +var writeDictionary = writeError("Dictionaries are not supported"); +exports.writeDictionary = writeDictionary; + +var writePattern = writeError("Regular expressions are not supported"); +exports.writePattern = writePattern; + +var compileComment = function compileComment(form) { + return compileTemplate(list("//~{}\n", first(form))); +}; +exports.compileComment = compileComment; + +var writeDef = function writeDef(form) { + var id = first(form); + var isExport = ((((meta(form)) || {}) || 0)["top"]) && (!((((meta(id)) || {}) || 0)["private"])); + var attribute = symbol(namespace(id), "" + "-" + (name(id))); + return isExport ? + compileTemplate(list("var ~{};\n~{}", compile(cons(symbol(void(0), "set!"), form)), compile(list(symbol(void(0), "set!"), list(symbol(void(0), "."), symbol(void(0), "exports"), attribute), id)))) : + compileTemplate(list("var ~{}", compile(cons(symbol(void(0), "set!"), form)))); +}; +exports.writeDef = writeDef; + +var write = function write(form) { + return isNil(form) ? + writeNil(form) : + isSymbol(form) ? + writeReference(form) : + isKeyword(form) ? + writeKeywordReference(form) : + isString(form) ? + writeString(form) : + isNumber(form) ? + writeNumber(form) : + isBoolean(form) ? + writeBoolean(form) : + isRePattern(form) ? + writePattern(form) : + isVector(form) ? + writeVector(form) : + isDictionary(form) ? + writeDictionary() : + isList(form) ? + writeInvoke.apply(writeInvoke, map(write, vec(form))) : + "else" ? + writeError("Unsupported form") : + void(0); +}; +exports.write = write +},{"./../../ast":"nw8hg9","./../../sequence":"gdziIz","./../../runtime":"YbrU3i","./../../string":"BI22ma"}],10:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; process.nextTick = (function () { @@ -4491,225 +4748,11 @@ } return this._events[type]; }; })(require("__browserify_process")) -},{"__browserify_process":10}],1:[function(require,module,exports){ -var _ns_ = "wisp.backend.javascript.writer"; -module.namespace = _ns_; -module.description = "Compiler backend for for writing JS output"; -var name = (require("./../../ast")).name; -var namespace = (require("./../../ast")).namespace; -var symbol = (require("./../../ast")).symbol; -var isSymbol = (require("./../../ast")).isSymbol; -var isKeyword = (require("./../../ast")).isKeyword; -var list = (require("./../../sequence")).list; -var first = (require("./../../sequence")).first; -var rest = (require("./../../sequence")).rest; -var isList = (require("./../../sequence")).isList; -var vec = (require("./../../sequence")).vec; -var map = (require("./../../sequence")).map; -var count = (require("./../../sequence")).count; -var last = (require("./../../sequence")).last; -var reduce = (require("./../../sequence")).reduce; -var isEmpty = (require("./../../sequence")).isEmpty; -var isTrue = (require("./../../runtime")).isTrue; -var isNil = (require("./../../runtime")).isNil; -var isString = (require("./../../runtime")).isString; -var isNumber = (require("./../../runtime")).isNumber; -var isVector = (require("./../../runtime")).isVector; -var isDictionary = (require("./../../runtime")).isDictionary; -var isBoolean = (require("./../../runtime")).isBoolean; -var isRePattern = (require("./../../runtime")).isRePattern; -var reFind = (require("./../../runtime")).reFind; -var dec = (require("./../../runtime")).dec; -var subs = (require("./../../runtime")).subs; -var replace = (require("./../../string")).replace; -var join = (require("./../../string")).join; -var split = (require("./../../string")).split; -var upperCase = (require("./../../string")).upperCase;; - -var writeReference = function writeReference(form) { - "Translates references from clojure convention to JS:\n\n **macros** __macros__\n list->vector listToVector\n set! set\n foo_bar foo_bar\n number? isNumber\n create-server createServer"; - return (function() { - var id = name(form); - id = id === "*" ? - "multiply" : - id === "/" ? - "divide" : - id === "+" ? - "sum" : - id === "-" ? - "subtract" : - id === "=" ? - "equal?" : - id === "==" ? - "strict-equal?" : - id === "<=" ? - "not-greater-than" : - id === ">=" ? - "not-less-than" : - id === ">" ? - "greater-than" : - id === "<" ? - "less-than" : - "else" ? - id : - void(0); - id = join("_", split(id, "*")); - id = join("-to-", split(id, "->")); - id = join(split(id, "!")); - id = join("$", split(id, "%")); - id = join("-plus-", split(id, "+")); - id = join("-and-", split(id, "&")); - id = last(id) === "?" ? - "" + "is-" + (subs(id, 0, dec(count(id)))) : - id; - id = reduce(function(result, key) { - return "" + result + ((!(isEmpty(result))) && (!(isEmpty(key))) ? - "" + (upperCase((key || 0)[0])) + (subs(key, 1)) : - key); - }, "", split(id, "-")); - return id; - })(); -}; -exports.writeReference = writeReference; - -var writeKeywordReference = function writeKeywordReference(form) { - return "" + "\"" + (name(form)) + "\""; -}; -exports.writeKeywordReference = writeKeywordReference; - -var writeKeyword = function writeKeyword(form) { - return "" + "\"" + "꞉" + (name(form)) + "\""; -}; -exports.writeKeyword = writeKeyword; - -var writeSymbol = function writeSymbol(form) { - return write(list(symbol(void(0), "symbol"), namespace(form), name(form))); -}; -exports.writeSymbol = writeSymbol; - -var writeNil = function writeNil(form) { - return "void(0)"; -}; -exports.writeNil = writeNil; - -var writeNumber = function writeNumber(form) { - return form; -}; -exports.writeNumber = writeNumber; - -var writeBoolean = function writeBoolean(form) { - return isTrue(form) ? - "true" : - "false"; -}; -exports.writeBoolean = writeBoolean; - -var writeString = function writeString(form) { - form = replace(form, RegExp("\\\\", "g"), "\\\\"); - form = replace(form, RegExp("\n", "g"), "\\n"); - form = replace(form, RegExp("\r", "g"), "\\r"); - form = replace(form, RegExp("\t", "g"), "\\t"); - form = replace(form, RegExp("\"", "g"), "\\\""); - return "" + "\"" + form + "\""; -}; -exports.writeString = writeString; - -var writeTemplate = function writeTemplate() { - var form = Array.prototype.slice.call(arguments, 0); - return (function() { - var indentPattern = /\n *$/; - var lineBreakPatter = RegExp("\n", "g"); - var getIndentation = function(code) { - return (reFind(indentPattern, code)) || "\n"; - }; - return (function loop(code, parts, values) { - var recur = loop; - while (recur === loop) { - recur = count(parts) > 1 ? - (code = "" + code + (first(parts)) + (replace("" + "" + (first(values)), lineBreakPatter, getIndentation(first(parts)))), parts = rest(parts), values = rest(values), loop) : - "" + code + (first(parts)); - }; - return recur; - })("", split(first(form), "~{}"), rest(form)); - })(); -}; -exports.writeTemplate = writeTemplate; - -var writeGroup = function writeGroup() { - var forms = Array.prototype.slice.call(arguments, 0); - return join(", ", forms); -}; -exports.writeGroup = writeGroup; - -var writeInvoke = function writeInvoke(callee) { - var params = Array.prototype.slice.call(arguments, 1); - return writeTemplate("~{}(~{})", callee, writeGroup.apply(writeGroup, params)); -}; -exports.writeInvoke = writeInvoke; - -var writeError = function writeError(message) { - return function() { - return (function() { throw Error(message); })(); - }; -}; -exports.writeError = writeError; - -var writeVector = writeError("Vectors are not supported"); -exports.writeVector = writeVector; - -var writeDictionary = writeError("Dictionaries are not supported"); -exports.writeDictionary = writeDictionary; - -var writePattern = writeError("Regular expressions are not supported"); -exports.writePattern = writePattern; - -var compileComment = function compileComment(form) { - return compileTemplate(list("//~{}\n", first(form))); -}; -exports.compileComment = compileComment; - -var writeDef = function writeDef(form) { - var id = first(form); - var isExport = ((((meta(form)) || {}) || 0)["top"]) && (!((((meta(id)) || {}) || 0)["private"])); - var attribute = symbol(namespace(id), "" + "-" + (name(id))); - return isExport ? - compileTemplate(list("var ~{};\n~{}", compile(cons(symbol(void(0), "set!"), form)), compile(list(symbol(void(0), "set!"), list(symbol(void(0), "."), symbol(void(0), "exports"), attribute), id)))) : - compileTemplate(list("var ~{}", compile(cons(symbol(void(0), "set!"), form)))); -}; -exports.writeDef = writeDef; - -var write = function write(form) { - return isNil(form) ? - writeNil(form) : - isSymbol(form) ? - writeReference(form) : - isKeyword(form) ? - writeKeywordReference(form) : - isString(form) ? - writeString(form) : - isNumber(form) ? - writeNumber(form) : - isBoolean(form) ? - writeBoolean(form) : - isRePattern(form) ? - writePattern(form) : - isVector(form) ? - writeVector(form) : - isDictionary(form) ? - writeDictionary() : - isList(form) ? - writeInvoke.apply(writeInvoke, map(write, vec(form))) : - "else" ? - writeError("Unsupported form") : - void(0); -}; -exports.write = write - -},{"./../../ast":"nw8hg9","./../../sequence":"gdziIz","./../../runtime":"YbrU3i","./../../string":"BI22ma"}],4:[function(require,module,exports){ +},{"__browserify_process":10}],6:[function(require,module,exports){ "use strict"; var diff = require("diffpatcher/diff") var patch = require("diffpatcher/patch") var output = require("./output") @@ -4894,11 +4937,11 @@ CodeMirror.defineOption("interactivate", false, tooglePlugin) } module.exports = install -},{"diffpatcher/diff":11,"diffpatcher/patch":12,"./output":13}],13:[function(require,module,exports){ +},{"diffpatcher/diff":11,"./output":12,"diffpatcher/patch":13}],12:[function(require,module,exports){ var makeView = require("./view").makeView var render = require("./render") function Output(id) { this.id = id @@ -4955,71 +4998,11 @@ if (state.line) move(output, editor, state.line) } exports.makeOutput = makeOutput exports.write = write -},{"./view":14,"./render":9}],9:[function(require,module,exports){ -"use strict"; - -var method = require("method") -var util = require("util") - - -// Render function takes arbitrary data structure and returns something -// that can visually represent it. -var render = method("render@interactivate") - -render.define(function(value) { - return util.inspect(value) -}) - -render.define(Error, function(error) { - return String(error) -}) - -render.define(Element, function(element) { - return element -}) - -module.exports = render - -},{"util":7,"method":15}],16:[function(require,module,exports){ -"use strict"; - -function rebase(result, parent, delta) { - Object.keys(parent).forEach(function(key) { - // If `parent[key]` is `null` it means attribute was deleted in previous - // update. We skip such properties as there is no use in keeping them - // around. If `delta[key]` is `null` we skip these properties too as - // the have being deleted. - if (!(parent[key] == null || (key in delta && delta[key] == null))) - result[key] = parent[key] - }, result) - Object.keys(delta).forEach(function(key) { - if (key in parent) { - var current = delta[key] - var previous = parent[key] - if (current === previous) current = current - // If `delta[key]` is `null` it's delete so we just skip property. - else if (current == null) current = current - // If value is of primitive type (function or regexps should not - // even be here) we just update in place. - else if (typeof(current) !== "object") result[key] = current - // If previous value associated with this key was primitive - // and it's mapped to non primitive - else if (typeof(previous) !== "object") result[key] = current - else result[key] = rebase({}, previous, current) - } else { - result[key] = delta[key] - } - }) - return result -} - -module.exports = rebase - -},{}],14:[function(require,module,exports){ +},{"./render":9,"./view":14}],14:[function(require,module,exports){ var TEAR_IMAGE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAMCAYAAABBV8wuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGpJREFUeNpi/P//PwM2wMSAA7CACEYggLKZgfgvEP8BCYAwKxALAjEPEH8B4g9MUI5IWlqayevXr9eCaCBfGGSSVnJysu/Xr1+fAx3y/9u3by9BfIb29vZCmCAMgCQZ/+NwL07nUlECIMAAMr41sxvv6oEAAAAASUVORK5CYII=" var OUTPUT_STYLE = [ "margin-left: -10px", "padding: 0", @@ -5095,13 +5078,143 @@ view.body = view.querySelector(".cm-live-output-body") return view } exports.makeView = makeView -},{}],15:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ "use strict"; +var method = require("method") +var util = require("util") + + +// Render function takes arbitrary data structure and returns something +// that can visually represent it. +var render = method("render@interactivate") + +render.define(function(value) { + return util.inspect(value) +}) + +render.define(Error, function(error) { + return String(error) +}) + +render.define(Element, function(element) { + return element +}) + +module.exports = render + +},{"util":7,"method":15}],16:[function(require,module,exports){ +"use strict"; + +function rebase(result, parent, delta) { + Object.keys(parent).forEach(function(key) { + // If `parent[key]` is `null` it means attribute was deleted in previous + // update. We skip such properties as there is no use in keeping them + // around. If `delta[key]` is `null` we skip these properties too as + // the have being deleted. + if (!(parent[key] == null || (key in delta && delta[key] == null))) + result[key] = parent[key] + }, result) + Object.keys(delta).forEach(function(key) { + if (key in parent) { + var current = delta[key] + var previous = parent[key] + if (current === previous) current = current + // If `delta[key]` is `null` it's delete so we just skip property. + else if (current == null) current = current + // If value is of primitive type (function or regexps should not + // even be here) we just update in place. + else if (typeof(current) !== "object") result[key] = current + // If previous value associated with this key was primitive + // and it's mapped to non primitive + else if (typeof(previous) !== "object") result[key] = current + else result[key] = rebase({}, previous, current) + } else { + result[key] = delta[key] + } + }) + return result +} + +module.exports = rebase + +},{}],11:[function(require,module,exports){ +"use strict"; + +var method = require("method") + +// Method is designed to work with data structures representing application +// state. Calling it with a state should return object representing `delta` +// that has being applied to a previous state to get to a current state. +// +// Example +// +// diff(state) // => { "item-id-1": { title: "some title" } "item-id-2": null } +var diff = method("diff") + +// diff between `null` / `undefined` to any hash is a hash itself. +diff.define(null, function(from, to) { return to }) +diff.define(undefined, function(from, to) { return to }) +diff.define(Object, function(from, to) { + return calculate(from, to || {}) || {} +}) + +function calculate(from, to) { + var diff = {} + var changes = 0 + Object.keys(from).forEach(function(key) { + changes = changes + 1 + if (!(key in to) && from[key] != null) diff[key] = null + else changes = changes - 1 + }) + Object.keys(to).forEach(function(key) { + changes = changes + 1 + var previous = from[key] + var current = to[key] + if (previous === current) return (changes = changes - 1) + if (typeof(current) !== "object") return diff[key] = current + if (typeof(previous) !== "object") return diff[key] = current + var delta = calculate(previous, current) + if (delta) diff[key] = delta + else changes = changes - 1 + }) + return changes ? diff : null +} + +diff.calculate = calculate + +module.exports = diff + +},{"method":15}],13:[function(require,module,exports){ +"use strict"; + +var method = require("method") +var rebase = require("./rebase") + +// Method is designed to work with data structures representing application +// state. Calling it with a state and delta should return object representing +// new state, with changes in `delta` being applied to previous. +// +// ## Example +// +// patch(state, { +// "item-id-1": { completed: false }, // update +// "item-id-2": null // delete +// }) +var patch = method("patch") +patch.define(Object, function patch(hash, delta) { + return rebase({}, hash, delta) +}) + +module.exports = patch + +},{"./rebase":16,"method":15}],15:[function(require,module,exports){ +"use strict"; + var defineProperty = Object.defineProperty || function(object, name, property) { object[name] = property.value return object } @@ -5324,78 +5437,8 @@ Method.builtin = builtin Method.host = host module.exports = Method -},{}],11:[function(require,module,exports){ -"use strict"; - -var method = require("method") - -// Method is designed to work with data structures representing application -// state. Calling it with a state should return object representing `delta` -// that has being applied to a previous state to get to a current state. -// -// Example -// -// diff(state) // => { "item-id-1": { title: "some title" } "item-id-2": null } -var diff = method("diff") - -// diff between `null` / `undefined` to any hash is a hash itself. -diff.define(null, function(from, to) { return to }) -diff.define(undefined, function(from, to) { return to }) -diff.define(Object, function(from, to) { - return calculate(from, to || {}) || {} -}) - -function calculate(from, to) { - var diff = {} - var changes = 0 - Object.keys(from).forEach(function(key) { - changes = changes + 1 - if (!(key in to) && from[key] != null) diff[key] = null - else changes = changes - 1 - }) - Object.keys(to).forEach(function(key) { - changes = changes + 1 - var previous = from[key] - var current = to[key] - if (previous === current) return (changes = changes - 1) - if (typeof(current) !== "object") return diff[key] = current - if (typeof(previous) !== "object") return diff[key] = current - var delta = calculate(previous, current) - if (delta) diff[key] = delta - else changes = changes - 1 - }) - return changes ? diff : null -} - -diff.calculate = calculate - -module.exports = diff - -},{"method":15}],12:[function(require,module,exports){ -"use strict"; - -var method = require("method") -var rebase = require("./rebase") - -// Method is designed to work with data structures representing application -// state. Calling it with a state and delta should return object representing -// new state, with changes in `delta` being applied to previous. -// -// ## Example -// -// patch(state, { -// "item-id-1": { completed: false }, // update -// "item-id-2": null // delete -// }) -var patch = method("patch") -patch.define(Object, function patch(hash, delta) { - return rebase({}, hash, delta) -}) - -module.exports = patch - -},{"./rebase":16,"method":15}]},{},[2]) -//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9ydW50aW1lLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL3dpc3Avc2VxdWVuY2UuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9zdHJpbmcuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9yZWFkZXIuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9hc3QuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9jb21waWxlci5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy93aXNwL2FuYWx5emVyLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbWFpbi5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXJlc29sdmUvYnVpbHRpbi91dGlsLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3ItaGFzaGFyZS9jb3JlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3ItcGVyc2lzdC9jb3JlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvaG9zdC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9pbnNlcnQtbW9kdWxlLWdsb2JhbHMvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXJlc29sdmUvYnVpbHRpbi9ldmVudHMuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9iYWNrZW5kL2phdmFzY3JpcHQvd3JpdGVyLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2ludGVyYWN0aXZhdGUvaW50ZXJhY3RpdmF0ZS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9pbnRlcmFjdGl2YXRlL291dHB1dC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9pbnRlcmFjdGl2YXRlL3JlbmRlci5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9kaWZmcGF0Y2hlci9yZWJhc2UuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvaW50ZXJhY3RpdmF0ZS92aWV3LmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL21ldGhvZC9jb3JlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2RpZmZwYXRjaGVyL2RpZmYuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvZGlmZnBhdGNoZXIvcGF0Y2guanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdG1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaHhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbGdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7dmFyIF9uc18gPSBcIndpc3AucnVudGltZVwiO1xubW9kdWxlLm5hbWVzcGFjZSA9IF9uc187XG5tb2R1bGUuZGVzY3JpcHRpb24gPSBcIkNvcmUgcHJpbWl0aXZlcyByZXF1aXJlZCBmb3IgcnVudGltZVwiOztcblxudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG5leHBvcnRzLmlkZW50aXR5ID0gaWRlbnRpdHk7XG5cbnZhciBpc09kZCA9IGZ1bmN0aW9uIGlzT2RkKG4pIHtcbiAgcmV0dXJuIG4gJSAyID09PSAxO1xufTtcbmV4cG9ydHMuaXNPZGQgPSBpc09kZDtcblxudmFyIGlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gIHJldHVybiBuICUgMiA9PT0gMDtcbn07XG5leHBvcnRzLmlzRXZlbiA9IGlzRXZlbjtcblxudmFyIGlzRGljdGlvbmFyeSA9IGZ1bmN0aW9uIGlzRGljdGlvbmFyeShmb3JtKSB7XG4gIHJldHVybiAoaXNPYmplY3QoZm9ybSkpICYmIChpc09iamVjdChPYmplY3QuZ2V0UHJvdG90eXBlT2YoZm9ybSkpKSAmJiAoaXNOaWwoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihmb3JtKSkpKTtcbn07XG5leHBvcnRzLmlzRGljdGlvbmFyeSA9IGlzRGljdGlvbmFyeTtcblxudmFyIGRpY3Rpb25hcnkgPSBmdW5jdGlvbiBkaWN0aW9uYXJ5KCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3Aoa2V5VmFsdWVzLCByZXN1bHQpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBrZXlWYWx1ZXMubGVuZ3RoID9cbiAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgKHJlc3VsdCB8fCAwKVsoa2V5VmFsdWVzIHx8IDApWzBdXSA9IChrZXlWYWx1ZXMgfHwgMClbMV07XG4gICAgICAgIHJldHVybiAoa2V5VmFsdWVzID0ga2V5VmFsdWVzLnNsaWNlKDIpLCByZXN1bHQgPSByZXN1bHQsIGxvb3ApO1xuICAgICAgfSkoKSA6XG4gICAgICByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksIHt9KTtcbn07XG5leHBvcnRzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5O1xuXG52YXIga2V5cyA9IGZ1bmN0aW9uIGtleXMoZGljdGlvbmFyeSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZGljdGlvbmFyeSk7XG59O1xuZXhwb3J0cy5rZXlzID0ga2V5cztcblxudmFyIHZhbHMgPSBmdW5jdGlvbiB2YWxzKGRpY3Rpb25hcnkpIHtcbiAgcmV0dXJuIGtleXMoZGljdGlvbmFyeSkubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiAoZGljdGlvbmFyeSB8fCAwKVtrZXldO1xuICB9KTtcbn07XG5leHBvcnRzLnZhbHMgPSB2YWxzO1xuXG52YXIga2V5VmFsdWVzID0gZnVuY3Rpb24ga2V5VmFsdWVzKGRpY3Rpb25hcnkpIHtcbiAgcmV0dXJuIGtleXMoZGljdGlvbmFyeSkubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBba2V5LCAoZGljdGlvbmFyeSB8fCAwKVtrZXldXTtcbiAgfSk7XG59O1xuZXhwb3J0cy5rZXlWYWx1ZXMgPSBrZXlWYWx1ZXM7XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKCkge1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QucHJvdG90eXBlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLnJlZHVjZShmdW5jdGlvbihkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KSB7XG4gICAgaXNPYmplY3QoZGljdGlvbmFyeSkgP1xuICAgICAgT2JqZWN0LmtleXMoZGljdGlvbmFyeSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIChkZXNjcmlwdG9yIHx8IDApW2tleV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRpY3Rpb25hcnksIGtleSk7XG4gICAgICB9KSA6XG4gICAgICB2b2lkKDApO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9LCBPYmplY3QuY3JlYXRlKE9iamVjdC5wcm90b3R5cGUpKSk7XG59O1xuZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xuXG52YXIgaXNDb250YWluc1ZlY3RvciA9IGZ1bmN0aW9uIGlzQ29udGFpbnNWZWN0b3IodmVjdG9yLCBlbGVtZW50KSB7XG4gIHJldHVybiB2ZWN0b3IuaW5kZXhPZihlbGVtZW50KSA+PSAwO1xufTtcbmV4cG9ydHMuaXNDb250YWluc1ZlY3RvciA9IGlzQ29udGFpbnNWZWN0b3I7XG5cbnZhciBtYXBEaWN0aW9uYXJ5ID0gZnVuY3Rpb24gbWFwRGljdGlvbmFyeShzb3VyY2UsIGYpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgKHRhcmdldCB8fCAwKVtrZXldID0gZigoc291cmNlIHx8IDApW2tleV0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH0sIHt9KTtcbn07XG5leHBvcnRzLm1hcERpY3Rpb25hcnkgPSBtYXBEaWN0aW9uYXJ5O1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuZXhwb3J0cy50b1N0cmluZyA9IHRvU3RyaW5nO1xuXG52YXIgaXNGbiA9IHR5cGVvZigvLi8pID09PSBcImZ1bmN0aW9uXCIgP1xuICBmdW5jdGlvbiBpc0ZuKHgpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiO1xuICB9IDpcbiAgZnVuY3Rpb24gaXNGbih4KSB7XG4gICAgcmV0dXJuIHR5cGVvZih4KSA9PT0gXCJmdW5jdGlvblwiO1xuICB9O1xuZXhwb3J0cy5pc0ZuID0gaXNGbjtcblxudmFyIGlzU3RyaW5nID0gZnVuY3Rpb24gaXNTdHJpbmcoeCkge1xuICByZXR1cm4gKHR5cGVvZih4KSA9PT0gXCJzdHJpbmdcIikgfHwgKHRvU3RyaW5nLmNhbGwoeCkgPT09IFwiW29iamVjdCBTdHJpbmddXCIpO1xufTtcbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxudmFyIGlzTnVtYmVyID0gZnVuY3Rpb24gaXNOdW1iZXIoeCkge1xuICByZXR1cm4gKHR5cGVvZih4KSA9PT0gXCJudW1iZXJcIikgfHwgKHRvU3RyaW5nLmNhbGwoeCkgPT09IFwiW29iamVjdCBOdW1iZXJdXCIpO1xufTtcbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxudmFyIGlzVmVjdG9yID0gaXNGbihBcnJheS5pc0FycmF5KSA/XG4gIEFycmF5LmlzQXJyYXkgOlxuICBmdW5jdGlvbiBpc1ZlY3Rvcih4KSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgfTtcbmV4cG9ydHMuaXNWZWN0b3IgPSBpc1ZlY3RvcjtcblxudmFyIGlzRGF0ZSA9IGZ1bmN0aW9uIGlzRGF0ZSh4KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHgpID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn07XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxudmFyIGlzQm9vbGVhbiA9IGZ1bmN0aW9uIGlzQm9vbGVhbih4KSB7XG4gIHJldHVybiAoeCA9PT0gdHJ1ZSkgfHwgKHggPT09IGZhbHNlKSB8fCAodG9TdHJpbmcuY2FsbCh4KSA9PT0gXCJbb2JqZWN0IEJvb2xlYW5dXCIpO1xufTtcbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG52YXIgaXNSZVBhdHRlcm4gPSBmdW5jdGlvbiBpc1JlUGF0dGVybih4KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHgpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufTtcbmV4cG9ydHMuaXNSZVBhdHRlcm4gPSBpc1JlUGF0dGVybjtcblxudmFyIGlzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICByZXR1cm4geCAmJiAodHlwZW9mKHgpID09PSBcIm9iamVjdFwiKTtcbn07XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbnZhciBpc05pbCA9IGZ1bmN0aW9uIGlzTmlsKHgpIHtcbiAgcmV0dXJuICh4ID09PSB2b2lkKDApKSB8fCAoeCA9PT0gbnVsbCk7XG59O1xuZXhwb3J0cy5pc05pbCA9IGlzTmlsO1xuXG52YXIgaXNUcnVlID0gZnVuY3Rpb24gaXNUcnVlKHgpIHtcbiAgcmV0dXJuIHggPT09IHRydWU7XG59O1xuZXhwb3J0cy5pc1RydWUgPSBpc1RydWU7XG5cbnZhciBpc0ZhbHNlID0gZnVuY3Rpb24gaXNGYWxzZSh4KSB7XG4gIHJldHVybiB4ID09PSB0cnVlO1xufTtcbmV4cG9ydHMuaXNGYWxzZSA9IGlzRmFsc2U7XG5cbnZhciByZUZpbmQgPSBmdW5jdGlvbiByZUZpbmQocmUsIHMpIHtcbiAgdmFyIG1hdGNoZXMgPSByZS5leGVjKHMpO1xuICByZXR1cm4gIShpc05pbChtYXRjaGVzKSkgP1xuICAgIG1hdGNoZXMubGVuZ3RoID09PSAxID9cbiAgICAgIChtYXRjaGVzIHx8IDApWzBdIDpcbiAgICAgIG1hdGNoZXMgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5yZUZpbmQgPSByZUZpbmQ7XG5cbnZhciByZU1hdGNoZXMgPSBmdW5jdGlvbiByZU1hdGNoZXMocGF0dGVybiwgc291cmNlKSB7XG4gIHZhciBtYXRjaGVzID0gcGF0dGVybi5leGVjKHNvdXJjZSk7XG4gIHJldHVybiAoIShpc05pbChtYXRjaGVzKSkpICYmICgobWF0Y2hlcyB8fCAwKVswXSA9PT0gc291cmNlKSA/XG4gICAgbWF0Y2hlcy5sZW5ndGggPT09IDEgP1xuICAgICAgKG1hdGNoZXMgfHwgMClbMF0gOlxuICAgICAgbWF0Y2hlcyA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnJlTWF0Y2hlcyA9IHJlTWF0Y2hlcztcblxudmFyIHJlUGF0dGVybiA9IGZ1bmN0aW9uIHJlUGF0dGVybihzKSB7XG4gIHZhciBtYXRjaCA9IHJlRmluZCgvXig/OlxcKFxcPyhbaWRtc3V4XSopXFwpKT8oLiopLywgcyk7XG4gIHJldHVybiBuZXcgUmVnRXhwKChtYXRjaCB8fCAwKVsyXSwgKG1hdGNoIHx8IDApWzFdKTtcbn07XG5leHBvcnRzLnJlUGF0dGVybiA9IHJlUGF0dGVybjtcblxudmFyIGluYyA9IGZ1bmN0aW9uIGluYyh4KSB7XG4gIHJldHVybiB4ICsgMTtcbn07XG5leHBvcnRzLmluYyA9IGluYztcblxudmFyIGRlYyA9IGZ1bmN0aW9uIGRlYyh4KSB7XG4gIHJldHVybiB4IC0gMTtcbn07XG5leHBvcnRzLmRlYyA9IGRlYztcblxudmFyIHN0ciA9IGZ1bmN0aW9uIHN0cigpIHtcbiAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFwiXCIsIGFyZ3VtZW50cyk7XG59O1xuZXhwb3J0cy5zdHIgPSBzdHI7XG5cbnZhciBjaGFyID0gZnVuY3Rpb24gY2hhcihjb2RlKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xufTtcbmV4cG9ydHMuY2hhciA9IGNoYXI7XG5cbnZhciBpbnQgPSBmdW5jdGlvbiBpbnQoeCkge1xuICByZXR1cm4gaXNOdW1iZXIoeCkgP1xuICAgIHggPj0gMCA/XG4gICAgICBNYXRoLmZsb29yKHgpIDpcbiAgICAgIE1hdGguZmxvb3IoeCkgOlxuICAgIHguY2hhckNvZGVBdCgwKTtcbn07XG5leHBvcnRzLmludCA9IGludDtcblxudmFyIHN1YnMgPSBmdW5jdGlvbiBzdWJzKHN0cmluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbn07XG5leHBvcnRzLnN1YnMgPSBzdWJzO1xuXG52YXIgaXNQYXR0ZXJuRXF1YWwgPSBmdW5jdGlvbiBpc1BhdHRlcm5FcXVhbCh4LCB5KSB7XG4gIHJldHVybiAoaXNSZVBhdHRlcm4oeCkpICYmIChpc1JlUGF0dGVybih5KSkgJiYgKHguc291cmNlID09PSB5LnNvdXJjZSkgJiYgKHguZ2xvYmFsID09PSB5Lmdsb2JhbCkgJiYgKHgubXVsdGlsaW5lID09PSB5Lm11bHRpbGluZSkgJiYgKHguaWdub3JlQ2FzZSA9PT0geS5pZ25vcmVDYXNlKTtcbn07XG5cbnZhciBpc0RhdGVFcXVhbCA9IGZ1bmN0aW9uIGlzRGF0ZUVxdWFsKHgsIHkpIHtcbiAgcmV0dXJuIChpc0RhdGUoeCkpICYmIChpc0RhdGUoeSkpICYmIChOdW1iZXIoeCkgPT09IE51bWJlcih5KSk7XG59O1xuXG52YXIgaXNEaWN0aW9uYXJ5RXF1YWwgPSBmdW5jdGlvbiBpc0RpY3Rpb25hcnlFcXVhbCh4LCB5KSB7XG4gIHJldHVybiAoaXNPYmplY3QoeCkpICYmIChpc09iamVjdCh5KSkgJiYgKChmdW5jdGlvbigpIHtcbiAgICB2YXIgeEtleXMgPSBrZXlzKHgpO1xuICAgIHZhciB5S2V5cyA9IGtleXMoeSk7XG4gICAgdmFyIHhDb3VudCA9IHhLZXlzLmxlbmd0aDtcbiAgICB2YXIgeUNvdW50ID0geUtleXMubGVuZ3RoO1xuICAgIHJldHVybiAoeENvdW50ID09PSB5Q291bnQpICYmICgoZnVuY3Rpb24gbG9vcChpbmRleCwgY291bnQsIGtleXMpIHtcbiAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgcmVjdXIgPSBpbmRleCA8IGNvdW50ID9cbiAgICAgICAgaXNFcXVpdmFsZW50KCh4IHx8IDApWyhrZXlzIHx8IDApW2luZGV4XV0sICh5IHx8IDApWyhrZXlzIHx8IDApW2luZGV4XV0pID9cbiAgICAgICAgICAoaW5kZXggPSBpbmMoaW5kZXgpLCBjb3VudCA9IGNvdW50LCBrZXlzID0ga2V5cywgbG9vcCkgOlxuICAgICAgICAgIGZhbHNlIDpcbiAgICAgICAgdHJ1ZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVjdXI7XG4gICAgfSkoMCwgeENvdW50LCB4S2V5cykpO1xuICB9KSgpKTtcbn07XG5cbnZhciBpc1ZlY3RvckVxdWFsID0gZnVuY3Rpb24gaXNWZWN0b3JFcXVhbCh4LCB5KSB7XG4gIHJldHVybiAoaXNWZWN0b3IoeCkpICYmIChpc1ZlY3Rvcih5KSkgJiYgKHgubGVuZ3RoID09PSB5Lmxlbmd0aCkgJiYgKChmdW5jdGlvbiBsb29wKHhzLCB5cywgaW5kZXgsIGNvdW50KSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaW5kZXggPCBjb3VudCA/XG4gICAgICBpc0VxdWl2YWxlbnQoKHhzIHx8IDApW2luZGV4XSwgKHlzIHx8IDApW2luZGV4XSkgP1xuICAgICAgICAoeHMgPSB4cywgeXMgPSB5cywgaW5kZXggPSBpbmMoaW5kZXgpLCBjb3VudCA9IGNvdW50LCBsb29wKSA6XG4gICAgICAgIGZhbHNlIDpcbiAgICAgIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKHgsIHksIDAsIHgubGVuZ3RoKSk7XG59O1xuXG52YXIgaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gaXNFcXVpdmFsZW50KHgsIHkpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICh4ID09PSB5KSB8fCAoaXNOaWwoeCkgP1xuICAgICAgICBpc05pbCh5KSA6XG4gICAgICBpc05pbCh5KSA/XG4gICAgICAgIGlzTmlsKHgpIDpcbiAgICAgIGlzU3RyaW5nKHgpID9cbiAgICAgICAgZmFsc2UgOlxuICAgICAgaXNOdW1iZXIoeCkgP1xuICAgICAgICBmYWxzZSA6XG4gICAgICBpc0ZuKHgpID9cbiAgICAgICAgZmFsc2UgOlxuICAgICAgaXNCb29sZWFuKHgpID9cbiAgICAgICAgZmFsc2UgOlxuICAgICAgaXNEYXRlKHgpID9cbiAgICAgICAgaXNEYXRlRXF1YWwoeCwgeSkgOlxuICAgICAgaXNWZWN0b3IoeCkgP1xuICAgICAgICBpc1ZlY3RvckVxdWFsKHgsIHksIFtdLCBbXSkgOlxuICAgICAgaXNSZVBhdHRlcm4oeCkgP1xuICAgICAgICBpc1BhdHRlcm5FcXVhbCh4LCB5KSA6XG4gICAgICBcImVsc2VcIiA/XG4gICAgICAgIGlzRGljdGlvbmFyeUVxdWFsKHgsIHkpIDpcbiAgICAgICAgdm9pZCgwKSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIG1vcmUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgICAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHByZXZpb3VzLCBjdXJyZW50LCBpbmRleCwgY291bnQpIHtcbiAgICAgICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICAgICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICAgICAgcmVjdXIgPSAoaXNFcXVpdmFsZW50KHByZXZpb3VzLCBjdXJyZW50KSkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcblxudmFyIGlzRXF1YWwgPSBpc0VxdWl2YWxlbnQ7XG5leHBvcnRzLmlzRXF1YWwgPSBpc0VxdWFsO1xuXG52YXIgaXNTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGlzU3RyaWN0RXF1YWwoeCwgeSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCA9PT0geTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocHJldmlvdXMsIGN1cnJlbnQsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IChwcmV2aW91cyA9PT0gY3VycmVudCkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMuaXNTdHJpY3RFcXVhbCA9IGlzU3RyaWN0RXF1YWw7XG5cbnZhciBncmVhdGVyVGhhbiA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKHgsIHkpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggPiB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzID4gY3VycmVudCkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMuZ3JlYXRlclRoYW4gPSBncmVhdGVyVGhhbjtcblxudmFyIG5vdExlc3NUaGFuID0gZnVuY3Rpb24gbm90TGVzc1RoYW4oeCwgeSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCA+PSB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzID49IGN1cnJlbnQpICYmIChpbmRleCA8IGNvdW50ID9cbiAgICAgICAgICAocHJldmlvdXMgPSBjdXJyZW50LCBjdXJyZW50ID0gKG1vcmUgfHwgMClbaW5kZXhdLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoeCwgeSwgMCwgbW9yZS5sZW5ndGgpO1xuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLm5vdExlc3NUaGFuID0gbm90TGVzc1RoYW47XG5cbnZhciBsZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKHgsIHkpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggPCB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzIDwgY3VycmVudCkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMubGVzc1RoYW4gPSBsZXNzVGhhbjtcblxudmFyIG5vdEdyZWF0ZXJUaGFuID0gZnVuY3Rpb24gbm90R3JlYXRlclRoYW4oeCwgeSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCA8PSB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzIDw9IGN1cnJlbnQpICYmIChpbmRleCA8IGNvdW50ID9cbiAgICAgICAgICAocHJldmlvdXMgPSBjdXJyZW50LCBjdXJyZW50ID0gKG1vcmUgfHwgMClbaW5kZXhdLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoeCwgeSwgMCwgbW9yZS5sZW5ndGgpO1xuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLm5vdEdyZWF0ZXJUaGFuID0gbm90R3JlYXRlclRoYW47XG5cbnZhciBzdW0gPSBmdW5jdGlvbiBzdW0oYSwgYiwgYywgZCwgZSwgZikge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gMDtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSArIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSArIGIgKyBjICsgZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlICsgZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlICsgKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhICsgYiArIGMgKyBkICsgZSArIGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5zdW0gPSBzdW07XG5cbnZhciBzdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIChmdW5jdGlvbigpIHsgdGhyb3cgVHlwZUVycm9yKFwiV3JvbmcgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvOiAtXCIpOyB9KSgpO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAwIC0gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgLSBiIC0gYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSAtIGIgLSBjIC0gZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSAtIGIgLSBjIC0gZCAtIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgLSBiIC0gYyAtIGQgLSBlIC0gZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlIC0gKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhIC0gYiAtIGMgLSBkIC0gZSAtIGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuXG52YXIgZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIChmdW5jdGlvbigpIHsgdGhyb3cgVHlwZUVycm9yKFwiV3JvbmcgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvOiAvXCIpOyB9KSgpO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAxIC8gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSAvIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgLyBiIC8gYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSAvIGIgLyBjIC8gZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSAvIGIgLyBjIC8gZCAvIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgLyBiIC8gYyAvIGQgLyBlIC8gZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlIC8gKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhIC8gYiAvIGMgLyBkIC8gZSAvIGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5kaXZpZGUgPSBkaXZpZGU7XG5cbnZhciBtdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIDE7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGE7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGEgKiBiO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBhICogYiAqIGM7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIGEgKiBiICogYyAqIGQ7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGEgKiBiICogYyAqIGQgKiBlO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBhICogYiAqIGMgKiBkICogZSAqIGY7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIG1vcmUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDYpO1xuICAgICAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHZhbHVlLCBpbmRleCwgY291bnQpIHtcbiAgICAgICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICAgICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICAgICAgcmVjdXIgPSBpbmRleCA8IGNvdW50ID9cbiAgICAgICAgICAodmFsdWUgPSB2YWx1ZSAqICgobW9yZSB8fCAwKVtpbmRleF0pLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoYSAqIGIgKiBjICogZCAqIGUgKiBmLCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMubXVsdGlwbHkgPSBtdWx0aXBseTtcblxudmFyIGFuZCA9IGZ1bmN0aW9uIGFuZChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBhO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBhICYmIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgJiYgYiAmJiBjO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBhICYmIGIgJiYgYyAmJiBkO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBhICYmIGIgJiYgYyAmJiBkICYmIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgJiYgYiAmJiBjICYmIGQgJiYgZSAmJiBmO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCA2KTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcCh2YWx1ZSwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gaW5kZXggPCBjb3VudCA/XG4gICAgICAgICAgKHZhbHVlID0gdmFsdWUgJiYgKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhICYmIGIgJiYgYyAmJiBkICYmIGUgJiYgZiwgMCwgbW9yZS5sZW5ndGgpO1xuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLmFuZCA9IGFuZDtcblxudmFyIG9yID0gZnVuY3Rpb24gb3IoYSwgYiwgYywgZCwgZSwgZikge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gdm9pZCgwKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSB8fCBiO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBhIHx8IGIgfHwgYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSB8fCBiIHx8IGMgfHwgZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSB8fCBiIHx8IGMgfHwgZCB8fCBlO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBhIHx8IGIgfHwgYyB8fCBkIHx8IGUgfHwgZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlIHx8ICgobW9yZSB8fCAwKVtpbmRleF0pLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoYSB8fCBiIHx8IGMgfHwgZCB8fCBlIHx8IGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5vciA9IG9yO1xuXG52YXIgcHJpbnQgPSBmdW5jdGlvbiBwcmludCgpIHtcbiAgdmFyIG1vcmUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gY29uc29sZS5sb2cuYXBwbHkoY29uc29sZS5sb2csIG1vcmUpO1xufTtcbmV4cG9ydHMucHJpbnQgPSBwcmludFxuXG59KSgpIiwidmFyIF9uc18gPSBcIndpc3Auc2VxdWVuY2VcIjtcbm1vZHVsZS5uYW1lc3BhY2UgPSBfbnNfO1xudmFyIGlzTmlsID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzTmlsO1xudmFyIGlzVmVjdG9yID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzVmVjdG9yO1xudmFyIGlzRm4gPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNGbjtcbnZhciBpc051bWJlciA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc051bWJlcjtcbnZhciBpc1N0cmluZyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc1N0cmluZztcbnZhciBpc0RpY3Rpb25hcnkgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNEaWN0aW9uYXJ5O1xudmFyIGtleVZhbHVlcyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5rZXlWYWx1ZXM7XG52YXIgc3RyID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLnN0cjtcbnZhciBkZWMgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuZGVjO1xudmFyIGluYyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pbmM7XG52YXIgbWVyZ2UgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkubWVyZ2U7O1xuXG52YXIgTGlzdCA9IGZ1bmN0aW9uIExpc3QoaGVhZCwgdGFpbCkge1xuICB0aGlzLmhlYWQgPSBoZWFkO1xuICB0aGlzLnRhaWwgPSB0YWlsIHx8IChsaXN0KCkpO1xuICB0aGlzLmxlbmd0aCA9IGluYyhjb3VudCh0aGlzLnRhaWwpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5sZW5ndGggPSAwO1xuXG5MaXN0LnR5cGUgPSBcIndpc3AubGlzdFwiO1xuXG5MaXN0LnByb3RvdHlwZS50eXBlID0gTGlzdC50eXBlO1xuXG5MaXN0LnByb3RvdHlwZS50YWlsID0gT2JqZWN0LmNyZWF0ZShMaXN0LnByb3RvdHlwZSk7XG5cbkxpc3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIGxpc3QpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGxpc3QpID9cbiAgICAgIFwiXCIgKyBcIihcIiArIChyZXN1bHQuc3Vic3RyKDEpKSArIFwiKVwiIDpcbiAgICAgIChyZXN1bHQgPSBcIlwiICsgcmVzdWx0ICsgXCIgXCIgKyAoaXNWZWN0b3IoZmlyc3QobGlzdCkpID9cbiAgICAgICAgXCJcIiArIFwiW1wiICsgKGZpcnN0KGxpc3QpLmpvaW4oXCIgXCIpKSArIFwiXVwiIDpcbiAgICAgIGlzTmlsKGZpcnN0KGxpc3QpKSA/XG4gICAgICAgIFwibmlsXCIgOlxuICAgICAgaXNTdHJpbmcoZmlyc3QobGlzdCkpID9cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmlyc3QobGlzdCkpIDpcbiAgICAgIGlzTnVtYmVyKGZpcnN0KGxpc3QpKSA/XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZpcnN0KGxpc3QpKSA6XG4gICAgICAgIGZpcnN0KGxpc3QpKSwgbGlzdCA9IHJlc3QobGlzdCksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCB0aGlzKTtcbn07XG5cbnZhciBsYXp5U2VxVmFsdWUgPSBmdW5jdGlvbiBsYXp5U2VxVmFsdWUobGF6eVNlcSkge1xuICByZXR1cm4gIShsYXp5U2VxLnJlYWxpemVkKSA/XG4gICAgKGxhenlTZXEucmVhbGl6ZWQgPSB0cnVlKSAmJiAobGF6eVNlcS54ID0gbGF6eVNlcS54KCkpIDpcbiAgICBsYXp5U2VxLng7XG59O1xuXG52YXIgTGF6eVNlcSA9IGZ1bmN0aW9uIExhenlTZXEocmVhbGl6ZWQsIHgpIHtcbiAgdGhpcy5yZWFsaXplZCA9IHJlYWxpemVkIHx8IGZhbHNlO1xuICB0aGlzLnggPSB4O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkxhenlTZXEudHlwZSA9IFwid2lzcC5sYXp5LnNlcVwiO1xuXG5MYXp5U2VxLnByb3RvdHlwZS50eXBlID0gTGF6eVNlcS50eXBlO1xuXG52YXIgbGF6eVNlcSA9IGZ1bmN0aW9uIGxhenlTZXEocmVhbGl6ZWQsIGJvZHkpIHtcbiAgcmV0dXJuIG5ldyBMYXp5U2VxKHJlYWxpemVkLCBib2R5KTtcbn07XG5leHBvcnRzLmxhenlTZXEgPSBsYXp5U2VxO1xuXG52YXIgaXNMYXp5U2VxID0gZnVuY3Rpb24gaXNMYXp5U2VxKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiAoTGF6eVNlcS50eXBlID09PSB2YWx1ZS50eXBlKTtcbn07XG5leHBvcnRzLmlzTGF6eVNlcSA9IGlzTGF6eVNlcTtcblxudW5kZWZpbmVkO1xuXG52YXIgaXNMaXN0ID0gZnVuY3Rpb24gaXNMaXN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiAoTGlzdC50eXBlID09PSB2YWx1ZS50eXBlKTtcbn07XG5leHBvcnRzLmlzTGlzdCA9IGlzTGlzdDtcblxudmFyIGxpc3QgPSBmdW5jdGlvbiBsaXN0KCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/XG4gICAgT2JqZWN0LmNyZWF0ZShMaXN0LnByb3RvdHlwZSkgOlxuICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykucmVkdWNlUmlnaHQoZnVuY3Rpb24odGFpbCwgaGVhZCkge1xuICAgICAgcmV0dXJuIGNvbnMoaGVhZCwgdGFpbCk7XG4gICAgfSwgbGlzdCgpKTtcbn07XG5leHBvcnRzLmxpc3QgPSBsaXN0O1xuXG52YXIgY29ucyA9IGZ1bmN0aW9uIGNvbnMoaGVhZCwgdGFpbCkge1xuICByZXR1cm4gbmV3IExpc3QoaGVhZCwgdGFpbCk7XG59O1xuZXhwb3J0cy5jb25zID0gY29ucztcblxudmFyIHJldmVyc2VMaXN0ID0gZnVuY3Rpb24gcmV2ZXJzZUxpc3Qoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKGl0ZW1zLCBzb3VyY2UpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KHNvdXJjZSkgP1xuICAgICAgbGlzdC5hcHBseShsaXN0LCBpdGVtcykgOlxuICAgICAgKGl0ZW1zID0gW2ZpcnN0KHNvdXJjZSldLmNvbmNhdChpdGVtcyksIHNvdXJjZSA9IHJlc3Qoc291cmNlKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdLCBzZXF1ZW5jZSk7XG59O1xuXG52YXIgaXNTZXF1ZW50aWFsID0gZnVuY3Rpb24gaXNTZXF1ZW50aWFsKHgpIHtcbiAgcmV0dXJuIChpc0xpc3QoeCkpIHx8IChpc1ZlY3Rvcih4KSkgfHwgKGlzTGF6eVNlcSh4KSkgfHwgKGlzRGljdGlvbmFyeSh4KSkgfHwgKGlzU3RyaW5nKHgpKTtcbn07XG5leHBvcnRzLmlzU2VxdWVudGlhbCA9IGlzU2VxdWVudGlhbDtcblxudmFyIHJldmVyc2UgPSBmdW5jdGlvbiByZXZlcnNlKHNlcXVlbmNlKSB7XG4gIHJldHVybiBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICByZXZlcnNlTGlzdChzZXF1ZW5jZSkgOlxuICBpc1ZlY3RvcihzZXF1ZW5jZSkgP1xuICAgIHNlcXVlbmNlLnJldmVyc2UoKSA6XG4gIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgbGlzdCgpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHJldmVyc2Uoc2VxKHNlcXVlbmNlKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5yZXZlcnNlID0gcmV2ZXJzZTtcblxudmFyIG1hcCA9IGZ1bmN0aW9uIG1hcChmLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS5tYXAoZikgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBtYXBMaXN0KGYsIHNlcXVlbmNlKSA6XG4gIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgbGlzdCgpIDpcbiAgXCJlbHNlXCIgP1xuICAgIG1hcChmLCBzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm1hcCA9IG1hcDtcblxudmFyIG1hcExpc3QgPSBmdW5jdGlvbiBtYXBMaXN0KGYsIHNlcXVlbmNlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIGl0ZW1zKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShpdGVtcykgP1xuICAgICAgcmV2ZXJzZShyZXN1bHQpIDpcbiAgICAgIChyZXN1bHQgPSBjb25zKGYoZmlyc3QoaXRlbXMpKSwgcmVzdWx0KSwgaXRlbXMgPSByZXN0KGl0ZW1zKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGxpc3QoKSwgc2VxdWVuY2UpO1xufTtcblxudmFyIGZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihpc0YsIHNlcXVlbmNlKSB7XG4gIHJldHVybiBpc1ZlY3RvcihzZXF1ZW5jZSkgP1xuICAgIHNlcXVlbmNlLmZpbHRlcihpc0YpIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgZmlsdGVyTGlzdChpc0YsIHNlcXVlbmNlKSA6XG4gIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgbGlzdCgpIDpcbiAgXCJlbHNlXCIgP1xuICAgIGZpbHRlcihpc0YsIHNlcShzZXF1ZW5jZSkpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuZmlsdGVyID0gZmlsdGVyO1xuXG52YXIgZmlsdGVyTGlzdCA9IGZ1bmN0aW9uIGZpbHRlckxpc3QoaXNGLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCBpdGVtcykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGlzRW1wdHkoaXRlbXMpID9cbiAgICAgIHJldmVyc2UocmVzdWx0KSA6XG4gICAgICAocmVzdWx0ID0gaXNGKGZpcnN0KGl0ZW1zKSkgP1xuICAgICAgICBjb25zKGZpcnN0KGl0ZW1zKSwgcmVzdWx0KSA6XG4gICAgICAgIHJlc3VsdCwgaXRlbXMgPSByZXN0KGl0ZW1zKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGxpc3QoKSwgc2VxdWVuY2UpO1xufTtcblxudmFyIHJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShmKSB7XG4gIHZhciBwYXJhbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBoYXNJbml0aWFsID0gY291bnQocGFyYW1zKSA+PSAyO1xuICAgIHZhciBpbml0aWFsID0gaGFzSW5pdGlhbCA/XG4gICAgICBmaXJzdChwYXJhbXMpIDpcbiAgICAgIHZvaWQoMCk7XG4gICAgdmFyIHNlcXVlbmNlID0gaGFzSW5pdGlhbCA/XG4gICAgICBzZWNvbmQocGFyYW1zKSA6XG4gICAgICBmaXJzdChwYXJhbXMpO1xuICAgIHJldHVybiBpc05pbChzZXF1ZW5jZSkgP1xuICAgICAgaW5pdGlhbCA6XG4gICAgaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICAgIGhhc0luaXRpYWwgP1xuICAgICAgICBzZXF1ZW5jZS5yZWR1Y2UoZiwgaW5pdGlhbCkgOlxuICAgICAgICBzZXF1ZW5jZS5yZWR1Y2UoZikgOlxuICAgIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgICAgaGFzSW5pdGlhbCA/XG4gICAgICAgIHJlZHVjZUxpc3QoZiwgaW5pdGlhbCwgc2VxdWVuY2UpIDpcbiAgICAgICAgcmVkdWNlTGlzdChmLCBmaXJzdChzZXF1ZW5jZSksIHJlc3Qoc2VxdWVuY2UpKSA6XG4gICAgXCJlbHNlXCIgP1xuICAgICAgcmVkdWNlKGYsIGluaXRpYWwsIHNlcShzZXF1ZW5jZSkpIDpcbiAgICAgIHZvaWQoMCk7XG4gIH0pKCk7XG59O1xuZXhwb3J0cy5yZWR1Y2UgPSByZWR1Y2U7XG5cbnZhciByZWR1Y2VMaXN0ID0gZnVuY3Rpb24gcmVkdWNlTGlzdChmLCBpbml0aWFsLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCBpdGVtcykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGlzRW1wdHkoaXRlbXMpID9cbiAgICAgIHJlc3VsdCA6XG4gICAgICAocmVzdWx0ID0gZihyZXN1bHQsIGZpcnN0KGl0ZW1zKSksIGl0ZW1zID0gcmVzdChpdGVtcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShpbml0aWFsLCBzZXF1ZW5jZSk7XG59O1xuXG52YXIgY291bnQgPSBmdW5jdGlvbiBjb3VudChzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICAwIDpcbiAgICAoc2VxKHNlcXVlbmNlKSkubGVuZ3RoO1xufTtcbmV4cG9ydHMuY291bnQgPSBjb3VudDtcblxudmFyIGlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KHNlcXVlbmNlKSB7XG4gIHJldHVybiBjb3VudChzZXF1ZW5jZSkgPT09IDA7XG59O1xuZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTtcblxudmFyIGZpcnN0ID0gZnVuY3Rpb24gZmlyc3Qoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgdm9pZCgwKSA6XG4gIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgIHNlcXVlbmNlLmhlYWQgOlxuICAoaXNWZWN0b3Ioc2VxdWVuY2UpKSB8fCAoaXNTdHJpbmcoc2VxdWVuY2UpKSA/XG4gICAgKHNlcXVlbmNlIHx8IDApWzBdIDpcbiAgaXNMYXp5U2VxKHNlcXVlbmNlKSA/XG4gICAgZmlyc3QobGF6eVNlcVZhbHVlKHNlcXVlbmNlKSkgOlxuICBcImVsc2VcIiA/XG4gICAgZmlyc3Qoc2VxKHNlcXVlbmNlKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5maXJzdCA9IGZpcnN0O1xuXG52YXIgc2Vjb25kID0gZnVuY3Rpb24gc2Vjb25kKHNlcXVlbmNlKSB7XG4gIHJldHVybiBpc05pbChzZXF1ZW5jZSkgP1xuICAgIHZvaWQoMCkgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBmaXJzdChyZXN0KHNlcXVlbmNlKSkgOlxuICAoaXNWZWN0b3Ioc2VxdWVuY2UpKSB8fCAoaXNTdHJpbmcoc2VxdWVuY2UpKSA/XG4gICAgKHNlcXVlbmNlIHx8IDApWzFdIDpcbiAgaXNMYXp5U2VxKHNlcXVlbmNlKSA/XG4gICAgc2Vjb25kKGxhenlTZXFWYWx1ZShzZXF1ZW5jZSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIGZpcnN0KHJlc3Qoc2VxKHNlcXVlbmNlKSkpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuc2Vjb25kID0gc2Vjb25kO1xuXG52YXIgdGhpcmQgPSBmdW5jdGlvbiB0aGlyZChzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICB2b2lkKDApIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgZmlyc3QocmVzdChyZXN0KHNlcXVlbmNlKSkpIDpcbiAgKGlzVmVjdG9yKHNlcXVlbmNlKSkgfHwgKGlzU3RyaW5nKHNlcXVlbmNlKSkgP1xuICAgIChzZXF1ZW5jZSB8fCAwKVsyXSA6XG4gIGlzTGF6eVNlcShzZXF1ZW5jZSkgP1xuICAgIHRoaXJkKGxhenlTZXFWYWx1ZShzZXF1ZW5jZSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHNlY29uZChyZXN0KHNlcShzZXF1ZW5jZSkpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnRoaXJkID0gdGhpcmQ7XG5cbnZhciByZXN0ID0gZnVuY3Rpb24gcmVzdChzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICBsaXN0KCkgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS50YWlsIDpcbiAgKGlzVmVjdG9yKHNlcXVlbmNlKSkgfHwgKGlzU3RyaW5nKHNlcXVlbmNlKSkgP1xuICAgIHNlcXVlbmNlLnNsaWNlKDEpIDpcbiAgaXNMYXp5U2VxKHNlcXVlbmNlKSA/XG4gICAgcmVzdChsYXp5U2VxVmFsdWUoc2VxdWVuY2UpKSA6XG4gIFwiZWxzZVwiID9cbiAgICByZXN0KHNlcShzZXF1ZW5jZSkpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMucmVzdCA9IHJlc3Q7XG5cbnZhciBsYXN0T2ZMaXN0ID0gZnVuY3Rpb24gbGFzdE9mTGlzdChsaXN0KSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChpdGVtLCBpdGVtcykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGlzRW1wdHkoaXRlbXMpID9cbiAgICAgIGl0ZW0gOlxuICAgICAgKGl0ZW0gPSBmaXJzdChpdGVtcyksIGl0ZW1zID0gcmVzdChpdGVtcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShmaXJzdChsaXN0KSwgcmVzdChsaXN0KSk7XG59O1xuXG52YXIgbGFzdCA9IGZ1bmN0aW9uIGxhc3Qoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIChpc1ZlY3RvcihzZXF1ZW5jZSkpIHx8IChpc1N0cmluZyhzZXF1ZW5jZSkpID9cbiAgICAoc2VxdWVuY2UgfHwgMClbZGVjKGNvdW50KHNlcXVlbmNlKSldIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgbGFzdE9mTGlzdChzZXF1ZW5jZSkgOlxuICBpc05pbChzZXF1ZW5jZSkgP1xuICAgIHZvaWQoMCkgOlxuICBpc0xhenlTZXEoc2VxdWVuY2UpID9cbiAgICBsYXN0KGxhenlTZXFWYWx1ZShzZXF1ZW5jZSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIGxhc3Qoc2VxKHNlcXVlbmNlKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5sYXN0ID0gbGFzdDtcblxudmFyIGJ1dGxhc3QgPSBmdW5jdGlvbiBidXRsYXN0KHNlcXVlbmNlKSB7XG4gIHZhciBpdGVtcyA9IGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgdm9pZCgwKSA6XG4gIGlzU3RyaW5nKHNlcXVlbmNlKSA/XG4gICAgc3VicyhzZXF1ZW5jZSwgMCwgZGVjKGNvdW50KHNlcXVlbmNlKSkpIDpcbiAgaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS5zbGljZSgwLCBkZWMoY291bnQoc2VxdWVuY2UpKSkgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBsaXN0LmFwcGx5KGxpc3QsIGJ1dGxhc3QodmVjKHNlcXVlbmNlKSkpIDpcbiAgaXNMYXp5U2VxKHNlcXVlbmNlKSA/XG4gICAgYnV0bGFzdChsYXp5U2VxVmFsdWUoc2VxdWVuY2UpKSA6XG4gIFwiZWxzZVwiID9cbiAgICBidXRsYXN0KHNlcShzZXF1ZW5jZSkpIDpcbiAgICB2b2lkKDApO1xuICByZXR1cm4gISgoaXNOaWwoaXRlbXMpKSB8fCAoaXNFbXB0eShpdGVtcykpKSA/XG4gICAgaXRlbXMgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5idXRsYXN0ID0gYnV0bGFzdDtcblxudmFyIHRha2UgPSBmdW5jdGlvbiB0YWtlKG4sIHNlcXVlbmNlKSB7XG4gIHJldHVybiBpc05pbChzZXF1ZW5jZSkgP1xuICAgIGxpc3QoKSA6XG4gIGlzVmVjdG9yKHNlcXVlbmNlKSA/XG4gICAgdGFrZUZyb21WZWN0b3Iobiwgc2VxdWVuY2UpIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgdGFrZUZyb21MaXN0KG4sIHNlcXVlbmNlKSA6XG4gIGlzTGF6eVNlcShzZXF1ZW5jZSkgP1xuICAgIHRha2UobiwgbGF6eVNlcVZhbHVlKHNlcXVlbmNlKSkgOlxuICBcImVsc2VcIiA/XG4gICAgdGFrZShuLCBzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnRha2UgPSB0YWtlO1xuXG52YXIgdGFrZVZlY3RvcldoaWxlID0gZnVuY3Rpb24gdGFrZVZlY3RvcldoaWxlKHByZWRpY2F0ZSwgdmVjdG9yKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIHRhaWwsIGhlYWQpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSAoIShpc0VtcHR5KHRhaWwpKSkgJiYgKHByZWRpY2F0ZShoZWFkKSkgP1xuICAgICAgKHJlc3VsdCA9IGNvbmoocmVzdWx0LCBoZWFkKSwgdGFpbCA9IHJlc3QodGFpbCksIGhlYWQgPSBmaXJzdCh0YWlsKSwgbG9vcCkgOlxuICAgICAgcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShbXSwgdmVjdG9yLCBmaXJzdCh2ZWN0b3IpKTtcbn07XG5cbnZhciB0YWtlTGlzdFdoaWxlID0gZnVuY3Rpb24gdGFrZUxpc3RXaGlsZShwcmVkaWNhdGUsIGl0ZW1zKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIHRhaWwsIGhlYWQpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSAoIShpc0VtcHR5KHRhaWwpKSkgJiYgKGlzUHJlZGljYXRlKGhlYWQpKSA/XG4gICAgICAocmVzdWx0ID0gY29uaihyZXN1bHQsIGhlYWQpLCB0YWlsID0gcmVzdCh0YWlsKSwgaGVhZCA9IGZpcnN0KHRhaWwpLCBsb29wKSA6XG4gICAgICBsaXN0LmFwcGx5KGxpc3QsIHJlc3VsdCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdLCBpdGVtcywgZmlyc3QoaXRlbXMpKTtcbn07XG5cbnZhciB0YWtlV2hpbGUgPSBmdW5jdGlvbiB0YWtlV2hpbGUocHJlZGljYXRlLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICBsaXN0KCkgOlxuICBpc1ZlY3RvcihzZXF1ZW5jZSkgP1xuICAgIHRha2VWZWN0b3JXaGlsZShwcmVkaWNhdGUsIHNlcXVlbmNlKSA6XG4gIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgIHRha2VWZWN0b3JXaGlsZShwcmVkaWNhdGUsIHNlcXVlbmNlKSA6XG4gIFwiZWxzZVwiID9cbiAgICB0YWtlV2hpbGUocHJlZGljYXRlLCBsYXp5U2VxVmFsdWUoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnRha2VXaGlsZSA9IHRha2VXaGlsZTtcblxudmFyIHRha2VGcm9tVmVjdG9yID0gZnVuY3Rpb24gdGFrZUZyb21WZWN0b3IobiwgdmVjdG9yKSB7XG4gIHJldHVybiB2ZWN0b3Iuc2xpY2UoMCwgbik7XG59O1xuXG52YXIgdGFrZUZyb21MaXN0ID0gZnVuY3Rpb24gdGFrZUZyb21MaXN0KG4sIHNlcXVlbmNlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcCh0YWtlbiwgaXRlbXMsIG4pIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSAobiA9PT0gMCkgfHwgKGlzRW1wdHkoaXRlbXMpKSA/XG4gICAgICByZXZlcnNlKHRha2VuKSA6XG4gICAgICAodGFrZW4gPSBjb25zKGZpcnN0KGl0ZW1zKSwgdGFrZW4pLCBpdGVtcyA9IHJlc3QoaXRlbXMpLCBuID0gZGVjKG4pLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkobGlzdCgpLCBzZXF1ZW5jZSwgbik7XG59O1xuXG52YXIgZHJvcEZyb21MaXN0ID0gZnVuY3Rpb24gZHJvcEZyb21MaXN0KG4sIHNlcXVlbmNlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChsZWZ0LCBpdGVtcykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IChsZWZ0IDwgMSkgfHwgKGlzRW1wdHkoaXRlbXMpKSA/XG4gICAgICBpdGVtcyA6XG4gICAgICAobGVmdCA9IGRlYyhsZWZ0KSwgaXRlbXMgPSByZXN0KGl0ZW1zKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKG4sIHNlcXVlbmNlKTtcbn07XG5cbnZhciBkcm9wID0gZnVuY3Rpb24gZHJvcChuLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gbiA8PSAwID9cbiAgICBzZXF1ZW5jZSA6XG4gIGlzU3RyaW5nKHNlcXVlbmNlKSA/XG4gICAgc2VxdWVuY2Uuc3Vic3RyKG4pIDpcbiAgaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS5zbGljZShuKSA6XG4gIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgIGRyb3BGcm9tTGlzdChuLCBzZXF1ZW5jZSkgOlxuICBpc05pbChzZXF1ZW5jZSkgP1xuICAgIGxpc3QoKSA6XG4gIGlzTGF6eVNlcShzZXF1ZW5jZSkgP1xuICAgIGRyb3AobiwgbGF6eVNlcVZhbHVlKHNlcXVlbmNlKSkgOlxuICBcImVsc2VcIiA/XG4gICAgZHJvcChuLCBzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmRyb3AgPSBkcm9wO1xuXG52YXIgY29uakxpc3QgPSBmdW5jdGlvbiBjb25qTGlzdChzZXF1ZW5jZSwgaXRlbXMpIHtcbiAgcmV0dXJuIHJlZHVjZShmdW5jdGlvbihyZXN1bHQsIGl0ZW0pIHtcbiAgICByZXR1cm4gY29ucyhpdGVtLCByZXN1bHQpO1xuICB9LCBzZXF1ZW5jZSwgaXRlbXMpO1xufTtcblxudmFyIGNvbmogPSBmdW5jdGlvbiBjb25qKHNlcXVlbmNlKSB7XG4gIHZhciBpdGVtcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHJldHVybiBpc1ZlY3RvcihzZXF1ZW5jZSkgP1xuICAgIHNlcXVlbmNlLmNvbmNhdChpdGVtcykgOlxuICBpc1N0cmluZyhzZXF1ZW5jZSkgP1xuICAgIFwiXCIgKyBzZXF1ZW5jZSArIChzdHIuYXBwbHkoc3RyLCBpdGVtcykpIDpcbiAgaXNOaWwoc2VxdWVuY2UpID9cbiAgICBsaXN0LmFwcGx5KGxpc3QsIHJldmVyc2UoaXRlbXMpKSA6XG4gIChpc0xpc3Qoc2VxdWVuY2UpKSB8fCAoaXNMYXp5U2VxKCkpID9cbiAgICBjb25qTGlzdChzZXF1ZW5jZSwgaXRlbXMpIDpcbiAgaXNEaWN0aW9uYXJ5KHNlcXVlbmNlKSA/XG4gICAgbWVyZ2Uoc2VxdWVuY2UsIG1lcmdlLmFwcGx5KG1lcmdlLCBpdGVtcykpIDpcbiAgXCJlbHNlXCIgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgVHlwZUVycm9yKFwiXCIgKyBcIlR5cGUgY2FuJ3QgYmUgY29uam9pbmVkIFwiICsgc2VxdWVuY2UpOyB9KSgpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuY29uaiA9IGNvbmo7XG5cbnZhciBjb25jYXQgPSBmdW5jdGlvbiBjb25jYXQoKSB7XG4gIHZhciBzZXF1ZW5jZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gcmV2ZXJzZShyZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBzZXF1ZW5jZSkge1xuICAgIHJldHVybiByZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBpdGVtKSB7XG4gICAgICByZXR1cm4gY29ucyhpdGVtLCByZXN1bHQpO1xuICAgIH0sIHJlc3VsdCwgc2VxKHNlcXVlbmNlKSk7XG4gIH0sIGxpc3QoKSwgc2VxdWVuY2VzKSk7XG59O1xuZXhwb3J0cy5jb25jYXQgPSBjb25jYXQ7XG5cbnZhciBzZXEgPSBmdW5jdGlvbiBzZXEoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgdm9pZCgwKSA6XG4gIChpc1ZlY3RvcihzZXF1ZW5jZSkpIHx8IChpc0xpc3Qoc2VxdWVuY2UpKSB8fCAoaXNMYXp5U2VxKHNlcXVlbmNlKSkgP1xuICAgIHNlcXVlbmNlIDpcbiAgaXNTdHJpbmcoc2VxdWVuY2UpID9cbiAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzZXF1ZW5jZSkgOlxuICBpc0RpY3Rpb25hcnkoc2VxdWVuY2UpID9cbiAgICBrZXlWYWx1ZXMoc2VxdWVuY2UpIDpcbiAgXCJkZWZhdWx0XCIgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgVHlwZUVycm9yKFwiXCIgKyBcIkNhbiBub3Qgc2VxIFwiICsgc2VxdWVuY2UpOyB9KSgpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuc2VxID0gc2VxO1xuXG52YXIgaXNTZXEgPSBmdW5jdGlvbiBpc1NlcShzZXF1ZW5jZSkge1xuICByZXR1cm4gKGlzTGlzdChzZXF1ZW5jZSkpIHx8IChpc0xhenlTZXEoc2VxdWVuY2UpKTtcbn07XG5leHBvcnRzLmlzU2VxID0gaXNTZXE7XG5cbnZhciBsaXN0VG9WZWN0b3IgPSBmdW5jdGlvbiBsaXN0VG9WZWN0b3Ioc291cmNlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIGxpc3QpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGxpc3QpID9cbiAgICAgIHJlc3VsdCA6XG4gICAgICAocmVzdWx0ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXN1bHQucHVzaChmaXJzdChsaXN0KSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSgpLCBsaXN0ID0gcmVzdChsaXN0KSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdLCBzb3VyY2UpO1xufTtcblxudmFyIHZlYyA9IGZ1bmN0aW9uIHZlYyhzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICBbXSA6XG4gIGlzVmVjdG9yKHNlcXVlbmNlKSA/XG4gICAgc2VxdWVuY2UgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBsaXN0VG9WZWN0b3Ioc2VxdWVuY2UpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHZlYyhzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnZlYyA9IHZlYztcblxudmFyIHNvcnQgPSBmdW5jdGlvbiBzb3J0KGYsIGl0ZW1zKSB7XG4gIHZhciBoYXNDb21wYXJhdG9yID0gaXNGbihmKTtcbiAgdmFyIGl0ZW1zID0gKCEoaGFzQ29tcGFyYXRvcikpICYmIChpc05pbChpdGVtcykpID9cbiAgICBmIDpcbiAgICBpdGVtcztcbiAgdmFyIGNvbXBhcmUgPSBoYXNDb21wYXJhdG9yID9cbiAgICBmdW5jdGlvbihhLCBiKSB7XG4gICAgICByZXR1cm4gZihhLCBiKSA/XG4gICAgICAgIDAgOlxuICAgICAgICAxO1xuICAgIH0gOlxuICAgIHZvaWQoMCk7XG4gIHJldHVybiBpc05pbChpdGVtcykgP1xuICAgIGxpc3QoKSA6XG4gIGlzVmVjdG9yKGl0ZW1zKSA/XG4gICAgaXRlbXMuc29ydChjb21wYXJlKSA6XG4gIGlzTGlzdChpdGVtcykgP1xuICAgIGxpc3QuYXBwbHkobGlzdCwgdmVjKGl0ZW1zKS5zb3J0KGNvbXBhcmUpKSA6XG4gIGlzRGljdGlvbmFyeShpdGVtcykgP1xuICAgIHNlcShpdGVtcykuc29ydChjb21wYXJlKSA6XG4gIFwiZWxzZVwiID9cbiAgICBzb3J0KGYsIHNlcShpdGVtcykpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuc29ydCA9IHNvcnQ7XG5cbnZhciByZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQobiwgeCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AobiwgcmVzdWx0KSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gbiA8PSAwID9cbiAgICAgIHJlc3VsdCA6XG4gICAgICAobiA9IGRlYyhuKSwgcmVzdWx0ID0gY29uaihyZXN1bHQsIHgpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkobiwgW10pO1xufTtcbmV4cG9ydHMucmVwZWF0ID0gcmVwZWF0XG4iLCJ2YXIgX25zXyA9IFwid2lzcC5zdHJpbmdcIjtcbm1vZHVsZS5uYW1lc3BhY2UgPSBfbnNfO1xudmFyIHN0ciA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5zdHI7XG52YXIgc3VicyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5zdWJzO1xudmFyIHJlTWF0Y2hlcyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5yZU1hdGNoZXM7XG52YXIgaXNOaWwgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNOaWw7XG52YXIgaXNTdHJpbmcgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNTdHJpbmc7XG52YXIgdmVjID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS52ZWM7XG52YXIgaXNFbXB0eSA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuaXNFbXB0eTs7XG5cbnZhciBzcGxpdCA9IGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgcGF0dGVybiwgbGltaXQpIHtcbiAgcmV0dXJuIHN0cmluZy5zcGxpdChwYXR0ZXJuLCBsaW1pdCk7XG59O1xuZXhwb3J0cy5zcGxpdCA9IHNwbGl0O1xuXG52YXIgam9pbiA9IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yLCBjb2xsKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciBjb2xsID0gc2VwYXJhdG9yO1xuICAgICAgcmV0dXJuIHN0ci5hcHBseShzdHIsIHZlYyhjb2xsKSk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHZlYyhjb2xsKS5qb2luKHNlcGFyYXRvcik7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgKGZ1bmN0aW9uKCkgeyB0aHJvdyBFcnJvcihcIkludmFsaWQgYXJpdHlcIik7IH0pKClcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5qb2luID0gam9pbjtcblxudmFyIHVwcGVyQ2FzZSA9IGZ1bmN0aW9uIHVwcGVyQ2FzZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50b1VwcGVyQ2FzZSgpO1xufTtcbmV4cG9ydHMudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuXG52YXIgdXBwZXJDYXNlID0gZnVuY3Rpb24gdXBwZXJDYXNlKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRvVXBwZXJDYXNlKCk7XG59O1xuZXhwb3J0cy51cHBlckNhc2UgPSB1cHBlckNhc2U7XG5cbnZhciBsb3dlckNhc2UgPSBmdW5jdGlvbiBsb3dlckNhc2Uoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudG9Mb3dlckNhc2UoKTtcbn07XG5leHBvcnRzLmxvd2VyQ2FzZSA9IGxvd2VyQ2FzZTtcblxudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICByZXR1cm4gY291bnQoc3RyaW5nKSA8IDIgP1xuICAgIHVwcGVyQ2FzZShzdHJpbmcpIDpcbiAgICBcIlwiICsgKHVwcGVyQ2FzZShzdWJzKHMsIDAsIDEpKSkgKyAobG93ZXJDYXNlKHN1YnMocywgMSkpKTtcbn07XG5leHBvcnRzLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuXG52YXIgcmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2Uoc3RyaW5nLCBtYXRjaCwgcmVwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKG1hdGNoLCByZXBsYWNlbWVudCk7XG59O1xuZXhwb3J0cy5yZXBsYWNlID0gcmVwbGFjZTtcblxudmFyIF9fTEVGVFNQQUNFU19fID0gL15cXHNcXHMqLztcbmV4cG9ydHMuX19MRUZUU1BBQ0VTX18gPSBfX0xFRlRTUEFDRVNfXztcblxudmFyIF9fUklHSFRTUEFDRVNfXyA9IC9cXHNcXHMqJC87XG5leHBvcnRzLl9fUklHSFRTUEFDRVNfXyA9IF9fUklHSFRTUEFDRVNfXztcblxudmFyIF9fU1BBQ0VTX18gPSAvXlxcc1xccyokLztcbmV4cG9ydHMuX19TUEFDRVNfXyA9IF9fU1BBQ0VTX187XG5cbnZhciB0cmltbCA9IGlzTmlsKFwiXCIudHJpbUxlZnQpID9cbiAgZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKF9fTEVGVFNQQUNFU19fLCBcIlwiKTtcbiAgfSA6XG4gIGZ1bmN0aW9uIHRyaW1sKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcudHJpbUxlZnQoKTtcbiAgfTtcbmV4cG9ydHMudHJpbWwgPSB0cmltbDtcblxudmFyIHRyaW1yID0gaXNOaWwoXCJcIi50cmltUmlnaHQpID9cbiAgZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKF9fUklHSFRTUEFDRVNfXywgXCJcIik7XG4gIH0gOlxuICBmdW5jdGlvbiB0cmltcihzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnRyaW1SaWdodCgpO1xuICB9O1xuZXhwb3J0cy50cmltciA9IHRyaW1yO1xuXG52YXIgdHJpbSA9IGlzTmlsKFwiXCIudHJpbSkgP1xuICBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX19MRUZUU1BBQ0VTX18pLnJlcGxhY2UoX19SSUdIVFNQQUNFU19fKTtcbiAgfSA6XG4gIGZ1bmN0aW9uIHRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy50cmltKCk7XG4gIH07XG5leHBvcnRzLnRyaW0gPSB0cmltO1xuXG52YXIgaXNCbGFuayA9IGZ1bmN0aW9uIGlzQmxhbmsoc3RyaW5nKSB7XG4gIHJldHVybiAoaXNOaWwoc3RyaW5nKSkgfHwgKGlzRW1wdHkoc3RyaW5nKSkgfHwgKHJlTWF0Y2hlcyhfX1NQQUNFU19fLCBzdHJpbmcpKTtcbn07XG5leHBvcnRzLmlzQmxhbmsgPSBpc0JsYW5rXG4iLCJ2YXIgX25zXyA9IFwid2lzcC5yZWFkZXJcIjtcbm1vZHVsZS5uYW1lc3BhY2UgPSBfbnNfO1xubW9kdWxlLmRlc2NyaXB0aW9uID0gXCJSZWFkZXIgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyB0ZXh0IGlucHV0XFxuICBhcyB3aXNwIGRhdGEgc3RydWN0dXJlc1wiO1xudmFyIGxpc3QgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmxpc3Q7XG52YXIgaXNMaXN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5pc0xpc3Q7XG52YXIgY291bnQgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmNvdW50O1xudmFyIGlzRW1wdHkgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmlzRW1wdHk7XG52YXIgZmlyc3QgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmZpcnN0O1xudmFyIHNlY29uZCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuc2Vjb25kO1xudmFyIHRoaXJkID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS50aGlyZDtcbnZhciByZXN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5yZXN0O1xudmFyIG1hcCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkubWFwO1xudmFyIHZlYyA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkudmVjO1xudmFyIGNvbnMgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmNvbnM7XG52YXIgY29uaiA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY29uajtcbnZhciByZXN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5yZXN0O1xudmFyIGNvbmNhdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY29uY2F0O1xudmFyIGxhc3QgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmxhc3Q7XG52YXIgYnV0bGFzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuYnV0bGFzdDtcbnZhciBzb3J0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5zb3J0O1xudmFyIGxhenlTZXEgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmxhenlTZXE7XG52YXIgaXNPZGQgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNPZGQ7XG52YXIgZGljdGlvbmFyeSA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5kaWN0aW9uYXJ5O1xudmFyIGtleXMgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkua2V5cztcbnZhciBpc05pbCA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc05pbDtcbnZhciBpbmMgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaW5jO1xudmFyIGRlYyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5kZWM7XG52YXIgaXNWZWN0b3IgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNWZWN0b3I7XG52YXIgaXNTdHJpbmcgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNTdHJpbmc7XG52YXIgaXNOdW1iZXIgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNOdW1iZXI7XG52YXIgaXNCb29sZWFuID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzQm9vbGVhbjtcbnZhciBpc09iamVjdCA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc09iamVjdDtcbnZhciBpc0RpY3Rpb25hcnkgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNEaWN0aW9uYXJ5O1xudmFyIHJlUGF0dGVybiA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5yZVBhdHRlcm47XG52YXIgcmVNYXRjaGVzID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLnJlTWF0Y2hlcztcbnZhciByZUZpbmQgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkucmVGaW5kO1xudmFyIHN0ciA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5zdHI7XG52YXIgc3VicyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5zdWJzO1xudmFyIGNoYXIgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuY2hhcjtcbnZhciB2YWxzID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLnZhbHM7XG52YXIgaXNFcXVhbCA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc0VxdWFsO1xudmFyIGlzU3ltYm9sID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkuaXNTeW1ib2w7XG52YXIgc3ltYm9sID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkuc3ltYm9sO1xudmFyIGlzS2V5d29yZCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzS2V5d29yZDtcbnZhciBrZXl3b3JkID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkua2V5d29yZDtcbnZhciBtZXRhID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkubWV0YTtcbnZhciB3aXRoTWV0YSA9IChyZXF1aXJlKFwiLi9hc3RcIikpLndpdGhNZXRhO1xudmFyIG5hbWUgPSAocmVxdWlyZShcIi4vYXN0XCIpKS5uYW1lO1xudmFyIGdlbnN5bSA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmdlbnN5bTtcbnZhciBzcGxpdCA9IChyZXF1aXJlKFwiLi9zdHJpbmdcIikpLnNwbGl0O1xudmFyIGpvaW4gPSAocmVxdWlyZShcIi4vc3RyaW5nXCIpKS5qb2luOztcblxudmFyIHB1c2hCYWNrUmVhZGVyID0gZnVuY3Rpb24gcHVzaEJhY2tSZWFkZXIoc291cmNlLCB1cmkpIHtcbiAgcmV0dXJuIHtcbiAgICBcImxpbmVzXCI6IHNwbGl0KHNvdXJjZSwgXCJcXG5cIiksXG4gICAgXCJidWZmZXJcIjogXCJcIixcbiAgICBcInVyaVwiOiB1cmksXG4gICAgXCJjb2x1bW5cIjogLTEsXG4gICAgXCJsaW5lXCI6IDBcbiAgfTtcbn07XG5leHBvcnRzLnB1c2hCYWNrUmVhZGVyID0gcHVzaEJhY2tSZWFkZXI7XG5cbnZhciBwZWVrQ2hhciA9IGZ1bmN0aW9uIHBlZWtDaGFyKHJlYWRlcikge1xuICB2YXIgbGluZSA9ICgocmVhZGVyIHx8IDApW1wibGluZXNcIl0pWyhyZWFkZXIgfHwgMClbXCJsaW5lXCJdXTtcbiAgdmFyIGNvbHVtbiA9IGluYygocmVhZGVyIHx8IDApW1wiY29sdW1uXCJdKTtcbiAgcmV0dXJuIGlzTmlsKGxpbmUpID9cbiAgICB2b2lkKDApIDpcbiAgICAobGluZVtjb2x1bW5dKSB8fCBcIlxcblwiO1xufTtcbmV4cG9ydHMucGVla0NoYXIgPSBwZWVrQ2hhcjtcblxudmFyIHJlYWRDaGFyID0gZnVuY3Rpb24gcmVhZENoYXIocmVhZGVyKSB7XG4gIHZhciBjaCA9IHBlZWtDaGFyKHJlYWRlcik7XG4gIGlzTmV3bGluZShwZWVrQ2hhcihyZWFkZXIpKSA/XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgKHJlYWRlciB8fCAwKVtcImxpbmVcIl0gPSBpbmMoKHJlYWRlciB8fCAwKVtcImxpbmVcIl0pO1xuICAgICAgcmV0dXJuIChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl0gPSAtMTtcbiAgICB9KSgpIDpcbiAgICAocmVhZGVyIHx8IDApW1wiY29sdW1uXCJdID0gaW5jKChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl0pO1xuICByZXR1cm4gY2g7XG59O1xuZXhwb3J0cy5yZWFkQ2hhciA9IHJlYWRDaGFyO1xuXG52YXIgaXNOZXdsaW5lID0gZnVuY3Rpb24gaXNOZXdsaW5lKGNoKSB7XG4gIHJldHVybiBcIlxcblwiID09PSBjaDtcbn07XG5leHBvcnRzLmlzTmV3bGluZSA9IGlzTmV3bGluZTtcblxudmFyIGlzQnJlYWtpbmdXaGl0ZXNwYWNlID0gZnVuY3Rpb24gaXNCcmVha2luZ1doaXRlc3BhY2UoY2gpIHtcbiAgcmV0dXJuIChjaCA9PT0gXCIgXCIpIHx8IChjaCA9PT0gXCJcXHRcIikgfHwgKGNoID09PSBcIlxcblwiKSB8fCAoY2ggPT09IFwiXFxyXCIpO1xufTtcbmV4cG9ydHMuaXNCcmVha2luZ1doaXRlc3BhY2UgPSBpc0JyZWFraW5nV2hpdGVzcGFjZTtcblxudmFyIGlzV2hpdGVzcGFjZSA9IGZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjaCkge1xuICByZXR1cm4gKGlzQnJlYWtpbmdXaGl0ZXNwYWNlKGNoKSkgfHwgKFwiLFwiID09PSBjaCk7XG59O1xuZXhwb3J0cy5pc1doaXRlc3BhY2UgPSBpc1doaXRlc3BhY2U7XG5cbnZhciBpc051bWVyaWMgPSBmdW5jdGlvbiBpc051bWVyaWMoY2gpIHtcbiAgcmV0dXJuIChjaCA9PT0gXCIwXCIpIHx8IChjaCA9PT0gXCIxXCIpIHx8IChjaCA9PT0gXCIyXCIpIHx8IChjaCA9PT0gXCIzXCIpIHx8IChjaCA9PT0gXCI0XCIpIHx8IChjaCA9PT0gXCI1XCIpIHx8IChjaCA9PT0gXCI2XCIpIHx8IChjaCA9PT0gXCI3XCIpIHx8IChjaCA9PT0gXCI4XCIpIHx8IChjaCA9PT0gXCI5XCIpO1xufTtcbmV4cG9ydHMuaXNOdW1lcmljID0gaXNOdW1lcmljO1xuXG52YXIgaXNDb21tZW50UHJlZml4ID0gZnVuY3Rpb24gaXNDb21tZW50UHJlZml4KGNoKSB7XG4gIHJldHVybiBcIjtcIiA9PT0gY2g7XG59O1xuZXhwb3J0cy5pc0NvbW1lbnRQcmVmaXggPSBpc0NvbW1lbnRQcmVmaXg7XG5cbnZhciBpc051bWJlckxpdGVyYWwgPSBmdW5jdGlvbiBpc051bWJlckxpdGVyYWwocmVhZGVyLCBpbml0Y2gpIHtcbiAgcmV0dXJuIChpc051bWVyaWMoaW5pdGNoKSkgfHwgKCgoXCIrXCIgPT09IGluaXRjaCkgfHwgKFwiLVwiID09PSBpbml0Y2gpKSAmJiAoaXNOdW1lcmljKHBlZWtDaGFyKHJlYWRlcikpKSk7XG59O1xuZXhwb3J0cy5pc051bWJlckxpdGVyYWwgPSBpc051bWJlckxpdGVyYWw7XG5cbnZhciByZWFkZXJFcnJvciA9IGZ1bmN0aW9uIHJlYWRlckVycm9yKHJlYWRlciwgbWVzc2FnZSkge1xuICB2YXIgdGV4dCA9IFwiXCIgKyBtZXNzYWdlICsgXCJcXG5cIiArIFwibGluZTpcIiArICgocmVhZGVyIHx8IDApW1wibGluZVwiXSkgKyBcIlxcblwiICsgXCJjb2x1bW46XCIgKyAoKHJlYWRlciB8fCAwKVtcImNvbHVtblwiXSk7XG4gIHZhciBlcnJvciA9IFN5bnRheEVycm9yKHRleHQsIChyZWFkZXIgfHwgMClbXCJ1cmlcIl0pO1xuICBlcnJvci5saW5lID0gKHJlYWRlciB8fCAwKVtcImxpbmVcIl07XG4gIGVycm9yLmNvbHVtbiA9IChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl07XG4gIGVycm9yLnVyaSA9IChyZWFkZXIgfHwgMClbXCJ1cmlcIl07XG4gIHJldHVybiAoZnVuY3Rpb24oKSB7IHRocm93IGVycm9yOyB9KSgpO1xufTtcbmV4cG9ydHMucmVhZGVyRXJyb3IgPSByZWFkZXJFcnJvcjtcblxudmFyIGlzTWFjcm9UZXJtaW5hdGluZyA9IGZ1bmN0aW9uIGlzTWFjcm9UZXJtaW5hdGluZyhjaCkge1xuICByZXR1cm4gKCEoY2ggPT09IFwiI1wiKSkgJiYgKCEoY2ggPT09IFwiJ1wiKSkgJiYgKCEoY2ggPT09IFwiOlwiKSkgJiYgKG1hY3JvcyhjaCkpO1xufTtcbmV4cG9ydHMuaXNNYWNyb1Rlcm1pbmF0aW5nID0gaXNNYWNyb1Rlcm1pbmF0aW5nO1xuXG52YXIgcmVhZFRva2VuID0gZnVuY3Rpb24gcmVhZFRva2VuKHJlYWRlciwgaW5pdGNoKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChidWZmZXIsIGNoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGlzTmlsKGNoKSkgfHwgKGlzV2hpdGVzcGFjZShjaCkpIHx8IChpc01hY3JvVGVybWluYXRpbmcoY2gpKSA/XG4gICAgICBidWZmZXIgOlxuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyAocmVhZENoYXIocmVhZGVyKSksIGNoID0gcGVla0NoYXIocmVhZGVyKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGluaXRjaCwgcGVla0NoYXIocmVhZGVyKSk7XG59O1xuZXhwb3J0cy5yZWFkVG9rZW4gPSByZWFkVG9rZW47XG5cbnZhciBza2lwTGluZSA9IGZ1bmN0aW9uIHNraXBMaW5lKHJlYWRlciwgXykge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNoID0gcmVhZENoYXIocmVhZGVyKTtcbiAgICAgIHJldHVybiAoY2ggPT09IFwiXFxuXCIpIHx8IChjaCA9PT0gXCJcXHJcIikgfHwgKGlzTmlsKGNoKSkgP1xuICAgICAgICByZWFkZXIgOlxuICAgICAgICAobG9vcCk7XG4gICAgfSkoKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoKTtcbn07XG5leHBvcnRzLnNraXBMaW5lID0gc2tpcExpbmU7XG5cbnZhciBpbnRQYXR0ZXJuID0gcmVQYXR0ZXJuKFwiXihbLStdPykoPzooMCl8KFsxLTldWzAtOV0qKXwwW3hYXShbMC05QS1GYS1mXSspfDAoWzAtN10rKXwoWzEtOV1bMC05XT8pW3JSXShbMC05QS1aYS16XSspfDBbMC05XSspKE4pPyRcIik7XG5leHBvcnRzLmludFBhdHRlcm4gPSBpbnRQYXR0ZXJuO1xuXG52YXIgcmF0aW9QYXR0ZXJuID0gcmVQYXR0ZXJuKFwiKFstK10/WzAtOV0rKS8oWzAtOV0rKVwiKTtcbmV4cG9ydHMucmF0aW9QYXR0ZXJuID0gcmF0aW9QYXR0ZXJuO1xuXG52YXIgZmxvYXRQYXR0ZXJuID0gcmVQYXR0ZXJuKFwiKFstK10/WzAtOV0rKFxcXFwuWzAtOV0qKT8oW2VFXVstK10/WzAtOV0rKT8pKE0pP1wiKTtcbmV4cG9ydHMuZmxvYXRQYXR0ZXJuID0gZmxvYXRQYXR0ZXJuO1xuXG52YXIgbWF0Y2hJbnQgPSBmdW5jdGlvbiBtYXRjaEludChzKSB7XG4gIHZhciBncm91cHMgPSByZUZpbmQoaW50UGF0dGVybiwgcyk7XG4gIHZhciBncm91cDMgPSBncm91cHNbMl07XG4gIHJldHVybiAhKChpc05pbChncm91cDMpKSB8fCAoY291bnQoZ3JvdXAzKSA8IDEpKSA/XG4gICAgMCA6XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5lZ2F0ZSA9IFwiLVwiID09PSBncm91cHNbMV0gP1xuICAgICAgICAtMSA6XG4gICAgICAgIDE7XG4gICAgICB2YXIgYSA9IGdyb3Vwc1szXSA/XG4gICAgICAgIFtncm91cHNbM10sIDEwXSA6XG4gICAgICBncm91cHNbNF0gP1xuICAgICAgICBbZ3JvdXBzWzRdLCAxNl0gOlxuICAgICAgZ3JvdXBzWzVdID9cbiAgICAgICAgW2dyb3Vwc1s1XSwgOF0gOlxuICAgICAgZ3JvdXBzWzddID9cbiAgICAgICAgW2dyb3Vwc1s3XSwgcGFyc2VJbnQoZ3JvdXBzWzddKV0gOlxuICAgICAgXCJlbHNlXCIgP1xuICAgICAgICBbdm9pZCgwKSwgdm9pZCgwKV0gOlxuICAgICAgICB2b2lkKDApO1xuICAgICAgdmFyIG4gPSBhWzBdO1xuICAgICAgdmFyIHJhZGl4ID0gYVsxXTtcbiAgICAgIHJldHVybiBpc05pbChuKSA/XG4gICAgICAgIHZvaWQoMCkgOlxuICAgICAgICBuZWdhdGUgKiAocGFyc2VJbnQobiwgcmFkaXgpKTtcbiAgICB9KSgpO1xufTtcbmV4cG9ydHMubWF0Y2hJbnQgPSBtYXRjaEludDtcblxudmFyIG1hdGNoUmF0aW8gPSBmdW5jdGlvbiBtYXRjaFJhdGlvKHMpIHtcbiAgdmFyIGdyb3VwcyA9IHJlRmluZChyYXRpb1BhdHRlcm4sIHMpO1xuICB2YXIgbnVtaW5hdG9yID0gZ3JvdXBzWzFdO1xuICB2YXIgZGVub21pbmF0b3IgPSBncm91cHNbMl07XG4gIHJldHVybiAocGFyc2VJbnQobnVtaW5hdG9yKSkgLyAocGFyc2VJbnQoZGVub21pbmF0b3IpKTtcbn07XG5leHBvcnRzLm1hdGNoUmF0aW8gPSBtYXRjaFJhdGlvO1xuXG52YXIgbWF0Y2hGbG9hdCA9IGZ1bmN0aW9uIG1hdGNoRmxvYXQocykge1xuICByZXR1cm4gcGFyc2VGbG9hdChzKTtcbn07XG5leHBvcnRzLm1hdGNoRmxvYXQgPSBtYXRjaEZsb2F0O1xuXG52YXIgbWF0Y2hOdW1iZXIgPSBmdW5jdGlvbiBtYXRjaE51bWJlcihzKSB7XG4gIHJldHVybiByZU1hdGNoZXMoaW50UGF0dGVybiwgcykgP1xuICAgIG1hdGNoSW50KHMpIDpcbiAgcmVNYXRjaGVzKHJhdGlvUGF0dGVybiwgcykgP1xuICAgIG1hdGNoUmF0aW8ocykgOlxuICByZU1hdGNoZXMoZmxvYXRQYXR0ZXJuLCBzKSA/XG4gICAgbWF0Y2hGbG9hdChzKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm1hdGNoTnVtYmVyID0gbWF0Y2hOdW1iZXI7XG5cbnZhciBlc2NhcGVDaGFyTWFwID0gZnVuY3Rpb24gZXNjYXBlQ2hhck1hcChjKSB7XG4gIHJldHVybiBjID09PSBcInRcIiA/XG4gICAgXCJcXHRcIiA6XG4gIGMgPT09IFwiclwiID9cbiAgICBcIlxcclwiIDpcbiAgYyA9PT0gXCJuXCIgP1xuICAgIFwiXFxuXCIgOlxuICBjID09PSBcIlxcXFxcIiA/XG4gICAgXCJcXFxcXCIgOlxuICBjID09PSBcIlxcXCJcIiA/XG4gICAgXCJcXFwiXCIgOlxuICBjID09PSBcImJcIiA/XG4gICAgXCJcYlwiIDpcbiAgYyA9PT0gXCJmXCIgP1xuICAgIFwiXGZcIiA6XG4gIFwiZWxzZVwiID9cbiAgICB2b2lkKDApIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuZXNjYXBlQ2hhck1hcCA9IGVzY2FwZUNoYXJNYXA7XG5cbnZhciByZWFkMkNoYXJzID0gZnVuY3Rpb24gcmVhZDJDaGFycyhyZWFkZXIpIHtcbiAgcmV0dXJuIFwiXCIgKyAocmVhZENoYXIocmVhZGVyKSkgKyAocmVhZENoYXIocmVhZGVyKSk7XG59O1xuZXhwb3J0cy5yZWFkMkNoYXJzID0gcmVhZDJDaGFycztcblxudmFyIHJlYWQ0Q2hhcnMgPSBmdW5jdGlvbiByZWFkNENoYXJzKHJlYWRlcikge1xuICByZXR1cm4gXCJcIiArIChyZWFkQ2hhcihyZWFkZXIpKSArIChyZWFkQ2hhcihyZWFkZXIpKSArIChyZWFkQ2hhcihyZWFkZXIpKSArIChyZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWQ0Q2hhcnMgPSByZWFkNENoYXJzO1xuXG52YXIgdW5pY29kZTJQYXR0ZXJuID0gcmVQYXR0ZXJuKFwiWzAtOUEtRmEtZl17Mn1cIik7XG5leHBvcnRzLnVuaWNvZGUyUGF0dGVybiA9IHVuaWNvZGUyUGF0dGVybjtcblxudmFyIHVuaWNvZGU0UGF0dGVybiA9IHJlUGF0dGVybihcIlswLTlBLUZhLWZdezR9XCIpO1xuZXhwb3J0cy51bmljb2RlNFBhdHRlcm4gPSB1bmljb2RlNFBhdHRlcm47XG5cbnZhciB2YWxpZGF0ZVVuaWNvZGVFc2NhcGUgPSBmdW5jdGlvbiB2YWxpZGF0ZVVuaWNvZGVFc2NhcGUodW5pY29kZVBhdHRlcm4sIHJlYWRlciwgZXNjYXBlQ2hhciwgdW5pY29kZVN0cikge1xuICByZXR1cm4gcmVNYXRjaGVzKHVuaWNvZGVQYXR0ZXJuLCB1bmljb2RlU3RyKSA/XG4gICAgdW5pY29kZVN0ciA6XG4gICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIlwiICsgXCJVbmV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlIFwiICsgXCJcXFxcXCIgKyBlc2NhcGVDaGFyICsgdW5pY29kZVN0cik7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVVuaWNvZGVFc2NhcGUgPSB2YWxpZGF0ZVVuaWNvZGVFc2NhcGU7XG5cbnZhciBtYWtlVW5pY29kZUNoYXIgPSBmdW5jdGlvbiBtYWtlVW5pY29kZUNoYXIoY29kZVN0ciwgYmFzZSkge1xuICB2YXIgYmFzZSA9IGJhc2UgfHwgMTY7XG4gIHZhciBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgYmFzZSk7XG4gIHJldHVybiBjaGFyKGNvZGUpO1xufTtcbmV4cG9ydHMubWFrZVVuaWNvZGVDaGFyID0gbWFrZVVuaWNvZGVDaGFyO1xuXG52YXIgZXNjYXBlQ2hhciA9IGZ1bmN0aW9uIGVzY2FwZUNoYXIoYnVmZmVyLCByZWFkZXIpIHtcbiAgdmFyIGNoID0gcmVhZENoYXIocmVhZGVyKTtcbiAgdmFyIG1hcHJlc3VsdCA9IGVzY2FwZUNoYXJNYXAoY2gpO1xuICByZXR1cm4gbWFwcmVzdWx0ID9cbiAgICBtYXByZXN1bHQgOlxuICBjaCA9PT0gXCJ4XCIgP1xuICAgIG1ha2VVbmljb2RlQ2hhcih2YWxpZGF0ZVVuaWNvZGVFc2NhcGUodW5pY29kZTJQYXR0ZXJuLCByZWFkZXIsIGNoLCByZWFkMkNoYXJzKHJlYWRlcikpKSA6XG4gIGNoID09PSBcInVcIiA/XG4gICAgbWFrZVVuaWNvZGVDaGFyKHZhbGlkYXRlVW5pY29kZUVzY2FwZSh1bmljb2RlNFBhdHRlcm4sIHJlYWRlciwgY2gsIHJlYWQ0Q2hhcnMocmVhZGVyKSkpIDpcbiAgaXNOdW1lcmljKGNoKSA/XG4gICAgY2hhcihjaCkgOlxuICBcImVsc2VcIiA/XG4gICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIlwiICsgXCJVbmV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlIFwiICsgXCJcXFxcXCIgKyBjaCkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5lc2NhcGVDaGFyID0gZXNjYXBlQ2hhcjtcblxudmFyIHJlYWRQYXN0ID0gZnVuY3Rpb24gcmVhZFBhc3QocHJlZGljYXRlLCByZWFkZXIpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKF8pIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBwcmVkaWNhdGUocGVla0NoYXIocmVhZGVyKSkgP1xuICAgICAgKF8gPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICBwZWVrQ2hhcihyZWFkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KSh2b2lkKDApKTtcbn07XG5leHBvcnRzLnJlYWRQYXN0ID0gcmVhZFBhc3Q7XG5cbnZhciByZWFkRGVsaW1pdGVkTGlzdCA9IGZ1bmN0aW9uIHJlYWREZWxpbWl0ZWRMaXN0KGRlbGltLCByZWFkZXIsIGlzUmVjdXJzaXZlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChmb3JtKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNoID0gcmVhZFBhc3QoaXNXaGl0ZXNwYWNlLCByZWFkZXIpO1xuICAgICAgIShjaCkgP1xuICAgICAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiRU9GXCIpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICAgIHJldHVybiBkZWxpbSA9PT0gY2ggP1xuICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmVhZENoYXIocmVhZGVyKTtcbiAgICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgICAgfSkoKSA6XG4gICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgbWFjcm8gPSBtYWNyb3MoY2gpO1xuICAgICAgICAgIHJldHVybiBtYWNybyA/XG4gICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSBtYWNybyhyZWFkZXIsIHJlYWRDaGFyKHJlYWRlcikpO1xuICAgICAgICAgICAgICByZXR1cm4gKGZvcm0gPSByZXN1bHQgPT09IHJlYWRlciA/XG4gICAgICAgICAgICAgICAgZm9ybSA6XG4gICAgICAgICAgICAgICAgY29uaihmb3JtLCByZXN1bHQpLCBsb29wKTtcbiAgICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgbyA9IHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCBpc1JlY3Vyc2l2ZSk7XG4gICAgICAgICAgICAgIHJldHVybiAoZm9ybSA9IG8gPT09IHJlYWRlciA/XG4gICAgICAgICAgICAgICAgZm9ybSA6XG4gICAgICAgICAgICAgICAgY29uaihmb3JtLCBvKSwgbG9vcCk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9KSgpO1xuICAgIH0pKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdKTtcbn07XG5leHBvcnRzLnJlYWREZWxpbWl0ZWRMaXN0ID0gcmVhZERlbGltaXRlZExpc3Q7XG5cbnZhciBub3RJbXBsZW1lbnRlZCA9IGZ1bmN0aW9uIG5vdEltcGxlbWVudGVkKHJlYWRlciwgY2gpIHtcbiAgcmV0dXJuIHJlYWRlckVycm9yKHJlYWRlciwgXCJcIiArIFwiUmVhZGVyIGZvciBcIiArIGNoICsgXCIgbm90IGltcGxlbWVudGVkIHlldFwiKTtcbn07XG5leHBvcnRzLm5vdEltcGxlbWVudGVkID0gbm90SW1wbGVtZW50ZWQ7XG5cbnZhciByZWFkRGlzcGF0Y2ggPSBmdW5jdGlvbiByZWFkRGlzcGF0Y2gocmVhZGVyLCBfKSB7XG4gIHZhciBjaCA9IHJlYWRDaGFyKHJlYWRlcik7XG4gIHZhciBkbSA9IGRpc3BhdGNoTWFjcm9zKGNoKTtcbiAgcmV0dXJuIGRtID9cbiAgICBkbShyZWFkZXIsIF8pIDpcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gbWF5YmVSZWFkVGFnZ2VkVHlwZShyZWFkZXIsIGNoKTtcbiAgICAgIHJldHVybiBvYmplY3QgP1xuICAgICAgICBvYmplY3QgOlxuICAgICAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiTm8gZGlzcGF0Y2ggbWFjcm8gZm9yIFwiLCBjaCk7XG4gICAgfSkoKTtcbn07XG5leHBvcnRzLnJlYWREaXNwYXRjaCA9IHJlYWREaXNwYXRjaDtcblxudmFyIHJlYWRVbm1hdGNoZWREZWxpbWl0ZXIgPSBmdW5jdGlvbiByZWFkVW5tYXRjaGVkRGVsaW1pdGVyKHJkciwgY2gpIHtcbiAgcmV0dXJuIHJlYWRlckVycm9yKHJkciwgXCJVbm1hY2hlZCBkZWxpbWl0ZXIgXCIsIGNoKTtcbn07XG5leHBvcnRzLnJlYWRVbm1hdGNoZWREZWxpbWl0ZXIgPSByZWFkVW5tYXRjaGVkRGVsaW1pdGVyO1xuXG52YXIgcmVhZExpc3QgPSBmdW5jdGlvbiByZWFkTGlzdChyZWFkZXIsIF8pIHtcbiAgdmFyIGZvcm0gPSByZWFkRGVsaW1pdGVkTGlzdChcIilcIiwgcmVhZGVyLCB0cnVlKTtcbiAgcmV0dXJuIHdpdGhNZXRhKGxpc3QuYXBwbHkobGlzdCwgZm9ybSksIG1ldGEoZm9ybSkpO1xufTtcbmV4cG9ydHMucmVhZExpc3QgPSByZWFkTGlzdDtcblxudmFyIHJlYWRDb21tZW50ID0gZnVuY3Rpb24gcmVhZENvbW1lbnQocmVhZGVyLCBfKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChidWZmZXIsIGNoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGlzTmlsKGNoKSkgfHwgKFwiXFxuXCIgPT09IGNoKSA/XG4gICAgICByZWFkZXIgfHwgKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiY29tbWVudFwiKSwgYnVmZmVyKSkgOlxuICAgIChcIlxcXFxcIiA9PT0gY2gpID9cbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgKGVzY2FwZUNoYXIoYnVmZmVyLCByZWFkZXIpKSwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgXCJlbHNlXCIgP1xuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyBjaCwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICB2b2lkKDApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCByZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWRDb21tZW50ID0gcmVhZENvbW1lbnQ7XG5cbnZhciByZWFkVmVjdG9yID0gZnVuY3Rpb24gcmVhZFZlY3RvcihyZWFkZXIpIHtcbiAgcmV0dXJuIHJlYWREZWxpbWl0ZWRMaXN0KFwiXVwiLCByZWFkZXIsIHRydWUpO1xufTtcbmV4cG9ydHMucmVhZFZlY3RvciA9IHJlYWRWZWN0b3I7XG5cbnZhciByZWFkTWFwID0gZnVuY3Rpb24gcmVhZE1hcChyZWFkZXIpIHtcbiAgdmFyIGZvcm0gPSByZWFkRGVsaW1pdGVkTGlzdChcIn1cIiwgcmVhZGVyLCB0cnVlKTtcbiAgcmV0dXJuIGlzT2RkKGNvdW50KGZvcm0pKSA/XG4gICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIk1hcCBsaXRlcmFsIG11c3QgY29udGFpbiBhbiBldmVuIG51bWJlciBvZiBmb3Jtc1wiKSA6XG4gICAgd2l0aE1ldGEoZGljdGlvbmFyeS5hcHBseShkaWN0aW9uYXJ5LCBmb3JtKSwgbWV0YShmb3JtKSk7XG59O1xuZXhwb3J0cy5yZWFkTWFwID0gcmVhZE1hcDtcblxudmFyIHJlYWRTZXQgPSBmdW5jdGlvbiByZWFkU2V0KHJlYWRlciwgXykge1xuICB2YXIgZm9ybSA9IHJlYWREZWxpbWl0ZWRMaXN0KFwifVwiLCByZWFkZXIsIHRydWUpO1xuICByZXR1cm4gd2l0aE1ldGEoY29uY2F0KFtzeW1ib2wodm9pZCgwKSwgXCJzZXRcIildLCBmb3JtKSwgbWV0YShmb3JtKSk7XG59O1xuZXhwb3J0cy5yZWFkU2V0ID0gcmVhZFNldDtcblxudmFyIHJlYWROdW1iZXIgPSBmdW5jdGlvbiByZWFkTnVtYmVyKHJlYWRlciwgaW5pdGNoKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChidWZmZXIsIGNoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGlzTmlsKGNoKSkgfHwgKGlzV2hpdGVzcGFjZShjaCkpIHx8IChtYWNyb3MoY2gpKSA/XG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IG1hdGNoTnVtYmVyKGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBpc05pbChtYXRjaCkgP1xuICAgICAgICAgIHJlYWRlckVycm9yKHJlYWRlciwgXCJJbnZhbGlkIG51bWJlciBmb3JtYXQgW1wiLCBidWZmZXIsIFwiXVwiKSA6XG4gICAgICAgICAgbWF0Y2g7XG4gICAgICB9KSgpIDpcbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgKHJlYWRDaGFyKHJlYWRlcikpLCBjaCA9IHBlZWtDaGFyKHJlYWRlciksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShpbml0Y2gsIHBlZWtDaGFyKHJlYWRlcikpO1xufTtcbmV4cG9ydHMucmVhZE51bWJlciA9IHJlYWROdW1iZXI7XG5cbnZhciByZWFkU3RyaW5nID0gZnVuY3Rpb24gcmVhZFN0cmluZyhyZWFkZXIpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKGJ1ZmZlciwgY2gpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc05pbChjaCkgP1xuICAgICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIkVPRiB3aGlsZSByZWFkaW5nIHN0cmluZ1wiKSA6XG4gICAgXCJcXFxcXCIgPT09IGNoID9cbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgKGVzY2FwZUNoYXIoYnVmZmVyLCByZWFkZXIpKSwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgXCJcXFwiXCIgPT09IGNoID9cbiAgICAgIGJ1ZmZlciA6XG4gICAgXCJkZWZhdWx0XCIgP1xuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyBjaCwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICB2b2lkKDApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCByZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWRTdHJpbmcgPSByZWFkU3RyaW5nO1xuXG52YXIgcmVhZFVucXVvdGUgPSBmdW5jdGlvbiByZWFkVW5xdW90ZShyZWFkZXIpIHtcbiAgdmFyIGNoID0gcGVla0NoYXIocmVhZGVyKTtcbiAgcmV0dXJuICEoY2gpID9cbiAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiRU9GIHdoaWxlIHJlYWRpbmcgY2hhcmFjdGVyXCIpIDpcbiAgY2ggPT09IFwiQFwiID9cbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICByZWFkQ2hhcihyZWFkZXIpO1xuICAgICAgcmV0dXJuIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwidW5xdW90ZS1zcGxpY2luZ1wiKSwgcmVhZChyZWFkZXIsIHRydWUsIHZvaWQoMCksIHRydWUpKTtcbiAgICB9KSgpIDpcbiAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInVucXVvdGVcIiksIHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCB0cnVlKSk7XG59O1xuZXhwb3J0cy5yZWFkVW5xdW90ZSA9IHJlYWRVbnF1b3RlO1xuXG52YXIgc3BlY2lhbFN5bWJvbHMgPSBmdW5jdGlvbiBzcGVjaWFsU3ltYm9scyh0ZXh0LCBub3RGb3VuZCkge1xuICByZXR1cm4gdGV4dCA9PT0gXCJuaWxcIiA/XG4gICAgdm9pZCgwKSA6XG4gIHRleHQgPT09IFwidHJ1ZVwiID9cbiAgICB0cnVlIDpcbiAgdGV4dCA9PT0gXCJmYWxzZVwiID9cbiAgICBmYWxzZSA6XG4gIFwiZWxzZVwiID9cbiAgICBub3RGb3VuZCA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnNwZWNpYWxTeW1ib2xzID0gc3BlY2lhbFN5bWJvbHM7XG5cbnZhciByZWFkU3ltYm9sID0gZnVuY3Rpb24gcmVhZFN5bWJvbChyZWFkZXIsIGluaXRjaCkge1xuICB2YXIgdG9rZW4gPSByZWFkVG9rZW4ocmVhZGVyLCBpbml0Y2gpO1xuICB2YXIgcGFydHMgPSBzcGxpdCh0b2tlbiwgXCIvXCIpO1xuICB2YXIgaGFzTnMgPSAoY291bnQocGFydHMpID4gMSkgJiYgKGNvdW50KHRva2VuKSA+IDEpO1xuICB2YXIgbnMgPSBmaXJzdChwYXJ0cyk7XG4gIHZhciBuYW1lID0gam9pbihcIi9cIiwgcmVzdChwYXJ0cykpO1xuICByZXR1cm4gaGFzTnMgP1xuICAgIHN5bWJvbChucywgbmFtZSkgOlxuICAgIHNwZWNpYWxTeW1ib2xzKHRva2VuLCBzeW1ib2wodG9rZW4pKTtcbn07XG5leHBvcnRzLnJlYWRTeW1ib2wgPSByZWFkU3ltYm9sO1xuXG52YXIgcmVhZEtleXdvcmQgPSBmdW5jdGlvbiByZWFkS2V5d29yZChyZWFkZXIsIGluaXRjaCkge1xuICB2YXIgdG9rZW4gPSByZWFkVG9rZW4ocmVhZGVyLCByZWFkQ2hhcihyZWFkZXIpKTtcbiAgdmFyIHBhcnRzID0gc3BsaXQodG9rZW4sIFwiL1wiKTtcbiAgdmFyIG5hbWUgPSBsYXN0KHBhcnRzKTtcbiAgdmFyIG5zID0gY291bnQocGFydHMpID4gMSA/XG4gICAgam9pbihcIi9cIiwgYnV0bGFzdChwYXJ0cykpIDpcbiAgICB2b2lkKDApO1xuICB2YXIgaXNzdWUgPSBsYXN0KG5zKSA9PT0gXCI6XCIgP1xuICAgIFwibmFtZXNwYWNlIGNhbid0IGVuZHMgd2l0aCBcXFwiOlxcXCJcIiA6XG4gIGxhc3QobmFtZSkgPT09IFwiOlwiID9cbiAgICBcIm5hbWUgY2FuJ3QgZW5kIHdpdGggXFxcIjpcXFwiXCIgOlxuICBsYXN0KG5hbWUpID09PSBcIi9cIiA/XG4gICAgXCJuYW1lIGNhbid0IGVuZCB3aXRoIFxcXCIvXFxcIlwiIDpcbiAgY291bnQoc3BsaXQodG9rZW4sIFwiOjpcIikpID4gMSA/XG4gICAgXCJuYW1lIGNhbid0IGNvbnRhaW4gXFxcIjo6XFxcIlwiIDpcbiAgICB2b2lkKDApO1xuICByZXR1cm4gaXNzdWUgP1xuICAgIHJlYWRlckVycm9yKHJlYWRlciwgXCJJbnZhbGlkIHRva2VuIChcIiwgaXNzdWUsIFwiKTogXCIsIHRva2VuKSA6XG4gICghKG5zKSkgJiYgKGZpcnN0KG5hbWUpID09PSBcIjpcIikgP1xuICAgIGtleXdvcmQocmVzdChuYW1lKSkgOlxuICAgIGtleXdvcmQobnMsIG5hbWUpO1xufTtcbmV4cG9ydHMucmVhZEtleXdvcmQgPSByZWFkS2V5d29yZDtcblxudmFyIGRlc3VnYXJNZXRhID0gZnVuY3Rpb24gZGVzdWdhck1ldGEoZikge1xuICByZXR1cm4gaXNLZXl3b3JkKGYpID9cbiAgICBkaWN0aW9uYXJ5KG5hbWUoZiksIHRydWUpIDpcbiAgaXNTeW1ib2woZikgP1xuICAgIHtcbiAgICAgIFwidGFnXCI6IGZcbiAgICB9IDpcbiAgaXNTdHJpbmcoZikgP1xuICAgIHtcbiAgICAgIFwidGFnXCI6IGZcbiAgICB9IDpcbiAgXCJlbHNlXCIgP1xuICAgIGYgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5kZXN1Z2FyTWV0YSA9IGRlc3VnYXJNZXRhO1xuXG52YXIgd3JhcHBpbmdSZWFkZXIgPSBmdW5jdGlvbiB3cmFwcGluZ1JlYWRlcihwcmVmaXgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHJlYWRlcikge1xuICAgIHJldHVybiBsaXN0KHByZWZpeCwgcmVhZChyZWFkZXIsIHRydWUsIHZvaWQoMCksIHRydWUpKTtcbiAgfTtcbn07XG5leHBvcnRzLndyYXBwaW5nUmVhZGVyID0gd3JhcHBpbmdSZWFkZXI7XG5cbnZhciB0aHJvd2luZ1JlYWRlciA9IGZ1bmN0aW9uIHRocm93aW5nUmVhZGVyKG1zZykge1xuICByZXR1cm4gZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgcmV0dXJuIHJlYWRlckVycm9yKHJlYWRlciwgbXNnKTtcbiAgfTtcbn07XG5leHBvcnRzLnRocm93aW5nUmVhZGVyID0gdGhyb3dpbmdSZWFkZXI7XG5cbnZhciByZWFkTWV0YSA9IGZ1bmN0aW9uIHJlYWRNZXRhKHJlYWRlciwgXykge1xuICB2YXIgbWV0YWRhdGEgPSBkZXN1Z2FyTWV0YShyZWFkKHJlYWRlciwgdHJ1ZSwgdm9pZCgwKSwgdHJ1ZSkpO1xuICAhKGlzRGljdGlvbmFyeShtZXRhZGF0YSkpID9cbiAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiTWV0YWRhdGEgbXVzdCBiZSBTeW1ib2wsIEtleXdvcmQsIFN0cmluZyBvciBNYXBcIikgOlxuICAgIHZvaWQoMCk7XG4gIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm0gPSByZWFkKHJlYWRlciwgdHJ1ZSwgdm9pZCgwKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGZvcm0pID9cbiAgICAgIHdpdGhNZXRhKGZvcm0sIGNvbmoobWV0YWRhdGEsIG1ldGEoZm9ybSkpKSA6XG4gICAgICBmb3JtO1xuICB9KSgpO1xufTtcbmV4cG9ydHMucmVhZE1ldGEgPSByZWFkTWV0YTtcblxudmFyIHJlYWRSZWdleCA9IGZ1bmN0aW9uIHJlYWRSZWdleChyZWFkZXIpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKGJ1ZmZlciwgY2gpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc05pbChjaCkgP1xuICAgICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIkVPRiB3aGlsZSByZWFkaW5nIHN0cmluZ1wiKSA6XG4gICAgXCJcXFxcXCIgPT09IGNoID9cbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgY2ggKyAocmVhZENoYXIocmVhZGVyKSksIGNoID0gcmVhZENoYXIocmVhZGVyKSwgbG9vcCkgOlxuICAgIFwiXFxcIlwiID09PSBjaCA/XG4gICAgICByZVBhdHRlcm4oYnVmZmVyKSA6XG4gICAgXCJkZWZhdWx0XCIgP1xuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyBjaCwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICB2b2lkKDApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCByZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWRSZWdleCA9IHJlYWRSZWdleDtcblxudmFyIHJlYWRQYXJhbSA9IGZ1bmN0aW9uIHJlYWRQYXJhbShyZWFkZXIsIGluaXRjaCkge1xuICB2YXIgZm9ybSA9IHJlYWRTeW1ib2wocmVhZGVyLCBpbml0Y2gpO1xuICByZXR1cm4gaXNFcXVhbChmb3JtLCBzeW1ib2woXCIlXCIpKSA/XG4gICAgc3ltYm9sKFwiJTFcIikgOlxuICAgIGZvcm07XG59O1xuZXhwb3J0cy5yZWFkUGFyYW0gPSByZWFkUGFyYW07XG5cbnZhciBpc1BhcmFtID0gZnVuY3Rpb24gaXNQYXJhbShmb3JtKSB7XG4gIHJldHVybiAoaXNTeW1ib2woZm9ybSkpICYmIChcIiVcIiA9PT0gZmlyc3QobmFtZShmb3JtKSkpO1xufTtcbmV4cG9ydHMuaXNQYXJhbSA9IGlzUGFyYW07XG5cbnZhciBsYW1iZGFQYXJhbXNIYXNoID0gZnVuY3Rpb24gbGFtYmRhUGFyYW1zSGFzaChmb3JtKSB7XG4gIHJldHVybiBpc1BhcmFtKGZvcm0pID9cbiAgICBkaWN0aW9uYXJ5KGZvcm0sIGZvcm0pIDpcbiAgKGlzRGljdGlvbmFyeShmb3JtKSkgfHwgKGlzVmVjdG9yKGZvcm0pKSB8fCAoaXNMaXN0KGZvcm0pKSA/XG4gICAgY29uai5hcHBseShjb25qLCBtYXAobGFtYmRhUGFyYW1zSGFzaCwgdmVjKGZvcm0pKSkgOlxuICBcImVsc2VcIiA/XG4gICAge30gOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5sYW1iZGFQYXJhbXNIYXNoID0gbGFtYmRhUGFyYW1zSGFzaDtcblxudmFyIGxhbWJkYVBhcmFtcyA9IGZ1bmN0aW9uIGxhbWJkYVBhcmFtcyhib2R5KSB7XG4gIHZhciBuYW1lcyA9IHNvcnQodmFscyhsYW1iZGFQYXJhbXNIYXNoKGJvZHkpKSk7XG4gIHZhciB2YXJpYWRpYyA9IGlzRXF1YWwoZmlyc3QobmFtZXMpLCBzeW1ib2woXCIlJlwiKSk7XG4gIHZhciBuID0gdmFyaWFkaWMgJiYgKGNvdW50KG5hbWVzKSA9PT0gMSkgP1xuICAgIDAgOlxuICAgIHBhcnNlSW50KHJlc3QobmFtZShsYXN0KG5hbWVzKSkpKTtcbiAgdmFyIHBhcmFtcyA9IChmdW5jdGlvbiBsb29wKG5hbWVzLCBpKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaSA8PSBuID9cbiAgICAgIChuYW1lcyA9IGNvbmoobmFtZXMsIHN5bWJvbChcIlwiICsgXCIlXCIgKyBpKSksIGkgPSBpbmMoaSksIGxvb3ApIDpcbiAgICAgIG5hbWVzO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShbXSwgMSk7XG4gIHJldHVybiB2YXJpYWRpYyA/XG4gICAgY29uaihwYXJhbXMsIHN5bWJvbCh2b2lkKDApLCBcIiZcIiksIHN5bWJvbCh2b2lkKDApLCBcIiUmXCIpKSA6XG4gICAgbmFtZXM7XG59O1xuZXhwb3J0cy5sYW1iZGFQYXJhbXMgPSBsYW1iZGFQYXJhbXM7XG5cbnZhciByZWFkTGFtYmRhID0gZnVuY3Rpb24gcmVhZExhbWJkYShyZWFkZXIpIHtcbiAgdmFyIGJvZHkgPSByZWFkTGlzdChyZWFkZXIpO1xuICByZXR1cm4gbGlzdChzeW1ib2wodm9pZCgwKSwgXCJmblwiKSwgbGFtYmRhUGFyYW1zKGJvZHkpLCBib2R5KTtcbn07XG5leHBvcnRzLnJlYWRMYW1iZGEgPSByZWFkTGFtYmRhO1xuXG52YXIgcmVhZERpc2NhcmQgPSBmdW5jdGlvbiByZWFkRGlzY2FyZChyZWFkZXIsIF8pIHtcbiAgcmVhZChyZWFkZXIsIHRydWUsIHZvaWQoMCksIHRydWUpO1xuICByZXR1cm4gcmVhZGVyO1xufTtcbmV4cG9ydHMucmVhZERpc2NhcmQgPSByZWFkRGlzY2FyZDtcblxudmFyIG1hY3JvcyA9IGZ1bmN0aW9uIG1hY3JvcyhjKSB7XG4gIHJldHVybiBjID09PSBcIlxcXCJcIiA/XG4gICAgcmVhZFN0cmluZyA6XG4gIGMgPT09IFwiOlwiID9cbiAgICByZWFkS2V5d29yZCA6XG4gIGMgPT09IFwiO1wiID9cbiAgICByZWFkQ29tbWVudCA6XG4gIGMgPT09IFwiJ1wiID9cbiAgICB3cmFwcGluZ1JlYWRlcihzeW1ib2wodm9pZCgwKSwgXCJxdW90ZVwiKSkgOlxuICBjID09PSBcIkBcIiA/XG4gICAgd3JhcHBpbmdSZWFkZXIoc3ltYm9sKHZvaWQoMCksIFwiZGVyZWZcIikpIDpcbiAgYyA9PT0gXCJeXCIgP1xuICAgIHJlYWRNZXRhIDpcbiAgYyA9PT0gXCJgXCIgP1xuICAgIHdyYXBwaW5nUmVhZGVyKHN5bWJvbCh2b2lkKDApLCBcInN5bnRheC1xdW90ZVwiKSkgOlxuICBjID09PSBcIn5cIiA/XG4gICAgcmVhZFVucXVvdGUgOlxuICBjID09PSBcIihcIiA/XG4gICAgcmVhZExpc3QgOlxuICBjID09PSBcIilcIiA/XG4gICAgcmVhZFVubWF0Y2hlZERlbGltaXRlciA6XG4gIGMgPT09IFwiW1wiID9cbiAgICByZWFkVmVjdG9yIDpcbiAgYyA9PT0gXCJdXCIgP1xuICAgIHJlYWRVbm1hdGNoZWREZWxpbWl0ZXIgOlxuICBjID09PSBcIntcIiA/XG4gICAgcmVhZE1hcCA6XG4gIGMgPT09IFwifVwiID9cbiAgICByZWFkVW5tYXRjaGVkRGVsaW1pdGVyIDpcbiAgYyA9PT0gXCJcXFxcXCIgP1xuICAgIHJlYWRDaGFyIDpcbiAgYyA9PT0gXCIlXCIgP1xuICAgIHJlYWRQYXJhbSA6XG4gIGMgPT09IFwiI1wiID9cbiAgICByZWFkRGlzcGF0Y2ggOlxuICBcImVsc2VcIiA/XG4gICAgdm9pZCgwKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm1hY3JvcyA9IG1hY3JvcztcblxudmFyIGRpc3BhdGNoTWFjcm9zID0gZnVuY3Rpb24gZGlzcGF0Y2hNYWNyb3Mocykge1xuICByZXR1cm4gcyA9PT0gXCJ7XCIgP1xuICAgIHJlYWRTZXQgOlxuICBzID09PSBcIihcIiA/XG4gICAgcmVhZExhbWJkYSA6XG4gIHMgPT09IFwiPFwiID9cbiAgICB0aHJvd2luZ1JlYWRlcihcIlVucmVhZGFibGUgZm9ybVwiKSA6XG4gIHMgPT09IFwiXFxcIlwiID9cbiAgICByZWFkUmVnZXggOlxuICBzID09PSBcIiFcIiA/XG4gICAgcmVhZENvbW1lbnQgOlxuICBzID09PSBcIl9cIiA/XG4gICAgcmVhZERpc2NhcmQgOlxuICBcImVsc2VcIiA/XG4gICAgdm9pZCgwKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmRpc3BhdGNoTWFjcm9zID0gZGlzcGF0Y2hNYWNyb3M7XG5cbnZhciByZWFkRm9ybSA9IGZ1bmN0aW9uIHJlYWRGb3JtKHJlYWRlciwgY2gpIHtcbiAgdmFyIHN0YXJ0ID0ge1xuICAgIFwibGluZVwiOiAocmVhZGVyIHx8IDApW1wibGluZVwiXSxcbiAgICBcImNvbHVtblwiOiAocmVhZGVyIHx8IDApW1wiY29sdW1uXCJdXG4gIH07XG4gIHZhciByZWFkTWFjcm8gPSBtYWNyb3MoY2gpO1xuICB2YXIgZm9ybSA9IHJlYWRNYWNybyA/XG4gICAgcmVhZE1hY3JvKHJlYWRlciwgY2gpIDpcbiAgaXNOdW1iZXJMaXRlcmFsKHJlYWRlciwgY2gpID9cbiAgICByZWFkTnVtYmVyKHJlYWRlciwgY2gpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHJlYWRTeW1ib2wocmVhZGVyLCBjaCkgOlxuICAgIHZvaWQoMCk7XG4gIHJldHVybiBmb3JtID09PSByZWFkZXIgP1xuICAgIGZvcm0gOlxuICAhKChpc1N0cmluZyhmb3JtKSkgfHwgKGlzTnVtYmVyKGZvcm0pKSB8fCAoaXNCb29sZWFuKGZvcm0pKSB8fCAoaXNOaWwoZm9ybSkpIHx8IChpc0tleXdvcmQoZm9ybSkpKSA/XG4gICAgd2l0aE1ldGEoZm9ybSwgY29uaih7XG4gICAgICBcInN0YXJ0XCI6IHN0YXJ0LFxuICAgICAgXCJlbmRcIjoge1xuICAgICAgICBcImxpbmVcIjogKHJlYWRlciB8fCAwKVtcImxpbmVcIl0sXG4gICAgICAgIFwiY29sdW1uXCI6IChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl1cbiAgICAgIH1cbiAgICB9LCBtZXRhKGZvcm0pKSkgOlxuICBcImVsc2VcIiA/XG4gICAgZm9ybSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnJlYWRGb3JtID0gcmVhZEZvcm07XG5cbnZhciByZWFkID0gZnVuY3Rpb24gcmVhZChyZWFkZXIsIGVvZklzRXJyb3IsIHNlbnRpbmVsLCBpc1JlY3Vyc2l2ZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNoID0gcmVhZENoYXIocmVhZGVyKTtcbiAgICAgIHZhciBmb3JtID0gaXNOaWwoY2gpID9cbiAgICAgICAgZW9mSXNFcnJvciA/XG4gICAgICAgICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIkVPRlwiKSA6XG4gICAgICAgICAgc2VudGluZWwgOlxuICAgICAgaXNXaGl0ZXNwYWNlKGNoKSA/XG4gICAgICAgIHJlYWRlciA6XG4gICAgICBpc0NvbW1lbnRQcmVmaXgoY2gpID9cbiAgICAgICAgcmVhZChyZWFkQ29tbWVudChyZWFkZXIsIGNoKSwgZW9mSXNFcnJvciwgc2VudGluZWwsIGlzUmVjdXJzaXZlKSA6XG4gICAgICBcImVsc2VcIiA/XG4gICAgICAgIHJlYWRGb3JtKHJlYWRlciwgY2gpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICAgIHJldHVybiBmb3JtID09PSByZWFkZXIgP1xuICAgICAgICAobG9vcCkgOlxuICAgICAgICBmb3JtO1xuICAgIH0pKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKCk7XG59O1xuZXhwb3J0cy5yZWFkID0gcmVhZDtcblxudmFyIHJlYWRfID0gZnVuY3Rpb24gcmVhZF8oc291cmNlLCB1cmkpIHtcbiAgdmFyIHJlYWRlciA9IHB1c2hCYWNrUmVhZGVyKHNvdXJjZSwgdXJpKTtcbiAgdmFyIGVvZiA9IGdlbnN5bSgpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoZm9ybXMsIGZvcm0pIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBmb3JtID09PSBlb2YgP1xuICAgICAgZm9ybXMgOlxuICAgICAgKGZvcm1zID0gY29uaihmb3JtcywgZm9ybSksIGZvcm0gPSByZWFkKHJlYWRlciwgZmFsc2UsIGVvZiwgZmFsc2UpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoW10sIHJlYWQocmVhZGVyLCBmYWxzZSwgZW9mLCBmYWxzZSkpO1xufTtcbmV4cG9ydHMucmVhZF8gPSByZWFkXztcblxudmFyIHJlYWRGcm9tU3RyaW5nID0gZnVuY3Rpb24gcmVhZEZyb21TdHJpbmcoc291cmNlLCB1cmkpIHtcbiAgdmFyIHJlYWRlciA9IHB1c2hCYWNrUmVhZGVyKHNvdXJjZSwgdXJpKTtcbiAgcmV0dXJuIHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCBmYWxzZSk7XG59O1xuZXhwb3J0cy5yZWFkRnJvbVN0cmluZyA9IHJlYWRGcm9tU3RyaW5nO1xuXG52YXIgcmVhZFV1aWQgPSBmdW5jdGlvbiByZWFkVXVpZCh1dWlkKSB7XG4gIHJldHVybiBpc1N0cmluZyh1dWlkKSA/XG4gICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJVVUlELlwiKSwgdXVpZCkgOlxuICAgIHJlYWRlckVycm9yKHZvaWQoMCksIFwiVVVJRCBsaXRlcmFsIGV4cGVjdHMgYSBzdHJpbmcgYXMgaXRzIHJlcHJlc2VudGF0aW9uLlwiKTtcbn07XG5cbnZhciByZWFkUXVldWUgPSBmdW5jdGlvbiByZWFkUXVldWUoaXRlbXMpIHtcbiAgcmV0dXJuIGlzVmVjdG9yKGl0ZW1zKSA/XG4gICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJQZXJzaXN0ZW50UXVldWUuXCIpLCBpdGVtcykgOlxuICAgIHJlYWRlckVycm9yKHZvaWQoMCksIFwiUXVldWUgbGl0ZXJhbCBleHBlY3RzIGEgdmVjdG9yIGZvciBpdHMgZWxlbWVudHMuXCIpO1xufTtcblxudmFyIF9fdGFnVGFibGVfXyA9IGRpY3Rpb25hcnkoXCJ1dWlkXCIsIHJlYWRVdWlkLCBcInF1ZXVlXCIsIHJlYWRRdWV1ZSk7XG5leHBvcnRzLl9fdGFnVGFibGVfXyA9IF9fdGFnVGFibGVfXztcblxudmFyIG1heWJlUmVhZFRhZ2dlZFR5cGUgPSBmdW5jdGlvbiBtYXliZVJlYWRUYWdnZWRUeXBlKHJlYWRlciwgaW5pdGNoKSB7XG4gIHZhciB0YWcgPSByZWFkU3ltYm9sKHJlYWRlciwgaW5pdGNoKTtcbiAgdmFyIHBmbiA9IChfX3RhZ1RhYmxlX18gfHwgMClbbmFtZSh0YWcpXTtcbiAgcmV0dXJuIHBmbiA/XG4gICAgcGZuKHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCBmYWxzZSkpIDpcbiAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiXCIgKyBcIkNvdWxkIG5vdCBmaW5kIHRhZyBwYXJzZXIgZm9yIFwiICsgKG5hbWUodGFnKSkgKyBcIiBpbiBcIiArIChcIlwiICsgKGtleXMoX190YWdUYWJsZV9fKSkpKTtcbn07XG5leHBvcnRzLm1heWJlUmVhZFRhZ2dlZFR5cGUgPSBtYXliZVJlYWRUYWdnZWRUeXBlXG4iLCJ2YXIgX25zXyA9IFwid2lzcC5hc3RcIjtcbm1vZHVsZS5uYW1lc3BhY2UgPSBfbnNfO1xudmFyIGlzTGlzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuaXNMaXN0O1xudmFyIGlzU2VxdWVudGlhbCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuaXNTZXF1ZW50aWFsO1xudmFyIGZpcnN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5maXJzdDtcbnZhciBzZWNvbmQgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLnNlY29uZDtcbnZhciBjb3VudCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY291bnQ7XG52YXIgbGFzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkubGFzdDtcbnZhciBtYXAgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLm1hcDtcbnZhciB2ZWMgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLnZlYztcbnZhciBzcGxpdCA9IChyZXF1aXJlKFwiLi9zdHJpbmdcIikpLnNwbGl0O1xudmFyIGpvaW4gPSAocmVxdWlyZShcIi4vc3RyaW5nXCIpKS5qb2luO1xudmFyIGlzTmlsID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzTmlsO1xudmFyIGlzVmVjdG9yID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzVmVjdG9yO1xudmFyIGlzTnVtYmVyID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzTnVtYmVyO1xudmFyIGlzU3RyaW5nID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzU3RyaW5nO1xudmFyIGlzQm9vbGVhbiA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc0Jvb2xlYW47XG52YXIgaXNPYmplY3QgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNPYmplY3Q7XG52YXIgaXNEYXRlID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzRGF0ZTtcbnZhciBpc1JlUGF0dGVybiA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc1JlUGF0dGVybjtcbnZhciBpc0RpY3Rpb25hcnkgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNEaWN0aW9uYXJ5O1xudmFyIHN0ciA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5zdHI7XG52YXIgaW5jID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmluYztcbnZhciBzdWJzID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLnN1YnM7XG52YXIgaXNFcXVhbCA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc0VxdWFsOztcblxudmFyIHdpdGhNZXRhID0gZnVuY3Rpb24gd2l0aE1ldGEodmFsdWUsIG1ldGFkYXRhKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgXCJtZXRhZGF0YVwiLCB7XG4gICAgXCJ2YWx1ZVwiOiBtZXRhZGF0YSxcbiAgICBcImNvbmZpZ3VyYWJsZVwiOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gdmFsdWU7XG59O1xuZXhwb3J0cy53aXRoTWV0YSA9IHdpdGhNZXRhO1xuXG52YXIgbWV0YSA9IGZ1bmN0aW9uIG1ldGEodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSA/XG4gICAgdmFsdWUubWV0YWRhdGEgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5tZXRhID0gbWV0YTtcblxudmFyIF9fbnNTZXBhcmF0b3JfXyA9IFwi4oGEXCI7XG5leHBvcnRzLl9fbnNTZXBhcmF0b3JfXyA9IF9fbnNTZXBhcmF0b3JfXztcblxudmFyIFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChuYW1lc3BhY2UsIG5hbWUpIHtcbiAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuU3ltYm9sLnR5cGUgPSBcIndpc3Auc3ltYm9sXCI7XG5cblN5bWJvbC5wcm90b3R5cGUudHlwZSA9IFN5bWJvbC50eXBlO1xuXG5TeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHZhciBucyA9IG5hbWVzcGFjZSh0aGlzKTtcbiAgcmV0dXJuIG5zID9cbiAgICBcIlwiICsgbnMgKyBcIi9cIiArIChuYW1lKHRoaXMpKSA6XG4gICAgXCJcIiArIChuYW1lKHRoaXMpKTtcbn07XG5cbnZhciBzeW1ib2wgPSBmdW5jdGlvbiBzeW1ib2wobnMsIGlkKSB7XG4gIHJldHVybiBpc1N5bWJvbChucykgP1xuICAgIG5zIDpcbiAgaXNLZXl3b3JkKG5zKSA/XG4gICAgbmV3IFN5bWJvbChuYW1lc3BhY2UobnMpLCBuYW1lKG5zKSkgOlxuICBpc05pbChpZCkgP1xuICAgIG5ldyBTeW1ib2wodm9pZCgwKSwgbnMpIDpcbiAgXCJlbHNlXCIgP1xuICAgIG5ldyBTeW1ib2wobnMsIGlkKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnN5bWJvbCA9IHN5bWJvbDtcblxudmFyIGlzU3ltYm9sID0gZnVuY3Rpb24gaXNTeW1ib2woeCkge1xuICByZXR1cm4geCAmJiAoU3ltYm9sLnR5cGUgPT09IHgudHlwZSk7XG59O1xuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG52YXIgaXNLZXl3b3JkID0gZnVuY3Rpb24gaXNLZXl3b3JkKHgpIHtcbiAgcmV0dXJuIChpc1N0cmluZyh4KSkgJiYgKGNvdW50KHgpID4gMSkgJiYgKGZpcnN0KHgpID09PSBcIuqeiVwiKTtcbn07XG5leHBvcnRzLmlzS2V5d29yZCA9IGlzS2V5d29yZDtcblxudmFyIGtleXdvcmQgPSBmdW5jdGlvbiBrZXl3b3JkKG5zLCBpZCkge1xuICByZXR1cm4gaXNLZXl3b3JkKG5zKSA/XG4gICAgbnMgOlxuICBpc1N5bWJvbChucykgP1xuICAgIFwiXCIgKyBcIuqeiVwiICsgKG5hbWUobnMpKSA6XG4gIGlzTmlsKGlkKSA/XG4gICAgXCJcIiArIFwi6p6JXCIgKyBucyA6XG4gIGlzTmlsKG5zKSA/XG4gICAgXCJcIiArIFwi6p6JXCIgKyBpZCA6XG4gIFwiZWxzZVwiID9cbiAgICBcIlwiICsgXCLqnolcIiArIG5zICsgX19uc1NlcGFyYXRvcl9fICsgaWQgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5rZXl3b3JkID0ga2V5d29yZDtcblxudmFyIGtleXdvcmROYW1lID0gZnVuY3Rpb24ga2V5d29yZE5hbWUodmFsdWUpIHtcbiAgcmV0dXJuIGxhc3Qoc3BsaXQoc3Vicyh2YWx1ZSwgMSksIF9fbnNTZXBhcmF0b3JfXykpO1xufTtcblxudmFyIG5hbWUgPSBmdW5jdGlvbiBuYW1lKHZhbHVlKSB7XG4gIHJldHVybiBpc1N5bWJvbCh2YWx1ZSkgP1xuICAgIHZhbHVlLm5hbWUgOlxuICBpc0tleXdvcmQodmFsdWUpID9cbiAgICBrZXl3b3JkTmFtZSh2YWx1ZSkgOlxuICBpc1N0cmluZyh2YWx1ZSkgP1xuICAgIHZhbHVlIDpcbiAgXCJlbHNlXCIgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlwiICsgXCJEb2Vzbid0IHN1cHBvcnQgbmFtZTogXCIgKyB2YWx1ZSk7IH0pKCkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5uYW1lID0gbmFtZTtcblxudmFyIGtleXdvcmROYW1lc3BhY2UgPSBmdW5jdGlvbiBrZXl3b3JkTmFtZXNwYWNlKHgpIHtcbiAgdmFyIHBhcnRzID0gc3BsaXQoc3Vicyh4LCAxKSwgX19uc1NlcGFyYXRvcl9fKTtcbiAgcmV0dXJuIGNvdW50KHBhcnRzKSA+IDEgP1xuICAgIChwYXJ0cyB8fCAwKVswXSA6XG4gICAgdm9pZCgwKTtcbn07XG5cbnZhciBuYW1lc3BhY2UgPSBmdW5jdGlvbiBuYW1lc3BhY2UoeCkge1xuICByZXR1cm4gaXNTeW1ib2woeCkgP1xuICAgIHgubmFtZXNwYWNlIDpcbiAgaXNLZXl3b3JkKHgpID9cbiAgICBrZXl3b3JkTmFtZXNwYWNlKHgpIDpcbiAgXCJlbHNlXCIgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlwiICsgXCJEb2Vzbid0IHN1cHBvcnRzIG5hbWVzcGFjZTogXCIgKyB4KTsgfSkoKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblxudmFyIGdlbnN5bSA9IGZ1bmN0aW9uIGdlbnN5bShwcmVmaXgpIHtcbiAgcmV0dXJuIHN5bWJvbChcIlwiICsgKGlzTmlsKHByZWZpeCkgP1xuICAgIFwiR19fXCIgOlxuICAgIHByZWZpeCkgKyAoZ2Vuc3ltLmJhc2UgPSBnZW5zeW0uYmFzZSArIDEpKTtcbn07XG5leHBvcnRzLmdlbnN5bSA9IGdlbnN5bTtcblxuZ2Vuc3ltLmJhc2UgPSAwO1xuXG52YXIgaXNVbnF1b3RlID0gZnVuY3Rpb24gaXNVbnF1b3RlKGZvcm0pIHtcbiAgcmV0dXJuIChpc0xpc3QoZm9ybSkpICYmIChpc0VxdWFsKGZpcnN0KGZvcm0pLCBzeW1ib2wodm9pZCgwKSwgXCJ1bnF1b3RlXCIpKSk7XG59O1xuZXhwb3J0cy5pc1VucXVvdGUgPSBpc1VucXVvdGU7XG5cbnZhciBpc1VucXVvdGVTcGxpY2luZyA9IGZ1bmN0aW9uIGlzVW5xdW90ZVNwbGljaW5nKGZvcm0pIHtcbiAgcmV0dXJuIChpc0xpc3QoZm9ybSkpICYmIChpc0VxdWFsKGZpcnN0KGZvcm0pLCBzeW1ib2wodm9pZCgwKSwgXCJ1bnF1b3RlLXNwbGljaW5nXCIpKSk7XG59O1xuZXhwb3J0cy5pc1VucXVvdGVTcGxpY2luZyA9IGlzVW5xdW90ZVNwbGljaW5nO1xuXG52YXIgaXNRdW90ZSA9IGZ1bmN0aW9uIGlzUXVvdGUoZm9ybSkge1xuICByZXR1cm4gKGlzTGlzdChmb3JtKSkgJiYgKGlzRXF1YWwoZmlyc3QoZm9ybSksIHN5bWJvbCh2b2lkKDApLCBcInF1b3RlXCIpKSk7XG59O1xuZXhwb3J0cy5pc1F1b3RlID0gaXNRdW90ZTtcblxudmFyIGlzU3ludGF4UXVvdGUgPSBmdW5jdGlvbiBpc1N5bnRheFF1b3RlKGZvcm0pIHtcbiAgcmV0dXJuIChpc0xpc3QoZm9ybSkpICYmIChpc0VxdWFsKGZpcnN0KGZvcm0pLCBzeW1ib2wodm9pZCgwKSwgXCJzeW50YXgtcXVvdGVcIikpKTtcbn07XG5leHBvcnRzLmlzU3ludGF4UXVvdGUgPSBpc1N5bnRheFF1b3RlO1xuXG52YXIgbm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKG4sIGxlbikge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AobnMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBjb3VudChucykgPCBsZW4gP1xuICAgICAgKG5zID0gXCJcIiArIFwiMFwiICsgbnMsIGxvb3ApIDpcbiAgICAgIG5zO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiICsgbik7XG59O1xuXG52YXIgcXVvdGVTdHJpbmcgPSBmdW5jdGlvbiBxdW90ZVN0cmluZyhzKSB7XG4gIHMgPSBqb2luKFwiXFxcXFxcXCJcIiwgc3BsaXQocywgXCJcXFwiXCIpKTtcbiAgcyA9IGpvaW4oXCJcXFxcXFxcXFwiLCBzcGxpdChzLCBcIlxcXFxcIikpO1xuICBzID0gam9pbihcIlxcXFxiXCIsIHNwbGl0KHMsIFwiXGJcIikpO1xuICBzID0gam9pbihcIlxcXFxmXCIsIHNwbGl0KHMsIFwiXGZcIikpO1xuICBzID0gam9pbihcIlxcXFxuXCIsIHNwbGl0KHMsIFwiXFxuXCIpKTtcbiAgcyA9IGpvaW4oXCJcXFxcclwiLCBzcGxpdChzLCBcIlxcclwiKSk7XG4gIHMgPSBqb2luKFwiXFxcXHRcIiwgc3BsaXQocywgXCJcXHRcIikpO1xuICByZXR1cm4gXCJcIiArIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xufTtcbmV4cG9ydHMucXVvdGVTdHJpbmcgPSBxdW90ZVN0cmluZztcblxudmFyIHByU3RyID0gZnVuY3Rpb24gcHJTdHIoeCkge1xuICByZXR1cm4gaXNOaWwoeCkgP1xuICAgIFwibmlsXCIgOlxuICBpc0tleXdvcmQoeCkgP1xuICAgIG5hbWVzcGFjZSh4KSA/XG4gICAgICBcIlwiICsgXCI6XCIgKyAobmFtZXNwYWNlKHgpKSArIFwiL1wiICsgKG5hbWUoeCkpIDpcbiAgICAgIFwiXCIgKyBcIjpcIiArIChuYW1lKHgpKSA6XG4gIGlzU3RyaW5nKHgpID9cbiAgICBxdW90ZVN0cmluZyh4KSA6XG4gIGlzRGF0ZSh4KSA/XG4gICAgXCJcIiArIFwiI2luc3QgXFxcIlwiICsgKHguZ2V0VVRDRnVsbFllYXIoKSkgKyBcIi1cIiArIChub3JtYWxpemUoaW5jKHguZ2V0VVRDTW9udGgoKSksIDIpKSArIFwiLVwiICsgKG5vcm1hbGl6ZSh4LmdldFVUQ0RhdGUoKSwgMikpICsgXCJUXCIgKyAobm9ybWFsaXplKHguZ2V0VVRDSG91cnMoKSwgMikpICsgXCI6XCIgKyAobm9ybWFsaXplKHguZ2V0VVRDTWludXRlcygpLCAyKSkgKyBcIjpcIiArIChub3JtYWxpemUoeC5nZXRVVENTZWNvbmRzKCksIDIpKSArIFwiLlwiICsgKG5vcm1hbGl6ZSh4LmdldFVUQ01pbGxpc2Vjb25kcygpLCAzKSkgKyBcIi1cIiArIFwiMDA6MDBcXFwiXCIgOlxuICBpc1ZlY3Rvcih4KSA/XG4gICAgXCJcIiArIFwiW1wiICsgKGpvaW4oXCIgXCIsIG1hcChwclN0ciwgdmVjKHgpKSkpICsgXCJdXCIgOlxuICBpc0RpY3Rpb25hcnkoeCkgP1xuICAgIFwiXCIgKyBcIntcIiArIChqb2luKFwiLCBcIiwgbWFwKGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgIHJldHVybiBcIlwiICsgKHByU3RyKGZpcnN0KHBhaXIpKSkgKyBcIiBcIiArIChwclN0cihzZWNvbmQocGFpcikpKTtcbiAgICB9LCB4KSkpICsgXCJ9XCIgOlxuICBpc1NlcXVlbnRpYWwoeCkgP1xuICAgIFwiXCIgKyBcIihcIiArIChqb2luKFwiIFwiLCBtYXAocHJTdHIsIHZlYyh4KSkpKSArIFwiKVwiIDpcbiAgaXNSZVBhdHRlcm4oeCkgP1xuICAgIFwiXCIgKyBcIiNcXFwiXCIgKyAoam9pbihcIlxcXFwvXCIsIHNwbGl0KHguc291cmNlLCBcIi9cIikpKSArIFwiXFxcIlwiIDpcbiAgXCJlbHNlXCIgP1xuICAgIFwiXCIgKyB4IDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMucHJTdHIgPSBwclN0clxuIiwidmFyIF9uc18gPSBcIndpc3AuY29tcGlsZXJcIjtcbm1vZHVsZS5uYW1lc3BhY2UgPSBfbnNfO1xubW9kdWxlLmRlc2NyaXB0aW9uID0gXCJ3aXNwIGxhbmd1YWdlIGNvbXBpbGVyXCI7XG52YXIgcmVhZEZyb21TdHJpbmcgPSAocmVxdWlyZShcIi4vcmVhZGVyXCIpKS5yZWFkRnJvbVN0cmluZztcbnZhciBtZXRhID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkubWV0YTtcbnZhciB3aXRoTWV0YSA9IChyZXF1aXJlKFwiLi9hc3RcIikpLndpdGhNZXRhO1xudmFyIGlzU3ltYm9sID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkuaXNTeW1ib2w7XG52YXIgc3ltYm9sID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkuc3ltYm9sO1xudmFyIGlzS2V5d29yZCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzS2V5d29yZDtcbnZhciBrZXl3b3JkID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkua2V5d29yZDtcbnZhciBuYW1lc3BhY2UgPSAocmVxdWlyZShcIi4vYXN0XCIpKS5uYW1lc3BhY2U7XG52YXIgaXNVbnF1b3RlID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkuaXNVbnF1b3RlO1xudmFyIGlzVW5xdW90ZVNwbGljaW5nID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkuaXNVbnF1b3RlU3BsaWNpbmc7XG52YXIgaXNRdW90ZSA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzUXVvdGU7XG52YXIgaXNTeW50YXhRdW90ZSA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzU3ludGF4UXVvdGU7XG52YXIgbmFtZSA9IChyZXF1aXJlKFwiLi9hc3RcIikpLm5hbWU7XG52YXIgZ2Vuc3ltID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkuZ2Vuc3ltO1xudmFyIHByU3RyID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkucHJTdHI7XG52YXIgaXNFbXB0eSA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuaXNFbXB0eTtcbnZhciBjb3VudCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY291bnQ7XG52YXIgaXNMaXN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5pc0xpc3Q7XG52YXIgbGlzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkubGlzdDtcbnZhciBmaXJzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuZmlyc3Q7XG52YXIgc2Vjb25kID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5zZWNvbmQ7XG52YXIgdGhpcmQgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLnRoaXJkO1xudmFyIHJlc3QgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLnJlc3Q7XG52YXIgY29ucyA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY29ucztcbnZhciBjb25qID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5jb25qO1xudmFyIHJldmVyc2UgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLnJldmVyc2U7XG52YXIgcmVkdWNlID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5yZWR1Y2U7XG52YXIgdmVjID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS52ZWM7XG52YXIgbGFzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkubGFzdDtcbnZhciByZXBlYXQgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLnJlcGVhdDtcbnZhciBtYXAgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLm1hcDtcbnZhciBmaWx0ZXIgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmZpbHRlcjtcbnZhciB0YWtlID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS50YWtlO1xudmFyIGNvbmNhdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY29uY2F0O1xudmFyIGlzT2RkID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzT2RkO1xudmFyIGlzRGljdGlvbmFyeSA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc0RpY3Rpb25hcnk7XG52YXIgZGljdGlvbmFyeSA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5kaWN0aW9uYXJ5O1xudmFyIG1lcmdlID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLm1lcmdlO1xudmFyIGtleXMgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkua2V5cztcbnZhciB2YWxzID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLnZhbHM7XG52YXIgaXNDb250YWluc1ZlY3RvciA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc0NvbnRhaW5zVmVjdG9yO1xudmFyIG1hcERpY3Rpb25hcnkgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkubWFwRGljdGlvbmFyeTtcbnZhciBpc1N0cmluZyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc1N0cmluZztcbnZhciBpc051bWJlciA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc051bWJlcjtcbnZhciBpc1ZlY3RvciA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc1ZlY3RvcjtcbnZhciBpc0Jvb2xlYW4gPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNCb29sZWFuO1xudmFyIHN1YnMgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuc3VicztcbnZhciByZUZpbmQgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkucmVGaW5kO1xudmFyIGlzVHJ1ZSA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc1RydWU7XG52YXIgaXNGYWxzZSA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc0ZhbHNlO1xudmFyIGlzTmlsID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzTmlsO1xudmFyIGlzUmVQYXR0ZXJuID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzUmVQYXR0ZXJuO1xudmFyIGluYyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pbmM7XG52YXIgZGVjID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmRlYztcbnZhciBzdHIgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuc3RyO1xudmFyIGNoYXIgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuY2hhcjtcbnZhciBpbnQgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaW50O1xudmFyIGlzRXF1YWwgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNFcXVhbDtcbnZhciBpc1N0cmljdEVxdWFsID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzU3RyaWN0RXF1YWw7XG52YXIgc3BsaXQgPSAocmVxdWlyZShcIi4vc3RyaW5nXCIpKS5zcGxpdDtcbnZhciBqb2luID0gKHJlcXVpcmUoXCIuL3N0cmluZ1wiKSkuam9pbjtcbnZhciB1cHBlckNhc2UgPSAocmVxdWlyZShcIi4vc3RyaW5nXCIpKS51cHBlckNhc2U7XG52YXIgcmVwbGFjZSA9IChyZXF1aXJlKFwiLi9zdHJpbmdcIikpLnJlcGxhY2U7XG52YXIgd3JpdGVSZWZlcmVuY2UgPSAocmVxdWlyZShcIi4vYmFja2VuZC9qYXZhc2NyaXB0L3dyaXRlclwiKSkud3JpdGVSZWZlcmVuY2U7XG52YXIgd3JpdGVLZXl3b3JkUmVmZXJlbmNlID0gKHJlcXVpcmUoXCIuL2JhY2tlbmQvamF2YXNjcmlwdC93cml0ZXJcIikpLndyaXRlS2V5d29yZFJlZmVyZW5jZTtcbnZhciB3cml0ZUtleXdvcmQgPSAocmVxdWlyZShcIi4vYmFja2VuZC9qYXZhc2NyaXB0L3dyaXRlclwiKSkud3JpdGVLZXl3b3JkO1xudmFyIHdyaXRlU3ltYm9sID0gKHJlcXVpcmUoXCIuL2JhY2tlbmQvamF2YXNjcmlwdC93cml0ZXJcIikpLndyaXRlU3ltYm9sO1xudmFyIHdyaXRlTmlsID0gKHJlcXVpcmUoXCIuL2JhY2tlbmQvamF2YXNjcmlwdC93cml0ZXJcIikpLndyaXRlTmlsO1xudmFyIHdyaXRlQ29tbWVudCA9IChyZXF1aXJlKFwiLi9iYWNrZW5kL2phdmFzY3JpcHQvd3JpdGVyXCIpKS53cml0ZUNvbW1lbnQ7XG52YXIgd3JpdGVOdW1iZXIgPSAocmVxdWlyZShcIi4vYmFja2VuZC9qYXZhc2NyaXB0L3dyaXRlclwiKSkud3JpdGVOdW1iZXI7XG52YXIgd3JpdGVTdHJpbmcgPSAocmVxdWlyZShcIi4vYmFja2VuZC9qYXZhc2NyaXB0L3dyaXRlclwiKSkud3JpdGVTdHJpbmc7XG52YXIgd3JpdGVOdW1iZXIgPSAocmVxdWlyZShcIi4vYmFja2VuZC9qYXZhc2NyaXB0L3dyaXRlclwiKSkud3JpdGVOdW1iZXI7XG52YXIgd3JpdGVCb29sZWFuID0gKHJlcXVpcmUoXCIuL2JhY2tlbmQvamF2YXNjcmlwdC93cml0ZXJcIikpLndyaXRlQm9vbGVhbjs7XG5cbnZhciBpc1NlbGZFdmFsdWF0aW5nID0gZnVuY3Rpb24gaXNTZWxmRXZhbHVhdGluZyhmb3JtKSB7XG4gIHJldHVybiAoaXNOdW1iZXIoZm9ybSkpIHx8ICgoaXNTdHJpbmcoZm9ybSkpICYmICghKGlzU3ltYm9sKGZvcm0pKSkgJiYgKCEoaXNLZXl3b3JkKGZvcm0pKSkpIHx8IChpc0Jvb2xlYW4oZm9ybSkpIHx8IChpc05pbChmb3JtKSkgfHwgKGlzUmVQYXR0ZXJuKGZvcm0pKTtcbn07XG5leHBvcnRzLmlzU2VsZkV2YWx1YXRpbmcgPSBpc1NlbGZFdmFsdWF0aW5nO1xuXG52YXIgX19tYWNyb3NfXyA9IHt9O1xuZXhwb3J0cy5fX21hY3Jvc19fID0gX19tYWNyb3NfXztcblxudmFyIGV4ZWN1dGVNYWNybyA9IGZ1bmN0aW9uIGV4ZWN1dGVNYWNybyhuYW1lLCBmb3JtKSB7XG4gIHJldHVybiAoX19tYWNyb3NfXyB8fCAwKVtuYW1lXS5hcHBseSgoX19tYWNyb3NfXyB8fCAwKVtuYW1lXSwgdmVjKGZvcm0pKTtcbn07XG5leHBvcnRzLmV4ZWN1dGVNYWNybyA9IGV4ZWN1dGVNYWNybztcblxudmFyIGluc3RhbGxNYWNybyA9IGZ1bmN0aW9uIGluc3RhbGxNYWNybyhuYW1lLCBtYWNyb0ZuKSB7XG4gIHJldHVybiAoX19tYWNyb3NfXyB8fCAwKVtuYW1lXSA9IG1hY3JvRm47XG59O1xuZXhwb3J0cy5pbnN0YWxsTWFjcm8gPSBpbnN0YWxsTWFjcm87XG5cbnZhciBpc01hY3JvID0gZnVuY3Rpb24gaXNNYWNybyhuYW1lKSB7XG4gIHJldHVybiAoaXNTeW1ib2wobmFtZSkpICYmICgoX19tYWNyb3NfXyB8fCAwKVtuYW1lXSkgJiYgdHJ1ZTtcbn07XG5leHBvcnRzLmlzTWFjcm8gPSBpc01hY3JvO1xuXG52YXIgbWFrZU1hY3JvID0gZnVuY3Rpb24gbWFrZU1hY3JvKHBhdHRlcm4sIGJvZHkpIHtcbiAgdmFyIG1hY3JvRm4gPSBjb25jYXQobGlzdChzeW1ib2wodm9pZCgwKSwgXCJmblwiKSwgcGF0dGVybiksIGJvZHkpO1xuICByZXR1cm4gZXZhbChcIlwiICsgXCIoXCIgKyAoY29tcGlsZShtYWNyb2V4cGFuZChtYWNyb0ZuKSkpICsgXCIpXCIpO1xufTtcbmV4cG9ydHMubWFrZU1hY3JvID0gbWFrZU1hY3JvO1xuXG5pbnN0YWxsTWFjcm8oc3ltYm9sKHZvaWQoMCksIFwiZGVmbWFjcm9cIiksIGZ1bmN0aW9uKG5hbWUsIHNpZ25hdHVyZSkge1xuICB2YXIgYm9keSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gIHJldHVybiBpbnN0YWxsTWFjcm8obmFtZSwgbWFrZU1hY3JvKHNpZ25hdHVyZSwgYm9keSkpO1xufSk7XG5cbnZhciBfX3NwZWNpYWxzX18gPSB7fTtcbmV4cG9ydHMuX19zcGVjaWFsc19fID0gX19zcGVjaWFsc19fO1xuXG52YXIgaW5zdGFsbFNwZWNpYWwgPSBmdW5jdGlvbiBpbnN0YWxsU3BlY2lhbChuYW1lLCBmLCB2YWxpZGF0b3IpIHtcbiAgcmV0dXJuIChfX3NwZWNpYWxzX18gfHwgMClbbmFtZV0gPSBmdW5jdGlvbihmb3JtKSB7XG4gICAgdmFsaWRhdG9yID9cbiAgICAgIHZhbGlkYXRvcihmb3JtKSA6XG4gICAgICB2b2lkKDApO1xuICAgIHJldHVybiBmKHdpdGhNZXRhKHJlc3QoZm9ybSksIG1ldGEoZm9ybSkpKTtcbiAgfTtcbn07XG5leHBvcnRzLmluc3RhbGxTcGVjaWFsID0gaW5zdGFsbFNwZWNpYWw7XG5cbnZhciBpc1NwZWNpYWwgPSBmdW5jdGlvbiBpc1NwZWNpYWwobmFtZSkge1xuICByZXR1cm4gKGlzU3ltYm9sKG5hbWUpKSAmJiAoKF9fc3BlY2lhbHNfXyB8fCAwKVtuYW1lXSkgJiYgdHJ1ZTtcbn07XG5leHBvcnRzLmlzU3BlY2lhbCA9IGlzU3BlY2lhbDtcblxudmFyIGV4ZWN1dGVTcGVjaWFsID0gZnVuY3Rpb24gZXhlY3V0ZVNwZWNpYWwobmFtZSwgZm9ybSkge1xuICByZXR1cm4gKChfX3NwZWNpYWxzX18gfHwgMClbbmFtZV0pKGZvcm0pO1xufTtcbmV4cG9ydHMuZXhlY3V0ZVNwZWNpYWwgPSBleGVjdXRlU3BlY2lhbDtcblxudmFyIG9wdCA9IGZ1bmN0aW9uIG9wdChhcmd1bWVudCwgZmFsbGJhY2spIHtcbiAgcmV0dXJuIChpc05pbChhcmd1bWVudCkpIHx8IChpc0VtcHR5KGFyZ3VtZW50KSkgP1xuICAgIGZhbGxiYWNrIDpcbiAgICBmaXJzdChhcmd1bWVudCk7XG59O1xuZXhwb3J0cy5vcHQgPSBvcHQ7XG5cbnZhciBhcHBseUZvcm0gPSBmdW5jdGlvbiBhcHBseUZvcm0oZm5OYW1lLCBmb3JtLCBpc1F1b3RlZCkge1xuICByZXR1cm4gY29ucyhmbk5hbWUsIGlzUXVvdGVkID9cbiAgICBtYXAoZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwicXVvdGVcIiksIGUpO1xuICAgIH0sIGZvcm0pIDpcbiAgICBmb3JtLCBmb3JtKTtcbn07XG5leHBvcnRzLmFwcGx5Rm9ybSA9IGFwcGx5Rm9ybTtcblxudmFyIGFwcGx5VW5xdW90ZWRGb3JtID0gZnVuY3Rpb24gYXBwbHlVbnF1b3RlZEZvcm0oZm5OYW1lLCBmb3JtKSB7XG4gIHJldHVybiBjb25zKGZuTmFtZSwgbWFwKGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gaXNVbnF1b3RlKGUpID9cbiAgICAgIHNlY29uZChlKSA6XG4gICAgKGlzTGlzdChlKSkgJiYgKGlzS2V5d29yZChmaXJzdChlKSkpID9cbiAgICAgIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwic3ludGF4LXF1b3RlXCIpLCBzZWNvbmQoZSkpIDpcbiAgICAgIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwic3ludGF4LXF1b3RlXCIpLCBlKTtcbiAgfSwgZm9ybSkpO1xufTtcbmV4cG9ydHMuYXBwbHlVbnF1b3RlZEZvcm0gPSBhcHBseVVucXVvdGVkRm9ybTtcblxudmFyIHNwbGl0U3BsaWNlcyA9IGZ1bmN0aW9uIHNwbGl0U3BsaWNlcyhmb3JtLCBmbk5hbWUpIHtcbiAgdmFyIG1ha2VTcGxpY2UgPSBmdW5jdGlvbiBtYWtlU3BsaWNlKGZvcm0pIHtcbiAgICByZXR1cm4gKGlzU2VsZkV2YWx1YXRpbmcoZm9ybSkpIHx8IChpc1N5bWJvbChmb3JtKSkgP1xuICAgICAgYXBwbHlVbnF1b3RlZEZvcm0oZm5OYW1lLCBsaXN0KGZvcm0pKSA6XG4gICAgICBhcHBseVVucXVvdGVkRm9ybShmbk5hbWUsIGZvcm0pO1xuICB9O1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3Aobm9kZXMsIHNsaWNlcywgYWNjKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShub2RlcykgP1xuICAgICAgcmV2ZXJzZShpc0VtcHR5KGFjYykgP1xuICAgICAgICBzbGljZXMgOlxuICAgICAgICBjb25zKG1ha2VTcGxpY2UocmV2ZXJzZShhY2MpKSwgc2xpY2VzKSkgOlxuICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbm9kZSA9IGZpcnN0KG5vZGVzKTtcbiAgICAgICAgcmV0dXJuIGlzVW5xdW90ZVNwbGljaW5nKG5vZGUpID9cbiAgICAgICAgICAobm9kZXMgPSByZXN0KG5vZGVzKSwgc2xpY2VzID0gY29ucyhzZWNvbmQobm9kZSksIGlzRW1wdHkoYWNjKSA/XG4gICAgICAgICAgICBzbGljZXMgOlxuICAgICAgICAgICAgY29ucyhtYWtlU3BsaWNlKHJldmVyc2UoYWNjKSksIHNsaWNlcykpLCBhY2MgPSBsaXN0KCksIGxvb3ApIDpcbiAgICAgICAgICAobm9kZXMgPSByZXN0KG5vZGVzKSwgc2xpY2VzID0gc2xpY2VzLCBhY2MgPSBjb25zKG5vZGUsIGFjYyksIGxvb3ApO1xuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoZm9ybSwgbGlzdCgpLCBsaXN0KCkpO1xufTtcbmV4cG9ydHMuc3BsaXRTcGxpY2VzID0gc3BsaXRTcGxpY2VzO1xuXG52YXIgc3ludGF4UXVvdGVTcGxpdCA9IGZ1bmN0aW9uIHN5bnRheFF1b3RlU3BsaXQoYXBwZW5kTmFtZSwgZm5OYW1lLCBmb3JtKSB7XG4gIHZhciBzbGljZXMgPSBzcGxpdFNwbGljZXMoZm9ybSwgZm5OYW1lKTtcbiAgdmFyIG4gPSBjb3VudChzbGljZXMpO1xuICByZXR1cm4gbiA9PT0gMCA/XG4gICAgbGlzdChmbk5hbWUpIDpcbiAgbiA9PT0gMSA/XG4gICAgZmlyc3Qoc2xpY2VzKSA6XG4gIFwiZGVmYXVsdFwiID9cbiAgICBhcHBseUZvcm0oYXBwZW5kTmFtZSwgc2xpY2VzKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnN5bnRheFF1b3RlU3BsaXQgPSBzeW50YXhRdW90ZVNwbGl0O1xuXG52YXIgY29tcGlsZU9iamVjdCA9IGZ1bmN0aW9uIGNvbXBpbGVPYmplY3QoZm9ybSwgaXNRdW90ZWQpIHtcbiAgcmV0dXJuIGlzS2V5d29yZChmb3JtKSA/XG4gICAgd3JpdGVLZXl3b3JkKGZvcm0pIDpcbiAgaXNTeW1ib2woZm9ybSkgP1xuICAgIHdyaXRlU3ltYm9sKGZvcm0pIDpcbiAgaXNOdW1iZXIoZm9ybSkgP1xuICAgIHdyaXRlTnVtYmVyKGZvcm0pIDpcbiAgaXNTdHJpbmcoZm9ybSkgP1xuICAgIHdyaXRlU3RyaW5nKGZvcm0pIDpcbiAgaXNCb29sZWFuKGZvcm0pID9cbiAgICB3cml0ZUJvb2xlYW4oZm9ybSkgOlxuICBpc05pbChmb3JtKSA/XG4gICAgd3JpdGVOaWwoZm9ybSkgOlxuICBpc1JlUGF0dGVybihmb3JtKSA/XG4gICAgY29tcGlsZVJlUGF0dGVybihmb3JtKSA6XG4gIGlzVmVjdG9yKGZvcm0pID9cbiAgICBjb21waWxlKGFwcGx5Rm9ybShzeW1ib2wodm9pZCgwKSwgXCJ2ZWN0b3JcIiksIGxpc3QuYXBwbHkobGlzdCwgZm9ybSksIGlzUXVvdGVkKSkgOlxuICBpc0xpc3QoZm9ybSkgP1xuICAgIGNvbXBpbGUoYXBwbHlGb3JtKHN5bWJvbCh2b2lkKDApLCBcImxpc3RcIiksIGZvcm0sIGlzUXVvdGVkKSkgOlxuICBpc0RpY3Rpb25hcnkoZm9ybSkgP1xuICAgIGNvbXBpbGVEaWN0aW9uYXJ5KGlzUXVvdGVkID9cbiAgICAgIG1hcERpY3Rpb25hcnkoZm9ybSwgZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gbGlzdChzeW1ib2wodm9pZCgwKSwgXCJxdW90ZVwiKSwgeCk7XG4gICAgICB9KSA6XG4gICAgICBmb3JtKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmNvbXBpbGVPYmplY3QgPSBjb21waWxlT2JqZWN0O1xuXG52YXIgY29tcGlsZVN5bnRheFF1b3RlZFZlY3RvciA9IGZ1bmN0aW9uIGNvbXBpbGVTeW50YXhRdW90ZWRWZWN0b3IoZm9ybSkge1xuICB2YXIgY29uY2F0Rm9ybSA9IHN5bnRheFF1b3RlU3BsaXQoc3ltYm9sKHZvaWQoMCksIFwiY29uY2F0XCIpLCBzeW1ib2wodm9pZCgwKSwgXCJ2ZWN0b3JcIiksIGxpc3QuYXBwbHkobGlzdCwgZm9ybSkpO1xuICByZXR1cm4gY29tcGlsZShjb3VudChjb25jYXRGb3JtKSA+IDEgP1xuICAgIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwidmVjXCIpLCBjb25jYXRGb3JtKSA6XG4gICAgY29uY2F0Rm9ybSk7XG59O1xuZXhwb3J0cy5jb21waWxlU3ludGF4UXVvdGVkVmVjdG9yID0gY29tcGlsZVN5bnRheFF1b3RlZFZlY3RvcjtcblxudmFyIGNvbXBpbGVTeW50YXhRdW90ZWQgPSBmdW5jdGlvbiBjb21waWxlU3ludGF4UXVvdGVkKGZvcm0pIHtcbiAgcmV0dXJuIGlzTGlzdChmb3JtKSA/XG4gICAgY29tcGlsZShzeW50YXhRdW90ZVNwbGl0KHN5bWJvbCh2b2lkKDApLCBcImNvbmNhdFwiKSwgc3ltYm9sKHZvaWQoMCksIFwibGlzdFwiKSwgZm9ybSkpIDpcbiAgaXNWZWN0b3IoZm9ybSkgP1xuICAgIGNvbXBpbGVTeW50YXhRdW90ZWRWZWN0b3IoZm9ybSkgOlxuICBcImVsc2VcIiA/XG4gICAgY29tcGlsZU9iamVjdChmb3JtKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmNvbXBpbGVTeW50YXhRdW90ZWQgPSBjb21waWxlU3ludGF4UXVvdGVkO1xuXG52YXIgY29tcGlsZSA9IGZ1bmN0aW9uIGNvbXBpbGUoZm9ybSkge1xuICByZXR1cm4gaXNTZWxmRXZhbHVhdGluZyhmb3JtKSA/XG4gICAgY29tcGlsZU9iamVjdChmb3JtKSA6XG4gIGlzU3ltYm9sKGZvcm0pID9cbiAgICB3cml0ZVJlZmVyZW5jZShmb3JtKSA6XG4gIGlzS2V5d29yZChmb3JtKSA/XG4gICAgd3JpdGVLZXl3b3JkUmVmZXJlbmNlKGZvcm0pIDpcbiAgaXNWZWN0b3IoZm9ybSkgP1xuICAgIGNvbXBpbGVPYmplY3QoZm9ybSkgOlxuICBpc0RpY3Rpb25hcnkoZm9ybSkgP1xuICAgIGNvbXBpbGVPYmplY3QoZm9ybSkgOlxuICBpc0xpc3QoZm9ybSkgP1xuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBoZWFkID0gZmlyc3QoZm9ybSk7XG4gICAgICByZXR1cm4gaXNFbXB0eShmb3JtKSA/XG4gICAgICAgIGNvbXBpbGVPYmplY3QoZm9ybSwgdHJ1ZSkgOlxuICAgICAgaXNRdW90ZShmb3JtKSA/XG4gICAgICAgIGNvbXBpbGVPYmplY3Qoc2Vjb25kKGZvcm0pLCB0cnVlKSA6XG4gICAgICBpc1N5bnRheFF1b3RlKGZvcm0pID9cbiAgICAgICAgY29tcGlsZVN5bnRheFF1b3RlZChzZWNvbmQoZm9ybSkpIDpcbiAgICAgIGlzU3BlY2lhbChoZWFkKSA/XG4gICAgICAgIGV4ZWN1dGVTcGVjaWFsKGhlYWQsIGZvcm0pIDpcbiAgICAgIGlzS2V5d29yZChoZWFkKSA/XG4gICAgICAgIGNvbXBpbGUobGlzdChzeW1ib2wodm9pZCgwKSwgXCJnZXRcIiksIHNlY29uZChmb3JtKSwgaGVhZCkpIDpcbiAgICAgIFwiZWxzZVwiID9cbiAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiAhKChpc1N5bWJvbChoZWFkKSkgfHwgKGlzTGlzdChoZWFkKSkpID9cbiAgICAgICAgICAgIChmdW5jdGlvbigpIHsgdGhyb3cgY29tcGlsZXJFcnJvcihmb3JtLCBcIlwiICsgXCJvcGVyYXRvciBpcyBub3QgYSBwcm9jZWR1cmU6IFwiICsgaGVhZCk7IH0pKCkgOlxuICAgICAgICAgICAgY29tcGlsZUludm9rZShmb3JtKTtcbiAgICAgICAgfSkoKSA6XG4gICAgICAgIHZvaWQoMCk7XG4gICAgfSkoKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlO1xuXG52YXIgY29tcGlsZV8gPSBmdW5jdGlvbiBjb21waWxlXyhmb3Jtcykge1xuICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwgZm9ybSkge1xuICAgIHJldHVybiBcIlwiICsgcmVzdWx0ICsgKGlzRW1wdHkocmVzdWx0KSA/XG4gICAgICBcIlwiIDpcbiAgICAgIFwiO1xcblxcblwiKSArIChjb21waWxlKGlzTGlzdChmb3JtKSA/XG4gICAgICB3aXRoTWV0YShtYWNyb2V4cGFuZChmb3JtKSwgY29uaih7XG4gICAgICAgIFwidG9wXCI6IHRydWVcbiAgICAgIH0sIG1ldGEoZm9ybSkpKSA6XG4gICAgICBmb3JtKSk7XG4gIH0sIFwiXCIsIGZvcm1zKTtcbn07XG5leHBvcnRzLmNvbXBpbGVfID0gY29tcGlsZV87XG5cbnZhciBjb21waWxlUHJvZ3JhbSA9IGZ1bmN0aW9uIGNvbXBpbGVQcm9ncmFtKGZvcm1zKSB7XG4gIHJldHVybiByZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBmb3JtKSB7XG4gICAgcmV0dXJuIFwiXCIgKyByZXN1bHQgKyAoaXNFbXB0eShyZXN1bHQpID9cbiAgICAgIFwiXCIgOlxuICAgICAgXCI7XFxuXFxuXCIpICsgKGNvbXBpbGUoaXNMaXN0KGZvcm0pID9cbiAgICAgIHdpdGhNZXRhKG1hY3JvZXhwYW5kKGZvcm0pLCBjb25qKHtcbiAgICAgICAgXCJ0b3BcIjogdHJ1ZVxuICAgICAgfSwgbWV0YShmb3JtKSkpIDpcbiAgICAgIGZvcm0pKTtcbiAgfSwgXCJcIiwgZm9ybXMpO1xufTtcbmV4cG9ydHMuY29tcGlsZVByb2dyYW0gPSBjb21waWxlUHJvZ3JhbTtcblxudmFyIG1hY3JvZXhwYW5kMSA9IGZ1bmN0aW9uIG1hY3JvZXhwYW5kMShmb3JtKSB7XG4gIHJldHVybiBpc0xpc3QoZm9ybSkgP1xuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcCA9IGZpcnN0KGZvcm0pO1xuICAgICAgdmFyIGlkID0gaXNTeW1ib2wob3ApID9cbiAgICAgICAgbmFtZShvcCkgOlxuICAgICAgICB2b2lkKDApO1xuICAgICAgcmV0dXJuIGlzU3BlY2lhbChvcCkgP1xuICAgICAgICBmb3JtIDpcbiAgICAgIGlzTWFjcm8ob3ApID9cbiAgICAgICAgZXhlY3V0ZU1hY3JvKG9wLCByZXN0KGZvcm0pKSA6XG4gICAgICAoaXNTeW1ib2wob3ApKSAmJiAoIShpZCA9PT0gXCIuXCIpKSA/XG4gICAgICAgIGZpcnN0KGlkKSA9PT0gXCIuXCIgP1xuICAgICAgICAgIGNvdW50KGZvcm0pIDwgMiA/XG4gICAgICAgICAgICAoZnVuY3Rpb24oKSB7IHRocm93IEVycm9yKFwiTWFsZm9ybWVkIG1lbWJlciBleHByZXNzaW9uLCBleHBlY3RpbmcgKC5tZW1iZXIgdGFyZ2V0IC4uLilcIik7IH0pKCkgOlxuICAgICAgICAgICAgY29ucyhzeW1ib2wodm9pZCgwKSwgXCIuXCIpLCBjb25zKHNlY29uZChmb3JtKSwgY29ucyhzeW1ib2woc3VicyhpZCwgMSkpLCByZXN0KHJlc3QoZm9ybSkpKSkpIDpcbiAgICAgICAgbGFzdChpZCkgPT09IFwiLlwiID9cbiAgICAgICAgICBjb25zKHN5bWJvbCh2b2lkKDApLCBcIm5ld1wiKSwgY29ucyhzeW1ib2woc3VicyhpZCwgMCwgZGVjKGNvdW50KGlkKSkpKSwgcmVzdChmb3JtKSkpIDpcbiAgICAgICAgICBmb3JtIDpcbiAgICAgIFwiZWxzZVwiID9cbiAgICAgICAgZm9ybSA6XG4gICAgICAgIHZvaWQoMCk7XG4gICAgfSkoKSA6XG4gICAgZm9ybTtcbn07XG5leHBvcnRzLm1hY3JvZXhwYW5kMSA9IG1hY3JvZXhwYW5kMTtcblxudmFyIG1hY3JvZXhwYW5kID0gZnVuY3Rpb24gbWFjcm9leHBhbmQoZm9ybSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3Aob3JpZ2luYWwsIGV4cGFuZGVkKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gb3JpZ2luYWwgPT09IGV4cGFuZGVkID9cbiAgICAgIG9yaWdpbmFsIDpcbiAgICAgIChvcmlnaW5hbCA9IGV4cGFuZGVkLCBleHBhbmRlZCA9IG1hY3JvZXhwYW5kMShleHBhbmRlZCksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShmb3JtLCBtYWNyb2V4cGFuZDEoZm9ybSkpO1xufTtcbmV4cG9ydHMubWFjcm9leHBhbmQgPSBtYWNyb2V4cGFuZDtcblxudmFyIF9saW5lQnJlYWtQYXR0ZXJuXyA9IC9cXG4oPz1bXlxcbl0pL207XG5leHBvcnRzLl9saW5lQnJlYWtQYXR0ZXJuXyA9IF9saW5lQnJlYWtQYXR0ZXJuXztcblxudmFyIGluZGVudCA9IGZ1bmN0aW9uIGluZGVudChjb2RlLCBpbmRlbnRhdGlvbikge1xuICByZXR1cm4gam9pbihpbmRlbnRhdGlvbiwgc3BsaXQoY29kZSwgX2xpbmVCcmVha1BhdHRlcm5fKSk7XG59O1xuZXhwb3J0cy5pbmRlbnQgPSBpbmRlbnQ7XG5cbnZhciBjb21waWxlVGVtcGxhdGUgPSBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGUoZm9ybSkge1xuICB2YXIgaW5kZW50UGF0dGVybiA9IC9cXG4gKiQvO1xuICB2YXIgZ2V0SW5kZW50YXRpb24gPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgcmV0dXJuIChyZUZpbmQoaW5kZW50UGF0dGVybiwgY29kZSkpIHx8IFwiXFxuXCI7XG4gIH07XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChjb2RlLCBwYXJ0cywgdmFsdWVzKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gY291bnQocGFydHMpID4gMSA/XG4gICAgICAoY29kZSA9IFwiXCIgKyBjb2RlICsgKGZpcnN0KHBhcnRzKSkgKyAoaW5kZW50KFwiXCIgKyAoZmlyc3QodmFsdWVzKSksIGdldEluZGVudGF0aW9uKGZpcnN0KHBhcnRzKSkpKSwgcGFydHMgPSByZXN0KHBhcnRzKSwgdmFsdWVzID0gcmVzdCh2YWx1ZXMpLCBsb29wKSA6XG4gICAgICBcIlwiICsgY29kZSArIChmaXJzdChwYXJ0cykpO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCBzcGxpdChmaXJzdChmb3JtKSwgXCJ+e31cIiksIHJlc3QoZm9ybSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZVRlbXBsYXRlID0gY29tcGlsZVRlbXBsYXRlO1xuXG52YXIgY29tcGlsZURlZiA9IGZ1bmN0aW9uIGNvbXBpbGVEZWYoZm9ybSkge1xuICB2YXIgaWQgPSBmaXJzdChmb3JtKTtcbiAgdmFyIGlzRXhwb3J0ID0gKCgoKG1ldGEoZm9ybSkpIHx8IHt9KSB8fCAwKVtcInRvcFwiXSkgJiYgKCEoKCgobWV0YShpZCkpIHx8IHt9KSB8fCAwKVtcInByaXZhdGVcIl0pKTtcbiAgdmFyIGF0dHJpYnV0ZSA9IHN5bWJvbChuYW1lc3BhY2UoaWQpLCBcIlwiICsgXCItXCIgKyAobmFtZShpZCkpKTtcbiAgcmV0dXJuIGlzRXhwb3J0ID9cbiAgICBjb21waWxlVGVtcGxhdGUobGlzdChcInZhciB+e307XFxufnt9XCIsIGNvbXBpbGUoY29ucyhzeW1ib2wodm9pZCgwKSwgXCJzZXQhXCIpLCBmb3JtKSksIGNvbXBpbGUobGlzdChzeW1ib2wodm9pZCgwKSwgXCJzZXQhXCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcIi5cIiksIHN5bWJvbCh2b2lkKDApLCBcImV4cG9ydHNcIiksIGF0dHJpYnV0ZSksIGlkKSkpKSA6XG4gICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJ2YXIgfnt9XCIsIGNvbXBpbGUoY29ucyhzeW1ib2wodm9pZCgwKSwgXCJzZXQhXCIpLCBmb3JtKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVEZWYgPSBjb21waWxlRGVmO1xuXG52YXIgY29tcGlsZUlmRWxzZSA9IGZ1bmN0aW9uIGNvbXBpbGVJZkVsc2UoZm9ybSkge1xuICB2YXIgY29uZGl0aW9uID0gbWFjcm9leHBhbmQoZmlyc3QoZm9ybSkpO1xuICB2YXIgdGhlbkV4cHJlc3Npb24gPSBtYWNyb2V4cGFuZChzZWNvbmQoZm9ybSkpO1xuICB2YXIgZWxzZUV4cHJlc3Npb24gPSBtYWNyb2V4cGFuZCh0aGlyZChmb3JtKSk7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdCgoaXNMaXN0KGVsc2VFeHByZXNzaW9uKSkgJiYgKGlzRXF1YWwoZmlyc3QoZWxzZUV4cHJlc3Npb24pLCBzeW1ib2wodm9pZCgwKSwgXCJpZlwiKSkpID9cbiAgICBcIn57fSA/XFxuICB+e30gOlxcbn57fVwiIDpcbiAgICBcIn57fSA/XFxuICB+e30gOlxcbiAgfnt9XCIsIGNvbXBpbGUoY29uZGl0aW9uKSwgY29tcGlsZSh0aGVuRXhwcmVzc2lvbiksIGNvbXBpbGUoZWxzZUV4cHJlc3Npb24pKSk7XG59O1xuZXhwb3J0cy5jb21waWxlSWZFbHNlID0gY29tcGlsZUlmRWxzZTtcblxudmFyIGNvbXBpbGVEaWN0aW9uYXJ5ID0gZnVuY3Rpb24gY29tcGlsZURpY3Rpb25hcnkoZm9ybSkge1xuICB2YXIgYm9keSA9IChmdW5jdGlvbiBsb29wKGJvZHksIG5hbWVzKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShuYW1lcykgP1xuICAgICAgYm9keSA6XG4gICAgICAoYm9keSA9IFwiXCIgKyAoaXNOaWwoYm9keSkgP1xuICAgICAgICBcIlwiIDpcbiAgICAgICAgXCJcIiArIGJvZHkgKyBcIixcXG5cIikgKyAoY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJ+e306IH57fVwiLCBjb21waWxlKGZpcnN0KG5hbWVzKSksIGNvbXBpbGUobWFjcm9leHBhbmQoKGZvcm0gfHwgMClbZmlyc3QobmFtZXMpXSkpKSkpLCBuYW1lcyA9IHJlc3QobmFtZXMpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkodm9pZCgwKSwga2V5cyhmb3JtKSk7XG4gIHJldHVybiBpc05pbChib2R5KSA/XG4gICAgXCJ7fVwiIDpcbiAgICBjb21waWxlVGVtcGxhdGUobGlzdChcIntcXG4gIH57fVxcbn1cIiwgYm9keSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZURpY3Rpb25hcnkgPSBjb21waWxlRGljdGlvbmFyeTtcblxudmFyIGRlc3VnYXJGbk5hbWUgPSBmdW5jdGlvbiBkZXN1Z2FyRm5OYW1lKGZvcm0pIHtcbiAgcmV0dXJuIChpc1N5bWJvbChmaXJzdChmb3JtKSkpIHx8IChpc05pbChmaXJzdChmb3JtKSkpID9cbiAgICBmb3JtIDpcbiAgICBjb25zKHZvaWQoMCksIGZvcm0pO1xufTtcbmV4cG9ydHMuZGVzdWdhckZuTmFtZSA9IGRlc3VnYXJGbk5hbWU7XG5cbnZhciBkZXN1Z2FyRm5Eb2MgPSBmdW5jdGlvbiBkZXN1Z2FyRm5Eb2MoZm9ybSkge1xuICByZXR1cm4gKGlzU3RyaW5nKHNlY29uZChmb3JtKSkpIHx8IChpc05pbChzZWNvbmQoZm9ybSkpKSA/XG4gICAgZm9ybSA6XG4gICAgY29ucyhmaXJzdChmb3JtKSwgY29ucyh2b2lkKDApLCByZXN0KGZvcm0pKSk7XG59O1xuZXhwb3J0cy5kZXN1Z2FyRm5Eb2MgPSBkZXN1Z2FyRm5Eb2M7XG5cbnZhciBkZXN1Z2FyRm5BdHRycyA9IGZ1bmN0aW9uIGRlc3VnYXJGbkF0dHJzKGZvcm0pIHtcbiAgcmV0dXJuIChpc0RpY3Rpb25hcnkodGhpcmQoZm9ybSkpKSB8fCAoaXNOaWwodGhpcmQoZm9ybSkpKSA/XG4gICAgZm9ybSA6XG4gICAgY29ucyhmaXJzdChmb3JtKSwgY29ucyhzZWNvbmQoZm9ybSksIGNvbnModm9pZCgwKSwgcmVzdChyZXN0KGZvcm0pKSkpKTtcbn07XG5leHBvcnRzLmRlc3VnYXJGbkF0dHJzID0gZGVzdWdhckZuQXR0cnM7XG5cbnZhciBjb21waWxlRGVzdWdhcmVkRm4gPSBmdW5jdGlvbiBjb21waWxlRGVzdWdhcmVkRm4obmFtZSwgZG9jLCBhdHRycywgcGFyYW1zLCBib2R5KSB7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUoaXNOaWwobmFtZSkgP1xuICAgIGxpc3QoXCJmdW5jdGlvbih+e30pIHtcXG4gIH57fVxcbn1cIiwgam9pbihcIiwgXCIsIG1hcChjb21waWxlLCAocGFyYW1zIHx8IDApW1wibmFtZXNcIl0pKSwgY29tcGlsZUZuQm9keShtYXAobWFjcm9leHBhbmQsIGJvZHkpLCBwYXJhbXMpKSA6XG4gICAgbGlzdChcImZ1bmN0aW9uIH57fSh+e30pIHtcXG4gIH57fVxcbn1cIiwgY29tcGlsZShuYW1lKSwgam9pbihcIiwgXCIsIG1hcChjb21waWxlLCAocGFyYW1zIHx8IDApW1wibmFtZXNcIl0pKSwgY29tcGlsZUZuQm9keShtYXAobWFjcm9leHBhbmQsIGJvZHkpLCBwYXJhbXMpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlRGVzdWdhcmVkRm4gPSBjb21waWxlRGVzdWdhcmVkRm47XG5cbnZhciBjb21waWxlU3RhdGVtZW50cyA9IGZ1bmN0aW9uIGNvbXBpbGVTdGF0ZW1lbnRzKGZvcm0sIHByZWZpeCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCBleHByZXNzaW9uLCBleHByZXNzaW9ucykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGlzRW1wdHkoZXhwcmVzc2lvbnMpID9cbiAgICAgIFwiXCIgKyByZXN1bHQgKyAoaXNOaWwocHJlZml4KSA/XG4gICAgICAgIFwiXCIgOlxuICAgICAgICBwcmVmaXgpICsgKGNvbXBpbGUobWFjcm9leHBhbmQoZXhwcmVzc2lvbikpKSArIFwiO1wiIDpcbiAgICAgIChyZXN1bHQgPSBcIlwiICsgcmVzdWx0ICsgKGNvbXBpbGUobWFjcm9leHBhbmQoZXhwcmVzc2lvbikpKSArIFwiO1xcblwiLCBleHByZXNzaW9uID0gZmlyc3QoZXhwcmVzc2lvbnMpLCBleHByZXNzaW9ucyA9IHJlc3QoZXhwcmVzc2lvbnMpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoXCJcIiwgZmlyc3QoZm9ybSksIHJlc3QoZm9ybSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZVN0YXRlbWVudHMgPSBjb21waWxlU3RhdGVtZW50cztcblxudmFyIGNvbXBpbGVGbkJvZHkgPSBmdW5jdGlvbiBjb21waWxlRm5Cb2R5KGZvcm0sIHBhcmFtcykge1xuICByZXR1cm4gKGlzRGljdGlvbmFyeShwYXJhbXMpKSAmJiAoKHBhcmFtcyB8fCAwKVtcInJlc3RcIl0pID9cbiAgICBjb21waWxlU3RhdGVtZW50cyhjb25zKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZGVmXCIpLCAocGFyYW1zIHx8IDApW1wicmVzdFwiXSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbFwiKSwgc3ltYm9sKHZvaWQoMCksIFwiYXJndW1lbnRzXCIpLCAocGFyYW1zIHx8IDApW1wiYXJpdHlcIl0pKSwgZm9ybSksIFwicmV0dXJuIFwiKSA6XG4gIChjb3VudChmb3JtKSA9PT0gMSkgJiYgKGlzTGlzdChmaXJzdChmb3JtKSkpICYmIChpc0VxdWFsKGZpcnN0KGZpcnN0KGZvcm0pKSwgc3ltYm9sKHZvaWQoMCksIFwiZG9cIikpKSA/XG4gICAgY29tcGlsZUZuQm9keShyZXN0KGZpcnN0KGZvcm0pKSwgcGFyYW1zKSA6XG4gICAgY29tcGlsZVN0YXRlbWVudHMoZm9ybSwgXCJyZXR1cm4gXCIpO1xufTtcbmV4cG9ydHMuY29tcGlsZUZuQm9keSA9IGNvbXBpbGVGbkJvZHk7XG5cbnZhciBkZXN1Z2FyUGFyYW1zID0gZnVuY3Rpb24gZGVzdWdhclBhcmFtcyhwYXJhbXMpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKG5hbWVzLCBwYXJhbXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KHBhcmFtcykgP1xuICAgICAge1xuICAgICAgICBcIm5hbWVzXCI6IG5hbWVzLFxuICAgICAgICBcImFyaXR5XCI6IGNvdW50KG5hbWVzKSxcbiAgICAgICAgXCJyZXN0XCI6IHZvaWQoMClcbiAgICAgIH0gOlxuICAgIGlzRXF1YWwoZmlyc3QocGFyYW1zKSwgc3ltYm9sKHZvaWQoMCksIFwiJlwiKSkgP1xuICAgICAgaXNFcXVhbChjb3VudChwYXJhbXMpLCAxKSA/XG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVzXCI6IG5hbWVzLFxuICAgICAgICAgIFwiYXJpdHlcIjogY291bnQobmFtZXMpLFxuICAgICAgICAgIFwicmVzdFwiOiB2b2lkKDApXG4gICAgICAgIH0gOlxuICAgICAgaXNFcXVhbChjb3VudChwYXJhbXMpLCAyKSA/XG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVzXCI6IG5hbWVzLFxuICAgICAgICAgIFwiYXJpdHlcIjogY291bnQobmFtZXMpLFxuICAgICAgICAgIFwicmVzdFwiOiBzZWNvbmQocGFyYW1zKVxuICAgICAgICB9IDpcbiAgICAgIFwiZWxzZVwiID9cbiAgICAgICAgKGZ1bmN0aW9uKCkgeyB0aHJvdyBUeXBlRXJyb3IoXCJVbmV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFmdGVyICZcIik7IH0pKCkgOlxuICAgICAgICB2b2lkKDApIDpcbiAgICBcImVsc2VcIiA/XG4gICAgICAobmFtZXMgPSBjb25qKG5hbWVzLCBmaXJzdChwYXJhbXMpKSwgcGFyYW1zID0gcmVzdChwYXJhbXMpLCBsb29wKSA6XG4gICAgICB2b2lkKDApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShbXSwgcGFyYW1zKTtcbn07XG5leHBvcnRzLmRlc3VnYXJQYXJhbXMgPSBkZXN1Z2FyUGFyYW1zO1xuXG52YXIgYW5hbHl6ZU92ZXJsb2FkZWRGbiA9IGZ1bmN0aW9uIGFuYWx5emVPdmVybG9hZGVkRm4obmFtZSwgZG9jLCBhdHRycywgb3ZlcmxvYWRzKSB7XG4gIHJldHVybiBtYXAoZnVuY3Rpb24ob3ZlcmxvYWQpIHtcbiAgICB2YXIgcGFyYW1zID0gZGVzdWdhclBhcmFtcyhmaXJzdChvdmVybG9hZCkpO1xuICAgIHJldHVybiB7XG4gICAgICBcInJlc3RcIjogKHBhcmFtcyB8fCAwKVtcInJlc3RcIl0sXG4gICAgICBcIm5hbWVzXCI6IChwYXJhbXMgfHwgMClbXCJuYW1lc1wiXSxcbiAgICAgIFwiYXJpdHlcIjogKHBhcmFtcyB8fCAwKVtcImFyaXR5XCJdLFxuICAgICAgXCJib2R5XCI6IHJlc3Qob3ZlcmxvYWQpXG4gICAgfTtcbiAgfSwgb3ZlcmxvYWRzKTtcbn07XG5leHBvcnRzLmFuYWx5emVPdmVybG9hZGVkRm4gPSBhbmFseXplT3ZlcmxvYWRlZEZuO1xuXG52YXIgY29tcGlsZU92ZXJsb2FkZWRGbiA9IGZ1bmN0aW9uIGNvbXBpbGVPdmVybG9hZGVkRm4obmFtZSwgZG9jLCBhdHRycywgb3ZlcmxvYWRzKSB7XG4gIHZhciBtZXRob2RzID0gYW5hbHl6ZU92ZXJsb2FkZWRGbihuYW1lLCBkb2MsIGF0dHJzLCBvdmVybG9hZHMpO1xuICB2YXIgZml4ZWRNZXRob2RzID0gZmlsdGVyKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIHJldHVybiAhKChtZXRob2QgfHwgMClbXCJyZXN0XCJdKTtcbiAgfSwgbWV0aG9kcyk7XG4gIHZhciB2YXJpYWRpYyA9IGZpcnN0KGZpbHRlcihmdW5jdGlvbihtZXRob2QpIHtcbiAgICByZXR1cm4gKG1ldGhvZCB8fCAwKVtcInJlc3RcIl07XG4gIH0sIG1ldGhvZHMpKTtcbiAgdmFyIG5hbWVzID0gcmVkdWNlKGZ1bmN0aW9uKG5hbWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gY291bnQobmFtZXMpID4gKHBhcmFtcyB8fCAwKVtcImFyaXR5XCJdID9cbiAgICAgIG5hbWVzIDpcbiAgICAgIChwYXJhbXMgfHwgMClbXCJuYW1lc1wiXTtcbiAgfSwgW10sIG1ldGhvZHMpO1xuICByZXR1cm4gbGlzdChzeW1ib2wodm9pZCgwKSwgXCJmblwiKSwgbmFtZSwgZG9jLCBhdHRycywgbmFtZXMsIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwicmF3KlwiKSwgY29tcGlsZVN3aXRjaChzeW1ib2wodm9pZCgwKSwgXCJhcmd1bWVudHMubGVuZ3RoXCIpLCBtYXAoZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIGNvbnMoKG1ldGhvZCB8fCAwKVtcImFyaXR5XCJdLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJhdypcIiksIGNvbXBpbGVGbkJvZHkoY29uY2F0KGNvbXBpbGVSZWJpbmQobmFtZXMsIChtZXRob2QgfHwgMClbXCJuYW1lc1wiXSksIChtZXRob2QgfHwgMClbXCJib2R5XCJdKSkpKTtcbiAgfSwgZml4ZWRNZXRob2RzKSwgaXNOaWwodmFyaWFkaWMpID9cbiAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInRocm93XCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcIkVycm9yXCIpLCBcIkludmFsaWQgYXJpdHlcIikpIDpcbiAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJhdypcIiksIGNvbXBpbGVGbkJvZHkoY29uY2F0KGNvbXBpbGVSZWJpbmQoY29ucyhsaXN0KHN5bWJvbCh2b2lkKDApLCBcIkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJhcmd1bWVudHNcIiksICh2YXJpYWRpYyB8fCAwKVtcImFyaXR5XCJdKSwgbmFtZXMpLCBjb25zKCh2YXJpYWRpYyB8fCAwKVtcInJlc3RcIl0sICh2YXJpYWRpYyB8fCAwKVtcIm5hbWVzXCJdKSksICh2YXJpYWRpYyB8fCAwKVtcImJvZHlcIl0pKSkpKSwgdm9pZCgwKSk7XG59O1xuZXhwb3J0cy5jb21waWxlT3ZlcmxvYWRlZEZuID0gY29tcGlsZU92ZXJsb2FkZWRGbjtcblxudmFyIGNvbXBpbGVSZWJpbmQgPSBmdW5jdGlvbiBjb21waWxlUmViaW5kKGJpbmRpbmdzLCBuYW1lcykge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoZm9ybSwgYmluZGluZ3MsIG5hbWVzKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShuYW1lcykgP1xuICAgICAgcmV2ZXJzZShmb3JtKSA6XG4gICAgICAoZm9ybSA9IGlzRXF1YWwoZmlyc3QobmFtZXMpLCBmaXJzdChiaW5kaW5ncykpID9cbiAgICAgICAgZm9ybSA6XG4gICAgICAgIGNvbnMobGlzdChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIGZpcnN0KG5hbWVzKSwgZmlyc3QoYmluZGluZ3MpKSwgZm9ybSksIGJpbmRpbmdzID0gcmVzdChiaW5kaW5ncyksIG5hbWVzID0gcmVzdChuYW1lcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShsaXN0KCksIGJpbmRpbmdzLCBuYW1lcyk7XG59O1xuZXhwb3J0cy5jb21waWxlUmViaW5kID0gY29tcGlsZVJlYmluZDtcblxudmFyIGNvbXBpbGVTd2l0Y2hDYXNlcyA9IGZ1bmN0aW9uIGNvbXBpbGVTd2l0Y2hDYXNlcyhjYXNlcykge1xuICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uKGZvcm0sIGNhc2VFeHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIFwiXCIgKyBmb3JtICsgKGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiY2FzZSB+e306XFxuICB+e31cXG5cIiwgY29tcGlsZShtYWNyb2V4cGFuZChmaXJzdChjYXNlRXhwcmVzc2lvbikpKSwgY29tcGlsZShtYWNyb2V4cGFuZChyZXN0KGNhc2VFeHByZXNzaW9uKSkpKSkpO1xuICB9LCBcIlwiLCBjYXNlcyk7XG59O1xuZXhwb3J0cy5jb21waWxlU3dpdGNoQ2FzZXMgPSBjb21waWxlU3dpdGNoQ2FzZXM7XG5cbnZhciBjb21waWxlU3dpdGNoID0gZnVuY3Rpb24gY29tcGlsZVN3aXRjaCh2YWx1ZSwgY2FzZXMsIGRlZmF1bHRDYXNlKSB7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdChcInN3aXRjaCAofnt9KSB7XFxuICB+e31cXG4gIGRlZmF1bHQ6XFxuICAgIH57fVxcbn1cIiwgY29tcGlsZShtYWNyb2V4cGFuZCh2YWx1ZSkpLCBjb21waWxlU3dpdGNoQ2FzZXMoY2FzZXMpLCBjb21waWxlKG1hY3JvZXhwYW5kKGRlZmF1bHRDYXNlKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVTd2l0Y2ggPSBjb21waWxlU3dpdGNoO1xuXG52YXIgY29tcGlsZUZuID0gZnVuY3Rpb24gY29tcGlsZUZuKGZvcm0pIHtcbiAgdmFyIHNpZ25hdHVyZSA9IGRlc3VnYXJGbkF0dHJzKGRlc3VnYXJGbkRvYyhkZXN1Z2FyRm5OYW1lKGZvcm0pKSk7XG4gIHZhciBuYW1lID0gZmlyc3Qoc2lnbmF0dXJlKTtcbiAgdmFyIGRvYyA9IHNlY29uZChzaWduYXR1cmUpO1xuICB2YXIgYXR0cnMgPSB0aGlyZChzaWduYXR1cmUpO1xuICByZXR1cm4gaXNWZWN0b3IodGhpcmQocmVzdChzaWduYXR1cmUpKSkgP1xuICAgIGNvbXBpbGVEZXN1Z2FyZWRGbihuYW1lLCBkb2MsIGF0dHJzLCBkZXN1Z2FyUGFyYW1zKHRoaXJkKHJlc3Qoc2lnbmF0dXJlKSkpLCByZXN0KHJlc3QocmVzdChyZXN0KHNpZ25hdHVyZSkpKSkpIDpcbiAgICBjb21waWxlKGNvbXBpbGVPdmVybG9hZGVkRm4obmFtZSwgZG9jLCBhdHRycywgcmVzdChyZXN0KHJlc3Qoc2lnbmF0dXJlKSkpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlRm4gPSBjb21waWxlRm47XG5cbnZhciBjb21waWxlSW52b2tlID0gZnVuY3Rpb24gY29tcGlsZUludm9rZShmb3JtKSB7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdChpc0xpc3QoZmlyc3QoZm9ybSkpID9cbiAgICBcIih+e30pKH57fSlcIiA6XG4gICAgXCJ+e30ofnt9KVwiLCBjb21waWxlKGZpcnN0KGZvcm0pKSwgY29tcGlsZUdyb3VwKHJlc3QoZm9ybSkpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlSW52b2tlID0gY29tcGlsZUludm9rZTtcblxudmFyIGNvbXBpbGVHcm91cCA9IGZ1bmN0aW9uIGNvbXBpbGVHcm91cChmb3JtLCB3cmFwKSB7XG4gIHJldHVybiB3cmFwID9cbiAgICBcIlwiICsgXCIoXCIgKyAoY29tcGlsZUdyb3VwKGZvcm0pKSArIFwiKVwiIDpcbiAgICBqb2luKFwiLCBcIiwgdmVjKG1hcChjb21waWxlLCBtYXAobWFjcm9leHBhbmQsIGZvcm0pKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZUdyb3VwID0gY29tcGlsZUdyb3VwO1xuXG52YXIgY29tcGlsZURvID0gZnVuY3Rpb24gY29tcGlsZURvKGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGUobGlzdChjb25zKHN5bWJvbCh2b2lkKDApLCBcImZuXCIpLCBjb25zKFtdLCBmb3JtKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVEbyA9IGNvbXBpbGVEbztcblxudmFyIGRlZmluZUJpbmRpbmdzID0gZnVuY3Rpb24gZGVmaW5lQmluZGluZ3MoZm9ybSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoZGVmcywgYmluZGluZ3MpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBjb3VudChiaW5kaW5ncykgPT09IDAgP1xuICAgICAgcmV2ZXJzZShkZWZzKSA6XG4gICAgICAoZGVmcyA9IGNvbnMobGlzdChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIChiaW5kaW5ncyB8fCAwKVswXSwgKGJpbmRpbmdzIHx8IDApWzFdKSwgZGVmcyksIGJpbmRpbmdzID0gcmVzdChyZXN0KGJpbmRpbmdzKSksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShsaXN0KCksIGZvcm0pO1xufTtcbmV4cG9ydHMuZGVmaW5lQmluZGluZ3MgPSBkZWZpbmVCaW5kaW5ncztcblxudmFyIGNvbXBpbGVUaHJvdyA9IGZ1bmN0aW9uIGNvbXBpbGVUaHJvdyhmb3JtKSB7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdChcIihmdW5jdGlvbigpIHsgdGhyb3cgfnt9OyB9KSgpXCIsIGNvbXBpbGUobWFjcm9leHBhbmQoZmlyc3QoZm9ybSkpKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZVRocm93ID0gY29tcGlsZVRocm93O1xuXG52YXIgY29tcGlsZVNldCA9IGZ1bmN0aW9uIGNvbXBpbGVTZXQoZm9ybSkge1xuICByZXR1cm4gY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJ+e30gPSB+e31cIiwgY29tcGlsZShtYWNyb2V4cGFuZChmaXJzdChmb3JtKSkpLCBjb21waWxlKG1hY3JvZXhwYW5kKHNlY29uZChmb3JtKSkpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlU2V0ID0gY29tcGlsZVNldDtcblxudmFyIGNvbXBpbGVWZWN0b3IgPSBmdW5jdGlvbiBjb21waWxlVmVjdG9yKGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiW357fV1cIiwgY29tcGlsZUdyb3VwKGZvcm0pKSk7XG59O1xuZXhwb3J0cy5jb21waWxlVmVjdG9yID0gY29tcGlsZVZlY3RvcjtcblxudmFyIGNvbXBpbGVUcnkgPSBmdW5jdGlvbiBjb21waWxlVHJ5KGZvcm0pIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHRyeUV4cHJzLCBjYXRjaEV4cHJzLCBmaW5hbGx5RXhwcnMsIGV4cHJzKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShleHBycykgP1xuICAgICAgaXNFbXB0eShjYXRjaEV4cHJzKSA/XG4gICAgICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiKGZ1bmN0aW9uKCkge1xcbnRyeSB7XFxuICB+e31cXG59IGZpbmFsbHkge1xcbiAgfnt9XFxufX0pKClcIiwgY29tcGlsZUZuQm9keSh0cnlFeHBycyksIGNvbXBpbGVGbkJvZHkoZmluYWxseUV4cHJzKSkpIDpcbiAgICAgIGlzRW1wdHkoZmluYWxseUV4cHJzKSA/XG4gICAgICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiKGZ1bmN0aW9uKCkge1xcbnRyeSB7XFxuICB+e31cXG59IGNhdGNoICh+e30pIHtcXG4gIH57fVxcbn19KSgpXCIsIGNvbXBpbGVGbkJvZHkodHJ5RXhwcnMpLCBjb21waWxlKGZpcnN0KGNhdGNoRXhwcnMpKSwgY29tcGlsZUZuQm9keShyZXN0KGNhdGNoRXhwcnMpKSkpIDpcbiAgICAgICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoXCIoZnVuY3Rpb24oKSB7XFxudHJ5IHtcXG4gIH57fVxcbn0gY2F0Y2ggKH57fSkge1xcbiAgfnt9XFxufSBmaW5hbGx5IHtcXG4gIH57fVxcbn19KSgpXCIsIGNvbXBpbGVGbkJvZHkodHJ5RXhwcnMpLCBjb21waWxlKGZpcnN0KGNhdGNoRXhwcnMpKSwgY29tcGlsZUZuQm9keShyZXN0KGNhdGNoRXhwcnMpKSwgY29tcGlsZUZuQm9keShmaW5hbGx5RXhwcnMpKSkgOlxuICAgIGlzRXF1YWwoZmlyc3QoZmlyc3QoZXhwcnMpKSwgc3ltYm9sKHZvaWQoMCksIFwiY2F0Y2hcIikpID9cbiAgICAgICh0cnlFeHBycyA9IHRyeUV4cHJzLCBjYXRjaEV4cHJzID0gcmVzdChmaXJzdChleHBycykpLCBmaW5hbGx5RXhwcnMgPSBmaW5hbGx5RXhwcnMsIGV4cHJzID0gcmVzdChleHBycyksIGxvb3ApIDpcbiAgICBpc0VxdWFsKGZpcnN0KGZpcnN0KGV4cHJzKSksIHN5bWJvbCh2b2lkKDApLCBcImZpbmFsbHlcIikpID9cbiAgICAgICh0cnlFeHBycyA9IHRyeUV4cHJzLCBjYXRjaEV4cHJzID0gY2F0Y2hFeHBycywgZmluYWxseUV4cHJzID0gcmVzdChmaXJzdChleHBycykpLCBleHBycyA9IHJlc3QoZXhwcnMpLCBsb29wKSA6XG4gICAgICAodHJ5RXhwcnMgPSBjb25zKGZpcnN0KGV4cHJzKSwgdHJ5RXhwcnMpLCBjYXRjaEV4cHJzID0gY2F0Y2hFeHBycywgZmluYWxseUV4cHJzID0gZmluYWxseUV4cHJzLCBleHBycyA9IHJlc3QoZXhwcnMpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkobGlzdCgpLCBsaXN0KCksIGxpc3QoKSwgcmV2ZXJzZShmb3JtKSk7XG59O1xuZXhwb3J0cy5jb21waWxlVHJ5ID0gY29tcGlsZVRyeTtcblxudmFyIGNvbXBpbGVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGNvbXBpbGVQcm9wZXJ0eShmb3JtKSB7XG4gIHJldHVybiAobmFtZShzZWNvbmQoZm9ybSkpKVswXSA9PT0gXCItXCIgP1xuICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KGlzTGlzdChmaXJzdChmb3JtKSkgP1xuICAgICAgXCIofnt9KS5+e31cIiA6XG4gICAgICBcIn57fS5+e31cIiwgY29tcGlsZShtYWNyb2V4cGFuZChmaXJzdChmb3JtKSkpLCBjb21waWxlKG1hY3JvZXhwYW5kKHN5bWJvbChzdWJzKG5hbWUoc2Vjb25kKGZvcm0pKSwgMSkpKSkpKSA6XG4gICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJ+e30ufnt9KH57fSlcIiwgY29tcGlsZShtYWNyb2V4cGFuZChmaXJzdChmb3JtKSkpLCBjb21waWxlKG1hY3JvZXhwYW5kKHNlY29uZChmb3JtKSkpLCBjb21waWxlR3JvdXAocmVzdChyZXN0KGZvcm0pKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVQcm9wZXJ0eSA9IGNvbXBpbGVQcm9wZXJ0eTtcblxudmFyIGNvbXBpbGVBcHBseSA9IGZ1bmN0aW9uIGNvbXBpbGVBcHBseShmb3JtKSB7XG4gIHJldHVybiBjb21waWxlKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiLlwiKSwgZmlyc3QoZm9ybSksIHN5bWJvbCh2b2lkKDApLCBcImFwcGx5XCIpLCBmaXJzdChmb3JtKSwgc2Vjb25kKGZvcm0pKSk7XG59O1xuZXhwb3J0cy5jb21waWxlQXBwbHkgPSBjb21waWxlQXBwbHk7XG5cbnZhciBjb21waWxlTmV3ID0gZnVuY3Rpb24gY29tcGlsZU5ldyhmb3JtKSB7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdChcIm5ldyB+e31cIiwgY29tcGlsZShmb3JtKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZU5ldyA9IGNvbXBpbGVOZXc7XG5cbnZhciBjb21waWxlQWdldCA9IGZ1bmN0aW9uIGNvbXBpbGVBZ2V0KGZvcm0pIHtcbiAgdmFyIHRhcmdldCA9IG1hY3JvZXhwYW5kKGZpcnN0KGZvcm0pKTtcbiAgdmFyIGF0dHJpYnV0ZSA9IG1hY3JvZXhwYW5kKHNlY29uZChmb3JtKSk7XG4gIHZhciBub3RGb3VuZCA9IHRoaXJkKGZvcm0pO1xuICB2YXIgdGVtcGxhdGUgPSBpc0xpc3QodGFyZ2V0KSA/XG4gICAgXCIofnt9KVt+e31dXCIgOlxuICAgIFwifnt9W357fV1cIjtcbiAgcmV0dXJuIG5vdEZvdW5kID9cbiAgICBjb21waWxlKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwib3JcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZ2V0XCIpLCBmaXJzdChmb3JtKSwgc2Vjb25kKGZvcm0pKSwgbWFjcm9leHBhbmQobm90Rm91bmQpKSkgOlxuICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KHRlbXBsYXRlLCBjb21waWxlKHRhcmdldCksIGNvbXBpbGUoYXR0cmlidXRlKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZUFnZXQgPSBjb21waWxlQWdldDtcblxudmFyIGNvbXBpbGVHZXQgPSBmdW5jdGlvbiBjb21waWxlR2V0KGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVBZ2V0KGNvbnMobGlzdChzeW1ib2wodm9pZCgwKSwgXCJvclwiKSwgZmlyc3QoZm9ybSksIDApLCByZXN0KGZvcm0pKSk7XG59O1xuZXhwb3J0cy5jb21waWxlR2V0ID0gY29tcGlsZUdldDtcblxudmFyIGNvbXBpbGVJbnN0YW5jZSA9IGZ1bmN0aW9uIGNvbXBpbGVJbnN0YW5jZShmb3JtKSB7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdChcIn57fSBpbnN0YW5jZW9mIH57fVwiLCBjb21waWxlKG1hY3JvZXhwYW5kKHNlY29uZChmb3JtKSkpLCBjb21waWxlKG1hY3JvZXhwYW5kKGZpcnN0KGZvcm0pKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVJbnN0YW5jZSA9IGNvbXBpbGVJbnN0YW5jZTtcblxudmFyIGNvbXBpbGVOb3QgPSBmdW5jdGlvbiBjb21waWxlTm90KGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiISh+e30pXCIsIGNvbXBpbGUobWFjcm9leHBhbmQoZmlyc3QoZm9ybSkpKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZU5vdCA9IGNvbXBpbGVOb3Q7XG5cbnZhciBjb21waWxlTG9vcCA9IGZ1bmN0aW9uIGNvbXBpbGVMb29wKGZvcm0pIHtcbiAgdmFyIGJpbmRpbmdzID0gKGZ1bmN0aW9uIGxvb3AobmFtZXMsIHZhbHVlcywgdG9rZW5zKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eSh0b2tlbnMpID9cbiAgICAgIHtcbiAgICAgICAgXCJuYW1lc1wiOiBuYW1lcyxcbiAgICAgICAgXCJ2YWx1ZXNcIjogdmFsdWVzXG4gICAgICB9IDpcbiAgICAgIChuYW1lcyA9IGNvbmoobmFtZXMsIGZpcnN0KHRva2VucykpLCB2YWx1ZXMgPSBjb25qKHZhbHVlcywgc2Vjb25kKHRva2VucykpLCB0b2tlbnMgPSByZXN0KHJlc3QodG9rZW5zKSksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShbXSwgW10sIGZpcnN0KGZvcm0pKTtcbiAgdmFyIG5hbWVzID0gKGJpbmRpbmdzIHx8IDApW1wibmFtZXNcIl07XG4gIHZhciB2YWx1ZXMgPSAoYmluZGluZ3MgfHwgMClbXCJ2YWx1ZXNcIl07XG4gIHZhciBib2R5ID0gcmVzdChmb3JtKTtcbiAgcmV0dXJuIGNvbXBpbGUoY29ucyhjb25zKHN5bWJvbCh2b2lkKDApLCBcImZuXCIpLCBjb25zKHN5bWJvbCh2b2lkKDApLCBcImxvb3BcIiksIGNvbnMobmFtZXMsIGNvbXBpbGVSZWN1cihuYW1lcywgYm9keSkpKSksIGxpc3QuYXBwbHkobGlzdCwgdmFsdWVzKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZUxvb3AgPSBjb21waWxlTG9vcDtcblxudmFyIHJlYmluZEJpbmRpbmdzID0gZnVuY3Rpb24gcmViaW5kQmluZGluZ3MobmFtZXMsIHZhbHVlcykge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCBuYW1lcywgdmFsdWVzKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShuYW1lcykgP1xuICAgICAgcmV2ZXJzZShyZXN1bHQpIDpcbiAgICAgIChyZXN1bHQgPSBjb25zKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgZmlyc3QobmFtZXMpLCBmaXJzdCh2YWx1ZXMpKSwgcmVzdWx0KSwgbmFtZXMgPSByZXN0KG5hbWVzKSwgdmFsdWVzID0gcmVzdCh2YWx1ZXMpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkobGlzdCgpLCBuYW1lcywgdmFsdWVzKTtcbn07XG5leHBvcnRzLnJlYmluZEJpbmRpbmdzID0gcmViaW5kQmluZGluZ3M7XG5cbnZhciBleHBhbmRSZWN1ciA9IGZ1bmN0aW9uIGV4cGFuZFJlY3VyKG5hbWVzLCBib2R5KSB7XG4gIHJldHVybiBtYXAoZnVuY3Rpb24oZm9ybSkge1xuICAgIHJldHVybiBpc0xpc3QoZm9ybSkgP1xuICAgICAgaXNFcXVhbChmaXJzdChmb3JtKSwgc3ltYm9sKHZvaWQoMCksIFwicmVjdXJcIikpID9cbiAgICAgICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJyYXcqXCIpLCBjb21waWxlR3JvdXAoY29uY2F0KHJlYmluZEJpbmRpbmdzKG5hbWVzLCByZXN0KGZvcm0pKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJsb29wXCIpKSksIHRydWUpKSA6XG4gICAgICAgIGV4cGFuZFJlY3VyKG5hbWVzLCBmb3JtKSA6XG4gICAgICBmb3JtO1xuICB9LCBib2R5KTtcbn07XG5leHBvcnRzLmV4cGFuZFJlY3VyID0gZXhwYW5kUmVjdXI7XG5cbnZhciBjb21waWxlUmVjdXIgPSBmdW5jdGlvbiBjb21waWxlUmVjdXIobmFtZXMsIGJvZHkpIHtcbiAgcmV0dXJuIGxpc3QobGlzdChzeW1ib2wodm9pZCgwKSwgXCJyYXcqXCIpLCBjb21waWxlVGVtcGxhdGUobGlzdChcInZhciByZWN1ciA9IGxvb3A7XFxud2hpbGUgKHJlY3VyID09PSBsb29wKSB7XFxuICByZWN1ciA9IH57fVxcbn1cIiwgY29tcGlsZVN0YXRlbWVudHMoZXhwYW5kUmVjdXIobmFtZXMsIGJvZHkpKSkpKSwgc3ltYm9sKHZvaWQoMCksIFwicmVjdXJcIikpO1xufTtcbmV4cG9ydHMuY29tcGlsZVJlY3VyID0gY29tcGlsZVJlY3VyO1xuXG52YXIgY29tcGlsZVJhdyA9IGZ1bmN0aW9uIGNvbXBpbGVSYXcoZm9ybSkge1xuICByZXR1cm4gZmlyc3QoZm9ybSk7XG59O1xuZXhwb3J0cy5jb21waWxlUmF3ID0gY29tcGlsZVJhdztcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgY29tcGlsZVNldCk7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcImdldFwiKSwgY29tcGlsZUdldCk7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcImFnZXRcIiksIGNvbXBpbGVBZ2V0KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiZGVmXCIpLCBjb21waWxlRGVmKTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiaWZcIiksIGNvbXBpbGVJZkVsc2UpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJkb1wiKSwgY29tcGlsZURvKTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiZG8qXCIpLCBjb21waWxlU3RhdGVtZW50cyk7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcImZuXCIpLCBjb21waWxlRm4pO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJ0aHJvd1wiKSwgY29tcGlsZVRocm93KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwidmVjdG9yXCIpLCBjb21waWxlVmVjdG9yKTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwidHJ5XCIpLCBjb21waWxlVHJ5KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiLlwiKSwgY29tcGlsZVByb3BlcnR5KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiYXBwbHlcIiksIGNvbXBpbGVBcHBseSk7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcIm5ld1wiKSwgY29tcGlsZU5ldyk7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcImluc3RhbmNlP1wiKSwgY29tcGlsZUluc3RhbmNlKTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwibm90XCIpLCBjb21waWxlTm90KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwibG9vcFwiKSwgY29tcGlsZUxvb3ApO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJyYXcqXCIpLCBjb21waWxlUmF3KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiY29tbWVudFwiKSwgd3JpdGVDb21tZW50KTtcblxudmFyIGNvbXBpbGVSZVBhdHRlcm4gPSBmdW5jdGlvbiBjb21waWxlUmVQYXR0ZXJuKGZvcm0pIHtcbiAgcmV0dXJuIFwiXCIgKyBmb3JtO1xufTtcbmV4cG9ydHMuY29tcGlsZVJlUGF0dGVybiA9IGNvbXBpbGVSZVBhdHRlcm47XG5cbnZhciBpbnN0YWxsTmF0aXZlID0gZnVuY3Rpb24gaW5zdGFsbE5hdGl2ZShhbGlhcywgb3BlcmF0b3IsIHZhbGlkYXRvciwgZmFsbGJhY2spIHtcbiAgcmV0dXJuIGluc3RhbGxTcGVjaWFsKGFsaWFzLCBmdW5jdGlvbihmb3JtKSB7XG4gICAgcmV0dXJuIGlzRW1wdHkoZm9ybSkgP1xuICAgICAgZmFsbGJhY2sgOlxuICAgICAgcmVkdWNlKGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdChcIn57fSB+e30gfnt9XCIsIGxlZnQsIG5hbWUob3BlcmF0b3IpLCByaWdodCkpO1xuICAgICAgfSwgbWFwKGZ1bmN0aW9uKG9wZXJhbmQpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KGlzTGlzdChvcGVyYW5kKSA/XG4gICAgICAgICAgXCIofnt9KVwiIDpcbiAgICAgICAgICBcIn57fVwiLCBjb21waWxlKG1hY3JvZXhwYW5kKG9wZXJhbmQpKSkpO1xuICAgICAgfSwgZm9ybSkpO1xuICB9LCB2YWxpZGF0b3IpO1xufTtcbmV4cG9ydHMuaW5zdGFsbE5hdGl2ZSA9IGluc3RhbGxOYXRpdmU7XG5cbnZhciBpbnN0YWxsT3BlcmF0b3IgPSBmdW5jdGlvbiBpbnN0YWxsT3BlcmF0b3IoYWxpYXMsIG9wZXJhdG9yKSB7XG4gIHJldHVybiBpbnN0YWxsU3BlY2lhbChhbGlhcywgZnVuY3Rpb24oZm9ybSkge1xuICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIGxlZnQsIHJpZ2h0LCBvcGVyYW5kcykge1xuICAgICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICByZWN1ciA9IGlzRW1wdHkob3BlcmFuZHMpID9cbiAgICAgICAgXCJcIiArIHJlc3VsdCArIChjb21waWxlVGVtcGxhdGUobGlzdChcIn57fSB+e30gfnt9XCIsIGNvbXBpbGUobWFjcm9leHBhbmQobGVmdCkpLCBuYW1lKG9wZXJhdG9yKSwgY29tcGlsZShtYWNyb2V4cGFuZChyaWdodCkpKSkpIDpcbiAgICAgICAgKHJlc3VsdCA9IFwiXCIgKyByZXN1bHQgKyAoY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJ+e30gfnt9IH57fSAmJiBcIiwgY29tcGlsZShtYWNyb2V4cGFuZChsZWZ0KSksIG5hbWUob3BlcmF0b3IpLCBjb21waWxlKG1hY3JvZXhwYW5kKHJpZ2h0KSkpKSksIGxlZnQgPSByaWdodCwgcmlnaHQgPSBmaXJzdChvcGVyYW5kcyksIG9wZXJhbmRzID0gcmVzdChvcGVyYW5kcyksIGxvb3ApO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZWN1cjtcbiAgICB9KShcIlwiLCBmaXJzdChmb3JtKSwgc2Vjb25kKGZvcm0pLCByZXN0KHJlc3QoZm9ybSkpKTtcbiAgfSwgdmVyaWZ5VHdvKTtcbn07XG5leHBvcnRzLmluc3RhbGxPcGVyYXRvciA9IGluc3RhbGxPcGVyYXRvcjtcblxudmFyIGNvbXBpbGVyRXJyb3IgPSBmdW5jdGlvbiBjb21waWxlckVycm9yKGZvcm0sIG1lc3NhZ2UpIHtcbiAgdmFyIGVycm9yID0gRXJyb3IoXCJcIiArIG1lc3NhZ2UpO1xuICBlcnJvci5saW5lID0gMTtcbiAgcmV0dXJuIChmdW5jdGlvbigpIHsgdGhyb3cgZXJyb3I7IH0pKCk7XG59O1xuZXhwb3J0cy5jb21waWxlckVycm9yID0gY29tcGlsZXJFcnJvcjtcblxudmFyIHZlcmlmeVR3byA9IGZ1bmN0aW9uIHZlcmlmeVR3byhmb3JtKSB7XG4gIHJldHVybiAoaXNFbXB0eShyZXN0KGZvcm0pKSkgfHwgKGlzRW1wdHkocmVzdChyZXN0KGZvcm0pKSkpID9cbiAgICAoZnVuY3Rpb24oKSB7IHRocm93IGNvbXBpbGVyRXJyb3IoZm9ybSwgXCJcIiArIChmaXJzdChmb3JtKSkgKyBcIiBmb3JtIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBvcGVyYW5kc1wiKTsgfSkoKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnZlcmlmeVR3byA9IHZlcmlmeVR3bztcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCIrXCIpLCBzeW1ib2wodm9pZCgwKSwgXCIrXCIpLCB2b2lkKDApLCAwKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCItXCIpLCBzeW1ib2wodm9pZCgwKSwgXCItXCIpLCB2b2lkKDApLCBcIk5hTlwiKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCIqXCIpLCBzeW1ib2wodm9pZCgwKSwgXCIqXCIpLCB2b2lkKDApLCAxKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCIvXCIpLCBzeW1ib2wodm9pZCgwKSwgXCIvXCIpLCB2ZXJpZnlUd28pO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcIm1vZFwiKSwgc3ltYm9sKFwiJVwiKSwgdmVyaWZ5VHdvKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCJhbmRcIiksIHN5bWJvbCh2b2lkKDApLCBcIiYmXCIpKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCJvclwiKSwgc3ltYm9sKHZvaWQoMCksIFwifHxcIikpO1xuXG5pbnN0YWxsT3BlcmF0b3Ioc3ltYm9sKHZvaWQoMCksIFwibm90PVwiKSwgc3ltYm9sKHZvaWQoMCksIFwiIT1cIikpO1xuXG5pbnN0YWxsT3BlcmF0b3Ioc3ltYm9sKHZvaWQoMCksIFwiPT1cIiksIHN5bWJvbCh2b2lkKDApLCBcIj09PVwiKSk7XG5cbmluc3RhbGxPcGVyYXRvcihzeW1ib2wodm9pZCgwKSwgXCJpZGVudGljYWw/XCIpLCBzeW1ib2wodm9pZCgwKSwgXCI9PT1cIikpO1xuXG5pbnN0YWxsT3BlcmF0b3Ioc3ltYm9sKHZvaWQoMCksIFwiPlwiKSwgc3ltYm9sKHZvaWQoMCksIFwiPlwiKSk7XG5cbmluc3RhbGxPcGVyYXRvcihzeW1ib2wodm9pZCgwKSwgXCI+PVwiKSwgc3ltYm9sKHZvaWQoMCksIFwiPj1cIikpO1xuXG5pbnN0YWxsT3BlcmF0b3Ioc3ltYm9sKHZvaWQoMCksIFwiPFwiKSwgc3ltYm9sKHZvaWQoMCksIFwiPFwiKSk7XG5cbmluc3RhbGxPcGVyYXRvcihzeW1ib2wodm9pZCgwKSwgXCI8PVwiKSwgc3ltYm9sKHZvaWQoMCksIFwiPD1cIikpO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcImJpdC1hbmRcIiksIHN5bWJvbCh2b2lkKDApLCBcIiZcIiksIHZlcmlmeVR3byk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwiYml0LW9yXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJ8XCIpLCB2ZXJpZnlUd28pO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcImJpdC14b3JcIiksIHN5bWJvbChcIl5cIikpO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcImJpdC1ub3RcIiksIHN5bWJvbChcIn5cIiksIHZlcmlmeVR3byk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwiYml0LXNoaWZ0LWxlZnRcIiksIHN5bWJvbCh2b2lkKDApLCBcIjw8XCIpLCB2ZXJpZnlUd28pO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcImJpdC1zaGlmdC1yaWdodFwiKSwgc3ltYm9sKHZvaWQoMCksIFwiPj5cIiksIHZlcmlmeVR3byk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwiYml0LXNoaWZ0LXJpZ2h0LXplcm8tZmlsXCIpLCBzeW1ib2wodm9pZCgwKSwgXCI+Pj5cIiksIHZlcmlmeVR3byk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJzdHJcIiksIGZ1bmN0aW9uIHN0cigpIHtcbiAgdmFyIGZvcm1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGNvbmNhdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcIitcIiksIFwiXCIpLCBmb3Jtcyk7XG59KTtcblxuaW5zdGFsbE1hY3JvKHN5bWJvbCh2b2lkKDApLCBcImxldFwiKSwgZnVuY3Rpb24gbGV0TWFjcm8oYmluZGluZ3MpIHtcbiAgdmFyIGJvZHkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gY29ucyhzeW1ib2wodm9pZCgwKSwgXCJkb1wiKSwgY29uY2F0KGRlZmluZUJpbmRpbmdzKGJpbmRpbmdzKSwgYm9keSkpO1xufSk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJjb25kXCIpLCBmdW5jdGlvbiBjb25kKCkge1xuICB2YXIgY2xhdXNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiAhKGlzRW1wdHkoY2xhdXNlcykpID9cbiAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImlmXCIpLCBmaXJzdChjbGF1c2VzKSwgaXNFbXB0eShyZXN0KGNsYXVzZXMpKSA/XG4gICAgICAoZnVuY3Rpb24oKSB7IHRocm93IEVycm9yKFwiY29uZCByZXF1aXJlcyBhbiBldmVuIG51bWJlciBvZiBmb3Jtc1wiKTsgfSkoKSA6XG4gICAgICBzZWNvbmQoY2xhdXNlcyksIGNvbnMoc3ltYm9sKHZvaWQoMCksIFwiY29uZFwiKSwgcmVzdChyZXN0KGNsYXVzZXMpKSkpIDpcbiAgICB2b2lkKDApO1xufSk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJkZWZuXCIpLCBmdW5jdGlvbiBkZWZuKG5hbWUpIHtcbiAgdmFyIGJvZHkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gbGlzdChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIG5hbWUsIGNvbmNhdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcImZuXCIpLCBuYW1lKSwgYm9keSkpO1xufSk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJkZWZuLVwiKSwgZnVuY3Rpb24gZGVmbihuYW1lKSB7XG4gIHZhciBib2R5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgcmV0dXJuIGNvbmNhdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcImRlZm5cIiksIHdpdGhNZXRhKG5hbWUsIGNvbmooe1xuICAgIFwicHJpdmF0ZVwiOiB0cnVlXG4gIH0sIG1ldGEobmFtZSkpKSksIGJvZHkpO1xufSk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJhc3NlcnRcIiksIGZ1bmN0aW9uIGFzc2VydCh4LCBtZXNzYWdlKSB7XG4gIHZhciB0aXRsZSA9IG1lc3NhZ2UgfHwgXCJcIjtcbiAgdmFyIGFzc2VydGlvbiA9IHByU3RyKHgpO1xuICB2YXIgdXJpID0gKHggfHwgMClbXCJ1cmlcIl07XG4gIHZhciBmb3JtID0gaXNMaXN0KHgpID9cbiAgICBzZWNvbmQoeCkgOlxuICAgIHg7XG4gIHJldHVybiBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImRvXCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImlmXCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImFuZFwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJub3RcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiaWRlbnRpY2FsP1wiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJ0eXBlb2ZcIiksIHN5bWJvbCh2b2lkKDApLCBcIioqdmVyYm9zZSoqXCIpKSwgXCJ1bmRlZmluZWRcIikpLCBzeW1ib2wodm9pZCgwKSwgXCIqKnZlcmJvc2UqKlwiKSksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiLmxvZ1wiKSwgc3ltYm9sKHZvaWQoMCksIFwiY29uc29sZVwiKSwgXCJBc3NlcnQ6XCIsIGFzc2VydGlvbikpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImlmXCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcIm5vdFwiKSwgeCksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwidGhyb3dcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiRXJyb3IuXCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInN0clwiKSwgXCJBc3NlcnQgZmFpbGVkOiBcIiwgdGl0bGUsIFwiXFxuXFxuQXNzZXJ0aW9uOlxcblxcblwiLCBhc3NlcnRpb24sIFwiXFxuXFxuQWN0dWFsOlxcblxcblwiLCBmb3JtLCBcIlxcbi0tLS0tLS0tLS0tLS0tXFxuXCIpLCB1cmkpKSkpO1xufSk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJpbXBvcnRcIiksIGZ1bmN0aW9uKGltcG9ydHMsIHBhdGgpIHtcbiAgcmV0dXJuIGlzTmlsKHBhdGgpID9cbiAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJlcXVpcmVcIiksIGltcG9ydHMpIDpcbiAgaXNTeW1ib2woaW1wb3J0cykgP1xuICAgIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZGVmXCIpLCB3aXRoTWV0YShpbXBvcnRzLCB7XG4gICAgICBcInByaXZhdGVcIjogdHJ1ZVxuICAgIH0pLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJlcXVpcmVcIiksIHBhdGgpKSA6XG4gICAgKGZ1bmN0aW9uIGxvb3AoZm9ybSwgbmFtZXMpIHtcbiAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgcmVjdXIgPSBpc0VtcHR5KG5hbWVzKSA/XG4gICAgICAgIGNvbmNhdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcImRvKlwiKSksIGZvcm0pIDpcbiAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhbGlhcyA9IGZpcnN0KG5hbWVzKTtcbiAgICAgICAgICB2YXIgaWQgPSBzeW1ib2woXCJcIiArIFwiLi1cIiArIChuYW1lKGFsaWFzKSkpO1xuICAgICAgICAgIHJldHVybiAoZm9ybSA9IGNvbnMobGlzdChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIHdpdGhNZXRhKGFsaWFzLCB7XG4gICAgICAgICAgICBcInByaXZhdGVcIjogdHJ1ZVxuICAgICAgICAgIH0pLCBsaXN0KGlkLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJlcXVpcmVcIiksIHBhdGgpKSksIGZvcm0pLCBuYW1lcyA9IHJlc3QobmFtZXMpLCBsb29wKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVjdXI7XG4gICAgfSkobGlzdCgpLCBpbXBvcnRzKTtcbn0pO1xuXG52YXIgZXhwYW5kTnMgPSBmdW5jdGlvbiBleHBhbmROcyhpZCkge1xuICB2YXIgcGFyYW1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgcmV0dXJuIChmdW5jdGlvbigpIHtcbiAgICB2YXIgbnMgPSBcIlwiICsgaWQ7XG4gICAgdmFyIHJlcXVpcmVyID0gc3BsaXQobnMsIFwiLlwiKTtcbiAgICB2YXIgZG9jID0gaXNTdHJpbmcoZmlyc3QocGFyYW1zKSkgP1xuICAgICAgZmlyc3QocGFyYW1zKSA6XG4gICAgICB2b2lkKDApO1xuICAgIHZhciBhcmdzID0gZG9jID9cbiAgICAgIHJlc3QocGFyYW1zKSA6XG4gICAgICBwYXJhbXM7XG4gICAgdmFyIHBhcnNlUmVmZXJlbmNlcyA9IGZ1bmN0aW9uKGZvcm1zKSB7XG4gICAgICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uKHJlZmVyZW5jZXMsIGZvcm0pIHtcbiAgICAgICAgKHJlZmVyZW5jZXMgfHwgMClbbmFtZShmaXJzdChmb3JtKSldID0gdmVjKHJlc3QoZm9ybSkpO1xuICAgICAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgICAgIH0sIHt9LCBmb3Jtcyk7XG4gICAgfTtcbiAgICB2YXIgcmVmZXJlbmNlcyA9IHBhcnNlUmVmZXJlbmNlcyhhcmdzKTtcbiAgICB2YXIgaWRUb1BhdGggPSBmdW5jdGlvbiBpZFRvUGF0aChpZCkge1xuICAgICAgdmFyIHJlcXVpcmVtZW50ID0gc3BsaXQoXCJcIiArIGlkLCBcIi5cIik7XG4gICAgICB2YXIgaXNSZWxhdGl2ZSA9IGZpcnN0KHJlcXVpcmVyKSA9PT0gZmlyc3QocmVxdWlyZW1lbnQpO1xuICAgICAgcmV0dXJuIGlzUmVsYXRpdmUgP1xuICAgICAgICAoZnVuY3Rpb24gbG9vcChmcm9tLCB0bykge1xuICAgICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICAgICAgICByZWN1ciA9IGZpcnN0KGZyb20pID09PSBmaXJzdCh0bykgP1xuICAgICAgICAgICAgKGZyb20gPSByZXN0KGZyb20pLCB0byA9IHJlc3QodG8pLCBsb29wKSA6XG4gICAgICAgICAgICBqb2luKFwiL1wiLCBjb25jYXQoW1wiLlwiXSwgcmVwZWF0KGRlYyhjb3VudChmcm9tKSksIFwiLi5cIiksIHRvKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICAgIH0pKHJlcXVpcmVyLCByZXF1aXJlbWVudCkgOlxuICAgICAgICBqb2luKFwiL1wiLCByZXF1aXJlbWVudCk7XG4gICAgfTtcbiAgICB2YXIgbWFrZVJlcXVpcmUgPSBmdW5jdGlvbihmcm9tLCBhcywgbmFtZSkge1xuICAgICAgdmFyIHBhdGggPSBpZFRvUGF0aChmcm9tKTtcbiAgICAgIHZhciByZXF1aXJlbWVudCA9IG5hbWUgP1xuICAgICAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcIi5cIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwicmVxdWlyZVwiKSwgcGF0aCksIHN5bWJvbCh2b2lkKDApLCBcIlwiICsgXCItXCIgKyBuYW1lKSkgOlxuICAgICAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJlcXVpcmVcIiksIHBhdGgpO1xuICAgICAgcmV0dXJuIGFzID9cbiAgICAgICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIGFzLCByZXF1aXJlbWVudCkgOlxuICAgICAgICByZXF1aXJlbWVudDtcbiAgICB9O1xuICAgIHZhciBleHBhbmRSZXF1aXJlbWVudCA9IGZ1bmN0aW9uKGZvcm0pIHtcbiAgICAgIHZhciBmcm9tID0gZmlyc3QoZm9ybSk7XG4gICAgICB2YXIgYXMgPSAoXCLqnolhc1wiID09PSBzZWNvbmQoZm9ybSkpICYmICh0aGlyZChmb3JtKSk7XG4gICAgICByZXR1cm4gbWFrZVJlcXVpcmUoZnJvbSwgYXMpO1xuICAgIH07XG4gICAgdmFyIGV4cGFuZFVzZSA9IGZ1bmN0aW9uKGZvcm0pIHtcbiAgICAgIHZhciBmcm9tID0gZmlyc3QoZm9ybSk7XG4gICAgICB2YXIgZGlyZWN0aXZlcyA9IGRpY3Rpb25hcnkuYXBwbHkoZGljdGlvbmFyeSwgdmVjKHJlc3QoZm9ybSkpKTtcbiAgICAgIHZhciBuYW1lcyA9IChkaXJlY3RpdmVzIHx8IDApW1wi6p6Jb25seVwiXTtcbiAgICAgIHZhciByZW5hbWVzID0gKGRpcmVjdGl2ZXMgfHwgMClbXCLqnolyZW5hbWVcIl07XG4gICAgICB2YXIgbmFtZWRJbXBvcnRzID0gbmFtZXMgJiYgKG1hcChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWlyZShmcm9tLCBuYW1lLCBuYW1lKTtcbiAgICAgIH0sIG5hbWVzKSk7XG4gICAgICB2YXIgcmVuYW1lZEltcG9ydHMgPSByZW5hbWVzICYmIChtYXAoZnVuY3Rpb24ocGFpcikge1xuICAgICAgICByZXR1cm4gbWFrZVJlcXVpcmUoZnJvbSwgc2Vjb25kKHBhaXIpLCBmaXJzdChwYWlyKSk7XG4gICAgICB9LCByZW5hbWVzKSk7XG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICghKHR5cGVvZihfX3ZlcmJvc2VfXykgPT09IFwidW5kZWZpbmVkXCIpKSAmJiBfX3ZlcmJvc2VfXyA/XG4gICAgICAgICAgY29uc29sZS5sb2coXCJBc3NlcnQ6XCIsIFwiKG9yIG5hbWVzIHJlbmFtZXMpXCIpIDpcbiAgICAgICAgICB2b2lkKDApO1xuICAgICAgICByZXR1cm4gIShuYW1lcyB8fCByZW5hbWVzKSA/XG4gICAgICAgICAgKGZ1bmN0aW9uKCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJcIiArIFwiQXNzZXJ0IGZhaWxlZDogXCIgKyAoXCJcIiArIFwiT25seSBbbXkubGliIDpvbmx5IFtmb28gYmFyXV0gZm9ybSAmIFwiICsgXCJbY2xvanVyZS5zdHJpbmcgOnJlbmFtZSB7cmVwbGFjZSBzdHItcmVwbGFjZX0gYXJlIHN1cHBvcnRlZFwiKSArIFwiXFxuXFxuQXNzZXJ0aW9uOlxcblxcblwiICsgXCIob3IgbmFtZXMgcmVuYW1lcylcIiArIFwiXFxuXFxuQWN0dWFsOlxcblxcblwiICsgbmFtZXMgKyBcIlxcbi0tLS0tLS0tLS0tLS0tXFxuXCIsIHZvaWQoMCkpOyB9KSgpIDpcbiAgICAgICAgICB2b2lkKDApO1xuICAgICAgfSkoKTtcbiAgICAgIHJldHVybiBjb25jYXQoW10sIG5hbWVkSW1wb3J0cywgcmVuYW1lZEltcG9ydHMpO1xuICAgIH07XG4gICAgdmFyIHJlcXVpcmVGb3JtcyA9IChyZWZlcmVuY2VzIHx8IDApW1wicmVxdWlyZVwiXTtcbiAgICB2YXIgdXNlRm9ybXMgPSAocmVmZXJlbmNlcyB8fCAwKVtcInVzZVwiXTtcbiAgICB2YXIgcmVxdWlyZW1lbnRzID0gcmVxdWlyZUZvcm1zID9cbiAgICAgIG1hcChleHBhbmRSZXF1aXJlbWVudCwgcmVxdWlyZUZvcm1zKSA6XG4gICAgICB2b2lkKDApO1xuICAgIHZhciB1c2VzID0gdXNlRm9ybXMgP1xuICAgICAgY29uY2F0LmFwcGx5KGNvbmNhdCwgbWFwKGV4cGFuZFVzZSwgdXNlRm9ybXMpKSA6XG4gICAgICB2b2lkKDApO1xuICAgIHJldHVybiBjb25jYXQobGlzdChzeW1ib2wodm9pZCgwKSwgXCJkbypcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZGVmXCIpLCBzeW1ib2wodm9pZCgwKSwgXCIqbnMqXCIpLCBucyksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCIuLW5hbWVzcGFjZVwiKSwgc3ltYm9sKHZvaWQoMCksIFwibW9kdWxlXCIpKSwgc3ltYm9sKHZvaWQoMCksIFwiKm5zKlwiKSkpLCBkb2MgP1xuICAgICAgW2xpc3Qoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCIuLWRlc2NyaXB0aW9uXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJtb2R1bGVcIikpLCBkb2MpXSA6XG4gICAgICB2b2lkKDApLCByZXF1aXJlbWVudHMsIHVzZXMpO1xuICB9KSgpO1xufTtcbmV4cG9ydHMuZXhwYW5kTnMgPSBleHBhbmROcztcblxuaW5zdGFsbE1hY3JvKHN5bWJvbCh2b2lkKDApLCBcIm5zXCIpLCBleHBhbmROcyk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJwcmludFwiKSwgZnVuY3Rpb24oKSB7XG4gIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgXCJQcmludHMgdGhlIG9iamVjdChzKSB0byB0aGUgb3V0cHV0IGZvciBodW1hbiBjb25zdW1wdGlvbi5cIjtcbiAgcmV0dXJuIGNvbmNhdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcIi5sb2dcIiksIHN5bWJvbCh2b2lkKDApLCBcImNvbnNvbGVcIikpLCBtb3JlKTtcbn0pXG4iLCJ2YXIgbmFtZXNwYWNlID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkubmFtZXNwYWNlO1xudmFyIG5hbWUgPSAocmVxdWlyZShcIi4vYXN0XCIpKS5uYW1lO1xudmFyIG1ldGEgPSAocmVxdWlyZShcIi4vYXN0XCIpKS5tZXRhO1xudmFyIGlzS2V5d29yZCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzS2V5d29yZDtcbnZhciBpc1N5bWJvbCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzU3ltYm9sO1xudmFyIHN5bWJvbCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLnN5bWJvbDs7XG5cbnZhciBjb3VudCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY291bnQ7XG52YXIgcmVzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkucmVzdDtcbnZhciBsYXN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5sYXN0O1xudmFyIGZpcnN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5maXJzdDtcbnZhciBsaXN0ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5saXN0O1xudmFyIGxpc3RfID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5saXN0XztcbnZhciBpc0VtcHR5ID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5pc0VtcHR5O1xudmFyIGludGVybGVhdmUgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmludGVybGVhdmU7XG52YXIgaXNFdmVyeSA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuaXNFdmVyeTtcbnZhciBtYXAgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLm1hcDtcbnZhciBjb25qID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5jb25qO1xudmFyIHNlcSA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuc2VxO1xudmFyIGlzU2VxID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5pc1NlcTs7XG5cbnZhciBtZXJnZSA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5tZXJnZTtcbnZhciBpc05pbCA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc05pbDtcbnZhciBpc0VxdWFsID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzRXF1YWw7XG52YXIgdmFscyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS52YWxzO1xudmFyIGtleXMgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkua2V5cztcbnZhciBpc1N0cmluZyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc1N0cmluZztcbnZhciBpc0RpY3Rpb25hcnkgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNEaWN0aW9uYXJ5O1xudmFyIGlzVmVjdG9yID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzVmVjdG9yOztcblxudmFyIHNwbGl0ID0gKHJlcXVpcmUoXCIuL3N0cmluZ1wiKSkuc3BsaXQ7O1xuXG52YXIgZ2V0SW4gPSBmdW5jdGlvbiBnZXRJbihkaWN0aW9uYXJ5LCBrZXlzLCBub3RGb3VuZCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodGFyZ2V0LCBzZW50aW5lbCwga2V5cykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGlzRW1wdHkoa2V5cykgP1xuICAgICAgdGFyZ2V0IDpcbiAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgoKHRhcmdldCB8fCAwKSB8fCAwKVtmaXJzdChrZXlzKV0pIHx8IHNlbnRpbmVsO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBzZW50aW5lbCA/XG4gICAgICAgICAgbm90Rm91bmQgOlxuICAgICAgICAgICh0YXJnZXQgPSByZXN1bHQsIHNlbnRpbmVsID0gc2VudGluZWwsIGtleXMgPSByZXN0KGtleXMpLCBsb29wKTtcbiAgICAgIH0pKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGRpY3Rpb25hcnksIHt9LCBrZXlzKTtcbn07XG5leHBvcnRzLmdldEluID0gZ2V0SW47XG5cbnZhciBlbXB0eUVudiA9IGZ1bmN0aW9uIGVtcHR5RW52KG5zKSB7XG4gIFwiVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgZW1wdHkgbmFtZXNwYWNlc1wiO1xuICByZXR1cm4ge1xuICAgIFwibnNcIjogbnMsXG4gICAgXCJuYW1lc3BhY2VzXCI6IHt9LFxuICAgIFwiY29udGV4dFwiOiBcInN0YXRlbWVudFwiLFxuICAgIFwibG9jYWxzXCI6IHt9XG4gIH07XG59O1xuZXhwb3J0cy5lbXB0eUVudiA9IGVtcHR5RW52O1xuXG52YXIgbG9jYWxCaW5kaW5nID0gZnVuY3Rpb24gbG9jYWxCaW5kaW5nKGVudiwgZm9ybSkge1xuICByZXR1cm4gKCgoZW52IHx8IDApW1wibG9jYWxzXCJdKSB8fCAwKVtmb3JtXTtcbn07XG5cbnZhciBpc0NvcmVOYW1lID0gZnVuY3Rpb24gaXNDb3JlTmFtZShlbnYsIHN5bSkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0cy5pc0NvcmVOYW1lID0gaXNDb3JlTmFtZTtcblxudmFyIHJlc29sdmVOc0FsaWFzID0gZnVuY3Rpb24gcmVzb2x2ZU5zQWxpYXMoZW52LCBuYW1lKSB7XG4gIHZhciBzeW0gPSBzeW1ib2wobmFtZSk7XG4gIHJldHVybiAoKCgoKCgoZW52IHx8IDApW1wibnNcIl0pIHx8IDApW1wicmVxdWlyZXNcIl0pIHx8IDApIHx8IDApW3N5bV0pIHx8IHN5bTtcbn07XG5leHBvcnRzLnJlc29sdmVOc0FsaWFzID0gcmVzb2x2ZU5zQWxpYXM7XG5cbnZhciByZXNvbHZlRXhpc3RpbmdWYXIgPSBmdW5jdGlvbiByZXNvbHZlRXhpc3RpbmdWYXIoZW52LCBmb3JtKSB7XG4gIHJldHVybiBpc0VxdWFsKG5hbWVzcGFjZShmb3JtKSwgXCJqc1wiKSA/XG4gICAge1xuICAgICAgXCJuYW1lXCI6IGZvcm0sXG4gICAgICBcIm5zXCI6IHN5bWJvbCh2b2lkKDApLCBcImpzXCIpXG4gICAgfSA6XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5hbWVzcGFjZXMgPSAoZW52IHx8IDApW1wibmFtZXNwYWNlc1wiXTtcbiAgICAgIHZhciBzID0gXCJcIiArIGZvcm07XG4gICAgICB2YXIgYmluZGluZyA9IGxvY2FsQmluZGluZyhlbnYsIGZvcm0pO1xuICAgICAgcmV0dXJuIGJpbmRpbmcgP1xuICAgICAgICBiaW5kaW5nIDpcbiAgICAgIG5hbWVzcGFjZShmb3JtKSA/XG4gICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgbnMgPSBuYW1lc3BhY2UoZm9ybSk7XG4gICAgICAgICAgdmFyIG5zID0gaXNFcXVhbChcImNsb2p1cmUuY29yZVwiLCBucykgP1xuICAgICAgICAgICAgXCJjbGpzLmNvcmVcIiA6XG4gICAgICAgICAgICBucztcbiAgICAgICAgICB2YXIgZnVsbE5zID0gcmVzb2x2ZU5zQWxpYXMoZW52LCBucyk7XG4gICAgICAgICAgdmFyIGlkID0gc3ltYm9sKG5hbWUoZm9ybSkpO1xuICAgICAgICAgIHJldHVybiBtZXJnZShnZXRJbihuYW1lc3BhY2VzLCBbZnVsbE5zLCBcImRlZnNcIiwgaWRdKSwge1xuICAgICAgICAgICAgXCJuYW1lXCI6IHN5bWJvbChcIlwiICsgZnVsbE5zLCBcIlwiICsgKG5hbWUoZm9ybSkpKSxcbiAgICAgICAgICAgIFwibnNcIjogZnVsbE5zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKCkgOlxuICAgICAgXCJlbHNlXCIgP1xuICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGZ1bGxOcyA9IGlzQ29yZU5hbWUoZW52LCBmb3JtKSA/XG4gICAgICAgICAgICBzeW1ib2wodm9pZCgwKSwgXCJjbGpzLmNvcmVcIikgOlxuICAgICAgICAgICAgKCgoZW52IHx8IDApW1wibnNcIl0pIHx8IDApW1wibmFtZVwiXTtcbiAgICAgICAgICByZXR1cm4gbWVyZ2UoZ2V0SW4obmFtZXNwYWNlcywgW2Z1bGxOcywgXCJkZWZzXCIsIGZvcm1dKSwge1xuICAgICAgICAgICAgXCJuYW1lXCI6IHN5bWJvbChcIlwiICsgZnVsbE5zLCBcIlwiICsgZm9ybSksXG4gICAgICAgICAgICBcIm5zXCI6IGZ1bGxOc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICB9KSgpO1xufTtcbmV4cG9ydHMucmVzb2x2ZUV4aXN0aW5nVmFyID0gcmVzb2x2ZUV4aXN0aW5nVmFyO1xuXG52YXIgaXNTcGVjaWFsID0gZnVuY3Rpb24gaXNTcGVjaWFsKG9wKSB7XG4gIHJldHVybiAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwiaWZcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwiZGVmXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcImZuKlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJkb1wiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJsZXQqXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcImxvb3AqXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcImxldGZuKlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJ0aHJvd1wiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJ0cnkqXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcInJlY3VyXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcIm5ld1wiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJzZXQhXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcIm5zXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcImRlZnR5cGUqXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcImRlZnJlY29yZCpcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwiLlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJqcypcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwiJlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJxdW90ZVwiKSkpO1xufTtcbmV4cG9ydHMuaXNTcGVjaWFsID0gaXNTcGVjaWFsO1xuXG52YXIgYW5hbHl6ZVNlcSA9IGZ1bmN0aW9uIGFuYWx5emVTZXEoZW52LCBmb3JtLCBuYW1lKSB7XG4gIHZhciBlbnYgPSBjb25qKGVudiwge1xuICAgIFwibGluZVwiOiAoKChtZXRhKGZvcm0pKSB8fCAwKVtcImxpbmVcIl0pIHx8ICgoZW52IHx8IDApW1wibGluZVwiXSlcbiAgfSk7XG4gIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9wID0gZmlyc3QoZm9ybSk7XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgKCEodHlwZW9mKF9fdmVyYm9zZV9fKSA9PT0gXCJ1bmRlZmluZWRcIikpICYmIF9fdmVyYm9zZV9fID9cbiAgICAgICAgY29uc29sZS5sb2coXCJBc3NlcnQ6XCIsIFwiKG5vdCAobmlsPyBvcCkpXCIpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICAgIHJldHVybiAhKCEoaXNOaWwob3ApKSkgP1xuICAgICAgICAoZnVuY3Rpb24oKSB7IHRocm93IG5ldyBFcnJvcihcIlwiICsgXCJBc3NlcnQgZmFpbGVkOiBcIiArIFwiQ2FuJ3QgY2FsbCBuaWxcIiArIFwiXFxuXFxuQXNzZXJ0aW9uOlxcblxcblwiICsgXCIobm90IChuaWw/IG9wKSlcIiArIFwiXFxuXFxuQWN0dWFsOlxcblxcblwiICsgKGlzTmlsKG9wKSkgKyBcIlxcbi0tLS0tLS0tLS0tLS0tXFxuXCIsIHZvaWQoMCkpOyB9KSgpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICB9KSgpO1xuICAgIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXhwYW5zaW9uID0gbWFjcm9leHBhbmQoZm9ybSk7XG4gICAgICByZXR1cm4gaXNTcGVjaWFsKG9wKSA/XG4gICAgICAgIHBhcnNlKG9wLCBlbnYsIGZvcm0sIG5hbWUpIDpcbiAgICAgICAgcGFyc2VJbnZva2UoZW52LCBmb3JtKTtcbiAgICB9KSgpO1xuICB9KSgpO1xufTtcbmV4cG9ydHMuYW5hbHl6ZVNlcSA9IGFuYWx5emVTZXE7XG5cbnZhciBpc01ldGhvZENhbGwgPSBmdW5jdGlvbiBpc01ldGhvZENhbGwoZm9ybSkge1xuICByZXR1cm4gaXNFcXVhbChmaXJzdChmb3JtKSwgXCIuXCIpO1xufTtcblxudmFyIGlzSW5zdGFudGlhdGlvbiA9IGZ1bmN0aW9uIGlzSW5zdGFudGlhdGlvbihmb3JtKSB7XG4gIHJldHVybiBpc0VxdWFsKGxhc3QoZm9ybSksIFwiLlwiKTtcbn07XG5cbnZhciBnZXROc0V4Y2x1ZGUgPSBmdW5jdGlvbiBnZXROc0V4Y2x1ZGUoZW52LCBzeW0pIHtcbiAgcmV0dXJuICgoKCgoZW52IHx8IDApW1wibnNcIl0pIHx8IDApW1wiZXhjbHVkZXNcIl0pIHx8IDApW3N5bV07XG59O1xuXG52YXIgZ2V0TnNOYW1lID0gZnVuY3Rpb24gZ2V0TnNOYW1lKGVudikge1xuICByZXR1cm4gKCgoZW52IHx8IDApW1wibnNcIl0pIHx8IDApW1wibmFtZVwiXTtcbn07XG5cbnZhciBnZXRNYWNyb1VzZXMgPSBmdW5jdGlvbiBnZXRNYWNyb1VzZXMoZW52LCBzeW0pIHtcbiAgcmV0dXJuICgoKCgoZW52IHx8IDApW1wibnNcIl0pIHx8IDApW1widXNlcy1tYWNyb3NcIl0pIHx8IDApW3N5bV07XG59O1xuXG52YXIgaXNNYWNyb1N5bSA9IGZ1bmN0aW9uIGlzTWFjcm9TeW0oZW52LCBzeW0pIHtcbiAgdmFyIG5hbWVzcGFjZXMgPSAoZW52IHx8IDApW1wibmFtZXNwYWNlc1wiXTtcbiAgdmFyIGxvY2FsID0gbG9jYWxCaW5kaW5nKGVudiwgc3ltKTtcbiAgdmFyIG5zSWQgPSBnZXROc05hbWUoZW52KTtcbiAgcmV0dXJuICEobG9jYWwgfHwgKCgoZ2V0TnNFeGNsdWRlKGVudiwgc3ltKSkgfHwgKGdldEluKG5hbWVzcGFjZXMsIFtuc0lkLCBcImV4Y2x1ZGVzXCIsIHN5bV0pKSkgJiYgKCEoKGdldE1hY3JvVXNlcyhlbnYsIHN5bSkpIHx8IChnZXRJbihuYW1lc3BhY2VzLCBbbnNJZCwgXCJ1c2VzLW1hY3Jvc1wiLCBzeW1dKSkpKSkpO1xufTtcbmV4cG9ydHMuaXNNYWNyb1N5bSA9IGlzTWFjcm9TeW07XG5cbnZhciBnZXRFeHBhbmRlciA9IGZ1bmN0aW9uIGdldEV4cGFuZGVyKHN5bSwgZW52KSB7XG4gIHZhciBvcCA9IChpc01hY3JvU3ltKGVudiwgc3ltKSkgJiYgKHJlc29sdmVFeGlzdGluZ1ZhcihlbXB0eUVudigpLCBzeW0pKTtcbiAgcmV0dXJuIG9wICYmICgob3AgfHwgMClbXCJtYWNyb1wiXSkgP1xuICAgIGV2YWwoXCJcIiArIChtdW5nZSgob3AgfHwgMClbXCJuYW1lXCJdKSkpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuZ2V0RXhwYW5kZXIgPSBnZXRFeHBhbmRlcjtcblxudmFyIGlzU3VnYXIgPSBmdW5jdGlvbiBpc1N1Z2FyKG9wKSB7XG4gIHZhciBpZCA9IFwiXCIgKyBvcDtcbiAgcmV0dXJuIChmaXJzdChpZCkgPT09IFwiLlwiKSB8fCAobGFzdChpZCkgPT09IFwiLlwiKTtcbn07XG5leHBvcnRzLmlzU3VnYXIgPSBpc1N1Z2FyO1xuXG52YXIgaXNNYWNybyA9IGZ1bmN0aW9uIGlzTWFjcm8ob3ApIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydHMuaXNNYWNybyA9IGlzTWFjcm87XG5cbnZhciBkZXN1Z2FyMSA9IGZ1bmN0aW9uIGRlc3VnYXIxKGZvcm0pIHtcbiAgdmFyIGlkID0gXCJcIiArIGZvcm07XG4gIHZhciBwYXJhbXMgPSByZXN0KGZvcm0pO1xuICB2YXIgbWV0YWRhdGEgPSBtZXRhKGZvcm0pO1xuICByZXR1cm4gaXNNZXRob2RDYWxsKGlkKSA/XG4gICAgd2l0aE1ldGEobGlzdF8oc3ltYm9sKHZvaWQoMCksIFwiLlwiKSwgZmlyc3QocGFyYW0pLCBzeW1ib2woc3VicyhpZCwgMSkpLCByZXN0KHBhcmFtcykpLCBtZXRhZGF0YSkgOlxuICBpc0luc3RhbnRpYXRpb24oaWQpID9cbiAgICB3aXRoTWV0YShsaXN0XyhzeW1ib2wodm9pZCgwKSwgXCJuZXdcIiksIHN5bWJvbChzdWJzKG9wbmFtZSwgMCwgZGVjKGNvdW50KG9wbmFtZSkpKSksIHBhcmFtcyksIG1ldGFkYXRhKSA6XG4gIFwiZWxzZVwiID9cbiAgICBmb3JtIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuZGVzdWdhcjEgPSBkZXN1Z2FyMTtcblxudmFyIG1hY3JvZXhwYW5kMSA9IGZ1bmN0aW9uIG1hY3JvZXhwYW5kMShmb3JtKSB7XG4gIHZhciBvcCA9IGZpcnN0KGZvcm0pO1xuICByZXR1cm4gaXNTcGVjaWFsKG9wKSA/XG4gICAgZm9ybSA6XG4gIGlzU3VnYXIob3ApID9cbiAgICBkZXN1Z2FyMShmb3JtKSA6XG4gIGlzTWFjcm8ob3ApID9cbiAgICBnZXRFeHBhbmRlcihvcCkuYXBwbHkoZ2V0RXhwYW5kZXIob3ApLCBmb3JtKSA6XG4gIFwiZWxzZVwiID9cbiAgICBmb3JtIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMubWFjcm9leHBhbmQxID0gbWFjcm9leHBhbmQxO1xuXG52YXIgbWFjcm9leHBhbmQgPSBmdW5jdGlvbiBtYWNyb2V4cGFuZChmb3JtKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChmb3JtLCBleHBhbnNpb24pIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBmb3JtID09PSBleHBhbnNpb24gP1xuICAgICAgZm9ybSA6XG4gICAgICAoZm9ybSA9IGV4cGFuc2lvbiwgZXhwYW5zaW9uID0gbWFjcm9leHBhbmQxKGV4cGFuc2lvbiksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShmb3JtLCBtYWNyb2V4cGFuZDEoZm9ybSkpO1xufTtcbmV4cG9ydHMubWFjcm9leHBhbmQgPSBtYWNyb2V4cGFuZDtcblxudmFyIGFuYWx5emVTeW1ib2wgPSBmdW5jdGlvbiBhbmFseXplU3ltYm9sKGVudiwgc3ltYm9sKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgXCJlbnZcIjogZW52LFxuICAgIFwiZm9ybVwiOiBzeW1ib2xcbiAgfTtcbiAgdmFyIGxvY2FscyA9IChlbnYgfHwgMClbXCJsb2NhbHNcIl07XG4gIHZhciBsb2NhbCA9IChsb2NhbHMgfHwgMClbc3ltYm9sXTtcbiAgcmV0dXJuIGNvbmoocmVzdWx0LCB7XG4gICAgXCJvcFwiOiBcInZhclwiLFxuICAgIFwiaW5mb1wiOiBsb2NhbCA/XG4gICAgICBsb2NhbCA6XG4gICAgICByZXNvbHZlRXhpc3RpbmdWYXIoZW52LCBzeW1ib2wpXG4gIH0pO1xufTtcbmV4cG9ydHMuYW5hbHl6ZVN5bWJvbCA9IGFuYWx5emVTeW1ib2w7XG5cbnZhciBfcmVhZGVyTnNOYW1lXyA9IHN5bWJvbChcImNsb2p1cmUucmVhZGVyXCIsIFwicmVhZGVyXCIpO1xuXG52YXIgYW5hbHl6ZUtleXdvcmQgPSBmdW5jdGlvbiBhbmFseXplS2V5d29yZChlbnYsIGZvcm0pIHtcbiAgcmV0dXJuIHtcbiAgICBcIm9wXCI6IFwiY29uc3RhbnRcIixcbiAgICBcImVudlwiOiBlbnYsXG4gICAgXCJmb3JtXCI6IGlzRXF1YWwobmFtZXNwYWNlKGZvcm0pLCBuYW1lKF9yZWFkZXJOc05hbWVfKSkgP1xuICAgICAga2V5d29yZChuYW1lKCgoKGVudiB8fCAwKVtcIm5zXCJdKSB8fCAwKVtcIm5hbWVcIl0pLCBuYW1lKGZvcm0pKSA6XG4gICAgICBmb3JtXG4gIH07XG59O1xuZXhwb3J0cy5hbmFseXplS2V5d29yZCA9IGFuYWx5emVLZXl3b3JkO1xuXG52YXIgaXNTaW1wbGVLZXkgPSBmdW5jdGlvbiBpc1NpbXBsZUtleSh4KSB7XG4gIHJldHVybiAoaXNTdHJpbmcoeCkpIHx8IChpc0tleXdvcmQoeCkpO1xufTtcbmV4cG9ydHMuaXNTaW1wbGVLZXkgPSBpc1NpbXBsZUtleTtcblxudmFyIGFuYWx5emVEaWN0aW9uYXJ5ID0gZnVuY3Rpb24gYW5hbHl6ZURpY3Rpb25hcnkoZW52LCBmb3JtLCBuYW1lKSB7XG4gIHZhciBleHByRW52ID0gY29uaihlbnYsIHtcbiAgICBcImNvbnRleHRcIjogXCJleHByXCJcbiAgfSk7XG4gIHZhciBuYW1lcyA9IGtleXMoZm9ybSk7XG4gIHZhciBpc1NpbXBsZUtleXMgPSBpc0V2ZXJ5KGlzU2ltcGxlS2V5LCBuYW1lcyk7XG4gIHZhciBrcyA9IGRpc2FsbG93aW5nUmVjdXIodmVjKG1hcChmdW5jdGlvbigkMSkge1xuICAgIHJldHVybiBhbmFseXplKGV4cHJFbnYsICQxLCBuYW1lKTtcbiAgfSwgbmFtZXMpKSk7XG4gIHZhciB2cyA9IGRpc2FsbG93aW5nUmVjdXIodmVjKG1hcChmdW5jdGlvbigkMSkge1xuICAgIHJldHVybiBhbmFseXplKGV4cHJFbnYsICQxLCBuYW1lKTtcbiAgfSwgdmFscyhmb3JtKSkpKTtcbiAgcmV0dXJuIGFuYWx5emVXcmFwTWV0YSh7XG4gICAgXCJvcFwiOiBcIm1hcFwiLFxuICAgIFwiZW52XCI6IGVudixcbiAgICBcImZvcm1cIjogZm9ybSxcbiAgICBcImtleXNcIjoga3MsXG4gICAgXCJ2YWxzXCI6IHZzLFxuICAgIFwic2ltcGxlLWtleXM/XCI6IGlzU2ltcGxlS2V5cyxcbiAgICBcImNoaWxkcmVuXCI6IHZlYyhpbnRlcmxlYXZlKGtzLCB2cykpXG4gIH0sIG5hbWUpO1xufTtcbmV4cG9ydHMuYW5hbHl6ZURpY3Rpb25hcnkgPSBhbmFseXplRGljdGlvbmFyeTtcblxudmFyIGFuYWx5emVWZWN0b3IgPSBmdW5jdGlvbiBhbmFseXplVmVjdG9yKGVudiwgZm9ybSwgbmFtZSkge1xuICB2YXIgZXhwckVudiA9IGNvbmooZW52LCB7XG4gICAgXCJjb250ZXh0XCI6IFwiZXhwclwiXG4gIH0pO1xuICB2YXIgaXRlbXMgPSBkaXNhbGxvd2luZ1JlY3VyKHZlYyhtYXAoZnVuY3Rpb24oJDEpIHtcbiAgICByZXR1cm4gYW5hbHl6ZShleHByRW52LCAkMSwgbmFtZSk7XG4gIH0sIGZvcm0pKSk7XG4gIHJldHVybiBhbmFseXplV3JhcE1ldGEoe1xuICAgIFwib3BcIjogXCJ2ZWN0b3JcIixcbiAgICBcImVudlwiOiBlbnYsXG4gICAgXCJmb3JtXCI6IGZvcm0sXG4gICAgXCJpdGVtc1wiOiBpdGVtcyxcbiAgICBcImNoaWxkcmVuXCI6IGl0ZW1zXG4gIH0sIG5hbWUpO1xufTtcbmV4cG9ydHMuYW5hbHl6ZVZlY3RvciA9IGFuYWx5emVWZWN0b3I7XG5cbnZhciBhbmFseXplV3JhcE1ldGEgPSBmdW5jdGlvbiBhbmFseXplV3JhcE1ldGEoZXhwciwgbmFtZSkge1xuICB2YXIgZm9ybSA9IChleHByIHx8IDApW1wiZm9ybVwiXTtcbiAgdmFyIG1ldGFkYXRhID0gbWV0YShmb3JtKTtcbiAgdmFyIGVudiA9IChleHByIHx8IDApW1wiZW52XCJdO1xuICB2YXIgZXhwciA9IG1ldGFkYXRhID9cbiAgICBhc3NvY0luKGV4cHIsIFtcImVudlwiLCBcImNvbnRleHRcIl0sIFwiZXhwclwiKSA6XG4gICAgdm9pZCgwKTtcbiAgdmFyIG1ldGFFeHByID0gbWV0YWRhdGEgP1xuICAgIGFuYWx5emVNYXAoZW52LCBtZXRhZGF0YSwgbmFtZSkgOlxuICAgIHZvaWQoMCk7XG4gIHJldHVybiBtZXRhZGF0YSA/XG4gICAge1xuICAgICAgXCJvcFwiOiBcIm1ldGFcIixcbiAgICAgIFwiZW52XCI6IGVudixcbiAgICAgIFwiZm9ybVwiOiBmb3JtLFxuICAgICAgXCJtZXRhXCI6IG1ldGFFeHByLFxuICAgICAgXCJleHByXCI6IGV4cHIsXG4gICAgICBcImNoaWxkcmVuXCI6IFttZXRhRXhwciwgZXhwcl1cbiAgICB9IDpcbiAgICBleHByO1xufTtcbmV4cG9ydHMuYW5hbHl6ZVdyYXBNZXRhID0gYW5hbHl6ZVdyYXBNZXRhO1xuXG52YXIgYW5hbHl6ZU1hcCA9IGZ1bmN0aW9uIGFuYWx5emVNYXAoZW52LCBmb3JtLCBuYW1lKSB7XG4gIHZhciBleHByRW52ID0gY29uaihlbnYsIHtcbiAgICBcImNvbnRleHRcIjogXCJleHByXCJcbiAgfSk7XG4gIHZhciBpc1NpbXBsZUtleXMgPSBpc0V2ZXJ5KGZ1bmN0aW9uKCQxKSB7XG4gICAgcmV0dXJuIChpc1N0cmluZygkMSkpIHx8IChpc0tleXdvcmQoJDEpKTtcbiAgfSwga2V5cyhmb3JtKSk7XG4gIHZhciBrcyA9IGRpc2FsbG93aW5nUmVjdXIodmVjKG1hcChmdW5jdGlvbigkMSkge1xuICAgIHJldHVybiBhbmFseXplKGV4cHJFbnYsICQxLCBuYW1lKTtcbiAgfSwga2V5cyhmb3JtKSkpKTtcbiAgdmFyIHZzID0gZGlzYWxsb3dpbmdSZWN1cih2ZWMobWFwKGZ1bmN0aW9uKCQxKSB7XG4gICAgcmV0dXJuIGFuYWx5emUoZXhwckVudiwgJDEsIG5hbWUpO1xuICB9LCB2YWxzKGZvcm0pKSkpO1xuICByZXR1cm4gYW5hbHl6ZVdyYXBNZXRhKHtcbiAgICBcIm9wXCI6IFwibWFwXCIsXG4gICAgXCJlbnZcIjogZW52LFxuICAgIFwiZm9ybVwiOiBmb3JtLFxuICAgIFwia2V5c1wiOiBrcyxcbiAgICBcInZhbHNcIjogdnMsXG4gICAgXCJzaW1wbGUta2V5cz9cIjogaXNTaW1wbGVLZXlzLFxuICAgIFwiY2hpbGRyZW5cIjogdmVjKGludGVybGVhdmUoa3MsIHZzKSlcbiAgfSwgbmFtZSk7XG59O1xuZXhwb3J0cy5hbmFseXplTWFwID0gYW5hbHl6ZU1hcDtcblxudmFyIGFuYWx5emUgPSBmdW5jdGlvbiBhbmFseXplKGVudiwgZm9ybSwgbmFtZSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYW5hbHl6ZShlbnYsIGZvcm0sIHZvaWQoMCkpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBpc1N5bWJvbChmb3JtKSA/XG4gICAgICAgIGFuYWx5emVTeW1ib2woZW52LCBmb3JtKSA6XG4gICAgICBpc0tleXdvcmQoZm9ybSkgP1xuICAgICAgICBhbmFseXplS2V5d29yZChlbnYsIGZvcm0pIDpcbiAgICAgIChpc1NlcShmb3JtKSkgJiYgKCEoaXNFbXB0eShmb3JtKSkpID9cbiAgICAgICAgYW5hbHl6ZVNlcShlbnYsIGZvcm0sIG5hbWUpIDpcbiAgICAgIGlzRGljdGlvbmFyeShmb3JtKSA/XG4gICAgICAgIGFuYWx5emVEaWN0aW9uYXJ5KGVudiwgZm9ybSwgbmFtZSkgOlxuICAgICAgaXNWZWN0b3IoZm9ybSkgP1xuICAgICAgICBhbmFseXplVmVjdG9yKGVudiwgZm9ybSwgbmFtZSkgOlxuICAgICAgXCJlbHNlXCIgP1xuICAgICAgICB7XG4gICAgICAgICAgXCJvcFwiOiBcImNvbnN0YW50XCIsXG4gICAgICAgICAgXCJlbnZcIjogZW52LFxuICAgICAgICAgIFwiZm9ybVwiOiBmb3JtXG4gICAgICAgIH0gOlxuICAgICAgICB2b2lkKDApO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIChmdW5jdGlvbigpIHsgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGFyaXR5XCIpOyB9KSgpXG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMuYW5hbHl6ZSA9IGFuYWx5emVcbiIsIihmdW5jdGlvbihnbG9iYWwpe3ZhciBfbnNfID0gXCJpbnRlcmFjdGl2YXRlLXdpc3AubWFpblwiO1xubW9kdWxlLm5hbWVzcGFjZSA9IF9uc187XG52YXIgaW50ZXJhY3RpdmF0ZSA9IHJlcXVpcmUoXCJpbnRlcmFjdGl2YXRlXCIpO1xudmFyIGhhc2hhcmUgPSByZXF1aXJlKFwiY29kZW1pcnJvci1oYXNoYXJlXCIpO1xudmFyIHBlcnNpc3QgPSByZXF1aXJlKFwiY29kZW1pcnJvci1wZXJzaXN0XCIpO1xudmFyIHN0YXJ0SG9zdCA9IChyZXF1aXJlKFwiLi9ob3N0XCIpKS5zdGFydEhvc3Q7O1xuXG5pbnRlcmFjdGl2YXRlKENvZGVNaXJyb3IpO1xuXG5oYXNoYXJlKENvZGVNaXJyb3IpO1xuXG5wZXJzaXN0KENvZGVNaXJyb3IpO1xuXG5zdGFydEhvc3QoKTtcblxudmFyIGVkaXRvciA9IENvZGVNaXJyb3IoZG9jdW1lbnQuYm9keSwge1xuICBcInBlcnNpc3RcIjogdHJ1ZSxcbiAgXCJtYXRjaEJyYWNrZXRzXCI6IHRydWUsXG4gIFwiZWxlY3RyaWNDaGFyc1wiOiB0cnVlLFxuICBcInN0eWxlQWN0aXZlTGluZVwiOiB0cnVlLFxuICBcImF1dG9mb2N1c1wiOiB0cnVlLFxuICBcInRoZW1lXCI6IFwic29sYXJpemVkIGRhcmtcIixcbiAgXCJtb2RlXCI6IFwiY2xvanVyZVwiLFxuICBcInZhbHVlXCI6IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImludHJvXCIpKS50ZXh0Q29udGVudCxcbiAgXCJpbnRlcmFjdGl2YXRlXCI6IHRydWUsXG4gIFwiaW50ZXJhY3RpdmVTZXBhcmF0b3JcIjogL147OyA9PlteXFxuXSokL20sXG4gIFwiZXh0cmFLZXlzXCI6IHtcbiAgICBcIlRhYlwiOiBcImluZGVudFNlbGVjdGlvblwiXG4gIH1cbn0pO1xuZXhwb3J0cy5lZGl0b3IgPSBlZGl0b3I7XG5cbmdsb2JhbC5lZGl0b3IgPSBlZGl0b3Jcbn0pKHdpbmRvdykiLCJ2YXIgZXZlbnRzID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5leHBvcnRzLmlzRGF0ZSA9IGZ1bmN0aW9uKG9iail7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBEYXRlXSd9O1xuZXhwb3J0cy5pc1JlZ0V4cCA9IGZ1bmN0aW9uKG9iail7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJ307XG5cblxuZXhwb3J0cy5wcmludCA9IGZ1bmN0aW9uICgpIHt9O1xuZXhwb3J0cy5wdXRzID0gZnVuY3Rpb24gKCkge307XG5leHBvcnRzLmRlYnVnID0gZnVuY3Rpb24oKSB7fTtcblxuZXhwb3J0cy5pbnNwZWN0ID0gZnVuY3Rpb24ob2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKSB7XG4gIHZhciBzZWVuID0gW107XG5cbiAgdmFyIHN0eWxpemUgPSBmdW5jdGlvbihzdHIsIHN0eWxlVHlwZSkge1xuICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuICAgIHZhciBzdHlsZXMgPVxuICAgICAgICB7ICdib2xkJyA6IFsxLCAyMl0sXG4gICAgICAgICAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAgICAgICAgICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgICAgICAgICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAgICAgICAgICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgICAgICAgICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgICAgICAgICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICAgICAgICAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICAgICAgICAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICAgICAgICAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAgICAgICAgICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAgICAgICAgICdyZWQnIDogWzMxLCAzOV0sXG4gICAgICAgICAgJ3llbGxvdycgOiBbMzMsIDM5XSB9O1xuXG4gICAgdmFyIHN0eWxlID1cbiAgICAgICAgeyAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgICAgICAgICAnbnVtYmVyJzogJ2JsdWUnLFxuICAgICAgICAgICdib29sZWFuJzogJ3llbGxvdycsXG4gICAgICAgICAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgICAgICAgICAnbnVsbCc6ICdib2xkJyxcbiAgICAgICAgICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgICAgICAgICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgICAgICAgICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAgICAgICAgICdyZWdleHAnOiAncmVkJyB9W3N0eWxlVHlwZV07XG5cbiAgICBpZiAoc3R5bGUpIHtcbiAgICAgIHJldHVybiAnXFwwMzNbJyArIHN0eWxlc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAgICdcXDAzM1snICsgc3R5bGVzW3N0eWxlXVsxXSArICdtJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH07XG4gIGlmICghIGNvbG9ycykge1xuICAgIHN0eWxpemUgPSBmdW5jdGlvbihzdHIsIHN0eWxlVHlwZSkgeyByZXR1cm4gc3RyOyB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gICAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgICB2YWx1ZSAhPT0gZXhwb3J0cyAmJlxuICAgICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzKTtcbiAgICB9XG5cbiAgICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuXG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgICAgICByZXR1cm4gc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcblxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuIHN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuXG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIHN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgICB9XG4gICAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgICB2YXIgdmlzaWJsZV9rZXlzID0gT2JqZWN0X2tleXModmFsdWUpO1xuICAgIHZhciBrZXlzID0gc2hvd0hpZGRlbiA/IE9iamVjdF9nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKSA6IHZpc2libGVfa2V5cztcblxuICAgIC8vIEZ1bmN0aW9ucyB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYga2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxpemUoJycgKyB2YWx1ZSwgJ3JlZ2V4cCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgICAgcmV0dXJuIHN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERhdGVzIHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWRcbiAgICBpZiAoaXNEYXRlKHZhbHVlKSAmJiBrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0eWxpemUodmFsdWUudG9VVENTdHJpbmcoKSwgJ2RhdGUnKTtcbiAgICB9XG5cbiAgICB2YXIgYmFzZSwgdHlwZSwgYnJhY2VzO1xuICAgIC8vIERldGVybWluZSB0aGUgb2JqZWN0IHR5cGVcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHR5cGUgPSAnQXJyYXknO1xuICAgICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9ICdPYmplY3QnO1xuICAgICAgYnJhY2VzID0gWyd7JywgJ30nXTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgYmFzZSA9IChpc1JlZ0V4cCh2YWx1ZSkpID8gJyAnICsgdmFsdWUgOiAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYXNlID0gJyc7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIGJhc2UgPSAnICcgKyB2YWx1ZS50b1VUQ1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gICAgfVxuXG4gICAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxpemUoJycgKyB2YWx1ZSwgJ3JlZ2V4cCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZWVuLnB1c2godmFsdWUpO1xuXG4gICAgdmFyIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIG5hbWUsIHN0cjtcbiAgICAgIGlmICh2YWx1ZS5fX2xvb2t1cEdldHRlcl9fKSB7XG4gICAgICAgIGlmICh2YWx1ZS5fX2xvb2t1cEdldHRlcl9fKGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWUuX19sb29rdXBTZXR0ZXJfXyhrZXkpKSB7XG4gICAgICAgICAgICBzdHIgPSBzdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgPSBzdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2YWx1ZS5fX2xvb2t1cFNldHRlcl9fKGtleSkpIHtcbiAgICAgICAgICAgIHN0ciA9IHN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2aXNpYmxlX2tleXMuaW5kZXhPZihrZXkpIDwgMCkge1xuICAgICAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHIpIHtcbiAgICAgICAgaWYgKHNlZW4uaW5kZXhPZih2YWx1ZVtrZXldKSA8IDApIHtcbiAgICAgICAgICBpZiAocmVjdXJzZVRpbWVzID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdHIgPSBmb3JtYXQodmFsdWVba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IGZvcm1hdCh2YWx1ZVtrZXldLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9IHN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAnQXJyYXknICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG4gICAgICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgICAgIG5hbWUgPSBzdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgICAgICBuYW1lID0gc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xuICAgIH0pO1xuXG4gICAgc2Vlbi5wb3AoKTtcblxuICAgIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgICBudW1MaW5lc0VzdCsrO1xuICAgICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgICAgcmV0dXJuIHByZXYgKyBjdXIubGVuZ3RoICsgMTtcbiAgICB9LCAwKTtcblxuICAgIGlmIChsZW5ndGggPiA1MCkge1xuICAgICAgb3V0cHV0ID0gYnJhY2VzWzBdICtcbiAgICAgICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgYnJhY2VzWzFdO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIHJldHVybiBmb3JtYXQob2JqLCAodHlwZW9mIGRlcHRoID09PSAndW5kZWZpbmVkJyA/IDIgOiBkZXB0aCkpO1xufTtcblxuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBhciBpbnN0YW5jZW9mIEFycmF5IHx8XG4gICAgICAgICBBcnJheS5pc0FycmF5KGFyKSB8fFxuICAgICAgICAgKGFyICYmIGFyICE9PSBPYmplY3QucHJvdG90eXBlICYmIGlzQXJyYXkoYXIuX19wcm90b19fKSk7XG59XG5cblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIHJlIGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgKHR5cGVvZiByZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpO1xufVxuXG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIGlmIChkIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2YgZCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHByb3BlcnRpZXMgPSBEYXRlLnByb3RvdHlwZSAmJiBPYmplY3RfZ2V0T3duUHJvcGVydHlOYW1lcyhEYXRlLnByb3RvdHlwZSk7XG4gIHZhciBwcm90byA9IGQuX19wcm90b19fICYmIE9iamVjdF9nZXRPd25Qcm9wZXJ0eU5hbWVzKGQuX19wcm90b19fKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb3RvKSA9PT0gSlNPTi5zdHJpbmdpZnkocHJvcGVydGllcyk7XG59XG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uIChtc2cpIHt9O1xuXG5leHBvcnRzLnB1bXAgPSBudWxsO1xuXG52YXIgT2JqZWN0X2tleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHJlcy5wdXNoKGtleSk7XG4gICAgcmV0dXJuIHJlcztcbn07XG5cbnZhciBPYmplY3RfZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcblxudmFyIE9iamVjdF9jcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIChwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICAvLyBmcm9tIGVzNS1zaGltXG4gICAgdmFyIG9iamVjdDtcbiAgICBpZiAocHJvdG90eXBlID09PSBudWxsKSB7XG4gICAgICAgIG9iamVjdCA9IHsgJ19fcHJvdG9fXycgOiBudWxsIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgJ3R5cGVvZiBwcm90b3R5cGVbJyArICh0eXBlb2YgcHJvdG90eXBlKSArICddICE9IFxcJ29iamVjdFxcJydcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIFR5cGUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICAgICAgIG9iamVjdCA9IG5ldyBUeXBlKCk7XG4gICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyAhPT0gJ3VuZGVmaW5lZCcgJiYgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbn07XG5cbmV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbihjdG9yLCBzdXBlckN0b3IpIHtcbiAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG4gIGN0b3IucHJvdG90eXBlID0gT2JqZWN0X2NyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAodHlwZW9mIGYgIT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGV4cG9ydHMuaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6IHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSl7XG4gICAgaWYgKHggPT09IG51bGwgfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGV4cG9ydHMuaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHNhdmUgPSBcInNhdmVAaGFzaGFyZVwiXG52YXIgbG9hZCA9IFwibG9hZEBoYXNoYXJlXCJcblxuZnVuY3Rpb24gcGx1Z2luKENvZGVNaXJyb3IpIHtcbiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oXCJoYXNoYXJlXCIsIGZhbHNlLCBmdW5jdGlvbihlZGl0b3IsIHZhbHVlKSB7XG4gICAgLyoqXG4gICAgVGFrZXMgZWRpdG9yIGFuZCBlbmFibGVzIHBlcnNpc3RzIGNoYW5nZXMgdG8gdGhlIGJ1ZmZlciBhY3Jvc3MgdGhlIHNlc3Npb25zLlxuICAgICoqL1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdmFyIHNhdmluZyA9IGZhbHNlXG4gICAgICBlZGl0b3Jbc2F2ZV0gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBsb2NhdGlvbi5oYXNoID0gZW5jb2RlVVJJQ29tcG9uZW50KGVkaXRvci5nZXRWYWx1ZSgpKVxuICAgICAgfVxuICAgICAgZWRpdG9yW2xvYWRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHIoMSkpXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gZWRpdG9yLmdldFZhbHVlKCkpIGVkaXRvci5zZXRWYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBlZGl0b3Jbc2F2ZV0sIGZhbHNlKVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJoYXNoY2hhbmdlXCIsIGVkaXRvcltsb2FkXSwgZmFsc2UpXG5cbiAgICAgIGVkaXRvcltsb2FkXSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBlZGl0b3Jbc2F2ZV0sIGZhbHNlKVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGVkaXRvcltsb2FkXSwgZmFsc2UpXG4gICAgfVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBsdWdpblxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIG9uQ2hhbmdlKGVkaXRvcikge1xuICBsb2NhbFN0b3JhZ2Vbd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoXCIjXCIpWzBdXSA9IGVkaXRvci5nZXRWYWx1ZSgpXG59XG5cbmZ1bmN0aW9uIHNldHVwKGVkaXRvciwgdmFsdWUpIHtcbiAgLyoqXG4gIFRha2VzIGVkaXRvciBhbmQgZW5hYmxlcyBwZXJzaXN0cyBjaGFuZ2VzIHRvIHRoZSBidWZmZXIgYWNyb3NzIHRoZSBzZXNzaW9ucy5cbiAgKiovXG4gIGlmICh2YWx1ZSkge1xuICAgIHZhciBhZGRyZXNzID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoXCIjXCIpWzBdXG4gICAgdmFyIHBlcnNpc3RlZCA9IGxvY2FsU3RvcmFnZVthZGRyZXNzXSB8fCBlZGl0b3IuZ2V0VmFsdWUoKVxuICAgIGVkaXRvci5zZXRWYWx1ZShwZXJzaXN0ZWQpXG4gICAgZWRpdG9yLm9uKFwiY2hhbmdlXCIsIG9uQ2hhbmdlKVxuICB9IGVsc2Uge1xuICAgIGVkaXRvci5vZmYoXCJjaGFuZ2VcIiwgb25DaGFuZ2UpXG4gIH1cbn1cblxuZnVuY3Rpb24gcGx1Z2luKENvZGVNaXJyb3IpIHtcbiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oXCJwZXJzaXN0XCIsIGZhbHNlLCBzZXR1cClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwbHVnaW5cbiIsInZhciBfbnNfID0gXCJpbnRlcmFjdGl2YXRlLXdpc3AuaG9zdFwiO1xubW9kdWxlLm5hbWVzcGFjZSA9IF9uc187XG52YXIgcmVuZGVyID0gcmVxdWlyZShcImludGVyYWN0aXZhdGUvcmVuZGVyXCIpO1xudmFyIHJlYWRfID0gKHJlcXVpcmUoXCJ3aXNwL3JlYWRlclwiKSkucmVhZF87XG52YXIgY29tcGlsZV8gPSAocmVxdWlyZShcIndpc3AvY29tcGlsZXJcIikpLmNvbXBpbGVfO1xudmFyIGZpcnN0ID0gKHJlcXVpcmUoXCJ3aXNwL3NlcXVlbmNlXCIpKS5maXJzdDtcbnZhciByZXN0ID0gKHJlcXVpcmUoXCJ3aXNwL3NlcXVlbmNlXCIpKS5yZXN0O1xudmFyIGxpc3QgPSAocmVxdWlyZShcIndpc3Avc2VxdWVuY2VcIikpLmxpc3Q7XG52YXIgc3ltYm9sID0gKHJlcXVpcmUoXCJ3aXNwL2FzdFwiKSkuc3ltYm9sO1xudmFyIHByU3RyID0gKHJlcXVpcmUoXCJ3aXNwL2FzdFwiKSkucHJTdHI7XG52YXIgc3VicyA9IChyZXF1aXJlKFwid2lzcC9ydW50aW1lXCIpKS5zdWJzO1xudmFyIGluc3BlY3QgPSAocmVxdWlyZShcInV0aWxcIikpLmluc3BlY3Q7O1xuXG52YXIgX19vdXRfXyA9IGZ1bmN0aW9uIF9fb3V0X18oKSB7XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMuX19vdXRfXyA9IF9fb3V0X187XG5cbndpbmRvdy5leHBvcnRzID0ge307XG5cbndpbmRvdy5tb2R1bGUgPSB7XG4gIFwiZXhwb3J0c1wiOiB3aW5kb3cuZXhwb3J0c1xufTtcblxud2luZG93Lmxpc3QgPSBsaXN0O1xuXG53aW5kb3cuc3ltYm9sID0gc3ltYm9sO1xuXG53aW5kb3cuT3V0ID0gX19vdXRfXztcblxud2luZG93Ll9fcHJpbnRDb21waWxlZF9fID0gZmFsc2U7XG5cbndpbmRvdy5fX3ByaW50UmVhZF9fID0gZmFsc2U7XG5cbnZhciBFdmFsdWF0aW9uUmVzdWx0ID0gZnVuY3Rpb24gRXZhbHVhdGlvblJlc3VsdChvdXRwdXQpIHtcbiAgdGhpcy52YWx1ZSA9IG91dHB1dDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZXhwb3J0cy5FdmFsdWF0aW9uUmVzdWx0ID0gRXZhbHVhdGlvblJlc3VsdDtcblxucmVuZGVyLmRlZmluZShFdmFsdWF0aW9uUmVzdWx0LCBmdW5jdGlvbihyZXN1bHQpIHtcbiAgdmFyIG91dHB1dCA9IHJlc3VsdC52YWx1ZTtcbiAgdmFyIHZpZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICB2aWV3LmlubmVySFRNTCA9ICgob3V0cHV0IHx8IDApW1wiZXJyb3JcIl0pIHx8IChcIlwiICsgKF9fcHJpbnRSZWFkX18gP1xuICAgIFwiXCIgKyBcIjxoMT5SZWFkPC9oMT5cIiArIFwiPGRpdj5cIiArIChpbnNwZWN0KChvdXRwdXQgfHwgMClbXCJmb3Jtc1wiXSkpICsgXCI8L2Rpdj5cIiA6XG4gICAgXCJcIikgKyAoX19wcmludENvbXBpbGVkX18gP1xuICAgIFwiXCIgKyBcIjxoMz5Db21waWxlZCBKUzwvaDM+XCIgKyBcIjxkaXY+XCIgKyAoKG91dHB1dCB8fCAwKVtcImpzLWNvZGVcIl0pICsgXCI8L2Rpdj5cIiA6XG4gICAgXCJcIikgKyBcIjxoMz5FdmFsIHJlc3VsdDwvaDM+XCIgKyBcIjxkaXY+XCIgKyAoKG91dHB1dCB8fCAwKVtcInByaW50XCJdKSArIFwiPC9kaXY+XCIpO1xuICByZXR1cm4gdmlldztcbn0pO1xuXG52YXIgc2VuZCA9IGZ1bmN0aW9uIHNlbmQocGFja2V0KSB7XG4gIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gIGV2ZW50LmluaXRDdXN0b21FdmVudChcImNsaWVudFwiLCBmYWxzZSwgdHJ1ZSwgcGFja2V0KTtcbiAgcmV0dXJuIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn07XG5leHBvcnRzLnNlbmQgPSBzZW5kO1xuXG52YXIgc3RhcnRIb3N0ID0gZnVuY3Rpb24gc3RhcnRIb3N0KCkge1xuICByZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzZXJ2ZXJcIiwgaGFuZGxlLCBmYWxzZSk7XG59O1xuZXhwb3J0cy5zdGFydEhvc3QgPSBzdGFydEhvc3Q7XG5cbnZhciBoYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUocGFja2V0KSB7XG4gIHZhciBhZGRyZXNzID0gKCgocGFja2V0IHx8IDApW1wiZGV0YWlsXCJdKSB8fCAwKVtcInRvXCJdO1xuICB2YXIgaW5wdXQgPSAoKChwYWNrZXQgfHwgMClbXCJkZXRhaWxcIl0pIHx8IDApW1wic291cmNlXCJdO1xuICB2YXIgb3V0cHV0ID0gZXZhbHVhdGUoaW5wdXQpO1xuICB2YXIgcmVzdWx0ID0gbmV3IEV2YWx1YXRpb25SZXN1bHQob3V0cHV0KTtcbiAgKF9fb3V0X18gfHwgMClbYWRkcmVzc10gPSByZXN1bHQ7XG4gIHJldHVybiBzZW5kKHtcbiAgICBcImZyb21cIjogYWRkcmVzcyxcbiAgICBcIm1lc3NhZ2VcIjogcmVzdWx0XG4gIH0pO1xufTtcbmV4cG9ydHMuaGFuZGxlID0gaGFuZGxlO1xuXG52YXIgZXZhbHVhdGUgPSBmdW5jdGlvbiBldmFsdWF0ZShpbnB1dCkge1xuICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZm9ybXMgPSByZWFkXyhpbnB1dCk7XG4gICAgICB2YXIganNDb2RlID0gY29tcGlsZV8oZm9ybXMpO1xuICAgICAgdmFyIHByZWZpeENvZGUgPSBcInZhclwiID09PSBzdWJzKGpzQ29kZSwgMCwgMykgP1xuICAgICAgICBcIlwiIDpcbiAgICAgICAgXCJfID0gXCI7XG4gICAgICB2YXIganNOb3JtYWxpemVkID0gXCJcIiArIFwidHJ5IHsgXCIgKyBwcmVmaXhDb2RlICsganNDb2RlICsgXCIgfSBjYXRjaChlKSB7IGUgfVwiO1xuICAgICAgdmFyIHJlc3VsdCA9IHdpbmRvdy5ldmFsKGpzTm9ybWFsaXplZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBcImlucHV0XCI6IGlucHV0LFxuICAgICAgICBcImZvcm1zXCI6IGZvcm1zLFxuICAgICAgICBcImpzLWNvZGVcIjoganNDb2RlLFxuICAgICAgICBcInJlc3VsdFwiOiByZXN1bHQsXG4gICAgICAgIFwicHJpbnRcIjogcHJTdHIocmVzdWx0KVxuICAgICAgfTtcbiAgICB9KSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBcImlucHV0XCI6IGlucHV0LFxuICAgICAgXCJlcnJvclwiOiBlcnJvclxuICAgIH07XG4gIH19KSgpO1xufTtcbmV4cG9ydHMuZXZhbHVhdGUgPSBldmFsdWF0ZSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnByb2Nlc3MubmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgaWYgKGNhblBvc3QpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoZXYuc291cmNlID09PSB3aW5kb3cgJiYgZXYuZGF0YSA9PT0gJ3Byb2Nlc3MtdGljaycpIHtcbiAgICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBmbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGZuKTtcbiAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSgncHJvY2Vzcy10aWNrJywgJyonKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgc2V0VGltZW91dChmbiwgMCk7XG4gICAgfTtcbn0pKCk7XG5cbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuLy8gVE9ETyhzaHR5bG1hbilcbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuIiwiKGZ1bmN0aW9uKHByb2Nlc3Mpe2lmICghcHJvY2Vzcy5FdmVudEVtaXR0ZXIpIHByb2Nlc3MuRXZlbnRFbWl0dGVyID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBFdmVudEVtaXR0ZXIgPSBleHBvcnRzLkV2ZW50RW1pdHRlciA9IHByb2Nlc3MuRXZlbnRFbWl0dGVyO1xudmFyIGlzQXJyYXkgPSB0eXBlb2YgQXJyYXkuaXNBcnJheSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gQXJyYXkuaXNBcnJheVxuICAgIDogZnVuY3Rpb24gKHhzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nXG4gICAgfVxuO1xuZnVuY3Rpb24gaW5kZXhPZiAoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgcmV0dXJuIHhzLmluZGV4T2YoeCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoeCA9PT0geHNbaV0pIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW5cbi8vIDEwIGxpc3RlbmVycyBhcmUgYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaFxuLy8gaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG4vL1xuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCF0aGlzLl9ldmVudHMpIHRoaXMuX2V2ZW50cyA9IHt9O1xuICB0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzID0gbjtcbn07XG5cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNBcnJheSh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSlcbiAgICB7XG4gICAgICBpZiAoYXJndW1lbnRzWzFdIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgYXJndW1lbnRzWzFdOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5jYXVnaHQsIHVuc3BlY2lmaWVkICdlcnJvcicgZXZlbnQuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhpcy5fZXZlbnRzKSByZXR1cm4gZmFsc2U7XG4gIHZhciBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBpZiAoIWhhbmRsZXIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuXG4gIH0gZWxzZSBpZiAoaXNBcnJheShoYW5kbGVyKSkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBFdmVudEVtaXR0ZXIgaXMgZGVmaW5lZCBpbiBzcmMvbm9kZV9ldmVudHMuY2Ncbi8vIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCgpIGlzIGFsc28gZGVmaW5lZCB0aGVyZS5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGxpc3RlbmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZGRMaXN0ZW5lciBvbmx5IHRha2VzIGluc3RhbmNlcyBvZiBGdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT0gXCJuZXdMaXN0ZW5lcnNcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJzXCIuXG4gIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHRoaXMuX2V2ZW50c1t0eXBlXSkpIHtcblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgICB2YXIgbTtcbiAgICAgIGlmICh0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbSA9IHRoaXMuX2V2ZW50cy5tYXhMaXN0ZW5lcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtID0gZGVmYXVsdE1heExpc3RlbmVycztcbiAgICAgIH1cblxuICAgICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYub24odHlwZSwgZnVuY3Rpb24gZygpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgbGlzdGVuZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbW92ZUxpc3RlbmVyIG9ubHkgdGFrZXMgaW5zdGFuY2VzIG9mIEZ1bmN0aW9uJyk7XG4gIH1cblxuICAvLyBkb2VzIG5vdCB1c2UgbGlzdGVuZXJzKCksIHNvIG5vIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIF9ldmVudHNbdHlwZV1cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSkgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzQXJyYXkobGlzdCkpIHtcbiAgICB2YXIgaSA9IGluZGV4T2YobGlzdCwgbGlzdGVuZXIpO1xuICAgIGlmIChpIDwgMCkgcmV0dXJuIHRoaXM7XG4gICAgbGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDApXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICB9IGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSA9PT0gbGlzdGVuZXIpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGRvZXMgbm90IHVzZSBsaXN0ZW5lcnMoKSwgc28gbm8gc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgX2V2ZW50c1t0eXBlXVxuICBpZiAodHlwZSAmJiB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzW3R5cGVdKSB0aGlzLl9ldmVudHNbdHlwZV0gPSBudWxsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAoIXRoaXMuX2V2ZW50cykgdGhpcy5fZXZlbnRzID0ge307XG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKSB0aGlzLl9ldmVudHNbdHlwZV0gPSBbXTtcbiAgaWYgKCFpc0FycmF5KHRoaXMuX2V2ZW50c1t0eXBlXSkpIHtcbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZXZlbnRzW3R5cGVdO1xufTtcblxufSkocmVxdWlyZShcIl9fYnJvd3NlcmlmeV9wcm9jZXNzXCIpKSIsInZhciBfbnNfID0gXCJ3aXNwLmJhY2tlbmQuamF2YXNjcmlwdC53cml0ZXJcIjtcbm1vZHVsZS5uYW1lc3BhY2UgPSBfbnNfO1xubW9kdWxlLmRlc2NyaXB0aW9uID0gXCJDb21waWxlciBiYWNrZW5kIGZvciBmb3Igd3JpdGluZyBKUyBvdXRwdXRcIjtcbnZhciBuYW1lID0gKHJlcXVpcmUoXCIuLy4uLy4uL2FzdFwiKSkubmFtZTtcbnZhciBuYW1lc3BhY2UgPSAocmVxdWlyZShcIi4vLi4vLi4vYXN0XCIpKS5uYW1lc3BhY2U7XG52YXIgc3ltYm9sID0gKHJlcXVpcmUoXCIuLy4uLy4uL2FzdFwiKSkuc3ltYm9sO1xudmFyIGlzU3ltYm9sID0gKHJlcXVpcmUoXCIuLy4uLy4uL2FzdFwiKSkuaXNTeW1ib2w7XG52YXIgaXNLZXl3b3JkID0gKHJlcXVpcmUoXCIuLy4uLy4uL2FzdFwiKSkuaXNLZXl3b3JkO1xudmFyIGxpc3QgPSAocmVxdWlyZShcIi4vLi4vLi4vc2VxdWVuY2VcIikpLmxpc3Q7XG52YXIgZmlyc3QgPSAocmVxdWlyZShcIi4vLi4vLi4vc2VxdWVuY2VcIikpLmZpcnN0O1xudmFyIHJlc3QgPSAocmVxdWlyZShcIi4vLi4vLi4vc2VxdWVuY2VcIikpLnJlc3Q7XG52YXIgaXNMaXN0ID0gKHJlcXVpcmUoXCIuLy4uLy4uL3NlcXVlbmNlXCIpKS5pc0xpc3Q7XG52YXIgdmVjID0gKHJlcXVpcmUoXCIuLy4uLy4uL3NlcXVlbmNlXCIpKS52ZWM7XG52YXIgbWFwID0gKHJlcXVpcmUoXCIuLy4uLy4uL3NlcXVlbmNlXCIpKS5tYXA7XG52YXIgY291bnQgPSAocmVxdWlyZShcIi4vLi4vLi4vc2VxdWVuY2VcIikpLmNvdW50O1xudmFyIGxhc3QgPSAocmVxdWlyZShcIi4vLi4vLi4vc2VxdWVuY2VcIikpLmxhc3Q7XG52YXIgcmVkdWNlID0gKHJlcXVpcmUoXCIuLy4uLy4uL3NlcXVlbmNlXCIpKS5yZWR1Y2U7XG52YXIgaXNFbXB0eSA9IChyZXF1aXJlKFwiLi8uLi8uLi9zZXF1ZW5jZVwiKSkuaXNFbXB0eTtcbnZhciBpc1RydWUgPSAocmVxdWlyZShcIi4vLi4vLi4vcnVudGltZVwiKSkuaXNUcnVlO1xudmFyIGlzTmlsID0gKHJlcXVpcmUoXCIuLy4uLy4uL3J1bnRpbWVcIikpLmlzTmlsO1xudmFyIGlzU3RyaW5nID0gKHJlcXVpcmUoXCIuLy4uLy4uL3J1bnRpbWVcIikpLmlzU3RyaW5nO1xudmFyIGlzTnVtYmVyID0gKHJlcXVpcmUoXCIuLy4uLy4uL3J1bnRpbWVcIikpLmlzTnVtYmVyO1xudmFyIGlzVmVjdG9yID0gKHJlcXVpcmUoXCIuLy4uLy4uL3J1bnRpbWVcIikpLmlzVmVjdG9yO1xudmFyIGlzRGljdGlvbmFyeSA9IChyZXF1aXJlKFwiLi8uLi8uLi9ydW50aW1lXCIpKS5pc0RpY3Rpb25hcnk7XG52YXIgaXNCb29sZWFuID0gKHJlcXVpcmUoXCIuLy4uLy4uL3J1bnRpbWVcIikpLmlzQm9vbGVhbjtcbnZhciBpc1JlUGF0dGVybiA9IChyZXF1aXJlKFwiLi8uLi8uLi9ydW50aW1lXCIpKS5pc1JlUGF0dGVybjtcbnZhciByZUZpbmQgPSAocmVxdWlyZShcIi4vLi4vLi4vcnVudGltZVwiKSkucmVGaW5kO1xudmFyIGRlYyA9IChyZXF1aXJlKFwiLi8uLi8uLi9ydW50aW1lXCIpKS5kZWM7XG52YXIgc3VicyA9IChyZXF1aXJlKFwiLi8uLi8uLi9ydW50aW1lXCIpKS5zdWJzO1xudmFyIHJlcGxhY2UgPSAocmVxdWlyZShcIi4vLi4vLi4vc3RyaW5nXCIpKS5yZXBsYWNlO1xudmFyIGpvaW4gPSAocmVxdWlyZShcIi4vLi4vLi4vc3RyaW5nXCIpKS5qb2luO1xudmFyIHNwbGl0ID0gKHJlcXVpcmUoXCIuLy4uLy4uL3N0cmluZ1wiKSkuc3BsaXQ7XG52YXIgdXBwZXJDYXNlID0gKHJlcXVpcmUoXCIuLy4uLy4uL3N0cmluZ1wiKSkudXBwZXJDYXNlOztcblxudmFyIHdyaXRlUmVmZXJlbmNlID0gZnVuY3Rpb24gd3JpdGVSZWZlcmVuY2UoZm9ybSkge1xuICBcIlRyYW5zbGF0ZXMgcmVmZXJlbmNlcyBmcm9tIGNsb2p1cmUgY29udmVudGlvbiB0byBKUzpcXG5cXG4gICoqbWFjcm9zKiogICAgICBfX21hY3Jvc19fXFxuICBsaXN0LT52ZWN0b3IgICAgbGlzdFRvVmVjdG9yXFxuICBzZXQhICAgICAgICAgICAgc2V0XFxuICBmb29fYmFyICAgICAgICAgZm9vX2JhclxcbiAgbnVtYmVyPyAgICAgICAgIGlzTnVtYmVyXFxuICBjcmVhdGUtc2VydmVyICAgY3JlYXRlU2VydmVyXCI7XG4gIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlkID0gbmFtZShmb3JtKTtcbiAgICBpZCA9IGlkID09PSBcIipcIiA/XG4gICAgICBcIm11bHRpcGx5XCIgOlxuICAgIGlkID09PSBcIi9cIiA/XG4gICAgICBcImRpdmlkZVwiIDpcbiAgICBpZCA9PT0gXCIrXCIgP1xuICAgICAgXCJzdW1cIiA6XG4gICAgaWQgPT09IFwiLVwiID9cbiAgICAgIFwic3VidHJhY3RcIiA6XG4gICAgaWQgPT09IFwiPVwiID9cbiAgICAgIFwiZXF1YWw/XCIgOlxuICAgIGlkID09PSBcIj09XCIgP1xuICAgICAgXCJzdHJpY3QtZXF1YWw/XCIgOlxuICAgIGlkID09PSBcIjw9XCIgP1xuICAgICAgXCJub3QtZ3JlYXRlci10aGFuXCIgOlxuICAgIGlkID09PSBcIj49XCIgP1xuICAgICAgXCJub3QtbGVzcy10aGFuXCIgOlxuICAgIGlkID09PSBcIj5cIiA/XG4gICAgICBcImdyZWF0ZXItdGhhblwiIDpcbiAgICBpZCA9PT0gXCI8XCIgP1xuICAgICAgXCJsZXNzLXRoYW5cIiA6XG4gICAgXCJlbHNlXCIgP1xuICAgICAgaWQgOlxuICAgICAgdm9pZCgwKTtcbiAgICBpZCA9IGpvaW4oXCJfXCIsIHNwbGl0KGlkLCBcIipcIikpO1xuICAgIGlkID0gam9pbihcIi10by1cIiwgc3BsaXQoaWQsIFwiLT5cIikpO1xuICAgIGlkID0gam9pbihzcGxpdChpZCwgXCIhXCIpKTtcbiAgICBpZCA9IGpvaW4oXCIkXCIsIHNwbGl0KGlkLCBcIiVcIikpO1xuICAgIGlkID0gam9pbihcIi1wbHVzLVwiLCBzcGxpdChpZCwgXCIrXCIpKTtcbiAgICBpZCA9IGpvaW4oXCItYW5kLVwiLCBzcGxpdChpZCwgXCImXCIpKTtcbiAgICBpZCA9IGxhc3QoaWQpID09PSBcIj9cIiA/XG4gICAgICBcIlwiICsgXCJpcy1cIiArIChzdWJzKGlkLCAwLCBkZWMoY291bnQoaWQpKSkpIDpcbiAgICAgIGlkO1xuICAgIGlkID0gcmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwga2V5KSB7XG4gICAgICByZXR1cm4gXCJcIiArIHJlc3VsdCArICgoIShpc0VtcHR5KHJlc3VsdCkpKSAmJiAoIShpc0VtcHR5KGtleSkpKSA/XG4gICAgICAgIFwiXCIgKyAodXBwZXJDYXNlKChrZXkgfHwgMClbMF0pKSArIChzdWJzKGtleSwgMSkpIDpcbiAgICAgICAga2V5KTtcbiAgICB9LCBcIlwiLCBzcGxpdChpZCwgXCItXCIpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH0pKCk7XG59O1xuZXhwb3J0cy53cml0ZVJlZmVyZW5jZSA9IHdyaXRlUmVmZXJlbmNlO1xuXG52YXIgd3JpdGVLZXl3b3JkUmVmZXJlbmNlID0gZnVuY3Rpb24gd3JpdGVLZXl3b3JkUmVmZXJlbmNlKGZvcm0pIHtcbiAgcmV0dXJuIFwiXCIgKyBcIlxcXCJcIiArIChuYW1lKGZvcm0pKSArIFwiXFxcIlwiO1xufTtcbmV4cG9ydHMud3JpdGVLZXl3b3JkUmVmZXJlbmNlID0gd3JpdGVLZXl3b3JkUmVmZXJlbmNlO1xuXG52YXIgd3JpdGVLZXl3b3JkID0gZnVuY3Rpb24gd3JpdGVLZXl3b3JkKGZvcm0pIHtcbiAgcmV0dXJuIFwiXCIgKyBcIlxcXCJcIiArIFwi6p6JXCIgKyAobmFtZShmb3JtKSkgKyBcIlxcXCJcIjtcbn07XG5leHBvcnRzLndyaXRlS2V5d29yZCA9IHdyaXRlS2V5d29yZDtcblxudmFyIHdyaXRlU3ltYm9sID0gZnVuY3Rpb24gd3JpdGVTeW1ib2woZm9ybSkge1xuICByZXR1cm4gd3JpdGUobGlzdChzeW1ib2wodm9pZCgwKSwgXCJzeW1ib2xcIiksIG5hbWVzcGFjZShmb3JtKSwgbmFtZShmb3JtKSkpO1xufTtcbmV4cG9ydHMud3JpdGVTeW1ib2wgPSB3cml0ZVN5bWJvbDtcblxudmFyIHdyaXRlTmlsID0gZnVuY3Rpb24gd3JpdGVOaWwoZm9ybSkge1xuICByZXR1cm4gXCJ2b2lkKDApXCI7XG59O1xuZXhwb3J0cy53cml0ZU5pbCA9IHdyaXRlTmlsO1xuXG52YXIgd3JpdGVOdW1iZXIgPSBmdW5jdGlvbiB3cml0ZU51bWJlcihmb3JtKSB7XG4gIHJldHVybiBmb3JtO1xufTtcbmV4cG9ydHMud3JpdGVOdW1iZXIgPSB3cml0ZU51bWJlcjtcblxudmFyIHdyaXRlQm9vbGVhbiA9IGZ1bmN0aW9uIHdyaXRlQm9vbGVhbihmb3JtKSB7XG4gIHJldHVybiBpc1RydWUoZm9ybSkgP1xuICAgIFwidHJ1ZVwiIDpcbiAgICBcImZhbHNlXCI7XG59O1xuZXhwb3J0cy53cml0ZUJvb2xlYW4gPSB3cml0ZUJvb2xlYW47XG5cbnZhciB3cml0ZVN0cmluZyA9IGZ1bmN0aW9uIHdyaXRlU3RyaW5nKGZvcm0pIHtcbiAgZm9ybSA9IHJlcGxhY2UoZm9ybSwgUmVnRXhwKFwiXFxcXFxcXFxcIiwgXCJnXCIpLCBcIlxcXFxcXFxcXCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXG5cIiwgXCJnXCIpLCBcIlxcXFxuXCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXHJcIiwgXCJnXCIpLCBcIlxcXFxyXCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXHRcIiwgXCJnXCIpLCBcIlxcXFx0XCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXFwiXCIsIFwiZ1wiKSwgXCJcXFxcXFxcIlwiKTtcbiAgcmV0dXJuIFwiXCIgKyBcIlxcXCJcIiArIGZvcm0gKyBcIlxcXCJcIjtcbn07XG5leHBvcnRzLndyaXRlU3RyaW5nID0gd3JpdGVTdHJpbmc7XG5cbnZhciB3cml0ZVRlbXBsYXRlID0gZnVuY3Rpb24gd3JpdGVUZW1wbGF0ZSgpIHtcbiAgdmFyIGZvcm0gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmRlbnRQYXR0ZXJuID0gL1xcbiAqJC87XG4gICAgdmFyIGxpbmVCcmVha1BhdHRlciA9IFJlZ0V4cChcIlxcblwiLCBcImdcIik7XG4gICAgdmFyIGdldEluZGVudGF0aW9uID0gZnVuY3Rpb24oY29kZSkge1xuICAgICAgcmV0dXJuIChyZUZpbmQoaW5kZW50UGF0dGVybiwgY29kZSkpIHx8IFwiXFxuXCI7XG4gICAgfTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoY29kZSwgcGFydHMsIHZhbHVlcykge1xuICAgICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICByZWN1ciA9IGNvdW50KHBhcnRzKSA+IDEgP1xuICAgICAgICAoY29kZSA9IFwiXCIgKyBjb2RlICsgKGZpcnN0KHBhcnRzKSkgKyAocmVwbGFjZShcIlwiICsgXCJcIiArIChmaXJzdCh2YWx1ZXMpKSwgbGluZUJyZWFrUGF0dGVyLCBnZXRJbmRlbnRhdGlvbihmaXJzdChwYXJ0cykpKSksIHBhcnRzID0gcmVzdChwYXJ0cyksIHZhbHVlcyA9IHJlc3QodmFsdWVzKSwgbG9vcCkgOlxuICAgICAgICBcIlwiICsgY29kZSArIChmaXJzdChwYXJ0cykpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZWN1cjtcbiAgICB9KShcIlwiLCBzcGxpdChmaXJzdChmb3JtKSwgXCJ+e31cIiksIHJlc3QoZm9ybSkpO1xuICB9KSgpO1xufTtcbmV4cG9ydHMud3JpdGVUZW1wbGF0ZSA9IHdyaXRlVGVtcGxhdGU7XG5cbnZhciB3cml0ZUdyb3VwID0gZnVuY3Rpb24gd3JpdGVHcm91cCgpIHtcbiAgdmFyIGZvcm1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGpvaW4oXCIsIFwiLCBmb3Jtcyk7XG59O1xuZXhwb3J0cy53cml0ZUdyb3VwID0gd3JpdGVHcm91cDtcblxudmFyIHdyaXRlSW52b2tlID0gZnVuY3Rpb24gd3JpdGVJbnZva2UoY2FsbGVlKSB7XG4gIHZhciBwYXJhbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gd3JpdGVUZW1wbGF0ZShcIn57fSh+e30pXCIsIGNhbGxlZSwgd3JpdGVHcm91cC5hcHBseSh3cml0ZUdyb3VwLCBwYXJhbXMpKTtcbn07XG5leHBvcnRzLndyaXRlSW52b2tlID0gd3JpdGVJbnZva2U7XG5cbnZhciB3cml0ZUVycm9yID0gZnVuY3Rpb24gd3JpdGVFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKGZ1bmN0aW9uKCkgeyB0aHJvdyBFcnJvcihtZXNzYWdlKTsgfSkoKTtcbiAgfTtcbn07XG5leHBvcnRzLndyaXRlRXJyb3IgPSB3cml0ZUVycm9yO1xuXG52YXIgd3JpdGVWZWN0b3IgPSB3cml0ZUVycm9yKFwiVmVjdG9ycyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbmV4cG9ydHMud3JpdGVWZWN0b3IgPSB3cml0ZVZlY3RvcjtcblxudmFyIHdyaXRlRGljdGlvbmFyeSA9IHdyaXRlRXJyb3IoXCJEaWN0aW9uYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG5leHBvcnRzLndyaXRlRGljdGlvbmFyeSA9IHdyaXRlRGljdGlvbmFyeTtcblxudmFyIHdyaXRlUGF0dGVybiA9IHdyaXRlRXJyb3IoXCJSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuZXhwb3J0cy53cml0ZVBhdHRlcm4gPSB3cml0ZVBhdHRlcm47XG5cbnZhciBjb21waWxlQ29tbWVudCA9IGZ1bmN0aW9uIGNvbXBpbGVDb21tZW50KGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiLy9+e31cXG5cIiwgZmlyc3QoZm9ybSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVDb21tZW50ID0gY29tcGlsZUNvbW1lbnQ7XG5cbnZhciB3cml0ZURlZiA9IGZ1bmN0aW9uIHdyaXRlRGVmKGZvcm0pIHtcbiAgdmFyIGlkID0gZmlyc3QoZm9ybSk7XG4gIHZhciBpc0V4cG9ydCA9ICgoKChtZXRhKGZvcm0pKSB8fCB7fSkgfHwgMClbXCJ0b3BcIl0pICYmICghKCgoKG1ldGEoaWQpKSB8fCB7fSkgfHwgMClbXCJwcml2YXRlXCJdKSk7XG4gIHZhciBhdHRyaWJ1dGUgPSBzeW1ib2wobmFtZXNwYWNlKGlkKSwgXCJcIiArIFwiLVwiICsgKG5hbWUoaWQpKSk7XG4gIHJldHVybiBpc0V4cG9ydCA/XG4gICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJ2YXIgfnt9O1xcbn57fVwiLCBjb21waWxlKGNvbnMoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgZm9ybSkpLCBjb21waWxlKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCIuXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJleHBvcnRzXCIpLCBhdHRyaWJ1dGUpLCBpZCkpKSkgOlxuICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwidmFyIH57fVwiLCBjb21waWxlKGNvbnMoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgZm9ybSkpKSk7XG59O1xuZXhwb3J0cy53cml0ZURlZiA9IHdyaXRlRGVmO1xuXG52YXIgd3JpdGUgPSBmdW5jdGlvbiB3cml0ZShmb3JtKSB7XG4gIHJldHVybiBpc05pbChmb3JtKSA/XG4gICAgd3JpdGVOaWwoZm9ybSkgOlxuICBpc1N5bWJvbChmb3JtKSA/XG4gICAgd3JpdGVSZWZlcmVuY2UoZm9ybSkgOlxuICBpc0tleXdvcmQoZm9ybSkgP1xuICAgIHdyaXRlS2V5d29yZFJlZmVyZW5jZShmb3JtKSA6XG4gIGlzU3RyaW5nKGZvcm0pID9cbiAgICB3cml0ZVN0cmluZyhmb3JtKSA6XG4gIGlzTnVtYmVyKGZvcm0pID9cbiAgICB3cml0ZU51bWJlcihmb3JtKSA6XG4gIGlzQm9vbGVhbihmb3JtKSA/XG4gICAgd3JpdGVCb29sZWFuKGZvcm0pIDpcbiAgaXNSZVBhdHRlcm4oZm9ybSkgP1xuICAgIHdyaXRlUGF0dGVybihmb3JtKSA6XG4gIGlzVmVjdG9yKGZvcm0pID9cbiAgICB3cml0ZVZlY3Rvcihmb3JtKSA6XG4gIGlzRGljdGlvbmFyeShmb3JtKSA/XG4gICAgd3JpdGVEaWN0aW9uYXJ5KCkgOlxuICBpc0xpc3QoZm9ybSkgP1xuICAgIHdyaXRlSW52b2tlLmFwcGx5KHdyaXRlSW52b2tlLCBtYXAod3JpdGUsIHZlYyhmb3JtKSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHdyaXRlRXJyb3IoXCJVbnN1cHBvcnRlZCBmb3JtXCIpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMud3JpdGUgPSB3cml0ZVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBkaWZmID0gcmVxdWlyZShcImRpZmZwYXRjaGVyL2RpZmZcIilcbnZhciBwYXRjaCA9IHJlcXVpcmUoXCJkaWZmcGF0Y2hlci9wYXRjaFwiKVxudmFyIG91dHB1dCA9IHJlcXVpcmUoXCIuL291dHB1dFwiKVxudmFyIG1ha2VPdXRwdXQgPSBvdXRwdXQubWFrZU91dHB1dFxudmFyIHdyaXRlT3V0cHV0ID0gb3V0cHV0LndyaXRlXG5cblxudmFyIE91dCA9IFwib3V0QGludGVyYWN0aXZhdGVcIlxudmFyIEluID0gXCJpbkBpbnRlcmFjdGl2YXRlXCJcbnZhciBSZWNpZXZlciA9IFwicmVjZWl2ZXJAaW50ZXJhY3RpdmF0ZVwiXG5cbmZ1bmN0aW9uIG1ha2VPcHRpb25HZXR0ZXIobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3B0aW9uKGVkaXRvcikge1xuICAgIHJldHVybiBlZGl0b3IuZ2V0T3B0aW9uKG5hbWUpXG4gIH1cbn1cblxudmFyIGdldFJlbmRlclJhdGUgPSBtYWtlT3B0aW9uR2V0dGVyKFwiaW50ZXJhY3RpdmVTcGVlZFwiKVxudmFyIGdldFNlY3Rpb25TZXBhcmF0b3IgPSBtYWtlT3B0aW9uR2V0dGVyKFwiaW50ZXJhY3RpdmVTZXBhcmF0b3JcIilcblxuXG52YXIgc2xpY2VyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5mdW5jdGlvbiB0aHJvdHRsZShmLCBkZWxheSkge1xuICAvKipcbiAgQ3JlYXRlcyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRocm90dGxlcyBjYWxscyB0byBnaXZlbiBgZmAgc3VjaCB0aGF0LFxuICBpdCdzIG9ubHkgY2FsbGVkIGlmIG5vIGZ1cnRoZXIgY2FsbHMgYXJlIG1hZGUgd2l0aCBpbiB0aGUgdGltZVxuICBmcmFtZSAoaW4gbWlsaXNlY29uZHMpIHJldHVybmVkIGJ5IGdpdmVuIGBkZWxheS5hcHBseSh0aGlzLCBhcmd1bWVudHMpYFxuICBmdW5jdGlvbi5cbiAgKiovXG4gIHZhciBpZCA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIHRocm90dGxlZCgpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQsIHRocm90dGxlZClcbiAgICB2YXIgbXMgPSBkZWxheS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcbiAgICBpZCA9IHNldFRpbWVvdXQuYXBwbHkodGhpcywgW2YsIG1zXS5jb25jYXQoc2xpY2VyLmNhbGwoYXJndW1lbnRzKSkpXG4gIH1cbn1cblxuXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZShlZGl0b3IpIHtcbiAgdmFyIHN0YXRlID0gZWRpdG9yW0luXVxuICB2YXIgaW5wdXQgPSBlZGl0b3IuZ2V0VmFsdWUoKVxuICB2YXIgc2VwYXJhdG9yID0gZ2V0U2VjdGlvblNlcGFyYXRvcihlZGl0b3IpXG4gIHZhciBzZWN0aW9ucyA9IGlucHV0LnNwbGl0KHNlcGFyYXRvcilcbiAgdmFyIGFjdGl2ZUxpbmUgPSBlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZVxuXG4gIHNlY3Rpb25zLnBvcCgpIC8vIGxhc3Qgc2VjdGlvbiBkb2VzIG5vdCBoYXMgZXhlY3V0aW9uIG1hcmtlciBzbyBza2lwIGl0LlxuXG4gIHZhciBjaGFuZ2UgPSBPYmplY3Qua2V5cyhzZWN0aW9ucykucmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwgaW5kZXgpIHtcbiAgICB2YXIgaW5wdXQgPSBzZWN0aW9uc1tpbmRleF1cbiAgICB2YXIgbGluZSA9IHJlc3VsdC5saW5lICsgaW5wdXQuc3BsaXQoXCJcXG5cIikubGVuZ3RoIC0gMVxuICAgIHJlc3VsdC5saW5lID0gbGluZVxuICAgIHZhciBkZWx0YSA9IHtpbnB1dDogaW5wdXQudHJpbSgpLCBsaW5lOiBsaW5lLCB2aXNpYmxlOiBhY3RpdmVMaW5lICE9PSBsaW5lfVxuICAgIHJlc3VsdC5zdGF0ZVtpbmRleF0gPSBzdGF0ZVtpbmRleF0gPyBwYXRjaChzdGF0ZVtpbmRleF0sIGRlbHRhKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIHsgbGluZTogMCwgc3RhdGU6IHt9IH0pXG5cbiAgcmV0dXJuIGRpZmYoZWRpdG9yW0luXSwgY2hhbmdlLnN0YXRlKVxufVxuXG5cbmZ1bmN0aW9uIHNlbmQocGFja2V0KSB7XG4gIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIilcbiAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KFwic2VydmVyXCIsIGZhbHNlLCB0cnVlLCBwYWNrZXQpXG4gIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxufVxuXG5cbmZ1bmN0aW9uIHJlY2lldmUoZWRpdG9yLCBldmVudCkge1xuICB2YXIgcGFja2V0ID0gZXZlbnQuZGV0YWlsXG4gIHZhciBkZWx0YSA9IHt9XG4gIGRlbHRhW3BhY2tldC5mcm9tXSA9IHtwZW5kaW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBwYWNrZXQubWVzc2FnZX1cbiAgd3JpdGUoZWRpdG9yLCBkZWx0YSlcbn1cblxuZnVuY3Rpb24gcHJpbnQoZWRpdG9yKSB7XG4gIGlmICghZWRpdG9yLmdldE9wdGlvbihcImludGVyYWN0aXZhdGVcIikpIHRocm93IGVkaXRvci5jb25zdHJ1Y3Rvci5QYXNzXG4gIGVkaXRvci5vcGVyYXRpb24oZnVuY3Rpb24oKSB7XG4gICAgdmFyIGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3IoKVxuICAgIGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFwiXFxuLy8gPT5cXG5cIilcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogY3Vyc29yLmxpbmUgKyAyLCBjaDogMCB9KVxuICB9KVxufVxuXG5cbmZ1bmN0aW9uIGdldE1hcmtlckZvcihlZGl0b3IsIHZpZXcpIHtcbiAgdmFyIG1hcmtlcnMgPSBlZGl0b3IuZ2V0QWxsTWFya3MoKVxuICB2YXIgY291bnQgPSBtYXJrZXJzLmxlbmd0aFxuICB3aGlsZSAoY291bnQpIHtcbiAgICBjb3VudCA9IGNvdW50IC0gMVxuICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzW2NvdW50XVxuICAgIGlmIChtYXJrZXIucmVwbGFjZWRXaXRoID09PSB2aWV3KSByZXR1cm4gbWFya2VyXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuXG5mdW5jdGlvbiB3cml0ZShlZGl0b3IsIGNoYW5nZXMpIHtcbiAgdmFyIGRvYyA9IGVkaXRvci5nZXREb2MoKVxuICBPYmplY3Qua2V5cyhjaGFuZ2VzKS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uKF8sIGlkKSB7XG4gICAgaWYgKCFlZGl0b3JbT3V0XVtpZF0pIGVkaXRvcltPdXRdW2lkXSA9IG1ha2VPdXRwdXQoaWQpXG5cbiAgICB2YXIgb3V0cHV0ID0gZWRpdG9yW091dF1baWRdXG4gICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaWRdXG4gICAgaWYgKGNoYW5nZSA9PT0gbnVsbCkgZWRpdG9yW091dF1baWRdID0gbnVsbFxuXG4gICAgd3JpdGVPdXRwdXQob3V0cHV0LCBlZGl0b3IsIGNoYW5nZSlcbiAgfSwgbnVsbClcbiAgZWRpdG9yW0luXSA9IHBhdGNoKGVkaXRvcltJbl0sIGNoYW5nZXMpXG59XG5cbmZ1bmN0aW9uIHBvc3QoY2hhbmdlcykge1xuICBPYmplY3Qua2V5cyhjaGFuZ2VzKS5yZWR1Y2UoZnVuY3Rpb24oXywgaWQpIHtcbiAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tpZF1cbiAgICBpZiAoY2hhbmdlICYmIGNoYW5nZS5pbnB1dCkge1xuICAgICAgc2VuZCh7IHRvOiBpZCwgc291cmNlOiBjaGFuZ2UuaW5wdXQgfSlcbiAgICB9XG4gIH0sIG51bGwpXG59XG5cbi8vIEZ1bmN0aW9uIGZpbmRzIG1vZGlmaWVkIHNlY3Rpb25zIGFuZCBxdWV1ZXMgdXAgbWVzc2VnYXNlIHRvIGFuXG4vLyBldmFsIGhvc3QuIEluIGFkaXRpb24gaXQgYWxzbyByZW5kZXJzIG91dHB1dCB2aWV3cyAoaWYgdGhleVxuLy8gZG8gbm90IGV4aXN0IHlldCkgd2hlcmUgZXZhbCByZXN1bHRzIGFyZSB3cml0dGVuLlxudmFyIHJlbmRlck91dHB1dCA9IHRocm90dGxlKGZ1bmN0aW9uIHJlbmRlcihlZGl0b3IpIHtcbiAgdmFyIGRlbHRhID0gY2FsY3VsYXRlKGVkaXRvcilcbiAgdmFyIGNoYW5nZXMgPSBPYmplY3Qua2V5cyhkZWx0YSkucmVkdWNlKGZ1bmN0aW9uKGNoYW5nZXMsIGlkKSB7XG4gICAgdmFyIGNoYW5nZSA9IGRlbHRhW2lkXVxuICAgIC8vIE9ubHkgbWFyayBjaGFuZ2UgcGVuZGluZyBpZiB0aGVyZSBpcyBzb21lIGlucHV0IHRvIGJlIGV2YWxlZC5cbiAgICBpZiAoY2hhbmdlICYmIGNoYW5nZS5pbnB1dCkgY2hhbmdlLnBlbmRpbmcgPSB0cnVlXG4gICAgcmV0dXJuIGNoYW5nZXNcbiAgfSwgZGVsdGEpXG5cbiAgd3JpdGUoZWRpdG9yLCBjaGFuZ2VzKVxuICBwb3N0KGNoYW5nZXMpXG59LCBnZXRSZW5kZXJSYXRlKVxuXG52YXIgaGlkZU91dHB1dCA9IHRocm90dGxlKGZ1bmN0aW9uIHJlbmRlcihlZGl0b3IpIHtcbiAgdmFyIGxpbmUgPSBlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZVxuICB2YXIgc3RhdGUgPSBlZGl0b3JbSW5dXG4gIHZhciBjaGFuZ2VzID0gT2JqZWN0LmtleXMoc3RhdGUpLnJlZHVjZShmdW5jdGlvbihkZWx0YSwgaWQpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZVtpZF1cbiAgICBpZiAodmFsdWUubGluZSA9PT0gbGluZSkgZGVsdGFbaWRdID0ge3Zpc2libGU6IGZhbHNlfVxuICAgIGVsc2UgaWYgKCF2YWx1ZS52aXNpYmxlKSBkZWx0YVtpZF0gPSB7dmlzaWJsZTogdHJ1ZSwgbGluZTogdmFsdWUubGluZX1cblxuICAgIHJldHVybiBkZWx0YVxuICB9LCBbXSlcblxuICBpZiAoY2hhbmdlcy5sZW5ndGgpIHdyaXRlKGVkaXRvciwgY2hhbmdlcylcbn0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gMjAwIH0pXG5cblxuZnVuY3Rpb24gdG9vZ2xlUGx1Z2luKGVkaXRvciwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgZWRpdG9yW1JlY2lldmVyXSA9IHJlY2lldmUuYmluZChyZWNpZXZlLCBlZGl0b3IpXG4gICAgZWRpdG9yW0luXSA9IHt9XG4gICAgZWRpdG9yW091dF0gPSB7fVxuICAgIGVkaXRvci5vbihcImNoYW5nZVwiLCByZW5kZXJPdXRwdXQpXG4gICAgZWRpdG9yLm9uKFwiY3Vyc29yQWN0aXZpdHlcIiwgaGlkZU91dHB1dClcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWVudFwiLCBlZGl0b3JbUmVjaWV2ZXJdLCBmYWxzZSlcbiAgfSBlbHNlIHtcbiAgICBlZGl0b3Iub2ZmKFwiY2hhbmdlXCIsIHJlbmRlck91dHB1dClcbiAgICBlZGl0b3Iub2ZmKFwiY3Vyc29yQWN0aXZpdHlcIiwgaGlkZU91dHB1dClcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWVudFwiLCBlZGl0b3JbUmVjaWV2ZXJdLCBmYWxzZSlcbiAgICBlZGl0b3JbUmVjaWV2ZXJdID0gbnVsbFxuICAgIGVkaXRvcltJbl0gPSBudWxsXG4gICAgZWRpdG9yW091dF0gPSBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbChDb2RlTWlycm9yKSB7XG4gIC8vIEZpeCBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBzbyB0aGF0IGl0IGNvdWxkIGJlIGFjY2Vzc2VkIGZyb20gdGhlXG4gIC8vIGluc3RhbmNlLlxuICBDb2RlTWlycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvZGVNaXJyb3I7XG4gIENvZGVNaXJyb3IuZGVmYXVsdHMuaW50ZXJhY3RpdmVTcGVlZCA9IDMwMFxuICBDb2RlTWlycm9yLmRlZmF1bHRzLmludGVyYWN0aXZlU2VwYXJhdG9yID0gL15cXC9cXC8gXFw9XFw+W15cXG5dKiQvbVxuICBDb2RlTWlycm9yLmtleU1hcC5tYWNEZWZhdWx0W1wiQ21kLUVudGVyXCJdID0gcHJpbnRcbiAgQ29kZU1pcnJvci5rZXlNYXAucGNEZWZhdWx0W1wiQ3RybC1FbnRlclwiXSA9IHByaW50XG5cbiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oXCJpbnRlcmFjdGl2YXRlXCIsIGZhbHNlLCB0b29nbGVQbHVnaW4pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5zdGFsbFxuIiwidmFyIG1ha2VWaWV3ID0gcmVxdWlyZShcIi4vdmlld1wiKS5tYWtlVmlld1xudmFyIHJlbmRlciA9IHJlcXVpcmUoXCIuL3JlbmRlclwiKVxuXG5mdW5jdGlvbiBPdXRwdXQoaWQpIHtcbiAgdGhpcy5pZCA9IGlkXG59XG5cbmZ1bmN0aW9uIG1ha2VPdXRwdXQoaWQpIHtcbiAgcmV0dXJuIG5ldyBPdXRwdXQoaWQpXG59XG5cblxuZnVuY3Rpb24gY2xlYXIob3V0cHV0KSB7XG4gIG91dHB1dC5tYXJrZXIuY2xlYXIoKVxuICBvdXRwdXQud2lkZ2V0LmNsZWFyKClcbn1cblxuZnVuY3Rpb24gbWFyayhvdXRwdXQsIGVkaXRvciwgbGluZSkge1xuICBvdXRwdXQubWFya2VyID0gZWRpdG9yLm1hcmtUZXh0KHtsaW5lOiBsaW5lLCBjaDogMH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2xpbmU6IGxpbmV9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZUxlZnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmVSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcblxuICBvdXRwdXQud2lkZ2V0ID0gZWRpdG9yLmFkZExpbmVXaWRnZXQobGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC52aWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Nob3dJZkhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0hTY3JvbGw6dHJ1ZX0pXG59XG5cbmZ1bmN0aW9uIG1vdmUob3V0cHV0LCBlZGl0b3IsIGxpbmUpIHtcbiAgdmFyIHBvc2l0aW9uID0gb3V0cHV0Lm1hcmtlci5maW5kKClcbiAgaWYgKCFwb3NpdGlvbiB8fCBwb3NpdGlvbi5saW5lICE9PSBsaW5lKSB7XG4gICAgY2xlYXIob3V0cHV0KVxuICAgIG1hcmsob3V0cHV0LCBlZGl0b3IsIGxpbmUpXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGUob3V0cHV0LCBlZGl0b3IsIHN0YXRlKSB7XG4gIHZhciB2aWV3ID0gb3V0cHV0LnZpZXcgfHwgKG91dHB1dC52aWV3ID0gbWFrZVZpZXcoZWRpdG9yLCBvdXRwdXQuaWQpKVxuICBpZiAoc3RhdGUgPT09IG51bGwpIHJldHVybiBjbGVhcihvdXRwdXQpXG5cbiAgaWYgKHN0YXRlLnBlbmRpbmcpIG91dHB1dC52aWV3LnN0eWxlLm9wYWNpdHkgPSBcIjAuMlwiXG4gIGVsc2UgaWYgKHN0YXRlLnBlbmRpbmcgPT09IG51bGwpIG91dHB1dC52aWV3LnN0eWxlLm9wYWNpdHkgPSBcIlwiXG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHZhciBjb250ZW50ID0gcmVuZGVyKHN0YXRlLnJlc3VsdClcbiAgICB2aWV3LmJvZHkuaW5uZXJIVE1MID0gXCJcIlxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgRWxlbWVudCkgdmlldy5ib2R5LmFwcGVuZENoaWxkKGNvbnRlbnQpXG4gICAgZWxzZSB2aWV3LmJvZHkudGV4dENvbnRlbnQgPSBjb250ZW50XG4gIH1cblxuICBpZiAoc3RhdGUudmlzaWJsZSA9PT0gdHJ1ZSkgbWFyayhvdXRwdXQsIGVkaXRvciwgc3RhdGUubGluZSlcbiAgaWYgKHN0YXRlLnZpc2libGUgPT09IGZhbHNlKSBjbGVhcihvdXRwdXQpXG4gIGlmIChzdGF0ZS5saW5lKSBtb3ZlKG91dHB1dCwgZWRpdG9yLCBzdGF0ZS5saW5lKVxufVxuXG5leHBvcnRzLm1ha2VPdXRwdXQgPSBtYWtlT3V0cHV0XG5leHBvcnRzLndyaXRlID0gd3JpdGUiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1ldGhvZCA9IHJlcXVpcmUoXCJtZXRob2RcIilcbnZhciB1dGlsID0gcmVxdWlyZShcInV0aWxcIilcblxuXG4vLyBSZW5kZXIgZnVuY3Rpb24gdGFrZXMgYXJiaXRyYXJ5IGRhdGEgc3RydWN0dXJlIGFuZCByZXR1cm5zIHNvbWV0aGluZ1xuLy8gdGhhdCBjYW4gdmlzdWFsbHkgcmVwcmVzZW50IGl0LlxudmFyIHJlbmRlciA9IG1ldGhvZChcInJlbmRlckBpbnRlcmFjdGl2YXRlXCIpXG5cbnJlbmRlci5kZWZpbmUoZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHV0aWwuaW5zcGVjdCh2YWx1ZSlcbn0pXG5cbnJlbmRlci5kZWZpbmUoRXJyb3IsIGZ1bmN0aW9uKGVycm9yKSB7XG4gIHJldHVybiBTdHJpbmcoZXJyb3IpXG59KVxuXG5yZW5kZXIuZGVmaW5lKEVsZW1lbnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnRcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0gcmVuZGVyXG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gcmViYXNlKHJlc3VsdCwgcGFyZW50LCBkZWx0YSkge1xuICBPYmplY3Qua2V5cyhwYXJlbnQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgLy8gSWYgYHBhcmVudFtrZXldYCBpcyBgbnVsbGAgaXQgbWVhbnMgYXR0cmlidXRlIHdhcyBkZWxldGVkIGluIHByZXZpb3VzXG4gICAgLy8gdXBkYXRlLiBXZSBza2lwIHN1Y2ggcHJvcGVydGllcyBhcyB0aGVyZSBpcyBubyB1c2UgaW4ga2VlcGluZyB0aGVtXG4gICAgLy8gYXJvdW5kLiBJZiBgZGVsdGFba2V5XWAgaXMgYG51bGxgIHdlIHNraXAgdGhlc2UgcHJvcGVydGllcyB0b28gYXNcbiAgICAvLyB0aGUgaGF2ZSBiZWluZyBkZWxldGVkLlxuICAgIGlmICghKHBhcmVudFtrZXldID09IG51bGwgfHwgKGtleSBpbiBkZWx0YSAmJiBkZWx0YVtrZXldID09IG51bGwpKSlcbiAgICAgIHJlc3VsdFtrZXldID0gcGFyZW50W2tleV1cbiAgfSwgcmVzdWx0KVxuICBPYmplY3Qua2V5cyhkZWx0YSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoa2V5IGluIHBhcmVudCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBkZWx0YVtrZXldXG4gICAgICB2YXIgcHJldmlvdXMgPSBwYXJlbnRba2V5XVxuICAgICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSBjdXJyZW50ID0gY3VycmVudFxuICAgICAgLy8gSWYgYGRlbHRhW2tleV1gIGlzIGBudWxsYCBpdCdzIGRlbGV0ZSBzbyB3ZSBqdXN0IHNraXAgcHJvcGVydHkuXG4gICAgICBlbHNlIGlmIChjdXJyZW50ID09IG51bGwpIGN1cnJlbnQgPSBjdXJyZW50XG4gICAgICAvLyBJZiB2YWx1ZSBpcyBvZiBwcmltaXRpdmUgdHlwZSAoZnVuY3Rpb24gb3IgcmVnZXhwcyBzaG91bGQgbm90XG4gICAgICAvLyBldmVuIGJlIGhlcmUpIHdlIGp1c3QgdXBkYXRlIGluIHBsYWNlLlxuICAgICAgZWxzZSBpZiAodHlwZW9mKGN1cnJlbnQpICE9PSBcIm9iamVjdFwiKSByZXN1bHRba2V5XSA9IGN1cnJlbnRcbiAgICAgIC8vIElmIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSB3YXMgcHJpbWl0aXZlXG4gICAgICAvLyBhbmQgaXQncyBtYXBwZWQgdG8gbm9uIHByaW1pdGl2ZVxuICAgICAgZWxzZSBpZiAodHlwZW9mKHByZXZpb3VzKSAhPT0gXCJvYmplY3RcIikgcmVzdWx0W2tleV0gPSBjdXJyZW50XG4gICAgICBlbHNlIHJlc3VsdFtrZXldID0gcmViYXNlKHt9LCBwcmV2aW91cywgY3VycmVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWx0YVtrZXldXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmViYXNlXG4iLCJ2YXIgVEVBUl9JTUFHRSA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBWUFBQUFNQ0FZQUFBQkJWOHd1QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFHcEpSRUZVZU5waS9QLy9Qd00yd01TQUE3Q0FDRVlnZ0xLWmdmZ3ZFUDhCQ1lBd0t4QUxBakVQRUg4QjRnOU1VSTVJV2xxYXlldlhyOWVDYUNCZkdHU1NWbkp5c3UvWHIxK2ZBeDN5Lzl1M2J5OUJmSWIyOXZaQ21DQU1nQ1FaLytOd0wwN25VbEVDSU1BQU1yNDFzeHZ2Nm9FQUFBQUFTVVZPUks1Q1lJST1cIlxuXG52YXIgT1VUUFVUX1NUWUxFID0gW1xuICBcIm1hcmdpbi1sZWZ0OiAtMTBweFwiLFxuICBcInBhZGRpbmc6IDBcIixcbiAgXCJ3aGl0ZXNwYWNlOiBub3JtYWxcIixcbiAgXCJ0ZXh0LXNoYWRvdzogbm9uZVwiXG5dLmpvaW4oXCI7XCIpXG5cbnZhciBUT1BfU1RZTEUgPSBbXG4gIFwicG9zaXRpb246IHJlbGF0aXZlXCIsXG4gIFwiei1pbmRleDogMlwiLFxuICBcImhlaWdodDogMTJweFwiLFxuICBcImJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3hcIixcbiAgXCJiYWNrZ3JvdW5kOiB1cmwoJ1wiICsgVEVBUl9JTUFHRSArIFwiJykgdG9wIHJpZ2h0IHJlcGVhdC14XCJcbl0uam9pbihcIjtcIilcblxudmFyIEJPVFRPTV9TVFlMRSA9IFtcbiAgXCJwb3NpdGlvbjogcmVsYXRpdmVcIixcbiAgXCJ6LWluZGV4OiAyXCIsXG4gIFwiaGVpZ2h0OiAxMnB4XCIsXG4gIFwiYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveFwiLFxuICBcImJhY2tncm91bmQ6IHVybCgnXCIgKyBURUFSX0lNQUdFICsgXCInKSB0b3AgbGVmdCByZXBlYXQteFwiLFxuICBcIi13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKVwiLFxuICBcIi1vLXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZylcIixcbiAgXCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpXCJcbl0uam9pbihcIjtcIilcblxudmFyIEJPWF9TVFlMRSA9IFtcbiAgXCItbW96LWJveC1zaGFkb3c6IDAgMCAzMHB4IC0ycHggIzAwMFwiLFxuICBcIi13ZWJraXQtYm94LXNoYWRvdzogMCAwIDMwcHggLTJweCAjMDAwXCIsXG4gIFwiYm94LXNoYWRvdzogMCAwIDMwcHggLTJweCAjMDAwXCIsXG4gIFwiY29sb3I6IGJsYWNrXCIsXG4gIFwiYmFja2dyb3VuZDogd2hpdGVcIixcbiAgXCJwb3NpdGlvbjogcmVsYXRpdmVcIixcbiAgXCJtYXJnaW46IDBweFwiLFxuICBcIndpZHRoOiAxMDAlXCJcbl0uam9pbihcIjtcIilcblxudmFyIEhFQURfU1RZTEUgPSBbXG4gIFwiZGlzcGxheTogdGFibGUtY2VsbFwiLFxuICBcInBhZGRpbmc6IDEwcHhcIixcbiAgXCJwYWRkaW5nLWxlZnQ6IDIwcHhcIixcbiAgXCJ3aGl0ZS1zcGFjZTogcHJlXCIsXG4gIFwiY29sb3I6IHdoaXRlXCIsXG4gIFwidGV4dC1zaGFkb3c6IDBweCAxcHggNXB4ICMwMDBcIixcbiAgXCJ2ZXJ0aWNhbC1hbGlnbjogdG9wXCJcbl0uam9pbihcIjtcIilcblxudmFyIEJPRFlfU1RZTEUgPSBbXG4gIFwiZGlzcGxheTogdGFibGUtY2VsbFwiLFxuICBcInBhZGRpbmc6IDEwcHhcIixcbiAgXCJ3aWR0aDogMTAwJVwiXG5dLmpvaW4oXCI7XCIpXG5cbnZhciBURU1QTEFURSA9IFtcbiAgXCI8ZGl2IHN0eWxlPVxcXCJcIiArIE9VVFBVVF9TVFlMRSArIFwiXFxcIj5cIixcbiAgXCIgIDxkaXYgY2xhc3M9J2NtLWxpdmUtb3V0cHV0LWJvcmRlci10b3AnIHN0eWxlPVxcXCJcIiArIFRPUF9TVFlMRSArIFwiXFxcIj4gPC9kaXY+XCIsXG4gIFwiICA8ZGl2IGNsYXNzPSdjbS1saXZlLW91dHB1dC1ib3gnIHN0eWxlPVxcXCJcIiArIEJPWF9TVFlMRSArIFwiXFxcIj5cIixcbiAgXCIgICAgPGgxIGNsYXNzPSdjbS1saXZlLW91dHB1dC1oZWFkJyBzdHlsZT1cXFwiXCIgKyBIRUFEX1NUWUxFICsgXCJcXFwiPk91dFswXTwvaDE+XCIsXG4gIFwiICAgIDxwcmUgY2xhc3M9J2NtLWxpdmUtb3V0cHV0LWJvZHknIHN0eWxlPVxcXCJcIiArIEJPRFlfU1RZTEUgKyBcIlxcXCI+PC9wcmU+XCIsXG4gIFwiICA8L2Rpdj5cIixcbiAgXCIgIDxkaXYgY2xhc3M9J2NtLWxpdmUtb3V0cHV0LWJvcmRlci1ib3R0b20nIHN0eWxlPVxcXCJcIiArIEJPVFRPTV9TVFlMRSArIFwiXFxcIj48L2Rpdj5cIixcbiAgXCI8L2Rpdj5cIlxuIF0uam9pbihcIlxcblwiKVxuXG5mdW5jdGlvbiBtYWtlVmlldyhlZGl0b3IsIGlkKSB7XG4gIHZhciBkb2N1bWVudCA9IGVkaXRvci5kaXNwbGF5LmlucHV0Lm93bmVyRG9jdW1lbnRcbiAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpXG4gIGNvbnRhaW5lci5pbm5lckhUTUwgPSBURU1QTEFURVxuICB2YXIgdmlldyA9IGNvbnRhaW5lci5maXJzdENoaWxkXG4gIHZpZXcuaWQgPSBcImludGVyYWN0aXZhdGUtb3V0LVwiICsgaWRcbiAgdmlldy5sYWJlbCA9IHZpZXcucXVlcnlTZWxlY3RvcihcIi5jbS1saXZlLW91dHB1dC1oZWFkXCIpXG4gIHZpZXcubGFiZWwudGV4dENvbnRlbnQgPSBcIk91dFtcIiArIGlkICsgXCJdID0gXCJcbiAgdmlldy5ib2R5ID0gdmlldy5xdWVyeVNlbGVjdG9yKFwiLmNtLWxpdmUtb3V0cHV0LWJvZHlcIilcbiAgcmV0dXJuIHZpZXdcbn1cblxuZXhwb3J0cy5tYWtlVmlldyA9IG1ha2VWaWV3IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbihvYmplY3QsIG5hbWUsIHByb3BlcnR5KSB7XG4gIG9iamVjdFtuYW1lXSA9IHByb3BlcnR5LnZhbHVlXG4gIHJldHVybiBvYmplY3Rcbn1cblxuLy8gU2hvcnRjdXQgZm9yIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBmb3IgZmFzdGVyIGFjY2Vzcy5cbnZhciB0eXBlZnkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8vIE1hcCB0byBmb3IganVtcGluZyBmcm9tIHR5cGVvZih2YWx1ZSkgdG8gYXNzb2NpYXRlZCB0eXBlIHByZWZpeCB1c2VkXG4vLyBhcyBhIGhhc2ggaW4gdGhlIG1hcCBvZiBidWlsdGluIGltcGxlbWVudGF0aW9ucy5cbnZhciB0eXBlcyA9IHsgXCJmdW5jdGlvblwiOiBcIk9iamVjdFwiLCBcIm9iamVjdFwiOiBcIk9iamVjdFwiIH1cblxuLy8gQXJyYXkgaXMgdXNlZCB0byBzYXZlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBob3N0IG9iamVjdHMgaW4gb3JkZXJcbi8vIHRvIGF2b2lkIGV4dGVuZGluZyB0aGVtIHdpdGggbm9uLXByaW1pdGl2ZSB2YWx1ZXMgdGhhdCBjb3VsZCBjYXVzZSBsZWFrcy5cbnZhciBob3N0ID0gW11cbi8vIEhhc2ggbWFwIGlzIHVzZWQgdG8gc2F2ZSBtZXRob2QgaW1wbGVtZW50YXRpb25zIGZvciBidWlsdGluIHR5cGVzIGluIG9yZGVyXG4vLyB0byBhdm9pZCBleHRlbmRpbmcgdGhlaXIgcHJvdG90eXBlcy4gVGhpcyBhbHNvIGFsbG93cyB0byBzaGFyZSBtZXRob2Rcbi8vIGltcGxlbWVudGF0aW9ucyBmb3IgdHlwZXMgYWNyb3NzIGRpZmYgY29udGV4dHMgLyBmcmFtZXMgLyBjb21wYXJ0bWVudHMuXG52YXIgYnVpbHRpbiA9IHt9XG5cbmZ1bmN0aW9uIFByaW1pdGl2ZSgpIHt9XG5mdW5jdGlvbiBPYmplY3RUeXBlKCkge31cbk9iamVjdFR5cGUucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpXG5mdW5jdGlvbiBFcnJvclR5cGUoKSB7fVxuRXJyb3JUeXBlLnByb3RvdHlwZSA9IG5ldyBPYmplY3RUeXBlKClcblxudmFyIERlZmF1bHQgPSBidWlsdGluLkRlZmF1bHQgPSBQcmltaXRpdmUucHJvdG90eXBlXG52YXIgTnVsbCA9IGJ1aWx0aW4uTnVsbCA9IG5ldyBQcmltaXRpdmUoKVxudmFyIFZvaWQgPSBidWlsdGluLlZvaWQgPSBuZXcgUHJpbWl0aXZlKClcbmJ1aWx0aW4uU3RyaW5nID0gbmV3IFByaW1pdGl2ZSgpXG5idWlsdGluLk51bWJlciA9IG5ldyBQcmltaXRpdmUoKVxuYnVpbHRpbi5Cb29sZWFuID0gbmV3IFByaW1pdGl2ZSgpXG5cbmJ1aWx0aW4uT2JqZWN0ID0gT2JqZWN0VHlwZS5wcm90b3R5cGVcbmJ1aWx0aW4uRXJyb3IgPSBFcnJvclR5cGUucHJvdG90eXBlXG5cbmJ1aWx0aW4uRXZhbEVycm9yID0gbmV3IEVycm9yVHlwZSgpXG5idWlsdGluLkludGVybmFsRXJyb3IgPSBuZXcgRXJyb3JUeXBlKClcbmJ1aWx0aW4uUmFuZ2VFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuYnVpbHRpbi5SZWZlcmVuY2VFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuYnVpbHRpbi5TdG9wSXRlcmF0aW9uID0gbmV3IEVycm9yVHlwZSgpXG5idWlsdGluLlN5bnRheEVycm9yID0gbmV3IEVycm9yVHlwZSgpXG5idWlsdGluLlR5cGVFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuYnVpbHRpbi5VUklFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuXG5cbmZ1bmN0aW9uIE1ldGhvZChpZCkge1xuICAvKipcbiAgUHJpdmF0ZSBNZXRob2QgaXMgYSBjYWxsYWJsZSBwcml2YXRlIG5hbWUgdGhhdCBkaXNwYXRjaGVzIG9uIHRoZSBmaXJzdFxuICBhcmd1bWVudHMgc2FtZSBuYW1lZCBNZXRob2Q6XG5cbiAgICAgIG1ldGhvZChvYmplY3QsIC4uLnJlc3QpID0+IG9iamVjdFttZXRob2RdKC4uLnJlc3QpXG5cbiAgSXQgaXMgc3VwcG9zZWQgdG8gYmUgZ2l2ZW4gKip1bmlxdWUqKiBgaWRgIHByZWZlcmFibHkgaW4gYFwianVtcEBwYWNrYWdlXCJgXG4gIGxpa2UgZm9ybSBzbyBpdCB3b24ndCBjb2xsaWRlIHdpdGggYGlkJ3NgIG90aGVyIHVzZXJzIGNyZWF0ZS4gSWYgbm8gYXJndW1lbnRcbiAgaXMgcGFzc2VkIHVuaXF1ZSBpZCBpcyBnZW5lcmF0ZWQsIGJ1dCBpdCdzIHByb3ZlZCB0byBiZSBwcm9ibGVtYXRpYyB3aXRoXG4gIG5wbSB3aGVyZSBpdCdzIGVhc3kgdG8gZW5kIHVwIHdpdGggYSBjb3BpZXMgb2Ygc2FtZSBtb2R1bGUgd2hlcmUgZWFjaCBjb3B5XG4gIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBuYW1lLlxuXG4gICMjIEV4YW1wbGVcblxuICAgICAgdmFyIGZvbyA9IE1ldGhvZChcImZvb0Bhd2Vzb21lbmVzc1wiKVxuXG4gICAgICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgYW55IHR5cGVzXG4gICAgICBmb28uZGVmaW5lKGZ1bmN0aW9uKHZhbHVlLCBhcmcxLCBhcmcyKSB7XG4gICAgICAgIC8vIC4uLlxuICAgICAgfSlcblxuICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgdHlwZVxuICAgICAgZm9vLmRlZmluZShCYXJUeXBlLCBmdW5jdGlvbihiYXIsIGFyZzEsIGFyZzIpIHtcbiAgICAgICAgLy8gLi4uXG4gICAgICB9KVxuICAqKi9cblxuICAvLyBDcmVhdGUgYW4gaW50ZXJuYWwgdW5pcXVlIG5hbWUgaWYgb25lIGlzIG5vdCBwcm92aWRlZCwgYWxzbyBwcmVmaXggaXRcbiAgLy8gdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggcmVndWxhciBtZXRob2QgbmFtZXMuXG4gIHZhciBuYW1lID0gXCLOuzpcIiArIFN0cmluZyhpZCB8fCBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKS5zdWJzdHIoMikpXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2godmFsdWUpIHtcbiAgICAvLyBNZXRob2QgZGlzcGF0Y2hlcyBvbiB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudC5cbiAgICAvLyBJZiBmaXJzdCBhcmd1bWVudCBpcyBgbnVsbGAgb3IgYHZvaWRgIGFzc29jaWF0ZWQgaW1wbGVtZW50YXRpb24gaXNcbiAgICAvLyBsb29rZWQgdXAgaW4gdGhlIGBidWlsdGluYCBoYXNoIHdoZXJlIGltcGxlbWVudGF0aW9ucyBmb3IgYnVpbHQtaW5zXG4gICAgLy8gYXJlIHN0b3JlZC5cbiAgICB2YXIgdHlwZSA9IG51bGxcbiAgICB2YXIgbWV0aG9kID0gdmFsdWUgPT09IG51bGwgPyBOdWxsW25hbWVdIDpcbiAgICAgICAgICAgICAgICAgdmFsdWUgPT09IHZvaWQoMCkgPyBWb2lkW25hbWVdIDpcbiAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGF0dGVtcHQgdG8gdXNlIG1ldGhvZCB3aXRoIGEgZ2VuZXJhdGVkIHByaXZhdGVcbiAgICAgICAgICAgICAgICAgLy8gYG5hbWVgIHRoYXQgaXMgc3VwcG9zZWRseSBpbiB0aGUgcHJvdG90eXBlIGNoYWluIG9mIHRoZVxuICAgICAgICAgICAgICAgICAvLyBgdGFyZ2V0YC5cbiAgICAgICAgICAgICAgICAgdmFsdWVbbmFtZV0gfHxcbiAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGFzc3VtZSBpdCdzIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZSBpbnN0YW5jZXMsXG4gICAgICAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UgaW1wbGVtZW50YXRpb24gaXMgc3RvcmVkIGluIGEgYGJ1aWx0aW5gIGhhc2guXG4gICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZmluZCBhIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gYnVpbHQtaW5cbiAgICAgICAgICAgICAgICAgLy8gdmlhIGNvbnN0cnVjdG9yIG5hbWUgYW5kIG1ldGhvZCBuYW1lLlxuICAgICAgICAgICAgICAgICAoKHR5cGUgPSBidWlsdGluWyh2YWx1ZS5jb25zdHJ1Y3RvciB8fCBcIlwiKS5uYW1lXSkgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVbbmFtZV0pIHx8XG4gICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhc3N1bWUgaXQncyBhIGhvc3Qgb2JqZWN0LiBGb3IgaG9zdCBvYmplY3RzXG4gICAgICAgICAgICAgICAgIC8vIGFjdHVhbCBtZXRob2QgaW1wbGVtZW50YXRpb25zIGFyZSBzdG9yZWQgaW4gdGhlIGBob3N0YFxuICAgICAgICAgICAgICAgICAvLyBhcnJheSBhbmQgb25seSBpbmRleCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGlzIHN0b3JlZFxuICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgaG9zdCBvYmplY3QncyBwcm90b3R5cGUgY2hhaW4uIFRoaXMgYXZvaWRzIG1lbW9yeVxuICAgICAgICAgICAgICAgICAvLyBsZWFrcyB0aGF0IG90aGVyd2lzZSBjb3VsZCBoYXBwZW4gd2hlbiBzYXZpbmcgSlMgb2JqZWN0c1xuICAgICAgICAgICAgICAgICAvLyBvbiBob3N0IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgaG9zdFt2YWx1ZVtcIiFcIiArIG5hbWVdXSB8fFxuICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYXR0ZW1wdCB0byBsb29rdXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1aWx0aW5zIGJ5XG4gICAgICAgICAgICAgICAgIC8vIGEgdHlwZSBvZiB0aGUgdmFsdWUuIFRoaXMgYmFzaWNhbGx5IG1ha2VzIHN1cmUgdGhhdCBhbGxcbiAgICAgICAgICAgICAgICAgLy8gbm9uIHByaW1pdGl2ZSB2YWx1ZXMgd2lsbCBkZWxlZ2F0ZSB0byBhbiBgT2JqZWN0YC5cbiAgICAgICAgICAgICAgICAgKCh0eXBlID0gYnVpbHRpblt0eXBlc1t0eXBlb2YodmFsdWUpXV0pICYmIHR5cGVbbmFtZV0pXG5cblxuICAgIC8vIElmIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHR5cGUgaXMgc3RpbGwgbm90IGZvdW5kIHRoZW5cbiAgICAvLyBqdXN0IGZhbGxiYWNrIGZvciBkZWZhdWx0IGltcGxlbWVudGF0aW9uLlxuICAgIG1ldGhvZCA9IG1ldGhvZCB8fCBEZWZhdWx0W25hbWVdXG5cbiAgICAvLyBJZiBpbXBsZW1lbnRhdGlvbiBpcyBzdGlsbCBub3QgZm91bmQgKHdoaWNoIGFsc28gbWVhbnMgdGhlcmUgaXMgbm9cbiAgICAvLyBkZWZhdWx0KSBqdXN0IHRocm93IGFuIGVycm9yIHdpdGggYSBkZXNjcmlwdGl2ZSBtZXNzYWdlLlxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBUeXBlRXJyb3IoXCJUeXBlIGRvZXMgbm90IGltcGxlbWVudHMgbWV0aG9kOiBcIiArIG5hbWUpXG5cbiAgICAvLyBJZiBpbXBsZW1lbnRhdGlvbiB3YXMgZm91bmQgdGhlbiBqdXN0IGRlbGVnYXRlLlxuICAgIHJldHVybiBtZXRob2QuYXBwbHkobWV0aG9kLCBhcmd1bWVudHMpXG4gIH1cblxuICAvLyBNYWtlIGB0b1N0cmluZ2Agb2YgdGhlIGRpc3BhdGNoIHJldHVybiBhIHByaXZhdGUgbmFtZSwgdGhpcyBlbmFibGVzXG4gIC8vIG1ldGhvZCBkZWZpbml0aW9uIHdpdGhvdXQgc3VnYXI6XG4gIC8vXG4gIC8vICAgIHZhciBtZXRob2QgPSBNZXRob2QoKVxuICAvLyAgICBvYmplY3RbbWV0aG9kXSA9IGZ1bmN0aW9uKCkgeyAvKioqLyB9XG4gIGRpc3BhdGNoLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7IHJldHVybiBuYW1lIH1cblxuICAvLyBDb3B5IHV0aWxpdHkgbWV0aG9kcyBmb3IgY29udmVuaWVudCBBUEkuXG4gIGRpc3BhdGNoLmltcGxlbWVudCA9IGltcGxlbWVudE1ldGhvZFxuICBkaXNwYXRjaC5kZWZpbmUgPSBkZWZpbmVNZXRob2RcblxuICByZXR1cm4gZGlzcGF0Y2hcbn1cblxuLy8gQ3JlYXRlIG1ldGhvZCBzaG9ydGN1dHMgZm9ybSBmdW5jdGlvbnMuXG52YXIgZGVmaW5lTWV0aG9kID0gZnVuY3Rpb24gZGVmaW5lTWV0aG9kKFR5cGUsIGxhbWJkYSkge1xuICByZXR1cm4gZGVmaW5lKHRoaXMsIFR5cGUsIGxhbWJkYSlcbn1cbnZhciBpbXBsZW1lbnRNZXRob2QgPSBmdW5jdGlvbiBpbXBsZW1lbnRNZXRob2Qob2JqZWN0LCBsYW1iZGEpIHtcbiAgcmV0dXJuIGltcGxlbWVudCh0aGlzLCBvYmplY3QsIGxhbWJkYSlcbn1cblxuLy8gRGVmaW5lIGBpbXBsZW1lbnRgIGFuZCBgZGVmaW5lYCBwb2x5bW9ycGhpYyBtZXRob2RzIHRvIGFsbG93IGRlZmluaXRpb25zXG4vLyBhbmQgaW1wbGVtZW50YXRpb25zIHRocm91Z2ggdGhlbS5cbnZhciBpbXBsZW1lbnQgPSBNZXRob2QoXCJpbXBsZW1lbnRAbWV0aG9kXCIpXG52YXIgZGVmaW5lID0gTWV0aG9kKFwiZGVmaW5lQG1ldGhvZFwiKVxuXG5cbmZ1bmN0aW9uIF9pbXBsZW1lbnQobWV0aG9kLCBvYmplY3QsIGxhbWJkYSkge1xuICAvKipcbiAgSW1wbGVtZW50cyBgTWV0aG9kYCBmb3IgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggYSBwcm92aWRlZCBgaW1wbGVtZW50YXRpb25gLlxuICBDYWxsaW5nIGBNZXRob2RgIHdpdGggYG9iamVjdGAgYXMgYSBmaXJzdCBhcmd1bWVudCB3aWxsIGRpc3BhdGNoIG9uIHByb3ZpZGVkXG4gIGltcGxlbWVudGF0aW9uLlxuICAqKi9cbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KG9iamVjdCwgbWV0aG9kLnRvU3RyaW5nKCksIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbGFtYmRhXG4gIH0pXG59XG5cbmZ1bmN0aW9uIF9kZWZpbmUobWV0aG9kLCBUeXBlLCBsYW1iZGEpIHtcbiAgLyoqXG4gIERlZmluZXMgYE1ldGhvZGAgZm9yIHRoZSBnaXZlbiBgVHlwZWAgd2l0aCBhIHByb3ZpZGVkIGBpbXBsZW1lbnRhdGlvbmAuXG4gIENhbGxpbmcgYE1ldGhvZGAgd2l0aCBhIGZpcnN0IGFyZ3VtZW50IG9mIHRoaXMgYFR5cGVgIHdpbGwgZGlzcGF0Y2ggb25cbiAgcHJvdmlkZWQgYGltcGxlbWVudGF0aW9uYC4gSWYgYFR5cGVgIGlzIGEgYE1ldGhvZGAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICBpcyBkZWZpbmVkLiBJZiBgVHlwZWAgaXMgYSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYE1ldGhvZGAgaXMgaW1wbGVtZW50ZWRcbiAgZm9yIHRoYXQgdmFsdWUgdHlwZS5cbiAgKiovXG5cbiAgLy8gQXR0ZW1wdCB0byBndWVzcyBhIHR5cGUgdmlhIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGxgIGhhY2suXG4gIHZhciB0eXBlID0gVHlwZSAmJiB0eXBlZnkuY2FsbChUeXBlLnByb3RvdHlwZSlcblxuICAvLyBJZiBvbmx5IHR3byBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aGVuIGBUeXBlYCBpcyBhY3R1YWxseSBhbiBpbXBsZW1lbnRhdGlvblxuICAvLyBmb3IgYSBkZWZhdWx0IHR5cGUuXG4gIGlmICghbGFtYmRhKSBEZWZhdWx0W21ldGhvZF0gPSBUeXBlXG4gIC8vIElmIGBUeXBlYCBpcyBgbnVsbGAgb3IgYHZvaWRgIHN0b3JlIGltcGxlbWVudGF0aW9uIGFjY29yZGluZ2x5LlxuICBlbHNlIGlmIChUeXBlID09PSBudWxsKSBOdWxsW21ldGhvZF0gPSBsYW1iZGFcbiAgZWxzZSBpZiAoVHlwZSA9PT0gdm9pZCgwKSkgVm9pZFttZXRob2RdID0gbGFtYmRhXG4gIC8vIElmIGB0eXBlYCBoYWNrIGluZGljYXRlcyBidWlsdC1pbiB0eXBlIGFuZCB0eXBlIGhhcyBhIG5hbWUgdXMgaXQgdG9cbiAgLy8gc3RvcmUgYSBpbXBsZW1lbnRhdGlvbiBpbnRvIGFzc29jaWF0ZWQgaGFzaC4gSWYgaGFzaCBmb3IgdGhpcyB0eXBlIGRvZXNcbiAgLy8gbm90IGV4aXN0cyB5ZXQgY3JlYXRlIG9uZS5cbiAgZWxzZSBpZiAodHlwZSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIiAmJiBUeXBlLm5hbWUpIHtcbiAgICB2YXIgQnVsaXRpbiA9IGJ1aWx0aW5bVHlwZS5uYW1lXSB8fCAoYnVpbHRpbltUeXBlLm5hbWVdID0gbmV3IE9iamVjdFR5cGUoKSlcbiAgICBCdWxpdGluW21ldGhvZF0gPSBsYW1iZGFcbiAgfVxuICAvLyBJZiBgdHlwZWAgaGFjayBpbmRpY2F0ZXMgYW4gb2JqZWN0LCB0aGF0IG1heSBiZSBlaXRoZXIgb2JqZWN0IG9yIGFueVxuICAvLyBKUyBkZWZpbmVkIFwiQ2xhc3NcIi4gSWYgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IgaXMgYE9iamVjdGAsIGFzc3VtZSBpdCdzXG4gIC8vIGJ1aWx0LWluIGBPYmplY3RgIGFuZCBzdG9yZSBpbXBsZW1lbnRhdGlvbiBhY2NvcmRpbmdseS5cbiAgZWxzZSBpZiAoVHlwZS5uYW1lID09PSBcIk9iamVjdFwiKVxuICAgIGJ1aWx0aW4uT2JqZWN0W21ldGhvZF0gPSBsYW1iZGFcbiAgLy8gSG9zdCBvYmplY3RzIGFyZSBwYWluISEhIEV2ZXJ5IGJyb3dzZXIgZG9lcyBzb21lIGNyYXp5IHN0dWZmIGZvciB0aGVtXG4gIC8vIFNvIGZhciBhbGwgYnJvd3NlciBzZWVtIHRvIG5vdCBpbXBsZW1lbnQgYGNhbGxgIG1ldGhvZCBmb3IgaG9zdCBvYmplY3RcbiAgLy8gY29uc3RydWN0b3JzLiBJZiB0aGF0IGlzIGEgY2FzZSBoZXJlLCBhc3N1bWUgaXQncyBhIGhvc3Qgb2JqZWN0IGFuZFxuICAvLyBzdG9yZSBpbXBsZW1lbnRhdGlvbiBpbiBhIGBob3N0YCBhcnJheSBhbmQgc3RvcmUgYGluZGV4YCBpbiB0aGUgYXJyYXlcbiAgLy8gaW4gYSBgVHlwZS5wcm90b3R5cGVgIGl0c2VsZi4gVGhpcyBhdm9pZHMgbWVtb3J5IGxlYWtzIHRoYXQgY291bGQgYmVcbiAgLy8gY2F1c2VkIGJ5IHN0b3JpbmcgSlMgb2JqZWN0cyBvbiBhIGhvc3Qgb2JqZWN0cy5cbiAgZWxzZSBpZiAoVHlwZS5jYWxsID09PSB2b2lkKDApKSB7XG4gICAgdmFyIGluZGV4ID0gaG9zdC5pbmRleE9mKGxhbWJkYSlcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCA9IGhvc3QucHVzaChsYW1iZGEpIC0gMVxuICAgIC8vIFByZWZpeCBwcml2YXRlIG5hbWUgd2l0aCBgIWAgc28gaXQgY2FuIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgbWV0aG9kXG4gICAgLy8gd2l0aG91dCB0eXBlIGNoZWNrcy5cbiAgICBpbXBsZW1lbnQoXCIhXCIgKyBtZXRob2QsIFR5cGUucHJvdG90eXBlLCBpbmRleClcbiAgfVxuICAvLyBJZiBHb3QgdGhhdCBmYXIgYFR5cGVgIGlzIHVzZXIgZGVmaW5lZCBKUyBgQ2xhc3NgLiBEZWZpbmUgcHJpdmF0ZSBuYW1lXG4gIC8vIGFzIGhpZGRlbiBwcm9wZXJ0eSBvbiBpdCdzIHByb3RvdHlwZS5cbiAgZWxzZVxuICAgIGltcGxlbWVudChtZXRob2QsIFR5cGUucHJvdG90eXBlLCBsYW1iZGEpXG59XG5cbi8vIEFuZCBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbnMgZm9yIGEgcG9seW1vcnBoaWMgZXF1aXZhbGVudHMuXG5fZGVmaW5lKGRlZmluZSwgX2RlZmluZSlcbl9kZWZpbmUoaW1wbGVtZW50LCBfaW1wbGVtZW50KVxuXG4vLyBEZWZpbmUgZXhwb3J0cyBvbiBgTWV0aG9kYCBhcyBpdCdzIG9ubHkgdGhpbmcgYmVpbmcgZXhwb3J0ZWQuXG5NZXRob2QuaW1wbGVtZW50ID0gaW1wbGVtZW50XG5NZXRob2QuZGVmaW5lID0gZGVmaW5lXG5NZXRob2QuTWV0aG9kID0gTWV0aG9kXG5NZXRob2QubWV0aG9kID0gTWV0aG9kXG5NZXRob2QuYnVpbHRpbiA9IGJ1aWx0aW5cbk1ldGhvZC5ob3N0ID0gaG9zdFxuXG5tb2R1bGUuZXhwb3J0cyA9IE1ldGhvZFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZXRob2QgPSByZXF1aXJlKFwibWV0aG9kXCIpXG5cbi8vIE1ldGhvZCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggZGF0YSBzdHJ1Y3R1cmVzIHJlcHJlc2VudGluZyBhcHBsaWNhdGlvblxuLy8gc3RhdGUuIENhbGxpbmcgaXQgd2l0aCBhIHN0YXRlIHNob3VsZCByZXR1cm4gb2JqZWN0IHJlcHJlc2VudGluZyBgZGVsdGFgXG4vLyB0aGF0IGhhcyBiZWluZyBhcHBsaWVkIHRvIGEgcHJldmlvdXMgc3RhdGUgdG8gZ2V0IHRvIGEgY3VycmVudCBzdGF0ZS5cbi8vXG4vLyBFeGFtcGxlXG4vL1xuLy8gZGlmZihzdGF0ZSkgLy8gPT4geyBcIml0ZW0taWQtMVwiOiB7IHRpdGxlOiBcInNvbWUgdGl0bGVcIiB9IFwiaXRlbS1pZC0yXCI6IG51bGwgfVxudmFyIGRpZmYgPSBtZXRob2QoXCJkaWZmXCIpXG5cbi8vIGRpZmYgYmV0d2VlbiBgbnVsbGAgLyBgdW5kZWZpbmVkYCB0byBhbnkgaGFzaCBpcyBhIGhhc2ggaXRzZWxmLlxuZGlmZi5kZWZpbmUobnVsbCwgZnVuY3Rpb24oZnJvbSwgdG8pIHsgcmV0dXJuIHRvIH0pXG5kaWZmLmRlZmluZSh1bmRlZmluZWQsIGZ1bmN0aW9uKGZyb20sIHRvKSB7IHJldHVybiB0byB9KVxuZGlmZi5kZWZpbmUoT2JqZWN0LCBmdW5jdGlvbihmcm9tLCB0bykge1xuICByZXR1cm4gY2FsY3VsYXRlKGZyb20sIHRvIHx8IHt9KSB8fCB7fVxufSlcblxuZnVuY3Rpb24gY2FsY3VsYXRlKGZyb20sIHRvKSB7XG4gIHZhciBkaWZmID0ge31cbiAgdmFyIGNoYW5nZXMgPSAwXG4gIE9iamVjdC5rZXlzKGZyb20pLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgY2hhbmdlcyA9IGNoYW5nZXMgKyAxXG4gICAgaWYgKCEoa2V5IGluIHRvKSAmJiBmcm9tW2tleV0gIT0gbnVsbCkgZGlmZltrZXldID0gbnVsbFxuICAgIGVsc2UgY2hhbmdlcyA9IGNoYW5nZXMgLSAxXG4gIH0pXG4gIE9iamVjdC5rZXlzKHRvKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGNoYW5nZXMgPSBjaGFuZ2VzICsgMVxuICAgIHZhciBwcmV2aW91cyA9IGZyb21ba2V5XVxuICAgIHZhciBjdXJyZW50ID0gdG9ba2V5XVxuICAgIGlmIChwcmV2aW91cyA9PT0gY3VycmVudCkgcmV0dXJuIChjaGFuZ2VzID0gY2hhbmdlcyAtIDEpXG4gICAgaWYgKHR5cGVvZihjdXJyZW50KSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGRpZmZba2V5XSA9IGN1cnJlbnRcbiAgICBpZiAodHlwZW9mKHByZXZpb3VzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGRpZmZba2V5XSA9IGN1cnJlbnRcbiAgICB2YXIgZGVsdGEgPSBjYWxjdWxhdGUocHJldmlvdXMsIGN1cnJlbnQpXG4gICAgaWYgKGRlbHRhKSBkaWZmW2tleV0gPSBkZWx0YVxuICAgIGVsc2UgY2hhbmdlcyA9IGNoYW5nZXMgLSAxXG4gIH0pXG4gIHJldHVybiBjaGFuZ2VzID8gZGlmZiA6IG51bGxcbn1cblxuZGlmZi5jYWxjdWxhdGUgPSBjYWxjdWxhdGVcblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1ldGhvZCA9IHJlcXVpcmUoXCJtZXRob2RcIilcbnZhciByZWJhc2UgPSByZXF1aXJlKFwiLi9yZWJhc2VcIilcblxuLy8gTWV0aG9kIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBkYXRhIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIGFwcGxpY2F0aW9uXG4vLyBzdGF0ZS4gQ2FsbGluZyBpdCB3aXRoIGEgc3RhdGUgYW5kIGRlbHRhIHNob3VsZCByZXR1cm4gb2JqZWN0IHJlcHJlc2VudGluZ1xuLy8gbmV3IHN0YXRlLCB3aXRoIGNoYW5nZXMgaW4gYGRlbHRhYCBiZWluZyBhcHBsaWVkIHRvIHByZXZpb3VzLlxuLy9cbi8vICMjIEV4YW1wbGVcbi8vXG4vLyBwYXRjaChzdGF0ZSwge1xuLy8gICBcIml0ZW0taWQtMVwiOiB7IGNvbXBsZXRlZDogZmFsc2UgfSwgLy8gdXBkYXRlXG4vLyAgIFwiaXRlbS1pZC0yXCI6IG51bGwgICAgICAgICAgICAgICAgICAvLyBkZWxldGVcbi8vIH0pXG52YXIgcGF0Y2ggPSBtZXRob2QoXCJwYXRjaFwiKVxucGF0Y2guZGVmaW5lKE9iamVjdCwgZnVuY3Rpb24gcGF0Y2goaGFzaCwgZGVsdGEpIHtcbiAgcmV0dXJuIHJlYmFzZSh7fSwgaGFzaCwgZGVsdGEpXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG4iXX0= +},{}]},{},[2]) +//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9ydW50aW1lLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL3dpc3Avc2VxdWVuY2UuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9zdHJpbmcuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9yZWFkZXIuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9hc3QuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvd2lzcC9jb21waWxlci5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy93aXNwL2FuYWx5emVyLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbWFpbi5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXJlc29sdmUvYnVpbHRpbi91dGlsLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3ItaGFzaGFyZS9jb3JlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvaG9zdC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9jb2RlbWlycm9yLXBlcnNpc3QvY29yZS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy93aXNwL2JhY2tlbmQvamF2YXNjcmlwdC93cml0ZXIuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaW5zZXJ0LW1vZHVsZS1nbG9iYWxzL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2J1aWx0aW4vZXZlbnRzLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2ludGVyYWN0aXZhdGUvaW50ZXJhY3RpdmF0ZS5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9pbnRlcmFjdGl2YXRlL291dHB1dC5qcyIsIi9Vc2Vycy9nb3phbGEvUHJvamVjdHMvd2lzcC9pbnRlcmFjdGl2YXRlL25vZGVfbW9kdWxlcy9pbnRlcmFjdGl2YXRlL3ZpZXcuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvaW50ZXJhY3RpdmF0ZS9yZW5kZXIuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvZGlmZnBhdGNoZXIvcmViYXNlLmpzIiwiL1VzZXJzL2dvemFsYS9Qcm9qZWN0cy93aXNwL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2ludGVyYWN0aXZhdGUvbm9kZV9tb2R1bGVzL2RpZmZwYXRjaGVyL2RpZmYuanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvZGlmZnBhdGNoZXIvcGF0Y2guanMiLCIvVXNlcnMvZ296YWxhL1Byb2plY3RzL3dpc3AvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvaW50ZXJhY3RpdmF0ZS9ub2RlX21vZHVsZXMvbWV0aG9kL2NvcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdG1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNueEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN6TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9WQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXt2YXIgX25zXyA9IHtcbiAgXCJpZFwiOiBcIndpc3AucnVudGltZVwiLFxuICBcImRvY1wiOiBcIkNvcmUgcHJpbWl0aXZlcyByZXF1aXJlZCBmb3IgcnVudGltZVwiXG59OztcblxudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG5leHBvcnRzLmlkZW50aXR5ID0gaWRlbnRpdHk7XG5cbnZhciBpc09kZCA9IGZ1bmN0aW9uIGlzT2RkKG4pIHtcbiAgcmV0dXJuIG4gJSAyID09PSAxO1xufTtcbmV4cG9ydHMuaXNPZGQgPSBpc09kZDtcblxudmFyIGlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gIHJldHVybiBuICUgMiA9PT0gMDtcbn07XG5leHBvcnRzLmlzRXZlbiA9IGlzRXZlbjtcblxudmFyIGlzRGljdGlvbmFyeSA9IGZ1bmN0aW9uIGlzRGljdGlvbmFyeShmb3JtKSB7XG4gIHJldHVybiAoaXNPYmplY3QoZm9ybSkpICYmIChpc09iamVjdChPYmplY3QuZ2V0UHJvdG90eXBlT2YoZm9ybSkpKSAmJiAoaXNOaWwoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihmb3JtKSkpKTtcbn07XG5leHBvcnRzLmlzRGljdGlvbmFyeSA9IGlzRGljdGlvbmFyeTtcblxudmFyIGRpY3Rpb25hcnkgPSBmdW5jdGlvbiBkaWN0aW9uYXJ5KCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3Aoa2V5VmFsdWVzLCByZXN1bHQpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBrZXlWYWx1ZXMubGVuZ3RoID9cbiAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgKHJlc3VsdCB8fCAwKVsoa2V5VmFsdWVzIHx8IDApWzBdXSA9IChrZXlWYWx1ZXMgfHwgMClbMV07XG4gICAgICAgIHJldHVybiAoa2V5VmFsdWVzID0ga2V5VmFsdWVzLnNsaWNlKDIpLCByZXN1bHQgPSByZXN1bHQsIGxvb3ApO1xuICAgICAgfSkoKSA6XG4gICAgICByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksIHt9KTtcbn07XG5leHBvcnRzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5O1xuXG52YXIga2V5cyA9IGZ1bmN0aW9uIGtleXMoZGljdGlvbmFyeSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZGljdGlvbmFyeSk7XG59O1xuZXhwb3J0cy5rZXlzID0ga2V5cztcblxudmFyIHZhbHMgPSBmdW5jdGlvbiB2YWxzKGRpY3Rpb25hcnkpIHtcbiAgcmV0dXJuIGtleXMoZGljdGlvbmFyeSkubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiAoZGljdGlvbmFyeSB8fCAwKVtrZXldO1xuICB9KTtcbn07XG5leHBvcnRzLnZhbHMgPSB2YWxzO1xuXG52YXIga2V5VmFsdWVzID0gZnVuY3Rpb24ga2V5VmFsdWVzKGRpY3Rpb25hcnkpIHtcbiAgcmV0dXJuIGtleXMoZGljdGlvbmFyeSkubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBba2V5LCAoZGljdGlvbmFyeSB8fCAwKVtrZXldXTtcbiAgfSk7XG59O1xuZXhwb3J0cy5rZXlWYWx1ZXMgPSBrZXlWYWx1ZXM7XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKCkge1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QucHJvdG90eXBlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLnJlZHVjZShmdW5jdGlvbihkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KSB7XG4gICAgaXNPYmplY3QoZGljdGlvbmFyeSkgP1xuICAgICAgT2JqZWN0LmtleXMoZGljdGlvbmFyeSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIChkZXNjcmlwdG9yIHx8IDApW2tleV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRpY3Rpb25hcnksIGtleSk7XG4gICAgICB9KSA6XG4gICAgICB2b2lkKDApO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9LCBPYmplY3QuY3JlYXRlKE9iamVjdC5wcm90b3R5cGUpKSk7XG59O1xuZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xuXG52YXIgaXNDb250YWluc1ZlY3RvciA9IGZ1bmN0aW9uIGlzQ29udGFpbnNWZWN0b3IodmVjdG9yLCBlbGVtZW50KSB7XG4gIHJldHVybiB2ZWN0b3IuaW5kZXhPZihlbGVtZW50KSA+PSAwO1xufTtcbmV4cG9ydHMuaXNDb250YWluc1ZlY3RvciA9IGlzQ29udGFpbnNWZWN0b3I7XG5cbnZhciBtYXBEaWN0aW9uYXJ5ID0gZnVuY3Rpb24gbWFwRGljdGlvbmFyeShzb3VyY2UsIGYpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgKHRhcmdldCB8fCAwKVtrZXldID0gZigoc291cmNlIHx8IDApW2tleV0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH0sIHt9KTtcbn07XG5leHBvcnRzLm1hcERpY3Rpb25hcnkgPSBtYXBEaWN0aW9uYXJ5O1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuZXhwb3J0cy50b1N0cmluZyA9IHRvU3RyaW5nO1xuXG52YXIgaXNGbiA9IHR5cGVvZigvLi8pID09PSBcImZ1bmN0aW9uXCIgP1xuICBmdW5jdGlvbiBpc0ZuKHgpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiO1xuICB9IDpcbiAgZnVuY3Rpb24gaXNGbih4KSB7XG4gICAgcmV0dXJuIHR5cGVvZih4KSA9PT0gXCJmdW5jdGlvblwiO1xuICB9O1xuZXhwb3J0cy5pc0ZuID0gaXNGbjtcblxudmFyIGlzU3RyaW5nID0gZnVuY3Rpb24gaXNTdHJpbmcoeCkge1xuICByZXR1cm4gKHR5cGVvZih4KSA9PT0gXCJzdHJpbmdcIikgfHwgKHRvU3RyaW5nLmNhbGwoeCkgPT09IFwiW29iamVjdCBTdHJpbmddXCIpO1xufTtcbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxudmFyIGlzTnVtYmVyID0gZnVuY3Rpb24gaXNOdW1iZXIoeCkge1xuICByZXR1cm4gKHR5cGVvZih4KSA9PT0gXCJudW1iZXJcIikgfHwgKHRvU3RyaW5nLmNhbGwoeCkgPT09IFwiW29iamVjdCBOdW1iZXJdXCIpO1xufTtcbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxudmFyIGlzVmVjdG9yID0gaXNGbihBcnJheS5pc0FycmF5KSA/XG4gIEFycmF5LmlzQXJyYXkgOlxuICBmdW5jdGlvbiBpc1ZlY3Rvcih4KSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgfTtcbmV4cG9ydHMuaXNWZWN0b3IgPSBpc1ZlY3RvcjtcblxudmFyIGlzRGF0ZSA9IGZ1bmN0aW9uIGlzRGF0ZSh4KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHgpID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn07XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxudmFyIGlzQm9vbGVhbiA9IGZ1bmN0aW9uIGlzQm9vbGVhbih4KSB7XG4gIHJldHVybiAoeCA9PT0gdHJ1ZSkgfHwgKHggPT09IGZhbHNlKSB8fCAodG9TdHJpbmcuY2FsbCh4KSA9PT0gXCJbb2JqZWN0IEJvb2xlYW5dXCIpO1xufTtcbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG52YXIgaXNSZVBhdHRlcm4gPSBmdW5jdGlvbiBpc1JlUGF0dGVybih4KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHgpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufTtcbmV4cG9ydHMuaXNSZVBhdHRlcm4gPSBpc1JlUGF0dGVybjtcblxudmFyIGlzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICByZXR1cm4geCAmJiAodHlwZW9mKHgpID09PSBcIm9iamVjdFwiKTtcbn07XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbnZhciBpc05pbCA9IGZ1bmN0aW9uIGlzTmlsKHgpIHtcbiAgcmV0dXJuICh4ID09PSB2b2lkKDApKSB8fCAoeCA9PT0gbnVsbCk7XG59O1xuZXhwb3J0cy5pc05pbCA9IGlzTmlsO1xuXG52YXIgaXNUcnVlID0gZnVuY3Rpb24gaXNUcnVlKHgpIHtcbiAgcmV0dXJuIHggPT09IHRydWU7XG59O1xuZXhwb3J0cy5pc1RydWUgPSBpc1RydWU7XG5cbnZhciBpc0ZhbHNlID0gZnVuY3Rpb24gaXNGYWxzZSh4KSB7XG4gIHJldHVybiB4ID09PSB0cnVlO1xufTtcbmV4cG9ydHMuaXNGYWxzZSA9IGlzRmFsc2U7XG5cbnZhciByZUZpbmQgPSBmdW5jdGlvbiByZUZpbmQocmUsIHMpIHtcbiAgdmFyIG1hdGNoZXMgPSByZS5leGVjKHMpO1xuICByZXR1cm4gIShpc05pbChtYXRjaGVzKSkgP1xuICAgIG1hdGNoZXMubGVuZ3RoID09PSAxID9cbiAgICAgIChtYXRjaGVzIHx8IDApWzBdIDpcbiAgICAgIG1hdGNoZXMgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5yZUZpbmQgPSByZUZpbmQ7XG5cbnZhciByZU1hdGNoZXMgPSBmdW5jdGlvbiByZU1hdGNoZXMocGF0dGVybiwgc291cmNlKSB7XG4gIHZhciBtYXRjaGVzID0gcGF0dGVybi5leGVjKHNvdXJjZSk7XG4gIHJldHVybiAoIShpc05pbChtYXRjaGVzKSkpICYmICgobWF0Y2hlcyB8fCAwKVswXSA9PT0gc291cmNlKSA/XG4gICAgbWF0Y2hlcy5sZW5ndGggPT09IDEgP1xuICAgICAgKG1hdGNoZXMgfHwgMClbMF0gOlxuICAgICAgbWF0Y2hlcyA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnJlTWF0Y2hlcyA9IHJlTWF0Y2hlcztcblxudmFyIHJlUGF0dGVybiA9IGZ1bmN0aW9uIHJlUGF0dGVybihzKSB7XG4gIHZhciBtYXRjaCA9IHJlRmluZCgvXig/OlxcKFxcPyhbaWRtc3V4XSopXFwpKT8oLiopLywgcyk7XG4gIHJldHVybiBuZXcgUmVnRXhwKChtYXRjaCB8fCAwKVsyXSwgKG1hdGNoIHx8IDApWzFdKTtcbn07XG5leHBvcnRzLnJlUGF0dGVybiA9IHJlUGF0dGVybjtcblxudmFyIGluYyA9IGZ1bmN0aW9uIGluYyh4KSB7XG4gIHJldHVybiB4ICsgMTtcbn07XG5leHBvcnRzLmluYyA9IGluYztcblxudmFyIGRlYyA9IGZ1bmN0aW9uIGRlYyh4KSB7XG4gIHJldHVybiB4IC0gMTtcbn07XG5leHBvcnRzLmRlYyA9IGRlYztcblxudmFyIHN0ciA9IGZ1bmN0aW9uIHN0cigpIHtcbiAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFwiXCIsIGFyZ3VtZW50cyk7XG59O1xuZXhwb3J0cy5zdHIgPSBzdHI7XG5cbnZhciBjaGFyID0gZnVuY3Rpb24gY2hhcihjb2RlKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xufTtcbmV4cG9ydHMuY2hhciA9IGNoYXI7XG5cbnZhciBpbnQgPSBmdW5jdGlvbiBpbnQoeCkge1xuICByZXR1cm4gaXNOdW1iZXIoeCkgP1xuICAgIHggPj0gMCA/XG4gICAgICBNYXRoLmZsb29yKHgpIDpcbiAgICAgIE1hdGguZmxvb3IoeCkgOlxuICAgIHguY2hhckNvZGVBdCgwKTtcbn07XG5leHBvcnRzLmludCA9IGludDtcblxudmFyIHN1YnMgPSBmdW5jdGlvbiBzdWJzKHN0cmluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbn07XG5leHBvcnRzLnN1YnMgPSBzdWJzO1xuXG52YXIgaXNQYXR0ZXJuRXF1YWwgPSBmdW5jdGlvbiBpc1BhdHRlcm5FcXVhbCh4LCB5KSB7XG4gIHJldHVybiAoaXNSZVBhdHRlcm4oeCkpICYmIChpc1JlUGF0dGVybih5KSkgJiYgKHguc291cmNlID09PSB5LnNvdXJjZSkgJiYgKHguZ2xvYmFsID09PSB5Lmdsb2JhbCkgJiYgKHgubXVsdGlsaW5lID09PSB5Lm11bHRpbGluZSkgJiYgKHguaWdub3JlQ2FzZSA9PT0geS5pZ25vcmVDYXNlKTtcbn07XG5cbnZhciBpc0RhdGVFcXVhbCA9IGZ1bmN0aW9uIGlzRGF0ZUVxdWFsKHgsIHkpIHtcbiAgcmV0dXJuIChpc0RhdGUoeCkpICYmIChpc0RhdGUoeSkpICYmIChOdW1iZXIoeCkgPT09IE51bWJlcih5KSk7XG59O1xuXG52YXIgaXNEaWN0aW9uYXJ5RXF1YWwgPSBmdW5jdGlvbiBpc0RpY3Rpb25hcnlFcXVhbCh4LCB5KSB7XG4gIHJldHVybiAoaXNPYmplY3QoeCkpICYmIChpc09iamVjdCh5KSkgJiYgKChmdW5jdGlvbigpIHtcbiAgICB2YXIgeEtleXMgPSBrZXlzKHgpO1xuICAgIHZhciB5S2V5cyA9IGtleXMoeSk7XG4gICAgdmFyIHhDb3VudCA9IHhLZXlzLmxlbmd0aDtcbiAgICB2YXIgeUNvdW50ID0geUtleXMubGVuZ3RoO1xuICAgIHJldHVybiAoeENvdW50ID09PSB5Q291bnQpICYmICgoZnVuY3Rpb24gbG9vcChpbmRleCwgY291bnQsIGtleXMpIHtcbiAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgcmVjdXIgPSBpbmRleCA8IGNvdW50ID9cbiAgICAgICAgaXNFcXVpdmFsZW50KCh4IHx8IDApWyhrZXlzIHx8IDApW2luZGV4XV0sICh5IHx8IDApWyhrZXlzIHx8IDApW2luZGV4XV0pID9cbiAgICAgICAgICAoaW5kZXggPSBpbmMoaW5kZXgpLCBjb3VudCA9IGNvdW50LCBrZXlzID0ga2V5cywgbG9vcCkgOlxuICAgICAgICAgIGZhbHNlIDpcbiAgICAgICAgdHJ1ZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVjdXI7XG4gICAgfSkoMCwgeENvdW50LCB4S2V5cykpO1xuICB9KSgpKTtcbn07XG5cbnZhciBpc1ZlY3RvckVxdWFsID0gZnVuY3Rpb24gaXNWZWN0b3JFcXVhbCh4LCB5KSB7XG4gIHJldHVybiAoaXNWZWN0b3IoeCkpICYmIChpc1ZlY3Rvcih5KSkgJiYgKHgubGVuZ3RoID09PSB5Lmxlbmd0aCkgJiYgKChmdW5jdGlvbiBsb29wKHhzLCB5cywgaW5kZXgsIGNvdW50KSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaW5kZXggPCBjb3VudCA/XG4gICAgICBpc0VxdWl2YWxlbnQoKHhzIHx8IDApW2luZGV4XSwgKHlzIHx8IDApW2luZGV4XSkgP1xuICAgICAgICAoeHMgPSB4cywgeXMgPSB5cywgaW5kZXggPSBpbmMoaW5kZXgpLCBjb3VudCA9IGNvdW50LCBsb29wKSA6XG4gICAgICAgIGZhbHNlIDpcbiAgICAgIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKHgsIHksIDAsIHgubGVuZ3RoKSk7XG59O1xuXG52YXIgaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gaXNFcXVpdmFsZW50KHgsIHkpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICh4ID09PSB5KSB8fCAoaXNOaWwoeCkgP1xuICAgICAgICBpc05pbCh5KSA6XG4gICAgICBpc05pbCh5KSA/XG4gICAgICAgIGlzTmlsKHgpIDpcbiAgICAgIGlzU3RyaW5nKHgpID9cbiAgICAgICAgZmFsc2UgOlxuICAgICAgaXNOdW1iZXIoeCkgP1xuICAgICAgICBmYWxzZSA6XG4gICAgICBpc0ZuKHgpID9cbiAgICAgICAgZmFsc2UgOlxuICAgICAgaXNCb29sZWFuKHgpID9cbiAgICAgICAgZmFsc2UgOlxuICAgICAgaXNEYXRlKHgpID9cbiAgICAgICAgaXNEYXRlRXF1YWwoeCwgeSkgOlxuICAgICAgaXNWZWN0b3IoeCkgP1xuICAgICAgICBpc1ZlY3RvckVxdWFsKHgsIHksIFtdLCBbXSkgOlxuICAgICAgaXNSZVBhdHRlcm4oeCkgP1xuICAgICAgICBpc1BhdHRlcm5FcXVhbCh4LCB5KSA6XG4gICAgICBcImVsc2VcIiA/XG4gICAgICAgIGlzRGljdGlvbmFyeUVxdWFsKHgsIHkpIDpcbiAgICAgICAgdm9pZCgwKSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIG1vcmUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgICAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHByZXZpb3VzLCBjdXJyZW50LCBpbmRleCwgY291bnQpIHtcbiAgICAgICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICAgICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICAgICAgcmVjdXIgPSAoaXNFcXVpdmFsZW50KHByZXZpb3VzLCBjdXJyZW50KSkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcblxudmFyIGlzRXF1YWwgPSBpc0VxdWl2YWxlbnQ7XG5leHBvcnRzLmlzRXF1YWwgPSBpc0VxdWFsO1xuXG52YXIgaXNTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGlzU3RyaWN0RXF1YWwoeCwgeSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCA9PT0geTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocHJldmlvdXMsIGN1cnJlbnQsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IChwcmV2aW91cyA9PT0gY3VycmVudCkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMuaXNTdHJpY3RFcXVhbCA9IGlzU3RyaWN0RXF1YWw7XG5cbnZhciBncmVhdGVyVGhhbiA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKHgsIHkpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggPiB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzID4gY3VycmVudCkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMuZ3JlYXRlclRoYW4gPSBncmVhdGVyVGhhbjtcblxudmFyIG5vdExlc3NUaGFuID0gZnVuY3Rpb24gbm90TGVzc1RoYW4oeCwgeSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCA+PSB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzID49IGN1cnJlbnQpICYmIChpbmRleCA8IGNvdW50ID9cbiAgICAgICAgICAocHJldmlvdXMgPSBjdXJyZW50LCBjdXJyZW50ID0gKG1vcmUgfHwgMClbaW5kZXhdLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoeCwgeSwgMCwgbW9yZS5sZW5ndGgpO1xuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLm5vdExlc3NUaGFuID0gbm90TGVzc1RoYW47XG5cbnZhciBsZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKHgsIHkpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggPCB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzIDwgY3VycmVudCkgJiYgKGluZGV4IDwgY291bnQgP1xuICAgICAgICAgIChwcmV2aW91cyA9IGN1cnJlbnQsIGN1cnJlbnQgPSAobW9yZSB8fCAwKVtpbmRleF0sIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KSh4LCB5LCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMubGVzc1RoYW4gPSBsZXNzVGhhbjtcblxudmFyIG5vdEdyZWF0ZXJUaGFuID0gZnVuY3Rpb24gbm90R3JlYXRlclRoYW4oeCwgeSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCA8PSB5O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcChwcmV2aW91cywgY3VycmVudCwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gKHByZXZpb3VzIDw9IGN1cnJlbnQpICYmIChpbmRleCA8IGNvdW50ID9cbiAgICAgICAgICAocHJldmlvdXMgPSBjdXJyZW50LCBjdXJyZW50ID0gKG1vcmUgfHwgMClbaW5kZXhdLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB0cnVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoeCwgeSwgMCwgbW9yZS5sZW5ndGgpO1xuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLm5vdEdyZWF0ZXJUaGFuID0gbm90R3JlYXRlclRoYW47XG5cbnZhciBzdW0gPSBmdW5jdGlvbiBzdW0oYSwgYiwgYywgZCwgZSwgZikge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gMDtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSArIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSArIGIgKyBjICsgZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlICsgZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlICsgKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhICsgYiArIGMgKyBkICsgZSArIGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5zdW0gPSBzdW07XG5cbnZhciBzdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIChmdW5jdGlvbigpIHsgdGhyb3cgVHlwZUVycm9yKFwiV3JvbmcgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvOiAtXCIpOyB9KSgpO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAwIC0gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgLSBiIC0gYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSAtIGIgLSBjIC0gZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSAtIGIgLSBjIC0gZCAtIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgLSBiIC0gYyAtIGQgLSBlIC0gZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlIC0gKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhIC0gYiAtIGMgLSBkIC0gZSAtIGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuXG52YXIgZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIChmdW5jdGlvbigpIHsgdGhyb3cgVHlwZUVycm9yKFwiV3JvbmcgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvOiAvXCIpOyB9KSgpO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAxIC8gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSAvIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgLyBiIC8gYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSAvIGIgLyBjIC8gZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSAvIGIgLyBjIC8gZCAvIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgLyBiIC8gYyAvIGQgLyBlIC8gZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlIC8gKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhIC8gYiAvIGMgLyBkIC8gZSAvIGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5kaXZpZGUgPSBkaXZpZGU7XG5cbnZhciBtdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIDE7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGE7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGEgKiBiO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBhICogYiAqIGM7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIGEgKiBiICogYyAqIGQ7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGEgKiBiICogYyAqIGQgKiBlO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBhICogYiAqIGMgKiBkICogZSAqIGY7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIG1vcmUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDYpO1xuICAgICAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHZhbHVlLCBpbmRleCwgY291bnQpIHtcbiAgICAgICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICAgICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICAgICAgcmVjdXIgPSBpbmRleCA8IGNvdW50ID9cbiAgICAgICAgICAodmFsdWUgPSB2YWx1ZSAqICgobW9yZSB8fCAwKVtpbmRleF0pLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoYSAqIGIgKiBjICogZCAqIGUgKiBmLCAwLCBtb3JlLmxlbmd0aCk7XG4gIH07XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMubXVsdGlwbHkgPSBtdWx0aXBseTtcblxudmFyIGFuZCA9IGZ1bmN0aW9uIGFuZChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBhO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBhICYmIGI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGEgJiYgYiAmJiBjO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBhICYmIGIgJiYgYyAmJiBkO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBhICYmIGIgJiYgYyAmJiBkICYmIGU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGEgJiYgYiAmJiBjICYmIGQgJiYgZSAmJiBmO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCA2KTtcbiAgICAgIHJldHVybiAoZnVuY3Rpb24gbG9vcCh2YWx1ZSwgaW5kZXgsIGNvdW50KSB7XG4gICAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICAgIHJlY3VyID0gaW5kZXggPCBjb3VudCA/XG4gICAgICAgICAgKHZhbHVlID0gdmFsdWUgJiYgKChtb3JlIHx8IDApW2luZGV4XSksIGluZGV4ID0gaW5jKGluZGV4KSwgY291bnQgPSBjb3VudCwgbG9vcCkgOlxuICAgICAgICAgIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmVjdXI7XG4gICAgICB9KShhICYmIGIgJiYgYyAmJiBkICYmIGUgJiYgZiwgMCwgbW9yZS5sZW5ndGgpO1xuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLmFuZCA9IGFuZDtcblxudmFyIG9yID0gZnVuY3Rpb24gb3IoYSwgYiwgYywgZCwgZSwgZikge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gdm9pZCgwKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gYTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gYSB8fCBiO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBhIHx8IGIgfHwgYztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gYSB8fCBiIHx8IGMgfHwgZDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gYSB8fCBiIHx8IGMgfHwgZCB8fCBlO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBhIHx8IGIgfHwgYyB8fCBkIHx8IGUgfHwgZjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgbW9yZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgNik7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodmFsdWUsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgICByZWN1ciA9IGluZGV4IDwgY291bnQgP1xuICAgICAgICAgICh2YWx1ZSA9IHZhbHVlIHx8ICgobW9yZSB8fCAwKVtpbmRleF0pLCBpbmRleCA9IGluYyhpbmRleCksIGNvdW50ID0gY291bnQsIGxvb3ApIDpcbiAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlY3VyO1xuICAgICAgfSkoYSB8fCBiIHx8IGMgfHwgZCB8fCBlIHx8IGYsIDAsIG1vcmUubGVuZ3RoKTtcbiAgfTtcbiAgcmV0dXJuIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5vciA9IG9yO1xuXG52YXIgcHJpbnQgPSBmdW5jdGlvbiBwcmludCgpIHtcbiAgdmFyIG1vcmUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gY29uc29sZS5sb2cuYXBwbHkoY29uc29sZS5sb2csIG1vcmUpO1xufTtcbmV4cG9ydHMucHJpbnQgPSBwcmludFxufSkoKSIsInZhciBfbnNfID0ge1xuICBcImlkXCI6IFwid2lzcC5zZXF1ZW5jZVwiXG59O1xudmFyIHdpc3BfcnVudGltZSA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG52YXIgaXNOaWwgPSB3aXNwX3J1bnRpbWUuaXNOaWw7XG52YXIgaXNWZWN0b3IgPSB3aXNwX3J1bnRpbWUuaXNWZWN0b3I7XG52YXIgaXNGbiA9IHdpc3BfcnVudGltZS5pc0ZuO1xudmFyIGlzTnVtYmVyID0gd2lzcF9ydW50aW1lLmlzTnVtYmVyO1xudmFyIGlzU3RyaW5nID0gd2lzcF9ydW50aW1lLmlzU3RyaW5nO1xudmFyIGlzRGljdGlvbmFyeSA9IHdpc3BfcnVudGltZS5pc0RpY3Rpb25hcnk7XG52YXIga2V5VmFsdWVzID0gd2lzcF9ydW50aW1lLmtleVZhbHVlcztcbnZhciBzdHIgPSB3aXNwX3J1bnRpbWUuc3RyO1xudmFyIGRlYyA9IHdpc3BfcnVudGltZS5kZWM7XG52YXIgaW5jID0gd2lzcF9ydW50aW1lLmluYztcbnZhciBtZXJnZSA9IHdpc3BfcnVudGltZS5tZXJnZTtcbnZhciBkaWN0aW9uYXJ5ID0gd2lzcF9ydW50aW1lLmRpY3Rpb25hcnk7OztcblxudmFyIExpc3QgPSBmdW5jdGlvbiBMaXN0KGhlYWQsIHRhaWwpIHtcbiAgdGhpcy5oZWFkID0gaGVhZDtcbiAgdGhpcy50YWlsID0gdGFpbCB8fCAobGlzdCgpKTtcbiAgdGhpcy5sZW5ndGggPSBpbmMoY291bnQodGhpcy50YWlsKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuTGlzdC5wcm90b3R5cGUubGVuZ3RoID0gMDtcblxuTGlzdC50eXBlID0gXCJ3aXNwLmxpc3RcIjtcblxuTGlzdC5wcm90b3R5cGUudHlwZSA9IExpc3QudHlwZTtcblxuTGlzdC5wcm90b3R5cGUudGFpbCA9IE9iamVjdC5jcmVhdGUoTGlzdC5wcm90b3R5cGUpO1xuXG5MaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCBsaXN0KSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShsaXN0KSA/XG4gICAgICBcIlwiICsgXCIoXCIgKyAocmVzdWx0LnN1YnN0cigxKSkgKyBcIilcIiA6XG4gICAgICAocmVzdWx0ID0gXCJcIiArIHJlc3VsdCArIFwiIFwiICsgKGlzVmVjdG9yKGZpcnN0KGxpc3QpKSA/XG4gICAgICAgIFwiXCIgKyBcIltcIiArIChmaXJzdChsaXN0KS5qb2luKFwiIFwiKSkgKyBcIl1cIiA6XG4gICAgICBpc05pbChmaXJzdChsaXN0KSkgP1xuICAgICAgICBcIm5pbFwiIDpcbiAgICAgIGlzU3RyaW5nKGZpcnN0KGxpc3QpKSA/XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZpcnN0KGxpc3QpKSA6XG4gICAgICBpc051bWJlcihmaXJzdChsaXN0KSkgP1xuICAgICAgICBKU09OLnN0cmluZ2lmeShmaXJzdChsaXN0KSkgOlxuICAgICAgICBmaXJzdChsaXN0KSksIGxpc3QgPSByZXN0KGxpc3QpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoXCJcIiwgdGhpcyk7XG59O1xuXG52YXIgbGF6eVNlcVZhbHVlID0gZnVuY3Rpb24gbGF6eVNlcVZhbHVlKGxhenlTZXEpIHtcbiAgcmV0dXJuICEobGF6eVNlcS5yZWFsaXplZCkgP1xuICAgIChsYXp5U2VxLnJlYWxpemVkID0gdHJ1ZSkgJiYgKGxhenlTZXEueCA9IGxhenlTZXEueCgpKSA6XG4gICAgbGF6eVNlcS54O1xufTtcblxudmFyIExhenlTZXEgPSBmdW5jdGlvbiBMYXp5U2VxKHJlYWxpemVkLCB4KSB7XG4gIHRoaXMucmVhbGl6ZWQgPSByZWFsaXplZCB8fCBmYWxzZTtcbiAgdGhpcy54ID0geDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5MYXp5U2VxLnR5cGUgPSBcIndpc3AubGF6eS5zZXFcIjtcblxuTGF6eVNlcS5wcm90b3R5cGUudHlwZSA9IExhenlTZXEudHlwZTtcblxudmFyIGxhenlTZXEgPSBmdW5jdGlvbiBsYXp5U2VxKHJlYWxpemVkLCBib2R5KSB7XG4gIHJldHVybiBuZXcgTGF6eVNlcShyZWFsaXplZCwgYm9keSk7XG59O1xuZXhwb3J0cy5sYXp5U2VxID0gbGF6eVNlcTtcblxudmFyIGlzTGF6eVNlcSA9IGZ1bmN0aW9uIGlzTGF6eVNlcSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgKExhenlTZXEudHlwZSA9PT0gdmFsdWUudHlwZSk7XG59O1xuZXhwb3J0cy5pc0xhenlTZXEgPSBpc0xhenlTZXE7XG5cbnVuZGVmaW5lZDtcblxudmFyIGlzTGlzdCA9IGZ1bmN0aW9uIGlzTGlzdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgKExpc3QudHlwZSA9PT0gdmFsdWUudHlwZSk7XG59O1xuZXhwb3J0cy5pc0xpc3QgPSBpc0xpc3Q7XG5cbnZhciBsaXN0ID0gZnVuY3Rpb24gbGlzdCgpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDAgP1xuICAgIE9iamVjdC5jcmVhdGUoTGlzdC5wcm90b3R5cGUpIDpcbiAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uKHRhaWwsIGhlYWQpIHtcbiAgICAgIHJldHVybiBjb25zKGhlYWQsIHRhaWwpO1xuICAgIH0sIGxpc3QoKSk7XG59O1xuZXhwb3J0cy5saXN0ID0gbGlzdDtcblxudmFyIGNvbnMgPSBmdW5jdGlvbiBjb25zKGhlYWQsIHRhaWwpIHtcbiAgcmV0dXJuIG5ldyBMaXN0KGhlYWQsIHRhaWwpO1xufTtcbmV4cG9ydHMuY29ucyA9IGNvbnM7XG5cbnZhciByZXZlcnNlTGlzdCA9IGZ1bmN0aW9uIHJldmVyc2VMaXN0KHNlcXVlbmNlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChpdGVtcywgc291cmNlKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShzb3VyY2UpID9cbiAgICAgIGxpc3QuYXBwbHkobGlzdCwgaXRlbXMpIDpcbiAgICAgIChpdGVtcyA9IFtmaXJzdChzb3VyY2UpXS5jb25jYXQoaXRlbXMpLCBzb3VyY2UgPSByZXN0KHNvdXJjZSksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShbXSwgc2VxdWVuY2UpO1xufTtcblxudmFyIGlzU2VxdWVudGlhbCA9IGZ1bmN0aW9uIGlzU2VxdWVudGlhbCh4KSB7XG4gIHJldHVybiAoaXNMaXN0KHgpKSB8fCAoaXNWZWN0b3IoeCkpIHx8IChpc0xhenlTZXEoeCkpIHx8IChpc0RpY3Rpb25hcnkoeCkpIHx8IChpc1N0cmluZyh4KSk7XG59O1xuZXhwb3J0cy5pc1NlcXVlbnRpYWwgPSBpc1NlcXVlbnRpYWw7XG5cbnZhciByZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgcmV2ZXJzZUxpc3Qoc2VxdWVuY2UpIDpcbiAgaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS5yZXZlcnNlKCkgOlxuICBpc05pbChzZXF1ZW5jZSkgP1xuICAgIGxpc3QoKSA6XG4gIFwiZWxzZVwiID9cbiAgICByZXZlcnNlKHNlcShzZXF1ZW5jZSkpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMucmV2ZXJzZSA9IHJldmVyc2U7XG5cbnZhciBtYXAgPSBmdW5jdGlvbiBtYXAoZiwgc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzVmVjdG9yKHNlcXVlbmNlKSA/XG4gICAgc2VxdWVuY2UubWFwKGYpIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgbWFwTGlzdChmLCBzZXF1ZW5jZSkgOlxuICBpc05pbChzZXF1ZW5jZSkgP1xuICAgIGxpc3QoKSA6XG4gIFwiZWxzZVwiID9cbiAgICBtYXAoZiwgc2VxKHNlcXVlbmNlKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5tYXAgPSBtYXA7XG5cbnZhciBtYXBMaXN0ID0gZnVuY3Rpb24gbWFwTGlzdChmLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCBpdGVtcykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGlzRW1wdHkoaXRlbXMpID9cbiAgICAgIHJldmVyc2UocmVzdWx0KSA6XG4gICAgICAocmVzdWx0ID0gY29ucyhmKGZpcnN0KGl0ZW1zKSksIHJlc3VsdCksIGl0ZW1zID0gcmVzdChpdGVtcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShsaXN0KCksIHNlcXVlbmNlKTtcbn07XG5cbnZhciBmaWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoaXNGLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS5maWx0ZXIoaXNGKSA6XG4gIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgIGZpbHRlckxpc3QoaXNGLCBzZXF1ZW5jZSkgOlxuICBpc05pbChzZXF1ZW5jZSkgP1xuICAgIGxpc3QoKSA6XG4gIFwiZWxzZVwiID9cbiAgICBmaWx0ZXIoaXNGLCBzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmZpbHRlciA9IGZpbHRlcjtcblxudmFyIGZpbHRlckxpc3QgPSBmdW5jdGlvbiBmaWx0ZXJMaXN0KGlzRiwgc2VxdWVuY2UpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHJlc3VsdCwgaXRlbXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGl0ZW1zKSA/XG4gICAgICByZXZlcnNlKHJlc3VsdCkgOlxuICAgICAgKHJlc3VsdCA9IGlzRihmaXJzdChpdGVtcykpID9cbiAgICAgICAgY29ucyhmaXJzdChpdGVtcyksIHJlc3VsdCkgOlxuICAgICAgICByZXN1bHQsIGl0ZW1zID0gcmVzdChpdGVtcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShsaXN0KCksIHNlcXVlbmNlKTtcbn07XG5cbnZhciByZWR1Y2UgPSBmdW5jdGlvbiByZWR1Y2UoZikge1xuICB2YXIgcGFyYW1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgcmV0dXJuIChmdW5jdGlvbigpIHtcbiAgICB2YXIgaGFzSW5pdGlhbCA9IGNvdW50KHBhcmFtcykgPj0gMjtcbiAgICB2YXIgaW5pdGlhbCA9IGhhc0luaXRpYWwgP1xuICAgICAgZmlyc3QocGFyYW1zKSA6XG4gICAgICB2b2lkKDApO1xuICAgIHZhciBzZXF1ZW5jZSA9IGhhc0luaXRpYWwgP1xuICAgICAgc2Vjb25kKHBhcmFtcykgOlxuICAgICAgZmlyc3QocGFyYW1zKTtcbiAgICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICAgIGluaXRpYWwgOlxuICAgIGlzVmVjdG9yKHNlcXVlbmNlKSA/XG4gICAgICBoYXNJbml0aWFsID9cbiAgICAgICAgc2VxdWVuY2UucmVkdWNlKGYsIGluaXRpYWwpIDpcbiAgICAgICAgc2VxdWVuY2UucmVkdWNlKGYpIDpcbiAgICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICAgIGhhc0luaXRpYWwgP1xuICAgICAgICByZWR1Y2VMaXN0KGYsIGluaXRpYWwsIHNlcXVlbmNlKSA6XG4gICAgICAgIHJlZHVjZUxpc3QoZiwgZmlyc3Qoc2VxdWVuY2UpLCByZXN0KHNlcXVlbmNlKSkgOlxuICAgIFwiZWxzZVwiID9cbiAgICAgIHJlZHVjZShmLCBpbml0aWFsLCBzZXEoc2VxdWVuY2UpKSA6XG4gICAgICB2b2lkKDApO1xuICB9KSgpO1xufTtcbmV4cG9ydHMucmVkdWNlID0gcmVkdWNlO1xuXG52YXIgcmVkdWNlTGlzdCA9IGZ1bmN0aW9uIHJlZHVjZUxpc3QoZiwgaW5pdGlhbCwgc2VxdWVuY2UpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHJlc3VsdCwgaXRlbXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGl0ZW1zKSA/XG4gICAgICByZXN1bHQgOlxuICAgICAgKHJlc3VsdCA9IGYocmVzdWx0LCBmaXJzdChpdGVtcykpLCBpdGVtcyA9IHJlc3QoaXRlbXMpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoaW5pdGlhbCwgc2VxdWVuY2UpO1xufTtcblxudmFyIGNvdW50ID0gZnVuY3Rpb24gY291bnQoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgMCA6XG4gICAgKHNlcShzZXF1ZW5jZSkpLmxlbmd0aDtcbn07XG5leHBvcnRzLmNvdW50ID0gY291bnQ7XG5cbnZhciBpc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eShzZXF1ZW5jZSkge1xuICByZXR1cm4gY291bnQoc2VxdWVuY2UpID09PSAwO1xufTtcbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7XG5cbnZhciBmaXJzdCA9IGZ1bmN0aW9uIGZpcnN0KHNlcXVlbmNlKSB7XG4gIHJldHVybiBpc05pbChzZXF1ZW5jZSkgP1xuICAgIHZvaWQoMCkgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS5oZWFkIDpcbiAgKGlzVmVjdG9yKHNlcXVlbmNlKSkgfHwgKGlzU3RyaW5nKHNlcXVlbmNlKSkgP1xuICAgIChzZXF1ZW5jZSB8fCAwKVswXSA6XG4gIGlzTGF6eVNlcShzZXF1ZW5jZSkgP1xuICAgIGZpcnN0KGxhenlTZXFWYWx1ZShzZXF1ZW5jZSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIGZpcnN0KHNlcShzZXF1ZW5jZSkpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuZmlyc3QgPSBmaXJzdDtcblxudmFyIHNlY29uZCA9IGZ1bmN0aW9uIHNlY29uZChzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICB2b2lkKDApIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgZmlyc3QocmVzdChzZXF1ZW5jZSkpIDpcbiAgKGlzVmVjdG9yKHNlcXVlbmNlKSkgfHwgKGlzU3RyaW5nKHNlcXVlbmNlKSkgP1xuICAgIChzZXF1ZW5jZSB8fCAwKVsxXSA6XG4gIGlzTGF6eVNlcShzZXF1ZW5jZSkgP1xuICAgIHNlY29uZChsYXp5U2VxVmFsdWUoc2VxdWVuY2UpKSA6XG4gIFwiZWxzZVwiID9cbiAgICBmaXJzdChyZXN0KHNlcShzZXF1ZW5jZSkpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnNlY29uZCA9IHNlY29uZDtcblxudmFyIHRoaXJkID0gZnVuY3Rpb24gdGhpcmQoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgdm9pZCgwKSA6XG4gIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgIGZpcnN0KHJlc3QocmVzdChzZXF1ZW5jZSkpKSA6XG4gIChpc1ZlY3RvcihzZXF1ZW5jZSkpIHx8IChpc1N0cmluZyhzZXF1ZW5jZSkpID9cbiAgICAoc2VxdWVuY2UgfHwgMClbMl0gOlxuICBpc0xhenlTZXEoc2VxdWVuY2UpID9cbiAgICB0aGlyZChsYXp5U2VxVmFsdWUoc2VxdWVuY2UpKSA6XG4gIFwiZWxzZVwiID9cbiAgICBzZWNvbmQocmVzdChzZXEoc2VxdWVuY2UpKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy50aGlyZCA9IHRoaXJkO1xuXG52YXIgcmVzdCA9IGZ1bmN0aW9uIHJlc3Qoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgbGlzdCgpIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgc2VxdWVuY2UudGFpbCA6XG4gIChpc1ZlY3RvcihzZXF1ZW5jZSkpIHx8IChpc1N0cmluZyhzZXF1ZW5jZSkpID9cbiAgICBzZXF1ZW5jZS5zbGljZSgxKSA6XG4gIGlzTGF6eVNlcShzZXF1ZW5jZSkgP1xuICAgIHJlc3QobGF6eVNlcVZhbHVlKHNlcXVlbmNlKSkgOlxuICBcImVsc2VcIiA/XG4gICAgcmVzdChzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnJlc3QgPSByZXN0O1xuXG52YXIgbGFzdE9mTGlzdCA9IGZ1bmN0aW9uIGxhc3RPZkxpc3QobGlzdCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoaXRlbSwgaXRlbXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGl0ZW1zKSA/XG4gICAgICBpdGVtIDpcbiAgICAgIChpdGVtID0gZmlyc3QoaXRlbXMpLCBpdGVtcyA9IHJlc3QoaXRlbXMpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoZmlyc3QobGlzdCksIHJlc3QobGlzdCkpO1xufTtcblxudmFyIGxhc3QgPSBmdW5jdGlvbiBsYXN0KHNlcXVlbmNlKSB7XG4gIHJldHVybiAoaXNWZWN0b3Ioc2VxdWVuY2UpKSB8fCAoaXNTdHJpbmcoc2VxdWVuY2UpKSA/XG4gICAgKHNlcXVlbmNlIHx8IDApW2RlYyhjb3VudChzZXF1ZW5jZSkpXSA6XG4gIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgIGxhc3RPZkxpc3Qoc2VxdWVuY2UpIDpcbiAgaXNOaWwoc2VxdWVuY2UpID9cbiAgICB2b2lkKDApIDpcbiAgaXNMYXp5U2VxKHNlcXVlbmNlKSA/XG4gICAgbGFzdChsYXp5U2VxVmFsdWUoc2VxdWVuY2UpKSA6XG4gIFwiZWxzZVwiID9cbiAgICBsYXN0KHNlcShzZXF1ZW5jZSkpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMubGFzdCA9IGxhc3Q7XG5cbnZhciBidXRsYXN0ID0gZnVuY3Rpb24gYnV0bGFzdChzZXF1ZW5jZSkge1xuICB2YXIgaXRlbXMgPSBpc05pbChzZXF1ZW5jZSkgP1xuICAgIHZvaWQoMCkgOlxuICBpc1N0cmluZyhzZXF1ZW5jZSkgP1xuICAgIHN1YnMoc2VxdWVuY2UsIDAsIGRlYyhjb3VudChzZXF1ZW5jZSkpKSA6XG4gIGlzVmVjdG9yKHNlcXVlbmNlKSA/XG4gICAgc2VxdWVuY2Uuc2xpY2UoMCwgZGVjKGNvdW50KHNlcXVlbmNlKSkpIDpcbiAgaXNMaXN0KHNlcXVlbmNlKSA/XG4gICAgbGlzdC5hcHBseShsaXN0LCBidXRsYXN0KHZlYyhzZXF1ZW5jZSkpKSA6XG4gIGlzTGF6eVNlcShzZXF1ZW5jZSkgP1xuICAgIGJ1dGxhc3QobGF6eVNlcVZhbHVlKHNlcXVlbmNlKSkgOlxuICBcImVsc2VcIiA/XG4gICAgYnV0bGFzdChzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbiAgcmV0dXJuICEoKGlzTmlsKGl0ZW1zKSkgfHwgKGlzRW1wdHkoaXRlbXMpKSkgP1xuICAgIGl0ZW1zIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuYnV0bGFzdCA9IGJ1dGxhc3Q7XG5cbnZhciB0YWtlID0gZnVuY3Rpb24gdGFrZShuLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICBsaXN0KCkgOlxuICBpc1ZlY3RvcihzZXF1ZW5jZSkgP1xuICAgIHRha2VGcm9tVmVjdG9yKG4sIHNlcXVlbmNlKSA6XG4gIGlzTGlzdChzZXF1ZW5jZSkgP1xuICAgIHRha2VGcm9tTGlzdChuLCBzZXF1ZW5jZSkgOlxuICBpc0xhenlTZXEoc2VxdWVuY2UpID9cbiAgICB0YWtlKG4sIGxhenlTZXFWYWx1ZShzZXF1ZW5jZSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHRha2Uobiwgc2VxKHNlcXVlbmNlKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy50YWtlID0gdGFrZTtcblxudmFyIHRha2VWZWN0b3JXaGlsZSA9IGZ1bmN0aW9uIHRha2VWZWN0b3JXaGlsZShwcmVkaWNhdGUsIHZlY3Rvcikge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCB0YWlsLCBoZWFkKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKCEoaXNFbXB0eSh0YWlsKSkpICYmIChwcmVkaWNhdGUoaGVhZCkpID9cbiAgICAgIChyZXN1bHQgPSBjb25qKHJlc3VsdCwgaGVhZCksIHRhaWwgPSByZXN0KHRhaWwpLCBoZWFkID0gZmlyc3QodGFpbCksIGxvb3ApIDpcbiAgICAgIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoW10sIHZlY3RvciwgZmlyc3QodmVjdG9yKSk7XG59O1xuXG52YXIgdGFrZUxpc3RXaGlsZSA9IGZ1bmN0aW9uIHRha2VMaXN0V2hpbGUocHJlZGljYXRlLCBpdGVtcykge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AocmVzdWx0LCB0YWlsLCBoZWFkKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKCEoaXNFbXB0eSh0YWlsKSkpICYmIChpc1ByZWRpY2F0ZShoZWFkKSkgP1xuICAgICAgKHJlc3VsdCA9IGNvbmoocmVzdWx0LCBoZWFkKSwgdGFpbCA9IHJlc3QodGFpbCksIGhlYWQgPSBmaXJzdCh0YWlsKSwgbG9vcCkgOlxuICAgICAgbGlzdC5hcHBseShsaXN0LCByZXN1bHQpO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShbXSwgaXRlbXMsIGZpcnN0KGl0ZW1zKSk7XG59O1xuXG52YXIgdGFrZVdoaWxlID0gZnVuY3Rpb24gdGFrZVdoaWxlKHByZWRpY2F0ZSwgc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgbGlzdCgpIDpcbiAgaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICB0YWtlVmVjdG9yV2hpbGUocHJlZGljYXRlLCBzZXF1ZW5jZSkgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICB0YWtlVmVjdG9yV2hpbGUocHJlZGljYXRlLCBzZXF1ZW5jZSkgOlxuICBcImVsc2VcIiA/XG4gICAgdGFrZVdoaWxlKHByZWRpY2F0ZSwgbGF6eVNlcVZhbHVlKHNlcXVlbmNlKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG5cbnZhciB0YWtlRnJvbVZlY3RvciA9IGZ1bmN0aW9uIHRha2VGcm9tVmVjdG9yKG4sIHZlY3Rvcikge1xuICByZXR1cm4gdmVjdG9yLnNsaWNlKDAsIG4pO1xufTtcblxudmFyIHRha2VGcm9tTGlzdCA9IGZ1bmN0aW9uIHRha2VGcm9tTGlzdChuLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodGFrZW4sIGl0ZW1zLCBuKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKG4gPT09IDApIHx8IChpc0VtcHR5KGl0ZW1zKSkgP1xuICAgICAgcmV2ZXJzZSh0YWtlbikgOlxuICAgICAgKHRha2VuID0gY29ucyhmaXJzdChpdGVtcyksIHRha2VuKSwgaXRlbXMgPSByZXN0KGl0ZW1zKSwgbiA9IGRlYyhuKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGxpc3QoKSwgc2VxdWVuY2UsIG4pO1xufTtcblxudmFyIGRyb3BGcm9tTGlzdCA9IGZ1bmN0aW9uIGRyb3BGcm9tTGlzdChuLCBzZXF1ZW5jZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AobGVmdCwgaXRlbXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSAobGVmdCA8IDEpIHx8IChpc0VtcHR5KGl0ZW1zKSkgP1xuICAgICAgaXRlbXMgOlxuICAgICAgKGxlZnQgPSBkZWMobGVmdCksIGl0ZW1zID0gcmVzdChpdGVtcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShuLCBzZXF1ZW5jZSk7XG59O1xuXG52YXIgZHJvcCA9IGZ1bmN0aW9uIGRyb3Aobiwgc2VxdWVuY2UpIHtcbiAgcmV0dXJuIG4gPD0gMCA/XG4gICAgc2VxdWVuY2UgOlxuICBpc1N0cmluZyhzZXF1ZW5jZSkgP1xuICAgIHNlcXVlbmNlLnN1YnN0cihuKSA6XG4gIGlzVmVjdG9yKHNlcXVlbmNlKSA/XG4gICAgc2VxdWVuY2Uuc2xpY2UobikgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBkcm9wRnJvbUxpc3Qobiwgc2VxdWVuY2UpIDpcbiAgaXNOaWwoc2VxdWVuY2UpID9cbiAgICBsaXN0KCkgOlxuICBpc0xhenlTZXEoc2VxdWVuY2UpID9cbiAgICBkcm9wKG4sIGxhenlTZXFWYWx1ZShzZXF1ZW5jZSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIGRyb3Aobiwgc2VxKHNlcXVlbmNlKSkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5kcm9wID0gZHJvcDtcblxudmFyIGNvbmpMaXN0ID0gZnVuY3Rpb24gY29uakxpc3Qoc2VxdWVuY2UsIGl0ZW1zKSB7XG4gIHJldHVybiByZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBpdGVtKSB7XG4gICAgcmV0dXJuIGNvbnMoaXRlbSwgcmVzdWx0KTtcbiAgfSwgc2VxdWVuY2UsIGl0ZW1zKTtcbn07XG5cbnZhciBjb25qID0gZnVuY3Rpb24gY29uaihzZXF1ZW5jZSkge1xuICB2YXIgaXRlbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gaXNWZWN0b3Ioc2VxdWVuY2UpID9cbiAgICBzZXF1ZW5jZS5jb25jYXQoaXRlbXMpIDpcbiAgaXNTdHJpbmcoc2VxdWVuY2UpID9cbiAgICBcIlwiICsgc2VxdWVuY2UgKyAoc3RyLmFwcGx5KHN0ciwgaXRlbXMpKSA6XG4gIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgbGlzdC5hcHBseShsaXN0LCByZXZlcnNlKGl0ZW1zKSkgOlxuICAoaXNMaXN0KHNlcXVlbmNlKSkgfHwgKGlzTGF6eVNlcSgpKSA/XG4gICAgY29uakxpc3Qoc2VxdWVuY2UsIGl0ZW1zKSA6XG4gIGlzRGljdGlvbmFyeShzZXF1ZW5jZSkgP1xuICAgIG1lcmdlKHNlcXVlbmNlLCBtZXJnZS5hcHBseShtZXJnZSwgaXRlbXMpKSA6XG4gIFwiZWxzZVwiID9cbiAgICAoZnVuY3Rpb24oKSB7IHRocm93IFR5cGVFcnJvcihcIlwiICsgXCJUeXBlIGNhbid0IGJlIGNvbmpvaW5lZCBcIiArIHNlcXVlbmNlKTsgfSkoKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmNvbmogPSBjb25qO1xuXG52YXIgYXNzb2MgPSBmdW5jdGlvbiBhc3NvYyhzb3VyY2UpIHtcbiAgdmFyIGtleVZhbHVlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHJldHVybiBjb25qKHNvdXJjZSwgZGljdGlvbmFyeS5hcHBseShkaWN0aW9uYXJ5LCBrZXlWYWx1ZXMpKTtcbn07XG5leHBvcnRzLmFzc29jID0gYXNzb2M7XG5cbnZhciBjb25jYXQgPSBmdW5jdGlvbiBjb25jYXQoKSB7XG4gIHZhciBzZXF1ZW5jZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gcmV2ZXJzZShyZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBzZXF1ZW5jZSkge1xuICAgIHJldHVybiByZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBpdGVtKSB7XG4gICAgICByZXR1cm4gY29ucyhpdGVtLCByZXN1bHQpO1xuICAgIH0sIHJlc3VsdCwgc2VxKHNlcXVlbmNlKSk7XG4gIH0sIGxpc3QoKSwgc2VxdWVuY2VzKSk7XG59O1xuZXhwb3J0cy5jb25jYXQgPSBjb25jYXQ7XG5cbnZhciBzZXEgPSBmdW5jdGlvbiBzZXEoc2VxdWVuY2UpIHtcbiAgcmV0dXJuIGlzTmlsKHNlcXVlbmNlKSA/XG4gICAgdm9pZCgwKSA6XG4gIChpc1ZlY3RvcihzZXF1ZW5jZSkpIHx8IChpc0xpc3Qoc2VxdWVuY2UpKSB8fCAoaXNMYXp5U2VxKHNlcXVlbmNlKSkgP1xuICAgIHNlcXVlbmNlIDpcbiAgaXNTdHJpbmcoc2VxdWVuY2UpID9cbiAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzZXF1ZW5jZSkgOlxuICBpc0RpY3Rpb25hcnkoc2VxdWVuY2UpID9cbiAgICBrZXlWYWx1ZXMoc2VxdWVuY2UpIDpcbiAgXCJkZWZhdWx0XCIgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgVHlwZUVycm9yKFwiXCIgKyBcIkNhbiBub3Qgc2VxIFwiICsgc2VxdWVuY2UpOyB9KSgpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuc2VxID0gc2VxO1xuXG52YXIgaXNTZXEgPSBmdW5jdGlvbiBpc1NlcShzZXF1ZW5jZSkge1xuICByZXR1cm4gKGlzTGlzdChzZXF1ZW5jZSkpIHx8IChpc0xhenlTZXEoc2VxdWVuY2UpKTtcbn07XG5leHBvcnRzLmlzU2VxID0gaXNTZXE7XG5cbnZhciBsaXN0VG9WZWN0b3IgPSBmdW5jdGlvbiBsaXN0VG9WZWN0b3Ioc291cmNlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIGxpc3QpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGxpc3QpID9cbiAgICAgIHJlc3VsdCA6XG4gICAgICAocmVzdWx0ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXN1bHQucHVzaChmaXJzdChsaXN0KSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSgpLCBsaXN0ID0gcmVzdChsaXN0KSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdLCBzb3VyY2UpO1xufTtcblxudmFyIHZlYyA9IGZ1bmN0aW9uIHZlYyhzZXF1ZW5jZSkge1xuICByZXR1cm4gaXNOaWwoc2VxdWVuY2UpID9cbiAgICBbXSA6XG4gIGlzVmVjdG9yKHNlcXVlbmNlKSA/XG4gICAgc2VxdWVuY2UgOlxuICBpc0xpc3Qoc2VxdWVuY2UpID9cbiAgICBsaXN0VG9WZWN0b3Ioc2VxdWVuY2UpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHZlYyhzZXEoc2VxdWVuY2UpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnZlYyA9IHZlYztcblxudmFyIHNvcnQgPSBmdW5jdGlvbiBzb3J0KGYsIGl0ZW1zKSB7XG4gIHZhciBoYXNDb21wYXJhdG9yID0gaXNGbihmKTtcbiAgdmFyIGl0ZW1zID0gKCEoaGFzQ29tcGFyYXRvcikpICYmIChpc05pbChpdGVtcykpID9cbiAgICBmIDpcbiAgICBpdGVtcztcbiAgdmFyIGNvbXBhcmUgPSBoYXNDb21wYXJhdG9yID9cbiAgICBmdW5jdGlvbihhLCBiKSB7XG4gICAgICByZXR1cm4gZihhLCBiKSA/XG4gICAgICAgIDAgOlxuICAgICAgICAxO1xuICAgIH0gOlxuICAgIHZvaWQoMCk7XG4gIHJldHVybiBpc05pbChpdGVtcykgP1xuICAgIGxpc3QoKSA6XG4gIGlzVmVjdG9yKGl0ZW1zKSA/XG4gICAgaXRlbXMuc29ydChjb21wYXJlKSA6XG4gIGlzTGlzdChpdGVtcykgP1xuICAgIGxpc3QuYXBwbHkobGlzdCwgdmVjKGl0ZW1zKS5zb3J0KGNvbXBhcmUpKSA6XG4gIGlzRGljdGlvbmFyeShpdGVtcykgP1xuICAgIHNlcShpdGVtcykuc29ydChjb21wYXJlKSA6XG4gIFwiZWxzZVwiID9cbiAgICBzb3J0KGYsIHNlcShpdGVtcykpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuc29ydCA9IHNvcnQ7XG5cbnZhciByZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQobiwgeCkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AobiwgcmVzdWx0KSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gbiA8PSAwID9cbiAgICAgIHJlc3VsdCA6XG4gICAgICAobiA9IGRlYyhuKSwgcmVzdWx0ID0gY29uaihyZXN1bHQsIHgpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkobiwgW10pO1xufTtcbmV4cG9ydHMucmVwZWF0ID0gcmVwZWF0IiwidmFyIF9uc18gPSB7XG4gIFwiaWRcIjogXCJ3aXNwLnN0cmluZ1wiXG59O1xudmFyIHdpc3BfcnVudGltZSA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG52YXIgc3RyID0gd2lzcF9ydW50aW1lLnN0cjtcbnZhciBzdWJzID0gd2lzcF9ydW50aW1lLnN1YnM7XG52YXIgcmVNYXRjaGVzID0gd2lzcF9ydW50aW1lLnJlTWF0Y2hlcztcbnZhciBpc05pbCA9IHdpc3BfcnVudGltZS5pc05pbDtcbnZhciBpc1N0cmluZyA9IHdpc3BfcnVudGltZS5pc1N0cmluZzs7XG52YXIgd2lzcF9zZXF1ZW5jZSA9IHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpO1xudmFyIHZlYyA9IHdpc3Bfc2VxdWVuY2UudmVjO1xudmFyIGlzRW1wdHkgPSB3aXNwX3NlcXVlbmNlLmlzRW1wdHk7OztcblxudmFyIHNwbGl0ID0gZnVuY3Rpb24gc3BsaXQoc3RyaW5nLCBwYXR0ZXJuLCBsaW1pdCkge1xuICByZXR1cm4gc3RyaW5nLnNwbGl0KHBhdHRlcm4sIGxpbWl0KTtcbn07XG5leHBvcnRzLnNwbGl0ID0gc3BsaXQ7XG5cbnZhciBqb2luID0gZnVuY3Rpb24gam9pbihzZXBhcmF0b3IsIGNvbGwpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIGNvbGwgPSBzZXBhcmF0b3I7XG4gICAgICByZXR1cm4gc3RyLmFwcGx5KHN0ciwgdmVjKGNvbGwpKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gdmVjKGNvbGwpLmpvaW4oc2VwYXJhdG9yKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAoZnVuY3Rpb24oKSB7IHRocm93IEVycm9yKFwiSW52YWxpZCBhcml0eVwiKTsgfSkoKVxuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLmpvaW4gPSBqb2luO1xuXG52YXIgdXBwZXJDYXNlID0gZnVuY3Rpb24gdXBwZXJDYXNlKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRvVXBwZXJDYXNlKCk7XG59O1xuZXhwb3J0cy51cHBlckNhc2UgPSB1cHBlckNhc2U7XG5cbnZhciB1cHBlckNhc2UgPSBmdW5jdGlvbiB1cHBlckNhc2Uoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudG9VcHBlckNhc2UoKTtcbn07XG5leHBvcnRzLnVwcGVyQ2FzZSA9IHVwcGVyQ2FzZTtcblxudmFyIGxvd2VyQ2FzZSA9IGZ1bmN0aW9uIGxvd2VyQ2FzZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpO1xufTtcbmV4cG9ydHMubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gIHJldHVybiBjb3VudChzdHJpbmcpIDwgMiA/XG4gICAgdXBwZXJDYXNlKHN0cmluZykgOlxuICAgIFwiXCIgKyAodXBwZXJDYXNlKHN1YnMocywgMCwgMSkpKSArIChsb3dlckNhc2Uoc3VicyhzLCAxKSkpO1xufTtcbmV4cG9ydHMuY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7XG5cbnZhciByZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShzdHJpbmcsIG1hdGNoLCByZXBsYWNlbWVudCkge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UobWF0Y2gsIHJlcGxhY2VtZW50KTtcbn07XG5leHBvcnRzLnJlcGxhY2UgPSByZXBsYWNlO1xuXG52YXIgX19MRUZUU1BBQ0VTX18gPSAvXlxcc1xccyovO1xuZXhwb3J0cy5fX0xFRlRTUEFDRVNfXyA9IF9fTEVGVFNQQUNFU19fO1xuXG52YXIgX19SSUdIVFNQQUNFU19fID0gL1xcc1xccyokLztcbmV4cG9ydHMuX19SSUdIVFNQQUNFU19fID0gX19SSUdIVFNQQUNFU19fO1xuXG52YXIgX19TUEFDRVNfXyA9IC9eXFxzXFxzKiQvO1xuZXhwb3J0cy5fX1NQQUNFU19fID0gX19TUEFDRVNfXztcblxudmFyIHRyaW1sID0gaXNOaWwoXCJcIi50cmltTGVmdCkgP1xuICBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX19MRUZUU1BBQ0VTX18sIFwiXCIpO1xuICB9IDpcbiAgZnVuY3Rpb24gdHJpbWwoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy50cmltTGVmdCgpO1xuICB9O1xuZXhwb3J0cy50cmltbCA9IHRyaW1sO1xuXG52YXIgdHJpbXIgPSBpc05pbChcIlwiLnRyaW1SaWdodCkgP1xuICBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX19SSUdIVFNQQUNFU19fLCBcIlwiKTtcbiAgfSA6XG4gIGZ1bmN0aW9uIHRyaW1yKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcudHJpbVJpZ2h0KCk7XG4gIH07XG5leHBvcnRzLnRyaW1yID0gdHJpbXI7XG5cbnZhciB0cmltID0gaXNOaWwoXCJcIi50cmltKSA/XG4gIGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShfX0xFRlRTUEFDRVNfXykucmVwbGFjZShfX1JJR0hUU1BBQ0VTX18pO1xuICB9IDpcbiAgZnVuY3Rpb24gdHJpbShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnRyaW0oKTtcbiAgfTtcbmV4cG9ydHMudHJpbSA9IHRyaW07XG5cbnZhciBpc0JsYW5rID0gZnVuY3Rpb24gaXNCbGFuayhzdHJpbmcpIHtcbiAgcmV0dXJuIChpc05pbChzdHJpbmcpKSB8fCAoaXNFbXB0eShzdHJpbmcpKSB8fCAocmVNYXRjaGVzKF9fU1BBQ0VTX18sIHN0cmluZykpO1xufTtcbmV4cG9ydHMuaXNCbGFuayA9IGlzQmxhbmsiLCJ2YXIgX25zXyA9IHtcbiAgXCJpZFwiOiBcIndpc3AucmVhZGVyXCIsXG4gIFwiZG9jXCI6IFwiUmVhZGVyIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgdGV4dCBpbnB1dFxcbiAgYXMgd2lzcCBkYXRhIHN0cnVjdHVyZXNcIlxufTtcbnZhciB3aXNwX3NlcXVlbmNlID0gcmVxdWlyZShcIi4vc2VxdWVuY2VcIik7XG52YXIgbGlzdCA9IHdpc3Bfc2VxdWVuY2UubGlzdDtcbnZhciBpc0xpc3QgPSB3aXNwX3NlcXVlbmNlLmlzTGlzdDtcbnZhciBjb3VudCA9IHdpc3Bfc2VxdWVuY2UuY291bnQ7XG52YXIgaXNFbXB0eSA9IHdpc3Bfc2VxdWVuY2UuaXNFbXB0eTtcbnZhciBmaXJzdCA9IHdpc3Bfc2VxdWVuY2UuZmlyc3Q7XG52YXIgc2Vjb25kID0gd2lzcF9zZXF1ZW5jZS5zZWNvbmQ7XG52YXIgdGhpcmQgPSB3aXNwX3NlcXVlbmNlLnRoaXJkO1xudmFyIHJlc3QgPSB3aXNwX3NlcXVlbmNlLnJlc3Q7XG52YXIgbWFwID0gd2lzcF9zZXF1ZW5jZS5tYXA7XG52YXIgdmVjID0gd2lzcF9zZXF1ZW5jZS52ZWM7XG52YXIgY29ucyA9IHdpc3Bfc2VxdWVuY2UuY29ucztcbnZhciBjb25qID0gd2lzcF9zZXF1ZW5jZS5jb25qO1xudmFyIGNvbmNhdCA9IHdpc3Bfc2VxdWVuY2UuY29uY2F0O1xudmFyIGxhc3QgPSB3aXNwX3NlcXVlbmNlLmxhc3Q7XG52YXIgYnV0bGFzdCA9IHdpc3Bfc2VxdWVuY2UuYnV0bGFzdDtcbnZhciBzb3J0ID0gd2lzcF9zZXF1ZW5jZS5zb3J0O1xudmFyIGxhenlTZXEgPSB3aXNwX3NlcXVlbmNlLmxhenlTZXE7O1xudmFyIHdpc3BfcnVudGltZSA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG52YXIgaXNPZGQgPSB3aXNwX3J1bnRpbWUuaXNPZGQ7XG52YXIgZGljdGlvbmFyeSA9IHdpc3BfcnVudGltZS5kaWN0aW9uYXJ5O1xudmFyIGtleXMgPSB3aXNwX3J1bnRpbWUua2V5cztcbnZhciBpc05pbCA9IHdpc3BfcnVudGltZS5pc05pbDtcbnZhciBpbmMgPSB3aXNwX3J1bnRpbWUuaW5jO1xudmFyIGRlYyA9IHdpc3BfcnVudGltZS5kZWM7XG52YXIgaXNWZWN0b3IgPSB3aXNwX3J1bnRpbWUuaXNWZWN0b3I7XG52YXIgaXNTdHJpbmcgPSB3aXNwX3J1bnRpbWUuaXNTdHJpbmc7XG52YXIgaXNOdW1iZXIgPSB3aXNwX3J1bnRpbWUuaXNOdW1iZXI7XG52YXIgaXNCb29sZWFuID0gd2lzcF9ydW50aW1lLmlzQm9vbGVhbjtcbnZhciBpc09iamVjdCA9IHdpc3BfcnVudGltZS5pc09iamVjdDtcbnZhciBpc0RpY3Rpb25hcnkgPSB3aXNwX3J1bnRpbWUuaXNEaWN0aW9uYXJ5O1xudmFyIHJlUGF0dGVybiA9IHdpc3BfcnVudGltZS5yZVBhdHRlcm47XG52YXIgcmVNYXRjaGVzID0gd2lzcF9ydW50aW1lLnJlTWF0Y2hlcztcbnZhciByZUZpbmQgPSB3aXNwX3J1bnRpbWUucmVGaW5kO1xudmFyIHN0ciA9IHdpc3BfcnVudGltZS5zdHI7XG52YXIgc3VicyA9IHdpc3BfcnVudGltZS5zdWJzO1xudmFyIGNoYXIgPSB3aXNwX3J1bnRpbWUuY2hhcjtcbnZhciB2YWxzID0gd2lzcF9ydW50aW1lLnZhbHM7XG52YXIgaXNFcXVhbCA9IHdpc3BfcnVudGltZS5pc0VxdWFsOztcbnZhciB3aXNwX2FzdCA9IHJlcXVpcmUoXCIuL2FzdFwiKTtcbnZhciBpc1N5bWJvbCA9IHdpc3BfYXN0LmlzU3ltYm9sO1xudmFyIHN5bWJvbCA9IHdpc3BfYXN0LnN5bWJvbDtcbnZhciBpc0tleXdvcmQgPSB3aXNwX2FzdC5pc0tleXdvcmQ7XG52YXIga2V5d29yZCA9IHdpc3BfYXN0LmtleXdvcmQ7XG52YXIgbWV0YSA9IHdpc3BfYXN0Lm1ldGE7XG52YXIgd2l0aE1ldGEgPSB3aXNwX2FzdC53aXRoTWV0YTtcbnZhciBuYW1lID0gd2lzcF9hc3QubmFtZTtcbnZhciBnZW5zeW0gPSB3aXNwX2FzdC5nZW5zeW07O1xudmFyIHdpc3Bfc3RyaW5nID0gcmVxdWlyZShcIi4vc3RyaW5nXCIpO1xudmFyIHNwbGl0ID0gd2lzcF9zdHJpbmcuc3BsaXQ7XG52YXIgam9pbiA9IHdpc3Bfc3RyaW5nLmpvaW47OztcblxudmFyIHB1c2hCYWNrUmVhZGVyID0gZnVuY3Rpb24gcHVzaEJhY2tSZWFkZXIoc291cmNlLCB1cmkpIHtcbiAgcmV0dXJuIHtcbiAgICBcImxpbmVzXCI6IHNwbGl0KHNvdXJjZSwgXCJcXG5cIiksXG4gICAgXCJidWZmZXJcIjogXCJcIixcbiAgICBcInVyaVwiOiB1cmksXG4gICAgXCJjb2x1bW5cIjogLTEsXG4gICAgXCJsaW5lXCI6IDBcbiAgfTtcbn07XG5leHBvcnRzLnB1c2hCYWNrUmVhZGVyID0gcHVzaEJhY2tSZWFkZXI7XG5cbnZhciBwZWVrQ2hhciA9IGZ1bmN0aW9uIHBlZWtDaGFyKHJlYWRlcikge1xuICB2YXIgbGluZSA9ICgocmVhZGVyIHx8IDApW1wibGluZXNcIl0pWyhyZWFkZXIgfHwgMClbXCJsaW5lXCJdXTtcbiAgdmFyIGNvbHVtbiA9IGluYygocmVhZGVyIHx8IDApW1wiY29sdW1uXCJdKTtcbiAgcmV0dXJuIGlzTmlsKGxpbmUpID9cbiAgICB2b2lkKDApIDpcbiAgICAobGluZVtjb2x1bW5dKSB8fCBcIlxcblwiO1xufTtcbmV4cG9ydHMucGVla0NoYXIgPSBwZWVrQ2hhcjtcblxudmFyIHJlYWRDaGFyID0gZnVuY3Rpb24gcmVhZENoYXIocmVhZGVyKSB7XG4gIHZhciBjaCA9IHBlZWtDaGFyKHJlYWRlcik7XG4gIGlzTmV3bGluZShwZWVrQ2hhcihyZWFkZXIpKSA/XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgKHJlYWRlciB8fCAwKVtcImxpbmVcIl0gPSBpbmMoKHJlYWRlciB8fCAwKVtcImxpbmVcIl0pO1xuICAgICAgcmV0dXJuIChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl0gPSAtMTtcbiAgICB9KSgpIDpcbiAgICAocmVhZGVyIHx8IDApW1wiY29sdW1uXCJdID0gaW5jKChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl0pO1xuICByZXR1cm4gY2g7XG59O1xuZXhwb3J0cy5yZWFkQ2hhciA9IHJlYWRDaGFyO1xuXG52YXIgaXNOZXdsaW5lID0gZnVuY3Rpb24gaXNOZXdsaW5lKGNoKSB7XG4gIHJldHVybiBcIlxcblwiID09PSBjaDtcbn07XG5leHBvcnRzLmlzTmV3bGluZSA9IGlzTmV3bGluZTtcblxudmFyIGlzQnJlYWtpbmdXaGl0ZXNwYWNlID0gZnVuY3Rpb24gaXNCcmVha2luZ1doaXRlc3BhY2UoY2gpIHtcbiAgcmV0dXJuIChjaCA9PT0gXCIgXCIpIHx8IChjaCA9PT0gXCJcXHRcIikgfHwgKGNoID09PSBcIlxcblwiKSB8fCAoY2ggPT09IFwiXFxyXCIpO1xufTtcbmV4cG9ydHMuaXNCcmVha2luZ1doaXRlc3BhY2UgPSBpc0JyZWFraW5nV2hpdGVzcGFjZTtcblxudmFyIGlzV2hpdGVzcGFjZSA9IGZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjaCkge1xuICByZXR1cm4gKGlzQnJlYWtpbmdXaGl0ZXNwYWNlKGNoKSkgfHwgKFwiLFwiID09PSBjaCk7XG59O1xuZXhwb3J0cy5pc1doaXRlc3BhY2UgPSBpc1doaXRlc3BhY2U7XG5cbnZhciBpc051bWVyaWMgPSBmdW5jdGlvbiBpc051bWVyaWMoY2gpIHtcbiAgcmV0dXJuIChjaCA9PT0gXCIwXCIpIHx8IChjaCA9PT0gXCIxXCIpIHx8IChjaCA9PT0gXCIyXCIpIHx8IChjaCA9PT0gXCIzXCIpIHx8IChjaCA9PT0gXCI0XCIpIHx8IChjaCA9PT0gXCI1XCIpIHx8IChjaCA9PT0gXCI2XCIpIHx8IChjaCA9PT0gXCI3XCIpIHx8IChjaCA9PT0gXCI4XCIpIHx8IChjaCA9PT0gXCI5XCIpO1xufTtcbmV4cG9ydHMuaXNOdW1lcmljID0gaXNOdW1lcmljO1xuXG52YXIgaXNDb21tZW50UHJlZml4ID0gZnVuY3Rpb24gaXNDb21tZW50UHJlZml4KGNoKSB7XG4gIHJldHVybiBcIjtcIiA9PT0gY2g7XG59O1xuZXhwb3J0cy5pc0NvbW1lbnRQcmVmaXggPSBpc0NvbW1lbnRQcmVmaXg7XG5cbnZhciBpc051bWJlckxpdGVyYWwgPSBmdW5jdGlvbiBpc051bWJlckxpdGVyYWwocmVhZGVyLCBpbml0Y2gpIHtcbiAgcmV0dXJuIChpc051bWVyaWMoaW5pdGNoKSkgfHwgKCgoXCIrXCIgPT09IGluaXRjaCkgfHwgKFwiLVwiID09PSBpbml0Y2gpKSAmJiAoaXNOdW1lcmljKHBlZWtDaGFyKHJlYWRlcikpKSk7XG59O1xuZXhwb3J0cy5pc051bWJlckxpdGVyYWwgPSBpc051bWJlckxpdGVyYWw7XG5cbnZhciByZWFkZXJFcnJvciA9IGZ1bmN0aW9uIHJlYWRlckVycm9yKHJlYWRlciwgbWVzc2FnZSkge1xuICB2YXIgdGV4dCA9IFwiXCIgKyBtZXNzYWdlICsgXCJcXG5cIiArIFwibGluZTpcIiArICgocmVhZGVyIHx8IDApW1wibGluZVwiXSkgKyBcIlxcblwiICsgXCJjb2x1bW46XCIgKyAoKHJlYWRlciB8fCAwKVtcImNvbHVtblwiXSk7XG4gIHZhciBlcnJvciA9IFN5bnRheEVycm9yKHRleHQsIChyZWFkZXIgfHwgMClbXCJ1cmlcIl0pO1xuICBlcnJvci5saW5lID0gKHJlYWRlciB8fCAwKVtcImxpbmVcIl07XG4gIGVycm9yLmNvbHVtbiA9IChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl07XG4gIGVycm9yLnVyaSA9IChyZWFkZXIgfHwgMClbXCJ1cmlcIl07XG4gIHJldHVybiAoZnVuY3Rpb24oKSB7IHRocm93IGVycm9yOyB9KSgpO1xufTtcbmV4cG9ydHMucmVhZGVyRXJyb3IgPSByZWFkZXJFcnJvcjtcblxudmFyIGlzTWFjcm9UZXJtaW5hdGluZyA9IGZ1bmN0aW9uIGlzTWFjcm9UZXJtaW5hdGluZyhjaCkge1xuICByZXR1cm4gKCEoY2ggPT09IFwiI1wiKSkgJiYgKCEoY2ggPT09IFwiJ1wiKSkgJiYgKCEoY2ggPT09IFwiOlwiKSkgJiYgKG1hY3JvcyhjaCkpO1xufTtcbmV4cG9ydHMuaXNNYWNyb1Rlcm1pbmF0aW5nID0gaXNNYWNyb1Rlcm1pbmF0aW5nO1xuXG52YXIgcmVhZFRva2VuID0gZnVuY3Rpb24gcmVhZFRva2VuKHJlYWRlciwgaW5pdGNoKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChidWZmZXIsIGNoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGlzTmlsKGNoKSkgfHwgKGlzV2hpdGVzcGFjZShjaCkpIHx8IChpc01hY3JvVGVybWluYXRpbmcoY2gpKSA/XG4gICAgICBidWZmZXIgOlxuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyAocmVhZENoYXIocmVhZGVyKSksIGNoID0gcGVla0NoYXIocmVhZGVyKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGluaXRjaCwgcGVla0NoYXIocmVhZGVyKSk7XG59O1xuZXhwb3J0cy5yZWFkVG9rZW4gPSByZWFkVG9rZW47XG5cbnZhciBza2lwTGluZSA9IGZ1bmN0aW9uIHNraXBMaW5lKHJlYWRlciwgXykge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNoID0gcmVhZENoYXIocmVhZGVyKTtcbiAgICAgIHJldHVybiAoY2ggPT09IFwiXFxuXCIpIHx8IChjaCA9PT0gXCJcXHJcIikgfHwgKGlzTmlsKGNoKSkgP1xuICAgICAgICByZWFkZXIgOlxuICAgICAgICAobG9vcCk7XG4gICAgfSkoKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoKTtcbn07XG5leHBvcnRzLnNraXBMaW5lID0gc2tpcExpbmU7XG5cbnZhciBpbnRQYXR0ZXJuID0gcmVQYXR0ZXJuKFwiXihbLStdPykoPzooMCl8KFsxLTldWzAtOV0qKXwwW3hYXShbMC05QS1GYS1mXSspfDAoWzAtN10rKXwoWzEtOV1bMC05XT8pW3JSXShbMC05QS1aYS16XSspfDBbMC05XSspKE4pPyRcIik7XG5leHBvcnRzLmludFBhdHRlcm4gPSBpbnRQYXR0ZXJuO1xuXG52YXIgcmF0aW9QYXR0ZXJuID0gcmVQYXR0ZXJuKFwiKFstK10/WzAtOV0rKS8oWzAtOV0rKVwiKTtcbmV4cG9ydHMucmF0aW9QYXR0ZXJuID0gcmF0aW9QYXR0ZXJuO1xuXG52YXIgZmxvYXRQYXR0ZXJuID0gcmVQYXR0ZXJuKFwiKFstK10/WzAtOV0rKFxcXFwuWzAtOV0qKT8oW2VFXVstK10/WzAtOV0rKT8pKE0pP1wiKTtcbmV4cG9ydHMuZmxvYXRQYXR0ZXJuID0gZmxvYXRQYXR0ZXJuO1xuXG52YXIgbWF0Y2hJbnQgPSBmdW5jdGlvbiBtYXRjaEludChzKSB7XG4gIHZhciBncm91cHMgPSByZUZpbmQoaW50UGF0dGVybiwgcyk7XG4gIHZhciBncm91cDMgPSBncm91cHNbMl07XG4gIHJldHVybiAhKChpc05pbChncm91cDMpKSB8fCAoY291bnQoZ3JvdXAzKSA8IDEpKSA/XG4gICAgMCA6XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5lZ2F0ZSA9IFwiLVwiID09PSBncm91cHNbMV0gP1xuICAgICAgICAtMSA6XG4gICAgICAgIDE7XG4gICAgICB2YXIgYSA9IGdyb3Vwc1szXSA/XG4gICAgICAgIFtncm91cHNbM10sIDEwXSA6XG4gICAgICBncm91cHNbNF0gP1xuICAgICAgICBbZ3JvdXBzWzRdLCAxNl0gOlxuICAgICAgZ3JvdXBzWzVdID9cbiAgICAgICAgW2dyb3Vwc1s1XSwgOF0gOlxuICAgICAgZ3JvdXBzWzddID9cbiAgICAgICAgW2dyb3Vwc1s3XSwgcGFyc2VJbnQoZ3JvdXBzWzddKV0gOlxuICAgICAgXCJlbHNlXCIgP1xuICAgICAgICBbdm9pZCgwKSwgdm9pZCgwKV0gOlxuICAgICAgICB2b2lkKDApO1xuICAgICAgdmFyIG4gPSBhWzBdO1xuICAgICAgdmFyIHJhZGl4ID0gYVsxXTtcbiAgICAgIHJldHVybiBpc05pbChuKSA/XG4gICAgICAgIHZvaWQoMCkgOlxuICAgICAgICBuZWdhdGUgKiAocGFyc2VJbnQobiwgcmFkaXgpKTtcbiAgICB9KSgpO1xufTtcbmV4cG9ydHMubWF0Y2hJbnQgPSBtYXRjaEludDtcblxudmFyIG1hdGNoUmF0aW8gPSBmdW5jdGlvbiBtYXRjaFJhdGlvKHMpIHtcbiAgdmFyIGdyb3VwcyA9IHJlRmluZChyYXRpb1BhdHRlcm4sIHMpO1xuICB2YXIgbnVtaW5hdG9yID0gZ3JvdXBzWzFdO1xuICB2YXIgZGVub21pbmF0b3IgPSBncm91cHNbMl07XG4gIHJldHVybiAocGFyc2VJbnQobnVtaW5hdG9yKSkgLyAocGFyc2VJbnQoZGVub21pbmF0b3IpKTtcbn07XG5leHBvcnRzLm1hdGNoUmF0aW8gPSBtYXRjaFJhdGlvO1xuXG52YXIgbWF0Y2hGbG9hdCA9IGZ1bmN0aW9uIG1hdGNoRmxvYXQocykge1xuICByZXR1cm4gcGFyc2VGbG9hdChzKTtcbn07XG5leHBvcnRzLm1hdGNoRmxvYXQgPSBtYXRjaEZsb2F0O1xuXG52YXIgbWF0Y2hOdW1iZXIgPSBmdW5jdGlvbiBtYXRjaE51bWJlcihzKSB7XG4gIHJldHVybiByZU1hdGNoZXMoaW50UGF0dGVybiwgcykgP1xuICAgIG1hdGNoSW50KHMpIDpcbiAgcmVNYXRjaGVzKHJhdGlvUGF0dGVybiwgcykgP1xuICAgIG1hdGNoUmF0aW8ocykgOlxuICByZU1hdGNoZXMoZmxvYXRQYXR0ZXJuLCBzKSA/XG4gICAgbWF0Y2hGbG9hdChzKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm1hdGNoTnVtYmVyID0gbWF0Y2hOdW1iZXI7XG5cbnZhciBlc2NhcGVDaGFyTWFwID0gZnVuY3Rpb24gZXNjYXBlQ2hhck1hcChjKSB7XG4gIHJldHVybiBjID09PSBcInRcIiA/XG4gICAgXCJcXHRcIiA6XG4gIGMgPT09IFwiclwiID9cbiAgICBcIlxcclwiIDpcbiAgYyA9PT0gXCJuXCIgP1xuICAgIFwiXFxuXCIgOlxuICBjID09PSBcIlxcXFxcIiA/XG4gICAgXCJcXFxcXCIgOlxuICBjID09PSBcIlxcXCJcIiA/XG4gICAgXCJcXFwiXCIgOlxuICBjID09PSBcImJcIiA/XG4gICAgXCJcYlwiIDpcbiAgYyA9PT0gXCJmXCIgP1xuICAgIFwiXGZcIiA6XG4gIFwiZWxzZVwiID9cbiAgICB2b2lkKDApIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuZXNjYXBlQ2hhck1hcCA9IGVzY2FwZUNoYXJNYXA7XG5cbnZhciByZWFkMkNoYXJzID0gZnVuY3Rpb24gcmVhZDJDaGFycyhyZWFkZXIpIHtcbiAgcmV0dXJuIFwiXCIgKyAocmVhZENoYXIocmVhZGVyKSkgKyAocmVhZENoYXIocmVhZGVyKSk7XG59O1xuZXhwb3J0cy5yZWFkMkNoYXJzID0gcmVhZDJDaGFycztcblxudmFyIHJlYWQ0Q2hhcnMgPSBmdW5jdGlvbiByZWFkNENoYXJzKHJlYWRlcikge1xuICByZXR1cm4gXCJcIiArIChyZWFkQ2hhcihyZWFkZXIpKSArIChyZWFkQ2hhcihyZWFkZXIpKSArIChyZWFkQ2hhcihyZWFkZXIpKSArIChyZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWQ0Q2hhcnMgPSByZWFkNENoYXJzO1xuXG52YXIgdW5pY29kZTJQYXR0ZXJuID0gcmVQYXR0ZXJuKFwiWzAtOUEtRmEtZl17Mn1cIik7XG5leHBvcnRzLnVuaWNvZGUyUGF0dGVybiA9IHVuaWNvZGUyUGF0dGVybjtcblxudmFyIHVuaWNvZGU0UGF0dGVybiA9IHJlUGF0dGVybihcIlswLTlBLUZhLWZdezR9XCIpO1xuZXhwb3J0cy51bmljb2RlNFBhdHRlcm4gPSB1bmljb2RlNFBhdHRlcm47XG5cbnZhciB2YWxpZGF0ZVVuaWNvZGVFc2NhcGUgPSBmdW5jdGlvbiB2YWxpZGF0ZVVuaWNvZGVFc2NhcGUodW5pY29kZVBhdHRlcm4sIHJlYWRlciwgZXNjYXBlQ2hhciwgdW5pY29kZVN0cikge1xuICByZXR1cm4gcmVNYXRjaGVzKHVuaWNvZGVQYXR0ZXJuLCB1bmljb2RlU3RyKSA/XG4gICAgdW5pY29kZVN0ciA6XG4gICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIlwiICsgXCJVbmV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlIFwiICsgXCJcXFxcXCIgKyBlc2NhcGVDaGFyICsgdW5pY29kZVN0cik7XG59O1xuZXhwb3J0cy52YWxpZGF0ZVVuaWNvZGVFc2NhcGUgPSB2YWxpZGF0ZVVuaWNvZGVFc2NhcGU7XG5cbnZhciBtYWtlVW5pY29kZUNoYXIgPSBmdW5jdGlvbiBtYWtlVW5pY29kZUNoYXIoY29kZVN0ciwgYmFzZSkge1xuICB2YXIgYmFzZSA9IGJhc2UgfHwgMTY7XG4gIHZhciBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgYmFzZSk7XG4gIHJldHVybiBjaGFyKGNvZGUpO1xufTtcbmV4cG9ydHMubWFrZVVuaWNvZGVDaGFyID0gbWFrZVVuaWNvZGVDaGFyO1xuXG52YXIgZXNjYXBlQ2hhciA9IGZ1bmN0aW9uIGVzY2FwZUNoYXIoYnVmZmVyLCByZWFkZXIpIHtcbiAgdmFyIGNoID0gcmVhZENoYXIocmVhZGVyKTtcbiAgdmFyIG1hcHJlc3VsdCA9IGVzY2FwZUNoYXJNYXAoY2gpO1xuICByZXR1cm4gbWFwcmVzdWx0ID9cbiAgICBtYXByZXN1bHQgOlxuICBjaCA9PT0gXCJ4XCIgP1xuICAgIG1ha2VVbmljb2RlQ2hhcih2YWxpZGF0ZVVuaWNvZGVFc2NhcGUodW5pY29kZTJQYXR0ZXJuLCByZWFkZXIsIGNoLCByZWFkMkNoYXJzKHJlYWRlcikpKSA6XG4gIGNoID09PSBcInVcIiA/XG4gICAgbWFrZVVuaWNvZGVDaGFyKHZhbGlkYXRlVW5pY29kZUVzY2FwZSh1bmljb2RlNFBhdHRlcm4sIHJlYWRlciwgY2gsIHJlYWQ0Q2hhcnMocmVhZGVyKSkpIDpcbiAgaXNOdW1lcmljKGNoKSA/XG4gICAgY2hhcihjaCkgOlxuICBcImVsc2VcIiA/XG4gICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIlwiICsgXCJVbmV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlIFwiICsgXCJcXFxcXCIgKyBjaCkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5lc2NhcGVDaGFyID0gZXNjYXBlQ2hhcjtcblxudmFyIHJlYWRQYXN0ID0gZnVuY3Rpb24gcmVhZFBhc3QocHJlZGljYXRlLCByZWFkZXIpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKF8pIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBwcmVkaWNhdGUocGVla0NoYXIocmVhZGVyKSkgP1xuICAgICAgKF8gPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICBwZWVrQ2hhcihyZWFkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KSh2b2lkKDApKTtcbn07XG5leHBvcnRzLnJlYWRQYXN0ID0gcmVhZFBhc3Q7XG5cbnZhciByZWFkRGVsaW1pdGVkTGlzdCA9IGZ1bmN0aW9uIHJlYWREZWxpbWl0ZWRMaXN0KGRlbGltLCByZWFkZXIsIGlzUmVjdXJzaXZlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChmb3JtKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNoID0gcmVhZFBhc3QoaXNXaGl0ZXNwYWNlLCByZWFkZXIpO1xuICAgICAgIShjaCkgP1xuICAgICAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiRU9GXCIpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICAgIHJldHVybiBkZWxpbSA9PT0gY2ggP1xuICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmVhZENoYXIocmVhZGVyKTtcbiAgICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgICAgfSkoKSA6XG4gICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgbWFjcm8gPSBtYWNyb3MoY2gpO1xuICAgICAgICAgIHJldHVybiBtYWNybyA/XG4gICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSBtYWNybyhyZWFkZXIsIHJlYWRDaGFyKHJlYWRlcikpO1xuICAgICAgICAgICAgICByZXR1cm4gKGZvcm0gPSByZXN1bHQgPT09IHJlYWRlciA/XG4gICAgICAgICAgICAgICAgZm9ybSA6XG4gICAgICAgICAgICAgICAgY29uaihmb3JtLCByZXN1bHQpLCBsb29wKTtcbiAgICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgbyA9IHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCBpc1JlY3Vyc2l2ZSk7XG4gICAgICAgICAgICAgIHJldHVybiAoZm9ybSA9IG8gPT09IHJlYWRlciA/XG4gICAgICAgICAgICAgICAgZm9ybSA6XG4gICAgICAgICAgICAgICAgY29uaihmb3JtLCBvKSwgbG9vcCk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9KSgpO1xuICAgIH0pKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdKTtcbn07XG5leHBvcnRzLnJlYWREZWxpbWl0ZWRMaXN0ID0gcmVhZERlbGltaXRlZExpc3Q7XG5cbnZhciBub3RJbXBsZW1lbnRlZCA9IGZ1bmN0aW9uIG5vdEltcGxlbWVudGVkKHJlYWRlciwgY2gpIHtcbiAgcmV0dXJuIHJlYWRlckVycm9yKHJlYWRlciwgXCJcIiArIFwiUmVhZGVyIGZvciBcIiArIGNoICsgXCIgbm90IGltcGxlbWVudGVkIHlldFwiKTtcbn07XG5leHBvcnRzLm5vdEltcGxlbWVudGVkID0gbm90SW1wbGVtZW50ZWQ7XG5cbnZhciByZWFkRGlzcGF0Y2ggPSBmdW5jdGlvbiByZWFkRGlzcGF0Y2gocmVhZGVyLCBfKSB7XG4gIHZhciBjaCA9IHJlYWRDaGFyKHJlYWRlcik7XG4gIHZhciBkbSA9IGRpc3BhdGNoTWFjcm9zKGNoKTtcbiAgcmV0dXJuIGRtID9cbiAgICBkbShyZWFkZXIsIF8pIDpcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gbWF5YmVSZWFkVGFnZ2VkVHlwZShyZWFkZXIsIGNoKTtcbiAgICAgIHJldHVybiBvYmplY3QgP1xuICAgICAgICBvYmplY3QgOlxuICAgICAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiTm8gZGlzcGF0Y2ggbWFjcm8gZm9yIFwiLCBjaCk7XG4gICAgfSkoKTtcbn07XG5leHBvcnRzLnJlYWREaXNwYXRjaCA9IHJlYWREaXNwYXRjaDtcblxudmFyIHJlYWRVbm1hdGNoZWREZWxpbWl0ZXIgPSBmdW5jdGlvbiByZWFkVW5tYXRjaGVkRGVsaW1pdGVyKHJkciwgY2gpIHtcbiAgcmV0dXJuIHJlYWRlckVycm9yKHJkciwgXCJVbm1hY2hlZCBkZWxpbWl0ZXIgXCIsIGNoKTtcbn07XG5leHBvcnRzLnJlYWRVbm1hdGNoZWREZWxpbWl0ZXIgPSByZWFkVW5tYXRjaGVkRGVsaW1pdGVyO1xuXG52YXIgcmVhZExpc3QgPSBmdW5jdGlvbiByZWFkTGlzdChyZWFkZXIsIF8pIHtcbiAgdmFyIGZvcm0gPSByZWFkRGVsaW1pdGVkTGlzdChcIilcIiwgcmVhZGVyLCB0cnVlKTtcbiAgcmV0dXJuIHdpdGhNZXRhKGxpc3QuYXBwbHkobGlzdCwgZm9ybSksIG1ldGEoZm9ybSkpO1xufTtcbmV4cG9ydHMucmVhZExpc3QgPSByZWFkTGlzdDtcblxudmFyIHJlYWRDb21tZW50ID0gZnVuY3Rpb24gcmVhZENvbW1lbnQocmVhZGVyLCBfKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChidWZmZXIsIGNoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGlzTmlsKGNoKSkgfHwgKFwiXFxuXCIgPT09IGNoKSA/XG4gICAgICByZWFkZXIgfHwgKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiY29tbWVudFwiKSwgYnVmZmVyKSkgOlxuICAgIChcIlxcXFxcIiA9PT0gY2gpID9cbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgKGVzY2FwZUNoYXIoYnVmZmVyLCByZWFkZXIpKSwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgXCJlbHNlXCIgP1xuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyBjaCwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICB2b2lkKDApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCByZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWRDb21tZW50ID0gcmVhZENvbW1lbnQ7XG5cbnZhciByZWFkVmVjdG9yID0gZnVuY3Rpb24gcmVhZFZlY3RvcihyZWFkZXIpIHtcbiAgcmV0dXJuIHJlYWREZWxpbWl0ZWRMaXN0KFwiXVwiLCByZWFkZXIsIHRydWUpO1xufTtcbmV4cG9ydHMucmVhZFZlY3RvciA9IHJlYWRWZWN0b3I7XG5cbnZhciByZWFkTWFwID0gZnVuY3Rpb24gcmVhZE1hcChyZWFkZXIpIHtcbiAgdmFyIGZvcm0gPSByZWFkRGVsaW1pdGVkTGlzdChcIn1cIiwgcmVhZGVyLCB0cnVlKTtcbiAgcmV0dXJuIGlzT2RkKGNvdW50KGZvcm0pKSA/XG4gICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIk1hcCBsaXRlcmFsIG11c3QgY29udGFpbiBhbiBldmVuIG51bWJlciBvZiBmb3Jtc1wiKSA6XG4gICAgd2l0aE1ldGEoZGljdGlvbmFyeS5hcHBseShkaWN0aW9uYXJ5LCBmb3JtKSwgbWV0YShmb3JtKSk7XG59O1xuZXhwb3J0cy5yZWFkTWFwID0gcmVhZE1hcDtcblxudmFyIHJlYWRTZXQgPSBmdW5jdGlvbiByZWFkU2V0KHJlYWRlciwgXykge1xuICB2YXIgZm9ybSA9IHJlYWREZWxpbWl0ZWRMaXN0KFwifVwiLCByZWFkZXIsIHRydWUpO1xuICByZXR1cm4gd2l0aE1ldGEoY29uY2F0KFtzeW1ib2wodm9pZCgwKSwgXCJzZXRcIildLCBmb3JtKSwgbWV0YShmb3JtKSk7XG59O1xuZXhwb3J0cy5yZWFkU2V0ID0gcmVhZFNldDtcblxudmFyIHJlYWROdW1iZXIgPSBmdW5jdGlvbiByZWFkTnVtYmVyKHJlYWRlciwgaW5pdGNoKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChidWZmZXIsIGNoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGlzTmlsKGNoKSkgfHwgKGlzV2hpdGVzcGFjZShjaCkpIHx8IChtYWNyb3MoY2gpKSA/XG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IG1hdGNoTnVtYmVyKGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBpc05pbChtYXRjaCkgP1xuICAgICAgICAgIHJlYWRlckVycm9yKHJlYWRlciwgXCJJbnZhbGlkIG51bWJlciBmb3JtYXQgW1wiLCBidWZmZXIsIFwiXVwiKSA6XG4gICAgICAgICAgbWF0Y2g7XG4gICAgICB9KSgpIDpcbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgKHJlYWRDaGFyKHJlYWRlcikpLCBjaCA9IHBlZWtDaGFyKHJlYWRlciksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShpbml0Y2gsIHBlZWtDaGFyKHJlYWRlcikpO1xufTtcbmV4cG9ydHMucmVhZE51bWJlciA9IHJlYWROdW1iZXI7XG5cbnZhciByZWFkU3RyaW5nID0gZnVuY3Rpb24gcmVhZFN0cmluZyhyZWFkZXIpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKGJ1ZmZlciwgY2gpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc05pbChjaCkgP1xuICAgICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIkVPRiB3aGlsZSByZWFkaW5nIHN0cmluZ1wiKSA6XG4gICAgXCJcXFxcXCIgPT09IGNoID9cbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgKGVzY2FwZUNoYXIoYnVmZmVyLCByZWFkZXIpKSwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgXCJcXFwiXCIgPT09IGNoID9cbiAgICAgIGJ1ZmZlciA6XG4gICAgXCJkZWZhdWx0XCIgP1xuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyBjaCwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICB2b2lkKDApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCByZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWRTdHJpbmcgPSByZWFkU3RyaW5nO1xuXG52YXIgcmVhZFVucXVvdGUgPSBmdW5jdGlvbiByZWFkVW5xdW90ZShyZWFkZXIpIHtcbiAgdmFyIGNoID0gcGVla0NoYXIocmVhZGVyKTtcbiAgcmV0dXJuICEoY2gpID9cbiAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiRU9GIHdoaWxlIHJlYWRpbmcgY2hhcmFjdGVyXCIpIDpcbiAgY2ggPT09IFwiQFwiID9cbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICByZWFkQ2hhcihyZWFkZXIpO1xuICAgICAgcmV0dXJuIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwidW5xdW90ZS1zcGxpY2luZ1wiKSwgcmVhZChyZWFkZXIsIHRydWUsIHZvaWQoMCksIHRydWUpKTtcbiAgICB9KSgpIDpcbiAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInVucXVvdGVcIiksIHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCB0cnVlKSk7XG59O1xuZXhwb3J0cy5yZWFkVW5xdW90ZSA9IHJlYWRVbnF1b3RlO1xuXG52YXIgc3BlY2lhbFN5bWJvbHMgPSBmdW5jdGlvbiBzcGVjaWFsU3ltYm9scyh0ZXh0LCBub3RGb3VuZCkge1xuICByZXR1cm4gdGV4dCA9PT0gXCJuaWxcIiA/XG4gICAgdm9pZCgwKSA6XG4gIHRleHQgPT09IFwidHJ1ZVwiID9cbiAgICB0cnVlIDpcbiAgdGV4dCA9PT0gXCJmYWxzZVwiID9cbiAgICBmYWxzZSA6XG4gIFwiZWxzZVwiID9cbiAgICBub3RGb3VuZCA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnNwZWNpYWxTeW1ib2xzID0gc3BlY2lhbFN5bWJvbHM7XG5cbnZhciByZWFkU3ltYm9sID0gZnVuY3Rpb24gcmVhZFN5bWJvbChyZWFkZXIsIGluaXRjaCkge1xuICB2YXIgdG9rZW4gPSByZWFkVG9rZW4ocmVhZGVyLCBpbml0Y2gpO1xuICB2YXIgcGFydHMgPSBzcGxpdCh0b2tlbiwgXCIvXCIpO1xuICB2YXIgaGFzTnMgPSAoY291bnQocGFydHMpID4gMSkgJiYgKGNvdW50KHRva2VuKSA+IDEpO1xuICB2YXIgbnMgPSBmaXJzdChwYXJ0cyk7XG4gIHZhciBuYW1lID0gam9pbihcIi9cIiwgcmVzdChwYXJ0cykpO1xuICByZXR1cm4gaGFzTnMgP1xuICAgIHN5bWJvbChucywgbmFtZSkgOlxuICAgIHNwZWNpYWxTeW1ib2xzKHRva2VuLCBzeW1ib2wodG9rZW4pKTtcbn07XG5leHBvcnRzLnJlYWRTeW1ib2wgPSByZWFkU3ltYm9sO1xuXG52YXIgcmVhZEtleXdvcmQgPSBmdW5jdGlvbiByZWFkS2V5d29yZChyZWFkZXIsIGluaXRjaCkge1xuICB2YXIgdG9rZW4gPSByZWFkVG9rZW4ocmVhZGVyLCByZWFkQ2hhcihyZWFkZXIpKTtcbiAgdmFyIHBhcnRzID0gc3BsaXQodG9rZW4sIFwiL1wiKTtcbiAgdmFyIG5hbWUgPSBsYXN0KHBhcnRzKTtcbiAgdmFyIG5zID0gY291bnQocGFydHMpID4gMSA/XG4gICAgam9pbihcIi9cIiwgYnV0bGFzdChwYXJ0cykpIDpcbiAgICB2b2lkKDApO1xuICB2YXIgaXNzdWUgPSBsYXN0KG5zKSA9PT0gXCI6XCIgP1xuICAgIFwibmFtZXNwYWNlIGNhbid0IGVuZHMgd2l0aCBcXFwiOlxcXCJcIiA6XG4gIGxhc3QobmFtZSkgPT09IFwiOlwiID9cbiAgICBcIm5hbWUgY2FuJ3QgZW5kIHdpdGggXFxcIjpcXFwiXCIgOlxuICBsYXN0KG5hbWUpID09PSBcIi9cIiA/XG4gICAgXCJuYW1lIGNhbid0IGVuZCB3aXRoIFxcXCIvXFxcIlwiIDpcbiAgY291bnQoc3BsaXQodG9rZW4sIFwiOjpcIikpID4gMSA/XG4gICAgXCJuYW1lIGNhbid0IGNvbnRhaW4gXFxcIjo6XFxcIlwiIDpcbiAgICB2b2lkKDApO1xuICByZXR1cm4gaXNzdWUgP1xuICAgIHJlYWRlckVycm9yKHJlYWRlciwgXCJJbnZhbGlkIHRva2VuIChcIiwgaXNzdWUsIFwiKTogXCIsIHRva2VuKSA6XG4gICghKG5zKSkgJiYgKGZpcnN0KG5hbWUpID09PSBcIjpcIikgP1xuICAgIGtleXdvcmQocmVzdChuYW1lKSkgOlxuICAgIGtleXdvcmQobnMsIG5hbWUpO1xufTtcbmV4cG9ydHMucmVhZEtleXdvcmQgPSByZWFkS2V5d29yZDtcblxudmFyIGRlc3VnYXJNZXRhID0gZnVuY3Rpb24gZGVzdWdhck1ldGEoZikge1xuICByZXR1cm4gaXNLZXl3b3JkKGYpID9cbiAgICBkaWN0aW9uYXJ5KG5hbWUoZiksIHRydWUpIDpcbiAgaXNTeW1ib2woZikgP1xuICAgIHtcbiAgICAgIFwidGFnXCI6IGZcbiAgICB9IDpcbiAgaXNTdHJpbmcoZikgP1xuICAgIHtcbiAgICAgIFwidGFnXCI6IGZcbiAgICB9IDpcbiAgXCJlbHNlXCIgP1xuICAgIGYgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5kZXN1Z2FyTWV0YSA9IGRlc3VnYXJNZXRhO1xuXG52YXIgd3JhcHBpbmdSZWFkZXIgPSBmdW5jdGlvbiB3cmFwcGluZ1JlYWRlcihwcmVmaXgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHJlYWRlcikge1xuICAgIHJldHVybiBsaXN0KHByZWZpeCwgcmVhZChyZWFkZXIsIHRydWUsIHZvaWQoMCksIHRydWUpKTtcbiAgfTtcbn07XG5leHBvcnRzLndyYXBwaW5nUmVhZGVyID0gd3JhcHBpbmdSZWFkZXI7XG5cbnZhciB0aHJvd2luZ1JlYWRlciA9IGZ1bmN0aW9uIHRocm93aW5nUmVhZGVyKG1zZykge1xuICByZXR1cm4gZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgcmV0dXJuIHJlYWRlckVycm9yKHJlYWRlciwgbXNnKTtcbiAgfTtcbn07XG5leHBvcnRzLnRocm93aW5nUmVhZGVyID0gdGhyb3dpbmdSZWFkZXI7XG5cbnZhciByZWFkTWV0YSA9IGZ1bmN0aW9uIHJlYWRNZXRhKHJlYWRlciwgXykge1xuICB2YXIgbWV0YWRhdGEgPSBkZXN1Z2FyTWV0YShyZWFkKHJlYWRlciwgdHJ1ZSwgdm9pZCgwKSwgdHJ1ZSkpO1xuICAhKGlzRGljdGlvbmFyeShtZXRhZGF0YSkpID9cbiAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiTWV0YWRhdGEgbXVzdCBiZSBTeW1ib2wsIEtleXdvcmQsIFN0cmluZyBvciBNYXBcIikgOlxuICAgIHZvaWQoMCk7XG4gIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm0gPSByZWFkKHJlYWRlciwgdHJ1ZSwgdm9pZCgwKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGZvcm0pID9cbiAgICAgIHdpdGhNZXRhKGZvcm0sIGNvbmoobWV0YWRhdGEsIG1ldGEoZm9ybSkpKSA6XG4gICAgICBmb3JtO1xuICB9KSgpO1xufTtcbmV4cG9ydHMucmVhZE1ldGEgPSByZWFkTWV0YTtcblxudmFyIHJlYWRSZWdleCA9IGZ1bmN0aW9uIHJlYWRSZWdleChyZWFkZXIpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKGJ1ZmZlciwgY2gpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc05pbChjaCkgP1xuICAgICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIkVPRiB3aGlsZSByZWFkaW5nIHN0cmluZ1wiKSA6XG4gICAgXCJcXFxcXCIgPT09IGNoID9cbiAgICAgIChidWZmZXIgPSBcIlwiICsgYnVmZmVyICsgY2ggKyAocmVhZENoYXIocmVhZGVyKSksIGNoID0gcmVhZENoYXIocmVhZGVyKSwgbG9vcCkgOlxuICAgIFwiXFxcIlwiID09PSBjaCA/XG4gICAgICByZVBhdHRlcm4oYnVmZmVyKSA6XG4gICAgXCJkZWZhdWx0XCIgP1xuICAgICAgKGJ1ZmZlciA9IFwiXCIgKyBidWZmZXIgKyBjaCwgY2ggPSByZWFkQ2hhcihyZWFkZXIpLCBsb29wKSA6XG4gICAgICB2b2lkKDApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCByZWFkQ2hhcihyZWFkZXIpKTtcbn07XG5leHBvcnRzLnJlYWRSZWdleCA9IHJlYWRSZWdleDtcblxudmFyIHJlYWRQYXJhbSA9IGZ1bmN0aW9uIHJlYWRQYXJhbShyZWFkZXIsIGluaXRjaCkge1xuICB2YXIgZm9ybSA9IHJlYWRTeW1ib2wocmVhZGVyLCBpbml0Y2gpO1xuICByZXR1cm4gaXNFcXVhbChmb3JtLCBzeW1ib2woXCIlXCIpKSA/XG4gICAgc3ltYm9sKFwiJTFcIikgOlxuICAgIGZvcm07XG59O1xuZXhwb3J0cy5yZWFkUGFyYW0gPSByZWFkUGFyYW07XG5cbnZhciBpc1BhcmFtID0gZnVuY3Rpb24gaXNQYXJhbShmb3JtKSB7XG4gIHJldHVybiAoaXNTeW1ib2woZm9ybSkpICYmIChcIiVcIiA9PT0gZmlyc3QobmFtZShmb3JtKSkpO1xufTtcbmV4cG9ydHMuaXNQYXJhbSA9IGlzUGFyYW07XG5cbnZhciBsYW1iZGFQYXJhbXNIYXNoID0gZnVuY3Rpb24gbGFtYmRhUGFyYW1zSGFzaChmb3JtKSB7XG4gIHJldHVybiBpc1BhcmFtKGZvcm0pID9cbiAgICBkaWN0aW9uYXJ5KGZvcm0sIGZvcm0pIDpcbiAgKGlzRGljdGlvbmFyeShmb3JtKSkgfHwgKGlzVmVjdG9yKGZvcm0pKSB8fCAoaXNMaXN0KGZvcm0pKSA/XG4gICAgY29uai5hcHBseShjb25qLCBtYXAobGFtYmRhUGFyYW1zSGFzaCwgdmVjKGZvcm0pKSkgOlxuICBcImVsc2VcIiA/XG4gICAge30gOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5sYW1iZGFQYXJhbXNIYXNoID0gbGFtYmRhUGFyYW1zSGFzaDtcblxudmFyIGxhbWJkYVBhcmFtcyA9IGZ1bmN0aW9uIGxhbWJkYVBhcmFtcyhib2R5KSB7XG4gIHZhciBuYW1lcyA9IHNvcnQodmFscyhsYW1iZGFQYXJhbXNIYXNoKGJvZHkpKSk7XG4gIHZhciB2YXJpYWRpYyA9IGlzRXF1YWwoZmlyc3QobmFtZXMpLCBzeW1ib2woXCIlJlwiKSk7XG4gIHZhciBuID0gdmFyaWFkaWMgJiYgKGNvdW50KG5hbWVzKSA9PT0gMSkgP1xuICAgIDAgOlxuICAgIHBhcnNlSW50KHJlc3QobmFtZShsYXN0KG5hbWVzKSkpKTtcbiAgdmFyIHBhcmFtcyA9IChmdW5jdGlvbiBsb29wKG5hbWVzLCBpKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaSA8PSBuID9cbiAgICAgIChuYW1lcyA9IGNvbmoobmFtZXMsIHN5bWJvbChcIlwiICsgXCIlXCIgKyBpKSksIGkgPSBpbmMoaSksIGxvb3ApIDpcbiAgICAgIG5hbWVzO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShbXSwgMSk7XG4gIHJldHVybiB2YXJpYWRpYyA/XG4gICAgY29uaihwYXJhbXMsIHN5bWJvbCh2b2lkKDApLCBcIiZcIiksIHN5bWJvbCh2b2lkKDApLCBcIiUmXCIpKSA6XG4gICAgbmFtZXM7XG59O1xuZXhwb3J0cy5sYW1iZGFQYXJhbXMgPSBsYW1iZGFQYXJhbXM7XG5cbnZhciByZWFkTGFtYmRhID0gZnVuY3Rpb24gcmVhZExhbWJkYShyZWFkZXIpIHtcbiAgdmFyIGJvZHkgPSByZWFkTGlzdChyZWFkZXIpO1xuICByZXR1cm4gbGlzdChzeW1ib2wodm9pZCgwKSwgXCJmblwiKSwgbGFtYmRhUGFyYW1zKGJvZHkpLCBib2R5KTtcbn07XG5leHBvcnRzLnJlYWRMYW1iZGEgPSByZWFkTGFtYmRhO1xuXG52YXIgcmVhZERpc2NhcmQgPSBmdW5jdGlvbiByZWFkRGlzY2FyZChyZWFkZXIsIF8pIHtcbiAgcmVhZChyZWFkZXIsIHRydWUsIHZvaWQoMCksIHRydWUpO1xuICByZXR1cm4gcmVhZGVyO1xufTtcbmV4cG9ydHMucmVhZERpc2NhcmQgPSByZWFkRGlzY2FyZDtcblxudmFyIG1hY3JvcyA9IGZ1bmN0aW9uIG1hY3JvcyhjKSB7XG4gIHJldHVybiBjID09PSBcIlxcXCJcIiA/XG4gICAgcmVhZFN0cmluZyA6XG4gIGMgPT09IFwiOlwiID9cbiAgICByZWFkS2V5d29yZCA6XG4gIGMgPT09IFwiO1wiID9cbiAgICByZWFkQ29tbWVudCA6XG4gIGMgPT09IFwiJ1wiID9cbiAgICB3cmFwcGluZ1JlYWRlcihzeW1ib2wodm9pZCgwKSwgXCJxdW90ZVwiKSkgOlxuICBjID09PSBcIkBcIiA/XG4gICAgd3JhcHBpbmdSZWFkZXIoc3ltYm9sKHZvaWQoMCksIFwiZGVyZWZcIikpIDpcbiAgYyA9PT0gXCJeXCIgP1xuICAgIHJlYWRNZXRhIDpcbiAgYyA9PT0gXCJgXCIgP1xuICAgIHdyYXBwaW5nUmVhZGVyKHN5bWJvbCh2b2lkKDApLCBcInN5bnRheC1xdW90ZVwiKSkgOlxuICBjID09PSBcIn5cIiA/XG4gICAgcmVhZFVucXVvdGUgOlxuICBjID09PSBcIihcIiA/XG4gICAgcmVhZExpc3QgOlxuICBjID09PSBcIilcIiA/XG4gICAgcmVhZFVubWF0Y2hlZERlbGltaXRlciA6XG4gIGMgPT09IFwiW1wiID9cbiAgICByZWFkVmVjdG9yIDpcbiAgYyA9PT0gXCJdXCIgP1xuICAgIHJlYWRVbm1hdGNoZWREZWxpbWl0ZXIgOlxuICBjID09PSBcIntcIiA/XG4gICAgcmVhZE1hcCA6XG4gIGMgPT09IFwifVwiID9cbiAgICByZWFkVW5tYXRjaGVkRGVsaW1pdGVyIDpcbiAgYyA9PT0gXCJcXFxcXCIgP1xuICAgIHJlYWRDaGFyIDpcbiAgYyA9PT0gXCIlXCIgP1xuICAgIHJlYWRQYXJhbSA6XG4gIGMgPT09IFwiI1wiID9cbiAgICByZWFkRGlzcGF0Y2ggOlxuICBcImVsc2VcIiA/XG4gICAgdm9pZCgwKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm1hY3JvcyA9IG1hY3JvcztcblxudmFyIGRpc3BhdGNoTWFjcm9zID0gZnVuY3Rpb24gZGlzcGF0Y2hNYWNyb3Mocykge1xuICByZXR1cm4gcyA9PT0gXCJ7XCIgP1xuICAgIHJlYWRTZXQgOlxuICBzID09PSBcIihcIiA/XG4gICAgcmVhZExhbWJkYSA6XG4gIHMgPT09IFwiPFwiID9cbiAgICB0aHJvd2luZ1JlYWRlcihcIlVucmVhZGFibGUgZm9ybVwiKSA6XG4gIHMgPT09IFwiXFxcIlwiID9cbiAgICByZWFkUmVnZXggOlxuICBzID09PSBcIiFcIiA/XG4gICAgcmVhZENvbW1lbnQgOlxuICBzID09PSBcIl9cIiA/XG4gICAgcmVhZERpc2NhcmQgOlxuICBcImVsc2VcIiA/XG4gICAgdm9pZCgwKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmRpc3BhdGNoTWFjcm9zID0gZGlzcGF0Y2hNYWNyb3M7XG5cbnZhciByZWFkRm9ybSA9IGZ1bmN0aW9uIHJlYWRGb3JtKHJlYWRlciwgY2gpIHtcbiAgdmFyIHN0YXJ0ID0ge1xuICAgIFwibGluZVwiOiAocmVhZGVyIHx8IDApW1wibGluZVwiXSxcbiAgICBcImNvbHVtblwiOiAocmVhZGVyIHx8IDApW1wiY29sdW1uXCJdXG4gIH07XG4gIHZhciByZWFkTWFjcm8gPSBtYWNyb3MoY2gpO1xuICB2YXIgZm9ybSA9IHJlYWRNYWNybyA/XG4gICAgcmVhZE1hY3JvKHJlYWRlciwgY2gpIDpcbiAgaXNOdW1iZXJMaXRlcmFsKHJlYWRlciwgY2gpID9cbiAgICByZWFkTnVtYmVyKHJlYWRlciwgY2gpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHJlYWRTeW1ib2wocmVhZGVyLCBjaCkgOlxuICAgIHZvaWQoMCk7XG4gIHJldHVybiBmb3JtID09PSByZWFkZXIgP1xuICAgIGZvcm0gOlxuICAhKChpc1N0cmluZyhmb3JtKSkgfHwgKGlzTnVtYmVyKGZvcm0pKSB8fCAoaXNCb29sZWFuKGZvcm0pKSB8fCAoaXNOaWwoZm9ybSkpIHx8IChpc0tleXdvcmQoZm9ybSkpKSA/XG4gICAgd2l0aE1ldGEoZm9ybSwgY29uaih7XG4gICAgICBcInN0YXJ0XCI6IHN0YXJ0LFxuICAgICAgXCJlbmRcIjoge1xuICAgICAgICBcImxpbmVcIjogKHJlYWRlciB8fCAwKVtcImxpbmVcIl0sXG4gICAgICAgIFwiY29sdW1uXCI6IChyZWFkZXIgfHwgMClbXCJjb2x1bW5cIl1cbiAgICAgIH1cbiAgICB9LCBtZXRhKGZvcm0pKSkgOlxuICBcImVsc2VcIiA/XG4gICAgZm9ybSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnJlYWRGb3JtID0gcmVhZEZvcm07XG5cbnZhciByZWFkID0gZnVuY3Rpb24gcmVhZChyZWFkZXIsIGVvZklzRXJyb3IsIHNlbnRpbmVsLCBpc1JlY3Vyc2l2ZSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNoID0gcmVhZENoYXIocmVhZGVyKTtcbiAgICAgIHZhciBmb3JtID0gaXNOaWwoY2gpID9cbiAgICAgICAgZW9mSXNFcnJvciA/XG4gICAgICAgICAgcmVhZGVyRXJyb3IocmVhZGVyLCBcIkVPRlwiKSA6XG4gICAgICAgICAgc2VudGluZWwgOlxuICAgICAgaXNXaGl0ZXNwYWNlKGNoKSA/XG4gICAgICAgIHJlYWRlciA6XG4gICAgICBpc0NvbW1lbnRQcmVmaXgoY2gpID9cbiAgICAgICAgcmVhZChyZWFkQ29tbWVudChyZWFkZXIsIGNoKSwgZW9mSXNFcnJvciwgc2VudGluZWwsIGlzUmVjdXJzaXZlKSA6XG4gICAgICBcImVsc2VcIiA/XG4gICAgICAgIHJlYWRGb3JtKHJlYWRlciwgY2gpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICAgIHJldHVybiBmb3JtID09PSByZWFkZXIgP1xuICAgICAgICAobG9vcCkgOlxuICAgICAgICBmb3JtO1xuICAgIH0pKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKCk7XG59O1xuZXhwb3J0cy5yZWFkID0gcmVhZDtcblxudmFyIHJlYWRfID0gZnVuY3Rpb24gcmVhZF8oc291cmNlLCB1cmkpIHtcbiAgdmFyIHJlYWRlciA9IHB1c2hCYWNrUmVhZGVyKHNvdXJjZSwgdXJpKTtcbiAgdmFyIGVvZiA9IGdlbnN5bSgpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoZm9ybXMsIGZvcm0pIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBmb3JtID09PSBlb2YgP1xuICAgICAgZm9ybXMgOlxuICAgICAgKGZvcm1zID0gY29uaihmb3JtcywgZm9ybSksIGZvcm0gPSByZWFkKHJlYWRlciwgZmFsc2UsIGVvZiwgZmFsc2UpLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoW10sIHJlYWQocmVhZGVyLCBmYWxzZSwgZW9mLCBmYWxzZSkpO1xufTtcbmV4cG9ydHMucmVhZF8gPSByZWFkXztcblxudmFyIHJlYWRGcm9tU3RyaW5nID0gZnVuY3Rpb24gcmVhZEZyb21TdHJpbmcoc291cmNlLCB1cmkpIHtcbiAgdmFyIHJlYWRlciA9IHB1c2hCYWNrUmVhZGVyKHNvdXJjZSwgdXJpKTtcbiAgcmV0dXJuIHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCBmYWxzZSk7XG59O1xuZXhwb3J0cy5yZWFkRnJvbVN0cmluZyA9IHJlYWRGcm9tU3RyaW5nO1xuXG52YXIgcmVhZFV1aWQgPSBmdW5jdGlvbiByZWFkVXVpZCh1dWlkKSB7XG4gIHJldHVybiBpc1N0cmluZyh1dWlkKSA/XG4gICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJVVUlELlwiKSwgdXVpZCkgOlxuICAgIHJlYWRlckVycm9yKHZvaWQoMCksIFwiVVVJRCBsaXRlcmFsIGV4cGVjdHMgYSBzdHJpbmcgYXMgaXRzIHJlcHJlc2VudGF0aW9uLlwiKTtcbn07XG5cbnZhciByZWFkUXVldWUgPSBmdW5jdGlvbiByZWFkUXVldWUoaXRlbXMpIHtcbiAgcmV0dXJuIGlzVmVjdG9yKGl0ZW1zKSA/XG4gICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJQZXJzaXN0ZW50UXVldWUuXCIpLCBpdGVtcykgOlxuICAgIHJlYWRlckVycm9yKHZvaWQoMCksIFwiUXVldWUgbGl0ZXJhbCBleHBlY3RzIGEgdmVjdG9yIGZvciBpdHMgZWxlbWVudHMuXCIpO1xufTtcblxudmFyIF9fdGFnVGFibGVfXyA9IGRpY3Rpb25hcnkoXCJ1dWlkXCIsIHJlYWRVdWlkLCBcInF1ZXVlXCIsIHJlYWRRdWV1ZSk7XG5leHBvcnRzLl9fdGFnVGFibGVfXyA9IF9fdGFnVGFibGVfXztcblxudmFyIG1heWJlUmVhZFRhZ2dlZFR5cGUgPSBmdW5jdGlvbiBtYXliZVJlYWRUYWdnZWRUeXBlKHJlYWRlciwgaW5pdGNoKSB7XG4gIHZhciB0YWcgPSByZWFkU3ltYm9sKHJlYWRlciwgaW5pdGNoKTtcbiAgdmFyIHBmbiA9IChfX3RhZ1RhYmxlX18gfHwgMClbbmFtZSh0YWcpXTtcbiAgcmV0dXJuIHBmbiA/XG4gICAgcGZuKHJlYWQocmVhZGVyLCB0cnVlLCB2b2lkKDApLCBmYWxzZSkpIDpcbiAgICByZWFkZXJFcnJvcihyZWFkZXIsIFwiXCIgKyBcIkNvdWxkIG5vdCBmaW5kIHRhZyBwYXJzZXIgZm9yIFwiICsgKG5hbWUodGFnKSkgKyBcIiBpbiBcIiArIChcIlwiICsgKGtleXMoX190YWdUYWJsZV9fKSkpKTtcbn07XG5leHBvcnRzLm1heWJlUmVhZFRhZ2dlZFR5cGUgPSBtYXliZVJlYWRUYWdnZWRUeXBlIiwidmFyIF9uc18gPSB7XG4gIFwiaWRcIjogXCJ3aXNwLmFzdFwiXG59O1xudmFyIHdpc3Bfc2VxdWVuY2UgPSByZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKTtcbnZhciBpc0xpc3QgPSB3aXNwX3NlcXVlbmNlLmlzTGlzdDtcbnZhciBpc1NlcXVlbnRpYWwgPSB3aXNwX3NlcXVlbmNlLmlzU2VxdWVudGlhbDtcbnZhciBmaXJzdCA9IHdpc3Bfc2VxdWVuY2UuZmlyc3Q7XG52YXIgc2Vjb25kID0gd2lzcF9zZXF1ZW5jZS5zZWNvbmQ7XG52YXIgY291bnQgPSB3aXNwX3NlcXVlbmNlLmNvdW50O1xudmFyIGxhc3QgPSB3aXNwX3NlcXVlbmNlLmxhc3Q7XG52YXIgbWFwID0gd2lzcF9zZXF1ZW5jZS5tYXA7XG52YXIgdmVjID0gd2lzcF9zZXF1ZW5jZS52ZWM7O1xudmFyIHdpc3Bfc3RyaW5nID0gcmVxdWlyZShcIi4vc3RyaW5nXCIpO1xudmFyIHNwbGl0ID0gd2lzcF9zdHJpbmcuc3BsaXQ7XG52YXIgam9pbiA9IHdpc3Bfc3RyaW5nLmpvaW47O1xudmFyIHdpc3BfcnVudGltZSA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG52YXIgaXNOaWwgPSB3aXNwX3J1bnRpbWUuaXNOaWw7XG52YXIgaXNWZWN0b3IgPSB3aXNwX3J1bnRpbWUuaXNWZWN0b3I7XG52YXIgaXNOdW1iZXIgPSB3aXNwX3J1bnRpbWUuaXNOdW1iZXI7XG52YXIgaXNTdHJpbmcgPSB3aXNwX3J1bnRpbWUuaXNTdHJpbmc7XG52YXIgaXNCb29sZWFuID0gd2lzcF9ydW50aW1lLmlzQm9vbGVhbjtcbnZhciBpc09iamVjdCA9IHdpc3BfcnVudGltZS5pc09iamVjdDtcbnZhciBpc0RhdGUgPSB3aXNwX3J1bnRpbWUuaXNEYXRlO1xudmFyIGlzUmVQYXR0ZXJuID0gd2lzcF9ydW50aW1lLmlzUmVQYXR0ZXJuO1xudmFyIGlzRGljdGlvbmFyeSA9IHdpc3BfcnVudGltZS5pc0RpY3Rpb25hcnk7XG52YXIgc3RyID0gd2lzcF9ydW50aW1lLnN0cjtcbnZhciBpbmMgPSB3aXNwX3J1bnRpbWUuaW5jO1xudmFyIHN1YnMgPSB3aXNwX3J1bnRpbWUuc3VicztcbnZhciBpc0VxdWFsID0gd2lzcF9ydW50aW1lLmlzRXF1YWw7OztcblxudmFyIHdpdGhNZXRhID0gZnVuY3Rpb24gd2l0aE1ldGEodmFsdWUsIG1ldGFkYXRhKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgXCJtZXRhZGF0YVwiLCB7XG4gICAgXCJ2YWx1ZVwiOiBtZXRhZGF0YSxcbiAgICBcImNvbmZpZ3VyYWJsZVwiOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gdmFsdWU7XG59O1xuZXhwb3J0cy53aXRoTWV0YSA9IHdpdGhNZXRhO1xuXG52YXIgbWV0YSA9IGZ1bmN0aW9uIG1ldGEodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSA/XG4gICAgdmFsdWUubWV0YWRhdGEgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5tZXRhID0gbWV0YTtcblxudmFyIF9fbnNTZXBhcmF0b3JfXyA9IFwi4oGEXCI7XG5leHBvcnRzLl9fbnNTZXBhcmF0b3JfXyA9IF9fbnNTZXBhcmF0b3JfXztcblxudmFyIFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbChuYW1lc3BhY2UsIG5hbWUpIHtcbiAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuU3ltYm9sLnR5cGUgPSBcIndpc3Auc3ltYm9sXCI7XG5cblN5bWJvbC5wcm90b3R5cGUudHlwZSA9IFN5bWJvbC50eXBlO1xuXG5TeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHZhciBucyA9IG5hbWVzcGFjZSh0aGlzKTtcbiAgcmV0dXJuIG5zID9cbiAgICBcIlwiICsgbnMgKyBcIi9cIiArIChuYW1lKHRoaXMpKSA6XG4gICAgXCJcIiArIChuYW1lKHRoaXMpKTtcbn07XG5cbnZhciBzeW1ib2wgPSBmdW5jdGlvbiBzeW1ib2wobnMsIGlkKSB7XG4gIHJldHVybiBpc1N5bWJvbChucykgP1xuICAgIG5zIDpcbiAgaXNLZXl3b3JkKG5zKSA/XG4gICAgbmV3IFN5bWJvbChuYW1lc3BhY2UobnMpLCBuYW1lKG5zKSkgOlxuICBpc05pbChpZCkgP1xuICAgIG5ldyBTeW1ib2wodm9pZCgwKSwgbnMpIDpcbiAgXCJlbHNlXCIgP1xuICAgIG5ldyBTeW1ib2wobnMsIGlkKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLnN5bWJvbCA9IHN5bWJvbDtcblxudmFyIGlzU3ltYm9sID0gZnVuY3Rpb24gaXNTeW1ib2woeCkge1xuICByZXR1cm4geCAmJiAoU3ltYm9sLnR5cGUgPT09IHgudHlwZSk7XG59O1xuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG52YXIgaXNLZXl3b3JkID0gZnVuY3Rpb24gaXNLZXl3b3JkKHgpIHtcbiAgcmV0dXJuIChpc1N0cmluZyh4KSkgJiYgKGNvdW50KHgpID4gMSkgJiYgKGZpcnN0KHgpID09PSBcIuqeiVwiKTtcbn07XG5leHBvcnRzLmlzS2V5d29yZCA9IGlzS2V5d29yZDtcblxudmFyIGtleXdvcmQgPSBmdW5jdGlvbiBrZXl3b3JkKG5zLCBpZCkge1xuICByZXR1cm4gaXNLZXl3b3JkKG5zKSA/XG4gICAgbnMgOlxuICBpc1N5bWJvbChucykgP1xuICAgIFwiXCIgKyBcIuqeiVwiICsgKG5hbWUobnMpKSA6XG4gIGlzTmlsKGlkKSA/XG4gICAgXCJcIiArIFwi6p6JXCIgKyBucyA6XG4gIGlzTmlsKG5zKSA/XG4gICAgXCJcIiArIFwi6p6JXCIgKyBpZCA6XG4gIFwiZWxzZVwiID9cbiAgICBcIlwiICsgXCLqnolcIiArIG5zICsgX19uc1NlcGFyYXRvcl9fICsgaWQgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5rZXl3b3JkID0ga2V5d29yZDtcblxudmFyIGtleXdvcmROYW1lID0gZnVuY3Rpb24ga2V5d29yZE5hbWUodmFsdWUpIHtcbiAgcmV0dXJuIGxhc3Qoc3BsaXQoc3Vicyh2YWx1ZSwgMSksIF9fbnNTZXBhcmF0b3JfXykpO1xufTtcblxudmFyIG5hbWUgPSBmdW5jdGlvbiBuYW1lKHZhbHVlKSB7XG4gIHJldHVybiBpc1N5bWJvbCh2YWx1ZSkgP1xuICAgIHZhbHVlLm5hbWUgOlxuICBpc0tleXdvcmQodmFsdWUpID9cbiAgICBrZXl3b3JkTmFtZSh2YWx1ZSkgOlxuICBpc1N0cmluZyh2YWx1ZSkgP1xuICAgIHZhbHVlIDpcbiAgXCJlbHNlXCIgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlwiICsgXCJEb2Vzbid0IHN1cHBvcnQgbmFtZTogXCIgKyB2YWx1ZSk7IH0pKCkgOlxuICAgIHZvaWQoMCk7XG59O1xuZXhwb3J0cy5uYW1lID0gbmFtZTtcblxudmFyIGtleXdvcmROYW1lc3BhY2UgPSBmdW5jdGlvbiBrZXl3b3JkTmFtZXNwYWNlKHgpIHtcbiAgdmFyIHBhcnRzID0gc3BsaXQoc3Vicyh4LCAxKSwgX19uc1NlcGFyYXRvcl9fKTtcbiAgcmV0dXJuIGNvdW50KHBhcnRzKSA+IDEgP1xuICAgIChwYXJ0cyB8fCAwKVswXSA6XG4gICAgdm9pZCgwKTtcbn07XG5cbnZhciBuYW1lc3BhY2UgPSBmdW5jdGlvbiBuYW1lc3BhY2UoeCkge1xuICByZXR1cm4gaXNTeW1ib2woeCkgP1xuICAgIHgubmFtZXNwYWNlIDpcbiAgaXNLZXl3b3JkKHgpID9cbiAgICBrZXl3b3JkTmFtZXNwYWNlKHgpIDpcbiAgXCJlbHNlXCIgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlwiICsgXCJEb2Vzbid0IHN1cHBvcnRzIG5hbWVzcGFjZTogXCIgKyB4KTsgfSkoKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblxudmFyIGdlbnN5bSA9IGZ1bmN0aW9uIGdlbnN5bShwcmVmaXgpIHtcbiAgcmV0dXJuIHN5bWJvbChcIlwiICsgKGlzTmlsKHByZWZpeCkgP1xuICAgIFwiR19fXCIgOlxuICAgIHByZWZpeCkgKyAoZ2Vuc3ltLmJhc2UgPSBnZW5zeW0uYmFzZSArIDEpKTtcbn07XG5leHBvcnRzLmdlbnN5bSA9IGdlbnN5bTtcblxuZ2Vuc3ltLmJhc2UgPSAwO1xuXG52YXIgaXNVbnF1b3RlID0gZnVuY3Rpb24gaXNVbnF1b3RlKGZvcm0pIHtcbiAgcmV0dXJuIChpc0xpc3QoZm9ybSkpICYmIChpc0VxdWFsKGZpcnN0KGZvcm0pLCBzeW1ib2wodm9pZCgwKSwgXCJ1bnF1b3RlXCIpKSk7XG59O1xuZXhwb3J0cy5pc1VucXVvdGUgPSBpc1VucXVvdGU7XG5cbnZhciBpc1VucXVvdGVTcGxpY2luZyA9IGZ1bmN0aW9uIGlzVW5xdW90ZVNwbGljaW5nKGZvcm0pIHtcbiAgcmV0dXJuIChpc0xpc3QoZm9ybSkpICYmIChpc0VxdWFsKGZpcnN0KGZvcm0pLCBzeW1ib2wodm9pZCgwKSwgXCJ1bnF1b3RlLXNwbGljaW5nXCIpKSk7XG59O1xuZXhwb3J0cy5pc1VucXVvdGVTcGxpY2luZyA9IGlzVW5xdW90ZVNwbGljaW5nO1xuXG52YXIgaXNRdW90ZSA9IGZ1bmN0aW9uIGlzUXVvdGUoZm9ybSkge1xuICByZXR1cm4gKGlzTGlzdChmb3JtKSkgJiYgKGlzRXF1YWwoZmlyc3QoZm9ybSksIHN5bWJvbCh2b2lkKDApLCBcInF1b3RlXCIpKSk7XG59O1xuZXhwb3J0cy5pc1F1b3RlID0gaXNRdW90ZTtcblxudmFyIGlzU3ludGF4UXVvdGUgPSBmdW5jdGlvbiBpc1N5bnRheFF1b3RlKGZvcm0pIHtcbiAgcmV0dXJuIChpc0xpc3QoZm9ybSkpICYmIChpc0VxdWFsKGZpcnN0KGZvcm0pLCBzeW1ib2wodm9pZCgwKSwgXCJzeW50YXgtcXVvdGVcIikpKTtcbn07XG5leHBvcnRzLmlzU3ludGF4UXVvdGUgPSBpc1N5bnRheFF1b3RlO1xuXG52YXIgbm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKG4sIGxlbikge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AobnMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBjb3VudChucykgPCBsZW4gP1xuICAgICAgKG5zID0gXCJcIiArIFwiMFwiICsgbnMsIGxvb3ApIDpcbiAgICAgIG5zO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiICsgbik7XG59O1xuXG52YXIgcXVvdGVTdHJpbmcgPSBmdW5jdGlvbiBxdW90ZVN0cmluZyhzKSB7XG4gIHMgPSBqb2luKFwiXFxcXFxcXCJcIiwgc3BsaXQocywgXCJcXFwiXCIpKTtcbiAgcyA9IGpvaW4oXCJcXFxcXFxcXFwiLCBzcGxpdChzLCBcIlxcXFxcIikpO1xuICBzID0gam9pbihcIlxcXFxiXCIsIHNwbGl0KHMsIFwiXGJcIikpO1xuICBzID0gam9pbihcIlxcXFxmXCIsIHNwbGl0KHMsIFwiXGZcIikpO1xuICBzID0gam9pbihcIlxcXFxuXCIsIHNwbGl0KHMsIFwiXFxuXCIpKTtcbiAgcyA9IGpvaW4oXCJcXFxcclwiLCBzcGxpdChzLCBcIlxcclwiKSk7XG4gIHMgPSBqb2luKFwiXFxcXHRcIiwgc3BsaXQocywgXCJcXHRcIikpO1xuICByZXR1cm4gXCJcIiArIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xufTtcbmV4cG9ydHMucXVvdGVTdHJpbmcgPSBxdW90ZVN0cmluZztcblxudmFyIHByU3RyID0gZnVuY3Rpb24gcHJTdHIoeCkge1xuICByZXR1cm4gaXNOaWwoeCkgP1xuICAgIFwibmlsXCIgOlxuICBpc0tleXdvcmQoeCkgP1xuICAgIG5hbWVzcGFjZSh4KSA/XG4gICAgICBcIlwiICsgXCI6XCIgKyAobmFtZXNwYWNlKHgpKSArIFwiL1wiICsgKG5hbWUoeCkpIDpcbiAgICAgIFwiXCIgKyBcIjpcIiArIChuYW1lKHgpKSA6XG4gIGlzU3RyaW5nKHgpID9cbiAgICBxdW90ZVN0cmluZyh4KSA6XG4gIGlzRGF0ZSh4KSA/XG4gICAgXCJcIiArIFwiI2luc3QgXFxcIlwiICsgKHguZ2V0VVRDRnVsbFllYXIoKSkgKyBcIi1cIiArIChub3JtYWxpemUoaW5jKHguZ2V0VVRDTW9udGgoKSksIDIpKSArIFwiLVwiICsgKG5vcm1hbGl6ZSh4LmdldFVUQ0RhdGUoKSwgMikpICsgXCJUXCIgKyAobm9ybWFsaXplKHguZ2V0VVRDSG91cnMoKSwgMikpICsgXCI6XCIgKyAobm9ybWFsaXplKHguZ2V0VVRDTWludXRlcygpLCAyKSkgKyBcIjpcIiArIChub3JtYWxpemUoeC5nZXRVVENTZWNvbmRzKCksIDIpKSArIFwiLlwiICsgKG5vcm1hbGl6ZSh4LmdldFVUQ01pbGxpc2Vjb25kcygpLCAzKSkgKyBcIi1cIiArIFwiMDA6MDBcXFwiXCIgOlxuICBpc1ZlY3Rvcih4KSA/XG4gICAgXCJcIiArIFwiW1wiICsgKGpvaW4oXCIgXCIsIG1hcChwclN0ciwgdmVjKHgpKSkpICsgXCJdXCIgOlxuICBpc0RpY3Rpb25hcnkoeCkgP1xuICAgIFwiXCIgKyBcIntcIiArIChqb2luKFwiLCBcIiwgbWFwKGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgIHJldHVybiBcIlwiICsgKHByU3RyKGZpcnN0KHBhaXIpKSkgKyBcIiBcIiArIChwclN0cihzZWNvbmQocGFpcikpKTtcbiAgICB9LCB4KSkpICsgXCJ9XCIgOlxuICBpc1NlcXVlbnRpYWwoeCkgP1xuICAgIFwiXCIgKyBcIihcIiArIChqb2luKFwiIFwiLCBtYXAocHJTdHIsIHZlYyh4KSkpKSArIFwiKVwiIDpcbiAgaXNSZVBhdHRlcm4oeCkgP1xuICAgIFwiXCIgKyBcIiNcXFwiXCIgKyAoam9pbihcIlxcXFwvXCIsIHNwbGl0KHguc291cmNlLCBcIi9cIikpKSArIFwiXFxcIlwiIDpcbiAgXCJlbHNlXCIgP1xuICAgIFwiXCIgKyB4IDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMucHJTdHIgPSBwclN0ciIsInZhciBfbnNfID0ge1xuICBcImlkXCI6IFwid2lzcC5jb21waWxlclwiLFxuICBcImRvY1wiOiBcIndpc3AgbGFuZ3VhZ2UgY29tcGlsZXJcIlxufTtcbnZhciB3aXNwX3JlYWRlciA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbnZhciByZWFkRnJvbVN0cmluZyA9IHdpc3BfcmVhZGVyLnJlYWRGcm9tU3RyaW5nOztcbnZhciB3aXNwX2FzdCA9IHJlcXVpcmUoXCIuL2FzdFwiKTtcbnZhciBtZXRhID0gd2lzcF9hc3QubWV0YTtcbnZhciB3aXRoTWV0YSA9IHdpc3BfYXN0LndpdGhNZXRhO1xudmFyIGlzU3ltYm9sID0gd2lzcF9hc3QuaXNTeW1ib2w7XG52YXIgc3ltYm9sID0gd2lzcF9hc3Quc3ltYm9sO1xudmFyIGlzS2V5d29yZCA9IHdpc3BfYXN0LmlzS2V5d29yZDtcbnZhciBrZXl3b3JkID0gd2lzcF9hc3Qua2V5d29yZDtcbnZhciBuYW1lc3BhY2UgPSB3aXNwX2FzdC5uYW1lc3BhY2U7XG52YXIgaXNVbnF1b3RlID0gd2lzcF9hc3QuaXNVbnF1b3RlO1xudmFyIGlzVW5xdW90ZVNwbGljaW5nID0gd2lzcF9hc3QuaXNVbnF1b3RlU3BsaWNpbmc7XG52YXIgaXNRdW90ZSA9IHdpc3BfYXN0LmlzUXVvdGU7XG52YXIgaXNTeW50YXhRdW90ZSA9IHdpc3BfYXN0LmlzU3ludGF4UXVvdGU7XG52YXIgbmFtZSA9IHdpc3BfYXN0Lm5hbWU7XG52YXIgZ2Vuc3ltID0gd2lzcF9hc3QuZ2Vuc3ltO1xudmFyIHByU3RyID0gd2lzcF9hc3QucHJTdHI7O1xudmFyIHdpc3Bfc2VxdWVuY2UgPSByZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKTtcbnZhciBpc0VtcHR5ID0gd2lzcF9zZXF1ZW5jZS5pc0VtcHR5O1xudmFyIGNvdW50ID0gd2lzcF9zZXF1ZW5jZS5jb3VudDtcbnZhciBpc0xpc3QgPSB3aXNwX3NlcXVlbmNlLmlzTGlzdDtcbnZhciBsaXN0ID0gd2lzcF9zZXF1ZW5jZS5saXN0O1xudmFyIGZpcnN0ID0gd2lzcF9zZXF1ZW5jZS5maXJzdDtcbnZhciBzZWNvbmQgPSB3aXNwX3NlcXVlbmNlLnNlY29uZDtcbnZhciB0aGlyZCA9IHdpc3Bfc2VxdWVuY2UudGhpcmQ7XG52YXIgcmVzdCA9IHdpc3Bfc2VxdWVuY2UucmVzdDtcbnZhciBjb25zID0gd2lzcF9zZXF1ZW5jZS5jb25zO1xudmFyIGNvbmogPSB3aXNwX3NlcXVlbmNlLmNvbmo7XG52YXIgcmV2ZXJzZSA9IHdpc3Bfc2VxdWVuY2UucmV2ZXJzZTtcbnZhciByZWR1Y2UgPSB3aXNwX3NlcXVlbmNlLnJlZHVjZTtcbnZhciB2ZWMgPSB3aXNwX3NlcXVlbmNlLnZlYztcbnZhciBsYXN0ID0gd2lzcF9zZXF1ZW5jZS5sYXN0O1xudmFyIHJlcGVhdCA9IHdpc3Bfc2VxdWVuY2UucmVwZWF0O1xudmFyIG1hcCA9IHdpc3Bfc2VxdWVuY2UubWFwO1xudmFyIGZpbHRlciA9IHdpc3Bfc2VxdWVuY2UuZmlsdGVyO1xudmFyIHRha2UgPSB3aXNwX3NlcXVlbmNlLnRha2U7XG52YXIgY29uY2F0ID0gd2lzcF9zZXF1ZW5jZS5jb25jYXQ7XG52YXIgaXNTZXEgPSB3aXNwX3NlcXVlbmNlLmlzU2VxOztcbnZhciB3aXNwX3J1bnRpbWUgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xudmFyIGlzT2RkID0gd2lzcF9ydW50aW1lLmlzT2RkO1xudmFyIGlzRGljdGlvbmFyeSA9IHdpc3BfcnVudGltZS5pc0RpY3Rpb25hcnk7XG52YXIgZGljdGlvbmFyeSA9IHdpc3BfcnVudGltZS5kaWN0aW9uYXJ5O1xudmFyIG1lcmdlID0gd2lzcF9ydW50aW1lLm1lcmdlO1xudmFyIGtleXMgPSB3aXNwX3J1bnRpbWUua2V5cztcbnZhciB2YWxzID0gd2lzcF9ydW50aW1lLnZhbHM7XG52YXIgaXNDb250YWluc1ZlY3RvciA9IHdpc3BfcnVudGltZS5pc0NvbnRhaW5zVmVjdG9yO1xudmFyIG1hcERpY3Rpb25hcnkgPSB3aXNwX3J1bnRpbWUubWFwRGljdGlvbmFyeTtcbnZhciBpc1N0cmluZyA9IHdpc3BfcnVudGltZS5pc1N0cmluZztcbnZhciBpc051bWJlciA9IHdpc3BfcnVudGltZS5pc051bWJlcjtcbnZhciBpc1ZlY3RvciA9IHdpc3BfcnVudGltZS5pc1ZlY3RvcjtcbnZhciBpc0Jvb2xlYW4gPSB3aXNwX3J1bnRpbWUuaXNCb29sZWFuO1xudmFyIHN1YnMgPSB3aXNwX3J1bnRpbWUuc3VicztcbnZhciByZUZpbmQgPSB3aXNwX3J1bnRpbWUucmVGaW5kO1xudmFyIGlzVHJ1ZSA9IHdpc3BfcnVudGltZS5pc1RydWU7XG52YXIgaXNGYWxzZSA9IHdpc3BfcnVudGltZS5pc0ZhbHNlO1xudmFyIGlzTmlsID0gd2lzcF9ydW50aW1lLmlzTmlsO1xudmFyIGlzUmVQYXR0ZXJuID0gd2lzcF9ydW50aW1lLmlzUmVQYXR0ZXJuO1xudmFyIGluYyA9IHdpc3BfcnVudGltZS5pbmM7XG52YXIgZGVjID0gd2lzcF9ydW50aW1lLmRlYztcbnZhciBzdHIgPSB3aXNwX3J1bnRpbWUuc3RyO1xudmFyIGNoYXIgPSB3aXNwX3J1bnRpbWUuY2hhcjtcbnZhciBpbnQgPSB3aXNwX3J1bnRpbWUuaW50O1xudmFyIGlzRXF1YWwgPSB3aXNwX3J1bnRpbWUuaXNFcXVhbDtcbnZhciBpc1N0cmljdEVxdWFsID0gd2lzcF9ydW50aW1lLmlzU3RyaWN0RXF1YWw7O1xudmFyIHdpc3Bfc3RyaW5nID0gcmVxdWlyZShcIi4vc3RyaW5nXCIpO1xudmFyIHNwbGl0ID0gd2lzcF9zdHJpbmcuc3BsaXQ7XG52YXIgam9pbiA9IHdpc3Bfc3RyaW5nLmpvaW47XG52YXIgdXBwZXJDYXNlID0gd2lzcF9zdHJpbmcudXBwZXJDYXNlO1xudmFyIHJlcGxhY2UgPSB3aXNwX3N0cmluZy5yZXBsYWNlOztcbnZhciB3aXNwX2JhY2tlbmRfamF2YXNjcmlwdF93cml0ZXIgPSByZXF1aXJlKFwiLi9iYWNrZW5kL2phdmFzY3JpcHQvd3JpdGVyXCIpO1xudmFyIHdyaXRlUmVmZXJlbmNlID0gd2lzcF9iYWNrZW5kX2phdmFzY3JpcHRfd3JpdGVyLndyaXRlUmVmZXJlbmNlO1xudmFyIHdyaXRlS2V5d29yZFJlZmVyZW5jZSA9IHdpc3BfYmFja2VuZF9qYXZhc2NyaXB0X3dyaXRlci53cml0ZUtleXdvcmRSZWZlcmVuY2U7XG52YXIgd3JpdGVLZXl3b3JkID0gd2lzcF9iYWNrZW5kX2phdmFzY3JpcHRfd3JpdGVyLndyaXRlS2V5d29yZDtcbnZhciB3cml0ZVN5bWJvbCA9IHdpc3BfYmFja2VuZF9qYXZhc2NyaXB0X3dyaXRlci53cml0ZVN5bWJvbDtcbnZhciB3cml0ZU5pbCA9IHdpc3BfYmFja2VuZF9qYXZhc2NyaXB0X3dyaXRlci53cml0ZU5pbDtcbnZhciB3cml0ZUNvbW1lbnQgPSB3aXNwX2JhY2tlbmRfamF2YXNjcmlwdF93cml0ZXIud3JpdGVDb21tZW50O1xudmFyIHdyaXRlTnVtYmVyID0gd2lzcF9iYWNrZW5kX2phdmFzY3JpcHRfd3JpdGVyLndyaXRlTnVtYmVyO1xudmFyIHdyaXRlU3RyaW5nID0gd2lzcF9iYWNrZW5kX2phdmFzY3JpcHRfd3JpdGVyLndyaXRlU3RyaW5nO1xudmFyIHdyaXRlQm9vbGVhbiA9IHdpc3BfYmFja2VuZF9qYXZhc2NyaXB0X3dyaXRlci53cml0ZUJvb2xlYW47OztcblxudmFyIGlzU2VsZkV2YWx1YXRpbmcgPSBmdW5jdGlvbiBpc1NlbGZFdmFsdWF0aW5nKGZvcm0pIHtcbiAgcmV0dXJuIChpc051bWJlcihmb3JtKSkgfHwgKChpc1N0cmluZyhmb3JtKSkgJiYgKCEoaXNTeW1ib2woZm9ybSkpKSAmJiAoIShpc0tleXdvcmQoZm9ybSkpKSkgfHwgKGlzQm9vbGVhbihmb3JtKSkgfHwgKGlzTmlsKGZvcm0pKSB8fCAoaXNSZVBhdHRlcm4oZm9ybSkpO1xufTtcbmV4cG9ydHMuaXNTZWxmRXZhbHVhdGluZyA9IGlzU2VsZkV2YWx1YXRpbmc7XG5cbnZhciBfX21hY3Jvc19fID0ge307XG5leHBvcnRzLl9fbWFjcm9zX18gPSBfX21hY3Jvc19fO1xuXG52YXIgZXhlY3V0ZU1hY3JvID0gZnVuY3Rpb24gZXhlY3V0ZU1hY3JvKG5hbWUsIGZvcm0pIHtcbiAgcmV0dXJuIChfX21hY3Jvc19fIHx8IDApW25hbWVdLmFwcGx5KChfX21hY3Jvc19fIHx8IDApW25hbWVdLCB2ZWMoZm9ybSkpO1xufTtcbmV4cG9ydHMuZXhlY3V0ZU1hY3JvID0gZXhlY3V0ZU1hY3JvO1xuXG52YXIgaW5zdGFsbE1hY3JvID0gZnVuY3Rpb24gaW5zdGFsbE1hY3JvKG5hbWUsIG1hY3JvRm4pIHtcbiAgcmV0dXJuIChfX21hY3Jvc19fIHx8IDApW25hbWVdID0gbWFjcm9Gbjtcbn07XG5leHBvcnRzLmluc3RhbGxNYWNybyA9IGluc3RhbGxNYWNybztcblxudmFyIGlzTWFjcm8gPSBmdW5jdGlvbiBpc01hY3JvKG5hbWUpIHtcbiAgcmV0dXJuIChpc1N5bWJvbChuYW1lKSkgJiYgKChfX21hY3Jvc19fIHx8IDApW25hbWVdKSAmJiB0cnVlO1xufTtcbmV4cG9ydHMuaXNNYWNybyA9IGlzTWFjcm87XG5cbnZhciBtYWtlTWFjcm8gPSBmdW5jdGlvbiBtYWtlTWFjcm8ocGF0dGVybiwgYm9keSkge1xuICB2YXIgbWFjcm9GbiA9IGNvbmNhdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcImZuXCIpLCBwYXR0ZXJuKSwgYm9keSk7XG4gIHJldHVybiBldmFsKFwiXCIgKyBcIihcIiArIChjb21waWxlKG1hY3JvZXhwYW5kKG1hY3JvRm4pKSkgKyBcIilcIik7XG59O1xuZXhwb3J0cy5tYWtlTWFjcm8gPSBtYWtlTWFjcm87XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJkZWZtYWNyb1wiKSwgZnVuY3Rpb24obmFtZSwgc2lnbmF0dXJlKSB7XG4gIHZhciBib2R5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgcmV0dXJuIGluc3RhbGxNYWNybyhuYW1lLCBtYWtlTWFjcm8oc2lnbmF0dXJlLCBib2R5KSk7XG59KTtcblxudmFyIF9fc3BlY2lhbHNfXyA9IHt9O1xuZXhwb3J0cy5fX3NwZWNpYWxzX18gPSBfX3NwZWNpYWxzX187XG5cbnZhciBpbnN0YWxsU3BlY2lhbCA9IGZ1bmN0aW9uIGluc3RhbGxTcGVjaWFsKG5hbWUsIGYsIHZhbGlkYXRvcikge1xuICByZXR1cm4gKF9fc3BlY2lhbHNfXyB8fCAwKVtuYW1lXSA9IGZ1bmN0aW9uKGZvcm0pIHtcbiAgICB2YWxpZGF0b3IgP1xuICAgICAgdmFsaWRhdG9yKGZvcm0pIDpcbiAgICAgIHZvaWQoMCk7XG4gICAgcmV0dXJuIGYod2l0aE1ldGEocmVzdChmb3JtKSwgbWV0YShmb3JtKSkpO1xuICB9O1xufTtcbmV4cG9ydHMuaW5zdGFsbFNwZWNpYWwgPSBpbnN0YWxsU3BlY2lhbDtcblxudmFyIGlzU3BlY2lhbCA9IGZ1bmN0aW9uIGlzU3BlY2lhbChuYW1lKSB7XG4gIHJldHVybiAoaXNTeW1ib2wobmFtZSkpICYmICgoX19zcGVjaWFsc19fIHx8IDApW25hbWVdKSAmJiB0cnVlO1xufTtcbmV4cG9ydHMuaXNTcGVjaWFsID0gaXNTcGVjaWFsO1xuXG52YXIgZXhlY3V0ZVNwZWNpYWwgPSBmdW5jdGlvbiBleGVjdXRlU3BlY2lhbChuYW1lLCBmb3JtKSB7XG4gIHJldHVybiAoKF9fc3BlY2lhbHNfXyB8fCAwKVtuYW1lXSkoZm9ybSk7XG59O1xuZXhwb3J0cy5leGVjdXRlU3BlY2lhbCA9IGV4ZWN1dGVTcGVjaWFsO1xuXG52YXIgb3B0ID0gZnVuY3Rpb24gb3B0KGFyZ3VtZW50LCBmYWxsYmFjaykge1xuICByZXR1cm4gKGlzTmlsKGFyZ3VtZW50KSkgfHwgKGlzRW1wdHkoYXJndW1lbnQpKSA/XG4gICAgZmFsbGJhY2sgOlxuICAgIGZpcnN0KGFyZ3VtZW50KTtcbn07XG5leHBvcnRzLm9wdCA9IG9wdDtcblxudmFyIGFwcGx5Rm9ybSA9IGZ1bmN0aW9uIGFwcGx5Rm9ybShmbk5hbWUsIGZvcm0sIGlzUXVvdGVkKSB7XG4gIHJldHVybiBjb25zKGZuTmFtZSwgaXNRdW90ZWQgP1xuICAgIG1hcChmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gbGlzdChzeW1ib2wodm9pZCgwKSwgXCJxdW90ZVwiKSwgZSk7XG4gICAgfSwgZm9ybSkgOlxuICAgIGZvcm0sIGZvcm0pO1xufTtcbmV4cG9ydHMuYXBwbHlGb3JtID0gYXBwbHlGb3JtO1xuXG52YXIgYXBwbHlVbnF1b3RlZEZvcm0gPSBmdW5jdGlvbiBhcHBseVVucXVvdGVkRm9ybShmbk5hbWUsIGZvcm0pIHtcbiAgcmV0dXJuIGNvbnMoZm5OYW1lLCBtYXAoZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBpc1VucXVvdGUoZSkgP1xuICAgICAgc2Vjb25kKGUpIDpcbiAgICAoaXNMaXN0KGUpKSAmJiAoaXNLZXl3b3JkKGZpcnN0KGUpKSkgP1xuICAgICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJzeW50YXgtcXVvdGVcIiksIHNlY29uZChlKSkgOlxuICAgICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJzeW50YXgtcXVvdGVcIiksIGUpO1xuICB9LCBmb3JtKSk7XG59O1xuZXhwb3J0cy5hcHBseVVucXVvdGVkRm9ybSA9IGFwcGx5VW5xdW90ZWRGb3JtO1xuXG52YXIgc3BsaXRTcGxpY2VzID0gZnVuY3Rpb24gc3BsaXRTcGxpY2VzKGZvcm0sIGZuTmFtZSkge1xuICB2YXIgbWFrZVNwbGljZSA9IGZ1bmN0aW9uIG1ha2VTcGxpY2UoZm9ybSkge1xuICAgIHJldHVybiAoaXNTZWxmRXZhbHVhdGluZyhmb3JtKSkgfHwgKGlzU3ltYm9sKGZvcm0pKSA/XG4gICAgICBhcHBseVVucXVvdGVkRm9ybShmbk5hbWUsIGxpc3QoZm9ybSkpIDpcbiAgICAgIGFwcGx5VW5xdW90ZWRGb3JtKGZuTmFtZSwgZm9ybSk7XG4gIH07XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChub2Rlcywgc2xpY2VzLCBhY2MpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KG5vZGVzKSA/XG4gICAgICByZXZlcnNlKGlzRW1wdHkoYWNjKSA/XG4gICAgICAgIHNsaWNlcyA6XG4gICAgICAgIGNvbnMobWFrZVNwbGljZShyZXZlcnNlKGFjYykpLCBzbGljZXMpKSA6XG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBub2RlID0gZmlyc3Qobm9kZXMpO1xuICAgICAgICByZXR1cm4gaXNVbnF1b3RlU3BsaWNpbmcobm9kZSkgP1xuICAgICAgICAgIChub2RlcyA9IHJlc3Qobm9kZXMpLCBzbGljZXMgPSBjb25zKHNlY29uZChub2RlKSwgaXNFbXB0eShhY2MpID9cbiAgICAgICAgICAgIHNsaWNlcyA6XG4gICAgICAgICAgICBjb25zKG1ha2VTcGxpY2UocmV2ZXJzZShhY2MpKSwgc2xpY2VzKSksIGFjYyA9IGxpc3QoKSwgbG9vcCkgOlxuICAgICAgICAgIChub2RlcyA9IHJlc3Qobm9kZXMpLCBzbGljZXMgPSBzbGljZXMsIGFjYyA9IGNvbnMobm9kZSwgYWNjKSwgbG9vcCk7XG4gICAgICB9KSgpO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShmb3JtLCBsaXN0KCksIGxpc3QoKSk7XG59O1xuZXhwb3J0cy5zcGxpdFNwbGljZXMgPSBzcGxpdFNwbGljZXM7XG5cbnZhciBzeW50YXhRdW90ZVNwbGl0ID0gZnVuY3Rpb24gc3ludGF4UXVvdGVTcGxpdChhcHBlbmROYW1lLCBmbk5hbWUsIGZvcm0pIHtcbiAgdmFyIHNsaWNlcyA9IHNwbGl0U3BsaWNlcyhmb3JtLCBmbk5hbWUpO1xuICB2YXIgbiA9IGNvdW50KHNsaWNlcyk7XG4gIHJldHVybiBuID09PSAwID9cbiAgICBsaXN0KGZuTmFtZSkgOlxuICBuID09PSAxID9cbiAgICBmaXJzdChzbGljZXMpIDpcbiAgXCJkZWZhdWx0XCIgP1xuICAgIGFwcGx5Rm9ybShhcHBlbmROYW1lLCBzbGljZXMpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuc3ludGF4UXVvdGVTcGxpdCA9IHN5bnRheFF1b3RlU3BsaXQ7XG5cbnZhciBjb21waWxlT2JqZWN0ID0gZnVuY3Rpb24gY29tcGlsZU9iamVjdChmb3JtLCBpc1F1b3RlZCkge1xuICByZXR1cm4gaXNLZXl3b3JkKGZvcm0pID9cbiAgICB3cml0ZUtleXdvcmQoZm9ybSkgOlxuICBpc1N5bWJvbChmb3JtKSA/XG4gICAgd3JpdGVTeW1ib2woZm9ybSkgOlxuICBpc051bWJlcihmb3JtKSA/XG4gICAgd3JpdGVOdW1iZXIoZm9ybSkgOlxuICBpc1N0cmluZyhmb3JtKSA/XG4gICAgd3JpdGVTdHJpbmcoZm9ybSkgOlxuICBpc0Jvb2xlYW4oZm9ybSkgP1xuICAgIHdyaXRlQm9vbGVhbihmb3JtKSA6XG4gIGlzTmlsKGZvcm0pID9cbiAgICB3cml0ZU5pbChmb3JtKSA6XG4gIGlzUmVQYXR0ZXJuKGZvcm0pID9cbiAgICBjb21waWxlUmVQYXR0ZXJuKGZvcm0pIDpcbiAgaXNWZWN0b3IoZm9ybSkgP1xuICAgIGNvbXBpbGUoYXBwbHlGb3JtKHN5bWJvbCh2b2lkKDApLCBcInZlY3RvclwiKSwgbGlzdC5hcHBseShsaXN0LCBmb3JtKSwgaXNRdW90ZWQpKSA6XG4gIGlzTGlzdChmb3JtKSA/XG4gICAgY29tcGlsZShhcHBseUZvcm0oc3ltYm9sKHZvaWQoMCksIFwibGlzdFwiKSwgZm9ybSwgaXNRdW90ZWQpKSA6XG4gIGlzRGljdGlvbmFyeShmb3JtKSA/XG4gICAgY29tcGlsZURpY3Rpb25hcnkoaXNRdW90ZWQgP1xuICAgICAgbWFwRGljdGlvbmFyeShmb3JtLCBmdW5jdGlvbih4KSB7XG4gICAgICAgIHJldHVybiBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInF1b3RlXCIpLCB4KTtcbiAgICAgIH0pIDpcbiAgICAgIGZvcm0pIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuY29tcGlsZU9iamVjdCA9IGNvbXBpbGVPYmplY3Q7XG5cbnZhciBjb21waWxlU3ludGF4UXVvdGVkVmVjdG9yID0gZnVuY3Rpb24gY29tcGlsZVN5bnRheFF1b3RlZFZlY3Rvcihmb3JtKSB7XG4gIHZhciBjb25jYXRGb3JtID0gc3ludGF4UXVvdGVTcGxpdChzeW1ib2wodm9pZCgwKSwgXCJjb25jYXRcIiksIHN5bWJvbCh2b2lkKDApLCBcInZlY3RvclwiKSwgbGlzdC5hcHBseShsaXN0LCBmb3JtKSk7XG4gIHJldHVybiBjb21waWxlKGNvdW50KGNvbmNhdEZvcm0pID4gMSA/XG4gICAgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJ2ZWNcIiksIGNvbmNhdEZvcm0pIDpcbiAgICBjb25jYXRGb3JtKTtcbn07XG5leHBvcnRzLmNvbXBpbGVTeW50YXhRdW90ZWRWZWN0b3IgPSBjb21waWxlU3ludGF4UXVvdGVkVmVjdG9yO1xuXG52YXIgY29tcGlsZVN5bnRheFF1b3RlZCA9IGZ1bmN0aW9uIGNvbXBpbGVTeW50YXhRdW90ZWQoZm9ybSkge1xuICByZXR1cm4gaXNMaXN0KGZvcm0pID9cbiAgICBjb21waWxlKHN5bnRheFF1b3RlU3BsaXQoc3ltYm9sKHZvaWQoMCksIFwiY29uY2F0XCIpLCBzeW1ib2wodm9pZCgwKSwgXCJsaXN0XCIpLCBmb3JtKSkgOlxuICBpc1ZlY3Rvcihmb3JtKSA/XG4gICAgY29tcGlsZVN5bnRheFF1b3RlZFZlY3Rvcihmb3JtKSA6XG4gIFwiZWxzZVwiID9cbiAgICBjb21waWxlT2JqZWN0KGZvcm0pIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuY29tcGlsZVN5bnRheFF1b3RlZCA9IGNvbXBpbGVTeW50YXhRdW90ZWQ7XG5cbnZhciBjb21waWxlID0gZnVuY3Rpb24gY29tcGlsZShmb3JtKSB7XG4gIHJldHVybiBpc1NlbGZFdmFsdWF0aW5nKGZvcm0pID9cbiAgICBjb21waWxlT2JqZWN0KGZvcm0pIDpcbiAgaXNTeW1ib2woZm9ybSkgP1xuICAgIHdyaXRlUmVmZXJlbmNlKGZvcm0pIDpcbiAgaXNLZXl3b3JkKGZvcm0pID9cbiAgICB3cml0ZUtleXdvcmRSZWZlcmVuY2UoZm9ybSkgOlxuICBpc1ZlY3Rvcihmb3JtKSA/XG4gICAgY29tcGlsZU9iamVjdChmb3JtKSA6XG4gIGlzRGljdGlvbmFyeShmb3JtKSA/XG4gICAgY29tcGlsZU9iamVjdChmb3JtKSA6XG4gIGlzTGlzdChmb3JtKSA/XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGhlYWQgPSBmaXJzdChmb3JtKTtcbiAgICAgIHJldHVybiBpc0VtcHR5KGZvcm0pID9cbiAgICAgICAgY29tcGlsZU9iamVjdChmb3JtLCB0cnVlKSA6XG4gICAgICBpc1F1b3RlKGZvcm0pID9cbiAgICAgICAgY29tcGlsZU9iamVjdChzZWNvbmQoZm9ybSksIHRydWUpIDpcbiAgICAgIGlzU3ludGF4UXVvdGUoZm9ybSkgP1xuICAgICAgICBjb21waWxlU3ludGF4UXVvdGVkKHNlY29uZChmb3JtKSkgOlxuICAgICAgaXNTcGVjaWFsKGhlYWQpID9cbiAgICAgICAgZXhlY3V0ZVNwZWNpYWwoaGVhZCwgZm9ybSkgOlxuICAgICAgaXNLZXl3b3JkKGhlYWQpID9cbiAgICAgICAgY29tcGlsZShsaXN0KHN5bWJvbCh2b2lkKDApLCBcImdldFwiKSwgc2Vjb25kKGZvcm0pLCBoZWFkKSkgOlxuICAgICAgXCJlbHNlXCIgP1xuICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICEoKGlzU3ltYm9sKGhlYWQpKSB8fCAoaXNMaXN0KGhlYWQpKSkgP1xuICAgICAgICAgICAgKGZ1bmN0aW9uKCkgeyB0aHJvdyBjb21waWxlckVycm9yKGZvcm0sIFwiXCIgKyBcIm9wZXJhdG9yIGlzIG5vdCBhIHByb2NlZHVyZTogXCIgKyBoZWFkKTsgfSkoKSA6XG4gICAgICAgICAgICBjb21waWxlSW52b2tlKGZvcm0pO1xuICAgICAgICB9KSgpIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICB9KSgpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7XG5cbnZhciBjb21waWxlXyA9IGZ1bmN0aW9uIGNvbXBpbGVfKGZvcm1zKSB7XG4gIHJldHVybiByZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBmb3JtKSB7XG4gICAgcmV0dXJuIFwiXCIgKyByZXN1bHQgKyAoaXNFbXB0eShyZXN1bHQpID9cbiAgICAgIFwiXCIgOlxuICAgICAgXCI7XFxuXFxuXCIpICsgKGNvbXBpbGUoaXNMaXN0KGZvcm0pID9cbiAgICAgIHdpdGhNZXRhKG1hY3JvZXhwYW5kKGZvcm0pLCBjb25qKHtcbiAgICAgICAgXCJ0b3BcIjogdHJ1ZVxuICAgICAgfSwgbWV0YShmb3JtKSkpIDpcbiAgICAgIGZvcm0pKTtcbiAgfSwgXCJcIiwgZm9ybXMpO1xufTtcbmV4cG9ydHMuY29tcGlsZV8gPSBjb21waWxlXztcblxudmFyIGNvbXBpbGVQcm9ncmFtID0gZnVuY3Rpb24gY29tcGlsZVByb2dyYW0oZm9ybXMpIHtcbiAgcmV0dXJuIHJlZHVjZShmdW5jdGlvbihyZXN1bHQsIGZvcm0pIHtcbiAgICByZXR1cm4gXCJcIiArIHJlc3VsdCArIChpc0VtcHR5KHJlc3VsdCkgP1xuICAgICAgXCJcIiA6XG4gICAgICBcIjtcXG5cXG5cIikgKyAoY29tcGlsZShpc0xpc3QoZm9ybSkgP1xuICAgICAgd2l0aE1ldGEobWFjcm9leHBhbmQoZm9ybSksIGNvbmooe1xuICAgICAgICBcInRvcFwiOiB0cnVlXG4gICAgICB9LCBtZXRhKGZvcm0pKSkgOlxuICAgICAgZm9ybSkpO1xuICB9LCBcIlwiLCBmb3Jtcyk7XG59O1xuZXhwb3J0cy5jb21waWxlUHJvZ3JhbSA9IGNvbXBpbGVQcm9ncmFtO1xuXG52YXIgbWFjcm9leHBhbmQxID0gZnVuY3Rpb24gbWFjcm9leHBhbmQxKGZvcm0pIHtcbiAgcmV0dXJuIGlzTGlzdChmb3JtKSA/XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9wID0gZmlyc3QoZm9ybSk7XG4gICAgICB2YXIgaWQgPSBpc1N5bWJvbChvcCkgP1xuICAgICAgICBuYW1lKG9wKSA6XG4gICAgICAgIHZvaWQoMCk7XG4gICAgICByZXR1cm4gaXNTcGVjaWFsKG9wKSA/XG4gICAgICAgIGZvcm0gOlxuICAgICAgaXNNYWNybyhvcCkgP1xuICAgICAgICBleGVjdXRlTWFjcm8ob3AsIHJlc3QoZm9ybSkpIDpcbiAgICAgIChpc1N5bWJvbChvcCkpICYmICghKGlkID09PSBcIi5cIikpID9cbiAgICAgICAgZmlyc3QoaWQpID09PSBcIi5cIiA/XG4gICAgICAgICAgY291bnQoZm9ybSkgPCAyID9cbiAgICAgICAgICAgIChmdW5jdGlvbigpIHsgdGhyb3cgRXJyb3IoXCJNYWxmb3JtZWQgbWVtYmVyIGV4cHJlc3Npb24sIGV4cGVjdGluZyAoLm1lbWJlciB0YXJnZXQgLi4uKVwiKTsgfSkoKSA6XG4gICAgICAgICAgICBjb25zKHN5bWJvbCh2b2lkKDApLCBcIi5cIiksIGNvbnMoc2Vjb25kKGZvcm0pLCBjb25zKHN5bWJvbChzdWJzKGlkLCAxKSksIHJlc3QocmVzdChmb3JtKSkpKSkgOlxuICAgICAgICBsYXN0KGlkKSA9PT0gXCIuXCIgP1xuICAgICAgICAgIGNvbnMoc3ltYm9sKHZvaWQoMCksIFwibmV3XCIpLCBjb25zKHN5bWJvbChzdWJzKGlkLCAwLCBkZWMoY291bnQoaWQpKSkpLCByZXN0KGZvcm0pKSkgOlxuICAgICAgICAgIGZvcm0gOlxuICAgICAgXCJlbHNlXCIgP1xuICAgICAgICBmb3JtIDpcbiAgICAgICAgdm9pZCgwKTtcbiAgICB9KSgpIDpcbiAgICBmb3JtO1xufTtcbmV4cG9ydHMubWFjcm9leHBhbmQxID0gbWFjcm9leHBhbmQxO1xuXG52YXIgbWFjcm9leHBhbmQgPSBmdW5jdGlvbiBtYWNyb2V4cGFuZChmb3JtKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChvcmlnaW5hbCwgZXhwYW5kZWQpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBvcmlnaW5hbCA9PT0gZXhwYW5kZWQgP1xuICAgICAgb3JpZ2luYWwgOlxuICAgICAgKG9yaWdpbmFsID0gZXhwYW5kZWQsIGV4cGFuZGVkID0gbWFjcm9leHBhbmQxKGV4cGFuZGVkKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGZvcm0sIG1hY3JvZXhwYW5kMShmb3JtKSk7XG59O1xuZXhwb3J0cy5tYWNyb2V4cGFuZCA9IG1hY3JvZXhwYW5kO1xuXG52YXIgX2xpbmVCcmVha1BhdHRlcm5fID0gL1xcbig/PVteXFxuXSkvbTtcbmV4cG9ydHMuX2xpbmVCcmVha1BhdHRlcm5fID0gX2xpbmVCcmVha1BhdHRlcm5fO1xuXG52YXIgaW5kZW50ID0gZnVuY3Rpb24gaW5kZW50KGNvZGUsIGluZGVudGF0aW9uKSB7XG4gIHJldHVybiBqb2luKGluZGVudGF0aW9uLCBzcGxpdChjb2RlLCBfbGluZUJyZWFrUGF0dGVybl8pKTtcbn07XG5leHBvcnRzLmluZGVudCA9IGluZGVudDtcblxudmFyIGNvbXBpbGVUZW1wbGF0ZSA9IGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShmb3JtKSB7XG4gIHZhciBpbmRlbnRQYXR0ZXJuID0gL1xcbiAqJC87XG4gIHZhciBnZXRJbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICByZXR1cm4gKHJlRmluZChpbmRlbnRQYXR0ZXJuLCBjb2RlKSkgfHwgXCJcXG5cIjtcbiAgfTtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKGNvZGUsIHBhcnRzLCB2YWx1ZXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBjb3VudChwYXJ0cykgPiAxID9cbiAgICAgIChjb2RlID0gXCJcIiArIGNvZGUgKyAoZmlyc3QocGFydHMpKSArIChpbmRlbnQoXCJcIiArIChmaXJzdCh2YWx1ZXMpKSwgZ2V0SW5kZW50YXRpb24oZmlyc3QocGFydHMpKSkpLCBwYXJ0cyA9IHJlc3QocGFydHMpLCB2YWx1ZXMgPSByZXN0KHZhbHVlcyksIGxvb3ApIDpcbiAgICAgIFwiXCIgKyBjb2RlICsgKGZpcnN0KHBhcnRzKSk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFwiXCIsIHNwbGl0KGZpcnN0KGZvcm0pLCBcIn57fVwiKSwgcmVzdChmb3JtKSk7XG59O1xuZXhwb3J0cy5jb21waWxlVGVtcGxhdGUgPSBjb21waWxlVGVtcGxhdGU7XG5cbnZhciBjb21waWxlRGVmID0gZnVuY3Rpb24gY29tcGlsZURlZihmb3JtKSB7XG4gIHZhciBpZCA9IGZpcnN0KGZvcm0pO1xuICB2YXIgaXNFeHBvcnQgPSAoKCgobWV0YShmb3JtKSkgfHwge30pIHx8IDApW1widG9wXCJdKSAmJiAoISgoKChtZXRhKGlkKSkgfHwge30pIHx8IDApW1wicHJpdmF0ZVwiXSkpO1xuICB2YXIgYXR0cmlidXRlID0gc3ltYm9sKG5hbWVzcGFjZShpZCksIFwiXCIgKyBcIi1cIiArIChuYW1lKGlkKSkpO1xuICByZXR1cm4gaXNFeHBvcnQgP1xuICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwidmFyIH57fTtcXG5+e31cIiwgY29tcGlsZShjb25zKHN5bWJvbCh2b2lkKDApLCBcInNldCFcIiksIGZvcm0pKSwgY29tcGlsZShsaXN0KHN5bWJvbCh2b2lkKDApLCBcInNldCFcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiLlwiKSwgc3ltYm9sKHZvaWQoMCksIFwiZXhwb3J0c1wiKSwgYXR0cmlidXRlKSwgaWQpKSkpIDpcbiAgICBjb21waWxlVGVtcGxhdGUobGlzdChcInZhciB+e31cIiwgY29tcGlsZShjb25zKHN5bWJvbCh2b2lkKDApLCBcInNldCFcIiksIGZvcm0pKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZURlZiA9IGNvbXBpbGVEZWY7XG5cbnZhciBjb21waWxlSWZFbHNlID0gZnVuY3Rpb24gY29tcGlsZUlmRWxzZShmb3JtKSB7XG4gIHZhciBjb25kaXRpb24gPSBtYWNyb2V4cGFuZChmaXJzdChmb3JtKSk7XG4gIHZhciB0aGVuRXhwcmVzc2lvbiA9IG1hY3JvZXhwYW5kKHNlY29uZChmb3JtKSk7XG4gIHZhciBlbHNlRXhwcmVzc2lvbiA9IG1hY3JvZXhwYW5kKHRoaXJkKGZvcm0pKTtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KChpc0xpc3QoZWxzZUV4cHJlc3Npb24pKSAmJiAoaXNFcXVhbChmaXJzdChlbHNlRXhwcmVzc2lvbiksIHN5bWJvbCh2b2lkKDApLCBcImlmXCIpKSkgP1xuICAgIFwifnt9ID9cXG4gIH57fSA6XFxufnt9XCIgOlxuICAgIFwifnt9ID9cXG4gIH57fSA6XFxuICB+e31cIiwgY29tcGlsZShjb25kaXRpb24pLCBjb21waWxlKHRoZW5FeHByZXNzaW9uKSwgY29tcGlsZShlbHNlRXhwcmVzc2lvbikpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVJZkVsc2UgPSBjb21waWxlSWZFbHNlO1xuXG52YXIgY29tcGlsZURpY3Rpb25hcnkgPSBmdW5jdGlvbiBjb21waWxlRGljdGlvbmFyeShmb3JtKSB7XG4gIHZhciBib2R5ID0gKGZ1bmN0aW9uIGxvb3AoYm9keSwgbmFtZXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KG5hbWVzKSA/XG4gICAgICBib2R5IDpcbiAgICAgIChib2R5ID0gXCJcIiArIChpc05pbChib2R5KSA/XG4gICAgICAgIFwiXCIgOlxuICAgICAgICBcIlwiICsgYm9keSArIFwiLFxcblwiKSArIChjb21waWxlVGVtcGxhdGUobGlzdChcIn57fTogfnt9XCIsIGNvbXBpbGUoZmlyc3QobmFtZXMpKSwgY29tcGlsZShtYWNyb2V4cGFuZCgoZm9ybSB8fCAwKVtmaXJzdChuYW1lcyldKSkpKSksIG5hbWVzID0gcmVzdChuYW1lcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KSh2b2lkKDApLCBrZXlzKGZvcm0pKTtcbiAgcmV0dXJuIGlzTmlsKGJvZHkpID9cbiAgICBcInt9XCIgOlxuICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwie1xcbiAgfnt9XFxufVwiLCBib2R5KSk7XG59O1xuZXhwb3J0cy5jb21waWxlRGljdGlvbmFyeSA9IGNvbXBpbGVEaWN0aW9uYXJ5O1xuXG52YXIgZGVzdWdhckZuTmFtZSA9IGZ1bmN0aW9uIGRlc3VnYXJGbk5hbWUoZm9ybSkge1xuICByZXR1cm4gKGlzU3ltYm9sKGZpcnN0KGZvcm0pKSkgfHwgKGlzTmlsKGZpcnN0KGZvcm0pKSkgP1xuICAgIGZvcm0gOlxuICAgIGNvbnModm9pZCgwKSwgZm9ybSk7XG59O1xuZXhwb3J0cy5kZXN1Z2FyRm5OYW1lID0gZGVzdWdhckZuTmFtZTtcblxudmFyIGRlc3VnYXJGbkRvYyA9IGZ1bmN0aW9uIGRlc3VnYXJGbkRvYyhmb3JtKSB7XG4gIHJldHVybiAoaXNTdHJpbmcoc2Vjb25kKGZvcm0pKSkgfHwgKGlzTmlsKHNlY29uZChmb3JtKSkpID9cbiAgICBmb3JtIDpcbiAgICBjb25zKGZpcnN0KGZvcm0pLCBjb25zKHZvaWQoMCksIHJlc3QoZm9ybSkpKTtcbn07XG5leHBvcnRzLmRlc3VnYXJGbkRvYyA9IGRlc3VnYXJGbkRvYztcblxudmFyIGRlc3VnYXJGbkF0dHJzID0gZnVuY3Rpb24gZGVzdWdhckZuQXR0cnMoZm9ybSkge1xuICByZXR1cm4gKGlzRGljdGlvbmFyeSh0aGlyZChmb3JtKSkpIHx8IChpc05pbCh0aGlyZChmb3JtKSkpID9cbiAgICBmb3JtIDpcbiAgICBjb25zKGZpcnN0KGZvcm0pLCBjb25zKHNlY29uZChmb3JtKSwgY29ucyh2b2lkKDApLCByZXN0KHJlc3QoZm9ybSkpKSkpO1xufTtcbmV4cG9ydHMuZGVzdWdhckZuQXR0cnMgPSBkZXN1Z2FyRm5BdHRycztcblxudmFyIGNvbXBpbGVEZXN1Z2FyZWRGbiA9IGZ1bmN0aW9uIGNvbXBpbGVEZXN1Z2FyZWRGbihuYW1lLCBkb2MsIGF0dHJzLCBwYXJhbXMsIGJvZHkpIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShpc05pbChuYW1lKSA/XG4gICAgbGlzdChcImZ1bmN0aW9uKH57fSkge1xcbiAgfnt9XFxufVwiLCBqb2luKFwiLCBcIiwgbWFwKGNvbXBpbGUsIChwYXJhbXMgfHwgMClbXCJuYW1lc1wiXSkpLCBjb21waWxlRm5Cb2R5KG1hcChtYWNyb2V4cGFuZCwgYm9keSksIHBhcmFtcykpIDpcbiAgICBsaXN0KFwiZnVuY3Rpb24gfnt9KH57fSkge1xcbiAgfnt9XFxufVwiLCBjb21waWxlKG5hbWUpLCBqb2luKFwiLCBcIiwgbWFwKGNvbXBpbGUsIChwYXJhbXMgfHwgMClbXCJuYW1lc1wiXSkpLCBjb21waWxlRm5Cb2R5KG1hcChtYWNyb2V4cGFuZCwgYm9keSksIHBhcmFtcykpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVEZXN1Z2FyZWRGbiA9IGNvbXBpbGVEZXN1Z2FyZWRGbjtcblxudmFyIGNvbXBpbGVTdGF0ZW1lbnRzID0gZnVuY3Rpb24gY29tcGlsZVN0YXRlbWVudHMoZm9ybSwgcHJlZml4KSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIGV4cHJlc3Npb24sIGV4cHJlc3Npb25zKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gaXNFbXB0eShleHByZXNzaW9ucykgP1xuICAgICAgXCJcIiArIHJlc3VsdCArIChpc05pbChwcmVmaXgpID9cbiAgICAgICAgXCJcIiA6XG4gICAgICAgIHByZWZpeCkgKyAoY29tcGlsZShtYWNyb2V4cGFuZChleHByZXNzaW9uKSkpICsgXCI7XCIgOlxuICAgICAgKHJlc3VsdCA9IFwiXCIgKyByZXN1bHQgKyAoY29tcGlsZShtYWNyb2V4cGFuZChleHByZXNzaW9uKSkpICsgXCI7XFxuXCIsIGV4cHJlc3Npb24gPSBmaXJzdChleHByZXNzaW9ucyksIGV4cHJlc3Npb25zID0gcmVzdChleHByZXNzaW9ucyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShcIlwiLCBmaXJzdChmb3JtKSwgcmVzdChmb3JtKSk7XG59O1xuZXhwb3J0cy5jb21waWxlU3RhdGVtZW50cyA9IGNvbXBpbGVTdGF0ZW1lbnRzO1xuXG52YXIgY29tcGlsZUZuQm9keSA9IGZ1bmN0aW9uIGNvbXBpbGVGbkJvZHkoZm9ybSwgcGFyYW1zKSB7XG4gIHJldHVybiAoaXNEaWN0aW9uYXJ5KHBhcmFtcykpICYmICgocGFyYW1zIHx8IDApW1wicmVzdFwiXSkgP1xuICAgIGNvbXBpbGVTdGF0ZW1lbnRzKGNvbnMobGlzdChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIChwYXJhbXMgfHwgMClbXCJyZXN0XCJdLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcIkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJhcmd1bWVudHNcIiksIChwYXJhbXMgfHwgMClbXCJhcml0eVwiXSkpLCBmb3JtKSwgXCJyZXR1cm4gXCIpIDpcbiAgKGNvdW50KGZvcm0pID09PSAxKSAmJiAoaXNMaXN0KGZpcnN0KGZvcm0pKSkgJiYgKGlzRXF1YWwoZmlyc3QoZmlyc3QoZm9ybSkpLCBzeW1ib2wodm9pZCgwKSwgXCJkb1wiKSkpID9cbiAgICBjb21waWxlRm5Cb2R5KHJlc3QoZmlyc3QoZm9ybSkpLCBwYXJhbXMpIDpcbiAgICBjb21waWxlU3RhdGVtZW50cyhmb3JtLCBcInJldHVybiBcIik7XG59O1xuZXhwb3J0cy5jb21waWxlRm5Cb2R5ID0gY29tcGlsZUZuQm9keTtcblxudmFyIGRlc3VnYXJQYXJhbXMgPSBmdW5jdGlvbiBkZXN1Z2FyUGFyYW1zKHBhcmFtcykge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AobmFtZXMsIHBhcmFtcykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGlzRW1wdHkocGFyYW1zKSA/XG4gICAgICB7XG4gICAgICAgIFwibmFtZXNcIjogbmFtZXMsXG4gICAgICAgIFwiYXJpdHlcIjogY291bnQobmFtZXMpLFxuICAgICAgICBcInJlc3RcIjogdm9pZCgwKVxuICAgICAgfSA6XG4gICAgaXNFcXVhbChmaXJzdChwYXJhbXMpLCBzeW1ib2wodm9pZCgwKSwgXCImXCIpKSA/XG4gICAgICBpc0VxdWFsKGNvdW50KHBhcmFtcyksIDEpID9cbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZXNcIjogbmFtZXMsXG4gICAgICAgICAgXCJhcml0eVwiOiBjb3VudChuYW1lcyksXG4gICAgICAgICAgXCJyZXN0XCI6IHZvaWQoMClcbiAgICAgICAgfSA6XG4gICAgICBpc0VxdWFsKGNvdW50KHBhcmFtcyksIDIpID9cbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZXNcIjogbmFtZXMsXG4gICAgICAgICAgXCJhcml0eVwiOiBjb3VudChuYW1lcyksXG4gICAgICAgICAgXCJyZXN0XCI6IHNlY29uZChwYXJhbXMpXG4gICAgICAgIH0gOlxuICAgICAgXCJlbHNlXCIgP1xuICAgICAgICAoZnVuY3Rpb24oKSB7IHRocm93IFR5cGVFcnJvcihcIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYWZ0ZXIgJlwiKTsgfSkoKSA6XG4gICAgICAgIHZvaWQoMCkgOlxuICAgIFwiZWxzZVwiID9cbiAgICAgIChuYW1lcyA9IGNvbmoobmFtZXMsIGZpcnN0KHBhcmFtcykpLCBwYXJhbXMgPSByZXN0KHBhcmFtcyksIGxvb3ApIDpcbiAgICAgIHZvaWQoMCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdLCBwYXJhbXMpO1xufTtcbmV4cG9ydHMuZGVzdWdhclBhcmFtcyA9IGRlc3VnYXJQYXJhbXM7XG5cbnZhciBhbmFseXplT3ZlcmxvYWRlZEZuID0gZnVuY3Rpb24gYW5hbHl6ZU92ZXJsb2FkZWRGbihuYW1lLCBkb2MsIGF0dHJzLCBvdmVybG9hZHMpIHtcbiAgcmV0dXJuIG1hcChmdW5jdGlvbihvdmVybG9hZCkge1xuICAgIHZhciBwYXJhbXMgPSBkZXN1Z2FyUGFyYW1zKGZpcnN0KG92ZXJsb2FkKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwicmVzdFwiOiAocGFyYW1zIHx8IDApW1wicmVzdFwiXSxcbiAgICAgIFwibmFtZXNcIjogKHBhcmFtcyB8fCAwKVtcIm5hbWVzXCJdLFxuICAgICAgXCJhcml0eVwiOiAocGFyYW1zIHx8IDApW1wiYXJpdHlcIl0sXG4gICAgICBcImJvZHlcIjogcmVzdChvdmVybG9hZClcbiAgICB9O1xuICB9LCBvdmVybG9hZHMpO1xufTtcbmV4cG9ydHMuYW5hbHl6ZU92ZXJsb2FkZWRGbiA9IGFuYWx5emVPdmVybG9hZGVkRm47XG5cbnZhciBjb21waWxlT3ZlcmxvYWRlZEZuID0gZnVuY3Rpb24gY29tcGlsZU92ZXJsb2FkZWRGbihuYW1lLCBkb2MsIGF0dHJzLCBvdmVybG9hZHMpIHtcbiAgdmFyIG1ldGhvZHMgPSBhbmFseXplT3ZlcmxvYWRlZEZuKG5hbWUsIGRvYywgYXR0cnMsIG92ZXJsb2Fkcyk7XG4gIHZhciBmaXhlZE1ldGhvZHMgPSBmaWx0ZXIoZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuICEoKG1ldGhvZCB8fCAwKVtcInJlc3RcIl0pO1xuICB9LCBtZXRob2RzKTtcbiAgdmFyIHZhcmlhZGljID0gZmlyc3QoZmlsdGVyKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIHJldHVybiAobWV0aG9kIHx8IDApW1wicmVzdFwiXTtcbiAgfSwgbWV0aG9kcykpO1xuICB2YXIgbmFtZXMgPSByZWR1Y2UoZnVuY3Rpb24obmFtZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBjb3VudChuYW1lcykgPiAocGFyYW1zIHx8IDApW1wiYXJpdHlcIl0gP1xuICAgICAgbmFtZXMgOlxuICAgICAgKHBhcmFtcyB8fCAwKVtcIm5hbWVzXCJdO1xuICB9LCBbXSwgbWV0aG9kcyk7XG4gIHJldHVybiBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImZuXCIpLCBuYW1lLCBkb2MsIGF0dHJzLCBuYW1lcywgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJyYXcqXCIpLCBjb21waWxlU3dpdGNoKHN5bWJvbCh2b2lkKDApLCBcImFyZ3VtZW50cy5sZW5ndGhcIiksIG1hcChmdW5jdGlvbihtZXRob2QpIHtcbiAgICByZXR1cm4gY29ucygobWV0aG9kIHx8IDApW1wiYXJpdHlcIl0sIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwicmF3KlwiKSwgY29tcGlsZUZuQm9keShjb25jYXQoY29tcGlsZVJlYmluZChuYW1lcywgKG1ldGhvZCB8fCAwKVtcIm5hbWVzXCJdKSwgKG1ldGhvZCB8fCAwKVtcImJvZHlcIl0pKSkpO1xuICB9LCBmaXhlZE1ldGhvZHMpLCBpc05pbCh2YXJpYWRpYykgP1xuICAgIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwidGhyb3dcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiRXJyb3JcIiksIFwiSW52YWxpZCBhcml0eVwiKSkgOlxuICAgIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwicmF3KlwiKSwgY29tcGlsZUZuQm9keShjb25jYXQoY29tcGlsZVJlYmluZChjb25zKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGxcIiksIHN5bWJvbCh2b2lkKDApLCBcImFyZ3VtZW50c1wiKSwgKHZhcmlhZGljIHx8IDApW1wiYXJpdHlcIl0pLCBuYW1lcyksIGNvbnMoKHZhcmlhZGljIHx8IDApW1wicmVzdFwiXSwgKHZhcmlhZGljIHx8IDApW1wibmFtZXNcIl0pKSwgKHZhcmlhZGljIHx8IDApW1wiYm9keVwiXSkpKSkpLCB2b2lkKDApKTtcbn07XG5leHBvcnRzLmNvbXBpbGVPdmVybG9hZGVkRm4gPSBjb21waWxlT3ZlcmxvYWRlZEZuO1xuXG52YXIgY29tcGlsZVJlYmluZCA9IGZ1bmN0aW9uIGNvbXBpbGVSZWJpbmQoYmluZGluZ3MsIG5hbWVzKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChmb3JtLCBiaW5kaW5ncywgbmFtZXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KG5hbWVzKSA/XG4gICAgICByZXZlcnNlKGZvcm0pIDpcbiAgICAgIChmb3JtID0gaXNFcXVhbChmaXJzdChuYW1lcyksIGZpcnN0KGJpbmRpbmdzKSkgP1xuICAgICAgICBmb3JtIDpcbiAgICAgICAgY29ucyhsaXN0KHN5bWJvbCh2b2lkKDApLCBcImRlZlwiKSwgZmlyc3QobmFtZXMpLCBmaXJzdChiaW5kaW5ncykpLCBmb3JtKSwgYmluZGluZ3MgPSByZXN0KGJpbmRpbmdzKSwgbmFtZXMgPSByZXN0KG5hbWVzKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGxpc3QoKSwgYmluZGluZ3MsIG5hbWVzKTtcbn07XG5leHBvcnRzLmNvbXBpbGVSZWJpbmQgPSBjb21waWxlUmViaW5kO1xuXG52YXIgY29tcGlsZVN3aXRjaENhc2VzID0gZnVuY3Rpb24gY29tcGlsZVN3aXRjaENhc2VzKGNhc2VzKSB7XG4gIHJldHVybiByZWR1Y2UoZnVuY3Rpb24oZm9ybSwgY2FzZUV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gXCJcIiArIGZvcm0gKyAoY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJjYXNlIH57fTpcXG4gIH57fVxcblwiLCBjb21waWxlKG1hY3JvZXhwYW5kKGZpcnN0KGNhc2VFeHByZXNzaW9uKSkpLCBjb21waWxlKG1hY3JvZXhwYW5kKHJlc3QoY2FzZUV4cHJlc3Npb24pKSkpKSk7XG4gIH0sIFwiXCIsIGNhc2VzKTtcbn07XG5leHBvcnRzLmNvbXBpbGVTd2l0Y2hDYXNlcyA9IGNvbXBpbGVTd2l0Y2hDYXNlcztcblxudmFyIGNvbXBpbGVTd2l0Y2ggPSBmdW5jdGlvbiBjb21waWxlU3dpdGNoKHZhbHVlLCBjYXNlcywgZGVmYXVsdENhc2UpIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwic3dpdGNoICh+e30pIHtcXG4gIH57fVxcbiAgZGVmYXVsdDpcXG4gICAgfnt9XFxufVwiLCBjb21waWxlKG1hY3JvZXhwYW5kKHZhbHVlKSksIGNvbXBpbGVTd2l0Y2hDYXNlcyhjYXNlcyksIGNvbXBpbGUobWFjcm9leHBhbmQoZGVmYXVsdENhc2UpKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZVN3aXRjaCA9IGNvbXBpbGVTd2l0Y2g7XG5cbnZhciBjb21waWxlRm4gPSBmdW5jdGlvbiBjb21waWxlRm4oZm9ybSkge1xuICB2YXIgc2lnbmF0dXJlID0gZGVzdWdhckZuQXR0cnMoZGVzdWdhckZuRG9jKGRlc3VnYXJGbk5hbWUoZm9ybSkpKTtcbiAgdmFyIG5hbWUgPSBmaXJzdChzaWduYXR1cmUpO1xuICB2YXIgZG9jID0gc2Vjb25kKHNpZ25hdHVyZSk7XG4gIHZhciBhdHRycyA9IHRoaXJkKHNpZ25hdHVyZSk7XG4gIHJldHVybiBpc1ZlY3Rvcih0aGlyZChyZXN0KHNpZ25hdHVyZSkpKSA/XG4gICAgY29tcGlsZURlc3VnYXJlZEZuKG5hbWUsIGRvYywgYXR0cnMsIGRlc3VnYXJQYXJhbXModGhpcmQocmVzdChzaWduYXR1cmUpKSksIHJlc3QocmVzdChyZXN0KHJlc3Qoc2lnbmF0dXJlKSkpKSkgOlxuICAgIGNvbXBpbGUoY29tcGlsZU92ZXJsb2FkZWRGbihuYW1lLCBkb2MsIGF0dHJzLCByZXN0KHJlc3QocmVzdChzaWduYXR1cmUpKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVGbiA9IGNvbXBpbGVGbjtcblxudmFyIGNvbXBpbGVJbnZva2UgPSBmdW5jdGlvbiBjb21waWxlSW52b2tlKGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KGlzTGlzdChmaXJzdChmb3JtKSkgP1xuICAgIFwiKH57fSkofnt9KVwiIDpcbiAgICBcIn57fSh+e30pXCIsIGNvbXBpbGUoZmlyc3QoZm9ybSkpLCBjb21waWxlR3JvdXAocmVzdChmb3JtKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVJbnZva2UgPSBjb21waWxlSW52b2tlO1xuXG52YXIgY29tcGlsZUdyb3VwID0gZnVuY3Rpb24gY29tcGlsZUdyb3VwKGZvcm0sIHdyYXApIHtcbiAgcmV0dXJuIHdyYXAgP1xuICAgIFwiXCIgKyBcIihcIiArIChjb21waWxlR3JvdXAoZm9ybSkpICsgXCIpXCIgOlxuICAgIGpvaW4oXCIsIFwiLCB2ZWMobWFwKGNvbXBpbGUsIG1hcChtYWNyb2V4cGFuZCwgZm9ybSkpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlR3JvdXAgPSBjb21waWxlR3JvdXA7XG5cbnZhciBjb21waWxlRG8gPSBmdW5jdGlvbiBjb21waWxlRG8oZm9ybSkge1xuICByZXR1cm4gY29tcGlsZShsaXN0KGNvbnMoc3ltYm9sKHZvaWQoMCksIFwiZm5cIiksIGNvbnMoW10sIGZvcm0pKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZURvID0gY29tcGlsZURvO1xuXG52YXIgZGVmaW5lQmluZGluZ3MgPSBmdW5jdGlvbiBkZWZpbmVCaW5kaW5ncyhmb3JtKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChkZWZzLCBiaW5kaW5ncykge1xuICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICByZWN1ciA9IGNvdW50KGJpbmRpbmdzKSA9PT0gMCA/XG4gICAgICByZXZlcnNlKGRlZnMpIDpcbiAgICAgIChkZWZzID0gY29ucyhsaXN0KHN5bWJvbCh2b2lkKDApLCBcImRlZlwiKSwgKGJpbmRpbmdzIHx8IDApWzBdLCAoYmluZGluZ3MgfHwgMClbMV0pLCBkZWZzKSwgYmluZGluZ3MgPSByZXN0KHJlc3QoYmluZGluZ3MpKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKGxpc3QoKSwgZm9ybSk7XG59O1xuZXhwb3J0cy5kZWZpbmVCaW5kaW5ncyA9IGRlZmluZUJpbmRpbmdzO1xuXG52YXIgY29tcGlsZVRocm93ID0gZnVuY3Rpb24gY29tcGlsZVRocm93KGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiKGZ1bmN0aW9uKCkgeyB0aHJvdyB+e307IH0pKClcIiwgY29tcGlsZShtYWNyb2V4cGFuZChmaXJzdChmb3JtKSkpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlVGhyb3cgPSBjb21waWxlVGhyb3c7XG5cbnZhciBjb21waWxlU2V0ID0gZnVuY3Rpb24gY29tcGlsZVNldChmb3JtKSB7XG4gIHJldHVybiBjb21waWxlVGVtcGxhdGUobGlzdChcIn57fSA9IH57fVwiLCBjb21waWxlKG1hY3JvZXhwYW5kKGZpcnN0KGZvcm0pKSksIGNvbXBpbGUobWFjcm9leHBhbmQoc2Vjb25kKGZvcm0pKSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVTZXQgPSBjb21waWxlU2V0O1xuXG52YXIgY29tcGlsZVZlY3RvciA9IGZ1bmN0aW9uIGNvbXBpbGVWZWN0b3IoZm9ybSkge1xuICByZXR1cm4gY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJbfnt9XVwiLCBjb21waWxlR3JvdXAoZm9ybSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVWZWN0b3IgPSBjb21waWxlVmVjdG9yO1xuXG52YXIgY29tcGlsZVRyeSA9IGZ1bmN0aW9uIGNvbXBpbGVUcnkoZm9ybSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AodHJ5RXhwcnMsIGNhdGNoRXhwcnMsIGZpbmFsbHlFeHBycywgZXhwcnMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGV4cHJzKSA/XG4gICAgICBpc0VtcHR5KGNhdGNoRXhwcnMpID9cbiAgICAgICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoXCIoZnVuY3Rpb24oKSB7XFxudHJ5IHtcXG4gIH57fVxcbn0gZmluYWxseSB7XFxuICB+e31cXG59fSkoKVwiLCBjb21waWxlRm5Cb2R5KHRyeUV4cHJzKSwgY29tcGlsZUZuQm9keShmaW5hbGx5RXhwcnMpKSkgOlxuICAgICAgaXNFbXB0eShmaW5hbGx5RXhwcnMpID9cbiAgICAgICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoXCIoZnVuY3Rpb24oKSB7XFxudHJ5IHtcXG4gIH57fVxcbn0gY2F0Y2ggKH57fSkge1xcbiAgfnt9XFxufX0pKClcIiwgY29tcGlsZUZuQm9keSh0cnlFeHBycyksIGNvbXBpbGUoZmlyc3QoY2F0Y2hFeHBycykpLCBjb21waWxlRm5Cb2R5KHJlc3QoY2F0Y2hFeHBycykpKSkgOlxuICAgICAgICBjb21waWxlVGVtcGxhdGUobGlzdChcIihmdW5jdGlvbigpIHtcXG50cnkge1xcbiAgfnt9XFxufSBjYXRjaCAofnt9KSB7XFxuICB+e31cXG59IGZpbmFsbHkge1xcbiAgfnt9XFxufX0pKClcIiwgY29tcGlsZUZuQm9keSh0cnlFeHBycyksIGNvbXBpbGUoZmlyc3QoY2F0Y2hFeHBycykpLCBjb21waWxlRm5Cb2R5KHJlc3QoY2F0Y2hFeHBycykpLCBjb21waWxlRm5Cb2R5KGZpbmFsbHlFeHBycykpKSA6XG4gICAgaXNFcXVhbChmaXJzdChmaXJzdChleHBycykpLCBzeW1ib2wodm9pZCgwKSwgXCJjYXRjaFwiKSkgP1xuICAgICAgKHRyeUV4cHJzID0gdHJ5RXhwcnMsIGNhdGNoRXhwcnMgPSByZXN0KGZpcnN0KGV4cHJzKSksIGZpbmFsbHlFeHBycyA9IGZpbmFsbHlFeHBycywgZXhwcnMgPSByZXN0KGV4cHJzKSwgbG9vcCkgOlxuICAgIGlzRXF1YWwoZmlyc3QoZmlyc3QoZXhwcnMpKSwgc3ltYm9sKHZvaWQoMCksIFwiZmluYWxseVwiKSkgP1xuICAgICAgKHRyeUV4cHJzID0gdHJ5RXhwcnMsIGNhdGNoRXhwcnMgPSBjYXRjaEV4cHJzLCBmaW5hbGx5RXhwcnMgPSByZXN0KGZpcnN0KGV4cHJzKSksIGV4cHJzID0gcmVzdChleHBycyksIGxvb3ApIDpcbiAgICAgICh0cnlFeHBycyA9IGNvbnMoZmlyc3QoZXhwcnMpLCB0cnlFeHBycyksIGNhdGNoRXhwcnMgPSBjYXRjaEV4cHJzLCBmaW5hbGx5RXhwcnMgPSBmaW5hbGx5RXhwcnMsIGV4cHJzID0gcmVzdChleHBycyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShsaXN0KCksIGxpc3QoKSwgbGlzdCgpLCByZXZlcnNlKGZvcm0pKTtcbn07XG5leHBvcnRzLmNvbXBpbGVUcnkgPSBjb21waWxlVHJ5O1xuXG52YXIgY29tcGlsZVByb3BlcnR5ID0gZnVuY3Rpb24gY29tcGlsZVByb3BlcnR5KGZvcm0pIHtcbiAgcmV0dXJuIChuYW1lKHNlY29uZChmb3JtKSkpWzBdID09PSBcIi1cIiA/XG4gICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoaXNMaXN0KGZpcnN0KGZvcm0pKSA/XG4gICAgICBcIih+e30pLn57fVwiIDpcbiAgICAgIFwifnt9Ln57fVwiLCBjb21waWxlKG1hY3JvZXhwYW5kKGZpcnN0KGZvcm0pKSksIGNvbXBpbGUobWFjcm9leHBhbmQoc3ltYm9sKHN1YnMobmFtZShzZWNvbmQoZm9ybSkpLCAxKSkpKSkpIDpcbiAgICBjb21waWxlVGVtcGxhdGUobGlzdChcIn57fS5+e30ofnt9KVwiLCBjb21waWxlKG1hY3JvZXhwYW5kKGZpcnN0KGZvcm0pKSksIGNvbXBpbGUobWFjcm9leHBhbmQoc2Vjb25kKGZvcm0pKSksIGNvbXBpbGVHcm91cChyZXN0KHJlc3QoZm9ybSkpKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZVByb3BlcnR5ID0gY29tcGlsZVByb3BlcnR5O1xuXG52YXIgY29tcGlsZUFwcGx5ID0gZnVuY3Rpb24gY29tcGlsZUFwcGx5KGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGUobGlzdChzeW1ib2wodm9pZCgwKSwgXCIuXCIpLCBmaXJzdChmb3JtKSwgc3ltYm9sKHZvaWQoMCksIFwiYXBwbHlcIiksIGZpcnN0KGZvcm0pLCBzZWNvbmQoZm9ybSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVBcHBseSA9IGNvbXBpbGVBcHBseTtcblxudmFyIGNvbXBpbGVOZXcgPSBmdW5jdGlvbiBjb21waWxlTmV3KGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwibmV3IH57fVwiLCBjb21waWxlKGZvcm0pKSk7XG59O1xuZXhwb3J0cy5jb21waWxlTmV3ID0gY29tcGlsZU5ldztcblxudmFyIGNvbXBpbGVBZ2V0ID0gZnVuY3Rpb24gY29tcGlsZUFnZXQoZm9ybSkge1xuICB2YXIgdGFyZ2V0ID0gbWFjcm9leHBhbmQoZmlyc3QoZm9ybSkpO1xuICB2YXIgYXR0cmlidXRlID0gbWFjcm9leHBhbmQoc2Vjb25kKGZvcm0pKTtcbiAgdmFyIG5vdEZvdW5kID0gdGhpcmQoZm9ybSk7XG4gIHZhciB0ZW1wbGF0ZSA9IGlzTGlzdCh0YXJnZXQpID9cbiAgICBcIih+e30pW357fV1cIiA6XG4gICAgXCJ+e31bfnt9XVwiO1xuICByZXR1cm4gbm90Rm91bmQgP1xuICAgIGNvbXBpbGUobGlzdChzeW1ib2wodm9pZCgwKSwgXCJvclwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJnZXRcIiksIGZpcnN0KGZvcm0pLCBzZWNvbmQoZm9ybSkpLCBtYWNyb2V4cGFuZChub3RGb3VuZCkpKSA6XG4gICAgY29tcGlsZVRlbXBsYXRlKGxpc3QodGVtcGxhdGUsIGNvbXBpbGUodGFyZ2V0KSwgY29tcGlsZShhdHRyaWJ1dGUpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlQWdldCA9IGNvbXBpbGVBZ2V0O1xuXG52YXIgY29tcGlsZUdldCA9IGZ1bmN0aW9uIGNvbXBpbGVHZXQoZm9ybSkge1xuICByZXR1cm4gY29tcGlsZUFnZXQoY29ucyhsaXN0KHN5bWJvbCh2b2lkKDApLCBcIm9yXCIpLCBmaXJzdChmb3JtKSwgMCksIHJlc3QoZm9ybSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVHZXQgPSBjb21waWxlR2V0O1xuXG52YXIgY29tcGlsZUluc3RhbmNlID0gZnVuY3Rpb24gY29tcGlsZUluc3RhbmNlKGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwifnt9IGluc3RhbmNlb2Ygfnt9XCIsIGNvbXBpbGUobWFjcm9leHBhbmQoc2Vjb25kKGZvcm0pKSksIGNvbXBpbGUobWFjcm9leHBhbmQoZmlyc3QoZm9ybSkpKSkpO1xufTtcbmV4cG9ydHMuY29tcGlsZUluc3RhbmNlID0gY29tcGlsZUluc3RhbmNlO1xuXG52YXIgY29tcGlsZU5vdCA9IGZ1bmN0aW9uIGNvbXBpbGVOb3QoZm9ybSkge1xuICByZXR1cm4gY29tcGlsZVRlbXBsYXRlKGxpc3QoXCIhKH57fSlcIiwgY29tcGlsZShtYWNyb2V4cGFuZChmaXJzdChmb3JtKSkpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlTm90ID0gY29tcGlsZU5vdDtcblxudmFyIGNvbXBpbGVMb29wID0gZnVuY3Rpb24gY29tcGlsZUxvb3AoZm9ybSkge1xuICB2YXIgYmluZGluZ3MgPSAoZnVuY3Rpb24gbG9vcChuYW1lcywgdmFsdWVzLCB0b2tlbnMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KHRva2VucykgP1xuICAgICAge1xuICAgICAgICBcIm5hbWVzXCI6IG5hbWVzLFxuICAgICAgICBcInZhbHVlc1wiOiB2YWx1ZXNcbiAgICAgIH0gOlxuICAgICAgKG5hbWVzID0gY29uaihuYW1lcywgZmlyc3QodG9rZW5zKSksIHZhbHVlcyA9IGNvbmoodmFsdWVzLCBzZWNvbmQodG9rZW5zKSksIHRva2VucyA9IHJlc3QocmVzdCh0b2tlbnMpKSwgbG9vcCk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVjdXI7XG4gIH0pKFtdLCBbXSwgZmlyc3QoZm9ybSkpO1xuICB2YXIgbmFtZXMgPSAoYmluZGluZ3MgfHwgMClbXCJuYW1lc1wiXTtcbiAgdmFyIHZhbHVlcyA9IChiaW5kaW5ncyB8fCAwKVtcInZhbHVlc1wiXTtcbiAgdmFyIGJvZHkgPSByZXN0KGZvcm0pO1xuICByZXR1cm4gY29tcGlsZShjb25zKGNvbnMoc3ltYm9sKHZvaWQoMCksIFwiZm5cIiksIGNvbnMoc3ltYm9sKHZvaWQoMCksIFwibG9vcFwiKSwgY29ucyhuYW1lcywgY29tcGlsZVJlY3VyKG5hbWVzLCBib2R5KSkpKSwgbGlzdC5hcHBseShsaXN0LCB2YWx1ZXMpKSk7XG59O1xuZXhwb3J0cy5jb21waWxlTG9vcCA9IGNvbXBpbGVMb29wO1xuXG52YXIgcmViaW5kQmluZGluZ3MgPSBmdW5jdGlvbiByZWJpbmRCaW5kaW5ncyhuYW1lcywgdmFsdWVzKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gbG9vcChyZXN1bHQsIG5hbWVzLCB2YWx1ZXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KG5hbWVzKSA/XG4gICAgICByZXZlcnNlKHJlc3VsdCkgOlxuICAgICAgKHJlc3VsdCA9IGNvbnMobGlzdChzeW1ib2wodm9pZCgwKSwgXCJzZXQhXCIpLCBmaXJzdChuYW1lcyksIGZpcnN0KHZhbHVlcykpLCByZXN1bHQpLCBuYW1lcyA9IHJlc3QobmFtZXMpLCB2YWx1ZXMgPSByZXN0KHZhbHVlcyksIGxvb3ApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShsaXN0KCksIG5hbWVzLCB2YWx1ZXMpO1xufTtcbmV4cG9ydHMucmViaW5kQmluZGluZ3MgPSByZWJpbmRCaW5kaW5ncztcblxudmFyIGV4cGFuZFJlY3VyID0gZnVuY3Rpb24gZXhwYW5kUmVjdXIobmFtZXMsIGJvZHkpIHtcbiAgcmV0dXJuIG1hcChmdW5jdGlvbihmb3JtKSB7XG4gICAgcmV0dXJuIGlzTGlzdChmb3JtKSA/XG4gICAgICBpc0VxdWFsKGZpcnN0KGZvcm0pLCBzeW1ib2wodm9pZCgwKSwgXCJyZWN1clwiKSkgP1xuICAgICAgICBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJhdypcIiksIGNvbXBpbGVHcm91cChjb25jYXQocmViaW5kQmluZGluZ3MobmFtZXMsIHJlc3QoZm9ybSkpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImxvb3BcIikpKSwgdHJ1ZSkpIDpcbiAgICAgICAgZXhwYW5kUmVjdXIobmFtZXMsIGZvcm0pIDpcbiAgICAgIGZvcm07XG4gIH0sIGJvZHkpO1xufTtcbmV4cG9ydHMuZXhwYW5kUmVjdXIgPSBleHBhbmRSZWN1cjtcblxudmFyIGNvbXBpbGVSZWN1ciA9IGZ1bmN0aW9uIGNvbXBpbGVSZWN1cihuYW1lcywgYm9keSkge1xuICByZXR1cm4gbGlzdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcInJhdypcIiksIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwidmFyIHJlY3VyID0gbG9vcDtcXG53aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcXG4gIHJlY3VyID0gfnt9XFxufVwiLCBjb21waWxlU3RhdGVtZW50cyhleHBhbmRSZWN1cihuYW1lcywgYm9keSkpKSkpLCBzeW1ib2wodm9pZCgwKSwgXCJyZWN1clwiKSk7XG59O1xuZXhwb3J0cy5jb21waWxlUmVjdXIgPSBjb21waWxlUmVjdXI7XG5cbnZhciBjb21waWxlUmF3ID0gZnVuY3Rpb24gY29tcGlsZVJhdyhmb3JtKSB7XG4gIHJldHVybiBmaXJzdChmb3JtKTtcbn07XG5leHBvcnRzLmNvbXBpbGVSYXcgPSBjb21waWxlUmF3O1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJzZXQhXCIpLCBjb21waWxlU2V0KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiZ2V0XCIpLCBjb21waWxlR2V0KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiYWdldFwiKSwgY29tcGlsZUFnZXQpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIGNvbXBpbGVEZWYpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJpZlwiKSwgY29tcGlsZUlmRWxzZSk7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcImRvXCIpLCBjb21waWxlRG8pO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJkbypcIiksIGNvbXBpbGVTdGF0ZW1lbnRzKTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiZm5cIiksIGNvbXBpbGVGbik7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcInRocm93XCIpLCBjb21waWxlVGhyb3cpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJ2ZWN0b3JcIiksIGNvbXBpbGVWZWN0b3IpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJ0cnlcIiksIGNvbXBpbGVUcnkpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCIuXCIpLCBjb21waWxlUHJvcGVydHkpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJhcHBseVwiKSwgY29tcGlsZUFwcGx5KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwibmV3XCIpLCBjb21waWxlTmV3KTtcblxuaW5zdGFsbFNwZWNpYWwoc3ltYm9sKHZvaWQoMCksIFwiaW5zdGFuY2U/XCIpLCBjb21waWxlSW5zdGFuY2UpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJub3RcIiksIGNvbXBpbGVOb3QpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJsb29wXCIpLCBjb21waWxlTG9vcCk7XG5cbmluc3RhbGxTcGVjaWFsKHN5bWJvbCh2b2lkKDApLCBcInJhdypcIiksIGNvbXBpbGVSYXcpO1xuXG5pbnN0YWxsU3BlY2lhbChzeW1ib2wodm9pZCgwKSwgXCJjb21tZW50XCIpLCB3cml0ZUNvbW1lbnQpO1xuXG52YXIgY29tcGlsZVJlUGF0dGVybiA9IGZ1bmN0aW9uIGNvbXBpbGVSZVBhdHRlcm4oZm9ybSkge1xuICByZXR1cm4gXCJcIiArIGZvcm07XG59O1xuZXhwb3J0cy5jb21waWxlUmVQYXR0ZXJuID0gY29tcGlsZVJlUGF0dGVybjtcblxudmFyIGluc3RhbGxOYXRpdmUgPSBmdW5jdGlvbiBpbnN0YWxsTmF0aXZlKGFsaWFzLCBvcGVyYXRvciwgdmFsaWRhdG9yLCBmYWxsYmFjaykge1xuICByZXR1cm4gaW5zdGFsbFNwZWNpYWwoYWxpYXMsIGZ1bmN0aW9uKGZvcm0pIHtcbiAgICByZXR1cm4gaXNFbXB0eShmb3JtKSA/XG4gICAgICBmYWxsYmFjayA6XG4gICAgICByZWR1Y2UoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwifnt9IH57fSB+e31cIiwgbGVmdCwgbmFtZShvcGVyYXRvciksIHJpZ2h0KSk7XG4gICAgICB9LCBtYXAoZnVuY3Rpb24ob3BlcmFuZCkge1xuICAgICAgICByZXR1cm4gY29tcGlsZVRlbXBsYXRlKGxpc3QoaXNMaXN0KG9wZXJhbmQpID9cbiAgICAgICAgICBcIih+e30pXCIgOlxuICAgICAgICAgIFwifnt9XCIsIGNvbXBpbGUobWFjcm9leHBhbmQob3BlcmFuZCkpKSk7XG4gICAgICB9LCBmb3JtKSk7XG4gIH0sIHZhbGlkYXRvcik7XG59O1xuZXhwb3J0cy5pbnN0YWxsTmF0aXZlID0gaW5zdGFsbE5hdGl2ZTtcblxudmFyIGluc3RhbGxPcGVyYXRvciA9IGZ1bmN0aW9uIGluc3RhbGxPcGVyYXRvcihhbGlhcywgb3BlcmF0b3IpIHtcbiAgcmV0dXJuIGluc3RhbGxTcGVjaWFsKGFsaWFzLCBmdW5jdGlvbihmb3JtKSB7XG4gICAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHJlc3VsdCwgbGVmdCwgcmlnaHQsIG9wZXJhbmRzKSB7XG4gICAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgICAgd2hpbGUgKHJlY3VyID09PSBsb29wKSB7XG4gICAgICAgIHJlY3VyID0gaXNFbXB0eShvcGVyYW5kcykgP1xuICAgICAgICBcIlwiICsgcmVzdWx0ICsgKGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwifnt9IH57fSB+e31cIiwgY29tcGlsZShtYWNyb2V4cGFuZChsZWZ0KSksIG5hbWUob3BlcmF0b3IpLCBjb21waWxlKG1hY3JvZXhwYW5kKHJpZ2h0KSkpKSkgOlxuICAgICAgICAocmVzdWx0ID0gXCJcIiArIHJlc3VsdCArIChjb21waWxlVGVtcGxhdGUobGlzdChcIn57fSB+e30gfnt9ICYmIFwiLCBjb21waWxlKG1hY3JvZXhwYW5kKGxlZnQpKSwgbmFtZShvcGVyYXRvciksIGNvbXBpbGUobWFjcm9leHBhbmQocmlnaHQpKSkpKSwgbGVmdCA9IHJpZ2h0LCByaWdodCA9IGZpcnN0KG9wZXJhbmRzKSwgb3BlcmFuZHMgPSByZXN0KG9wZXJhbmRzKSwgbG9vcCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlY3VyO1xuICAgIH0pKFwiXCIsIGZpcnN0KGZvcm0pLCBzZWNvbmQoZm9ybSksIHJlc3QocmVzdChmb3JtKSkpO1xuICB9LCB2ZXJpZnlUd28pO1xufTtcbmV4cG9ydHMuaW5zdGFsbE9wZXJhdG9yID0gaW5zdGFsbE9wZXJhdG9yO1xuXG52YXIgY29tcGlsZXJFcnJvciA9IGZ1bmN0aW9uIGNvbXBpbGVyRXJyb3IoZm9ybSwgbWVzc2FnZSkge1xuICB2YXIgZXJyb3IgPSBFcnJvcihcIlwiICsgbWVzc2FnZSk7XG4gIGVycm9yLmxpbmUgPSAxO1xuICByZXR1cm4gKGZ1bmN0aW9uKCkgeyB0aHJvdyBlcnJvcjsgfSkoKTtcbn07XG5leHBvcnRzLmNvbXBpbGVyRXJyb3IgPSBjb21waWxlckVycm9yO1xuXG52YXIgdmVyaWZ5VHdvID0gZnVuY3Rpb24gdmVyaWZ5VHdvKGZvcm0pIHtcbiAgcmV0dXJuIChpc0VtcHR5KHJlc3QoZm9ybSkpKSB8fCAoaXNFbXB0eShyZXN0KHJlc3QoZm9ybSkpKSkgP1xuICAgIChmdW5jdGlvbigpIHsgdGhyb3cgY29tcGlsZXJFcnJvcihmb3JtLCBcIlwiICsgKGZpcnN0KGZvcm0pKSArIFwiIGZvcm0gcmVxdWlyZXMgYXQgbGVhc3QgdHdvIG9wZXJhbmRzXCIpOyB9KSgpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMudmVyaWZ5VHdvID0gdmVyaWZ5VHdvO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcIitcIiksIHN5bWJvbCh2b2lkKDApLCBcIitcIiksIHZvaWQoMCksIDApO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcIi1cIiksIHN5bWJvbCh2b2lkKDApLCBcIi1cIiksIHZvaWQoMCksIFwiTmFOXCIpO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcIipcIiksIHN5bWJvbCh2b2lkKDApLCBcIipcIiksIHZvaWQoMCksIDEpO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcIi9cIiksIHN5bWJvbCh2b2lkKDApLCBcIi9cIiksIHZlcmlmeVR3byk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwibW9kXCIpLCBzeW1ib2woXCIlXCIpLCB2ZXJpZnlUd28pO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcImFuZFwiKSwgc3ltYm9sKHZvaWQoMCksIFwiJiZcIikpO1xuXG5pbnN0YWxsTmF0aXZlKHN5bWJvbCh2b2lkKDApLCBcIm9yXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJ8fFwiKSk7XG5cbmluc3RhbGxPcGVyYXRvcihzeW1ib2wodm9pZCgwKSwgXCJub3Q9XCIpLCBzeW1ib2wodm9pZCgwKSwgXCIhPVwiKSk7XG5cbmluc3RhbGxPcGVyYXRvcihzeW1ib2wodm9pZCgwKSwgXCI9PVwiKSwgc3ltYm9sKHZvaWQoMCksIFwiPT09XCIpKTtcblxuaW5zdGFsbE9wZXJhdG9yKHN5bWJvbCh2b2lkKDApLCBcImlkZW50aWNhbD9cIiksIHN5bWJvbCh2b2lkKDApLCBcIj09PVwiKSk7XG5cbmluc3RhbGxPcGVyYXRvcihzeW1ib2wodm9pZCgwKSwgXCI+XCIpLCBzeW1ib2wodm9pZCgwKSwgXCI+XCIpKTtcblxuaW5zdGFsbE9wZXJhdG9yKHN5bWJvbCh2b2lkKDApLCBcIj49XCIpLCBzeW1ib2wodm9pZCgwKSwgXCI+PVwiKSk7XG5cbmluc3RhbGxPcGVyYXRvcihzeW1ib2wodm9pZCgwKSwgXCI8XCIpLCBzeW1ib2wodm9pZCgwKSwgXCI8XCIpKTtcblxuaW5zdGFsbE9wZXJhdG9yKHN5bWJvbCh2b2lkKDApLCBcIjw9XCIpLCBzeW1ib2wodm9pZCgwKSwgXCI8PVwiKSk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwiYml0LWFuZFwiKSwgc3ltYm9sKHZvaWQoMCksIFwiJlwiKSwgdmVyaWZ5VHdvKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCJiaXQtb3JcIiksIHN5bWJvbCh2b2lkKDApLCBcInxcIiksIHZlcmlmeVR3byk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwiYml0LXhvclwiKSwgc3ltYm9sKFwiXlwiKSk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwiYml0LW5vdFwiKSwgc3ltYm9sKFwiflwiKSwgdmVyaWZ5VHdvKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCJiaXQtc2hpZnQtbGVmdFwiKSwgc3ltYm9sKHZvaWQoMCksIFwiPDxcIiksIHZlcmlmeVR3byk7XG5cbmluc3RhbGxOYXRpdmUoc3ltYm9sKHZvaWQoMCksIFwiYml0LXNoaWZ0LXJpZ2h0XCIpLCBzeW1ib2wodm9pZCgwKSwgXCI+PlwiKSwgdmVyaWZ5VHdvKTtcblxuaW5zdGFsbE5hdGl2ZShzeW1ib2wodm9pZCgwKSwgXCJiaXQtc2hpZnQtcmlnaHQtemVyby1maWxcIiksIHN5bWJvbCh2b2lkKDApLCBcIj4+PlwiKSwgdmVyaWZ5VHdvKTtcblxuaW5zdGFsbE1hY3JvKHN5bWJvbCh2b2lkKDApLCBcInN0clwiKSwgZnVuY3Rpb24gc3RyKCkge1xuICB2YXIgZm9ybXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gY29uY2F0KGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiK1wiKSwgXCJcIiksIGZvcm1zKTtcbn0pO1xuXG5pbnN0YWxsTWFjcm8oc3ltYm9sKHZvaWQoMCksIFwibGV0XCIpLCBmdW5jdGlvbiBsZXRNYWNybyhiaW5kaW5ncykge1xuICB2YXIgYm9keSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHJldHVybiBjb25zKHN5bWJvbCh2b2lkKDApLCBcImRvXCIpLCBjb25jYXQoZGVmaW5lQmluZGluZ3MoYmluZGluZ3MpLCBib2R5KSk7XG59KTtcblxuaW5zdGFsbE1hY3JvKHN5bWJvbCh2b2lkKDApLCBcImNvbmRcIiksIGZ1bmN0aW9uIGNvbmQoKSB7XG4gIHZhciBjbGF1c2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuICEoaXNFbXB0eShjbGF1c2VzKSkgP1xuICAgIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiaWZcIiksIGZpcnN0KGNsYXVzZXMpLCBpc0VtcHR5KHJlc3QoY2xhdXNlcykpID9cbiAgICAgIChmdW5jdGlvbigpIHsgdGhyb3cgRXJyb3IoXCJjb25kIHJlcXVpcmVzIGFuIGV2ZW4gbnVtYmVyIG9mIGZvcm1zXCIpOyB9KSgpIDpcbiAgICAgIHNlY29uZChjbGF1c2VzKSwgY29ucyhzeW1ib2wodm9pZCgwKSwgXCJjb25kXCIpLCByZXN0KHJlc3QoY2xhdXNlcykpKSkgOlxuICAgIHZvaWQoMCk7XG59KTtcblxuaW5zdGFsbE1hY3JvKHN5bWJvbCh2b2lkKDApLCBcImRlZm5cIiksIGZ1bmN0aW9uIGRlZm4obmFtZSkge1xuICB2YXIgYm9keSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHJldHVybiBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImRlZlwiKSwgbmFtZSwgY29uY2F0KGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZm5cIiksIG5hbWUpLCBib2R5KSk7XG59KTtcblxuaW5zdGFsbE1hY3JvKHN5bWJvbCh2b2lkKDApLCBcImRlZm4tXCIpLCBmdW5jdGlvbiBkZWZuKG5hbWUpIHtcbiAgdmFyIGJvZHkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gY29uY2F0KGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZGVmblwiKSwgd2l0aE1ldGEobmFtZSwgY29uaih7XG4gICAgXCJwcml2YXRlXCI6IHRydWVcbiAgfSwgbWV0YShuYW1lKSkpKSwgYm9keSk7XG59KTtcblxuaW5zdGFsbE1hY3JvKHN5bWJvbCh2b2lkKDApLCBcImFzc2VydFwiKSwgZnVuY3Rpb24gYXNzZXJ0KHgsIG1lc3NhZ2UpIHtcbiAgdmFyIHRpdGxlID0gbWVzc2FnZSB8fCBcIlwiO1xuICB2YXIgYXNzZXJ0aW9uID0gcHJTdHIoeCk7XG4gIHZhciB1cmkgPSAoeCB8fCAwKVtcInVyaVwiXTtcbiAgdmFyIGZvcm0gPSBpc0xpc3QoeCkgP1xuICAgIHNlY29uZCh4KSA6XG4gICAgeDtcbiAgcmV0dXJuIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZG9cIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiaWZcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiYW5kXCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcIm5vdFwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJpZGVudGljYWw/XCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcInR5cGVvZlwiKSwgc3ltYm9sKHZvaWQoMCksIFwiKip2ZXJib3NlKipcIikpLCBcInVuZGVmaW5lZFwiKSksIHN5bWJvbCh2b2lkKDApLCBcIioqdmVyYm9zZSoqXCIpKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCIubG9nXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJjb25zb2xlXCIpLCBcIkFzc2VydDpcIiwgYXNzZXJ0aW9uKSksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiaWZcIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwibm90XCIpLCB4KSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJ0aHJvd1wiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJFcnJvci5cIiksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwic3RyXCIpLCBcIkFzc2VydCBmYWlsZWQ6IFwiLCB0aXRsZSwgXCJcXG5cXG5Bc3NlcnRpb246XFxuXFxuXCIsIGFzc2VydGlvbiwgXCJcXG5cXG5BY3R1YWw6XFxuXFxuXCIsIGZvcm0sIFwiXFxuLS0tLS0tLS0tLS0tLS1cXG5cIiksIHVyaSkpKSk7XG59KTtcblxudmFyIHBhcnNlUmVmZXJlbmNlcyA9IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbmNlcyhmb3Jtcykge1xuICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uKHJlZmVyZW5jZXMsIGZvcm0pIHtcbiAgICBpc1NlcShmb3JtKSA/XG4gICAgICAocmVmZXJlbmNlcyB8fCAwKVtuYW1lKGZpcnN0KGZvcm0pKV0gPSB2ZWMocmVzdChmb3JtKSkgOlxuICAgICAgdm9pZCgwKTtcbiAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgfSwge30sIGZvcm1zKTtcbn07XG5leHBvcnRzLnBhcnNlUmVmZXJlbmNlcyA9IHBhcnNlUmVmZXJlbmNlcztcblxudmFyIHBhcnNlUmVxdWlyZSA9IGZ1bmN0aW9uIHBhcnNlUmVxdWlyZShmb3JtKSB7XG4gIHZhciByZXF1aXJlbWVudCA9IGlzU3ltYm9sKGZvcm0pID9cbiAgICBbZm9ybV0gOlxuICAgIHZlYyhmb3JtKTtcbiAgdmFyIGlkID0gZmlyc3QocmVxdWlyZW1lbnQpO1xuICB2YXIgcGFyYW1zID0gZGljdGlvbmFyeS5hcHBseShkaWN0aW9uYXJ5LCByZXN0KHJlcXVpcmVtZW50KSk7XG4gIHZhciBpbXBvcnRzID0gcmVkdWNlKGZ1bmN0aW9uKGltcG9ydHMsIG5hbWUpIHtcbiAgICAoaW1wb3J0cyB8fCAwKVtuYW1lXSA9ICgoaW1wb3J0cyB8fCAwKVtuYW1lXSkgfHwgbmFtZTtcbiAgICByZXR1cm4gaW1wb3J0cztcbiAgfSwgY29uaih7fSwgKHBhcmFtcyB8fCAwKVtcIuqeiXJlbmFtZVwiXSksIChwYXJhbXMgfHwgMClbXCLqnolyZWZlclwiXSk7XG4gIHJldHVybiBjb25qKHtcbiAgICBcImlkXCI6IGlkLFxuICAgIFwiaW1wb3J0c1wiOiBpbXBvcnRzXG4gIH0sIHBhcmFtcyk7XG59O1xuZXhwb3J0cy5wYXJzZVJlcXVpcmUgPSBwYXJzZVJlcXVpcmU7XG5cbnZhciBhbmFseXplTnMgPSBmdW5jdGlvbiBhbmFseXplTnMoZm9ybSkge1xuICB2YXIgaWQgPSBmaXJzdChmb3JtKTtcbiAgdmFyIHBhcmFtcyA9IHJlc3QoZm9ybSk7XG4gIHZhciBkb2MgPSBpc1N0cmluZyhmaXJzdChwYXJhbXMpKSA/XG4gICAgZmlyc3QocGFyYW1zKSA6XG4gICAgdm9pZCgwKTtcbiAgdmFyIHJlZmVyZW5jZXMgPSBwYXJzZVJlZmVyZW5jZXMoZG9jID9cbiAgICByZXN0KHBhcmFtcykgOlxuICAgIHBhcmFtcyk7XG4gIHJldHVybiB3aXRoTWV0YShmb3JtLCB7XG4gICAgXCJpZFwiOiBpZCxcbiAgICBcImRvY1wiOiBkb2MsXG4gICAgXCJyZXF1aXJlXCI6IChyZWZlcmVuY2VzIHx8IDApW1wicmVxdWlyZVwiXSA/XG4gICAgICBtYXAocGFyc2VSZXF1aXJlLCAocmVmZXJlbmNlcyB8fCAwKVtcInJlcXVpcmVcIl0pIDpcbiAgICAgIHZvaWQoMClcbiAgfSk7XG59O1xuZXhwb3J0cy5hbmFseXplTnMgPSBhbmFseXplTnM7XG5cbnZhciBpZFRvTnMgPSBmdW5jdGlvbiBpZFRvTnMoaWQpIHtcbiAgcmV0dXJuIHN5bWJvbCh2b2lkKDApLCBqb2luKFwiKlwiLCBzcGxpdChcIlwiICsgaWQsIFwiLlwiKSkpO1xufTtcbmV4cG9ydHMuaWRUb05zID0gaWRUb05zO1xuXG52YXIgbmFtZVRvRmllbGQgPSBmdW5jdGlvbiBuYW1lVG9GaWVsZChuYW1lKSB7XG4gIHJldHVybiBzeW1ib2wodm9pZCgwKSwgXCJcIiArIFwiLVwiICsgbmFtZSk7XG59O1xuZXhwb3J0cy5uYW1lVG9GaWVsZCA9IG5hbWVUb0ZpZWxkO1xuXG52YXIgY29tcGlsZUltcG9ydCA9IGZ1bmN0aW9uIGNvbXBpbGVJbXBvcnQobW9kdWxlKSB7XG4gIHJldHVybiBmdW5jdGlvbihmb3JtKSB7XG4gICAgcmV0dXJuIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiZGVmXCIpLCBzZWNvbmQoZm9ybSksIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwiLlwiKSwgbW9kdWxlLCBuYW1lVG9GaWVsZChmaXJzdChmb3JtKSkpKTtcbiAgfTtcbn07XG5leHBvcnRzLmNvbXBpbGVJbXBvcnQgPSBjb21waWxlSW1wb3J0O1xuXG52YXIgY29tcGlsZVJlcXVpcmUgPSBmdW5jdGlvbiBjb21waWxlUmVxdWlyZShyZXF1aXJlcikge1xuICByZXR1cm4gZnVuY3Rpb24oZm9ybSkge1xuICAgIHZhciBpZCA9IChmb3JtIHx8IDApW1wiaWRcIl07XG4gICAgdmFyIHJlcXVpcmVtZW50ID0gaWRUb05zKCgoZm9ybSB8fCAwKVtcIuqeiWFzXCJdKSB8fCBpZCk7XG4gICAgdmFyIHBhdGggPSByZXNvbHZlKHJlcXVpcmVyLCBpZCk7XG4gICAgdmFyIGltcG9ydHMgPSAoZm9ybSB8fCAwKVtcImltcG9ydHNcIl07XG4gICAgcmV0dXJuIGNvbmNhdChbc3ltYm9sKHZvaWQoMCksIFwiZG8qXCIpLCBsaXN0KHN5bWJvbCh2b2lkKDApLCBcImRlZlwiKSwgcmVxdWlyZW1lbnQsIGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwicmVxdWlyZVwiKSwgcGF0aCkpXSwgaW1wb3J0cyA/XG4gICAgICBtYXAoY29tcGlsZUltcG9ydChyZXF1aXJlbWVudCksIGltcG9ydHMpIDpcbiAgICAgIHZvaWQoMCkpO1xuICB9O1xufTtcbmV4cG9ydHMuY29tcGlsZVJlcXVpcmUgPSBjb21waWxlUmVxdWlyZTtcblxudmFyIHJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKGZyb20sIHRvKSB7XG4gIHZhciByZXF1aXJlciA9IHNwbGl0KFwiXCIgKyBmcm9tLCBcIi5cIik7XG4gIHZhciByZXF1aXJlbWVudCA9IHNwbGl0KFwiXCIgKyB0bywgXCIuXCIpO1xuICB2YXIgaXNSZWxhdGl2ZSA9ICghKFwiXCIgKyBmcm9tID09PSBcIlwiICsgdG8pKSAmJiAoZmlyc3QocmVxdWlyZXIpID09PSBmaXJzdChyZXF1aXJlbWVudCkpO1xuICByZXR1cm4gaXNSZWxhdGl2ZSA/XG4gICAgKGZ1bmN0aW9uIGxvb3AoZnJvbSwgdG8pIHtcbiAgICAgIHZhciByZWN1ciA9IGxvb3A7XG4gICAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgICAgcmVjdXIgPSBmaXJzdChmcm9tKSA9PT0gZmlyc3QodG8pID9cbiAgICAgICAgKGZyb20gPSByZXN0KGZyb20pLCB0byA9IHJlc3QodG8pLCBsb29wKSA6XG4gICAgICAgIGpvaW4oXCIvXCIsIGNvbmNhdChbXCIuXCJdLCByZXBlYXQoZGVjKGNvdW50KGZyb20pKSwgXCIuLlwiKSwgdG8pKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVjdXI7XG4gICAgfSkocmVxdWlyZXIsIHJlcXVpcmVtZW50KSA6XG4gICAgam9pbihcIi9cIiwgcmVxdWlyZW1lbnQpO1xufTtcbmV4cG9ydHMucmVzb2x2ZSA9IHJlc29sdmU7XG5cbnZhciBjb21waWxlTnMgPSBmdW5jdGlvbiBjb21waWxlTnMoKSB7XG4gIHZhciBmb3JtID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIChmdW5jdGlvbigpIHtcbiAgICB2YXIgbWV0YWRhdGEgPSBtZXRhKGFuYWx5emVOcyhmb3JtKSk7XG4gICAgdmFyIGlkID0gXCJcIiArICgobWV0YWRhdGEgfHwgMClbXCJpZFwiXSk7XG4gICAgdmFyIGRvYyA9IChtZXRhZGF0YSB8fCAwKVtcImRvY1wiXTtcbiAgICB2YXIgcmVxdWlyZW1lbnRzID0gKG1ldGFkYXRhIHx8IDApW1wicmVxdWlyZVwiXTtcbiAgICB2YXIgbnMgPSBkb2MgP1xuICAgICAge1xuICAgICAgICBcImlkXCI6IGlkLFxuICAgICAgICBcImRvY1wiOiBkb2NcbiAgICAgIH0gOlxuICAgICAge1xuICAgICAgICBcImlkXCI6IGlkXG4gICAgICB9O1xuICAgIHJldHVybiBjb25jYXQoW3N5bWJvbCh2b2lkKDApLCBcImRvKlwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCJkZWZcIiksIHN5bWJvbCh2b2lkKDApLCBcIipucypcIiksIG5zKV0sIHJlcXVpcmVtZW50cyA/XG4gICAgICBtYXAoY29tcGlsZVJlcXVpcmUoaWQpLCByZXF1aXJlbWVudHMpIDpcbiAgICAgIHZvaWQoMCkpO1xuICB9KSgpO1xufTtcbmV4cG9ydHMuY29tcGlsZU5zID0gY29tcGlsZU5zO1xuXG5pbnN0YWxsTWFjcm8oc3ltYm9sKHZvaWQoMCksIFwibnNcIiksIGNvbXBpbGVOcyk7XG5cbmluc3RhbGxNYWNybyhzeW1ib2wodm9pZCgwKSwgXCJwcmludFwiKSwgZnVuY3Rpb24oKSB7XG4gIHZhciBtb3JlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgXCJQcmludHMgdGhlIG9iamVjdChzKSB0byB0aGUgb3V0cHV0IGZvciBodW1hbiBjb25zdW1wdGlvbi5cIjtcbiAgcmV0dXJuIGNvbmNhdChsaXN0KHN5bWJvbCh2b2lkKDApLCBcIi5sb2dcIiksIHN5bWJvbCh2b2lkKDApLCBcImNvbnNvbGVcIikpLCBtb3JlKTtcbn0pIiwidmFyIF9uc18gPSBcIndpc3AuYW5hbHl6ZXJcIjtcbm1vZHVsZS5uYW1lc3BhY2UgPSBfbnNfO1xudmFyIHN5bWJvbCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLnN5bWJvbDtcbnZhciBpc1N5bWJvbCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzU3ltYm9sO1xudmFyIGlzS2V5d29yZCA9IChyZXF1aXJlKFwiLi9hc3RcIikpLmlzS2V5d29yZDtcbnZhciBtZXRhID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkubWV0YTtcbnZhciBuYW1lID0gKHJlcXVpcmUoXCIuL2FzdFwiKSkubmFtZTtcbnZhciBuYW1lc3BhY2UgPSAocmVxdWlyZShcIi4vYXN0XCIpKS5uYW1lc3BhY2U7XG52YXIgaXNTZXEgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmlzU2VxO1xudmFyIHNlcSA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuc2VxO1xudmFyIGNvbmogPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmNvbmo7XG52YXIgbWFwID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5tYXA7XG52YXIgaXNFdmVyeSA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuaXNFdmVyeTtcbnZhciBpbnRlcmxlYXZlID0gKHJlcXVpcmUoXCIuL3NlcXVlbmNlXCIpKS5pbnRlcmxlYXZlO1xudmFyIGlzRW1wdHkgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmlzRW1wdHk7XG52YXIgbGlzdF8gPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmxpc3RfO1xudmFyIGxpc3QgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmxpc3Q7XG52YXIgZmlyc3QgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmZpcnN0O1xudmFyIGxhc3QgPSAocmVxdWlyZShcIi4vc2VxdWVuY2VcIikpLmxhc3Q7XG52YXIgcmVzdCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkucmVzdDtcbnZhciBjb3VudCA9IChyZXF1aXJlKFwiLi9zZXF1ZW5jZVwiKSkuY291bnQ7XG52YXIgaXNWZWN0b3IgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNWZWN0b3I7XG52YXIgaXNEaWN0aW9uYXJ5ID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmlzRGljdGlvbmFyeTtcbnZhciBpc1N0cmluZyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc1N0cmluZztcbnZhciBrZXlzID0gKHJlcXVpcmUoXCIuL3J1bnRpbWVcIikpLmtleXM7XG52YXIgdmFscyA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS52YWxzO1xudmFyIGlzRXF1YWwgPSAocmVxdWlyZShcIi4vcnVudGltZVwiKSkuaXNFcXVhbDtcbnZhciBpc05pbCA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5pc05pbDtcbnZhciBtZXJnZSA9IChyZXF1aXJlKFwiLi9ydW50aW1lXCIpKS5tZXJnZTtcbnZhciBzcGxpdCA9IChyZXF1aXJlKFwiLi9zdHJpbmdcIikpLnNwbGl0OztcblxudmFyIGdldEluID0gZnVuY3Rpb24gZ2V0SW4oZGljdGlvbmFyeSwga2V5cywgbm90Rm91bmQpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBsb29wKHRhcmdldCwgc2VudGluZWwsIGtleXMpIHtcbiAgICB2YXIgcmVjdXIgPSBsb29wO1xuICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgcmVjdXIgPSBpc0VtcHR5KGtleXMpID9cbiAgICAgIHRhcmdldCA6XG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAoKCh0YXJnZXQgfHwgMCkgfHwgMClbZmlyc3Qoa2V5cyldKSB8fCBzZW50aW5lbDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gc2VudGluZWwgP1xuICAgICAgICAgIG5vdEZvdW5kIDpcbiAgICAgICAgICAodGFyZ2V0ID0gcmVzdWx0LCBzZW50aW5lbCA9IHNlbnRpbmVsLCBrZXlzID0gcmVzdChrZXlzKSwgbG9vcCk7XG4gICAgICB9KSgpO1xuICAgIH07XG4gICAgcmV0dXJuIHJlY3VyO1xuICB9KShkaWN0aW9uYXJ5LCB7fSwga2V5cyk7XG59O1xuZXhwb3J0cy5nZXRJbiA9IGdldEluO1xuXG52YXIgZW1wdHlFbnYgPSBmdW5jdGlvbiBlbXB0eUVudihucykge1xuICBcIlV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGVtcHR5IG5hbWVzcGFjZXNcIjtcbiAgcmV0dXJuIHtcbiAgICBcIm5zXCI6IG5zLFxuICAgIFwibmFtZXNwYWNlc1wiOiB7fSxcbiAgICBcImNvbnRleHRcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImxvY2Fsc1wiOiB7fVxuICB9O1xufTtcbmV4cG9ydHMuZW1wdHlFbnYgPSBlbXB0eUVudjtcblxudmFyIGxvY2FsQmluZGluZyA9IGZ1bmN0aW9uIGxvY2FsQmluZGluZyhlbnYsIGZvcm0pIHtcbiAgcmV0dXJuICgoKGVudiB8fCAwKVtcImxvY2Fsc1wiXSkgfHwgMClbZm9ybV07XG59O1xuXG52YXIgaXNDb3JlTmFtZSA9IGZ1bmN0aW9uIGlzQ29yZU5hbWUoZW52LCBzeW0pIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydHMuaXNDb3JlTmFtZSA9IGlzQ29yZU5hbWU7XG5cbnZhciByZXNvbHZlTnNBbGlhcyA9IGZ1bmN0aW9uIHJlc29sdmVOc0FsaWFzKGVudiwgbmFtZSkge1xuICB2YXIgc3ltID0gc3ltYm9sKG5hbWUpO1xuICByZXR1cm4gKCgoKCgoKGVudiB8fCAwKVtcIm5zXCJdKSB8fCAwKVtcInJlcXVpcmVzXCJdKSB8fCAwKSB8fCAwKVtzeW1dKSB8fCBzeW07XG59O1xuZXhwb3J0cy5yZXNvbHZlTnNBbGlhcyA9IHJlc29sdmVOc0FsaWFzO1xuXG52YXIgcmVzb2x2ZUV4aXN0aW5nVmFyID0gZnVuY3Rpb24gcmVzb2x2ZUV4aXN0aW5nVmFyKGVudiwgZm9ybSkge1xuICByZXR1cm4gaXNFcXVhbChuYW1lc3BhY2UoZm9ybSksIFwianNcIikgP1xuICAgIHtcbiAgICAgIFwibmFtZVwiOiBmb3JtLFxuICAgICAgXCJuc1wiOiBzeW1ib2wodm9pZCgwKSwgXCJqc1wiKVxuICAgIH0gOlxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBuYW1lc3BhY2VzID0gKGVudiB8fCAwKVtcIm5hbWVzcGFjZXNcIl07XG4gICAgICB2YXIgcyA9IFwiXCIgKyBmb3JtO1xuICAgICAgdmFyIGJpbmRpbmcgPSBsb2NhbEJpbmRpbmcoZW52LCBmb3JtKTtcbiAgICAgIHJldHVybiBiaW5kaW5nID9cbiAgICAgICAgYmluZGluZyA6XG4gICAgICBuYW1lc3BhY2UoZm9ybSkgP1xuICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIG5zID0gbmFtZXNwYWNlKGZvcm0pO1xuICAgICAgICAgIHZhciBucyA9IGlzRXF1YWwoXCJjbG9qdXJlLmNvcmVcIiwgbnMpID9cbiAgICAgICAgICAgIFwiY2xqcy5jb3JlXCIgOlxuICAgICAgICAgICAgbnM7XG4gICAgICAgICAgdmFyIGZ1bGxOcyA9IHJlc29sdmVOc0FsaWFzKGVudiwgbnMpO1xuICAgICAgICAgIHZhciBpZCA9IHN5bWJvbChuYW1lKGZvcm0pKTtcbiAgICAgICAgICByZXR1cm4gbWVyZ2UoZ2V0SW4obmFtZXNwYWNlcywgW2Z1bGxOcywgXCJkZWZzXCIsIGlkXSksIHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBzeW1ib2woXCJcIiArIGZ1bGxOcywgXCJcIiArIChuYW1lKGZvcm0pKSksXG4gICAgICAgICAgICBcIm5zXCI6IGZ1bGxOc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpIDpcbiAgICAgIFwiZWxzZVwiID9cbiAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBmdWxsTnMgPSBpc0NvcmVOYW1lKGVudiwgZm9ybSkgP1xuICAgICAgICAgICAgc3ltYm9sKHZvaWQoMCksIFwiY2xqcy5jb3JlXCIpIDpcbiAgICAgICAgICAgICgoKGVudiB8fCAwKVtcIm5zXCJdKSB8fCAwKVtcIm5hbWVcIl07XG4gICAgICAgICAgcmV0dXJuIG1lcmdlKGdldEluKG5hbWVzcGFjZXMsIFtmdWxsTnMsIFwiZGVmc1wiLCBmb3JtXSksIHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBzeW1ib2woXCJcIiArIGZ1bGxOcywgXCJcIiArIGZvcm0pLFxuICAgICAgICAgICAgXCJuc1wiOiBmdWxsTnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkoKSA6XG4gICAgICAgIHZvaWQoMCk7XG4gICAgfSkoKTtcbn07XG5leHBvcnRzLnJlc29sdmVFeGlzdGluZ1ZhciA9IHJlc29sdmVFeGlzdGluZ1ZhcjtcblxudmFyIGlzU3BlY2lhbCA9IGZ1bmN0aW9uIGlzU3BlY2lhbChvcCkge1xuICByZXR1cm4gKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcImlmXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcImRlZlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJmbipcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwiZG9cIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwibGV0KlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJsb29wKlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJsZXRmbipcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwidGhyb3dcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwidHJ5KlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJyZWN1clwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJuZXdcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJuc1wiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJkZWZ0eXBlKlwiKSkpIHx8IChpc0VxdWFsKG9wLCBzeW1ib2wodm9pZCgwKSwgXCJkZWZyZWNvcmQqXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcIi5cIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwianMqXCIpKSkgfHwgKGlzRXF1YWwob3AsIHN5bWJvbCh2b2lkKDApLCBcIiZcIikpKSB8fCAoaXNFcXVhbChvcCwgc3ltYm9sKHZvaWQoMCksIFwicXVvdGVcIikpKTtcbn07XG5leHBvcnRzLmlzU3BlY2lhbCA9IGlzU3BlY2lhbDtcblxudmFyIGFuYWx5emVTZXEgPSBmdW5jdGlvbiBhbmFseXplU2VxKGVudiwgZm9ybSwgbmFtZSkge1xuICB2YXIgZW52ID0gY29uaihlbnYsIHtcbiAgICBcImxpbmVcIjogKCgobWV0YShmb3JtKSkgfHwgMClbXCJsaW5lXCJdKSB8fCAoKGVudiB8fCAwKVtcImxpbmVcIl0pXG4gIH0pO1xuICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBvcCA9IGZpcnN0KGZvcm0pO1xuICAgIChmdW5jdGlvbigpIHtcbiAgICAgICghKHR5cGVvZihfX3ZlcmJvc2VfXykgPT09IFwidW5kZWZpbmVkXCIpKSAmJiBfX3ZlcmJvc2VfXyA/XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQXNzZXJ0OlwiLCBcIihub3QgKG5pbD8gb3ApKVwiKSA6XG4gICAgICAgIHZvaWQoMCk7XG4gICAgICByZXR1cm4gISghKGlzTmlsKG9wKSkpID9cbiAgICAgICAgKGZ1bmN0aW9uKCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJcIiArIFwiQXNzZXJ0IGZhaWxlZDogXCIgKyBcIkNhbid0IGNhbGwgbmlsXCIgKyBcIlxcblxcbkFzc2VydGlvbjpcXG5cXG5cIiArIFwiKG5vdCAobmlsPyBvcCkpXCIgKyBcIlxcblxcbkFjdHVhbDpcXG5cXG5cIiArIChpc05pbChvcCkpICsgXCJcXG4tLS0tLS0tLS0tLS0tLVxcblwiLCB2b2lkKDApKTsgfSkoKSA6XG4gICAgICAgIHZvaWQoMCk7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGV4cGFuc2lvbiA9IG1hY3JvZXhwYW5kKGZvcm0pO1xuICAgICAgcmV0dXJuIGlzU3BlY2lhbChvcCkgP1xuICAgICAgICBwYXJzZShvcCwgZW52LCBmb3JtLCBuYW1lKSA6XG4gICAgICAgIHBhcnNlSW52b2tlKGVudiwgZm9ybSk7XG4gICAgfSkoKTtcbiAgfSkoKTtcbn07XG5leHBvcnRzLmFuYWx5emVTZXEgPSBhbmFseXplU2VxO1xuXG52YXIgaXNNZXRob2RDYWxsID0gZnVuY3Rpb24gaXNNZXRob2RDYWxsKGZvcm0pIHtcbiAgcmV0dXJuIGlzRXF1YWwoZmlyc3QoZm9ybSksIFwiLlwiKTtcbn07XG5cbnZhciBpc0luc3RhbnRpYXRpb24gPSBmdW5jdGlvbiBpc0luc3RhbnRpYXRpb24oZm9ybSkge1xuICByZXR1cm4gaXNFcXVhbChsYXN0KGZvcm0pLCBcIi5cIik7XG59O1xuXG52YXIgZ2V0TnNFeGNsdWRlID0gZnVuY3Rpb24gZ2V0TnNFeGNsdWRlKGVudiwgc3ltKSB7XG4gIHJldHVybiAoKCgoKGVudiB8fCAwKVtcIm5zXCJdKSB8fCAwKVtcImV4Y2x1ZGVzXCJdKSB8fCAwKVtzeW1dO1xufTtcblxudmFyIGdldE5zTmFtZSA9IGZ1bmN0aW9uIGdldE5zTmFtZShlbnYpIHtcbiAgcmV0dXJuICgoKGVudiB8fCAwKVtcIm5zXCJdKSB8fCAwKVtcIm5hbWVcIl07XG59O1xuXG52YXIgZ2V0TWFjcm9Vc2VzID0gZnVuY3Rpb24gZ2V0TWFjcm9Vc2VzKGVudiwgc3ltKSB7XG4gIHJldHVybiAoKCgoKGVudiB8fCAwKVtcIm5zXCJdKSB8fCAwKVtcInVzZXMtbWFjcm9zXCJdKSB8fCAwKVtzeW1dO1xufTtcblxudmFyIGlzTWFjcm9TeW0gPSBmdW5jdGlvbiBpc01hY3JvU3ltKGVudiwgc3ltKSB7XG4gIHZhciBuYW1lc3BhY2VzID0gKGVudiB8fCAwKVtcIm5hbWVzcGFjZXNcIl07XG4gIHZhciBsb2NhbCA9IGxvY2FsQmluZGluZyhlbnYsIHN5bSk7XG4gIHZhciBuc0lkID0gZ2V0TnNOYW1lKGVudik7XG4gIHJldHVybiAhKGxvY2FsIHx8ICgoKGdldE5zRXhjbHVkZShlbnYsIHN5bSkpIHx8IChnZXRJbihuYW1lc3BhY2VzLCBbbnNJZCwgXCJleGNsdWRlc1wiLCBzeW1dKSkpICYmICghKChnZXRNYWNyb1VzZXMoZW52LCBzeW0pKSB8fCAoZ2V0SW4obmFtZXNwYWNlcywgW25zSWQsIFwidXNlcy1tYWNyb3NcIiwgc3ltXSkpKSkpKTtcbn07XG5leHBvcnRzLmlzTWFjcm9TeW0gPSBpc01hY3JvU3ltO1xuXG52YXIgZ2V0RXhwYW5kZXIgPSBmdW5jdGlvbiBnZXRFeHBhbmRlcihzeW0sIGVudikge1xuICB2YXIgb3AgPSAoaXNNYWNyb1N5bShlbnYsIHN5bSkpICYmIChyZXNvbHZlRXhpc3RpbmdWYXIoZW1wdHlFbnYoKSwgc3ltKSk7XG4gIHJldHVybiBvcCAmJiAoKG9wIHx8IDApW1wibWFjcm9cIl0pID9cbiAgICBldmFsKFwiXCIgKyAobXVuZ2UoKG9wIHx8IDApW1wibmFtZVwiXSkpKSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmdldEV4cGFuZGVyID0gZ2V0RXhwYW5kZXI7XG5cbnZhciBpc1N1Z2FyID0gZnVuY3Rpb24gaXNTdWdhcihvcCkge1xuICB2YXIgaWQgPSBcIlwiICsgb3A7XG4gIHJldHVybiAoZmlyc3QoaWQpID09PSBcIi5cIikgfHwgKGxhc3QoaWQpID09PSBcIi5cIik7XG59O1xuZXhwb3J0cy5pc1N1Z2FyID0gaXNTdWdhcjtcblxudmFyIGlzTWFjcm8gPSBmdW5jdGlvbiBpc01hY3JvKG9wKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5leHBvcnRzLmlzTWFjcm8gPSBpc01hY3JvO1xuXG52YXIgZGVzdWdhcjEgPSBmdW5jdGlvbiBkZXN1Z2FyMShmb3JtKSB7XG4gIHZhciBpZCA9IFwiXCIgKyBmb3JtO1xuICB2YXIgcGFyYW1zID0gcmVzdChmb3JtKTtcbiAgdmFyIG1ldGFkYXRhID0gbWV0YShmb3JtKTtcbiAgcmV0dXJuIGlzTWV0aG9kQ2FsbChpZCkgP1xuICAgIHdpdGhNZXRhKGxpc3RfKHN5bWJvbCh2b2lkKDApLCBcIi5cIiksIGZpcnN0KHBhcmFtKSwgc3ltYm9sKHN1YnMoaWQsIDEpKSwgcmVzdChwYXJhbXMpKSwgbWV0YWRhdGEpIDpcbiAgaXNJbnN0YW50aWF0aW9uKGlkKSA/XG4gICAgd2l0aE1ldGEobGlzdF8oc3ltYm9sKHZvaWQoMCksIFwibmV3XCIpLCBzeW1ib2woc3VicyhvcG5hbWUsIDAsIGRlYyhjb3VudChvcG5hbWUpKSkpLCBwYXJhbXMpLCBtZXRhZGF0YSkgOlxuICBcImVsc2VcIiA/XG4gICAgZm9ybSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLmRlc3VnYXIxID0gZGVzdWdhcjE7XG5cbnZhciBtYWNyb2V4cGFuZDEgPSBmdW5jdGlvbiBtYWNyb2V4cGFuZDEoZm9ybSkge1xuICB2YXIgb3AgPSBmaXJzdChmb3JtKTtcbiAgcmV0dXJuIGlzU3BlY2lhbChvcCkgP1xuICAgIGZvcm0gOlxuICBpc1N1Z2FyKG9wKSA/XG4gICAgZGVzdWdhcjEoZm9ybSkgOlxuICBpc01hY3JvKG9wKSA/XG4gICAgZ2V0RXhwYW5kZXIob3ApLmFwcGx5KGdldEV4cGFuZGVyKG9wKSwgZm9ybSkgOlxuICBcImVsc2VcIiA/XG4gICAgZm9ybSA6XG4gICAgdm9pZCgwKTtcbn07XG5leHBvcnRzLm1hY3JvZXhwYW5kMSA9IG1hY3JvZXhwYW5kMTtcblxudmFyIG1hY3JvZXhwYW5kID0gZnVuY3Rpb24gbWFjcm9leHBhbmQoZm9ybSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoZm9ybSwgZXhwYW5zaW9uKSB7XG4gICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICB3aGlsZSAocmVjdXIgPT09IGxvb3ApIHtcbiAgICAgIHJlY3VyID0gZm9ybSA9PT0gZXhwYW5zaW9uID9cbiAgICAgIGZvcm0gOlxuICAgICAgKGZvcm0gPSBleHBhbnNpb24sIGV4cGFuc2lvbiA9IG1hY3JvZXhwYW5kMShleHBhbnNpb24pLCBsb29wKTtcbiAgICB9O1xuICAgIHJldHVybiByZWN1cjtcbiAgfSkoZm9ybSwgbWFjcm9leHBhbmQxKGZvcm0pKTtcbn07XG5leHBvcnRzLm1hY3JvZXhwYW5kID0gbWFjcm9leHBhbmQ7XG5cbnZhciBhbmFseXplU3ltYm9sID0gZnVuY3Rpb24gYW5hbHl6ZVN5bWJvbChlbnYsIHN5bWJvbCkge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIFwiZW52XCI6IGVudixcbiAgICBcImZvcm1cIjogc3ltYm9sXG4gIH07XG4gIHZhciBsb2NhbHMgPSAoZW52IHx8IDApW1wibG9jYWxzXCJdO1xuICB2YXIgbG9jYWwgPSAobG9jYWxzIHx8IDApW3N5bWJvbF07XG4gIHJldHVybiBjb25qKHJlc3VsdCwge1xuICAgIFwib3BcIjogXCJ2YXJcIixcbiAgICBcImluZm9cIjogbG9jYWwgP1xuICAgICAgbG9jYWwgOlxuICAgICAgcmVzb2x2ZUV4aXN0aW5nVmFyKGVudiwgc3ltYm9sKVxuICB9KTtcbn07XG5leHBvcnRzLmFuYWx5emVTeW1ib2wgPSBhbmFseXplU3ltYm9sO1xuXG52YXIgX3JlYWRlck5zTmFtZV8gPSBzeW1ib2woXCJjbG9qdXJlLnJlYWRlclwiLCBcInJlYWRlclwiKTtcblxudmFyIGFuYWx5emVLZXl3b3JkID0gZnVuY3Rpb24gYW5hbHl6ZUtleXdvcmQoZW52LCBmb3JtKSB7XG4gIHJldHVybiB7XG4gICAgXCJvcFwiOiBcImNvbnN0YW50XCIsXG4gICAgXCJlbnZcIjogZW52LFxuICAgIFwiZm9ybVwiOiBpc0VxdWFsKG5hbWVzcGFjZShmb3JtKSwgbmFtZShfcmVhZGVyTnNOYW1lXykpID9cbiAgICAgIGtleXdvcmQobmFtZSgoKChlbnYgfHwgMClbXCJuc1wiXSkgfHwgMClbXCJuYW1lXCJdKSwgbmFtZShmb3JtKSkgOlxuICAgICAgZm9ybVxuICB9O1xufTtcbmV4cG9ydHMuYW5hbHl6ZUtleXdvcmQgPSBhbmFseXplS2V5d29yZDtcblxudmFyIGlzU2ltcGxlS2V5ID0gZnVuY3Rpb24gaXNTaW1wbGVLZXkoeCkge1xuICByZXR1cm4gKGlzU3RyaW5nKHgpKSB8fCAoaXNLZXl3b3JkKHgpKTtcbn07XG5leHBvcnRzLmlzU2ltcGxlS2V5ID0gaXNTaW1wbGVLZXk7XG5cbnZhciBhbmFseXplRGljdGlvbmFyeSA9IGZ1bmN0aW9uIGFuYWx5emVEaWN0aW9uYXJ5KGVudiwgZm9ybSwgbmFtZSkge1xuICB2YXIgZXhwckVudiA9IGNvbmooZW52LCB7XG4gICAgXCJjb250ZXh0XCI6IFwiZXhwclwiXG4gIH0pO1xuICB2YXIgbmFtZXMgPSBrZXlzKGZvcm0pO1xuICB2YXIgaXNTaW1wbGVLZXlzID0gaXNFdmVyeShpc1NpbXBsZUtleSwgbmFtZXMpO1xuICB2YXIga3MgPSBkaXNhbGxvd2luZ1JlY3VyKHZlYyhtYXAoZnVuY3Rpb24oJDEpIHtcbiAgICByZXR1cm4gYW5hbHl6ZShleHByRW52LCAkMSwgbmFtZSk7XG4gIH0sIG5hbWVzKSkpO1xuICB2YXIgdnMgPSBkaXNhbGxvd2luZ1JlY3VyKHZlYyhtYXAoZnVuY3Rpb24oJDEpIHtcbiAgICByZXR1cm4gYW5hbHl6ZShleHByRW52LCAkMSwgbmFtZSk7XG4gIH0sIHZhbHMoZm9ybSkpKSk7XG4gIHJldHVybiBhbmFseXplV3JhcE1ldGEoe1xuICAgIFwib3BcIjogXCJtYXBcIixcbiAgICBcImVudlwiOiBlbnYsXG4gICAgXCJmb3JtXCI6IGZvcm0sXG4gICAgXCJrZXlzXCI6IGtzLFxuICAgIFwidmFsc1wiOiB2cyxcbiAgICBcInNpbXBsZS1rZXlzP1wiOiBpc1NpbXBsZUtleXMsXG4gICAgXCJjaGlsZHJlblwiOiB2ZWMoaW50ZXJsZWF2ZShrcywgdnMpKVxuICB9LCBuYW1lKTtcbn07XG5leHBvcnRzLmFuYWx5emVEaWN0aW9uYXJ5ID0gYW5hbHl6ZURpY3Rpb25hcnk7XG5cbnZhciBhbmFseXplVmVjdG9yID0gZnVuY3Rpb24gYW5hbHl6ZVZlY3RvcihlbnYsIGZvcm0sIG5hbWUpIHtcbiAgdmFyIGV4cHJFbnYgPSBjb25qKGVudiwge1xuICAgIFwiY29udGV4dFwiOiBcImV4cHJcIlxuICB9KTtcbiAgdmFyIGl0ZW1zID0gZGlzYWxsb3dpbmdSZWN1cih2ZWMobWFwKGZ1bmN0aW9uKCQxKSB7XG4gICAgcmV0dXJuIGFuYWx5emUoZXhwckVudiwgJDEsIG5hbWUpO1xuICB9LCBmb3JtKSkpO1xuICByZXR1cm4gYW5hbHl6ZVdyYXBNZXRhKHtcbiAgICBcIm9wXCI6IFwidmVjdG9yXCIsXG4gICAgXCJlbnZcIjogZW52LFxuICAgIFwiZm9ybVwiOiBmb3JtLFxuICAgIFwiaXRlbXNcIjogaXRlbXMsXG4gICAgXCJjaGlsZHJlblwiOiBpdGVtc1xuICB9LCBuYW1lKTtcbn07XG5leHBvcnRzLmFuYWx5emVWZWN0b3IgPSBhbmFseXplVmVjdG9yO1xuXG52YXIgYW5hbHl6ZVdyYXBNZXRhID0gZnVuY3Rpb24gYW5hbHl6ZVdyYXBNZXRhKGV4cHIsIG5hbWUpIHtcbiAgdmFyIGZvcm0gPSAoZXhwciB8fCAwKVtcImZvcm1cIl07XG4gIHZhciBtZXRhZGF0YSA9IG1ldGEoZm9ybSk7XG4gIHZhciBlbnYgPSAoZXhwciB8fCAwKVtcImVudlwiXTtcbiAgdmFyIGV4cHIgPSBtZXRhZGF0YSA/XG4gICAgYXNzb2NJbihleHByLCBbXCJlbnZcIiwgXCJjb250ZXh0XCJdLCBcImV4cHJcIikgOlxuICAgIHZvaWQoMCk7XG4gIHZhciBtZXRhRXhwciA9IG1ldGFkYXRhID9cbiAgICBhbmFseXplTWFwKGVudiwgbWV0YWRhdGEsIG5hbWUpIDpcbiAgICB2b2lkKDApO1xuICByZXR1cm4gbWV0YWRhdGEgP1xuICAgIHtcbiAgICAgIFwib3BcIjogXCJtZXRhXCIsXG4gICAgICBcImVudlwiOiBlbnYsXG4gICAgICBcImZvcm1cIjogZm9ybSxcbiAgICAgIFwibWV0YVwiOiBtZXRhRXhwcixcbiAgICAgIFwiZXhwclwiOiBleHByLFxuICAgICAgXCJjaGlsZHJlblwiOiBbbWV0YUV4cHIsIGV4cHJdXG4gICAgfSA6XG4gICAgZXhwcjtcbn07XG5leHBvcnRzLmFuYWx5emVXcmFwTWV0YSA9IGFuYWx5emVXcmFwTWV0YTtcblxudmFyIGFuYWx5emVNYXAgPSBmdW5jdGlvbiBhbmFseXplTWFwKGVudiwgZm9ybSwgbmFtZSkge1xuICB2YXIgZXhwckVudiA9IGNvbmooZW52LCB7XG4gICAgXCJjb250ZXh0XCI6IFwiZXhwclwiXG4gIH0pO1xuICB2YXIgaXNTaW1wbGVLZXlzID0gaXNFdmVyeShmdW5jdGlvbigkMSkge1xuICAgIHJldHVybiAoaXNTdHJpbmcoJDEpKSB8fCAoaXNLZXl3b3JkKCQxKSk7XG4gIH0sIGtleXMoZm9ybSkpO1xuICB2YXIga3MgPSBkaXNhbGxvd2luZ1JlY3VyKHZlYyhtYXAoZnVuY3Rpb24oJDEpIHtcbiAgICByZXR1cm4gYW5hbHl6ZShleHByRW52LCAkMSwgbmFtZSk7XG4gIH0sIGtleXMoZm9ybSkpKSk7XG4gIHZhciB2cyA9IGRpc2FsbG93aW5nUmVjdXIodmVjKG1hcChmdW5jdGlvbigkMSkge1xuICAgIHJldHVybiBhbmFseXplKGV4cHJFbnYsICQxLCBuYW1lKTtcbiAgfSwgdmFscyhmb3JtKSkpKTtcbiAgcmV0dXJuIGFuYWx5emVXcmFwTWV0YSh7XG4gICAgXCJvcFwiOiBcIm1hcFwiLFxuICAgIFwiZW52XCI6IGVudixcbiAgICBcImZvcm1cIjogZm9ybSxcbiAgICBcImtleXNcIjoga3MsXG4gICAgXCJ2YWxzXCI6IHZzLFxuICAgIFwic2ltcGxlLWtleXM/XCI6IGlzU2ltcGxlS2V5cyxcbiAgICBcImNoaWxkcmVuXCI6IHZlYyhpbnRlcmxlYXZlKGtzLCB2cykpXG4gIH0sIG5hbWUpO1xufTtcbmV4cG9ydHMuYW5hbHl6ZU1hcCA9IGFuYWx5emVNYXA7XG5cbnZhciBhbmFseXplID0gZnVuY3Rpb24gYW5hbHl6ZShlbnYsIGZvcm0sIG5hbWUpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGFuYWx5emUoZW52LCBmb3JtLCB2b2lkKDApKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gaXNTeW1ib2woZm9ybSkgP1xuICAgICAgICBhbmFseXplU3ltYm9sKGVudiwgZm9ybSkgOlxuICAgICAgaXNLZXl3b3JkKGZvcm0pID9cbiAgICAgICAgYW5hbHl6ZUtleXdvcmQoZW52LCBmb3JtKSA6XG4gICAgICAoaXNTZXEoZm9ybSkpICYmICghKGlzRW1wdHkoZm9ybSkpKSA/XG4gICAgICAgIGFuYWx5emVTZXEoZW52LCBmb3JtLCBuYW1lKSA6XG4gICAgICBpc0RpY3Rpb25hcnkoZm9ybSkgP1xuICAgICAgICBhbmFseXplRGljdGlvbmFyeShlbnYsIGZvcm0sIG5hbWUpIDpcbiAgICAgIGlzVmVjdG9yKGZvcm0pID9cbiAgICAgICAgYW5hbHl6ZVZlY3RvcihlbnYsIGZvcm0sIG5hbWUpIDpcbiAgICAgIFwiZWxzZVwiID9cbiAgICAgICAge1xuICAgICAgICAgIFwib3BcIjogXCJjb25zdGFudFwiLFxuICAgICAgICAgIFwiZW52XCI6IGVudixcbiAgICAgICAgICBcImZvcm1cIjogZm9ybVxuICAgICAgICB9IDpcbiAgICAgICAgdm9pZCgwKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAoZnVuY3Rpb24oKSB7IHRocm93IEVycm9yKFwiSW52YWxpZCBhcml0eVwiKTsgfSkoKVxuICB9O1xuICByZXR1cm4gdm9pZCgwKTtcbn07XG5leHBvcnRzLmFuYWx5emUgPSBhbmFseXplXG4iLCIoZnVuY3Rpb24oZ2xvYmFsKXt2YXIgX25zXyA9IHtcbiAgXCJpZFwiOiBcImludGVyYWN0aXZhdGUtd2lzcC5tYWluXCJcbn07XG52YXIgaW50ZXJhY3RpdmF0ZSA9IHJlcXVpcmUoXCJpbnRlcmFjdGl2YXRlXCIpOztcbnZhciBoYXNoYXJlID0gcmVxdWlyZShcImNvZGVtaXJyb3ItaGFzaGFyZVwiKTs7XG52YXIgcGVyc2lzdCA9IHJlcXVpcmUoXCJjb2RlbWlycm9yLXBlcnNpc3RcIik7O1xudmFyIGludGVyYWN0aXZhdGVXaXNwX2hvc3QgPSByZXF1aXJlKFwiLi9ob3N0XCIpO1xudmFyIHN0YXJ0SG9zdCA9IGludGVyYWN0aXZhdGVXaXNwX2hvc3Quc3RhcnRIb3N0Ozs7XG5cbmludGVyYWN0aXZhdGUoQ29kZU1pcnJvcik7XG5cbmhhc2hhcmUoQ29kZU1pcnJvcik7XG5cbnBlcnNpc3QoQ29kZU1pcnJvcik7XG5cbnN0YXJ0SG9zdCgpO1xuXG52YXIgZWRpdG9yID0gQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5LCB7XG4gIFwicGVyc2lzdFwiOiB0cnVlLFxuICBcIm1hdGNoQnJhY2tldHNcIjogdHJ1ZSxcbiAgXCJlbGVjdHJpY0NoYXJzXCI6IHRydWUsXG4gIFwic3R5bGVBY3RpdmVMaW5lXCI6IHRydWUsXG4gIFwiYXV0b2ZvY3VzXCI6IHRydWUsXG4gIFwidGhlbWVcIjogXCJzb2xhcml6ZWQgZGFya1wiLFxuICBcIm1vZGVcIjogXCJjbG9qdXJlXCIsXG4gIFwidmFsdWVcIjogKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW50cm9cIikpLnRleHRDb250ZW50LFxuICBcImludGVyYWN0aXZhdGVcIjogdHJ1ZSxcbiAgXCJpbnRlcmFjdGl2ZVNlcGFyYXRvclwiOiAvXjs7ID0+W15cXG5dKiQvbSxcbiAgXCJleHRyYUtleXNcIjoge1xuICAgIFwiVGFiXCI6IFwiaW5kZW50U2VsZWN0aW9uXCJcbiAgfVxufSk7XG5leHBvcnRzLmVkaXRvciA9IGVkaXRvcjtcblxuZ2xvYmFsLmVkaXRvciA9IGVkaXRvclxufSkod2luZG93KSIsInZhciBldmVudHMgPSByZXF1aXJlKCdldmVudHMnKTtcblxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcbmV4cG9ydHMuaXNEYXRlID0gZnVuY3Rpb24ob2JqKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IERhdGVdJ307XG5leHBvcnRzLmlzUmVnRXhwID0gZnVuY3Rpb24ob2JqKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nfTtcblxuXG5leHBvcnRzLnByaW50ID0gZnVuY3Rpb24gKCkge307XG5leHBvcnRzLnB1dHMgPSBmdW5jdGlvbiAoKSB7fTtcbmV4cG9ydHMuZGVidWcgPSBmdW5jdGlvbigpIHt9O1xuXG5leHBvcnRzLmluc3BlY3QgPSBmdW5jdGlvbihvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMpIHtcbiAgdmFyIHNlZW4gPSBbXTtcblxuICB2YXIgc3R5bGl6ZSA9IGZ1bmN0aW9uKHN0ciwgc3R5bGVUeXBlKSB7XG4gICAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG4gICAgdmFyIHN0eWxlcyA9XG4gICAgICAgIHsgJ2JvbGQnIDogWzEsIDIyXSxcbiAgICAgICAgICAnaXRhbGljJyA6IFszLCAyM10sXG4gICAgICAgICAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAgICAgICAgICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICAgICAgICAgJ3doaXRlJyA6IFszNywgMzldLFxuICAgICAgICAgICdncmV5JyA6IFs5MCwgMzldLFxuICAgICAgICAgICdibGFjaycgOiBbMzAsIDM5XSxcbiAgICAgICAgICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgICAgICAgICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgICAgICAgICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICAgICAgICAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICAgICAgICAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgICAgICAgICAneWVsbG93JyA6IFszMywgMzldIH07XG5cbiAgICB2YXIgc3R5bGUgPVxuICAgICAgICB7ICdzcGVjaWFsJzogJ2N5YW4nLFxuICAgICAgICAgICdudW1iZXInOiAnYmx1ZScsXG4gICAgICAgICAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgICAgICAgICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAgICAgICAgICdudWxsJzogJ2JvbGQnLFxuICAgICAgICAgICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAgICAgICAgICdkYXRlJzogJ21hZ2VudGEnLFxuICAgICAgICAgIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICAgICAgICAgJ3JlZ2V4cCc6ICdyZWQnIH1bc3R5bGVUeXBlXTtcblxuICAgIGlmIChzdHlsZSkge1xuICAgICAgcmV0dXJuICdcXDAzM1snICsgc3R5bGVzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICAgJ1xcMDMzWycgKyBzdHlsZXNbc3R5bGVdWzFdICsgJ20nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgfTtcbiAgaWYgKCEgY29sb3JzKSB7XG4gICAgc3R5bGl6ZSA9IGZ1bmN0aW9uKHN0ciwgc3R5bGVUeXBlKSB7IHJldHVybiBzdHI7IH07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXQodmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAgIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLmluc3BlY3QgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICAgIHZhbHVlICE9PSBleHBvcnRzICYmXG4gICAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMpO1xuICAgIH1cblxuICAgIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiBzdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG5cbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgICAgIHJldHVybiBzdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuXG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG5cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAgIH1cbiAgICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG4gICAgfVxuXG4gICAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICAgIHZhciB2aXNpYmxlX2tleXMgPSBPYmplY3Rfa2V5cyh2YWx1ZSk7XG4gICAgdmFyIGtleXMgPSBzaG93SGlkZGVuID8gT2JqZWN0X2dldE93blByb3BlcnR5TmFtZXModmFsdWUpIDogdmlzaWJsZV9rZXlzO1xuXG4gICAgLy8gRnVuY3Rpb25zIHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3R5bGl6ZSgnJyArIHZhbHVlLCAncmVnZXhwJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGF0ZXMgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZFxuICAgIGlmIChpc0RhdGUodmFsdWUpICYmIGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gc3R5bGl6ZSh2YWx1ZS50b1VUQ1N0cmluZygpLCAnZGF0ZScpO1xuICAgIH1cblxuICAgIHZhciBiYXNlLCB0eXBlLCBicmFjZXM7XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBvYmplY3QgdHlwZVxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgdHlwZSA9ICdBcnJheSc7XG4gICAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gJ09iamVjdCc7XG4gICAgICBicmFjZXMgPSBbJ3snLCAnfSddO1xuICAgIH1cblxuICAgIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICBiYXNlID0gKGlzUmVnRXhwKHZhbHVlKSkgPyAnICcgKyB2YWx1ZSA6ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2UgPSAnJztcbiAgICB9XG5cbiAgICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgYmFzZSA9ICcgJyArIHZhbHVlLnRvVVRDU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgICB9XG5cbiAgICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3R5bGl6ZSgnJyArIHZhbHVlLCAncmVnZXhwJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgICB2YXIgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICB2YXIgbmFtZSwgc3RyO1xuICAgICAgaWYgKHZhbHVlLl9fbG9va3VwR2V0dGVyX18pIHtcbiAgICAgICAgaWYgKHZhbHVlLl9fbG9va3VwR2V0dGVyX18oa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZS5fX2xvb2t1cFNldHRlcl9fKGtleSkpIHtcbiAgICAgICAgICAgIHN0ciA9IHN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IHN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlLl9fbG9va3VwU2V0dGVyX18oa2V5KSkge1xuICAgICAgICAgICAgc3RyID0gc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZpc2libGVfa2V5cy5pbmRleE9mKGtleSkgPCAwKSB7XG4gICAgICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cikge1xuICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKHZhbHVlW2tleV0pIDwgMCkge1xuICAgICAgICAgIGlmIChyZWN1cnNlVGltZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0ciA9IGZvcm1hdCh2YWx1ZVtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyID0gZm9ybWF0KHZhbHVlW2tleV0sIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdBcnJheScgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICAgICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICAgICAgbmFtZSA9IHN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgICAgIG5hbWUgPSBzdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG4gICAgfSk7XG5cbiAgICBzZWVuLnBvcCgpO1xuXG4gICAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICAgIG51bUxpbmVzRXN0Kys7XG4gICAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgICByZXR1cm4gcHJldiArIGN1ci5sZW5ndGggKyAxO1xuICAgIH0sIDApO1xuXG4gICAgaWYgKGxlbmd0aCA+IDUwKSB7XG4gICAgICBvdXRwdXQgPSBicmFjZXNbMF0gK1xuICAgICAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICBicmFjZXNbMV07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0ID0gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChvYmosICh0eXBlb2YgZGVwdGggPT09ICd1bmRlZmluZWQnID8gMiA6IGRlcHRoKSk7XG59O1xuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIGFyIGluc3RhbmNlb2YgQXJyYXkgfHxcbiAgICAgICAgIEFycmF5LmlzQXJyYXkoYXIpIHx8XG4gICAgICAgICAoYXIgJiYgYXIgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgaXNBcnJheShhci5fX3Byb3RvX18pKTtcbn1cblxuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gcmUgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAodHlwZW9mIHJlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocmUpID09PSAnW29iamVjdCBSZWdFeHBdJyk7XG59XG5cblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgaWYgKGQgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiBkICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvcGVydGllcyA9IERhdGUucHJvdG90eXBlICYmIE9iamVjdF9nZXRPd25Qcm9wZXJ0eU5hbWVzKERhdGUucHJvdG90eXBlKTtcbiAgdmFyIHByb3RvID0gZC5fX3Byb3RvX18gJiYgT2JqZWN0X2dldE93blByb3BlcnR5TmFtZXMoZC5fX3Byb3RvX18pO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJvdG8pID09PSBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKTtcbn1cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydHMubG9nID0gZnVuY3Rpb24gKG1zZykge307XG5cbmV4cG9ydHMucHVtcCA9IG51bGw7XG5cbnZhciBPYmplY3Rfa2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgcmVzLnB1c2goa2V5KTtcbiAgICByZXR1cm4gcmVzO1xufTtcblxudmFyIE9iamVjdF9nZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHJlcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xuXG52YXIgT2JqZWN0X2NyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKHByb3RvdHlwZSwgcHJvcGVydGllcykge1xuICAgIC8vIGZyb20gZXM1LXNoaW1cbiAgICB2YXIgb2JqZWN0O1xuICAgIGlmIChwcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICAgICAgb2JqZWN0ID0geyAnX19wcm90b19fJyA6IG51bGwgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdG90eXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAndHlwZW9mIHByb3RvdHlwZVsnICsgKHR5cGVvZiBwcm90b3R5cGUpICsgJ10gIT0gXFwnb2JqZWN0XFwnJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICBUeXBlLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgICAgICAgb2JqZWN0ID0gbmV3IFR5cGUoKTtcbiAgICAgICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydGllcykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xufTtcblxuZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uKGN0b3IsIHN1cGVyQ3Rvcikge1xuICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3RfY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICh0eXBlb2YgZiAhPT0gJ3N0cmluZycpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goZXhwb3J0cy5pbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzogcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKXtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgZXhwb3J0cy5pbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc2F2ZSA9IFwic2F2ZUBoYXNoYXJlXCJcbnZhciBsb2FkID0gXCJsb2FkQGhhc2hhcmVcIlxuXG5mdW5jdGlvbiBwbHVnaW4oQ29kZU1pcnJvcikge1xuICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbihcImhhc2hhcmVcIiwgZmFsc2UsIGZ1bmN0aW9uKGVkaXRvciwgdmFsdWUpIHtcbiAgICAvKipcbiAgICBUYWtlcyBlZGl0b3IgYW5kIGVuYWJsZXMgcGVyc2lzdHMgY2hhbmdlcyB0byB0aGUgYnVmZmVyIGFjcm9zcyB0aGUgc2Vzc2lvbnMuXG4gICAgKiovXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB2YXIgc2F2aW5nID0gZmFsc2VcbiAgICAgIGVkaXRvcltzYXZlXSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGxvY2F0aW9uLmhhc2ggPSBlbmNvZGVVUklDb21wb25lbnQoZWRpdG9yLmdldFZhbHVlKCkpXG4gICAgICB9XG4gICAgICBlZGl0b3JbbG9hZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cigxKSlcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSBlZGl0b3IuZ2V0VmFsdWUoKSkgZWRpdG9yLnNldFZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGVkaXRvcltzYXZlXSwgZmFsc2UpXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIiwgZWRpdG9yW2xvYWRdLCBmYWxzZSlcblxuICAgICAgZWRpdG9yW2xvYWRdKClcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGVkaXRvcltzYXZlXSwgZmFsc2UpXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgZWRpdG9yW2xvYWRdLCBmYWxzZSlcbiAgICB9XG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGx1Z2luXG4iLCJ2YXIgX25zXyA9IHtcbiAgXCJpZFwiOiBcImludGVyYWN0aXZhdGUtd2lzcC5ob3N0XCJcbn07XG52YXIgcmVuZGVyID0gcmVxdWlyZShcImludGVyYWN0aXZhdGUvcmVuZGVyXCIpOztcbnZhciB3aXNwX3JlYWRlciA9IHJlcXVpcmUoXCJ3aXNwL3JlYWRlclwiKTtcbnZhciByZWFkXyA9IHdpc3BfcmVhZGVyLnJlYWRfOztcbnZhciB3aXNwX2NvbXBpbGVyID0gcmVxdWlyZShcIndpc3AvY29tcGlsZXJcIik7XG52YXIgY29tcGlsZV8gPSB3aXNwX2NvbXBpbGVyLmNvbXBpbGVfOztcbnZhciB3aXNwX3NlcXVlbmNlID0gcmVxdWlyZShcIndpc3Avc2VxdWVuY2VcIik7XG52YXIgZmlyc3QgPSB3aXNwX3NlcXVlbmNlLmZpcnN0O1xudmFyIHJlc3QgPSB3aXNwX3NlcXVlbmNlLnJlc3Q7XG52YXIgbGlzdCA9IHdpc3Bfc2VxdWVuY2UubGlzdDs7XG52YXIgd2lzcF9hc3QgPSByZXF1aXJlKFwid2lzcC9hc3RcIik7XG52YXIgc3ltYm9sID0gd2lzcF9hc3Quc3ltYm9sO1xudmFyIHByU3RyID0gd2lzcF9hc3QucHJTdHI7O1xudmFyIHdpc3BfcnVudGltZSA9IHJlcXVpcmUoXCJ3aXNwL3J1bnRpbWVcIik7XG52YXIgc3VicyA9IHdpc3BfcnVudGltZS5zdWJzOztcbnZhciB1dGlsID0gcmVxdWlyZShcInV0aWxcIik7XG52YXIgaW5zcGVjdCA9IHV0aWwuaW5zcGVjdDs7O1xuXG52YXIgX19vdXRfXyA9IGZ1bmN0aW9uIF9fb3V0X18oKSB7XG4gIHJldHVybiB2b2lkKDApO1xufTtcbmV4cG9ydHMuX19vdXRfXyA9IF9fb3V0X187XG5cbndpbmRvdy5leHBvcnRzID0ge307XG5cbndpbmRvdy5tb2R1bGUgPSB7XG4gIFwiZXhwb3J0c1wiOiB3aW5kb3cuZXhwb3J0c1xufTtcblxud2luZG93Lmxpc3QgPSBsaXN0O1xuXG53aW5kb3cuc3ltYm9sID0gc3ltYm9sO1xuXG53aW5kb3cuT3V0ID0gX19vdXRfXztcblxud2luZG93Ll9fcHJpbnRDb21waWxlZF9fID0gZmFsc2U7XG5cbndpbmRvdy5fX3ByaW50UmVhZF9fID0gZmFsc2U7XG5cbnZhciBFdmFsdWF0aW9uUmVzdWx0ID0gZnVuY3Rpb24gRXZhbHVhdGlvblJlc3VsdChvdXRwdXQpIHtcbiAgdGhpcy52YWx1ZSA9IG91dHB1dDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZXhwb3J0cy5FdmFsdWF0aW9uUmVzdWx0ID0gRXZhbHVhdGlvblJlc3VsdDtcblxucmVuZGVyLmRlZmluZShFdmFsdWF0aW9uUmVzdWx0LCBmdW5jdGlvbihyZXN1bHQpIHtcbiAgdmFyIG91dHB1dCA9IHJlc3VsdC52YWx1ZTtcbiAgdmFyIHZpZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICB2aWV3LmlubmVySFRNTCA9ICgob3V0cHV0IHx8IDApW1wiZXJyb3JcIl0pIHx8IChcIlwiICsgKF9fcHJpbnRSZWFkX18gP1xuICAgIFwiXCIgKyBcIjxoMT5SZWFkPC9oMT5cIiArIFwiPGRpdj5cIiArIChpbnNwZWN0KChvdXRwdXQgfHwgMClbXCJmb3Jtc1wiXSkpICsgXCI8L2Rpdj5cIiA6XG4gICAgXCJcIikgKyAoX19wcmludENvbXBpbGVkX18gP1xuICAgIFwiXCIgKyBcIjxoMz5Db21waWxlZCBKUzwvaDM+XCIgKyBcIjxkaXY+XCIgKyAoKG91dHB1dCB8fCAwKVtcImpzLWNvZGVcIl0pICsgXCI8L2Rpdj5cIiA6XG4gICAgXCJcIikgKyBcIjxoMz5FdmFsIHJlc3VsdDwvaDM+XCIgKyBcIjxkaXY+XCIgKyAoKG91dHB1dCB8fCAwKVtcInByaW50XCJdKSArIFwiPC9kaXY+XCIpO1xuICByZXR1cm4gdmlldztcbn0pO1xuXG52YXIgc2VuZCA9IGZ1bmN0aW9uIHNlbmQocGFja2V0KSB7XG4gIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gIGV2ZW50LmluaXRDdXN0b21FdmVudChcImNsaWVudFwiLCBmYWxzZSwgdHJ1ZSwgcGFja2V0KTtcbiAgcmV0dXJuIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn07XG5leHBvcnRzLnNlbmQgPSBzZW5kO1xuXG52YXIgc3RhcnRIb3N0ID0gZnVuY3Rpb24gc3RhcnRIb3N0KCkge1xuICByZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzZXJ2ZXJcIiwgaGFuZGxlLCBmYWxzZSk7XG59O1xuZXhwb3J0cy5zdGFydEhvc3QgPSBzdGFydEhvc3Q7XG5cbnZhciBoYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUocGFja2V0KSB7XG4gIHZhciBhZGRyZXNzID0gKCgocGFja2V0IHx8IDApW1wiZGV0YWlsXCJdKSB8fCAwKVtcInRvXCJdO1xuICB2YXIgaW5wdXQgPSAoKChwYWNrZXQgfHwgMClbXCJkZXRhaWxcIl0pIHx8IDApW1wic291cmNlXCJdO1xuICB2YXIgb3V0cHV0ID0gZXZhbHVhdGUoaW5wdXQpO1xuICB2YXIgcmVzdWx0ID0gbmV3IEV2YWx1YXRpb25SZXN1bHQob3V0cHV0KTtcbiAgKF9fb3V0X18gfHwgMClbYWRkcmVzc10gPSByZXN1bHQ7XG4gIHJldHVybiBzZW5kKHtcbiAgICBcImZyb21cIjogYWRkcmVzcyxcbiAgICBcIm1lc3NhZ2VcIjogcmVzdWx0XG4gIH0pO1xufTtcbmV4cG9ydHMuaGFuZGxlID0gaGFuZGxlO1xuXG52YXIgZXZhbHVhdGUgPSBmdW5jdGlvbiBldmFsdWF0ZShpbnB1dCkge1xuICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZm9ybXMgPSByZWFkXyhpbnB1dCk7XG4gICAgICB2YXIganNDb2RlID0gY29tcGlsZV8oZm9ybXMpO1xuICAgICAgdmFyIHByZWZpeENvZGUgPSBcInZhclwiID09PSBzdWJzKGpzQ29kZSwgMCwgMykgP1xuICAgICAgICBcIlwiIDpcbiAgICAgICAgXCJfID0gXCI7XG4gICAgICB2YXIganNOb3JtYWxpemVkID0gXCJcIiArIFwidHJ5IHsgXCIgKyBwcmVmaXhDb2RlICsganNDb2RlICsgXCIgfSBjYXRjaChlKSB7IGUgfVwiO1xuICAgICAgdmFyIHJlc3VsdCA9IHdpbmRvdy5ldmFsKGpzTm9ybWFsaXplZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBcImlucHV0XCI6IGlucHV0LFxuICAgICAgICBcImZvcm1zXCI6IGZvcm1zLFxuICAgICAgICBcImpzLWNvZGVcIjoganNDb2RlLFxuICAgICAgICBcInJlc3VsdFwiOiByZXN1bHQsXG4gICAgICAgIFwicHJpbnRcIjogcHJTdHIocmVzdWx0KVxuICAgICAgfTtcbiAgICB9KSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBcImlucHV0XCI6IGlucHV0LFxuICAgICAgXCJlcnJvclwiOiBlcnJvclxuICAgIH07XG4gIH19KSgpO1xufTtcbmV4cG9ydHMuZXZhbHVhdGUgPSBldmFsdWF0ZSIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBvbkNoYW5nZShlZGl0b3IpIHtcbiAgbG9jYWxTdG9yYWdlW3dpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiI1wiKVswXV0gPSBlZGl0b3IuZ2V0VmFsdWUoKVxufVxuXG5mdW5jdGlvbiBzZXR1cChlZGl0b3IsIHZhbHVlKSB7XG4gIC8qKlxuICBUYWtlcyBlZGl0b3IgYW5kIGVuYWJsZXMgcGVyc2lzdHMgY2hhbmdlcyB0byB0aGUgYnVmZmVyIGFjcm9zcyB0aGUgc2Vzc2lvbnMuXG4gICoqL1xuICBpZiAodmFsdWUpIHtcbiAgICB2YXIgYWRkcmVzcyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiI1wiKVswXVxuICAgIHZhciBwZXJzaXN0ZWQgPSBsb2NhbFN0b3JhZ2VbYWRkcmVzc10gfHwgZWRpdG9yLmdldFZhbHVlKClcbiAgICBlZGl0b3Iuc2V0VmFsdWUocGVyc2lzdGVkKVxuICAgIGVkaXRvci5vbihcImNoYW5nZVwiLCBvbkNoYW5nZSlcbiAgfSBlbHNlIHtcbiAgICBlZGl0b3Iub2ZmKFwiY2hhbmdlXCIsIG9uQ2hhbmdlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHBsdWdpbihDb2RlTWlycm9yKSB7XG4gIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKFwicGVyc2lzdFwiLCBmYWxzZSwgc2V0dXApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGx1Z2luXG4iLCJ2YXIgX25zXyA9IHtcbiAgXCJpZFwiOiBcIndpc3AuYmFja2VuZC5qYXZhc2NyaXB0LndyaXRlclwiLFxuICBcImRvY1wiOiBcIkNvbXBpbGVyIGJhY2tlbmQgZm9yIGZvciB3cml0aW5nIEpTIG91dHB1dFwiXG59O1xudmFyIHdpc3BfYXN0ID0gcmVxdWlyZShcIi4vLi4vLi4vYXN0XCIpO1xudmFyIG5hbWUgPSB3aXNwX2FzdC5uYW1lO1xudmFyIG5hbWVzcGFjZSA9IHdpc3BfYXN0Lm5hbWVzcGFjZTtcbnZhciBzeW1ib2wgPSB3aXNwX2FzdC5zeW1ib2w7XG52YXIgaXNTeW1ib2wgPSB3aXNwX2FzdC5pc1N5bWJvbDtcbnZhciBpc0tleXdvcmQgPSB3aXNwX2FzdC5pc0tleXdvcmQ7O1xudmFyIHdpc3Bfc2VxdWVuY2UgPSByZXF1aXJlKFwiLi8uLi8uLi9zZXF1ZW5jZVwiKTtcbnZhciBsaXN0ID0gd2lzcF9zZXF1ZW5jZS5saXN0O1xudmFyIGZpcnN0ID0gd2lzcF9zZXF1ZW5jZS5maXJzdDtcbnZhciByZXN0ID0gd2lzcF9zZXF1ZW5jZS5yZXN0O1xudmFyIGlzTGlzdCA9IHdpc3Bfc2VxdWVuY2UuaXNMaXN0O1xudmFyIHZlYyA9IHdpc3Bfc2VxdWVuY2UudmVjO1xudmFyIG1hcCA9IHdpc3Bfc2VxdWVuY2UubWFwO1xudmFyIGNvdW50ID0gd2lzcF9zZXF1ZW5jZS5jb3VudDtcbnZhciBsYXN0ID0gd2lzcF9zZXF1ZW5jZS5sYXN0O1xudmFyIHJlZHVjZSA9IHdpc3Bfc2VxdWVuY2UucmVkdWNlO1xudmFyIGlzRW1wdHkgPSB3aXNwX3NlcXVlbmNlLmlzRW1wdHk7O1xudmFyIHdpc3BfcnVudGltZSA9IHJlcXVpcmUoXCIuLy4uLy4uL3J1bnRpbWVcIik7XG52YXIgaXNUcnVlID0gd2lzcF9ydW50aW1lLmlzVHJ1ZTtcbnZhciBpc05pbCA9IHdpc3BfcnVudGltZS5pc05pbDtcbnZhciBpc1N0cmluZyA9IHdpc3BfcnVudGltZS5pc1N0cmluZztcbnZhciBpc051bWJlciA9IHdpc3BfcnVudGltZS5pc051bWJlcjtcbnZhciBpc1ZlY3RvciA9IHdpc3BfcnVudGltZS5pc1ZlY3RvcjtcbnZhciBpc0RpY3Rpb25hcnkgPSB3aXNwX3J1bnRpbWUuaXNEaWN0aW9uYXJ5O1xudmFyIGlzQm9vbGVhbiA9IHdpc3BfcnVudGltZS5pc0Jvb2xlYW47XG52YXIgaXNSZVBhdHRlcm4gPSB3aXNwX3J1bnRpbWUuaXNSZVBhdHRlcm47XG52YXIgcmVGaW5kID0gd2lzcF9ydW50aW1lLnJlRmluZDtcbnZhciBkZWMgPSB3aXNwX3J1bnRpbWUuZGVjO1xudmFyIHN1YnMgPSB3aXNwX3J1bnRpbWUuc3Viczs7XG52YXIgd2lzcF9zdHJpbmcgPSByZXF1aXJlKFwiLi8uLi8uLi9zdHJpbmdcIik7XG52YXIgcmVwbGFjZSA9IHdpc3Bfc3RyaW5nLnJlcGxhY2U7XG52YXIgam9pbiA9IHdpc3Bfc3RyaW5nLmpvaW47XG52YXIgc3BsaXQgPSB3aXNwX3N0cmluZy5zcGxpdDtcbnZhciB1cHBlckNhc2UgPSB3aXNwX3N0cmluZy51cHBlckNhc2U7OztcblxudmFyIHdyaXRlUmVmZXJlbmNlID0gZnVuY3Rpb24gd3JpdGVSZWZlcmVuY2UoZm9ybSkge1xuICBcIlRyYW5zbGF0ZXMgcmVmZXJlbmNlcyBmcm9tIGNsb2p1cmUgY29udmVudGlvbiB0byBKUzpcXG5cXG4gICoqbWFjcm9zKiogICAgICBfX21hY3Jvc19fXFxuICBsaXN0LT52ZWN0b3IgICAgbGlzdFRvVmVjdG9yXFxuICBzZXQhICAgICAgICAgICAgc2V0XFxuICBmb29fYmFyICAgICAgICAgZm9vX2JhclxcbiAgbnVtYmVyPyAgICAgICAgIGlzTnVtYmVyXFxuICBjcmVhdGUtc2VydmVyICAgY3JlYXRlU2VydmVyXCI7XG4gIHJldHVybiAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlkID0gbmFtZShmb3JtKTtcbiAgICBpZCA9IGlkID09PSBcIipcIiA/XG4gICAgICBcIm11bHRpcGx5XCIgOlxuICAgIGlkID09PSBcIi9cIiA/XG4gICAgICBcImRpdmlkZVwiIDpcbiAgICBpZCA9PT0gXCIrXCIgP1xuICAgICAgXCJzdW1cIiA6XG4gICAgaWQgPT09IFwiLVwiID9cbiAgICAgIFwic3VidHJhY3RcIiA6XG4gICAgaWQgPT09IFwiPVwiID9cbiAgICAgIFwiZXF1YWw/XCIgOlxuICAgIGlkID09PSBcIj09XCIgP1xuICAgICAgXCJzdHJpY3QtZXF1YWw/XCIgOlxuICAgIGlkID09PSBcIjw9XCIgP1xuICAgICAgXCJub3QtZ3JlYXRlci10aGFuXCIgOlxuICAgIGlkID09PSBcIj49XCIgP1xuICAgICAgXCJub3QtbGVzcy10aGFuXCIgOlxuICAgIGlkID09PSBcIj5cIiA/XG4gICAgICBcImdyZWF0ZXItdGhhblwiIDpcbiAgICBpZCA9PT0gXCI8XCIgP1xuICAgICAgXCJsZXNzLXRoYW5cIiA6XG4gICAgXCJlbHNlXCIgP1xuICAgICAgaWQgOlxuICAgICAgdm9pZCgwKTtcbiAgICBpZCA9IGpvaW4oXCJfXCIsIHNwbGl0KGlkLCBcIipcIikpO1xuICAgIGlkID0gam9pbihcIi10by1cIiwgc3BsaXQoaWQsIFwiLT5cIikpO1xuICAgIGlkID0gam9pbihzcGxpdChpZCwgXCIhXCIpKTtcbiAgICBpZCA9IGpvaW4oXCIkXCIsIHNwbGl0KGlkLCBcIiVcIikpO1xuICAgIGlkID0gam9pbihcIi1wbHVzLVwiLCBzcGxpdChpZCwgXCIrXCIpKTtcbiAgICBpZCA9IGpvaW4oXCItYW5kLVwiLCBzcGxpdChpZCwgXCImXCIpKTtcbiAgICBpZCA9IGxhc3QoaWQpID09PSBcIj9cIiA/XG4gICAgICBcIlwiICsgXCJpcy1cIiArIChzdWJzKGlkLCAwLCBkZWMoY291bnQoaWQpKSkpIDpcbiAgICAgIGlkO1xuICAgIGlkID0gcmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwga2V5KSB7XG4gICAgICByZXR1cm4gXCJcIiArIHJlc3VsdCArICgoIShpc0VtcHR5KHJlc3VsdCkpKSAmJiAoIShpc0VtcHR5KGtleSkpKSA/XG4gICAgICAgIFwiXCIgKyAodXBwZXJDYXNlKChrZXkgfHwgMClbMF0pKSArIChzdWJzKGtleSwgMSkpIDpcbiAgICAgICAga2V5KTtcbiAgICB9LCBcIlwiLCBzcGxpdChpZCwgXCItXCIpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH0pKCk7XG59O1xuZXhwb3J0cy53cml0ZVJlZmVyZW5jZSA9IHdyaXRlUmVmZXJlbmNlO1xuXG52YXIgd3JpdGVLZXl3b3JkUmVmZXJlbmNlID0gZnVuY3Rpb24gd3JpdGVLZXl3b3JkUmVmZXJlbmNlKGZvcm0pIHtcbiAgcmV0dXJuIFwiXCIgKyBcIlxcXCJcIiArIChuYW1lKGZvcm0pKSArIFwiXFxcIlwiO1xufTtcbmV4cG9ydHMud3JpdGVLZXl3b3JkUmVmZXJlbmNlID0gd3JpdGVLZXl3b3JkUmVmZXJlbmNlO1xuXG52YXIgd3JpdGVLZXl3b3JkID0gZnVuY3Rpb24gd3JpdGVLZXl3b3JkKGZvcm0pIHtcbiAgcmV0dXJuIFwiXCIgKyBcIlxcXCJcIiArIFwi6p6JXCIgKyAobmFtZShmb3JtKSkgKyBcIlxcXCJcIjtcbn07XG5leHBvcnRzLndyaXRlS2V5d29yZCA9IHdyaXRlS2V5d29yZDtcblxudmFyIHdyaXRlU3ltYm9sID0gZnVuY3Rpb24gd3JpdGVTeW1ib2woZm9ybSkge1xuICByZXR1cm4gd3JpdGUobGlzdChzeW1ib2wodm9pZCgwKSwgXCJzeW1ib2xcIiksIG5hbWVzcGFjZShmb3JtKSwgbmFtZShmb3JtKSkpO1xufTtcbmV4cG9ydHMud3JpdGVTeW1ib2wgPSB3cml0ZVN5bWJvbDtcblxudmFyIHdyaXRlTmlsID0gZnVuY3Rpb24gd3JpdGVOaWwoZm9ybSkge1xuICByZXR1cm4gXCJ2b2lkKDApXCI7XG59O1xuZXhwb3J0cy53cml0ZU5pbCA9IHdyaXRlTmlsO1xuXG52YXIgd3JpdGVOdW1iZXIgPSBmdW5jdGlvbiB3cml0ZU51bWJlcihmb3JtKSB7XG4gIHJldHVybiBmb3JtO1xufTtcbmV4cG9ydHMud3JpdGVOdW1iZXIgPSB3cml0ZU51bWJlcjtcblxudmFyIHdyaXRlQm9vbGVhbiA9IGZ1bmN0aW9uIHdyaXRlQm9vbGVhbihmb3JtKSB7XG4gIHJldHVybiBpc1RydWUoZm9ybSkgP1xuICAgIFwidHJ1ZVwiIDpcbiAgICBcImZhbHNlXCI7XG59O1xuZXhwb3J0cy53cml0ZUJvb2xlYW4gPSB3cml0ZUJvb2xlYW47XG5cbnZhciB3cml0ZVN0cmluZyA9IGZ1bmN0aW9uIHdyaXRlU3RyaW5nKGZvcm0pIHtcbiAgZm9ybSA9IHJlcGxhY2UoZm9ybSwgUmVnRXhwKFwiXFxcXFxcXFxcIiwgXCJnXCIpLCBcIlxcXFxcXFxcXCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXG5cIiwgXCJnXCIpLCBcIlxcXFxuXCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXHJcIiwgXCJnXCIpLCBcIlxcXFxyXCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXHRcIiwgXCJnXCIpLCBcIlxcXFx0XCIpO1xuICBmb3JtID0gcmVwbGFjZShmb3JtLCBSZWdFeHAoXCJcXFwiXCIsIFwiZ1wiKSwgXCJcXFxcXFxcIlwiKTtcbiAgcmV0dXJuIFwiXCIgKyBcIlxcXCJcIiArIGZvcm0gKyBcIlxcXCJcIjtcbn07XG5leHBvcnRzLndyaXRlU3RyaW5nID0gd3JpdGVTdHJpbmc7XG5cbnZhciB3cml0ZVRlbXBsYXRlID0gZnVuY3Rpb24gd3JpdGVUZW1wbGF0ZSgpIHtcbiAgdmFyIGZvcm0gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmRlbnRQYXR0ZXJuID0gL1xcbiAqJC87XG4gICAgdmFyIGxpbmVCcmVha1BhdHRlciA9IFJlZ0V4cChcIlxcblwiLCBcImdcIik7XG4gICAgdmFyIGdldEluZGVudGF0aW9uID0gZnVuY3Rpb24oY29kZSkge1xuICAgICAgcmV0dXJuIChyZUZpbmQoaW5kZW50UGF0dGVybiwgY29kZSkpIHx8IFwiXFxuXCI7XG4gICAgfTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uIGxvb3AoY29kZSwgcGFydHMsIHZhbHVlcykge1xuICAgICAgdmFyIHJlY3VyID0gbG9vcDtcbiAgICAgIHdoaWxlIChyZWN1ciA9PT0gbG9vcCkge1xuICAgICAgICByZWN1ciA9IGNvdW50KHBhcnRzKSA+IDEgP1xuICAgICAgICAoY29kZSA9IFwiXCIgKyBjb2RlICsgKGZpcnN0KHBhcnRzKSkgKyAocmVwbGFjZShcIlwiICsgXCJcIiArIChmaXJzdCh2YWx1ZXMpKSwgbGluZUJyZWFrUGF0dGVyLCBnZXRJbmRlbnRhdGlvbihmaXJzdChwYXJ0cykpKSksIHBhcnRzID0gcmVzdChwYXJ0cyksIHZhbHVlcyA9IHJlc3QodmFsdWVzKSwgbG9vcCkgOlxuICAgICAgICBcIlwiICsgY29kZSArIChmaXJzdChwYXJ0cykpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZWN1cjtcbiAgICB9KShcIlwiLCBzcGxpdChmaXJzdChmb3JtKSwgXCJ+e31cIiksIHJlc3QoZm9ybSkpO1xuICB9KSgpO1xufTtcbmV4cG9ydHMud3JpdGVUZW1wbGF0ZSA9IHdyaXRlVGVtcGxhdGU7XG5cbnZhciB3cml0ZUdyb3VwID0gZnVuY3Rpb24gd3JpdGVHcm91cCgpIHtcbiAgdmFyIGZvcm1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGpvaW4oXCIsIFwiLCBmb3Jtcyk7XG59O1xuZXhwb3J0cy53cml0ZUdyb3VwID0gd3JpdGVHcm91cDtcblxudmFyIHdyaXRlSW52b2tlID0gZnVuY3Rpb24gd3JpdGVJbnZva2UoY2FsbGVlKSB7XG4gIHZhciBwYXJhbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gd3JpdGVUZW1wbGF0ZShcIn57fSh+e30pXCIsIGNhbGxlZSwgd3JpdGVHcm91cC5hcHBseSh3cml0ZUdyb3VwLCBwYXJhbXMpKTtcbn07XG5leHBvcnRzLndyaXRlSW52b2tlID0gd3JpdGVJbnZva2U7XG5cbnZhciB3cml0ZUVycm9yID0gZnVuY3Rpb24gd3JpdGVFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKGZ1bmN0aW9uKCkgeyB0aHJvdyBFcnJvcihtZXNzYWdlKTsgfSkoKTtcbiAgfTtcbn07XG5leHBvcnRzLndyaXRlRXJyb3IgPSB3cml0ZUVycm9yO1xuXG52YXIgd3JpdGVWZWN0b3IgPSB3cml0ZUVycm9yKFwiVmVjdG9ycyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbmV4cG9ydHMud3JpdGVWZWN0b3IgPSB3cml0ZVZlY3RvcjtcblxudmFyIHdyaXRlRGljdGlvbmFyeSA9IHdyaXRlRXJyb3IoXCJEaWN0aW9uYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG5leHBvcnRzLndyaXRlRGljdGlvbmFyeSA9IHdyaXRlRGljdGlvbmFyeTtcblxudmFyIHdyaXRlUGF0dGVybiA9IHdyaXRlRXJyb3IoXCJSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuZXhwb3J0cy53cml0ZVBhdHRlcm4gPSB3cml0ZVBhdHRlcm47XG5cbnZhciBjb21waWxlQ29tbWVudCA9IGZ1bmN0aW9uIGNvbXBpbGVDb21tZW50KGZvcm0pIHtcbiAgcmV0dXJuIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwiLy9+e31cXG5cIiwgZmlyc3QoZm9ybSkpKTtcbn07XG5leHBvcnRzLmNvbXBpbGVDb21tZW50ID0gY29tcGlsZUNvbW1lbnQ7XG5cbnZhciB3cml0ZURlZiA9IGZ1bmN0aW9uIHdyaXRlRGVmKGZvcm0pIHtcbiAgdmFyIGlkID0gZmlyc3QoZm9ybSk7XG4gIHZhciBpc0V4cG9ydCA9ICgoKChtZXRhKGZvcm0pKSB8fCB7fSkgfHwgMClbXCJ0b3BcIl0pICYmICghKCgoKG1ldGEoaWQpKSB8fCB7fSkgfHwgMClbXCJwcml2YXRlXCJdKSk7XG4gIHZhciBhdHRyaWJ1dGUgPSBzeW1ib2wobmFtZXNwYWNlKGlkKSwgXCJcIiArIFwiLVwiICsgKG5hbWUoaWQpKSk7XG4gIHJldHVybiBpc0V4cG9ydCA/XG4gICAgY29tcGlsZVRlbXBsYXRlKGxpc3QoXCJ2YXIgfnt9O1xcbn57fVwiLCBjb21waWxlKGNvbnMoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgZm9ybSkpLCBjb21waWxlKGxpc3Qoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgbGlzdChzeW1ib2wodm9pZCgwKSwgXCIuXCIpLCBzeW1ib2wodm9pZCgwKSwgXCJleHBvcnRzXCIpLCBhdHRyaWJ1dGUpLCBpZCkpKSkgOlxuICAgIGNvbXBpbGVUZW1wbGF0ZShsaXN0KFwidmFyIH57fVwiLCBjb21waWxlKGNvbnMoc3ltYm9sKHZvaWQoMCksIFwic2V0IVwiKSwgZm9ybSkpKSk7XG59O1xuZXhwb3J0cy53cml0ZURlZiA9IHdyaXRlRGVmO1xuXG52YXIgd3JpdGUgPSBmdW5jdGlvbiB3cml0ZShmb3JtKSB7XG4gIHJldHVybiBpc05pbChmb3JtKSA/XG4gICAgd3JpdGVOaWwoZm9ybSkgOlxuICBpc1N5bWJvbChmb3JtKSA/XG4gICAgd3JpdGVSZWZlcmVuY2UoZm9ybSkgOlxuICBpc0tleXdvcmQoZm9ybSkgP1xuICAgIHdyaXRlS2V5d29yZFJlZmVyZW5jZShmb3JtKSA6XG4gIGlzU3RyaW5nKGZvcm0pID9cbiAgICB3cml0ZVN0cmluZyhmb3JtKSA6XG4gIGlzTnVtYmVyKGZvcm0pID9cbiAgICB3cml0ZU51bWJlcihmb3JtKSA6XG4gIGlzQm9vbGVhbihmb3JtKSA/XG4gICAgd3JpdGVCb29sZWFuKGZvcm0pIDpcbiAgaXNSZVBhdHRlcm4oZm9ybSkgP1xuICAgIHdyaXRlUGF0dGVybihmb3JtKSA6XG4gIGlzVmVjdG9yKGZvcm0pID9cbiAgICB3cml0ZVZlY3Rvcihmb3JtKSA6XG4gIGlzRGljdGlvbmFyeShmb3JtKSA/XG4gICAgd3JpdGVEaWN0aW9uYXJ5KCkgOlxuICBpc0xpc3QoZm9ybSkgP1xuICAgIHdyaXRlSW52b2tlLmFwcGx5KHdyaXRlSW52b2tlLCBtYXAod3JpdGUsIHZlYyhmb3JtKSkpIDpcbiAgXCJlbHNlXCIgP1xuICAgIHdyaXRlRXJyb3IoXCJVbnN1cHBvcnRlZCBmb3JtXCIpIDpcbiAgICB2b2lkKDApO1xufTtcbmV4cG9ydHMud3JpdGUgPSB3cml0ZSIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnByb2Nlc3MubmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgaWYgKGNhblBvc3QpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoZXYuc291cmNlID09PSB3aW5kb3cgJiYgZXYuZGF0YSA9PT0gJ3Byb2Nlc3MtdGljaycpIHtcbiAgICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBmbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGZuKTtcbiAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSgncHJvY2Vzcy10aWNrJywgJyonKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgc2V0VGltZW91dChmbiwgMCk7XG4gICAgfTtcbn0pKCk7XG5cbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuLy8gVE9ETyhzaHR5bG1hbilcbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuIiwiKGZ1bmN0aW9uKHByb2Nlc3Mpe2lmICghcHJvY2Vzcy5FdmVudEVtaXR0ZXIpIHByb2Nlc3MuRXZlbnRFbWl0dGVyID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBFdmVudEVtaXR0ZXIgPSBleHBvcnRzLkV2ZW50RW1pdHRlciA9IHByb2Nlc3MuRXZlbnRFbWl0dGVyO1xudmFyIGlzQXJyYXkgPSB0eXBlb2YgQXJyYXkuaXNBcnJheSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gQXJyYXkuaXNBcnJheVxuICAgIDogZnVuY3Rpb24gKHhzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nXG4gICAgfVxuO1xuZnVuY3Rpb24gaW5kZXhPZiAoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgcmV0dXJuIHhzLmluZGV4T2YoeCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoeCA9PT0geHNbaV0pIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW5cbi8vIDEwIGxpc3RlbmVycyBhcmUgYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaFxuLy8gaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG4vL1xuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCF0aGlzLl9ldmVudHMpIHRoaXMuX2V2ZW50cyA9IHt9O1xuICB0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzID0gbjtcbn07XG5cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNBcnJheSh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSlcbiAgICB7XG4gICAgICBpZiAoYXJndW1lbnRzWzFdIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgYXJndW1lbnRzWzFdOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5jYXVnaHQsIHVuc3BlY2lmaWVkICdlcnJvcicgZXZlbnQuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhpcy5fZXZlbnRzKSByZXR1cm4gZmFsc2U7XG4gIHZhciBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBpZiAoIWhhbmRsZXIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuXG4gIH0gZWxzZSBpZiAoaXNBcnJheShoYW5kbGVyKSkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBFdmVudEVtaXR0ZXIgaXMgZGVmaW5lZCBpbiBzcmMvbm9kZV9ldmVudHMuY2Ncbi8vIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCgpIGlzIGFsc28gZGVmaW5lZCB0aGVyZS5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGxpc3RlbmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZGRMaXN0ZW5lciBvbmx5IHRha2VzIGluc3RhbmNlcyBvZiBGdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT0gXCJuZXdMaXN0ZW5lcnNcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJzXCIuXG4gIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHRoaXMuX2V2ZW50c1t0eXBlXSkpIHtcblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgICB2YXIgbTtcbiAgICAgIGlmICh0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbSA9IHRoaXMuX2V2ZW50cy5tYXhMaXN0ZW5lcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtID0gZGVmYXVsdE1heExpc3RlbmVycztcbiAgICAgIH1cblxuICAgICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYub24odHlwZSwgZnVuY3Rpb24gZygpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgbGlzdGVuZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbW92ZUxpc3RlbmVyIG9ubHkgdGFrZXMgaW5zdGFuY2VzIG9mIEZ1bmN0aW9uJyk7XG4gIH1cblxuICAvLyBkb2VzIG5vdCB1c2UgbGlzdGVuZXJzKCksIHNvIG5vIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIF9ldmVudHNbdHlwZV1cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSkgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzQXJyYXkobGlzdCkpIHtcbiAgICB2YXIgaSA9IGluZGV4T2YobGlzdCwgbGlzdGVuZXIpO1xuICAgIGlmIChpIDwgMCkgcmV0dXJuIHRoaXM7XG4gICAgbGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDApXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICB9IGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSA9PT0gbGlzdGVuZXIpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGRvZXMgbm90IHVzZSBsaXN0ZW5lcnMoKSwgc28gbm8gc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgX2V2ZW50c1t0eXBlXVxuICBpZiAodHlwZSAmJiB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzW3R5cGVdKSB0aGlzLl9ldmVudHNbdHlwZV0gPSBudWxsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAoIXRoaXMuX2V2ZW50cykgdGhpcy5fZXZlbnRzID0ge307XG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKSB0aGlzLl9ldmVudHNbdHlwZV0gPSBbXTtcbiAgaWYgKCFpc0FycmF5KHRoaXMuX2V2ZW50c1t0eXBlXSkpIHtcbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZXZlbnRzW3R5cGVdO1xufTtcblxufSkocmVxdWlyZShcIl9fYnJvd3NlcmlmeV9wcm9jZXNzXCIpKSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZGlmZiA9IHJlcXVpcmUoXCJkaWZmcGF0Y2hlci9kaWZmXCIpXG52YXIgcGF0Y2ggPSByZXF1aXJlKFwiZGlmZnBhdGNoZXIvcGF0Y2hcIilcbnZhciBvdXRwdXQgPSByZXF1aXJlKFwiLi9vdXRwdXRcIilcbnZhciBtYWtlT3V0cHV0ID0gb3V0cHV0Lm1ha2VPdXRwdXRcbnZhciB3cml0ZU91dHB1dCA9IG91dHB1dC53cml0ZVxuXG5cbnZhciBPdXQgPSBcIm91dEBpbnRlcmFjdGl2YXRlXCJcbnZhciBJbiA9IFwiaW5AaW50ZXJhY3RpdmF0ZVwiXG52YXIgUmVjaWV2ZXIgPSBcInJlY2VpdmVyQGludGVyYWN0aXZhdGVcIlxuXG5mdW5jdGlvbiBtYWtlT3B0aW9uR2V0dGVyKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE9wdGlvbihlZGl0b3IpIHtcbiAgICByZXR1cm4gZWRpdG9yLmdldE9wdGlvbihuYW1lKVxuICB9XG59XG5cbnZhciBnZXRSZW5kZXJSYXRlID0gbWFrZU9wdGlvbkdldHRlcihcImludGVyYWN0aXZlU3BlZWRcIilcbnZhciBnZXRTZWN0aW9uU2VwYXJhdG9yID0gbWFrZU9wdGlvbkdldHRlcihcImludGVyYWN0aXZlU2VwYXJhdG9yXCIpXG5cblxudmFyIHNsaWNlciA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuZnVuY3Rpb24gdGhyb3R0bGUoZiwgZGVsYXkpIHtcbiAgLyoqXG4gIENyZWF0ZXMgZnVuY3Rpb24gdGhhdCBjYWxscyB0aHJvdHRsZXMgY2FsbHMgdG8gZ2l2ZW4gYGZgIHN1Y2ggdGhhdCxcbiAgaXQncyBvbmx5IGNhbGxlZCBpZiBubyBmdXJ0aGVyIGNhbGxzIGFyZSBtYWRlIHdpdGggaW4gdGhlIHRpbWVcbiAgZnJhbWUgKGluIG1pbGlzZWNvbmRzKSByZXR1cm5lZCBieSBnaXZlbiBgZGVsYXkuYXBwbHkodGhpcywgYXJndW1lbnRzKWBcbiAgZnVuY3Rpb24uXG4gICoqL1xuICB2YXIgaWQgPSAwXG4gIHJldHVybiBmdW5jdGlvbiB0aHJvdHRsZWQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGlkLCB0aHJvdHRsZWQpXG4gICAgdmFyIG1zID0gZGVsYXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwXG4gICAgaWQgPSBzZXRUaW1lb3V0LmFwcGx5KHRoaXMsIFtmLCBtc10uY29uY2F0KHNsaWNlci5jYWxsKGFyZ3VtZW50cykpKVxuICB9XG59XG5cblxuXG5mdW5jdGlvbiBjYWxjdWxhdGUoZWRpdG9yKSB7XG4gIHZhciBzdGF0ZSA9IGVkaXRvcltJbl1cbiAgdmFyIGlucHV0ID0gZWRpdG9yLmdldFZhbHVlKClcbiAgdmFyIHNlcGFyYXRvciA9IGdldFNlY3Rpb25TZXBhcmF0b3IoZWRpdG9yKVxuICB2YXIgc2VjdGlvbnMgPSBpbnB1dC5zcGxpdChzZXBhcmF0b3IpXG4gIHZhciBhY3RpdmVMaW5lID0gZWRpdG9yLmdldEN1cnNvcigpLmxpbmVcblxuICBzZWN0aW9ucy5wb3AoKSAvLyBsYXN0IHNlY3Rpb24gZG9lcyBub3QgaGFzIGV4ZWN1dGlvbiBtYXJrZXIgc28gc2tpcCBpdC5cblxuICB2YXIgY2hhbmdlID0gT2JqZWN0LmtleXMoc2VjdGlvbnMpLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIGluZGV4KSB7XG4gICAgdmFyIGlucHV0ID0gc2VjdGlvbnNbaW5kZXhdXG4gICAgdmFyIGxpbmUgPSByZXN1bHQubGluZSArIGlucHV0LnNwbGl0KFwiXFxuXCIpLmxlbmd0aCAtIDFcbiAgICByZXN1bHQubGluZSA9IGxpbmVcbiAgICB2YXIgZGVsdGEgPSB7aW5wdXQ6IGlucHV0LnRyaW0oKSwgbGluZTogbGluZSwgdmlzaWJsZTogYWN0aXZlTGluZSAhPT0gbGluZX1cbiAgICByZXN1bHQuc3RhdGVbaW5kZXhdID0gc3RhdGVbaW5kZXhdID8gcGF0Y2goc3RhdGVbaW5kZXhdLCBkZWx0YSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LCB7IGxpbmU6IDAsIHN0YXRlOiB7fSB9KVxuXG4gIHJldHVybiBkaWZmKGVkaXRvcltJbl0sIGNoYW5nZS5zdGF0ZSlcbn1cblxuXG5mdW5jdGlvbiBzZW5kKHBhY2tldCkge1xuICB2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpXG4gIGV2ZW50LmluaXRDdXN0b21FdmVudChcInNlcnZlclwiLCBmYWxzZSwgdHJ1ZSwgcGFja2V0KVxuICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuXG5mdW5jdGlvbiByZWNpZXZlKGVkaXRvciwgZXZlbnQpIHtcbiAgdmFyIHBhY2tldCA9IGV2ZW50LmRldGFpbFxuICB2YXIgZGVsdGEgPSB7fVxuICBkZWx0YVtwYWNrZXQuZnJvbV0gPSB7cGVuZGluZzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcGFja2V0Lm1lc3NhZ2V9XG4gIHdyaXRlKGVkaXRvciwgZGVsdGEpXG59XG5cbmZ1bmN0aW9uIHByaW50KGVkaXRvcikge1xuICBpZiAoIWVkaXRvci5nZXRPcHRpb24oXCJpbnRlcmFjdGl2YXRlXCIpKSB0aHJvdyBlZGl0b3IuY29uc3RydWN0b3IuUGFzc1xuICBlZGl0b3Iub3BlcmF0aW9uKGZ1bmN0aW9uKCkge1xuICAgIHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKClcbiAgICBlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcIlxcbi8vID0+XFxuXCIpXG4gICAgZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGN1cnNvci5saW5lICsgMiwgY2g6IDAgfSlcbiAgfSlcbn1cblxuXG5mdW5jdGlvbiBnZXRNYXJrZXJGb3IoZWRpdG9yLCB2aWV3KSB7XG4gIHZhciBtYXJrZXJzID0gZWRpdG9yLmdldEFsbE1hcmtzKClcbiAgdmFyIGNvdW50ID0gbWFya2Vycy5sZW5ndGhcbiAgd2hpbGUgKGNvdW50KSB7XG4gICAgY291bnQgPSBjb3VudCAtIDFcbiAgICB2YXIgbWFya2VyID0gbWFya2Vyc1tjb3VudF1cbiAgICBpZiAobWFya2VyLnJlcGxhY2VkV2l0aCA9PT0gdmlldykgcmV0dXJuIG1hcmtlclxuICB9XG4gIHJldHVybiBudWxsXG59XG5cblxuZnVuY3Rpb24gd3JpdGUoZWRpdG9yLCBjaGFuZ2VzKSB7XG4gIHZhciBkb2MgPSBlZGl0b3IuZ2V0RG9jKClcbiAgT2JqZWN0LmtleXMoY2hhbmdlcykuc29ydCgpLnJlZHVjZShmdW5jdGlvbihfLCBpZCkge1xuICAgIGlmICghZWRpdG9yW091dF1baWRdKSBlZGl0b3JbT3V0XVtpZF0gPSBtYWtlT3V0cHV0KGlkKVxuXG4gICAgdmFyIG91dHB1dCA9IGVkaXRvcltPdXRdW2lkXVxuICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2lkXVxuICAgIGlmIChjaGFuZ2UgPT09IG51bGwpIGVkaXRvcltPdXRdW2lkXSA9IG51bGxcblxuICAgIHdyaXRlT3V0cHV0KG91dHB1dCwgZWRpdG9yLCBjaGFuZ2UpXG4gIH0sIG51bGwpXG4gIGVkaXRvcltJbl0gPSBwYXRjaChlZGl0b3JbSW5dLCBjaGFuZ2VzKVxufVxuXG5mdW5jdGlvbiBwb3N0KGNoYW5nZXMpIHtcbiAgT2JqZWN0LmtleXMoY2hhbmdlcykucmVkdWNlKGZ1bmN0aW9uKF8sIGlkKSB7XG4gICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaWRdXG4gICAgaWYgKGNoYW5nZSAmJiBjaGFuZ2UuaW5wdXQpIHtcbiAgICAgIHNlbmQoeyB0bzogaWQsIHNvdXJjZTogY2hhbmdlLmlucHV0IH0pXG4gICAgfVxuICB9LCBudWxsKVxufVxuXG4vLyBGdW5jdGlvbiBmaW5kcyBtb2RpZmllZCBzZWN0aW9ucyBhbmQgcXVldWVzIHVwIG1lc3NlZ2FzZSB0byBhblxuLy8gZXZhbCBob3N0LiBJbiBhZGl0aW9uIGl0IGFsc28gcmVuZGVycyBvdXRwdXQgdmlld3MgKGlmIHRoZXlcbi8vIGRvIG5vdCBleGlzdCB5ZXQpIHdoZXJlIGV2YWwgcmVzdWx0cyBhcmUgd3JpdHRlbi5cbnZhciByZW5kZXJPdXRwdXQgPSB0aHJvdHRsZShmdW5jdGlvbiByZW5kZXIoZWRpdG9yKSB7XG4gIHZhciBkZWx0YSA9IGNhbGN1bGF0ZShlZGl0b3IpXG4gIHZhciBjaGFuZ2VzID0gT2JqZWN0LmtleXMoZGVsdGEpLnJlZHVjZShmdW5jdGlvbihjaGFuZ2VzLCBpZCkge1xuICAgIHZhciBjaGFuZ2UgPSBkZWx0YVtpZF1cbiAgICAvLyBPbmx5IG1hcmsgY2hhbmdlIHBlbmRpbmcgaWYgdGhlcmUgaXMgc29tZSBpbnB1dCB0byBiZSBldmFsZWQuXG4gICAgaWYgKGNoYW5nZSAmJiBjaGFuZ2UuaW5wdXQpIGNoYW5nZS5wZW5kaW5nID0gdHJ1ZVxuICAgIHJldHVybiBjaGFuZ2VzXG4gIH0sIGRlbHRhKVxuXG4gIHdyaXRlKGVkaXRvciwgY2hhbmdlcylcbiAgcG9zdChjaGFuZ2VzKVxufSwgZ2V0UmVuZGVyUmF0ZSlcblxudmFyIGhpZGVPdXRwdXQgPSB0aHJvdHRsZShmdW5jdGlvbiByZW5kZXIoZWRpdG9yKSB7XG4gIHZhciBsaW5lID0gZWRpdG9yLmdldEN1cnNvcigpLmxpbmVcbiAgdmFyIHN0YXRlID0gZWRpdG9yW0luXVxuICB2YXIgY2hhbmdlcyA9IE9iamVjdC5rZXlzKHN0YXRlKS5yZWR1Y2UoZnVuY3Rpb24oZGVsdGEsIGlkKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGVbaWRdXG4gICAgaWYgKHZhbHVlLmxpbmUgPT09IGxpbmUpIGRlbHRhW2lkXSA9IHt2aXNpYmxlOiBmYWxzZX1cbiAgICBlbHNlIGlmICghdmFsdWUudmlzaWJsZSkgZGVsdGFbaWRdID0ge3Zpc2libGU6IHRydWUsIGxpbmU6IHZhbHVlLmxpbmV9XG5cbiAgICByZXR1cm4gZGVsdGFcbiAgfSwgW10pXG5cbiAgaWYgKGNoYW5nZXMubGVuZ3RoKSB3cml0ZShlZGl0b3IsIGNoYW5nZXMpXG59LCBmdW5jdGlvbigpIHsgcmV0dXJuIDIwMCB9KVxuXG5cbmZ1bmN0aW9uIHRvb2dsZVBsdWdpbihlZGl0b3IsIHZhbHVlKSB7XG4gIGlmICh2YWx1ZSkge1xuICAgIGVkaXRvcltSZWNpZXZlcl0gPSByZWNpZXZlLmJpbmQocmVjaWV2ZSwgZWRpdG9yKVxuICAgIGVkaXRvcltJbl0gPSB7fVxuICAgIGVkaXRvcltPdXRdID0ge31cbiAgICBlZGl0b3Iub24oXCJjaGFuZ2VcIiwgcmVuZGVyT3V0cHV0KVxuICAgIGVkaXRvci5vbihcImN1cnNvckFjdGl2aXR5XCIsIGhpZGVPdXRwdXQpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGllbnRcIiwgZWRpdG9yW1JlY2lldmVyXSwgZmFsc2UpXG4gIH0gZWxzZSB7XG4gICAgZWRpdG9yLm9mZihcImNoYW5nZVwiLCByZW5kZXJPdXRwdXQpXG4gICAgZWRpdG9yLm9mZihcImN1cnNvckFjdGl2aXR5XCIsIGhpZGVPdXRwdXQpXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGllbnRcIiwgZWRpdG9yW1JlY2lldmVyXSwgZmFsc2UpXG4gICAgZWRpdG9yW1JlY2lldmVyXSA9IG51bGxcbiAgICBlZGl0b3JbSW5dID0gbnVsbFxuICAgIGVkaXRvcltPdXRdID0gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGwoQ29kZU1pcnJvcikge1xuICAvLyBGaXggY29uc3RydWN0b3IgcHJvcGVydHkgc28gdGhhdCBpdCBjb3VsZCBiZSBhY2Nlc3NlZCBmcm9tIHRoZVxuICAvLyBpbnN0YW5jZS5cbiAgQ29kZU1pcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb2RlTWlycm9yO1xuICBDb2RlTWlycm9yLmRlZmF1bHRzLmludGVyYWN0aXZlU3BlZWQgPSAzMDBcbiAgQ29kZU1pcnJvci5kZWZhdWx0cy5pbnRlcmFjdGl2ZVNlcGFyYXRvciA9IC9eXFwvXFwvIFxcPVxcPlteXFxuXSokL21cbiAgQ29kZU1pcnJvci5rZXlNYXAubWFjRGVmYXVsdFtcIkNtZC1FbnRlclwiXSA9IHByaW50XG4gIENvZGVNaXJyb3Iua2V5TWFwLnBjRGVmYXVsdFtcIkN0cmwtRW50ZXJcIl0gPSBwcmludFxuXG4gIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKFwiaW50ZXJhY3RpdmF0ZVwiLCBmYWxzZSwgdG9vZ2xlUGx1Z2luKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc3RhbGxcbiIsInZhciBtYWtlVmlldyA9IHJlcXVpcmUoXCIuL3ZpZXdcIikubWFrZVZpZXdcbnZhciByZW5kZXIgPSByZXF1aXJlKFwiLi9yZW5kZXJcIilcblxuZnVuY3Rpb24gT3V0cHV0KGlkKSB7XG4gIHRoaXMuaWQgPSBpZFxufVxuXG5mdW5jdGlvbiBtYWtlT3V0cHV0KGlkKSB7XG4gIHJldHVybiBuZXcgT3V0cHV0KGlkKVxufVxuXG5cbmZ1bmN0aW9uIGNsZWFyKG91dHB1dCkge1xuICBvdXRwdXQubWFya2VyLmNsZWFyKClcbiAgb3V0cHV0LndpZGdldC5jbGVhcigpXG59XG5cbmZ1bmN0aW9uIG1hcmsob3V0cHV0LCBlZGl0b3IsIGxpbmUpIHtcbiAgb3V0cHV0Lm1hcmtlciA9IGVkaXRvci5tYXJrVGV4dCh7bGluZTogbGluZSwgY2g6IDB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsaW5lOiBsaW5lfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sbGFwc2VkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmVMZWZ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlUmlnaHQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgb3V0cHV0LndpZGdldCA9IGVkaXRvci5hZGRMaW5lV2lkZ2V0KGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQudmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzaG93SWZIaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9IU2Nyb2xsOnRydWV9KVxufVxuXG5mdW5jdGlvbiBtb3ZlKG91dHB1dCwgZWRpdG9yLCBsaW5lKSB7XG4gIHZhciBwb3NpdGlvbiA9IG91dHB1dC5tYXJrZXIuZmluZCgpXG4gIGlmICghcG9zaXRpb24gfHwgcG9zaXRpb24ubGluZSAhPT0gbGluZSkge1xuICAgIGNsZWFyKG91dHB1dClcbiAgICBtYXJrKG91dHB1dCwgZWRpdG9yLCBsaW5lKVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlKG91dHB1dCwgZWRpdG9yLCBzdGF0ZSkge1xuICB2YXIgdmlldyA9IG91dHB1dC52aWV3IHx8IChvdXRwdXQudmlldyA9IG1ha2VWaWV3KGVkaXRvciwgb3V0cHV0LmlkKSlcbiAgaWYgKHN0YXRlID09PSBudWxsKSByZXR1cm4gY2xlYXIob3V0cHV0KVxuXG4gIGlmIChzdGF0ZS5wZW5kaW5nKSBvdXRwdXQudmlldy5zdHlsZS5vcGFjaXR5ID0gXCIwLjJcIlxuICBlbHNlIGlmIChzdGF0ZS5wZW5kaW5nID09PSBudWxsKSBvdXRwdXQudmlldy5zdHlsZS5vcGFjaXR5ID0gXCJcIlxuXG4gIGlmIChzdGF0ZS5yZXN1bHQpIHtcbiAgICB2YXIgY29udGVudCA9IHJlbmRlcihzdGF0ZS5yZXN1bHQpXG4gICAgdmlldy5ib2R5LmlubmVySFRNTCA9IFwiXCJcbiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHZpZXcuYm9keS5hcHBlbmRDaGlsZChjb250ZW50KVxuICAgIGVsc2Ugdmlldy5ib2R5LnRleHRDb250ZW50ID0gY29udGVudFxuICB9XG5cbiAgaWYgKHN0YXRlLnZpc2libGUgPT09IHRydWUpIG1hcmsob3V0cHV0LCBlZGl0b3IsIHN0YXRlLmxpbmUpXG4gIGlmIChzdGF0ZS52aXNpYmxlID09PSBmYWxzZSkgY2xlYXIob3V0cHV0KVxuICBpZiAoc3RhdGUubGluZSkgbW92ZShvdXRwdXQsIGVkaXRvciwgc3RhdGUubGluZSlcbn1cblxuZXhwb3J0cy5tYWtlT3V0cHV0ID0gbWFrZU91dHB1dFxuZXhwb3J0cy53cml0ZSA9IHdyaXRlIiwidmFyIFRFQVJfSU1BR0UgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVlBQUFBTUNBWUFBQUJCVjh3dUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBR3BKUkVGVWVOcGkvUC8vUHdNMndNU0FBN0NBQ0VZZ2dMS1pnZmd2RVA4QkNZQXdLeEFMQWpFUEVIOEI0ZzlNVUk1SVdscWF5ZXZYcjllQ2FDQmZHR1NTVm5KeXN1L1hyMStmQXgzeS85dTNieTlCZkliMjl2WkNtQ0FNZ0NRWi8rTndMMDduVWxFQ0lNQUFNcjQxc3h2djZvRUFBQUFBU1VWT1JLNUNZSUk9XCJcblxudmFyIE9VVFBVVF9TVFlMRSA9IFtcbiAgXCJtYXJnaW4tbGVmdDogLTEwcHhcIixcbiAgXCJwYWRkaW5nOiAwXCIsXG4gIFwid2hpdGVzcGFjZTogbm9ybWFsXCIsXG4gIFwidGV4dC1zaGFkb3c6IG5vbmVcIlxuXS5qb2luKFwiO1wiKVxuXG52YXIgVE9QX1NUWUxFID0gW1xuICBcInBvc2l0aW9uOiByZWxhdGl2ZVwiLFxuICBcInotaW5kZXg6IDJcIixcbiAgXCJoZWlnaHQ6IDEycHhcIixcbiAgXCJiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94XCIsXG4gIFwiYmFja2dyb3VuZDogdXJsKCdcIiArIFRFQVJfSU1BR0UgKyBcIicpIHRvcCByaWdodCByZXBlYXQteFwiXG5dLmpvaW4oXCI7XCIpXG5cbnZhciBCT1RUT01fU1RZTEUgPSBbXG4gIFwicG9zaXRpb246IHJlbGF0aXZlXCIsXG4gIFwiei1pbmRleDogMlwiLFxuICBcImhlaWdodDogMTJweFwiLFxuICBcImJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3hcIixcbiAgXCJiYWNrZ3JvdW5kOiB1cmwoJ1wiICsgVEVBUl9JTUFHRSArIFwiJykgdG9wIGxlZnQgcmVwZWF0LXhcIixcbiAgXCItd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZylcIixcbiAgXCItby10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpXCIsXG4gIFwidHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKVwiXG5dLmpvaW4oXCI7XCIpXG5cbnZhciBCT1hfU1RZTEUgPSBbXG4gIFwiLW1vei1ib3gtc2hhZG93OiAwIDAgMzBweCAtMnB4ICMwMDBcIixcbiAgXCItd2Via2l0LWJveC1zaGFkb3c6IDAgMCAzMHB4IC0ycHggIzAwMFwiLFxuICBcImJveC1zaGFkb3c6IDAgMCAzMHB4IC0ycHggIzAwMFwiLFxuICBcImNvbG9yOiBibGFja1wiLFxuICBcImJhY2tncm91bmQ6IHdoaXRlXCIsXG4gIFwicG9zaXRpb246IHJlbGF0aXZlXCIsXG4gIFwibWFyZ2luOiAwcHhcIixcbiAgXCJ3aWR0aDogMTAwJVwiXG5dLmpvaW4oXCI7XCIpXG5cbnZhciBIRUFEX1NUWUxFID0gW1xuICBcImRpc3BsYXk6IHRhYmxlLWNlbGxcIixcbiAgXCJwYWRkaW5nOiAxMHB4XCIsXG4gIFwicGFkZGluZy1sZWZ0OiAyMHB4XCIsXG4gIFwid2hpdGUtc3BhY2U6IHByZVwiLFxuICBcImNvbG9yOiB3aGl0ZVwiLFxuICBcInRleHQtc2hhZG93OiAwcHggMXB4IDVweCAjMDAwXCIsXG4gIFwidmVydGljYWwtYWxpZ246IHRvcFwiXG5dLmpvaW4oXCI7XCIpXG5cbnZhciBCT0RZX1NUWUxFID0gW1xuICBcImRpc3BsYXk6IHRhYmxlLWNlbGxcIixcbiAgXCJwYWRkaW5nOiAxMHB4XCIsXG4gIFwid2lkdGg6IDEwMCVcIlxuXS5qb2luKFwiO1wiKVxuXG52YXIgVEVNUExBVEUgPSBbXG4gIFwiPGRpdiBzdHlsZT1cXFwiXCIgKyBPVVRQVVRfU1RZTEUgKyBcIlxcXCI+XCIsXG4gIFwiICA8ZGl2IGNsYXNzPSdjbS1saXZlLW91dHB1dC1ib3JkZXItdG9wJyBzdHlsZT1cXFwiXCIgKyBUT1BfU1RZTEUgKyBcIlxcXCI+IDwvZGl2PlwiLFxuICBcIiAgPGRpdiBjbGFzcz0nY20tbGl2ZS1vdXRwdXQtYm94JyBzdHlsZT1cXFwiXCIgKyBCT1hfU1RZTEUgKyBcIlxcXCI+XCIsXG4gIFwiICAgIDxoMSBjbGFzcz0nY20tbGl2ZS1vdXRwdXQtaGVhZCcgc3R5bGU9XFxcIlwiICsgSEVBRF9TVFlMRSArIFwiXFxcIj5PdXRbMF08L2gxPlwiLFxuICBcIiAgICA8cHJlIGNsYXNzPSdjbS1saXZlLW91dHB1dC1ib2R5JyBzdHlsZT1cXFwiXCIgKyBCT0RZX1NUWUxFICsgXCJcXFwiPjwvcHJlPlwiLFxuICBcIiAgPC9kaXY+XCIsXG4gIFwiICA8ZGl2IGNsYXNzPSdjbS1saXZlLW91dHB1dC1ib3JkZXItYm90dG9tJyBzdHlsZT1cXFwiXCIgKyBCT1RUT01fU1RZTEUgKyBcIlxcXCI+PC9kaXY+XCIsXG4gIFwiPC9kaXY+XCJcbiBdLmpvaW4oXCJcXG5cIilcblxuZnVuY3Rpb24gbWFrZVZpZXcoZWRpdG9yLCBpZCkge1xuICB2YXIgZG9jdW1lbnQgPSBlZGl0b3IuZGlzcGxheS5pbnB1dC5vd25lckRvY3VtZW50XG4gIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiKVxuICBjb250YWluZXIuaW5uZXJIVE1MID0gVEVNUExBVEVcbiAgdmFyIHZpZXcgPSBjb250YWluZXIuZmlyc3RDaGlsZFxuICB2aWV3LmlkID0gXCJpbnRlcmFjdGl2YXRlLW91dC1cIiArIGlkXG4gIHZpZXcubGFiZWwgPSB2aWV3LnF1ZXJ5U2VsZWN0b3IoXCIuY20tbGl2ZS1vdXRwdXQtaGVhZFwiKVxuICB2aWV3LmxhYmVsLnRleHRDb250ZW50ID0gXCJPdXRbXCIgKyBpZCArIFwiXSA9IFwiXG4gIHZpZXcuYm9keSA9IHZpZXcucXVlcnlTZWxlY3RvcihcIi5jbS1saXZlLW91dHB1dC1ib2R5XCIpXG4gIHJldHVybiB2aWV3XG59XG5cbmV4cG9ydHMubWFrZVZpZXcgPSBtYWtlVmlldyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWV0aG9kID0gcmVxdWlyZShcIm1ldGhvZFwiKVxudmFyIHV0aWwgPSByZXF1aXJlKFwidXRpbFwiKVxuXG5cbi8vIFJlbmRlciBmdW5jdGlvbiB0YWtlcyBhcmJpdHJhcnkgZGF0YSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgc29tZXRoaW5nXG4vLyB0aGF0IGNhbiB2aXN1YWxseSByZXByZXNlbnQgaXQuXG52YXIgcmVuZGVyID0gbWV0aG9kKFwicmVuZGVyQGludGVyYWN0aXZhdGVcIilcblxucmVuZGVyLmRlZmluZShmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHZhbHVlKVxufSlcblxucmVuZGVyLmRlZmluZShFcnJvciwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgcmV0dXJuIFN0cmluZyhlcnJvcilcbn0pXG5cbnJlbmRlci5kZWZpbmUoRWxlbWVudCwgZnVuY3Rpb24oZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudFxufSlcblxubW9kdWxlLmV4cG9ydHMgPSByZW5kZXJcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiByZWJhc2UocmVzdWx0LCBwYXJlbnQsIGRlbHRhKSB7XG4gIE9iamVjdC5rZXlzKHBhcmVudCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAvLyBJZiBgcGFyZW50W2tleV1gIGlzIGBudWxsYCBpdCBtZWFucyBhdHRyaWJ1dGUgd2FzIGRlbGV0ZWQgaW4gcHJldmlvdXNcbiAgICAvLyB1cGRhdGUuIFdlIHNraXAgc3VjaCBwcm9wZXJ0aWVzIGFzIHRoZXJlIGlzIG5vIHVzZSBpbiBrZWVwaW5nIHRoZW1cbiAgICAvLyBhcm91bmQuIElmIGBkZWx0YVtrZXldYCBpcyBgbnVsbGAgd2Ugc2tpcCB0aGVzZSBwcm9wZXJ0aWVzIHRvbyBhc1xuICAgIC8vIHRoZSBoYXZlIGJlaW5nIGRlbGV0ZWQuXG4gICAgaWYgKCEocGFyZW50W2tleV0gPT0gbnVsbCB8fCAoa2V5IGluIGRlbHRhICYmIGRlbHRhW2tleV0gPT0gbnVsbCkpKVxuICAgICAgcmVzdWx0W2tleV0gPSBwYXJlbnRba2V5XVxuICB9LCByZXN1bHQpXG4gIE9iamVjdC5rZXlzKGRlbHRhKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChrZXkgaW4gcGFyZW50KSB7XG4gICAgICB2YXIgY3VycmVudCA9IGRlbHRhW2tleV1cbiAgICAgIHZhciBwcmV2aW91cyA9IHBhcmVudFtrZXldXG4gICAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMpIGN1cnJlbnQgPSBjdXJyZW50XG4gICAgICAvLyBJZiBgZGVsdGFba2V5XWAgaXMgYG51bGxgIGl0J3MgZGVsZXRlIHNvIHdlIGp1c3Qgc2tpcCBwcm9wZXJ0eS5cbiAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPT0gbnVsbCkgY3VycmVudCA9IGN1cnJlbnRcbiAgICAgIC8vIElmIHZhbHVlIGlzIG9mIHByaW1pdGl2ZSB0eXBlIChmdW5jdGlvbiBvciByZWdleHBzIHNob3VsZCBub3RcbiAgICAgIC8vIGV2ZW4gYmUgaGVyZSkgd2UganVzdCB1cGRhdGUgaW4gcGxhY2UuXG4gICAgICBlbHNlIGlmICh0eXBlb2YoY3VycmVudCkgIT09IFwib2JqZWN0XCIpIHJlc3VsdFtrZXldID0gY3VycmVudFxuICAgICAgLy8gSWYgcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5IHdhcyBwcmltaXRpdmVcbiAgICAgIC8vIGFuZCBpdCdzIG1hcHBlZCB0byBub24gcHJpbWl0aXZlXG4gICAgICBlbHNlIGlmICh0eXBlb2YocHJldmlvdXMpICE9PSBcIm9iamVjdFwiKSByZXN1bHRba2V5XSA9IGN1cnJlbnRcbiAgICAgIGVsc2UgcmVzdWx0W2tleV0gPSByZWJhc2Uoe30sIHByZXZpb3VzLCBjdXJyZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IGRlbHRhW2tleV1cbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWJhc2VcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWV0aG9kID0gcmVxdWlyZShcIm1ldGhvZFwiKVxuXG4vLyBNZXRob2QgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGRhdGEgc3RydWN0dXJlcyByZXByZXNlbnRpbmcgYXBwbGljYXRpb25cbi8vIHN0YXRlLiBDYWxsaW5nIGl0IHdpdGggYSBzdGF0ZSBzaG91bGQgcmV0dXJuIG9iamVjdCByZXByZXNlbnRpbmcgYGRlbHRhYFxuLy8gdGhhdCBoYXMgYmVpbmcgYXBwbGllZCB0byBhIHByZXZpb3VzIHN0YXRlIHRvIGdldCB0byBhIGN1cnJlbnQgc3RhdGUuXG4vL1xuLy8gRXhhbXBsZVxuLy9cbi8vIGRpZmYoc3RhdGUpIC8vID0+IHsgXCJpdGVtLWlkLTFcIjogeyB0aXRsZTogXCJzb21lIHRpdGxlXCIgfSBcIml0ZW0taWQtMlwiOiBudWxsIH1cbnZhciBkaWZmID0gbWV0aG9kKFwiZGlmZlwiKVxuXG4vLyBkaWZmIGJldHdlZW4gYG51bGxgIC8gYHVuZGVmaW5lZGAgdG8gYW55IGhhc2ggaXMgYSBoYXNoIGl0c2VsZi5cbmRpZmYuZGVmaW5lKG51bGwsIGZ1bmN0aW9uKGZyb20sIHRvKSB7IHJldHVybiB0byB9KVxuZGlmZi5kZWZpbmUodW5kZWZpbmVkLCBmdW5jdGlvbihmcm9tLCB0bykgeyByZXR1cm4gdG8gfSlcbmRpZmYuZGVmaW5lKE9iamVjdCwgZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGNhbGN1bGF0ZShmcm9tLCB0byB8fCB7fSkgfHwge31cbn0pXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZShmcm9tLCB0bykge1xuICB2YXIgZGlmZiA9IHt9XG4gIHZhciBjaGFuZ2VzID0gMFxuICBPYmplY3Qua2V5cyhmcm9tKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGNoYW5nZXMgPSBjaGFuZ2VzICsgMVxuICAgIGlmICghKGtleSBpbiB0bykgJiYgZnJvbVtrZXldICE9IG51bGwpIGRpZmZba2V5XSA9IG51bGxcbiAgICBlbHNlIGNoYW5nZXMgPSBjaGFuZ2VzIC0gMVxuICB9KVxuICBPYmplY3Qua2V5cyh0bykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBjaGFuZ2VzID0gY2hhbmdlcyArIDFcbiAgICB2YXIgcHJldmlvdXMgPSBmcm9tW2tleV1cbiAgICB2YXIgY3VycmVudCA9IHRvW2tleV1cbiAgICBpZiAocHJldmlvdXMgPT09IGN1cnJlbnQpIHJldHVybiAoY2hhbmdlcyA9IGNoYW5nZXMgLSAxKVxuICAgIGlmICh0eXBlb2YoY3VycmVudCkgIT09IFwib2JqZWN0XCIpIHJldHVybiBkaWZmW2tleV0gPSBjdXJyZW50XG4gICAgaWYgKHR5cGVvZihwcmV2aW91cykgIT09IFwib2JqZWN0XCIpIHJldHVybiBkaWZmW2tleV0gPSBjdXJyZW50XG4gICAgdmFyIGRlbHRhID0gY2FsY3VsYXRlKHByZXZpb3VzLCBjdXJyZW50KVxuICAgIGlmIChkZWx0YSkgZGlmZltrZXldID0gZGVsdGFcbiAgICBlbHNlIGNoYW5nZXMgPSBjaGFuZ2VzIC0gMVxuICB9KVxuICByZXR1cm4gY2hhbmdlcyA/IGRpZmYgOiBudWxsXG59XG5cbmRpZmYuY2FsY3VsYXRlID0gY2FsY3VsYXRlXG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZXRob2QgPSByZXF1aXJlKFwibWV0aG9kXCIpXG52YXIgcmViYXNlID0gcmVxdWlyZShcIi4vcmViYXNlXCIpXG5cbi8vIE1ldGhvZCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggZGF0YSBzdHJ1Y3R1cmVzIHJlcHJlc2VudGluZyBhcHBsaWNhdGlvblxuLy8gc3RhdGUuIENhbGxpbmcgaXQgd2l0aCBhIHN0YXRlIGFuZCBkZWx0YSBzaG91bGQgcmV0dXJuIG9iamVjdCByZXByZXNlbnRpbmdcbi8vIG5ldyBzdGF0ZSwgd2l0aCBjaGFuZ2VzIGluIGBkZWx0YWAgYmVpbmcgYXBwbGllZCB0byBwcmV2aW91cy5cbi8vXG4vLyAjIyBFeGFtcGxlXG4vL1xuLy8gcGF0Y2goc3RhdGUsIHtcbi8vICAgXCJpdGVtLWlkLTFcIjogeyBjb21wbGV0ZWQ6IGZhbHNlIH0sIC8vIHVwZGF0ZVxuLy8gICBcIml0ZW0taWQtMlwiOiBudWxsICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlXG4vLyB9KVxudmFyIHBhdGNoID0gbWV0aG9kKFwicGF0Y2hcIilcbnBhdGNoLmRlZmluZShPYmplY3QsIGZ1bmN0aW9uIHBhdGNoKGhhc2gsIGRlbHRhKSB7XG4gIHJldHVybiByZWJhc2Uoe30sIGhhc2gsIGRlbHRhKVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbihvYmplY3QsIG5hbWUsIHByb3BlcnR5KSB7XG4gIG9iamVjdFtuYW1lXSA9IHByb3BlcnR5LnZhbHVlXG4gIHJldHVybiBvYmplY3Rcbn1cblxuLy8gU2hvcnRjdXQgZm9yIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBmb3IgZmFzdGVyIGFjY2Vzcy5cbnZhciB0eXBlZnkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8vIE1hcCB0byBmb3IganVtcGluZyBmcm9tIHR5cGVvZih2YWx1ZSkgdG8gYXNzb2NpYXRlZCB0eXBlIHByZWZpeCB1c2VkXG4vLyBhcyBhIGhhc2ggaW4gdGhlIG1hcCBvZiBidWlsdGluIGltcGxlbWVudGF0aW9ucy5cbnZhciB0eXBlcyA9IHsgXCJmdW5jdGlvblwiOiBcIk9iamVjdFwiLCBcIm9iamVjdFwiOiBcIk9iamVjdFwiIH1cblxuLy8gQXJyYXkgaXMgdXNlZCB0byBzYXZlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBob3N0IG9iamVjdHMgaW4gb3JkZXJcbi8vIHRvIGF2b2lkIGV4dGVuZGluZyB0aGVtIHdpdGggbm9uLXByaW1pdGl2ZSB2YWx1ZXMgdGhhdCBjb3VsZCBjYXVzZSBsZWFrcy5cbnZhciBob3N0ID0gW11cbi8vIEhhc2ggbWFwIGlzIHVzZWQgdG8gc2F2ZSBtZXRob2QgaW1wbGVtZW50YXRpb25zIGZvciBidWlsdGluIHR5cGVzIGluIG9yZGVyXG4vLyB0byBhdm9pZCBleHRlbmRpbmcgdGhlaXIgcHJvdG90eXBlcy4gVGhpcyBhbHNvIGFsbG93cyB0byBzaGFyZSBtZXRob2Rcbi8vIGltcGxlbWVudGF0aW9ucyBmb3IgdHlwZXMgYWNyb3NzIGRpZmYgY29udGV4dHMgLyBmcmFtZXMgLyBjb21wYXJ0bWVudHMuXG52YXIgYnVpbHRpbiA9IHt9XG5cbmZ1bmN0aW9uIFByaW1pdGl2ZSgpIHt9XG5mdW5jdGlvbiBPYmplY3RUeXBlKCkge31cbk9iamVjdFR5cGUucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpXG5mdW5jdGlvbiBFcnJvclR5cGUoKSB7fVxuRXJyb3JUeXBlLnByb3RvdHlwZSA9IG5ldyBPYmplY3RUeXBlKClcblxudmFyIERlZmF1bHQgPSBidWlsdGluLkRlZmF1bHQgPSBQcmltaXRpdmUucHJvdG90eXBlXG52YXIgTnVsbCA9IGJ1aWx0aW4uTnVsbCA9IG5ldyBQcmltaXRpdmUoKVxudmFyIFZvaWQgPSBidWlsdGluLlZvaWQgPSBuZXcgUHJpbWl0aXZlKClcbmJ1aWx0aW4uU3RyaW5nID0gbmV3IFByaW1pdGl2ZSgpXG5idWlsdGluLk51bWJlciA9IG5ldyBQcmltaXRpdmUoKVxuYnVpbHRpbi5Cb29sZWFuID0gbmV3IFByaW1pdGl2ZSgpXG5cbmJ1aWx0aW4uT2JqZWN0ID0gT2JqZWN0VHlwZS5wcm90b3R5cGVcbmJ1aWx0aW4uRXJyb3IgPSBFcnJvclR5cGUucHJvdG90eXBlXG5cbmJ1aWx0aW4uRXZhbEVycm9yID0gbmV3IEVycm9yVHlwZSgpXG5idWlsdGluLkludGVybmFsRXJyb3IgPSBuZXcgRXJyb3JUeXBlKClcbmJ1aWx0aW4uUmFuZ2VFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuYnVpbHRpbi5SZWZlcmVuY2VFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuYnVpbHRpbi5TdG9wSXRlcmF0aW9uID0gbmV3IEVycm9yVHlwZSgpXG5idWlsdGluLlN5bnRheEVycm9yID0gbmV3IEVycm9yVHlwZSgpXG5idWlsdGluLlR5cGVFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuYnVpbHRpbi5VUklFcnJvciA9IG5ldyBFcnJvclR5cGUoKVxuXG5cbmZ1bmN0aW9uIE1ldGhvZChpZCkge1xuICAvKipcbiAgUHJpdmF0ZSBNZXRob2QgaXMgYSBjYWxsYWJsZSBwcml2YXRlIG5hbWUgdGhhdCBkaXNwYXRjaGVzIG9uIHRoZSBmaXJzdFxuICBhcmd1bWVudHMgc2FtZSBuYW1lZCBNZXRob2Q6XG5cbiAgICAgIG1ldGhvZChvYmplY3QsIC4uLnJlc3QpID0+IG9iamVjdFttZXRob2RdKC4uLnJlc3QpXG5cbiAgSXQgaXMgc3VwcG9zZWQgdG8gYmUgZ2l2ZW4gKip1bmlxdWUqKiBgaWRgIHByZWZlcmFibHkgaW4gYFwianVtcEBwYWNrYWdlXCJgXG4gIGxpa2UgZm9ybSBzbyBpdCB3b24ndCBjb2xsaWRlIHdpdGggYGlkJ3NgIG90aGVyIHVzZXJzIGNyZWF0ZS4gSWYgbm8gYXJndW1lbnRcbiAgaXMgcGFzc2VkIHVuaXF1ZSBpZCBpcyBnZW5lcmF0ZWQsIGJ1dCBpdCdzIHByb3ZlZCB0byBiZSBwcm9ibGVtYXRpYyB3aXRoXG4gIG5wbSB3aGVyZSBpdCdzIGVhc3kgdG8gZW5kIHVwIHdpdGggYSBjb3BpZXMgb2Ygc2FtZSBtb2R1bGUgd2hlcmUgZWFjaCBjb3B5XG4gIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBuYW1lLlxuXG4gICMjIEV4YW1wbGVcblxuICAgICAgdmFyIGZvbyA9IE1ldGhvZChcImZvb0Bhd2Vzb21lbmVzc1wiKVxuXG4gICAgICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgYW55IHR5cGVzXG4gICAgICBmb28uZGVmaW5lKGZ1bmN0aW9uKHZhbHVlLCBhcmcxLCBhcmcyKSB7XG4gICAgICAgIC8vIC4uLlxuICAgICAgfSlcblxuICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgdHlwZVxuICAgICAgZm9vLmRlZmluZShCYXJUeXBlLCBmdW5jdGlvbihiYXIsIGFyZzEsIGFyZzIpIHtcbiAgICAgICAgLy8gLi4uXG4gICAgICB9KVxuICAqKi9cblxuICAvLyBDcmVhdGUgYW4gaW50ZXJuYWwgdW5pcXVlIG5hbWUgaWYgb25lIGlzIG5vdCBwcm92aWRlZCwgYWxzbyBwcmVmaXggaXRcbiAgLy8gdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggcmVndWxhciBtZXRob2QgbmFtZXMuXG4gIHZhciBuYW1lID0gXCLOuzpcIiArIFN0cmluZyhpZCB8fCBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKS5zdWJzdHIoMikpXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2godmFsdWUpIHtcbiAgICAvLyBNZXRob2QgZGlzcGF0Y2hlcyBvbiB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudC5cbiAgICAvLyBJZiBmaXJzdCBhcmd1bWVudCBpcyBgbnVsbGAgb3IgYHZvaWRgIGFzc29jaWF0ZWQgaW1wbGVtZW50YXRpb24gaXNcbiAgICAvLyBsb29rZWQgdXAgaW4gdGhlIGBidWlsdGluYCBoYXNoIHdoZXJlIGltcGxlbWVudGF0aW9ucyBmb3IgYnVpbHQtaW5zXG4gICAgLy8gYXJlIHN0b3JlZC5cbiAgICB2YXIgdHlwZSA9IG51bGxcbiAgICB2YXIgbWV0aG9kID0gdmFsdWUgPT09IG51bGwgPyBOdWxsW25hbWVdIDpcbiAgICAgICAgICAgICAgICAgdmFsdWUgPT09IHZvaWQoMCkgPyBWb2lkW25hbWVdIDpcbiAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGF0dGVtcHQgdG8gdXNlIG1ldGhvZCB3aXRoIGEgZ2VuZXJhdGVkIHByaXZhdGVcbiAgICAgICAgICAgICAgICAgLy8gYG5hbWVgIHRoYXQgaXMgc3VwcG9zZWRseSBpbiB0aGUgcHJvdG90eXBlIGNoYWluIG9mIHRoZVxuICAgICAgICAgICAgICAgICAvLyBgdGFyZ2V0YC5cbiAgICAgICAgICAgICAgICAgdmFsdWVbbmFtZV0gfHxcbiAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGFzc3VtZSBpdCdzIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZSBpbnN0YW5jZXMsXG4gICAgICAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UgaW1wbGVtZW50YXRpb24gaXMgc3RvcmVkIGluIGEgYGJ1aWx0aW5gIGhhc2guXG4gICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZmluZCBhIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gYnVpbHQtaW5cbiAgICAgICAgICAgICAgICAgLy8gdmlhIGNvbnN0cnVjdG9yIG5hbWUgYW5kIG1ldGhvZCBuYW1lLlxuICAgICAgICAgICAgICAgICAoKHR5cGUgPSBidWlsdGluWyh2YWx1ZS5jb25zdHJ1Y3RvciB8fCBcIlwiKS5uYW1lXSkgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVbbmFtZV0pIHx8XG4gICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhc3N1bWUgaXQncyBhIGhvc3Qgb2JqZWN0LiBGb3IgaG9zdCBvYmplY3RzXG4gICAgICAgICAgICAgICAgIC8vIGFjdHVhbCBtZXRob2QgaW1wbGVtZW50YXRpb25zIGFyZSBzdG9yZWQgaW4gdGhlIGBob3N0YFxuICAgICAgICAgICAgICAgICAvLyBhcnJheSBhbmQgb25seSBpbmRleCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGlzIHN0b3JlZFxuICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgaG9zdCBvYmplY3QncyBwcm90b3R5cGUgY2hhaW4uIFRoaXMgYXZvaWRzIG1lbW9yeVxuICAgICAgICAgICAgICAgICAvLyBsZWFrcyB0aGF0IG90aGVyd2lzZSBjb3VsZCBoYXBwZW4gd2hlbiBzYXZpbmcgSlMgb2JqZWN0c1xuICAgICAgICAgICAgICAgICAvLyBvbiBob3N0IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgaG9zdFt2YWx1ZVtcIiFcIiArIG5hbWVdXSB8fFxuICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgYXR0ZW1wdCB0byBsb29rdXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1aWx0aW5zIGJ5XG4gICAgICAgICAgICAgICAgIC8vIGEgdHlwZSBvZiB0aGUgdmFsdWUuIFRoaXMgYmFzaWNhbGx5IG1ha2VzIHN1cmUgdGhhdCBhbGxcbiAgICAgICAgICAgICAgICAgLy8gbm9uIHByaW1pdGl2ZSB2YWx1ZXMgd2lsbCBkZWxlZ2F0ZSB0byBhbiBgT2JqZWN0YC5cbiAgICAgICAgICAgICAgICAgKCh0eXBlID0gYnVpbHRpblt0eXBlc1t0eXBlb2YodmFsdWUpXV0pICYmIHR5cGVbbmFtZV0pXG5cblxuICAgIC8vIElmIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHR5cGUgaXMgc3RpbGwgbm90IGZvdW5kIHRoZW5cbiAgICAvLyBqdXN0IGZhbGxiYWNrIGZvciBkZWZhdWx0IGltcGxlbWVudGF0aW9uLlxuICAgIG1ldGhvZCA9IG1ldGhvZCB8fCBEZWZhdWx0W25hbWVdXG5cbiAgICAvLyBJZiBpbXBsZW1lbnRhdGlvbiBpcyBzdGlsbCBub3QgZm91bmQgKHdoaWNoIGFsc28gbWVhbnMgdGhlcmUgaXMgbm9cbiAgICAvLyBkZWZhdWx0KSBqdXN0IHRocm93IGFuIGVycm9yIHdpdGggYSBkZXNjcmlwdGl2ZSBtZXNzYWdlLlxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBUeXBlRXJyb3IoXCJUeXBlIGRvZXMgbm90IGltcGxlbWVudHMgbWV0aG9kOiBcIiArIG5hbWUpXG5cbiAgICAvLyBJZiBpbXBsZW1lbnRhdGlvbiB3YXMgZm91bmQgdGhlbiBqdXN0IGRlbGVnYXRlLlxuICAgIHJldHVybiBtZXRob2QuYXBwbHkobWV0aG9kLCBhcmd1bWVudHMpXG4gIH1cblxuICAvLyBNYWtlIGB0b1N0cmluZ2Agb2YgdGhlIGRpc3BhdGNoIHJldHVybiBhIHByaXZhdGUgbmFtZSwgdGhpcyBlbmFibGVzXG4gIC8vIG1ldGhvZCBkZWZpbml0aW9uIHdpdGhvdXQgc3VnYXI6XG4gIC8vXG4gIC8vICAgIHZhciBtZXRob2QgPSBNZXRob2QoKVxuICAvLyAgICBvYmplY3RbbWV0aG9kXSA9IGZ1bmN0aW9uKCkgeyAvKioqLyB9XG4gIGRpc3BhdGNoLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7IHJldHVybiBuYW1lIH1cblxuICAvLyBDb3B5IHV0aWxpdHkgbWV0aG9kcyBmb3IgY29udmVuaWVudCBBUEkuXG4gIGRpc3BhdGNoLmltcGxlbWVudCA9IGltcGxlbWVudE1ldGhvZFxuICBkaXNwYXRjaC5kZWZpbmUgPSBkZWZpbmVNZXRob2RcblxuICByZXR1cm4gZGlzcGF0Y2hcbn1cblxuLy8gQ3JlYXRlIG1ldGhvZCBzaG9ydGN1dHMgZm9ybSBmdW5jdGlvbnMuXG52YXIgZGVmaW5lTWV0aG9kID0gZnVuY3Rpb24gZGVmaW5lTWV0aG9kKFR5cGUsIGxhbWJkYSkge1xuICByZXR1cm4gZGVmaW5lKHRoaXMsIFR5cGUsIGxhbWJkYSlcbn1cbnZhciBpbXBsZW1lbnRNZXRob2QgPSBmdW5jdGlvbiBpbXBsZW1lbnRNZXRob2Qob2JqZWN0LCBsYW1iZGEpIHtcbiAgcmV0dXJuIGltcGxlbWVudCh0aGlzLCBvYmplY3QsIGxhbWJkYSlcbn1cblxuLy8gRGVmaW5lIGBpbXBsZW1lbnRgIGFuZCBgZGVmaW5lYCBwb2x5bW9ycGhpYyBtZXRob2RzIHRvIGFsbG93IGRlZmluaXRpb25zXG4vLyBhbmQgaW1wbGVtZW50YXRpb25zIHRocm91Z2ggdGhlbS5cbnZhciBpbXBsZW1lbnQgPSBNZXRob2QoXCJpbXBsZW1lbnRAbWV0aG9kXCIpXG52YXIgZGVmaW5lID0gTWV0aG9kKFwiZGVmaW5lQG1ldGhvZFwiKVxuXG5cbmZ1bmN0aW9uIF9pbXBsZW1lbnQobWV0aG9kLCBvYmplY3QsIGxhbWJkYSkge1xuICAvKipcbiAgSW1wbGVtZW50cyBgTWV0aG9kYCBmb3IgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggYSBwcm92aWRlZCBgaW1wbGVtZW50YXRpb25gLlxuICBDYWxsaW5nIGBNZXRob2RgIHdpdGggYG9iamVjdGAgYXMgYSBmaXJzdCBhcmd1bWVudCB3aWxsIGRpc3BhdGNoIG9uIHByb3ZpZGVkXG4gIGltcGxlbWVudGF0aW9uLlxuICAqKi9cbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KG9iamVjdCwgbWV0aG9kLnRvU3RyaW5nKCksIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbGFtYmRhXG4gIH0pXG59XG5cbmZ1bmN0aW9uIF9kZWZpbmUobWV0aG9kLCBUeXBlLCBsYW1iZGEpIHtcbiAgLyoqXG4gIERlZmluZXMgYE1ldGhvZGAgZm9yIHRoZSBnaXZlbiBgVHlwZWAgd2l0aCBhIHByb3ZpZGVkIGBpbXBsZW1lbnRhdGlvbmAuXG4gIENhbGxpbmcgYE1ldGhvZGAgd2l0aCBhIGZpcnN0IGFyZ3VtZW50IG9mIHRoaXMgYFR5cGVgIHdpbGwgZGlzcGF0Y2ggb25cbiAgcHJvdmlkZWQgYGltcGxlbWVudGF0aW9uYC4gSWYgYFR5cGVgIGlzIGEgYE1ldGhvZGAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICBpcyBkZWZpbmVkLiBJZiBgVHlwZWAgaXMgYSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYE1ldGhvZGAgaXMgaW1wbGVtZW50ZWRcbiAgZm9yIHRoYXQgdmFsdWUgdHlwZS5cbiAgKiovXG5cbiAgLy8gQXR0ZW1wdCB0byBndWVzcyBhIHR5cGUgdmlhIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGxgIGhhY2suXG4gIHZhciB0eXBlID0gVHlwZSAmJiB0eXBlZnkuY2FsbChUeXBlLnByb3RvdHlwZSlcblxuICAvLyBJZiBvbmx5IHR3byBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aGVuIGBUeXBlYCBpcyBhY3R1YWxseSBhbiBpbXBsZW1lbnRhdGlvblxuICAvLyBmb3IgYSBkZWZhdWx0IHR5cGUuXG4gIGlmICghbGFtYmRhKSBEZWZhdWx0W21ldGhvZF0gPSBUeXBlXG4gIC8vIElmIGBUeXBlYCBpcyBgbnVsbGAgb3IgYHZvaWRgIHN0b3JlIGltcGxlbWVudGF0aW9uIGFjY29yZGluZ2x5LlxuICBlbHNlIGlmIChUeXBlID09PSBudWxsKSBOdWxsW21ldGhvZF0gPSBsYW1iZGFcbiAgZWxzZSBpZiAoVHlwZSA9PT0gdm9pZCgwKSkgVm9pZFttZXRob2RdID0gbGFtYmRhXG4gIC8vIElmIGB0eXBlYCBoYWNrIGluZGljYXRlcyBidWlsdC1pbiB0eXBlIGFuZCB0eXBlIGhhcyBhIG5hbWUgdXMgaXQgdG9cbiAgLy8gc3RvcmUgYSBpbXBsZW1lbnRhdGlvbiBpbnRvIGFzc29jaWF0ZWQgaGFzaC4gSWYgaGFzaCBmb3IgdGhpcyB0eXBlIGRvZXNcbiAgLy8gbm90IGV4aXN0cyB5ZXQgY3JlYXRlIG9uZS5cbiAgZWxzZSBpZiAodHlwZSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIiAmJiBUeXBlLm5hbWUpIHtcbiAgICB2YXIgQnVsaXRpbiA9IGJ1aWx0aW5bVHlwZS5uYW1lXSB8fCAoYnVpbHRpbltUeXBlLm5hbWVdID0gbmV3IE9iamVjdFR5cGUoKSlcbiAgICBCdWxpdGluW21ldGhvZF0gPSBsYW1iZGFcbiAgfVxuICAvLyBJZiBgdHlwZWAgaGFjayBpbmRpY2F0ZXMgYW4gb2JqZWN0LCB0aGF0IG1heSBiZSBlaXRoZXIgb2JqZWN0IG9yIGFueVxuICAvLyBKUyBkZWZpbmVkIFwiQ2xhc3NcIi4gSWYgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IgaXMgYE9iamVjdGAsIGFzc3VtZSBpdCdzXG4gIC8vIGJ1aWx0LWluIGBPYmplY3RgIGFuZCBzdG9yZSBpbXBsZW1lbnRhdGlvbiBhY2NvcmRpbmdseS5cbiAgZWxzZSBpZiAoVHlwZS5uYW1lID09PSBcIk9iamVjdFwiKVxuICAgIGJ1aWx0aW4uT2JqZWN0W21ldGhvZF0gPSBsYW1iZGFcbiAgLy8gSG9zdCBvYmplY3RzIGFyZSBwYWluISEhIEV2ZXJ5IGJyb3dzZXIgZG9lcyBzb21lIGNyYXp5IHN0dWZmIGZvciB0aGVtXG4gIC8vIFNvIGZhciBhbGwgYnJvd3NlciBzZWVtIHRvIG5vdCBpbXBsZW1lbnQgYGNhbGxgIG1ldGhvZCBmb3IgaG9zdCBvYmplY3RcbiAgLy8gY29uc3RydWN0b3JzLiBJZiB0aGF0IGlzIGEgY2FzZSBoZXJlLCBhc3N1bWUgaXQncyBhIGhvc3Qgb2JqZWN0IGFuZFxuICAvLyBzdG9yZSBpbXBsZW1lbnRhdGlvbiBpbiBhIGBob3N0YCBhcnJheSBhbmQgc3RvcmUgYGluZGV4YCBpbiB0aGUgYXJyYXlcbiAgLy8gaW4gYSBgVHlwZS5wcm90b3R5cGVgIGl0c2VsZi4gVGhpcyBhdm9pZHMgbWVtb3J5IGxlYWtzIHRoYXQgY291bGQgYmVcbiAgLy8gY2F1c2VkIGJ5IHN0b3JpbmcgSlMgb2JqZWN0cyBvbiBhIGhvc3Qgb2JqZWN0cy5cbiAgZWxzZSBpZiAoVHlwZS5jYWxsID09PSB2b2lkKDApKSB7XG4gICAgdmFyIGluZGV4ID0gaG9zdC5pbmRleE9mKGxhbWJkYSlcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCA9IGhvc3QucHVzaChsYW1iZGEpIC0gMVxuICAgIC8vIFByZWZpeCBwcml2YXRlIG5hbWUgd2l0aCBgIWAgc28gaXQgY2FuIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgbWV0aG9kXG4gICAgLy8gd2l0aG91dCB0eXBlIGNoZWNrcy5cbiAgICBpbXBsZW1lbnQoXCIhXCIgKyBtZXRob2QsIFR5cGUucHJvdG90eXBlLCBpbmRleClcbiAgfVxuICAvLyBJZiBHb3QgdGhhdCBmYXIgYFR5cGVgIGlzIHVzZXIgZGVmaW5lZCBKUyBgQ2xhc3NgLiBEZWZpbmUgcHJpdmF0ZSBuYW1lXG4gIC8vIGFzIGhpZGRlbiBwcm9wZXJ0eSBvbiBpdCdzIHByb3RvdHlwZS5cbiAgZWxzZVxuICAgIGltcGxlbWVudChtZXRob2QsIFR5cGUucHJvdG90eXBlLCBsYW1iZGEpXG59XG5cbi8vIEFuZCBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbnMgZm9yIGEgcG9seW1vcnBoaWMgZXF1aXZhbGVudHMuXG5fZGVmaW5lKGRlZmluZSwgX2RlZmluZSlcbl9kZWZpbmUoaW1wbGVtZW50LCBfaW1wbGVtZW50KVxuXG4vLyBEZWZpbmUgZXhwb3J0cyBvbiBgTWV0aG9kYCBhcyBpdCdzIG9ubHkgdGhpbmcgYmVpbmcgZXhwb3J0ZWQuXG5NZXRob2QuaW1wbGVtZW50ID0gaW1wbGVtZW50XG5NZXRob2QuZGVmaW5lID0gZGVmaW5lXG5NZXRob2QuTWV0aG9kID0gTWV0aG9kXG5NZXRob2QubWV0aG9kID0gTWV0aG9kXG5NZXRob2QuYnVpbHRpbiA9IGJ1aWx0aW5cbk1ldGhvZC5ob3N0ID0gaG9zdFxuXG5tb2R1bGUuZXhwb3J0cyA9IE1ldGhvZFxuIl19 ; \ No newline at end of file