svgomg-ui/js/svgo-worker.js.map

1 line
4.3 MiB
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"svgo-worker.js","sources":["../../node_modules/rollup-plugin-node-builtins/src/es6/events.js","../../node_modules/process-es6/browser.js","../../node_modules/rollup-plugin-node-builtins/src/es6/util.js","../../node_modules/buffer-es6/base64.js","../../node_modules/buffer-es6/ieee754.js","../../node_modules/buffer-es6/index.js","../../node_modules/rollup-plugin-node-builtins/src/es6/readable-stream/buffer-list.js","../../node_modules/rollup-plugin-node-builtins/src/es6/string-decoder.js","../../node_modules/rollup-plugin-node-builtins/src/es6/readable-stream/readable.js","../../node_modules/rollup-plugin-node-builtins/src/es6/readable-stream/writable.js","../../node_modules/rollup-plugin-node-builtins/src/es6/readable-stream/duplex.js","../../node_modules/rollup-plugin-node-builtins/src/es6/readable-stream/transform.js","../../node_modules/rollup-plugin-node-builtins/src/es6/readable-stream/passthrough.js","../../node_modules/rollup-plugin-node-builtins/src/es6/stream.js","../../node_modules/entities/lib/encode.js","../../node_modules/entities/lib/decode.js","../../node_modules/domutils/lib/stringify.js","../../node_modules/domutils/lib/querying.js","../../node_modules/css-what/index.js","../../node_modules/css-select/lib/sort.js","../../node_modules/css-select/lib/pseudos.js","../../node_modules/css-select/index.js","../../node_modules/css-select-base-adapter/index.js","../../node_modules/css-tree/lib/utils/list.js","../../node_modules/css-tree/lib/tokenizer/error.js","../../node_modules/css-tree/lib/tokenizer/utils.js","../../node_modules/css-tree/lib/tokenizer/Tokenizer.js","../../node_modules/css-tree/lib/lexer/grammar/translate.js","../../node_modules/css-tree/lib/lexer/error.js","../../node_modules/css-tree/lib/utils/names.js","../../node_modules/css-tree/lib/lexer/generic.js","../../node_modules/css-tree/lib/lexer/grammar/parse.js","../../node_modules/css-tree/lib/lexer/match.js","../../node_modules/css-tree/lib/lexer/trace.js","../../node_modules/css-tree/lib/lexer/search.js","../../node_modules/css-tree/lib/lexer/structure.js","../../node_modules/css-tree/lib/lexer/Lexer.js","../../node_modules/css-tree/lib/parser/create.js","../../node_modules/source-map/lib/base64-vlq.js","../../node_modules/source-map/lib/array-set.js","../../node_modules/source-map/lib/mapping-list.js","../../node_modules/source-map/lib/source-map-generator.js","../../node_modules/source-map/lib/quick-sort.js","../../node_modules/source-map/lib/source-map-consumer.js","../../node_modules/source-map/lib/source-node.js","../../node_modules/css-tree/lib/generator/create.js","../../node_modules/css-tree/lib/walker/create.js","../../node_modules/css-tree/lib/syntax/config/mix.js","../../node_modules/css-tree/lib/syntax/create.js","../../node_modules/css-tree/data/index.js","../../node_modules/css-tree/lib/syntax/node/AnPlusB.js","../../node_modules/css-tree/lib/syntax/node/Atrule.js","../../node_modules/css-tree/lib/syntax/node/AttributeSelector.js","../../node_modules/css-tree/lib/syntax/node/Block.js","../../node_modules/css-tree/lib/syntax/node/Declaration.js","../../node_modules/css-tree/lib/syntax/node/DeclarationList.js","../../node_modules/css-tree/lib/syntax/node/Dimension.js","../../node_modules/css-tree/lib/syntax/node/HexColor.js","../../node_modules/css-tree/lib/syntax/node/Ratio.js","../../node_modules/css-tree/lib/syntax/node/Rule.js","../../node_modules/css-tree/lib/syntax/node/StyleSheet.js","../../node_modules/css-tree/lib/syntax/node/TypeSelector.js","../../node_modules/css-tree/lib/syntax/node/UnicodeRange.js","../../node_modules/css-tree/lib/syntax/node/Value.js","../../node_modules/css-tree/lib/syntax/atrule/supports.js","../../node_modules/svgo/lib/css-tools.js","../../node_modules/rollup-plugin-node-builtins/src/es6/os.js","../../node_modules/svgo/lib/svgo/js2svg.js","../../node_modules/svgo/lib/svgo/plugins.js","../../node_modules/csso/node_modules/css-tree/lib/utils/list.js","../../node_modules/csso/node_modules/css-tree/lib/tokenizer/error.js","../../node_modules/csso/node_modules/css-tree/lib/tokenizer/utils.js","../../node_modules/csso/node_modules/css-tree/lib/tokenizer/Tokenizer.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/grammar/generate.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/error.js","../../node_modules/csso/node_modules/css-tree/lib/utils/names.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/generic.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/grammar/parse.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/grammar/walk.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/match-graph.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/match.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/trace.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/search.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/structure.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/Lexer.js","../../node_modules/csso/node_modules/css-tree/lib/parser/create.js","../../node_modules/csso/node_modules/css-tree/lib/generator/create.js","../../node_modules/csso/node_modules/css-tree/lib/walker/create.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/config/mix.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/create.js","../../node_modules/csso/node_modules/css-tree/data/index.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/AnPlusB.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Atrule.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/AttributeSelector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Block.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Declaration.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/DeclarationList.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Dimension.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/HexColor.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Ratio.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Rule.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/StyleSheet.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/TypeSelector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/UnicodeRange.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/atrule/supports.js","../../node_modules/csso/lib/usage.js","../../node_modules/csso/lib/clean/Rule.js","../../node_modules/csso/lib/replace/AttributeSelector.js","../../node_modules/csso/lib/replace/property/border.js","../../node_modules/csso/lib/replace/Number.js","../../node_modules/csso/lib/replace/color.js","../../node_modules/csso/lib/restructure/prepare/createDeclarationIndexer.js","../../node_modules/csso/lib/restructure/1-mergeAtrule.js","../../node_modules/csso/lib/restructure/utils.js","../../node_modules/csso/lib/restructure/2-initialMergeRuleset.js","../../node_modules/csso/lib/restructure/3-disjoinRuleset.js","../../node_modules/csso/lib/restructure/4-restructShorthand.js","../../node_modules/csso/lib/restructure/6-restructBlock.js","../../node_modules/csso/lib/restructure/7-mergeRuleset.js","../../node_modules/csso/lib/restructure/8-restructRuleset.js","../../node_modules/csso/lib/compress.js","../../node_modules/csso/lib/index.js","../../node_modules/svgo/plugins/minifyStyles.js","../../node_modules/svgo/plugins/convertStyleToAttrs.js","../../node_modules/svgo/plugins/cleanupIDs.js","../../node_modules/svgo/plugins/removeUselessDefs.js","../../node_modules/svgo/plugins/convertColors.js","../../node_modules/svgo/plugins/moveElemsAttrsToGroup.js","../../node_modules/svgo/plugins/collapseGroups.js","../../node_modules/svgo/plugins/convertPathData.js","../../node_modules/svgo/plugins/convertTransform.js","../../src/js/svgo-worker/index.js","../../node_modules/svgo/plugins/_transforms.js","../../node_modules/es-abstract/helpers/isNaN.js","../../node_modules/sax/lib/sax.js","../../src/js/utils/node-globals/global.js","../../node_modules/rollup-plugin-node-builtins/src/es6/inherits.js","../../node_modules/buffer-es6/isArray.js","../../node_modules/domelementtype/index.js","../../node_modules/dom-serializer/node_modules/domelementtype/index.js","../../node_modules/entities/lib/decode_codepoint.js","../../node_modules/entities/index.js","../../node_modules/dom-serializer/index.js","../../node_modules/domutils/lib/traversal.js","../../node_modules/domutils/lib/manipulation.js","../../node_modules/domutils/lib/legacy.js","../../node_modules/domutils/lib/helpers.js","../../node_modules/domutils/index.js","../../node_modules/boolbase/index.js","../../node_modules/css-select/lib/attributes.js","../../node_modules/css-select/lib/general.js","../../node_modules/nth-check/parse.js","../../node_modules/nth-check/compile.js","../../node_modules/nth-check/index.js","../../node_modules/css-select/lib/compile.js","../../node_modules/svgo/lib/svgo/css-select-adapter.js","../../node_modules/svgo/lib/svgo/jsAPI.js","../../node_modules/object-keys/isArguments.js","../../node_modules/object-keys/index.js","../../node_modules/foreach/index.js","../../node_modules/define-properties/index.js","../../node_modules/function-bind/implementation.js","../../node_modules/function-bind/index.js","../../node_modules/has/src/index.js","../../node_modules/es-to-primitive/helpers/isPrimitive.js","../../node_modules/is-callable/index.js","../../node_modules/is-date-object/index.js","../../node_modules/is-symbol/index.js","../../node_modules/es-to-primitive/es6.js","../../node_modules/es-abstract/GetIntrinsic.js","../../node_modules/es-abstract/helpers/isFinite.js","../../node_modules/es-abstract/helpers/assign.js","../../node_modules/es-abstract/helpers/sign.js","../../node_modules/es-abstract/helpers/mod.js","../../node_modules/es-abstract/helpers/isPrimitive.js","../../node_modules/es-to-primitive/es5.js","../../node_modules/es-abstract/es5.js","../../node_modules/is-regex/index.js","../../node_modules/es-abstract/es2015.js","../../node_modules/es-abstract/es2016.js","../../node_modules/object.values/implementation.js","../../node_modules/object.values/polyfill.js","../../node_modules/object.values/index.js","../../node_modules/object.values/shim.js","../../node_modules/svgo/lib/svgo/css-class-list.js","../../node_modules/css-tree/lib/utils/createCustomError.js","../../node_modules/css-tree/lib/tokenizer/const.js","../../node_modules/css-tree/lib/lexer/grammar/error.js","../../node_modules/css-tree/lib/lexer/grammar/walk.js","../../node_modules/css-tree/lib/lexer/grammar/index.js","../../node_modules/css-tree/lib/parser/sequence.js","../../node_modules/source-map/lib/base64.js","../../node_modules/source-map/lib/util.js","../../node_modules/source-map/lib/binary-search.js","../../node_modules/source-map/source-map.js","../../node_modules/css-tree/lib/generator/sourceMap.js","../../node_modules/css-tree/lib/convertor/create.js","../../node_modules/css-tree/lib/utils/clone.js","../../node_modules/css-tree/lib/syntax/node/Brackets.js","../../node_modules/css-tree/lib/syntax/node/CDC.js","../../node_modules/css-tree/lib/syntax/node/CDO.js","../../node_modules/css-tree/lib/syntax/node/ClassSelector.js","../../node_modules/css-tree/lib/syntax/node/Combinator.js","../../node_modules/css-tree/lib/syntax/node/Comment.js","../../node_modules/css-tree/lib/syntax/node/Function.js","../../node_modules/css-tree/lib/syntax/node/Identifier.js","../../node_modules/css-tree/lib/syntax/node/IdSelector.js","../../node_modules/css-tree/lib/syntax/node/MediaFeature.js","../../node_modules/css-tree/lib/syntax/node/MediaQuery.js","../../node_modules/css-tree/lib/syntax/node/MediaQueryList.js","../../node_modules/css-tree/lib/syntax/node/Number.js","../../node_modules/css-tree/lib/syntax/node/Operator.js","../../node_modules/css-tree/lib/syntax/node/Parentheses.js","../../node_modules/css-tree/lib/syntax/node/Percentage.js","../../node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js","../../node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js","../../node_modules/css-tree/lib/syntax/node/Raw.js","../../node_modules/css-tree/lib/syntax/node/SelectorList.js","../../node_modules/css-tree/lib/syntax/node/String.js","../../node_modules/css-tree/lib/syntax/node/Url.js","../../node_modules/css-tree/lib/syntax/node/WhiteSpace.js","../../node_modules/css-tree/lib/syntax/node/index.js","../../node_modules/css-tree/lib/syntax/node/AtrulePrelude.js","../../node_modules/css-tree/lib/syntax/node/Nth.js","../../node_modules/css-tree/lib/syntax/node/Selector.js","../../node_modules/css-tree/lib/syntax/config/lexer.js","../../node_modules/css-tree/lib/syntax/scope/default.js","../../node_modules/css-tree/lib/syntax/scope/selector.js","../../node_modules/css-tree/lib/syntax/function/element.js","../../node_modules/css-tree/lib/syntax/function/var.js","../../node_modules/css-tree/lib/syntax/atrule/import.js","../../node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js","../../node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js","../../node_modules/css-tree/lib/syntax/pseudo/common/nth.js","../../node_modules/css-tree/lib/syntax/index.js","../../node_modules/css-tree/lib/syntax/config/parser.js","../../node_modules/css-tree/lib/syntax/scope/index.js","../../node_modules/css-tree/lib/syntax/scope/atrulePrelude.js","../../node_modules/css-tree/lib/syntax/scope/value.js","../../node_modules/css-tree/lib/syntax/function/expression.js","../../node_modules/css-tree/lib/syntax/atrule/index.js","../../node_modules/css-tree/lib/syntax/atrule/font-face.js","../../node_modules/css-tree/lib/syntax/atrule/media.js","../../node_modules/css-tree/lib/syntax/atrule/page.js","../../node_modules/css-tree/lib/syntax/pseudo/index.js","../../node_modules/css-tree/lib/syntax/pseudo/dir.js","../../node_modules/css-tree/lib/syntax/pseudo/has.js","../../node_modules/css-tree/lib/syntax/pseudo/lang.js","../../node_modules/css-tree/lib/syntax/pseudo/slotted.js","../../node_modules/css-tree/lib/syntax/config/walker.js","../../node_modules/stable/stable.js","../../node_modules/csso/lib/restructure/prepare/specificity.js","../../node_modules/svgo/lib/svgo/css-style-declaration.js","../../node_modules/svgo/lib/svgo/svg2js.js","../../node_modules/svgo/plugins/_collections.js","../../node_modules/svgo/plugins/removeEditorsNSData.js","../../node_modules/svgo/plugins/cleanupAttrs.js","../../node_modules/csso/node_modules/css-tree/lib/utils/createCustomError.js","../../node_modules/csso/node_modules/css-tree/lib/tokenizer/const.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/grammar/error.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/grammar/tokenizer.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/ast-to-tokens.js","../../node_modules/csso/node_modules/css-tree/lib/lexer/grammar/index.js","../../node_modules/csso/node_modules/css-tree/lib/parser/sequence.js","../../node_modules/csso/node_modules/css-tree/lib/generator/sourceMap.js","../../node_modules/csso/node_modules/css-tree/lib/convertor/create.js","../../node_modules/csso/node_modules/css-tree/lib/utils/clone.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Brackets.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/CDC.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/CDO.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/ClassSelector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Combinator.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Comment.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Function.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Identifier.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/IdSelector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaFeature.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQuery.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQueryList.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Number.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Operator.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Parentheses.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Percentage.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Raw.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/SelectorList.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/String.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Url.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/WhiteSpace.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/index.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Nth.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Selector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/node/Value.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/config/lexer.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/scope/default.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/scope/selector.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/function/element.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/function/var.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/atrule/import.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nth.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/index.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/config/parser.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/scope/index.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/scope/value.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/function/expression.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/atrule/index.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/atrule/font-face.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/atrule/media.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/atrule/page.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/index.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/dir.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/has.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/lang.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/slotted.js","../../node_modules/csso/node_modules/css-tree/lib/syntax/config/walker.js","../../node_modules/csso/lib/clean/Atrule.js","../../node_modules/csso/lib/clean/index.js","../../node_modules/csso/lib/clean/Declaration.js","../../node_modules/csso/lib/clean/TypeSelector.js","../../node_modules/csso/lib/clean/Comment.js","../../node_modules/csso/lib/clean/Operator.js","../../node_modules/csso/lib/clean/WhiteSpace.js","../../node_modules/csso/lib/replace/atrule/keyframes.js","../../node_modules/csso/lib/replace/Atrule.js","../../node_modules/csso/lib/replace/property/background.js","../../node_modules/csso/lib/replace/Value.js","../../node_modules/csso/lib/replace/property/font.js","../../node_modules/csso/lib/replace/property/font-weight.js","../../node_modules/csso/lib/replace/Dimension.js","../../node_modules/csso/lib/replace/Percentage.js","../../node_modules/csso/lib/replace/Url.js","../../node_modules/csso/lib/replace/index.js","../../node_modules/csso/lib/replace/String.js","../../node_modules/csso/lib/restructure/prepare/processSelector.js","../../node_modules/csso/lib/restructure/prepare/index.js","../../node_modules/csso/lib/restructure/index.js","../../node_modules/svgo/lib/svgo/tools.js","../../node_modules/svgo/plugins/cleanupNumericValues.js","../../node_modules/svgo/plugins/cleanupListOfValues.js","../../node_modules/svgo/plugins/removeUnknownsAndDefaults.js","../../node_modules/svgo/plugins/removeNonInheritableGroupAttrs.js","../../node_modules/svgo/plugins/removeUselessStrokeAndFill.js","../../node_modules/svgo/plugins/removeViewBox.js","../../node_modules/svgo/plugins/removeHiddenElems.js","../../node_modules/svgo/plugins/convertShapeToPath.js","../../node_modules/svgo/plugins/moveGroupAttrsToElems.js","../../node_modules/svgo/plugins/_path.js","../../node_modules/svgo/plugins/removeEmptyContainers.js","../../node_modules/svgo/plugins/mergePaths.js","../../node_modules/svgo/plugins/removeDesc.js","../../node_modules/svgo/plugins/removeDoctype.js","../../node_modules/svgo/plugins/removeXMLProcInst.js","../../node_modules/svgo/plugins/removeComments.js","../../node_modules/svgo/plugins/removeMetadata.js","../../node_modules/svgo/plugins/removeXMLNS.js","../../node_modules/svgo/plugins/inlineStyles.js","../../node_modules/svgo/plugins/removeRasterImages.js","../../node_modules/svgo/plugins/cleanupEnableBackground.js","../../node_modules/svgo/plugins/removeEmptyText.js","../../node_modules/svgo/plugins/removeEmptyAttrs.js","../../node_modules/svgo/plugins/removeUnusedNS.js","../../node_modules/svgo/plugins/sortAttrs.js","../../node_modules/svgo/plugins/removeTitle.js","../../node_modules/svgo/plugins/removeDimensions.js","../../node_modules/svgo/plugins/removeStyleElement.js","../../node_modules/svgo/plugins/removeScriptElement.js"],"sourcesContent":["'use strict';\n\nvar domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nexport default EventEmitter;\nexport {EventEmitter};\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active && !(this instanceof domain.Domain)) {\n this.domain = domain.active;\n }\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var needDomainExit = false;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n if (needDomainExit)\n domain.exit();\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n","// shim for using process in browser\n// based off https://github.com/defunctzombie/node-process/blob/master/browser.js\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\nvar cachedSetTimeout = defaultSetTimout;\nvar cachedClearTimeout = defaultClearTimeout;\nif (typeof global.setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n}\nif (typeof global.clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n}\n\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\nexport function nextTick(fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n}\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nexport var title = 'browser';\nexport var platform = 'browser';\nexport var browser = true;\nexport var env = {};\nexport var argv = [];\nexport var version = ''; // empty string to avoid regexp issues\nexport var versions = {};\nexport var release = {};\nexport var config = {};\n\nfunction noop() {}\n\nexport var on = noop;\nexport var addListener = noop;\nexport var once = noop;\nexport var off = noop;\nexport var removeListener = noop;\nexport var removeAllListeners = noop;\nexport var emit = noop;\n\nexport function binding(name) {\n throw new Error('process.binding is not supported');\n}\n\nexport function cwd () { return '/' }\nexport function chdir (dir) {\n throw new Error('process.chdir is not supported');\n};\nexport function umask() { return 0; }\n\n// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js\nvar performance = global.performance || {}\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() }\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nexport function hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3\n var seconds = Math.floor(clocktime)\n var nanoseconds = Math.floor((clocktime%1)*1e9)\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0]\n nanoseconds = nanoseconds - previousTimestamp[1]\n if (nanoseconds<0) {\n seconds--\n nanoseconds += 1e9\n }\n }\n return [seconds,nanoseconds]\n}\n\nvar startTime = new Date();\nexport function uptime() {\n var currentTime = new Date();\n var dif = currentTime - startTime;\n return dif / 1000;\n}\n\nexport default {\n nextTick: nextTick,\n title: title,\n browser: browser,\n env: env,\n argv: argv,\n version: version,\n versions: versions,\n on: on,\n addListener: addListener,\n once: once,\n off: off,\n removeListener: removeListener,\n removeAllListeners: removeAllListeners,\n emit: emit,\n binding: binding,\n cwd: cwd,\n chdir: chdir,\n umask: umask,\n hrtime: hrtime,\n platform: platform,\n release: release,\n config: config,\n uptime: uptime\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\nimport process from 'process';\nvar formatRegExp = /%[sdj%]/g;\nexport function format(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexport function deprecate(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexport function debuglog(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = 0;\n debugs[set] = function() {\n var msg = format.apply(null, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nexport function inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n _extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nexport function isArray(ar) {\n return Array.isArray(ar);\n}\n\nexport function isBoolean(arg) {\n return typeof arg === 'boolean';\n}\n\nexport function isNull(arg) {\n return arg === null;\n}\n\nexport function isNullOrUndefined(arg) {\n return arg == null;\n}\n\nexport function isNumber(arg) {\n return typeof arg === 'number';\n}\n\nexport function isString(arg) {\n return typeof arg === 'string';\n}\n\nexport function isSymbol(arg) {\n return typeof arg === 'symbol';\n}\n\nexport function isUndefined(arg) {\n return arg === void 0;\n}\n\nexport function isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\n\nexport function isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nexport function isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\n\nexport function isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\n\nexport function isFunction(arg) {\n return typeof arg === 'function';\n}\n\nexport function isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\n\nexport function isBuffer(maybeBuf) {\n return Buffer.isBuffer(maybeBuf);\n}\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexport function log() {\n console.log('%s - %s', timestamp(), format.apply(null, arguments));\n}\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nimport inherits from './inherits';\nexport {inherits}\n\nexport function _extend(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport default {\n inherits: inherits,\n _extend: _extend,\n log: log,\n isBuffer: isBuffer,\n isPrimitive: isPrimitive,\n isFunction: isFunction,\n isError: isError,\n isDate: isDate,\n isObject: isObject,\n isRegExp: isRegExp,\n isUndefined: isUndefined,\n isSymbol: isSymbol,\n isString: isString,\n isNumber: isNumber,\n isNullOrUndefined: isNullOrUndefined,\n isNull: isNull,\n isBoolean: isBoolean,\n isArray: isArray,\n inspect: inspect,\n deprecate: deprecate,\n format: format,\n debuglog: debuglog\n}\n","\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\nvar inited = false;\nfunction init () {\n inited = true;\n var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n for (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n }\n\n revLookup['-'.charCodeAt(0)] = 62\n revLookup['_'.charCodeAt(0)] = 63\n}\n\nexport function toByteArray (b64) {\n if (!inited) {\n init();\n }\n var i, j, l, tmp, placeHolders, arr\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // the number of equal signs (place holders)\n // if there are two placeholders, than the two characters before it\n // represent one byte\n // if there is only one, then the three characters before it represent 2 bytes\n // this is just a cheap hack to not do indexOf twice\n placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n\n // base64 is 4/3 + up to two characters of the original data\n arr = new Arr(len * 3 / 4 - placeHolders)\n\n // if there are placeholders, only get up to the last complete 4 chars\n l = placeHolders > 0 ? len - 4 : len\n\n var L = 0\n\n for (i = 0, j = 0; i < l; i += 4, j += 3) {\n tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n arr[L++] = (tmp >> 16) & 0xFF\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n if (placeHolders === 2) {\n tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[L++] = tmp & 0xFF\n } else if (placeHolders === 1) {\n tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nexport function fromByteArray (uint8) {\n if (!inited) {\n init();\n }\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var output = ''\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n output += lookup[tmp >> 2]\n output += lookup[(tmp << 4) & 0x3F]\n output += '=='\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n output += lookup[tmp >> 10]\n output += lookup[(tmp >> 4) & 0x3F]\n output += lookup[(tmp << 2) & 0x3F]\n output += '='\n }\n\n parts.push(output)\n\n return parts.join('')\n}\n","\nexport function read (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexport function write (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n\nimport * as base64 from './base64'\nimport * as ieee754 from './ieee754'\nimport isArray from './isArray'\n\nexport var INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : true\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nvar _kMaxLength = kMaxLength()\nexport {_kMaxLength as kMaxLength};\nfunction typedArraySupport () {\n return true;\n // rollup issues\n // try {\n // var arr = new Uint8Array(1)\n // arr.__proto__ = {\n // __proto__: Uint8Array.prototype,\n // foo: function () { return 42 }\n // }\n // return arr.foo() === 42 && // typed array instances can be augmented\n // typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n // arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n // } catch (e) {\n // return false\n // }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nexport function Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n // Object.defineProperty(Buffer, Symbol.species, {\n // value: null,\n // configurable: true\n // })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (internalIsBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nexport function SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\nBuffer.isBuffer = isBuffer;\nfunction internalIsBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!internalIsBuffer(a) || !internalIsBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!internalIsBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (internalIsBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!internalIsBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (internalIsBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!internalIsBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = internalIsBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n\n\n// the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nexport function isBuffer(obj) {\n return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj))\n}\n\nfunction isFastBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0))\n}\n","import {Buffer} from 'buffer';\n\nexport default BufferList;\n\nfunction BufferList() {\n this.head = null;\n this.tail = null;\n this.length = 0;\n}\n\nBufferList.prototype.push = function (v) {\n var entry = { data: v, next: null };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n};\n\nBufferList.prototype.unshift = function (v) {\n var entry = { data: v, next: this.head };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n};\n\nBufferList.prototype.shift = function () {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n};\n\nBufferList.prototype.clear = function () {\n this.head = this.tail = null;\n this.length = 0;\n};\n\nBufferList.prototype.join = function (s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n while (p = p.next) {\n ret += s + p.data;\n }return ret;\n};\n\nBufferList.prototype.concat = function (n) {\n if (this.length === 0) return Buffer.alloc(0);\n if (this.length === 1) return this.head.data;\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n p.data.copy(ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport {Buffer} from 'buffer';\nvar isBufferEncoding = Buffer.isEncoding\n || function(encoding) {\n switch (encoding && encoding.toLowerCase()) {\n case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n default: return false;\n }\n }\n\n\nfunction assertEncoding(encoding) {\n if (encoding && !isBufferEncoding(encoding)) {\n throw new Error('Unknown encoding: ' + encoding);\n }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nexport function StringDecoder(encoding) {\n this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n assertEncoding(encoding);\n switch (this.encoding) {\n case 'utf8':\n // CESU-8 represents each of Surrogate Pair by 3-bytes\n this.surrogateSize = 3;\n break;\n case 'ucs2':\n case 'utf16le':\n // UTF-16 represents each of Surrogate Pair by 2-bytes\n this.surrogateSize = 2;\n this.detectIncompleteChar = utf16DetectIncompleteChar;\n break;\n case 'base64':\n // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n this.surrogateSize = 3;\n this.detectIncompleteChar = base64DetectIncompleteChar;\n break;\n default:\n this.write = passThroughWrite;\n return;\n }\n\n // Enough space to store all bytes of a single character. UTF-8 needs 4\n // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n this.charBuffer = new Buffer(6);\n // Number of bytes received for the current incomplete multi-byte character.\n this.charReceived = 0;\n // Number of bytes expected for the current incomplete multi-byte character.\n this.charLength = 0;\n};\n\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n var charStr = '';\n // if our last write ended with an incomplete multibyte character\n while (this.charLength) {\n // determine how many remaining bytes this buffer has to offer for this char\n var available = (buffer.length >= this.charLength - this.charReceived) ?\n this.charLength - this.charReceived :\n buffer.length;\n\n // add the new bytes to the char buffer\n buffer.copy(this.charBuffer, this.charReceived, 0, available);\n this.charReceived += available;\n\n if (this.charReceived < this.charLength) {\n // still not enough chars in this buffer? wait for more ...\n return '';\n }\n\n // remove bytes belonging to the current character from the buffer\n buffer = buffer.slice(available, buffer.length);\n\n // get the character that was split\n charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n var charCode = charStr.charCodeAt(charStr.length - 1);\n if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n this.charLength += this.surrogateSize;\n charStr = '';\n continue;\n }\n this.charReceived = this.charLength = 0;\n\n // if there are no more bytes in this buffer, just emit our char\n if (buffer.length === 0) {\n return charStr;\n }\n break;\n }\n\n // determine and set charLength / charReceived\n this.detectIncompleteChar(buffer);\n\n var end = buffer.length;\n if (this.charLength) {\n // buffer the incomplete character bytes we got\n buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n end -= this.charReceived;\n }\n\n charStr += buffer.toString(this.encoding, 0, end);\n\n var end = charStr.length - 1;\n var charCode = charStr.charCodeAt(end);\n // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n var size = this.surrogateSize;\n this.charLength += size;\n this.charReceived += size;\n this.charBuffer.copy(this.charBuffer, size, 0, size);\n buffer.copy(this.charBuffer, 0, 0, size);\n return charStr.substring(0, end);\n }\n\n // or just emit the charStr\n return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n // determine how many bytes we have to check at the end of this buffer\n var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n // Figure out if one of the last i bytes of our buffer announces an\n // incomplete char.\n for (; i > 0; i--) {\n var c = buffer[buffer.length - i];\n\n // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n // 110XXXXX\n if (i == 1 && c >> 5 == 0x06) {\n this.charLength = 2;\n break;\n }\n\n // 1110XXXX\n if (i <= 2 && c >> 4 == 0x0E) {\n this.charLength = 3;\n break;\n }\n\n // 11110XXX\n if (i <= 3 && c >> 3 == 0x1E) {\n this.charLength = 4;\n break;\n }\n }\n this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n var res = '';\n if (buffer && buffer.length)\n res = this.write(buffer);\n\n if (this.charReceived) {\n var cr = this.charReceived;\n var buf = this.charBuffer;\n var enc = this.encoding;\n res += buf.slice(0, cr).toString(enc);\n }\n\n return res;\n};\n\nfunction passThroughWrite(buffer) {\n return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n this.charReceived = buffer.length % 2;\n this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n this.charReceived = buffer.length % 3;\n this.charLength = this.charReceived ? 3 : 0;\n}\n","'use strict';\n\n\nReadable.ReadableState = ReadableState;\nimport EventEmitter from 'events';\nimport {inherits, debuglog} from 'util';\nimport BufferList from './buffer-list';\nimport {StringDecoder} from 'string_decoder';\nimport {Duplex} from './duplex';\nimport {nextTick} from 'process';\n\nvar debug = debuglog('stream');\ninherits(Readable, EventEmitter);\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') {\n return emitter.prependListener(event, fn);\n } else {\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event])\n emitter.on(event, fn);\n else if (Array.isArray(emitter._events[event]))\n emitter._events[event].unshift(fn);\n else\n emitter._events[event] = [fn, emitter._events[event]];\n }\n}\nfunction listenerCount (emitter, type) {\n return emitter.listeners(type).length;\n}\nfunction ReadableState(options, stream) {\n\n options = options || {};\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n\n if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n var hwm = options.highWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n // cast to ints.\n this.highWaterMark = ~ ~this.highWaterMark;\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // when piping, we only care about 'readable' events that happen\n // after read()ing all the bytes and not getting any pushback.\n this.ranOut = false;\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\nexport default Readable;\nexport function Readable(options) {\n\n if (!(this instanceof Readable)) return new Readable(options);\n\n this._readableState = new ReadableState(options, this);\n\n // legacy\n this.readable = true;\n\n if (options && typeof options.read === 'function') this._read = options.read;\n\n EventEmitter.call(this);\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n\n if (!state.objectMode && typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n }\n\n return readableAddChunk(this, state, chunk, encoding, false);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n var state = this._readableState;\n return readableAddChunk(this, state, chunk, '', true);\n};\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\nfunction readableAddChunk(stream, state, chunk, encoding, addToFront) {\n var er = chunkInvalid(state, chunk);\n if (er) {\n stream.emit('error', er);\n } else if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (state.ended && !addToFront) {\n var e = new Error('stream.push() after EOF');\n stream.emit('error', e);\n } else if (state.endEmitted && addToFront) {\n var _e = new Error('stream.unshift() after end event');\n stream.emit('error', _e);\n } else {\n var skipAdd;\n if (state.decoder && !addToFront && !encoding) {\n chunk = state.decoder.write(chunk);\n skipAdd = !state.objectMode && chunk.length === 0;\n }\n\n if (!addToFront) state.reading = false;\n\n // Don't add to the buffer if we've decoded to an empty string chunk and\n // we're not in object mode\n if (!skipAdd) {\n // if we want the data now, just emit it.\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n if (state.needReadable) emitReadable(stream);\n }\n }\n\n maybeReadMore(stream, state);\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n\n return needMoreData(state);\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n\n return ret;\n};\n\nfunction chunkInvalid(state, chunk) {\n var er = null;\n if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n return er;\n}\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n\n // emit 'readable' now to make sure it gets picked up.\n emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n var doEnd = (!pipeOpts || pipeOpts.end !== false);\n\n var endFn = doEnd ? onend : cleanup;\n if (state.endEmitted) nextTick(endFn);else src.once('end', endFn);\n\n dest.on('unpipe', onunpipe);\n function onunpipe(readable) {\n debug('onunpipe');\n if (readable === src) {\n cleanup();\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', cleanup);\n src.removeListener('data', ondata);\n\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', src._readableState.awaitDrain);\n src._readableState.awaitDrain++;\n increasedAwaitDrain = true;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (listenerCount(dest, 'error') === 0) dest.emit('error', er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && src.listeners('data').length) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var _i = 0; _i < len; _i++) {\n dests[_i].emit('unpipe', this);\n }return this;\n }\n\n // try to find the right one.\n var i = indexOf(state.pipes, dest);\n if (i === -1) return this;\n\n state.pipes.splice(i, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n dest.emit('unpipe', this);\n\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = EventEmitter.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n if (!state.reading) {\n nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this, state);\n }\n }\n }\n\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var state = this._readableState;\n var paused = false;\n\n var self = this;\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) self.push(chunk);\n }\n\n self.push(null);\n });\n\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = self.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n var events = ['error', 'close', 'destroy', 'pause', 'resume'];\n forEach(events, function (ev) {\n stream.on(ev, self.emit.bind(self, ev));\n });\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n self._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return self;\n};\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n\n return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n\n // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction forEach(xs, f) {\n for (var i = 0, l = xs.length; i < l; i++) {\n f(xs[i], i);\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}\n","// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\nimport {inherits, deprecate} from 'util';\nimport {Buffer} from 'buffer';\nWritable.WritableState = WritableState;\nimport {EventEmitter} from 'events';\nimport {Duplex} from './duplex';\nimport {nextTick} from 'process';\ninherits(Writable, EventEmitter);\n\nfunction nop() {}\n\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\nfunction WritableState(options, stream) {\n Object.defineProperty(this, 'buffer', {\n get: deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')\n });\n options = options || {};\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n\n if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n var hwm = options.highWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n // cast to ints.\n this.highWaterMark = ~ ~this.highWaterMark;\n\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function writableStateGetBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n\nexport default Writable;\nexport function Writable(options) {\n\n // Writable ctor is applied to Duplexes, though they're not\n // instanceof Writable, they're instanceof Readable.\n if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);\n\n this._writableState = new WritableState(options, this);\n\n // legacy.\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n\n if (typeof options.writev === 'function') this._writev = options.writev;\n }\n\n EventEmitter.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end');\n // TODO: defer error events consistently everywhere, not just the cb\n stream.emit('error', er);\n nextTick(cb, er);\n}\n\n// If we get something that is not a buffer, string, null, or undefined,\n// and we're not in objectMode, then that's an error.\n// Otherwise stream chunks are all considered to be of length=1, and the\n// watermarks determine how many objects to keep in the buffer, rather than\n// how many bytes or characters.\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n // Always throw error if a null is written\n // if we are not in object mode then throw\n // if it is not a buffer, string, or undefined.\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n if (er) {\n stream.emit('error', er);\n nextTick(cb, er);\n valid = false;\n }\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n if (typeof cb !== 'function') cb = nop;\n\n if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, chunk, encoding, cb);\n }\n\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n\n if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, chunk, encoding, cb) {\n chunk = decodeChunk(state, chunk, encoding);\n\n if (Buffer.isBuffer(chunk)) encoding = 'buffer';\n var len = state.objectMode ? 1 : chunk.length;\n\n state.length += len;\n\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n if (sync) nextTick(cb, er);else cb(er);\n\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n\n onwriteStateUpdate(state);\n\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /*<replacement>*/\n nextTick(afterWrite, stream, state, finished, cb);\n /*</replacement>*/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n\n var count = 0;\n while (entry) {\n buffer[count] = entry;\n entry = entry.next;\n count += 1;\n }\n\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequestCount = 0;\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction prefinish(stream, state) {\n if (!state.prefinished) {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n if (state.pendingcb === 0) {\n prefinish(stream, state);\n state.finished = true;\n stream.emit('finish');\n } else {\n prefinish(stream, state);\n }\n }\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n\n this.finish = function (err) {\n var entry = _this.entry;\n _this.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n if (state.corkedRequestsFree) {\n state.corkedRequestsFree.next = _this;\n } else {\n state.corkedRequestsFree = _this;\n }\n };\n}\n","\nimport {inherits} from 'util';\nimport {nextTick} from 'process';\nimport {Readable} from './readable';\nimport {Writable} from './writable';\n\n\ninherits(Duplex, Readable);\n\nvar keys = Object.keys(Writable.prototype);\nfor (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n}\nexport default Duplex;\nexport function Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n\n Readable.call(this, options);\n Writable.call(this, options);\n\n if (options && options.readable === false) this.readable = false;\n\n if (options && options.writable === false) this.writable = false;\n\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n this.once('end', onend);\n}\n\n// the no-half-open enforcer\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n","// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\nimport {Duplex} from './duplex';\n\n\nimport {inherits} from 'util';\ninherits(Transform, Duplex);\n\nfunction TransformState(stream) {\n this.afterTransform = function (er, data) {\n return afterTransform(stream, er, data);\n };\n\n this.needTransform = false;\n this.transforming = false;\n this.writecb = null;\n this.writechunk = null;\n this.writeencoding = null;\n}\n\nfunction afterTransform(stream, er, data) {\n var ts = stream._transformState;\n ts.transforming = false;\n\n var cb = ts.writecb;\n\n if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));\n\n ts.writechunk = null;\n ts.writecb = null;\n\n if (data !== null && data !== undefined) stream.push(data);\n\n cb(er);\n\n var rs = stream._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n stream._read(rs.highWaterMark);\n }\n}\nexport default Transform;\nexport function Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n\n Duplex.call(this, options);\n\n this._transformState = new TransformState(this);\n\n // when the writable side finishes, then flush out anything remaining.\n var stream = this;\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n this.once('prefinish', function () {\n if (typeof this._flush === 'function') this._flush(function (er) {\n done(stream, er);\n });else done(stream);\n });\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('Not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nfunction done(stream, er) {\n if (er) return stream.emit('error', er);\n\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n var ws = stream._writableState;\n var ts = stream._transformState;\n\n if (ws.length) throw new Error('Calling transform done when ws.length != 0');\n\n if (ts.transforming) throw new Error('Calling transform done when still transforming');\n\n return stream.push(null);\n}\n","\nimport {Transform} from './transform';\n\nimport {inherits} from 'util';\ninherits(PassThrough, Transform);\nexport default PassThrough;\nexport function PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};\n","import EE from 'events';\nimport {inherits} from 'util';\n\nimport {Duplex} from './readable-stream/duplex.js';\nimport {Readable} from './readable-stream/readable.js';\nimport {Writable} from './readable-stream/writable.js';\nimport {Transform} from './readable-stream/transform.js';\nimport {PassThrough} from './readable-stream/passthrough.js';\ninherits(Stream, EE);\nStream.Readable = Readable;\nStream.Writable = Writable;\nStream.Duplex = Duplex;\nStream.Transform = Transform;\nStream.PassThrough = PassThrough;\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\nexport default Stream;\nexport {Readable,Writable,Duplex,Transform,PassThrough,Stream}\n\n// old-style streams. Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n var source = this;\n\n function ondata(chunk) {\n if (dest.writable) {\n if (false === dest.write(chunk) && source.pause) {\n source.pause();\n }\n }\n }\n\n source.on('data', ondata);\n\n function ondrain() {\n if (source.readable && source.resume) {\n source.resume();\n }\n }\n\n dest.on('drain', ondrain);\n\n // If the 'end' option is not supplied, dest.end() will be called when\n // source gets the 'end' or 'close' events. Only dest.end() once.\n if (!dest._isStdio && (!options || options.end !== false)) {\n source.on('end', onend);\n source.on('close', onclose);\n }\n\n var didOnEnd = false;\n function onend() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n dest.end();\n }\n\n\n function onclose() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n if (typeof dest.destroy === 'function') dest.destroy();\n }\n\n // don't leave dangling pipes when there are errors.\n function onerror(er) {\n cleanup();\n if (EE.listenerCount(this, 'error') === 0) {\n throw er; // Unhandled stream error in pipe.\n }\n }\n\n source.on('error', onerror);\n dest.on('error', onerror);\n\n // remove all the event listeners that were added.\n function cleanup() {\n source.removeListener('data', ondata);\n dest.removeListener('drain', ondrain);\n\n source.removeListener('end', onend);\n source.removeListener('close', onclose);\n\n source.removeListener('error', onerror);\n dest.removeListener('error', onerror);\n\n source.removeListener('end', cleanup);\n source.removeListener('close', cleanup);\n\n dest.removeListener('close', cleanup);\n }\n\n source.on('end', cleanup);\n source.on('close', cleanup);\n\n dest.on('close', cleanup);\n\n dest.emit('pipe', source);\n\n // Allow for unix-like usage: A.pipe(B).pipe(C)\n return dest;\n};\n","var inverseXML = getInverseObj(require(\"../maps/xml.json\")),\n xmlReplacer = getInverseReplacer(inverseXML);\n\nexports.XML = getInverse(inverseXML, xmlReplacer);\n\nvar inverseHTML = getInverseObj(require(\"../maps/entities.json\")),\n htmlReplacer = getInverseReplacer(inverseHTML);\n\nexports.HTML = getInverse(inverseHTML, htmlReplacer);\n\nfunction getInverseObj(obj){\n\treturn Object.keys(obj).sort().reduce(function(inverse, name){\n\t\tinverse[obj[name]] = \"&\" + name + \";\";\n\t\treturn inverse;\n\t}, {});\n}\n\nfunction getInverseReplacer(inverse){\n\tvar single = [],\n\t multiple = [];\n\n\tObject.keys(inverse).forEach(function(k){\n\t\tif(k.length === 1){\n\t\t\tsingle.push(\"\\\\\" + k);\n\t\t} else {\n\t\t\tmultiple.push(k);\n\t\t}\n\t});\n\n\t//TODO add ranges\n\tmultiple.unshift(\"[\" + single.join(\"\") + \"]\");\n\n\treturn new RegExp(multiple.join(\"|\"), \"g\");\n}\n\nvar re_nonASCII = /[^\\0-\\x7F]/g,\n re_astralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\nfunction singleCharReplacer(c){\n\treturn \"&#x\" + c.charCodeAt(0).toString(16).toUpperCase() + \";\";\n}\n\nfunction astralReplacer(c){\n\t// http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\tvar high = c.charCodeAt(0);\n\tvar low = c.charCodeAt(1);\n\tvar codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;\n\treturn \"&#x\" + codePoint.toString(16).toUpperCase() + \";\";\n}\n\nfunction getInverse(inverse, re){\n\tfunction func(name){\n\t\treturn inverse[name];\n\t}\n\n\treturn function(data){\n\t\treturn data\n\t\t\t\t.replace(re, func)\n\t\t\t\t.replace(re_astralSymbols, astralReplacer)\n\t\t\t\t.replace(re_nonASCII, singleCharReplacer);\n\t};\n}\n\nvar re_xmlChars = getInverseReplacer(inverseXML);\n\nfunction escapeXML(data){\n\treturn data\n\t\t\t.replace(re_xmlChars, singleCharReplacer)\n\t\t\t.replace(re_astralSymbols, astralReplacer)\n\t\t\t.replace(re_nonASCII, singleCharReplacer);\n}\n\nexports.escape = escapeXML;\n","var entityMap = require(\"../maps/entities.json\"),\n legacyMap = require(\"../maps/legacy.json\"),\n xmlMap = require(\"../maps/xml.json\"),\n decodeCodePoint = require(\"./decode_codepoint.js\");\n\nvar decodeXMLStrict = getStrictDecoder(xmlMap),\n decodeHTMLStrict = getStrictDecoder(entityMap);\n\nfunction getStrictDecoder(map){\n\tvar keys = Object.keys(map).join(\"|\"),\n\t replace = getReplacer(map);\n\n\tkeys += \"|#[xX][\\\\da-fA-F]+|#\\\\d+\";\n\n\tvar re = new RegExp(\"&(?:\" + keys + \");\", \"g\");\n\n\treturn function(str){\n\t\treturn String(str).replace(re, replace);\n\t};\n}\n\nvar decodeHTML = (function(){\n\tvar legacy = Object.keys(legacyMap)\n\t\t.sort(sorter);\n\n\tvar keys = Object.keys(entityMap)\n\t\t.sort(sorter);\n\n\tfor(var i = 0, j = 0; i < keys.length; i++){\n\t\tif(legacy[j] === keys[i]){\n\t\t\tkeys[i] += \";?\";\n\t\t\tj++;\n\t\t} else {\n\t\t\tkeys[i] += \";\";\n\t\t}\n\t}\n\n\tvar re = new RegExp(\"&(?:\" + keys.join(\"|\") + \"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\", \"g\"),\n\t replace = getReplacer(entityMap);\n\n\tfunction replacer(str){\n\t\tif(str.substr(-1) !== \";\") str += \";\";\n\t\treturn replace(str);\n\t}\n\n\t//TODO consider creating a merged map\n\treturn function(str){\n\t\treturn String(str).replace(re, replacer);\n\t};\n}());\n\nfunction sorter(a, b){\n\treturn a < b ? 1 : -1;\n}\n\nfunction getReplacer(map){\n\treturn function replace(str){\n\t\tif(str.charAt(1) === \"#\"){\n\t\t\tif(str.charAt(2) === \"X\" || str.charAt(2) === \"x\"){\n\t\t\t\treturn decodeCodePoint(parseInt(str.substr(3), 16));\n\t\t\t}\n\t\t\treturn decodeCodePoint(parseInt(str.substr(2), 10));\n\t\t}\n\t\treturn map[str.slice(1, -1)];\n\t};\n}\n\nmodule.exports = {\n\tXML: decodeXMLStrict,\n\tHTML: decodeHTML,\n\tHTMLStrict: decodeHTMLStrict\n};","var ElementType = require(\"domelementtype\"),\n getOuterHTML = require(\"dom-serializer\"),\n isTag = ElementType.isTag;\n\nmodule.exports = {\n\tgetInnerHTML: getInnerHTML,\n\tgetOuterHTML: getOuterHTML,\n\tgetText: getText\n};\n\nfunction getInnerHTML(elem, opts){\n\treturn elem.children ? elem.children.map(function(elem){\n\t\treturn getOuterHTML(elem, opts);\n\t}).join(\"\") : \"\";\n}\n\nfunction getText(elem){\n\tif(Array.isArray(elem)) return elem.map(getText).join(\"\");\n\tif(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children);\n\tif(elem.type === ElementType.Text) return elem.data;\n\treturn \"\";\n}\n","var isTag = require(\"domelementtype\").isTag;\n\nmodule.exports = {\n\tfilter: filter,\n\tfind: find,\n\tfindOneChild: findOneChild,\n\tfindOne: findOne,\n\texistsOne: existsOne,\n\tfindAll: findAll\n};\n\nfunction filter(test, element, recurse, limit){\n\tif(!Array.isArray(element)) element = [element];\n\n\tif(typeof limit !== \"number\" || !isFinite(limit)){\n\t\tlimit = Infinity;\n\t}\n\treturn find(test, element, recurse !== false, limit);\n}\n\nfunction find(test, elems, recurse, limit){\n\tvar result = [], childs;\n\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(test(elems[i])){\n\t\t\tresult.push(elems[i]);\n\t\t\tif(--limit <= 0) break;\n\t\t}\n\n\t\tchilds = elems[i].children;\n\t\tif(recurse && childs && childs.length > 0){\n\t\t\tchilds = find(test, childs, recurse, limit);\n\t\t\tresult = result.concat(childs);\n\t\t\tlimit -= childs.length;\n\t\t\tif(limit <= 0) break;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction findOneChild(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(test(elems[i])) return elems[i];\n\t}\n\n\treturn null;\n}\n\nfunction findOne(test, elems){\n\tvar elem = null;\n\n\tfor(var i = 0, l = elems.length; i < l && !elem; i++){\n\t\tif(!isTag(elems[i])){\n\t\t\tcontinue;\n\t\t} else if(test(elems[i])){\n\t\t\telem = elems[i];\n\t\t} else if(elems[i].children.length > 0){\n\t\t\telem = findOne(test, elems[i].children);\n\t\t}\n\t}\n\n\treturn elem;\n}\n\nfunction existsOne(test, elems){\n\tfor(var i = 0, l = elems.length; i < l; i++){\n\t\tif(\n\t\t\tisTag(elems[i]) && (\n\t\t\t\ttest(elems[i]) || (\n\t\t\t\t\telems[i].children.length > 0 &&\n\t\t\t\t\texistsOne(test, elems[i].children)\n\t\t\t\t)\n\t\t\t)\n\t\t){\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction findAll(test, elems){\n\tvar result = [];\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(!isTag(elems[i])) continue;\n\t\tif(test(elems[i])) result.push(elems[i]);\n\n\t\tif(elems[i].children.length > 0){\n\t\t\tresult = result.concat(findAll(test, elems[i].children));\n\t\t}\n\t}\n\treturn result;\n}\n","\"use strict\";\n\nmodule.exports = parse;\n\nvar re_name = /^(?:\\\\.|[\\w\\-\\u00c0-\\uFFFF])+/,\n re_escape = /\\\\([\\da-f]{1,6}\\s?|(\\s)|.)/ig,\n //modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87\n re_attr = /^\\s*((?:\\\\.|[\\w\\u00c0-\\uFFFF\\-])+)\\s*(?:(\\S?)=\\s*(?:(['\"])(.*?)\\3|(#?(?:\\\\.|[\\w\\u00c0-\\uFFFF\\-])*)|)|)\\s*(i)?\\]/;\n\nvar actionTypes = {\n\t__proto__: null,\n\t\"undefined\": \"exists\",\n\t\"\": \"equals\",\n\t\"~\": \"element\",\n\t\"^\": \"start\",\n\t\"$\": \"end\",\n\t\"*\": \"any\",\n\t\"!\": \"not\",\n\t\"|\": \"hyphen\"\n};\n\nvar simpleSelectors = {\n\t__proto__: null,\n\t\">\": \"child\",\n\t\"<\": \"parent\",\n\t\"~\": \"sibling\",\n\t\"+\": \"adjacent\"\n};\n\nvar attribSelectors = {\n\t__proto__: null,\n\t\"#\": [\"id\", \"equals\"],\n\t\".\": [\"class\", \"element\"]\n};\n\n//pseudos, whose data-property is parsed as well\nvar unpackPseudos = {\n\t__proto__: null,\n\t\"has\": true,\n\t\"not\": true,\n\t\"matches\": true\n};\n\nvar stripQuotesFromPseudos = {\n\t__proto__: null,\n\t\"contains\": true,\n\t\"icontains\": true\n};\n\nvar quotes = {\n\t__proto__: null,\n\t\"\\\"\": true,\n\t\"'\": true\n};\n\n//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139\nfunction funescape( _, escaped, escapedWhitespace ) {\n\tvar high = \"0x\" + escaped - 0x10000;\n\t// NaN means non-codepoint\n\t// Support: Firefox\n\t// Workaround erroneous numeric interpretation of +\"0x\"\n\treturn high !== high || escapedWhitespace ?\n\t\tescaped :\n\t\t// BMP codepoint\n\t\thigh < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n}\n\nfunction unescapeCSS(str){\n\treturn str.replace(re_escape, funescape);\n}\n\nfunction isWhitespace(c){\n\treturn c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\f\" || c === \"\\r\";\n}\n\nfunction parse(selector, options){\n\tvar subselects = [];\n\n\tselector = parseSelector(subselects, selector + \"\", options);\n\n\tif(selector !== \"\"){\n\t\tthrow new SyntaxError(\"Unmatched selector: \" + selector);\n\t}\n\n\treturn subselects;\n}\n\nfunction parseSelector(subselects, selector, options){\n\tvar tokens = [],\n\t\tsawWS = false,\n\t\tdata, firstChar, name, quot;\n\n\tfunction getName(){\n\t\tvar sub = selector.match(re_name)[0];\n\t\tselector = selector.substr(sub.length);\n\t\treturn unescapeCSS(sub);\n\t}\n\n\tfunction stripWhitespace(start){\n\t\twhile(isWhitespace(selector.charAt(start))) start++;\n\t\tselector = selector.substr(start);\n\t}\n\n\tstripWhitespace(0);\n\n\twhile(selector !== \"\"){\n\t\tfirstChar = selector.charAt(0);\n\n\t\tif(isWhitespace(firstChar)){\n\t\t\tsawWS = true;\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar in simpleSelectors){\n\t\t\ttokens.push({type: simpleSelectors[firstChar]});\n\t\t\tsawWS = false;\n\n\t\t\tstripWhitespace(1);\n\t\t} else if(firstChar === \",\"){\n\t\t\tif(tokens.length === 0){\n\t\t\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t\t\t}\n\t\t\tsubselects.push(tokens);\n\t\t\ttokens = [];\n\t\t\tsawWS = false;\n\t\t\tstripWhitespace(1);\n\t\t} else {\n\t\t\tif(sawWS){\n\t\t\t\tif(tokens.length > 0){\n\t\t\t\t\ttokens.push({type: \"descendant\"});\n\t\t\t\t}\n\t\t\t\tsawWS = false;\n\t\t\t}\n\n\t\t\tif(firstChar === \"*\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({type: \"universal\"});\n\t\t\t} else if(firstChar in attribSelectors){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: attribSelectors[firstChar][0],\n\t\t\t\t\taction: attribSelectors[firstChar][1],\n\t\t\t\t\tvalue: getName(),\n\t\t\t\t\tignoreCase: false\n\t\t\t\t});\n\t\t\t} else if(firstChar === \"[\"){\n\t\t\t\tselector = selector.substr(1);\n\t\t\t\tdata = selector.match(re_attr);\n\t\t\t\tif(!data){\n\t\t\t\t\tthrow new SyntaxError(\"Malformed attribute selector: \" + selector);\n\t\t\t\t}\n\t\t\t\tselector = selector.substr(data[0].length);\n\t\t\t\tname = unescapeCSS(data[1]);\n\n\t\t\t\tif(\n\t\t\t\t\t!options || (\n\t\t\t\t\t\t\"lowerCaseAttributeNames\" in options ?\n\t\t\t\t\t\t\toptions.lowerCaseAttributeNames :\n\t\t\t\t\t\t\t!options.xmlMode\n\t\t\t\t\t)\n\t\t\t\t){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"attribute\",\n\t\t\t\t\tname: name,\n\t\t\t\t\taction: actionTypes[data[2]],\n\t\t\t\t\tvalue: unescapeCSS(data[4] || data[5] || \"\"),\n\t\t\t\t\tignoreCase: !!data[6]\n\t\t\t\t});\n\n\t\t\t} else if(firstChar === \":\"){\n\t\t\t\tif(selector.charAt(1) === \":\"){\n\t\t\t\t\tselector = selector.substr(2);\n\t\t\t\t\ttokens.push({type: \"pseudo-element\", name: getName().toLowerCase()});\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.substr(1);\n\n\t\t\t\tname = getName().toLowerCase();\n\t\t\t\tdata = null;\n\n\t\t\t\tif(selector.charAt(0) === \"(\"){\n\t\t\t\t\tif(name in unpackPseudos){\n\t\t\t\t\t\tquot = selector.charAt(1);\n\t\t\t\t\t\tvar quoted = quot in quotes;\n\n\t\t\t\t\t\tselector = selector.substr(quoted + 1);\n\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\tselector = parseSelector(data, selector, options);\n\n\t\t\t\t\t\tif(quoted){\n\t\t\t\t\t\t\tif(selector.charAt(0) !== quot){\n\t\t\t\t\t\t\t\tthrow new SyntaxError(\"unmatched quotes in :\" + name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(selector.charAt(0) !== \")\"){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"missing closing parenthesis in :\" + name + \" \" + selector);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselector = selector.substr(1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar pos = 1, counter = 1;\n\n\t\t\t\t\t\tfor(; counter > 0 && pos < selector.length; pos++){\n\t\t\t\t\t\t\tif(selector.charAt(pos) === \"(\") counter++;\n\t\t\t\t\t\t\telse if(selector.charAt(pos) === \")\") counter--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter){\n\t\t\t\t\t\t\tthrow new SyntaxError(\"parenthesis not matched\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = selector.substr(1, pos - 2);\n\t\t\t\t\t\tselector = selector.substr(pos);\n\n\t\t\t\t\t\tif(name in stripQuotesFromPseudos){\n\t\t\t\t\t\t\tquot = data.charAt(0);\n\n\t\t\t\t\t\t\tif(quot === data.slice(-1) && quot in quotes){\n\t\t\t\t\t\t\t\tdata = data.slice(1, -1);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdata = unescapeCSS(data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"pseudo\", name: name, data: data});\n\t\t\t} else if(re_name.test(selector)){\n\t\t\t\tname = getName();\n\n\t\t\t\tif(!options || (\"lowerCaseTags\" in options ? options.lowerCaseTags : !options.xmlMode)){\n\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t}\n\n\t\t\t\ttokens.push({type: \"tag\", name: name});\n\t\t\t} else {\n\t\t\t\tif(tokens.length && tokens[tokens.length - 1].type === \"descendant\"){\n\t\t\t\t\ttokens.pop();\n\t\t\t\t}\n\t\t\t\taddToken(subselects, tokens);\n\t\t\t\treturn selector;\n\t\t\t}\n\t\t}\n\t}\n\n\taddToken(subselects, tokens);\n\n\treturn selector;\n}\n\nfunction addToken(subselects, tokens){\n\tif(subselects.length > 0 && tokens.length === 0){\n\t\tthrow new SyntaxError(\"empty sub-selector\");\n\t}\n\n\tsubselects.push(tokens);\n}\n","module.exports = sortByProcedure;\n\n/*\n\tsort the parts of the passed selector,\n\tas there is potential for optimization\n\t(some types of selectors are faster than others)\n*/\n\nvar procedure = require(\"./procedure.json\");\n\nvar attributes = {\n\t__proto__: null,\n\texists: 10,\n\tequals: 8,\n\tnot: 7,\n\tstart: 6,\n\tend: 6,\n\tany: 5,\n\thyphen: 4,\n\telement: 4\n};\n\nfunction sortByProcedure(arr){\n\tvar procs = arr.map(getProcedure);\n\tfor(var i = 1; i < arr.length; i++){\n\t\tvar procNew = procs[i];\n\n\t\tif(procNew < 0) continue;\n\n\t\tfor(var j = i - 1; j >= 0 && procNew < procs[j]; j--){\n\t\t\tvar token = arr[j + 1];\n\t\t\tarr[j + 1] = arr[j];\n\t\t\tarr[j] = token;\n\t\t\tprocs[j + 1] = procs[j];\n\t\t\tprocs[j] = procNew;\n\t\t}\n\t}\n}\n\nfunction getProcedure(token){\n\tvar proc = procedure[token.type];\n\n\tif(proc === procedure.attribute){\n\t\tproc = attributes[token.action];\n\n\t\tif(proc === attributes.equals && token.name === \"id\"){\n\t\t\t//prefer ID selectors (eg. #ID)\n\t\t\tproc = 9;\n\t\t}\n\n\t\tif(token.ignoreCase){\n\t\t\t//ignoreCase adds some overhead, prefer \"normal\" token\n\t\t\t//this is a binary operation, to ensure it's still an int\n\t\t\tproc >>= 1;\n\t\t}\n\t} else if(proc === procedure.pseudo){\n\t\tif(!token.data){\n\t\t\tproc = 3;\n\t\t} else if(token.name === \"has\" || token.name === \"contains\"){\n\t\t\tproc = 0; //expensive in any case\n\t\t} else if(token.name === \"matches\" || token.name === \"not\"){\n\t\t\tproc = 0;\n\t\t\tfor(var i = 0; i < token.data.length; i++){\n\t\t\t\t//TODO better handling of complex selectors\n\t\t\t\tif(token.data[i].length !== 1) continue;\n\t\t\t\tvar cur = getProcedure(token.data[i][0]);\n\t\t\t\t//avoid executing :has or :contains\n\t\t\t\tif(cur === 0){\n\t\t\t\t\tproc = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(cur > proc) proc = cur;\n\t\t\t}\n\t\t\tif(token.data.length > 1 && proc > 0) proc -= 1;\n\t\t} else {\n\t\t\tproc = 1;\n\t\t}\n\t}\n\treturn proc;\n}\n","/*\n\tpseudo selectors\n\n\t---\n\n\tthey are available in two forms:\n\t* filters called when the selector\n\t is compiled and return a function\n\t that needs to return next()\n\t* pseudos get called on execution\n\t they need to return a boolean\n*/\n\nvar getNCheck = require(\"nth-check\"),\n\tBaseFuncs = require(\"boolbase\"),\n\tattributesFactory = require(\"./attributes.js\"),\n\ttrueFunc = BaseFuncs.trueFunc,\n\tfalseFunc = BaseFuncs.falseFunc;\n\nfunction filtersFactory(adapter){\n\tvar attributes = attributesFactory(adapter),\n\t\tcheckAttrib = attributes.rules.equals;\n\n\t//helper methods\n\tfunction equals(a, b){\n\t\tif(typeof adapter.equals === \"function\") return adapter.equals(a, b);\n\n\t\treturn a === b;\n\t}\n\n\tfunction getAttribFunc(name, value){\n\t\tvar data = {name: name, value: value};\n\t\treturn function attribFunc(next){\n\t\t\treturn checkAttrib(next, data);\n\t\t};\n\t}\n\n\tfunction getChildFunc(next){\n\t\treturn function(elem){\n\t\t\treturn !!adapter.getParent(elem) && next(elem);\n\t\t};\n\t}\n\n\tvar filters = {\n\t\tcontains: function(next, text){\n\t\t\treturn function contains(elem){\n\t\t\t\treturn next(elem) && adapter.getText(elem).indexOf(text) >= 0;\n\t\t\t};\n\t\t},\n\t\ticontains: function(next, text){\n\t\t\tvar itext = text.toLowerCase();\n\t\t\treturn function icontains(elem){\n\t\t\t\treturn next(elem) &&\n\t\t\t\t\tadapter.getText(elem).toLowerCase().indexOf(itext) >= 0;\n\t\t\t};\n\t\t},\n\n\t\t//location specific methods\n\t\t\"nth-child\": function(next, rule){\n\t\t\tvar func = getNCheck(rule);\n\n\t\t\tif(func === falseFunc) return func;\n\t\t\tif(func === trueFunc) return getChildFunc(next);\n\n\t\t\treturn function nthChild(elem){\n\t\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\t\tfor(var i = 0, pos = 0; i < siblings.length; i++){\n\t\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\t\telse pos++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn func(pos) && next(elem);\n\t\t\t};\n\t\t},\n\t\t\"nth-last-child\": function(next, rule){\n\t\t\tvar func = getNCheck(rule);\n\n\t\t\tif(func === falseFunc) return func;\n\t\t\tif(func === trueFunc) return getChildFunc(next);\n\n\t\t\treturn function nthLastChild(elem){\n\t\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\t\telse pos++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn func(pos) && next(elem);\n\t\t\t};\n\t\t},\n\t\t\"nth-of-type\": function(next, rule){\n\t\t\tvar func = getNCheck(rule);\n\n\t\t\tif(func === falseFunc) return func;\n\t\t\tif(func === trueFunc) return getChildFunc(next);\n\n\t\t\treturn function nthOfType(elem){\n\t\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\t\tfor(var pos = 0, i = 0; i < siblings.length; i++){\n\t\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\t\tif(adapter.getName(siblings[i]) === adapter.getName(elem)) pos++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn func(pos) && next(elem);\n\t\t\t};\n\t\t},\n\t\t\"nth-last-of-type\": function(next, rule){\n\t\t\tvar func = getNCheck(rule);\n\n\t\t\tif(func === falseFunc) return func;\n\t\t\tif(func === trueFunc) return getChildFunc(next);\n\n\t\t\treturn function nthLastOfType(elem){\n\t\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\t\tfor(var pos = 0, i = siblings.length - 1; i >= 0; i--){\n\t\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\t\tif(adapter.getName(siblings[i]) === adapter.getName(elem)) pos++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn func(pos) && next(elem);\n\t\t\t};\n\t\t},\n\n\t\t//TODO determine the actual root element\n\t\troot: function(next){\n\t\t\treturn function(elem){\n\t\t\t\treturn !adapter.getParent(elem) && next(elem);\n\t\t\t};\n\t\t},\n\n\t\tscope: function(next, rule, options, context){\n\t\t\tif(!context || context.length === 0){\n\t\t\t\t//equivalent to :root\n\t\t\t\treturn filters.root(next);\n\t\t\t}\n\n\t\t\tif(context.length === 1){\n\t\t\t\t//NOTE: can't be unpacked, as :has uses this for side-effects\n\t\t\t\treturn function(elem){\n\t\t\t\t\treturn equals(context[0], elem) && next(elem);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(elem){\n\t\t\t\treturn context.indexOf(elem) >= 0 && next(elem);\n\t\t\t};\n\t\t},\n\n\t\t//jQuery extensions (others follow as pseudos)\n\t\tcheckbox: getAttribFunc(\"type\", \"checkbox\"),\n\t\tfile: getAttribFunc(\"type\", \"file\"),\n\t\tpassword: getAttribFunc(\"type\", \"password\"),\n\t\tradio: getAttribFunc(\"type\", \"radio\"),\n\t\treset: getAttribFunc(\"type\", \"reset\"),\n\t\timage: getAttribFunc(\"type\", \"image\"),\n\t\tsubmit: getAttribFunc(\"type\", \"submit\")\n\t};\n\treturn filters;\n}\n\nfunction pseudosFactory(adapter){\n\t//helper methods\n\tfunction getFirstElement(elems){\n\t\tfor(var i = 0; elems && i < elems.length; i++){\n\t\t\tif(adapter.isTag(elems[i])) return elems[i];\n\t\t}\n\t}\n\n\t//while filters are precompiled, pseudos get called when they are needed\n\tvar pseudos = {\n\t\tempty: function(elem){\n\t\t\treturn !adapter.getChildren(elem).some(function(elem){\n\t\t\t\treturn adapter.isTag(elem) || elem.type === \"text\";\n\t\t\t});\n\t\t},\n\n\t\t\"first-child\": function(elem){\n\t\t\treturn getFirstElement(adapter.getSiblings(elem)) === elem;\n\t\t},\n\t\t\"last-child\": function(elem){\n\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\tfor(var i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\tif(adapter.isTag(siblings[i])) break;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\t\"first-of-type\": function(elem){\n\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\t\tif(adapter.getName(siblings[i]) === adapter.getName(elem)) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\t\"last-of-type\": function(elem){\n\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\tfor(var i = siblings.length - 1; i >= 0; i--){\n\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) return true;\n\t\t\t\t\tif(adapter.getName(siblings[i]) === adapter.getName(elem)) break;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\t\"only-of-type\": function(elem){\n\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\tfor(var i = 0, j = siblings.length; i < j; i++){\n\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem) continue;\n\t\t\t\t\tif(adapter.getName(siblings[i]) === adapter.getName(elem)) return false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\t\"only-child\": function(elem){\n\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(adapter.isTag(siblings[i]) && siblings[i] !== elem) return false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t//:matches(a, area, link)[href]\n\t\tlink: function(elem){\n\t\t\treturn adapter.hasAttrib(elem, \"href\");\n\t\t},\n\t\tvisited: falseFunc, //seems to be a valid implementation\n\t\t//TODO: :any-link once the name is finalized (as an alias of :link)\n\n\t\t//forms\n\t\t//to consider: :target\n\n\t\t//:matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)\n\t\tselected: function(elem){\n\t\t\tif(adapter.hasAttrib(elem, \"selected\")) return true;\n\t\t\telse if(adapter.getName(elem) !== \"option\") return false;\n\n\t\t\t//the first <option> in a <select> is also selected\n\t\t\tvar parent = adapter.getParent(elem);\n\n\t\t\tif(\n\t\t\t\t!parent ||\n\t\t\t\tadapter.getName(parent) !== \"select\" ||\n\t\t\t\tadapter.hasAttrib(parent, \"multiple\")\n\t\t\t) return false;\n\n\t\t\tvar siblings = adapter.getChildren(parent),\n\t\t\t\tsawElem = false;\n\n\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\tif(siblings[i] === elem){\n\t\t\t\t\t\tsawElem = true;\n\t\t\t\t\t} else if(!sawElem){\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if(adapter.hasAttrib(siblings[i], \"selected\")){\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn sawElem;\n\t\t},\n\t\t//https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements\n\t\t//:matches(\n\t\t// :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],\n\t\t// optgroup[disabled] > option),\n\t\t// fieldset[disabled] * //TODO not child of first <legend>\n\t\t//)\n\t\tdisabled: function(elem){\n\t\t\treturn adapter.hasAttrib(elem, \"disabled\");\n\t\t},\n\t\tenabled: function(elem){\n\t\t\treturn !adapter.hasAttrib(elem, \"disabled\");\n\t\t},\n\t\t//:matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)\n\t\tchecked: function(elem){\n\t\t\treturn adapter.hasAttrib(elem, \"checked\") || pseudos.selected(elem);\n\t\t},\n\t\t//:matches(input, select, textarea)[required]\n\t\trequired: function(elem){\n\t\t\treturn adapter.hasAttrib(elem, \"required\");\n\t\t},\n\t\t//:matches(input, select, textarea):not([required])\n\t\toptional: function(elem){\n\t\t\treturn !adapter.hasAttrib(elem, \"required\");\n\t\t},\n\n\t\t//jQuery extensions\n\n\t\t//:not(:empty)\n\t\tparent: function(elem){\n\t\t\treturn !pseudos.empty(elem);\n\t\t},\n\t\t//:matches(h1, h2, h3, h4, h5, h6)\n\t\theader: function(elem){\n\t\t\tvar name = adapter.getName(elem);\n\t\t\treturn name === \"h1\" ||\n\t\t\t\t\tname === \"h2\" ||\n\t\t\t\t\tname === \"h3\" ||\n\t\t\t\t\tname === \"h4\" ||\n\t\t\t\t\tname === \"h5\" ||\n\t\t\t\t\tname === \"h6\";\n\t\t},\n\n\t\t//:matches(button, input[type=button])\n\t\tbutton: function(elem){\n\t\t\tvar name = adapter.getName(elem);\n\t\t\treturn name === \"button\" ||\n\t\t\t\t\tname === \"input\" &&\n\t\t\t\t\tadapter.getAttributeValue(elem, \"type\") === \"button\";\n\t\t},\n\t\t//:matches(input, textarea, select, button)\n\t\tinput: function(elem){\n\t\t\tvar name = adapter.getName(elem);\n\t\t\treturn name === \"input\" ||\n\t\t\t\t\tname === \"textarea\" ||\n\t\t\t\t\tname === \"select\" ||\n\t\t\t\t\tname === \"button\";\n\t\t},\n\t\t//input:matches(:not([type!='']), [type='text' i])\n\t\ttext: function(elem){\n\t\t\tvar attr;\n\t\t\treturn adapter.getName(elem) === \"input\" && (\n\t\t\t\t!(attr = adapter.getAttributeValue(elem, \"type\")) ||\n\t\t\t\tattr.toLowerCase() === \"text\"\n\t\t\t);\n\t\t}\n\t};\n\n\treturn pseudos;\n}\n\nfunction verifyArgs(func, name, subselect){\n\tif(subselect === null){\n\t\tif(func.length > 1 && name !== \"scope\"){\n\t\t\tthrow new Error(\"pseudo-selector :\" + name + \" requires an argument\");\n\t\t}\n\t} else {\n\t\tif(func.length === 1){\n\t\t\tthrow new Error(\"pseudo-selector :\" + name + \" doesn't have any arguments\");\n\t\t}\n\t}\n}\n\n//FIXME this feels hacky\nvar re_CSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;\n\nfunction factory(adapter){\n\tvar pseudos = pseudosFactory(adapter);\n\tvar filters = filtersFactory(adapter);\n\n\treturn {\n\t\tcompile: function(next, data, options, context){\n\t\t\tvar name = data.name,\n\t\t\t\tsubselect = data.data;\n\n\t\t\tif(options && options.strict && !re_CSS3.test(name)){\n\t\t\t\tthrow new Error(\":\" + name + \" isn't part of CSS3\");\n\t\t\t}\n\n\t\t\tif(typeof filters[name] === \"function\"){\n\t\t\t\tverifyArgs(filters[name], name, subselect);\n\t\t\t\treturn filters[name](next, subselect, options, context);\n\t\t\t} else if(typeof pseudos[name] === \"function\"){\n\t\t\t\tvar func = pseudos[name];\n\t\t\t\tverifyArgs(func, name, subselect);\n\n\t\t\t\tif(next === trueFunc) return func;\n\n\t\t\t\treturn function pseudoArgs(elem){\n\t\t\t\t\treturn func(elem, subselect) && next(elem);\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"unmatched pseudo-class :\" + name);\n\t\t\t}\n\t\t},\n\t\tfilters: filters,\n\t\tpseudos: pseudos\n\t};\n}\n\nmodule.exports = factory;\n","\"use strict\";\n\nmodule.exports = CSSselect;\n\nvar DomUtils = require(\"domutils\"),\n\tfalseFunc = require(\"boolbase\").falseFunc,\n\tcompileFactory = require(\"./lib/compile.js\"),\n\tdefaultCompile = compileFactory(DomUtils);\n\nfunction adapterCompile(adapter){\n\treturn adapter === DomUtils ? defaultCompile : compileFactory(adapter);\n}\n\nfunction getSelectorFunc(searchFunc){\n\treturn function select(query, elems, options){\n\t\toptions = options || {}\n\t\toptions.adapter = options.adapter || DomUtils;\n\t\tvar compile = adapterCompile(options.adapter);\n\n\t\tif(typeof query !== \"function\") query = compile.compileUnsafe(query, options, elems);\n\t\tif(query.shouldTestNextSiblings) elems = appendNextSiblings((options && options.context) || elems, options.adapter);\n\t\tif(!Array.isArray(elems)) elems = options.adapter.getChildren(elems);\n\t\telse elems = options.adapter.removeSubsets(elems);\n\t\treturn searchFunc(query, elems, options);\n\t};\n}\n\nfunction getNextSiblings(elem, adapter){\n\tvar siblings = adapter.getSiblings(elem);\n\tif(!Array.isArray(siblings)) return [];\n\tsiblings = siblings.slice(0);\n\twhile(siblings.shift() !== elem);\n\treturn siblings;\n}\n\nfunction appendNextSiblings(elems, adapter){\n\t// Order matters because jQuery seems to check the children before the siblings\n\tif(!Array.isArray(elems)) elems = [elems];\n\tvar newElems = elems.slice(0);\n\n\tfor(var i = 0, len = elems.length; i < len; i++){\n\t\tvar nextSiblings = getNextSiblings(newElems[i], adapter);\n\t\tnewElems.push.apply(newElems, nextSiblings);\n\t}\n\treturn newElems;\n}\n\nvar selectAll = getSelectorFunc(function selectAll(query, elems, options){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? [] : options.adapter.findAll(query, elems);\n});\n\nvar selectOne = getSelectorFunc(function selectOne(query, elems, options){\n\treturn (query === falseFunc || !elems || elems.length === 0) ? null : options.adapter.findOne(query, elems);\n});\n\nfunction is(elem, query, options){\n\toptions = options || {}\n\toptions.adapter = options.adapter || DomUtils;\n\tvar compile = adapterCompile(options.adapter);\n\treturn (typeof query === \"function\" ? query : compile(query, options))(elem);\n}\n\n/*\n\tthe exported interface\n*/\nfunction CSSselect(query, elems, options){\n\treturn selectAll(query, elems, options);\n}\n\nCSSselect.compile = defaultCompile;\nCSSselect.filters = defaultCompile.Pseudos.filters;\nCSSselect.pseudos = defaultCompile.Pseudos.pseudos;\n\nCSSselect.selectAll = selectAll;\nCSSselect.selectOne = selectOne;\n\nCSSselect.is = is;\n\n//legacy methods (might be removed)\nCSSselect.parse = defaultCompile;\nCSSselect.iterate = selectAll;\n\n//hooks\nCSSselect._compileUnsafe = defaultCompile.compileUnsafe;\nCSSselect._compileToken = defaultCompile.compileToken;\n","'use strict'\n\nmodule.exports = adapterFactory;\n\nfunction adapterFactory(implementation){\n\tensureImplementation(implementation);\n\n\tvar adapter = {}\n\n\tvar baseAdapter = {\n\t\tremoveSubsets: function (nodes){\n\t\t\treturn removeSubsets(adapter, nodes);\n\t\t},\n\t\texistsOne: function(test, elems){\n\t\t\treturn existsOne(adapter, test, elems);\n\t\t},\n\t\tgetSiblings: function(elem){\n\t\t\treturn getSiblings(adapter, elem);\n\t\t},\n\t\thasAttrib: function(elem, name){\n\t\t\treturn hasAttrib(adapter, elem, name);\n\t\t},\n\t\tfindOne: function(test, arr){\n\t\t\treturn findOne(adapter, test, arr);\n\t\t},\n\t\tfindAll: function(test, elems){\n\t\t\treturn findAll(adapter, test, elems)\n\t\t}\n\t};\n\n\tObject.assign(adapter, baseAdapter, implementation);\n\n\treturn adapter;\n}\n\nvar expectImplemented = [\n\t\"isTag\", \"getAttributeValue\", \"getChildren\", \"getName\", \"getParent\",\n\t\"getText\"\n];\n\nfunction ensureImplementation(implementation){\n\tif(!implementation)\tthrow new TypeError(\"Expected implementation\")\n\n\tvar notImplemented = expectImplemented.filter(function(fname){\n\t\treturn typeof implementation[fname] !== \"function\";\n\t});\n\n\tif(notImplemented.length){\n\t\tvar notList = \"(\" + notImplemented.join(\", \") + \")\";\n\t\tvar message = \"Expected functions \" + notList + \" to be implemented\";\n\t\tthrow new Error(message);\n\t}\n}\n\nfunction removeSubsets(adapter, nodes){\n\tvar idx = nodes.length, node, ancestor, replace;\n\n\t// Check if each node (or one of its ancestors) is already contained in the\n\t// array.\n\twhile(--idx > -1){\n\t\tnode = ancestor = nodes[idx];\n\n\t\t// Temporarily remove the node under consideration\n\t\tnodes[idx] = null;\n\t\treplace = true;\n\n\t\twhile(ancestor){\n\t\t\tif(nodes.indexOf(ancestor) > -1){\n\t\t\t\treplace = false;\n\t\t\t\tnodes.splice(idx, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tancestor = adapter.getParent(ancestor)\n\t\t}\n\n\t\t// If the node has been found to be unique, re-insert it.\n\t\tif(replace){\n\t\t\tnodes[idx] = node;\n\t\t}\n\t}\n\n\treturn nodes;\n}\n\nfunction existsOne(adapter, test, elems){\n\treturn elems.some(function(elem){\n\t\treturn adapter.isTag(elem) ?\n\t\t\ttest(elem) || adapter.existsOne(test, adapter.getChildren(elem)) :\n\t\t\tfalse;\n\t});\n}\n\nfunction getSiblings(adapter, elem){\n\tvar parent = adapter.getParent(elem);\n\treturn parent && adapter.getChildren(parent);\n}\n\n\nfunction hasAttrib(adapter, elem, name){\n\treturn adapter.getAttributeValue(elem,name) !== undefined\n}\n\nfunction findOne(adapter, test, arr){\n\tvar elem = null;\n\n\tfor(var i = 0, l = arr.length; i < l && !elem; i++){\n\t\tif(test(arr[i])){\n\t\t\telem = arr[i];\n\t\t} else {\n\t\t\tvar childs = adapter.getChildren(arr[i]);\n\t\t\tif(childs && childs.length > 0){\n\t\t\t\telem = adapter.findOne(test, childs);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn elem;\n}\n\nfunction findAll(adapter, test, elems){\n\tvar result = [];\n\n\tfor(var i = 0, j = elems.length; i < j; i++){\n\t\tif(!adapter.isTag(elems[i])) continue;\n\t\tif(test(elems[i])) result.push(elems[i]);\n\t\tvar childs = adapter.getChildren(elems[i]);\n\t\tif(childs) result = result.concat(adapter.findAll(test, childs));\n\t}\n\n\treturn result;\n}\n","'use strict';\n\n//\n// item item item item\n// /------\\ /------\\ /------\\ /------\\\n// | data | | data | | data | | data |\n// null <--+-prev |<---+-prev |<---+-prev |<---+-prev |\n// | next-+--->| next-+--->| next-+--->| next-+--> null\n// \\------/ \\------/ \\------/ \\------/\n// ^ ^\n// | list |\n// | /------\\ |\n// \\--------------+-head | |\n// | tail-+--------------/\n// \\------/\n//\n\nfunction createItem(data) {\n return {\n prev: null,\n next: null,\n data: data\n };\n}\n\nvar cursors = null;\nvar List = function() {\n this.cursor = null;\n this.head = null;\n this.tail = null;\n};\n\nList.createItem = createItem;\nList.prototype.createItem = createItem;\n\nList.prototype.getSize = function() {\n var size = 0;\n var cursor = this.head;\n\n while (cursor) {\n size++;\n cursor = cursor.next;\n }\n\n return size;\n};\n\nList.prototype.fromArray = function(array) {\n var cursor = null;\n\n this.head = null;\n\n for (var i = 0; i < array.length; i++) {\n var item = createItem(array[i]);\n\n if (cursor !== null) {\n cursor.next = item;\n } else {\n this.head = item;\n }\n\n item.prev = cursor;\n cursor = item;\n }\n\n this.tail = cursor;\n\n return this;\n};\n\nList.prototype.toArray = function() {\n var cursor = this.head;\n var result = [];\n\n while (cursor) {\n result.push(cursor.data);\n cursor = cursor.next;\n }\n\n return result;\n};\n\nList.prototype.toJSON = List.prototype.toArray;\n\nList.prototype.isEmpty = function() {\n return this.head === null;\n};\n\nList.prototype.first = function() {\n return this.head && this.head.data;\n};\n\nList.prototype.last = function() {\n return this.tail && this.tail.data;\n};\n\nfunction allocateCursor(node, prev, next) {\n var cursor;\n\n if (cursors !== null) {\n cursor = cursors;\n cursors = cursors.cursor;\n cursor.prev = prev;\n cursor.next = next;\n cursor.cursor = node.cursor;\n } else {\n cursor = {\n prev: prev,\n next: next,\n cursor: node.cursor\n };\n }\n\n node.cursor = cursor;\n\n return cursor;\n}\n\nfunction releaseCursor(node) {\n var cursor = node.cursor;\n\n node.cursor = cursor.cursor;\n cursor.prev = null;\n cursor.next = null;\n cursor.cursor = cursors;\n cursors = cursor;\n}\n\nList.prototype.each = function(fn, context) {\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, null, this.head);\n\n while (cursor.next !== null) {\n item = cursor.next;\n cursor.next = item.next;\n\n fn.call(context, item.data, item, this);\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.eachRight = function(fn, context) {\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, this.tail, null);\n\n while (cursor.prev !== null) {\n item = cursor.prev;\n cursor.prev = item.prev;\n\n fn.call(context, item.data, item, this);\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.nextUntil = function(start, fn, context) {\n if (start === null) {\n return;\n }\n\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, null, start);\n\n while (cursor.next !== null) {\n item = cursor.next;\n cursor.next = item.next;\n\n if (fn.call(context, item.data, item, this)) {\n break;\n }\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.prevUntil = function(start, fn, context) {\n if (start === null) {\n return;\n }\n\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, start, null);\n\n while (cursor.prev !== null) {\n item = cursor.prev;\n cursor.prev = item.prev;\n\n if (fn.call(context, item.data, item, this)) {\n break;\n }\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.some = function(fn, context) {\n var cursor = this.head;\n\n if (context === undefined) {\n context = this;\n }\n\n while (cursor !== null) {\n if (fn.call(context, cursor.data, cursor, this)) {\n return true;\n }\n\n cursor = cursor.next;\n }\n\n return false;\n};\n\nList.prototype.map = function(fn, context) {\n var result = [];\n var cursor = this.head;\n\n if (context === undefined) {\n context = this;\n }\n\n while (cursor !== null) {\n result.push(fn.call(context, cursor.data, cursor, this));\n cursor = cursor.next;\n }\n\n return result;\n};\n\nList.prototype.clear = function() {\n this.head = null;\n this.tail = null;\n};\n\nList.prototype.copy = function() {\n var result = new List();\n var cursor = this.head;\n\n while (cursor !== null) {\n result.insert(createItem(cursor.data));\n cursor = cursor.next;\n }\n\n return result;\n};\n\nList.prototype.updateCursors = function(prevOld, prevNew, nextOld, nextNew) {\n var cursor = this.cursor;\n\n while (cursor !== null) {\n if (cursor.prev === prevOld) {\n cursor.prev = prevNew;\n }\n\n if (cursor.next === nextOld) {\n cursor.next = nextNew;\n }\n\n cursor = cursor.cursor;\n }\n};\n\nList.prototype.prepend = function(item) {\n // head\n // ^\n // item\n this.updateCursors(null, item, this.head, item);\n\n // insert to the beginning of the list\n if (this.head !== null) {\n // new item <- first item\n this.head.prev = item;\n\n // new item -> first item\n item.next = this.head;\n } else {\n // if list has no head, then it also has no tail\n // in this case tail points to the new item\n this.tail = item;\n }\n\n // head always points to new item\n this.head = item;\n\n return this;\n};\n\nList.prototype.prependData = function(data) {\n return this.prepend(createItem(data));\n};\n\nList.prototype.append = function(item) {\n // tail\n // ^\n // item\n this.updateCursors(this.tail, item, null, item);\n\n // insert to the ending of the list\n if (this.tail !== null) {\n // last item -> new item\n this.tail.next = item;\n\n // last item <- new item\n item.prev = this.tail;\n } else {\n // if list has no tail, then it also has no head\n // in this case head points to new item\n this.head = item;\n }\n\n // tail always points to new item\n this.tail = item;\n\n return this;\n};\n\nList.prototype.appendData = function(data) {\n return this.append(createItem(data));\n};\n\nList.prototype.insert = function(item, before) {\n if (before !== undefined && before !== null) {\n // prev before\n // ^\n // item\n this.updateCursors(before.prev, item, before, item);\n\n if (before.prev === null) {\n // insert to the beginning of list\n if (this.head !== before) {\n throw new Error('before doesn\\'t belong to list');\n }\n\n // since head points to before therefore list doesn't empty\n // no need to check tail\n this.head = item;\n before.prev = item;\n item.next = before;\n\n this.updateCursors(null, item);\n } else {\n\n // insert between two items\n before.prev.next = item;\n item.prev = before.prev;\n\n before.prev = item;\n item.next = before;\n }\n } else {\n this.append(item);\n }\n};\n\nList.prototype.insertData = function(data, before) {\n this.insert(createItem(data), before);\n};\n\nList.prototype.remove = function(item) {\n // item\n // ^\n // prev next\n this.updateCursors(item, item.prev, item, item.next);\n\n if (item.prev !== null) {\n item.prev.next = item.next;\n } else {\n if (this.head !== item) {\n throw new Error('item doesn\\'t belong to list');\n }\n\n this.head = item.next;\n }\n\n if (item.next !== null) {\n item.next.prev = item.prev;\n } else {\n if (this.tail !== item) {\n throw new Error('item doesn\\'t belong to list');\n }\n\n this.tail = item.prev;\n }\n\n item.prev = null;\n item.next = null;\n\n return item;\n};\n\nList.prototype.appendList = function(list) {\n // ignore empty lists\n if (list.head === null) {\n return;\n }\n\n this.updateCursors(this.tail, list.tail, null, list.head);\n\n // insert to end of the list\n if (this.tail !== null) {\n // if destination list has a tail, then it also has a head,\n // but head doesn't change\n\n // dest tail -> source head\n this.tail.next = list.head;\n\n // dest tail <- source head\n list.head.prev = this.tail;\n } else {\n // if list has no a tail, then it also has no a head\n // in this case points head to new item\n this.head = list.head;\n }\n\n // tail always start point to new item\n this.tail = list.tail;\n\n list.head = null;\n list.tail = null;\n};\n\nList.prototype.insertList = function(list, before) {\n if (before !== undefined && before !== null) {\n // ignore empty lists\n if (list.head === null) {\n return;\n }\n\n this.updateCursors(before.prev, list.tail, before, list.head);\n\n // insert in the middle of dist list\n if (before.prev !== null) {\n // before.prev <-> list.head\n before.prev.next = list.head;\n list.head.prev = before.prev;\n } else {\n this.head = list.head;\n }\n\n before.prev = list.tail;\n list.tail.next = before;\n\n list.head = null;\n list.tail = null;\n } else {\n this.appendList(list);\n }\n};\n\nList.prototype.replace = function(oldItem, newItemOrList) {\n if ('head' in newItemOrList) {\n this.insertList(newItemOrList, oldItem);\n } else {\n this.insert(newItemOrList, oldItem);\n }\n this.remove(oldItem);\n};\n\nmodule.exports = List;\n","'use strict';\n\nvar createCustomError = require('../utils/createCustomError');\nvar MAX_LINE_LENGTH = 100;\nvar OFFSET_CORRECTION = 60;\nvar TAB_REPLACEMENT = ' ';\n\nfunction sourceFragment(error, extraLines) {\n function processLines(start, end) {\n return lines.slice(start, end).map(function(line, idx) {\n var num = String(start + idx + 1);\n\n while (num.length < maxNumLength) {\n num = ' ' + num;\n }\n\n return num + ' |' + line;\n }).join('\\n');\n }\n\n var lines = error.source.split(/\\r\\n?|\\n|\\f/);\n var line = error.line;\n var column = error.column;\n var startLine = Math.max(1, line - extraLines) - 1;\n var endLine = Math.min(line + extraLines, lines.length + 1);\n var maxNumLength = Math.max(4, String(endLine).length) + 1;\n var cutLeft = 0;\n\n // column correction according to replaced tab before column\n column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\\t/g) || []).length;\n\n if (column > MAX_LINE_LENGTH) {\n cutLeft = column - OFFSET_CORRECTION + 3;\n column = OFFSET_CORRECTION - 2;\n }\n\n for (var i = startLine; i <= endLine; i++) {\n if (i >= 0 && i < lines.length) {\n lines[i] = lines[i].replace(/\\t/g, TAB_REPLACEMENT);\n lines[i] =\n (cutLeft > 0 && lines[i].length > cutLeft ? '\\u2026' : '') +\n lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) +\n (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\\u2026' : '');\n }\n }\n\n return [\n processLines(startLine, line),\n new Array(column + maxNumLength + 2).join('-') + '^',\n processLines(line, endLine)\n ].filter(Boolean).join('\\n');\n}\n\nvar CssSyntaxError = function(message, source, offset, line, column) {\n var error = createCustomError('CssSyntaxError', message);\n\n error.source = source;\n error.offset = offset;\n error.line = line;\n error.column = column;\n\n error.sourceFragment = function(extraLines) {\n return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines);\n };\n Object.defineProperty(error, 'formattedMessage', {\n get: function() {\n return (\n 'Parse error: ' + error.message + '\\n' +\n sourceFragment(error, 2)\n );\n }\n });\n\n // for backward capability\n error.parseError = {\n offset: offset,\n line: line,\n column: column\n };\n\n return error;\n};\n\nmodule.exports = CssSyntaxError;\n","'use strict';\n\nvar constants = require('./const');\nvar PUNCTUATION = constants.PUNCTUATION;\nvar STOP_URL_RAW = constants.STOP_URL_RAW;\nvar TYPE = constants.TYPE;\nvar FULLSTOP = TYPE.FullStop;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar PUNCTUATOR = TYPE.Punctuator;\nvar TAB = 9;\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar SPACE = 32;\nvar BACK_SLASH = 92;\nvar E = 101; // 'e'.charCodeAt(0)\n\nfunction firstCharOffset(source) {\n // detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark)\n if (source.charCodeAt(0) === 0xFEFF || // UTF-16BE\n source.charCodeAt(0) === 0xFFFE) { // UTF-16LE\n return 1;\n }\n\n return 0;\n}\n\nfunction isHex(code) {\n return (code >= 48 && code <= 57) || // 0 .. 9\n (code >= 65 && code <= 70) || // A .. F\n (code >= 97 && code <= 102); // a .. f\n}\n\nfunction isNumber(code) {\n return code >= 48 && code <= 57;\n}\n\nfunction isNewline(source, offset, code) {\n if (code === N || code === F || code === R) {\n if (code === R && offset + 1 < source.length && source.charCodeAt(offset + 1) === N) {\n return 2;\n }\n\n return 1;\n }\n\n return 0;\n}\n\nfunction cmpChar(testStr, offset, referenceCode) {\n var code = testStr.charCodeAt(offset);\n\n // code.toLowerCase()\n if (code >= 65 && code <= 90) {\n code = code | 32;\n }\n\n return code === referenceCode;\n}\n\nfunction cmpStr(testStr, start, end, referenceStr) {\n if (end - start !== referenceStr.length) {\n return false;\n }\n\n if (start < 0 || end > testStr.length) {\n return false;\n }\n\n for (var i = start; i < end; i++) {\n var testCode = testStr.charCodeAt(i);\n var refCode = referenceStr.charCodeAt(i - start);\n\n // testStr[i].toLowerCase()\n if (testCode >= 65 && testCode <= 90) {\n testCode = testCode | 32;\n }\n\n if (testCode !== refCode) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction endsWith(testStr, referenceStr) {\n return cmpStr(testStr, testStr.length - referenceStr.length, testStr.length, referenceStr);\n}\n\nfunction findLastNonSpaceLocation(scanner) {\n for (var i = scanner.source.length - 1; i >= 0; i--) {\n var code = scanner.source.charCodeAt(i);\n\n if (code !== SPACE && code !== TAB && code !== R && code !== N && code !== F) {\n break;\n }\n }\n\n return scanner.getLocation(i + 1);\n}\n\nfunction findWhiteSpaceEnd(source, offset) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n if (code !== SPACE && code !== TAB && code !== R && code !== N && code !== F) {\n break;\n }\n }\n\n return offset;\n}\n\nfunction findCommentEnd(source, offset) {\n var commentEnd = source.indexOf('*/', offset);\n\n if (commentEnd === -1) {\n return source.length;\n }\n\n return commentEnd + 2;\n}\n\nfunction findStringEnd(source, offset, quote) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n // TODO: bad string\n if (code === BACK_SLASH) {\n offset++;\n } else if (code === quote) {\n offset++;\n break;\n }\n }\n\n return offset;\n}\n\nfunction findDecimalNumberEnd(source, offset) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n if (code < 48 || code > 57) { // not a 0 .. 9\n break;\n }\n }\n\n return offset;\n}\n\nfunction findNumberEnd(source, offset, allowFraction) {\n var code;\n\n offset = findDecimalNumberEnd(source, offset);\n\n // fraction: .\\d+\n if (allowFraction && offset + 1 < source.length && source.charCodeAt(offset) === FULLSTOP) {\n code = source.charCodeAt(offset + 1);\n\n if (isNumber(code)) {\n offset = findDecimalNumberEnd(source, offset + 1);\n }\n }\n\n // exponent: e[+-]\\d+\n if (offset + 1 < source.length) {\n if ((source.charCodeAt(offset) | 32) === E) { // case insensitive check for `e`\n code = source.charCodeAt(offset + 1);\n\n if (code === PLUSSIGN || code === HYPHENMINUS) {\n if (offset + 2 < source.length) {\n code = source.charCodeAt(offset + 2);\n }\n }\n\n if (isNumber(code)) {\n offset = findDecimalNumberEnd(source, offset + 2);\n }\n }\n }\n\n return offset;\n}\n\n// skip escaped unicode sequence that can ends with space\n// [0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?\nfunction findEscaseEnd(source, offset) {\n for (var i = 0; i < 7 && offset + i < source.length; i++) {\n var code = source.charCodeAt(offset + i);\n\n if (i !== 6 && isHex(code)) {\n continue;\n }\n\n if (i > 0) {\n offset += i - 1 + isNewline(source, offset + i, code);\n if (code === SPACE || code === TAB) {\n offset++;\n }\n }\n\n break;\n }\n\n return offset;\n}\n\nfunction findIdentifierEnd(source, offset) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n if (code === BACK_SLASH) {\n offset = findEscaseEnd(source, offset + 1);\n } else if (code < 0x80 && PUNCTUATION[code] === PUNCTUATOR) {\n break;\n }\n }\n\n return offset;\n}\n\nfunction findUrlRawEnd(source, offset) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n if (code === BACK_SLASH) {\n offset = findEscaseEnd(source, offset + 1);\n } else if (code < 0x80 && STOP_URL_RAW[code] === 1) {\n break;\n }\n }\n\n return offset;\n}\n\nmodule.exports = {\n firstCharOffset: firstCharOffset,\n\n isHex: isHex,\n isNumber: isNumber,\n isNewline: isNewline,\n\n cmpChar: cmpChar,\n cmpStr: cmpStr,\n endsWith: endsWith,\n\n findLastNonSpaceLocation: findLastNonSpaceLocation,\n findWhiteSpaceEnd: findWhiteSpaceEnd,\n findCommentEnd: findCommentEnd,\n findStringEnd: findStringEnd,\n findDecimalNumberEnd: findDecimalNumberEnd,\n findNumberEnd: findNumberEnd,\n findEscaseEnd: findEscaseEnd,\n findIdentifierEnd: findIdentifierEnd,\n findUrlRawEnd: findUrlRawEnd\n};\n","'use strict';\n\nvar CssSyntaxError = require('./error');\n\nvar constants = require('./const');\nvar TYPE = constants.TYPE;\nvar NAME = constants.NAME;\nvar SYMBOL_TYPE = constants.SYMBOL_TYPE;\n\nvar utils = require('./utils');\nvar firstCharOffset = utils.firstCharOffset;\nvar cmpStr = utils.cmpStr;\nvar isNumber = utils.isNumber;\nvar findLastNonSpaceLocation = utils.findLastNonSpaceLocation;\nvar findWhiteSpaceEnd = utils.findWhiteSpaceEnd;\nvar findCommentEnd = utils.findCommentEnd;\nvar findStringEnd = utils.findStringEnd;\nvar findNumberEnd = utils.findNumberEnd;\nvar findIdentifierEnd = utils.findIdentifierEnd;\nvar findUrlRawEnd = utils.findUrlRawEnd;\n\nvar NULL = 0;\nvar WHITESPACE = TYPE.WhiteSpace;\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar STRING = TYPE.String;\nvar COMMENT = TYPE.Comment;\nvar PUNCTUATOR = TYPE.Punctuator;\nvar CDO = TYPE.CDO;\nvar CDC = TYPE.CDC;\nvar ATRULE = TYPE.Atrule;\nvar FUNCTION = TYPE.Function;\nvar URL = TYPE.Url;\nvar RAW = TYPE.Raw;\n\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar STAR = TYPE.Asterisk;\nvar SLASH = TYPE.Solidus;\nvar FULLSTOP = TYPE.FullStop;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar GREATERTHANSIGN = TYPE.GreaterThanSign;\nvar LESSTHANSIGN = TYPE.LessThanSign;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\nvar COMMERCIALAT = TYPE.CommercialAt;\nvar QUOTATIONMARK = TYPE.QuotationMark;\nvar APOSTROPHE = TYPE.Apostrophe;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\nvar RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;\n\nvar MIN_BUFFER_SIZE = 16 * 1024;\nvar OFFSET_MASK = 0x00FFFFFF;\nvar TYPE_SHIFT = 24;\nvar SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported\n\nfunction computeLinesAndColumns(tokenizer, source) {\n var sourceLength = source.length;\n var start = firstCharOffset(source);\n var lines = tokenizer.lines;\n var line = tokenizer.startLine;\n var columns = tokenizer.columns;\n var column = tokenizer.startColumn;\n\n if (lines === null || lines.length < sourceLength + 1) {\n lines = new SafeUint32Array(Math.max(sourceLength + 1024, MIN_BUFFER_SIZE));\n columns = new SafeUint32Array(lines.length);\n }\n\n for (var i = start; i < sourceLength; i++) {\n var code = source.charCodeAt(i);\n\n lines[i] = line;\n columns[i] = column++;\n\n if (code === N || code === R || code === F) {\n if (code === R && i + 1 < sourceLength && source.charCodeAt(i + 1) === N) {\n i++;\n lines[i] = line;\n columns[i] = column;\n }\n\n line++;\n column = 1;\n }\n }\n\n lines[i] = line;\n columns[i] = column;\n\n tokenizer.linesAnsColumnsComputed = true;\n tokenizer.lines = lines;\n tokenizer.columns = columns;\n}\n\nfunction tokenLayout(tokenizer, source, startPos) {\n var sourceLength = source.length;\n var offsetAndType = tokenizer.offsetAndType;\n var balance = tokenizer.balance;\n var tokenCount = 0;\n var prevType = 0;\n var offset = startPos;\n var anchor = 0;\n var balanceCloseCode = 0;\n var balanceStart = 0;\n var balancePrev = 0;\n\n if (offsetAndType === null || offsetAndType.length < sourceLength + 1) {\n offsetAndType = new SafeUint32Array(sourceLength + 1024);\n balance = new SafeUint32Array(sourceLength + 1024);\n }\n\n while (offset < sourceLength) {\n var code = source.charCodeAt(offset);\n var type = code < 0x80 ? SYMBOL_TYPE[code] : IDENTIFIER;\n\n balance[tokenCount] = sourceLength;\n\n switch (type) {\n case WHITESPACE:\n offset = findWhiteSpaceEnd(source, offset + 1);\n break;\n\n case PUNCTUATOR:\n switch (code) {\n case balanceCloseCode:\n balancePrev = balanceStart & OFFSET_MASK;\n balanceStart = balance[balancePrev];\n balanceCloseCode = balanceStart >> TYPE_SHIFT;\n balance[tokenCount] = balancePrev;\n balance[balancePrev++] = tokenCount;\n for (; balancePrev < tokenCount; balancePrev++) {\n if (balance[balancePrev] === sourceLength) {\n balance[balancePrev] = tokenCount;\n }\n }\n break;\n\n case LEFTSQUAREBRACKET:\n balance[tokenCount] = balanceStart;\n balanceCloseCode = RIGHTSQUAREBRACKET;\n balanceStart = (balanceCloseCode << TYPE_SHIFT) | tokenCount;\n break;\n\n case LEFTCURLYBRACKET:\n balance[tokenCount] = balanceStart;\n balanceCloseCode = RIGHTCURLYBRACKET;\n balanceStart = (balanceCloseCode << TYPE_SHIFT) | tokenCount;\n break;\n\n case LEFTPARENTHESIS:\n balance[tokenCount] = balanceStart;\n balanceCloseCode = RIGHTPARENTHESIS;\n balanceStart = (balanceCloseCode << TYPE_SHIFT) | tokenCount;\n break;\n }\n\n // /*\n if (code === STAR && prevType === SLASH) {\n type = COMMENT;\n offset = findCommentEnd(source, offset + 1);\n tokenCount--; // rewrite prev token\n break;\n }\n\n // edge case for -.123 and +.123\n if (code === FULLSTOP && (prevType === PLUSSIGN || prevType === HYPHENMINUS)) {\n if (offset + 1 < sourceLength && isNumber(source.charCodeAt(offset + 1))) {\n type = NUMBER;\n offset = findNumberEnd(source, offset + 2, false);\n tokenCount--; // rewrite prev token\n break;\n }\n }\n\n // <!--\n if (code === EXCLAMATIONMARK && prevType === LESSTHANSIGN) {\n if (offset + 2 < sourceLength &&\n source.charCodeAt(offset + 1) === HYPHENMINUS &&\n source.charCodeAt(offset + 2) === HYPHENMINUS) {\n type = CDO;\n offset = offset + 3;\n tokenCount--; // rewrite prev token\n break;\n }\n }\n\n // -->\n if (code === HYPHENMINUS && prevType === HYPHENMINUS) {\n if (offset + 1 < sourceLength && source.charCodeAt(offset + 1) === GREATERTHANSIGN) {\n type = CDC;\n offset = offset + 2;\n tokenCount--; // rewrite prev token\n break;\n }\n }\n\n // ident(\n if (code === LEFTPARENTHESIS && prevType === IDENTIFIER) {\n offset = offset + 1;\n tokenCount--; // rewrite prev token\n balance[tokenCount] = balance[tokenCount + 1];\n balanceStart--;\n\n // 4 char length identifier and equal to `url(` (case insensitive)\n if (offset - anchor === 4 && cmpStr(source, anchor, offset, 'url(')) {\n // special case for url() because it can contain any symbols sequence with few exceptions\n anchor = findWhiteSpaceEnd(source, offset);\n code = source.charCodeAt(anchor);\n if (code !== LEFTPARENTHESIS &&\n code !== RIGHTPARENTHESIS &&\n code !== QUOTATIONMARK &&\n code !== APOSTROPHE) {\n // url(\n offsetAndType[tokenCount++] = (URL << TYPE_SHIFT) | offset;\n balance[tokenCount] = sourceLength;\n\n // ws*\n if (anchor !== offset) {\n offsetAndType[tokenCount++] = (WHITESPACE << TYPE_SHIFT) | anchor;\n balance[tokenCount] = sourceLength;\n }\n\n // raw\n type = RAW;\n offset = findUrlRawEnd(source, anchor);\n } else {\n type = URL;\n }\n } else {\n type = FUNCTION;\n }\n break;\n }\n\n type = code;\n offset = offset + 1;\n break;\n\n case NUMBER:\n offset = findNumberEnd(source, offset + 1, prevType !== FULLSTOP);\n\n // merge number with a preceding dot, dash or plus\n if (prevType === FULLSTOP ||\n prevType === HYPHENMINUS ||\n prevType === PLUSSIGN) {\n tokenCount--; // rewrite prev token\n }\n\n break;\n\n case STRING:\n offset = findStringEnd(source, offset + 1, code);\n break;\n\n default:\n anchor = offset;\n offset = findIdentifierEnd(source, offset);\n\n // merge identifier with a preceding dash\n if (prevType === HYPHENMINUS) {\n // rewrite prev token\n tokenCount--;\n // restore prev prev token type\n // for case @-prefix-ident\n prevType = tokenCount === 0 ? 0 : offsetAndType[tokenCount - 1] >> TYPE_SHIFT;\n }\n\n if (prevType === COMMERCIALAT) {\n // rewrite prev token and change type to <at-keyword-token>\n tokenCount--;\n type = ATRULE;\n }\n }\n\n offsetAndType[tokenCount++] = (type << TYPE_SHIFT) | offset;\n prevType = type;\n }\n\n // finalize arrays\n offsetAndType[tokenCount] = offset;\n balance[tokenCount] = sourceLength;\n balance[sourceLength] = sourceLength; // prevents false positive balance match with any token\n while (balanceStart !== 0) {\n balancePrev = balanceStart & OFFSET_MASK;\n balanceStart = balance[balancePrev];\n balance[balancePrev] = sourceLength;\n }\n\n tokenizer.offsetAndType = offsetAndType;\n tokenizer.tokenCount = tokenCount;\n tokenizer.balance = balance;\n}\n\n//\n// tokenizer\n//\n\nvar Tokenizer = function(source, startOffset, startLine, startColumn) {\n this.offsetAndType = null;\n this.balance = null;\n this.lines = null;\n this.columns = null;\n\n this.setSource(source, startOffset, startLine, startColumn);\n};\n\nTokenizer.prototype = {\n setSource: function(source, startOffset, startLine, startColumn) {\n var safeSource = String(source || '');\n var start = firstCharOffset(safeSource);\n\n this.source = safeSource;\n this.firstCharOffset = start;\n this.startOffset = typeof startOffset === 'undefined' ? 0 : startOffset;\n this.startLine = typeof startLine === 'undefined' ? 1 : startLine;\n this.startColumn = typeof startColumn === 'undefined' ? 1 : startColumn;\n this.linesAnsColumnsComputed = false;\n\n this.eof = false;\n this.currentToken = -1;\n this.tokenType = 0;\n this.tokenStart = start;\n this.tokenEnd = start;\n\n tokenLayout(this, safeSource, start);\n this.next();\n },\n\n lookupType: function(offset) {\n offset += this.currentToken;\n\n if (offset < this.tokenCount) {\n return this.offsetAndType[offset] >> TYPE_SHIFT;\n }\n\n return NULL;\n },\n lookupNonWSType: function(offset) {\n offset += this.currentToken;\n\n for (var type; offset < this.tokenCount; offset++) {\n type = this.offsetAndType[offset] >> TYPE_SHIFT;\n\n if (type !== WHITESPACE) {\n return type;\n }\n }\n\n return NULL;\n },\n lookupValue: function(offset, referenceStr) {\n offset += this.currentToken;\n\n if (offset < this.tokenCount) {\n return cmpStr(\n this.source,\n this.offsetAndType[offset - 1] & OFFSET_MASK,\n this.offsetAndType[offset] & OFFSET_MASK,\n referenceStr\n );\n }\n\n return false;\n },\n getTokenStart: function(tokenNum) {\n if (tokenNum === this.currentToken) {\n return this.tokenStart;\n }\n\n if (tokenNum > 0) {\n return tokenNum < this.tokenCount\n ? this.offsetAndType[tokenNum - 1] & OFFSET_MASK\n : this.offsetAndType[this.tokenCount] & OFFSET_MASK;\n }\n\n return this.firstCharOffset;\n },\n getOffsetExcludeWS: function() {\n if (this.currentToken > 0) {\n if ((this.offsetAndType[this.currentToken - 1] >> TYPE_SHIFT) === WHITESPACE) {\n return this.currentToken > 1\n ? this.offsetAndType[this.currentToken - 2] & OFFSET_MASK\n : this.firstCharOffset;\n }\n }\n return this.tokenStart;\n },\n getRawLength: function(startToken, endTokenType1, endTokenType2, includeTokenType2) {\n var cursor = startToken;\n var balanceEnd;\n\n loop:\n for (; cursor < this.tokenCount; cursor++) {\n balanceEnd = this.balance[cursor];\n\n // belance end points to offset before start\n if (balanceEnd < startToken) {\n break loop;\n }\n\n // check token is stop type\n switch (this.offsetAndType[cursor] >> TYPE_SHIFT) {\n case endTokenType1:\n break loop;\n\n case endTokenType2:\n if (includeTokenType2) {\n cursor++;\n }\n break loop;\n\n default:\n // fast forward to the end of balanced block\n if (this.balance[balanceEnd] === cursor) {\n cursor = balanceEnd;\n }\n }\n\n }\n\n return cursor - this.currentToken;\n },\n\n getTokenValue: function() {\n return this.source.substring(this.tokenStart, this.tokenEnd);\n },\n substrToCursor: function(start) {\n return this.source.substring(start, this.tokenStart);\n },\n\n skipWS: function() {\n for (var i = this.currentToken, skipTokenCount = 0; i < this.tokenCount; i++, skipTokenCount++) {\n if ((this.offsetAndType[i] >> TYPE_SHIFT) !== WHITESPACE) {\n break;\n }\n }\n\n if (skipTokenCount > 0) {\n this.skip(skipTokenCount);\n }\n },\n skipSC: function() {\n while (this.tokenType === WHITESPACE || this.tokenType === COMMENT) {\n this.next();\n }\n },\n skip: function(tokenCount) {\n var next = this.currentToken + tokenCount;\n\n if (next < this.tokenCount) {\n this.currentToken = next;\n this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK;\n next = this.offsetAndType[next];\n this.tokenType = next >> TYPE_SHIFT;\n this.tokenEnd = next & OFFSET_MASK;\n } else {\n this.currentToken = this.tokenCount;\n this.next();\n }\n },\n next: function() {\n var next = this.currentToken + 1;\n\n if (next < this.tokenCount) {\n this.currentToken = next;\n this.tokenStart = this.tokenEnd;\n next = this.offsetAndType[next];\n this.tokenType = next >> TYPE_SHIFT;\n this.tokenEnd = next & OFFSET_MASK;\n } else {\n this.currentToken = this.tokenCount;\n this.eof = true;\n this.tokenType = NULL;\n this.tokenStart = this.tokenEnd = this.source.length;\n }\n },\n\n eat: function(tokenType) {\n if (this.tokenType !== tokenType) {\n var offset = this.tokenStart;\n var message = NAME[tokenType] + ' is expected';\n\n // tweak message and offset\n if (tokenType === IDENTIFIER) {\n // when identifier is expected but there is a function or url\n if (this.tokenType === FUNCTION || this.tokenType === URL) {\n offset = this.tokenEnd - 1;\n message += ' but function found';\n }\n } else {\n // when test type is part of another token show error for current position + 1\n // e.g. eat(HYPHENMINUS) will fail on \"-foo\", but pointing on \"-\" is odd\n if (this.source.charCodeAt(this.tokenStart) === tokenType) {\n offset = offset + 1;\n }\n }\n\n this.error(message, offset);\n }\n\n this.next();\n },\n eatNonWS: function(tokenType) {\n this.skipWS();\n this.eat(tokenType);\n },\n\n consume: function(tokenType) {\n var value = this.getTokenValue();\n\n this.eat(tokenType);\n\n return value;\n },\n consumeFunctionName: function() {\n var name = this.source.substring(this.tokenStart, this.tokenEnd - 1);\n\n this.eat(FUNCTION);\n\n return name;\n },\n consumeNonWS: function(tokenType) {\n this.skipWS();\n\n return this.consume(tokenType);\n },\n\n expectIdentifier: function(name) {\n if (this.tokenType !== IDENTIFIER || cmpStr(this.source, this.tokenStart, this.tokenEnd, name) === false) {\n this.error('Identifier `' + name + '` is expected');\n }\n\n this.next();\n },\n\n getLocation: function(offset, filename) {\n if (!this.linesAnsColumnsComputed) {\n computeLinesAndColumns(this, this.source);\n }\n\n return {\n source: filename,\n offset: this.startOffset + offset,\n line: this.lines[offset],\n column: this.columns[offset]\n };\n },\n\n getLocationRange: function(start, end, filename) {\n if (!this.linesAnsColumnsComputed) {\n computeLinesAndColumns(this, this.source);\n }\n\n return {\n source: filename,\n start: {\n offset: this.startOffset + start,\n line: this.lines[start],\n column: this.columns[start]\n },\n end: {\n offset: this.startOffset + end,\n line: this.lines[end],\n column: this.columns[end]\n }\n };\n },\n\n error: function(message, offset) {\n var location = typeof offset !== 'undefined' && offset < this.source.length\n ? this.getLocation(offset)\n : this.eof\n ? findLastNonSpaceLocation(this)\n : this.getLocation(this.tokenStart);\n\n throw new CssSyntaxError(\n message || 'Unexpected input',\n this.source,\n location.offset,\n location.line,\n location.column\n );\n },\n\n dump: function() {\n var offset = 0;\n\n return Array.prototype.slice.call(this.offsetAndType, 0, this.tokenCount).map(function(item, idx) {\n var start = offset;\n var end = item & OFFSET_MASK;\n\n offset = end;\n\n return {\n idx: idx,\n type: NAME[item >> TYPE_SHIFT],\n chunk: this.source.substring(start, end),\n balance: this.balance[idx]\n };\n }, this);\n }\n};\n\n// extend with error class\nTokenizer.CssSyntaxError = CssSyntaxError;\n\n// extend tokenizer with constants\nObject.keys(constants).forEach(function(key) {\n Tokenizer[key] = constants[key];\n});\n\n// extend tokenizer with static methods from utils\nObject.keys(utils).forEach(function(key) {\n Tokenizer[key] = utils[key];\n});\n\n// warm up tokenizer to elimitate code branches that never execute\n// fix soft deoptimizations (insufficient type feedback)\nnew Tokenizer('\\n\\r\\r\\n\\f<!---->//\"\"\\'\\'/*\\r\\n\\f*/1a;.\\\\31\\t\\+2{url(a);func();+1.2e3 -.4e-5 .6e+7}').getLocation();\n\nmodule.exports = Tokenizer;\n","'use strict';\n\nfunction isNodeType(node, type) {\n return node && node.type === type;\n}\n\nfunction serializeMultiplier(multiplier) {\n if (multiplier.min === 0 && multiplier.max === 0) {\n return '*';\n }\n\n if (multiplier.min === 0 && multiplier.max === 1) {\n return '?';\n }\n\n if (multiplier.min === 1 && multiplier.max === 0) {\n return multiplier.comma ? '#' : '+';\n }\n\n if (multiplier.min === 1 && multiplier.max === 1) {\n return '';\n }\n\n return (\n (multiplier.comma ? '#' : '') +\n '{' + multiplier.min + (multiplier.min !== multiplier.max ? ',' + (multiplier.max !== 0 ? multiplier.max : '') : '') + '}'\n );\n}\n\nfunction translateSequence(node, forceBraces, decorate) {\n var result = '';\n\n if (node.explicit || forceBraces) {\n result += '[' + (!isNodeType(node.terms[0], 'Comma') ? ' ' : '');\n }\n\n result += node.terms.map(function(term) {\n return translate(term, forceBraces, decorate);\n }).join(node.combinator === ' ' ? ' ' : ' ' + node.combinator + ' ');\n\n if (node.explicit || forceBraces) {\n result += ' ]';\n }\n\n return result;\n}\n\nfunction translateParentheses(group, forceBraces, decorate) {\n if (!group.terms.length) {\n return '()';\n }\n\n return '( ' + translateSequence(group, forceBraces, decorate) + ' )';\n}\n\nfunction translate(node, forceBraces, decorate) {\n var result;\n\n switch (node.type) {\n case 'Group':\n result =\n translateSequence(node, forceBraces, decorate) +\n (node.disallowEmpty ? '!' : '') +\n serializeMultiplier(node.multiplier);\n break;\n\n case 'Keyword':\n result = node.name;\n break;\n\n case 'Function':\n result = node.name + translateParentheses(node.children, forceBraces, decorate);\n break;\n\n case 'Parentheses': // replace for seq('(' seq(...node.children) ')')\n result = translateParentheses(node.children, forceBraces, decorate);\n break;\n\n case 'Type':\n result = '<' + node.name + '>';\n break;\n\n case 'Property':\n result = '<\\'' + node.name + '\\'>';\n break;\n\n case 'Combinator': // remove?\n case 'Slash': // replace for String? '/'\n case 'Percent': // replace for String? '%'\n case 'String':\n case 'Comma':\n result = node.value;\n break;\n\n default:\n throw new Error('Unknown node type `' + node.type + '`');\n }\n\n if (typeof decorate === 'function') {\n result = decorate(result, node);\n }\n\n return result;\n}\n\nmodule.exports = translate;\n","'use strict';\n\nvar createCustomError = require('../utils/createCustomError');\nvar translateGrammar = require('./grammar/translate');\n\nfunction getLocation(node, point) {\n var loc = node && node.loc && node.loc[point];\n\n return loc\n ? { offset: loc.offset,\n line: loc.line,\n column: loc.column }\n : null;\n}\n\nvar SyntaxReferenceError = function(type, referenceName) {\n var error = createCustomError('SyntaxReferenceError', type + ' `' + referenceName + '`');\n\n error.reference = referenceName;\n\n return error;\n};\n\nvar MatchError = function(message, lexer, syntax, value, badNode) {\n var error = createCustomError('SyntaxMatchError', message);\n var errorOffset = -1;\n var start = getLocation(badNode, 'start');\n var end = getLocation(badNode, 'end');\n var css = lexer.syntax.translateMarkup(value, function(node, buffer) {\n if (node === badNode) {\n errorOffset = buffer.length;\n }\n });\n\n if (errorOffset === -1) {\n errorOffset = css.length;\n }\n\n error.rawMessage = message;\n error.syntax = syntax ? translateGrammar(syntax) : '<generic>';\n error.css = css;\n error.mismatchOffset = errorOffset;\n error.loc = {\n source: badNode && badNode.loc && badNode.loc.source || '<unknown>',\n start: start,\n end: end\n };\n error.line = start ? start.line : undefined;\n error.column = start ? start.column : undefined;\n error.offset = start ? start.offset : undefined;\n error.message = message + '\\n' +\n ' syntax: ' + error.syntax + '\\n' +\n ' value: ' + (error.css || '<empty string>') + '\\n' +\n ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^';\n\n return error;\n};\n\nmodule.exports = {\n SyntaxReferenceError: SyntaxReferenceError,\n MatchError: MatchError\n};\n","'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar keywords = Object.create(null);\nvar properties = Object.create(null);\nvar HYPHENMINUS = 45; // '-'.charCodeAt()\n\nfunction isCustomProperty(str, offset) {\n return str.length - offset >= 2 &&\n str.charCodeAt(offset) === HYPHENMINUS &&\n str.charCodeAt(offset + 1) === HYPHENMINUS;\n}\n\nfunction getVendorPrefix(str, offset) {\n if (str.charCodeAt(offset) === HYPHENMINUS) {\n // vendor should contain at least one letter\n var secondDashIndex = str.indexOf('-', offset + 2);\n\n if (secondDashIndex !== -1) {\n return str.substring(offset, secondDashIndex + 1);\n }\n }\n\n return '';\n}\n\nfunction getKeywordInfo(keyword) {\n if (hasOwnProperty.call(keywords, keyword)) {\n return keywords[keyword];\n }\n\n var name = keyword.toLowerCase();\n\n if (hasOwnProperty.call(keywords, name)) {\n return keywords[keyword] = keywords[name];\n }\n\n var vendor = !isCustomProperty(name, 0) ? getVendorPrefix(name, 0) : '';\n\n return keywords[keyword] = Object.freeze({\n vendor: vendor,\n prefix: vendor,\n name: name.substr(vendor.length)\n });\n}\n\nfunction getPropertyInfo(property) {\n if (hasOwnProperty.call(properties, property)) {\n return properties[property];\n }\n\n var name = property;\n var hack = property[0];\n\n if (hack === '/') {\n hack = property[1] === '/' ? '//' : '/';\n } else if (hack !== '_' &&\n hack !== '*' &&\n hack !== '$' &&\n hack !== '#' &&\n hack !== '+') {\n hack = '';\n }\n\n var custom = isCustomProperty(name, hack.length);\n\n if (!custom) {\n name = name.toLowerCase();\n if (hasOwnProperty.call(properties, name)) {\n return properties[property] = properties[name];\n }\n }\n\n var vendor = !custom ? getVendorPrefix(name, hack.length) : '';\n\n return properties[property] = Object.freeze({\n hack: hack,\n vendor: vendor,\n prefix: hack + vendor,\n name: name.substr(hack.length + vendor.length),\n custom: custom\n });\n}\n\nmodule.exports = {\n keyword: getKeywordInfo,\n property: getPropertyInfo\n};\n","'use strict';\n\nvar names = require('../utils/names.js');\n\n// https://www.w3.org/TR/css-values-3/#lengths\nvar LENGTH = {\n // absolute length units\n 'px': true,\n 'mm': true,\n 'cm': true,\n 'in': true,\n 'pt': true,\n 'pc': true,\n 'q': true,\n\n // relative length units\n 'em': true,\n 'ex': true,\n 'ch': true,\n 'rem': true,\n\n // viewport-percentage lengths\n 'vh': true,\n 'vw': true,\n 'vmin': true,\n 'vmax': true,\n 'vm': true\n};\n\nvar ANGLE = {\n 'deg': true,\n 'grad': true,\n 'rad': true,\n 'turn': true\n};\n\nvar TIME = {\n 's': true,\n 'ms': true\n};\n\nvar FREQUENCY = {\n 'hz': true,\n 'khz': true\n};\n\n// https://www.w3.org/TR/css-values-3/#resolution (https://drafts.csswg.org/css-values/#resolution)\nvar RESOLUTION = {\n 'dpi': true,\n 'dpcm': true,\n 'dppx': true,\n 'x': true // https://github.com/w3c/csswg-drafts/issues/461\n};\n\n// https://drafts.csswg.org/css-grid/#fr-unit\nvar FLEX = {\n 'fr': true\n};\n\n// https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume\nvar DECIBEL = {\n 'db': true\n};\n\n// https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch\nvar SEMITONES = {\n 'st': true\n};\n\n// can be used wherever <length>, <frequency>, <angle>, <time>, <percentage>, <number>, or <integer> values are allowed\n// https://drafts.csswg.org/css-values/#calc-notation\nfunction isCalc(node) {\n if (node.data.type !== 'Function') {\n return false;\n }\n\n var keyword = names.keyword(node.data.name);\n\n if (keyword.name !== 'calc') {\n return false;\n }\n\n // there were some prefixed implementations\n return keyword.vendor === '' ||\n keyword.vendor === '-moz-' ||\n keyword.vendor === '-webkit-';\n}\n\nfunction astNode(type) {\n return function(node) {\n return node.data.type === type;\n };\n}\n\nfunction dimension(type) {\n return function(node) {\n return isCalc(node) ||\n (node.data.type === 'Dimension' && type.hasOwnProperty(node.data.unit.toLowerCase()));\n };\n}\n\nfunction zeroUnitlessDimension(type) {\n return function(node) {\n return isCalc(node) ||\n (node.data.type === 'Dimension' && type.hasOwnProperty(node.data.unit.toLowerCase())) ||\n (node.data.type === 'Number' && Number(node.data.value) === 0);\n };\n}\n\nfunction attr(node) {\n return node.data.type === 'Function' && node.data.name.toLowerCase() === 'attr';\n}\n\nfunction number(node) {\n return isCalc(node) || node.data.type === 'Number';\n}\n\nfunction numberZeroOne(node) {\n if (isCalc(node) || node.data.type === 'Number') {\n var value = Number(node.data.value);\n\n return value >= 0 && value <= 1;\n }\n\n return false;\n}\n\nfunction numberOneOrGreater(node) {\n if (isCalc(node) || node.data.type === 'Number') {\n return Number(node.data.value) >= 1;\n }\n\n return false;\n}\n\n// TODO: fail on 10e-2\nfunction integer(node) {\n return isCalc(node) ||\n (node.data.type === 'Number' && node.data.value.indexOf('.') === -1);\n}\n\n// TODO: fail on 10e-2\nfunction positiveInteger(node) {\n return isCalc(node) ||\n (node.data.type === 'Number' && node.data.value.indexOf('.') === -1 && node.data.value.charAt(0) !== '-');\n}\n\nfunction percentage(node) {\n return isCalc(node) ||\n node.data.type === 'Percentage';\n}\n\nfunction hexColor(node) {\n if (node.data.type !== 'HexColor') {\n return false;\n }\n\n var hex = node.data.value;\n\n return /^[0-9a-fA-F]{3,8}$/.test(hex) &&\n (hex.length === 3 || hex.length === 4 || hex.length === 6 || hex.length === 8);\n}\n\nfunction expression(node) {\n return node.data.type === 'Function' && node.data.name.toLowerCase() === 'expression';\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident\n// https://drafts.csswg.org/css-values-4/#identifier-value\nfunction customIdent(node) {\n if (node.data.type !== 'Identifier') {\n return false;\n }\n\n var name = node.data.name.toLowerCase();\n\n // § 3.2. Author-defined Identifiers: the <custom-ident> type\n // The CSS-wide keywords are not valid <custom-ident>s\n if (name === 'unset' || name === 'initial' || name === 'inherit') {\n return false;\n }\n\n // The default keyword is reserved and is also not a valid <custom-ident>\n if (name === 'default') {\n return false;\n }\n\n // TODO: ignore property specific keywords (as described https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident)\n\n return true;\n}\n\nmodule.exports = {\n 'angle': zeroUnitlessDimension(ANGLE),\n 'attr()': attr,\n 'custom-ident': customIdent,\n 'decibel': dimension(DECIBEL),\n 'dimension': astNode('Dimension'),\n 'frequency': dimension(FREQUENCY),\n 'flex': dimension(FLEX),\n 'hex-color': hexColor,\n 'id-selector': astNode('IdSelector'), // element( <id-selector> )\n 'ident': astNode('Identifier'),\n 'integer': integer,\n 'length': zeroUnitlessDimension(LENGTH),\n 'number': number,\n 'number-zero-one': numberZeroOne,\n 'number-one-or-greater': numberOneOrGreater,\n 'percentage': percentage,\n 'positive-integer': positiveInteger,\n 'resolution': dimension(RESOLUTION),\n 'semitones': dimension(SEMITONES),\n 'string': astNode('String'),\n 'time': dimension(TIME),\n 'unicode-range': astNode('UnicodeRange'),\n 'url': astNode('Url'),\n\n // old IE stuff\n 'progid': astNode('Raw'),\n 'expression': expression\n};\n","'use strict';\n\nvar SyntaxParseError = require('./error').SyntaxParseError;\n\nvar TAB = 9;\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar SPACE = 32;\nvar EXCLAMATIONMARK = 33; // !\nvar NUMBERSIGN = 35; // #\nvar PERCENTSIGN = 37; // %\nvar AMPERSAND = 38; // &\nvar APOSTROPHE = 39; // '\nvar LEFTPARENTHESIS = 40; // (\nvar RIGHTPARENTHESIS = 41; // )\nvar ASTERISK = 42; // *\nvar PLUSSIGN = 43; // +\nvar COMMA = 44; // ,\nvar SOLIDUS = 47; // /\nvar LESSTHANSIGN = 60; // <\nvar GREATERTHANSIGN = 62; // >\nvar QUESTIONMARK = 63; // ?\nvar LEFTSQUAREBRACKET = 91; // [\nvar RIGHTSQUAREBRACKET = 93; // ]\nvar LEFTCURLYBRACKET = 123; // {\nvar VERTICALLINE = 124; // |\nvar RIGHTCURLYBRACKET = 125; // }\nvar COMBINATOR_PRECEDENCE = {\n ' ': 1,\n '&&': 2,\n '||': 3,\n '|': 4\n};\nvar MULTIPLIER_DEFAULT = {\n comma: false,\n min: 1,\n max: 1\n};\nvar MULTIPLIER_ZERO_OR_MORE = {\n comma: false,\n min: 0,\n max: 0\n};\nvar MULTIPLIER_ONE_OR_MORE = {\n comma: false,\n min: 1,\n max: 0\n};\nvar MULTIPLIER_ONE_OR_MORE_COMMA_SEPARATED = {\n comma: true,\n min: 1,\n max: 0\n};\nvar MULTIPLIER_ZERO_OR_ONE = {\n comma: false,\n min: 0,\n max: 1\n};\nvar NAME_CHAR = (function() {\n var array = typeof Uint32Array === 'function' ? new Uint32Array(128) : new Array(128);\n for (var i = 0; i < 128; i++) {\n array[i] = /[a-zA-Z0-9\\-]/.test(String.fromCharCode(i)) ? 1 : 0;\n }\n return array;\n})();\n\nvar Tokenizer = function(str) {\n this.str = str;\n this.pos = 0;\n};\nTokenizer.prototype = {\n charCode: function() {\n return this.pos < this.str.length ? this.str.charCodeAt(this.pos) : 0;\n },\n nextCharCode: function() {\n return this.pos + 1 < this.str.length ? this.str.charCodeAt(this.pos + 1) : 0;\n },\n substringToPos: function(end) {\n return this.str.substring(this.pos, this.pos = end);\n },\n eat: function(code) {\n if (this.charCode() !== code) {\n error(this, this.pos, 'Expect `' + String.fromCharCode(code) + '`');\n }\n\n this.pos++;\n }\n};\n\nfunction scanSpaces(tokenizer) {\n var end = tokenizer.pos + 1;\n\n for (; end < tokenizer.str.length; end++) {\n var code = tokenizer.str.charCodeAt(end);\n if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {\n break;\n }\n }\n\n return tokenizer.substringToPos(end);\n}\n\nfunction scanWord(tokenizer) {\n var end = tokenizer.pos;\n\n for (; end < tokenizer.str.length; end++) {\n var code = tokenizer.str.charCodeAt(end);\n if (code >= 128 || NAME_CHAR[code] === 0) {\n break;\n }\n }\n\n if (tokenizer.pos === end) {\n error(tokenizer, tokenizer.pos, 'Expect a keyword');\n }\n\n return tokenizer.substringToPos(end);\n}\n\nfunction scanNumber(tokenizer) {\n var end = tokenizer.pos;\n\n for (; end < tokenizer.str.length; end++) {\n var code = tokenizer.str.charCodeAt(end);\n if (code < 48 || code > 57) {\n break;\n }\n }\n\n if (tokenizer.pos === end) {\n error(tokenizer, tokenizer.pos, 'Expect a number');\n }\n\n return tokenizer.substringToPos(end);\n}\n\nfunction scanString(tokenizer) {\n var end = tokenizer.str.indexOf('\\'', tokenizer.pos + 1);\n\n if (end === -1) {\n error(tokenizer, tokenizer.str.length, 'Expect a quote');\n }\n\n return tokenizer.substringToPos(end + 1);\n}\n\nfunction readMultiplierRange(tokenizer, comma) {\n var min = null;\n var max = null;\n\n tokenizer.eat(LEFTCURLYBRACKET);\n\n min = scanNumber(tokenizer);\n\n if (tokenizer.charCode() === COMMA) {\n tokenizer.pos++;\n if (tokenizer.charCode() !== RIGHTCURLYBRACKET) {\n max = scanNumber(tokenizer);\n }\n } else {\n max = min;\n }\n\n tokenizer.eat(RIGHTCURLYBRACKET);\n\n return {\n comma: comma,\n min: Number(min),\n max: max ? Number(max) : 0\n };\n}\n\nfunction readMultiplier(tokenizer) {\n switch (tokenizer.charCode()) {\n case ASTERISK:\n tokenizer.pos++;\n return MULTIPLIER_ZERO_OR_MORE;\n\n case PLUSSIGN:\n tokenizer.pos++;\n return MULTIPLIER_ONE_OR_MORE;\n\n case QUESTIONMARK:\n tokenizer.pos++;\n return MULTIPLIER_ZERO_OR_ONE;\n\n case NUMBERSIGN:\n tokenizer.pos++;\n\n if (tokenizer.charCode() !== LEFTCURLYBRACKET) {\n return MULTIPLIER_ONE_OR_MORE_COMMA_SEPARATED;\n }\n\n return readMultiplierRange(tokenizer, true);\n\n case LEFTCURLYBRACKET:\n return readMultiplierRange(tokenizer, false);\n }\n\n return MULTIPLIER_DEFAULT;\n}\n\nfunction maybeMultiplied(tokenizer, node) {\n var multiplier = readMultiplier(tokenizer);\n\n if (multiplier !== MULTIPLIER_DEFAULT) {\n return {\n type: 'Group',\n terms: [node],\n combinator: '|', // `|` combinator is simplest in implementation (and therefore faster)\n disallowEmpty: false,\n multiplier: multiplier,\n explicit: false\n };\n }\n\n return node;\n}\n\nfunction readProperty(tokenizer) {\n var name;\n\n tokenizer.eat(LESSTHANSIGN);\n tokenizer.eat(APOSTROPHE);\n\n name = scanWord(tokenizer);\n\n tokenizer.eat(APOSTROPHE);\n tokenizer.eat(GREATERTHANSIGN);\n\n return maybeMultiplied(tokenizer, {\n type: 'Property',\n name: name\n });\n}\n\nfunction readType(tokenizer) {\n var name;\n\n tokenizer.eat(LESSTHANSIGN);\n name = scanWord(tokenizer);\n\n if (tokenizer.charCode() === LEFTPARENTHESIS &&\n tokenizer.nextCharCode() === RIGHTPARENTHESIS) {\n tokenizer.pos += 2;\n name += '()';\n }\n\n tokenizer.eat(GREATERTHANSIGN);\n\n return maybeMultiplied(tokenizer, {\n type: 'Type',\n name: name\n });\n}\n\nfunction readKeywordOrFunction(tokenizer) {\n var children = null;\n var name;\n\n name = scanWord(tokenizer);\n\n if (tokenizer.charCode() === LEFTPARENTHESIS) {\n tokenizer.pos++;\n children = readImplicitGroup(tokenizer);\n tokenizer.eat(RIGHTPARENTHESIS);\n\n return maybeMultiplied(tokenizer, {\n type: 'Function',\n name: name,\n children: children\n });\n }\n\n return maybeMultiplied(tokenizer, {\n type: 'Keyword',\n name: name\n });\n}\n\nfunction regroupTerms(terms, combinators) {\n function createGroup(terms, combinator) {\n return {\n type: 'Group',\n terms: terms,\n combinator: combinator,\n disallowEmpty: false,\n multiplier: MULTIPLIER_DEFAULT,\n explicit: false\n };\n }\n\n combinators = Object.keys(combinators).sort(function(a, b) {\n return COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b];\n });\n\n while (combinators.length > 0) {\n var combinator = combinators.shift();\n for (var i = 0, subgroupStart = 0; i < terms.length; i++) {\n var term = terms[i];\n if (term.type === 'Combinator') {\n if (term.value === combinator) {\n if (subgroupStart === -1) {\n subgroupStart = i - 1;\n }\n terms.splice(i, 1);\n i--;\n } else {\n if (subgroupStart !== -1 && i - subgroupStart > 1) {\n terms.splice(\n subgroupStart,\n i - subgroupStart,\n createGroup(terms.slice(subgroupStart, i), combinator)\n );\n i = subgroupStart + 1;\n }\n subgroupStart = -1;\n }\n }\n }\n\n if (subgroupStart !== -1 && combinators.length) {\n terms.splice(\n subgroupStart,\n i - subgroupStart,\n createGroup(terms.slice(subgroupStart, i), combinator)\n );\n }\n }\n\n return combinator;\n}\n\nfunction readImplicitGroup(tokenizer) {\n var terms = [];\n var combinators = {};\n var token;\n var prevToken = null;\n var prevTokenPos = tokenizer.pos;\n\n while (token = peek(tokenizer)) {\n if (token.type !== 'Spaces') {\n if (token.type === 'Combinator') {\n // check for combinator in group beginning and double combinator sequence\n if (prevToken === null || prevToken.type === 'Combinator') {\n error(tokenizer, prevTokenPos, 'Unexpected combinator');\n }\n\n combinators[token.value] = true;\n } else if (prevToken !== null && prevToken.type !== 'Combinator') {\n combinators[' '] = true; // a b\n terms.push({\n type: 'Combinator',\n value: ' '\n });\n }\n\n terms.push(token);\n prevToken = token;\n prevTokenPos = tokenizer.pos;\n }\n }\n\n // check for combinator in group ending\n if (prevToken !== null && prevToken.type === 'Combinator') {\n error(tokenizer, tokenizer.pos - prevTokenPos, 'Unexpected combinator');\n }\n\n return {\n type: 'Group',\n terms: terms,\n combinator: regroupTerms(terms, combinators) || ' ',\n disallowEmpty: false,\n multiplier: MULTIPLIER_DEFAULT,\n explicit: false\n };\n}\n\nfunction readGroup(tokenizer) {\n var result;\n\n tokenizer.eat(LEFTSQUAREBRACKET);\n result = readImplicitGroup(tokenizer);\n tokenizer.eat(RIGHTSQUAREBRACKET);\n\n result.explicit = true;\n result.multiplier = readMultiplier(tokenizer);\n\n if (tokenizer.charCode() === EXCLAMATIONMARK) {\n tokenizer.pos++;\n result.disallowEmpty = true;\n }\n\n return result;\n}\n\nfunction peek(tokenizer) {\n var code = tokenizer.charCode();\n\n if (code < 128 && NAME_CHAR[code] === 1) {\n return readKeywordOrFunction(tokenizer);\n }\n\n switch (code) {\n case LEFTSQUAREBRACKET:\n return readGroup(tokenizer);\n\n case LESSTHANSIGN:\n if (tokenizer.nextCharCode() === APOSTROPHE) {\n return readProperty(tokenizer);\n } else {\n return readType(tokenizer);\n }\n\n case VERTICALLINE:\n return {\n type: 'Combinator',\n value: tokenizer.substringToPos(tokenizer.nextCharCode() === VERTICALLINE ? tokenizer.pos + 2 : tokenizer.pos + 1)\n };\n\n case AMPERSAND:\n tokenizer.pos++;\n tokenizer.eat(AMPERSAND);\n return {\n type: 'Combinator',\n value: '&&'\n };\n\n case COMMA:\n tokenizer.pos++;\n return {\n type: 'Comma',\n value: ','\n };\n\n case SOLIDUS:\n tokenizer.pos++;\n return {\n type: 'Slash',\n value: '/'\n };\n\n case PERCENTSIGN: // looks like exception, needs for attr()'s <type-or-unit>\n tokenizer.pos++;\n return {\n type: 'Percent',\n value: '%'\n };\n\n case LEFTPARENTHESIS:\n tokenizer.pos++;\n var children = readImplicitGroup(tokenizer);\n tokenizer.eat(RIGHTPARENTHESIS);\n\n return {\n type: 'Parentheses',\n children: children\n };\n\n case APOSTROPHE:\n return {\n type: 'String',\n value: scanString(tokenizer)\n };\n\n case SPACE:\n case TAB:\n case N:\n case R:\n case F:\n return {\n type: 'Spaces',\n value: scanSpaces(tokenizer)\n };\n }\n}\n\nfunction error(tokenizer, pos, msg) {\n throw new SyntaxParseError(msg || 'Unexpected input', tokenizer.str, pos);\n}\n\nfunction parse(str) {\n var tokenizer = new Tokenizer(str);\n var result = readImplicitGroup(tokenizer);\n\n if (tokenizer.pos !== str.length) {\n error(tokenizer, tokenizer.pos);\n }\n\n // reduce redundant groups with single group term\n if (result.terms.length === 1 && result.terms[0].type === 'Group') {\n result = result.terms[0];\n }\n\n return result;\n}\n\n// warm up parse to elimitate code branches that never execute\n// fix soft deoptimizations (insufficient type feedback)\nparse('[a&&<b>#|<\\'c\\'>*||e(){2,} f{2} /,(% g#{1,2})]!');\n\nmodule.exports = parse;\n","'use strict';\n\nvar names = require('../utils/names');\nvar MULTIPLIER_DEFAULT = {\n comma: false,\n min: 1,\n max: 1\n};\n\nfunction skipSpaces(node) {\n while (node !== null && (node.data.type === 'WhiteSpace' || node.data.type === 'Comment')) {\n node = node.next;\n }\n\n return node;\n}\n\nfunction putResult(buffer, match) {\n var type = match.type || match.syntax.type;\n\n // ignore groups\n if (type === 'Group') {\n buffer.push.apply(buffer, match.match);\n } else {\n buffer.push(match);\n }\n}\n\nfunction matchToJSON() {\n return {\n type: this.syntax.type,\n name: this.syntax.name,\n match: this.match,\n node: this.node\n };\n}\n\nfunction buildMatchNode(badNode, lastNode, next, match) {\n if (badNode) {\n return {\n badNode: badNode,\n lastNode: null,\n next: null,\n match: null\n };\n }\n\n return {\n badNode: null,\n lastNode: lastNode,\n next: next,\n match: match\n };\n}\n\nfunction matchGroup(lexer, syntaxNode, node) {\n var result = [];\n var buffer;\n var multiplier = syntaxNode.multiplier || MULTIPLIER_DEFAULT;\n var min = multiplier.min;\n var max = multiplier.max === 0 ? Infinity : multiplier.max;\n var lastCommaTermCount;\n var lastComma;\n var matchCount = 0;\n var lastNode = null;\n var badNode = null;\n\n mismatch:\n while (matchCount < max) {\n node = skipSpaces(node);\n buffer = [];\n\n switch (syntaxNode.combinator) {\n case '|':\n for (var i = 0; i < syntaxNode.terms.length; i++) {\n var term = syntaxNode.terms[i];\n var res = matchSyntax(lexer, term, node);\n\n if (res.match) {\n putResult(buffer, res.match);\n node = res.next;\n break; // continue matching\n } else if (res.badNode) {\n badNode = res.badNode;\n break mismatch;\n } else if (res.lastNode) {\n lastNode = res.lastNode;\n }\n }\n\n if (buffer.length === 0) {\n break mismatch; // nothing found -> stop matching\n }\n\n break;\n\n case ' ':\n var beforeMatchNode = node;\n var lastMatchedTerm = null;\n var hasTailMatch = false;\n var commaMissed = false;\n\n for (var i = 0; i < syntaxNode.terms.length; i++) {\n var term = syntaxNode.terms[i];\n var res = matchSyntax(lexer, term, node);\n\n if (res.match) {\n if (term.type === 'Comma' && i !== 0 && !hasTailMatch) {\n // recover cursor to state before last match and stop matching\n lastNode = node && node.data;\n node = beforeMatchNode;\n break mismatch;\n }\n\n // non-empty match (res.next will refer to another node)\n if (res.next !== node) {\n // match should be preceded by a comma\n if (commaMissed) {\n lastNode = node && node.data;\n node = beforeMatchNode;\n break mismatch;\n }\n\n hasTailMatch = term.type !== 'Comma';\n lastMatchedTerm = term;\n }\n\n putResult(buffer, res.match);\n node = skipSpaces(res.next);\n } else if (res.badNode) {\n badNode = res.badNode;\n break mismatch;\n } else {\n if (res.lastNode) {\n lastNode = res.lastNode;\n }\n\n // it's ok when comma doesn't match when no matches yet\n // but only if comma is not first or last term\n if (term.type === 'Comma' && i !== 0 && i !== syntaxNode.terms.length - 1) {\n if (hasTailMatch) {\n commaMissed = true;\n }\n continue;\n }\n\n // recover cursor to state before last match and stop matching\n lastNode = res.lastNode || (node && node.data);\n node = beforeMatchNode;\n break mismatch;\n }\n }\n\n // don't allow empty match when [ ]!\n if (!lastMatchedTerm && syntaxNode.disallowEmpty) {\n // empty match but shouldn't\n // recover cursor to state before last match and stop matching\n lastNode = node && node.data;\n node = beforeMatchNode;\n break mismatch;\n }\n\n // don't allow comma at the end but only if last term isn't a comma\n if (lastMatchedTerm && lastMatchedTerm.type === 'Comma' && term.type !== 'Comma') {\n lastNode = node && node.data;\n node = beforeMatchNode;\n break mismatch;\n }\n\n break;\n\n case '&&':\n var beforeMatchNode = node;\n var lastMatchedTerm = null;\n var terms = syntaxNode.terms.slice();\n\n while (terms.length) {\n var wasMatch = false;\n var emptyMatched = 0;\n\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i];\n var res = matchSyntax(lexer, term, node);\n\n if (res.match) {\n // non-empty match (res.next will refer to another node)\n if (res.next !== node) {\n lastMatchedTerm = term;\n } else {\n emptyMatched++;\n continue;\n }\n\n wasMatch = true;\n terms.splice(i--, 1);\n putResult(buffer, res.match);\n node = skipSpaces(res.next);\n break;\n } else if (res.badNode) {\n badNode = res.badNode;\n break mismatch;\n } else if (res.lastNode) {\n lastNode = res.lastNode;\n }\n }\n\n if (!wasMatch) {\n // terms left, but they all are optional\n if (emptyMatched === terms.length) {\n break;\n }\n\n // not ok\n lastNode = node && node.data;\n node = beforeMatchNode;\n break mismatch;\n }\n }\n\n if (!lastMatchedTerm && syntaxNode.disallowEmpty) { // don't allow empty match when [ ]!\n // empty match but shouldn't\n // recover cursor to state before last match and stop matching\n lastNode = node && node.data;\n node = beforeMatchNode;\n break mismatch;\n }\n\n break;\n\n case '||':\n var beforeMatchNode = node;\n var lastMatchedTerm = null;\n var terms = syntaxNode.terms.slice();\n\n while (terms.length) {\n var wasMatch = false;\n var emptyMatched = 0;\n\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i];\n var res = matchSyntax(lexer, term, node);\n\n if (res.match) {\n // non-empty match (res.next will refer to another node)\n if (res.next !== node) {\n lastMatchedTerm = term;\n } else {\n emptyMatched++;\n continue;\n }\n\n wasMatch = true;\n terms.splice(i--, 1);\n putResult(buffer, res.match);\n node = skipSpaces(res.next);\n break;\n } else if (res.badNode) {\n badNode = res.badNode;\n break mismatch;\n } else if (res.lastNode) {\n lastNode = res.lastNode;\n }\n }\n\n if (!wasMatch) {\n break;\n }\n }\n\n // don't allow empty match\n if (!lastMatchedTerm && (emptyMatched !== terms.length || syntaxNode.disallowEmpty)) {\n // empty match but shouldn't\n // recover cursor to state before last match and stop matching\n lastNode = node && node.data;\n node = beforeMatchNode;\n break mismatch;\n }\n\n break;\n }\n\n // flush buffer\n result.push.apply(result, buffer);\n matchCount++;\n\n if (!node) {\n break;\n }\n\n if (multiplier.comma) {\n if (lastComma && lastCommaTermCount === result.length) {\n // nothing match after comma\n break mismatch;\n }\n\n node = skipSpaces(node);\n if (node !== null && node.data.type === 'Operator' && node.data.value === ',') {\n result.push({\n syntax: syntaxNode,\n match: [{\n type: 'ASTNode',\n node: node.data,\n childrenMatch: null\n }]\n });\n lastCommaTermCount = result.length;\n lastComma = node;\n node = node.next;\n } else {\n lastNode = node !== null ? node.data : null;\n break mismatch;\n }\n }\n }\n\n // console.log(syntaxNode.type, badNode, lastNode);\n\n if (lastComma && lastCommaTermCount === result.length) {\n // nothing match after comma\n node = lastComma;\n result.pop();\n }\n\n return buildMatchNode(badNode, lastNode, node, matchCount < min ? null : {\n syntax: syntaxNode,\n match: result,\n toJSON: matchToJSON\n });\n}\n\nfunction matchSyntax(lexer, syntaxNode, node) {\n var badNode = null;\n var lastNode = null;\n var match = null;\n\n switch (syntaxNode.type) {\n case 'Group':\n return matchGroup(lexer, syntaxNode, node);\n\n case 'Function':\n // expect a function node\n if (!node || node.data.type !== 'Function') {\n break;\n }\n\n var keyword = names.keyword(node.data.name);\n var name = syntaxNode.name.toLowerCase();\n\n // check function name with vendor consideration\n if (name !== keyword.vendor + keyword.name) {\n break;\n }\n\n var res = matchSyntax(lexer, syntaxNode.children, node.data.children.head);\n if (!res.match || res.next) {\n badNode = res.badNode || res.lastNode || (res.next ? res.next.data : null) || node.data;\n break;\n }\n\n match = [{\n type: 'ASTNode',\n node: node.data,\n childrenMatch: res.match.match\n }];\n\n // Use node.next instead of res.next here since syntax is matching\n // for internal list and it should be completelly matched (res.next is null at this point).\n // Therefore function is matched and we are going to next node\n node = node.next;\n break;\n\n case 'Parentheses':\n if (!node || node.data.type !== 'Parentheses') {\n break;\n }\n\n var res = matchSyntax(lexer, syntaxNode.children, node.data.children.head);\n if (!res.match || res.next) {\n badNode = res.badNode || res.lastNode || (res.next ? res.next.data : null) || node.data; // TODO: case when res.next === null\n break;\n }\n\n match = [{\n type: 'ASTNode',\n node: node.data,\n childrenMatch: res.match.match\n }];\n\n node = res.next;\n break;\n\n case 'Type':\n var typeSyntax = lexer.getType(syntaxNode.name);\n if (!typeSyntax) {\n throw new Error('Unknown syntax type `' + syntaxNode.name + '`');\n }\n\n var res = typeSyntax.match(node);\n if (!res.match) {\n badNode = res && res.badNode; // TODO: case when res.next === null\n lastNode = (res && res.lastNode) || (node && node.data);\n break;\n }\n\n node = res.next;\n putResult(match = [], res.match);\n if (match.length === 0) {\n match = null;\n }\n break;\n\n case 'Property':\n var propertySyntax = lexer.getProperty(syntaxNode.name);\n if (!propertySyntax) {\n throw new Error('Unknown property `' + syntaxNode.name + '`');\n }\n\n var res = propertySyntax.match(node);\n if (!res.match) {\n badNode = res && res.badNode; // TODO: case when res.next === null\n lastNode = (res && res.lastNode) || (node && node.data);\n break;\n }\n\n node = res.next;\n putResult(match = [], res.match);\n if (match.length === 0) {\n match = null;\n }\n break;\n\n case 'Keyword':\n if (!node) {\n break;\n }\n\n if (node.data.type === 'Identifier') {\n var keyword = names.keyword(node.data.name);\n var keywordName = keyword.name;\n var name = syntaxNode.name.toLowerCase();\n\n // drop \\0 and \\9 hack from keyword name\n if (keywordName.indexOf('\\\\') !== -1) {\n keywordName = keywordName.replace(/\\\\[09].*$/, '');\n }\n\n if (name !== keyword.vendor + keywordName) {\n break;\n }\n } else {\n // keyword may to be a number (e.g. font-weight: 400 )\n if (node.data.type !== 'Number' || node.data.value !== syntaxNode.name) {\n break;\n }\n }\n\n match = [{\n type: 'ASTNode',\n node: node.data,\n childrenMatch: null\n }];\n node = node.next;\n break;\n\n case 'Slash':\n case 'Comma':\n if (!node || node.data.type !== 'Operator' || node.data.value !== syntaxNode.value) {\n break;\n }\n\n match = [{\n type: 'ASTNode',\n node: node.data,\n childrenMatch: null\n }];\n node = node.next;\n break;\n\n case 'String':\n if (!node || node.data.type !== 'String') {\n break;\n }\n\n match = [{\n type: 'ASTNode',\n node: node.data,\n childrenMatch: null\n }];\n node = node.next;\n break;\n\n case 'ASTNode':\n if (node && syntaxNode.match(node)) {\n match = {\n type: 'ASTNode',\n node: node.data,\n childrenMatch: null\n };\n node = node.next;\n }\n return buildMatchNode(badNode, lastNode, node, match);\n\n default:\n throw new Error('Not implemented yet node type: ' + syntaxNode.type);\n }\n\n return buildMatchNode(badNode, lastNode, node, match === null ? null : {\n syntax: syntaxNode,\n match: match,\n toJSON: matchToJSON\n });\n\n};\n\nmodule.exports = matchSyntax;\n","function getTrace(node) {\n function hasMatch(matchNode) {\n if (matchNode.type === 'ASTNode') {\n if (matchNode.node === node) {\n result = [];\n return true;\n }\n\n if (matchNode.childrenMatch) {\n // use for-loop for better perfomance\n for (var i = 0; i < matchNode.childrenMatch.length; i++) {\n if (hasMatch(matchNode.childrenMatch[i])) {\n return true;\n }\n }\n }\n } else {\n // use for-loop for better perfomance\n for (var i = 0; i < matchNode.match.length; i++) {\n if (hasMatch(matchNode.match[i])) {\n if (matchNode.syntax.type === 'Type' ||\n matchNode.syntax.type === 'Property' ||\n matchNode.syntax.type === 'Keyword') {\n result.unshift(matchNode.syntax);\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n var result = null;\n\n if (this.matched !== null) {\n hasMatch(this.matched);\n }\n\n return result;\n}\n\nfunction testNode(match, node, fn) {\n var trace = getTrace.call(match, node);\n\n if (trace === null) {\n return false;\n }\n\n return trace.some(fn);\n}\n\nfunction isType(node, type) {\n return testNode(this, node, function(matchNode) {\n return matchNode.type === 'Type' && matchNode.name === type;\n });\n}\n\nfunction isProperty(node, property) {\n return testNode(this, node, function(matchNode) {\n return matchNode.type === 'Property' && matchNode.name === property;\n });\n}\n\nfunction isKeyword(node) {\n return testNode(this, node, function(matchNode) {\n return matchNode.type === 'Keyword';\n });\n}\n\nmodule.exports = {\n getTrace: getTrace,\n isType: isType,\n isProperty: isProperty,\n isKeyword: isKeyword\n};\n","var List = require('../utils/list');\n\nfunction getFirstMatchNode(matchNode) {\n if (matchNode.type === 'ASTNode') {\n return matchNode.node;\n }\n\n if (matchNode.match.length !== 0) {\n return getFirstMatchNode(matchNode.match[0]);\n }\n\n return null;\n}\n\nfunction getLastMatchNode(matchNode) {\n if (matchNode.type === 'ASTNode') {\n return matchNode.node;\n }\n\n if (matchNode.match.length !== 0) {\n return getLastMatchNode(matchNode.match[matchNode.match.length - 1]);\n }\n\n return null;\n}\n\nfunction matchFragments(lexer, ast, match, type, name) {\n function findFragments(matchNode) {\n if (matchNode.type === 'ASTNode') {\n return;\n }\n\n if (matchNode.syntax.type === type &&\n matchNode.syntax.name === name) {\n var start = getFirstMatchNode(matchNode);\n var end = getLastMatchNode(matchNode);\n\n lexer.syntax.walk(ast, function(node, item, list) {\n if (node === start) {\n var nodes = new List();\n var loc = null;\n\n do {\n nodes.appendData(item.data);\n\n if (item.data === end) {\n break;\n }\n\n item = item.next;\n } while (item !== null);\n\n if (start.loc !== null && end.loc !== null) {\n loc = {\n source: start.loc.source,\n start: start.loc.start,\n end: end.loc.end\n };\n }\n\n fragments.push({\n parent: list,\n loc: loc,\n nodes: nodes\n });\n }\n });\n }\n\n matchNode.match.forEach(findFragments);\n }\n\n var fragments = [];\n\n if (match.matched !== null) {\n findFragments(match.matched);\n }\n\n return fragments;\n}\n\nmodule.exports = {\n matchFragments: matchFragments\n};\n","var List = require('../utils/list');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction isValidNumber(value) {\n // Number.isInteger(value) && value >= 0\n return (\n typeof value === 'number' &&\n isFinite(value) &&\n Math.floor(value) === value &&\n value >= 0\n );\n}\n\nfunction isValidLocation(loc) {\n return (\n Boolean(loc) &&\n isValidNumber(loc.offset) &&\n isValidNumber(loc.line) &&\n isValidNumber(loc.column)\n );\n}\n\nfunction createNodeStructureChecker(type, fields) {\n return function checkNode(node, warn) {\n if (!node || node.constructor !== Object) {\n return warn(node, 'Type of node should be an Object');\n }\n\n for (var key in node) {\n var valid = true;\n\n if (hasOwnProperty.call(node, key) === false) {\n continue;\n }\n\n if (key === 'type') {\n if (node.type !== type) {\n warn(node, 'Wrong node type `' + node.type + '`, expected `' + type + '`');\n }\n } else if (key === 'loc') {\n if (node.loc === null) {\n continue;\n } else if (node.loc && node.loc.constructor === Object) {\n if (typeof node.loc.source !== 'string') {\n key += '.source';\n } else if (!isValidLocation(node.loc.start)) {\n key += '.start';\n } else if (!isValidLocation(node.loc.end)) {\n key += '.end';\n } else {\n continue;\n }\n }\n\n valid = false;\n } else if (fields.hasOwnProperty(key)) {\n for (var i = 0, valid = false; !valid && i < fields[key].length; i++) {\n var fieldType = fields[key][i];\n\n switch (fieldType) {\n case String:\n valid = typeof node[key] === 'string';\n break;\n\n case Boolean:\n valid = typeof node[key] === 'boolean';\n break;\n\n case null:\n valid = node[key] === null;\n break;\n\n default:\n if (typeof fieldType === 'string') {\n valid = node[key] && node[key].type === fieldType;\n } else if (Array.isArray(fieldType)) {\n valid = node[key] instanceof List;\n }\n }\n }\n } else {\n warn(node, 'Unknown field `' + key + '` for ' + type + ' node type');\n }\n\n if (!valid) {\n warn(node, 'Bad value for `' + type + '.' + key + '`');\n }\n }\n\n for (var key in fields) {\n if (hasOwnProperty.call(fields, key) &&\n hasOwnProperty.call(node, key) === false) {\n warn(node, 'Field `' + type + '.' + key + '` is missed');\n }\n }\n };\n}\n\nfunction processStructure(name, nodeType) {\n var structure = nodeType.structure;\n var fields = {\n type: String,\n loc: true\n };\n var docs = {\n type: '\"' + name + '\"'\n };\n\n for (var key in structure) {\n if (hasOwnProperty.call(structure, key) === false) {\n continue;\n }\n\n var docsTypes = [];\n var fieldTypes = fields[key] = Array.isArray(structure[key])\n ? structure[key].slice()\n : [structure[key]];\n\n for (var i = 0; i < fieldTypes.length; i++) {\n var fieldType = fieldTypes[i];\n if (fieldType === String || fieldType === Boolean) {\n docsTypes.push(fieldType.name);\n } else if (fieldType === null) {\n docsTypes.push('null');\n } else if (typeof fieldType === 'string') {\n docsTypes.push('<' + fieldType + '>');\n } else if (Array.isArray(fieldType)) {\n docsTypes.push('List'); // TODO: use type enum\n } else {\n throw new Error('Wrong value `' + fieldType + '` in `' + name + '.' + key + '` structure definition');\n }\n }\n\n docs[key] = docsTypes.join(' | ');\n }\n\n return {\n docs: docs,\n check: createNodeStructureChecker(name, fields)\n };\n}\n\nmodule.exports = {\n getStructureFromConfig: function(config) {\n var structure = {};\n\n if (config.node) {\n for (var name in config.node) {\n if (hasOwnProperty.call(config.node, name)) {\n var nodeType = config.node[name];\n\n if (nodeType.structure) {\n structure[name] = processStructure(name, nodeType);\n } else {\n throw new Error('Missed `structure` field in `' + name + '` node type definition');\n }\n }\n }\n }\n\n return structure;\n }\n};\n","'use strict';\n\nvar SyntaxReferenceError = require('./error').SyntaxReferenceError;\nvar MatchError = require('./error').MatchError;\nvar names = require('../utils/names');\nvar generic = require('./generic');\nvar parse = require('./grammar/parse');\nvar translate = require('./grammar/translate');\nvar walk = require('./grammar/walk');\nvar match = require('./match');\nvar trace = require('./trace');\nvar search = require('./search');\nvar getStructureFromConfig = require('./structure').getStructureFromConfig;\nvar cssWideKeywords = parse('inherit | initial | unset');\nvar cssWideKeywordsWithExpression = parse('inherit | initial | unset | <expression>');\n\nfunction dumpMapSyntax(map, syntaxAsAst) {\n var result = {};\n\n for (var name in map) {\n if (map[name].syntax) {\n result[name] = syntaxAsAst ? map[name].syntax : translate(map[name].syntax);\n }\n }\n\n return result;\n}\n\nfunction unwrapNode(item) {\n return item && item.data;\n}\n\nfunction valueHasVar(value) {\n var hasVar = false;\n\n this.syntax.walk(value, function(node) {\n if (node.type === 'Function' && node.name.toLowerCase() === 'var') {\n hasVar = true;\n }\n });\n\n return hasVar;\n}\n\n// check node is \\0 or \\9 hack\nfunction isHack(node) {\n return node.type === 'Identifier' && /^\\\\[09]/.test(node.name);\n}\n\n// white spaces, comments and some hacks can to be ignored at the end of value\nfunction isNextMayToBeIgnored(cursor) {\n while (cursor !== null) {\n if (cursor.data.type !== 'WhiteSpace' &&\n cursor.data.type !== 'Comment' &&\n !isHack(cursor.data)) {\n return false;\n }\n\n cursor = cursor.next;\n }\n\n return true;\n}\n\nfunction buildMatchResult(match, error) {\n return {\n matched: match,\n error: error,\n getTrace: trace.getTrace,\n isType: trace.isType,\n isProperty: trace.isProperty,\n isKeyword: trace.isKeyword\n };\n}\n\nfunction matchSyntax(lexer, syntax, value) {\n var result;\n\n if (!value || value.type !== 'Value') {\n return buildMatchResult(null, new Error('Not a Value node'));\n }\n\n if (valueHasVar.call(lexer, value)) {\n return buildMatchResult(null, new Error('Matching for a value with var() is not supported'));\n }\n\n result = match(lexer, lexer.valueCommonSyntax, value.children.head);\n\n if (!result.match) {\n result = syntax.match(value.children.head);\n if (!result.match) {\n return buildMatchResult(null, new MatchError('Mismatch', lexer, syntax.syntax, value, result.badNode || unwrapNode(result.next) || value));\n }\n }\n\n // enhance top-level match wrapper\n if (result.match.type === 'ASTNode') {\n result.match = {\n syntax: {\n type: syntax.type,\n name: syntax.name\n },\n match: [result.match]\n };\n } else if (result.match.syntax.type === 'Group') {\n result.match.syntax = {\n type: syntax.type,\n name: syntax.name\n };\n }\n\n if (result.next && !isNextMayToBeIgnored(result.next)) {\n return buildMatchResult(null, new MatchError('Uncomplete match', lexer, syntax.syntax, value, result.badNode || unwrapNode(result.next) || value));\n }\n\n return buildMatchResult(result.match, null);\n}\n\nvar Lexer = function(config, syntax, structure) {\n this.valueCommonSyntax = cssWideKeywords;\n this.syntax = syntax;\n this.generic = false;\n this.properties = {};\n this.types = {};\n this.structure = structure || getStructureFromConfig(config);\n\n if (config) {\n if (config.generic) {\n this.generic = true;\n for (var name in generic) {\n this.addType_(name, generic[name]);\n }\n }\n\n if (config.types) {\n for (var name in config.types) {\n this.addType_(name, config.types[name]);\n }\n }\n\n if (config.properties) {\n for (var name in config.properties) {\n this.addProperty_(name, config.properties[name]);\n }\n }\n }\n};\n\nLexer.prototype = {\n structure: {},\n checkStructure: function(ast) {\n function collectWarning(node, message) {\n warns.push({\n node: node,\n message: message\n });\n }\n\n var structure = this.structure;\n var warns = [];\n\n this.syntax.walk(ast, function(node) {\n if (structure.hasOwnProperty(node.type)) {\n structure[node.type].check(node, collectWarning);\n } else {\n collectWarning(node, 'Unknown node type `' + node.type + '`');\n }\n });\n\n return warns.length ? warns : false;\n },\n\n createDescriptor: function(syntax, type, name) {\n var self = this;\n var descriptor = {\n type: type,\n name: name,\n syntax: null,\n match: null\n };\n\n if (typeof syntax === 'function') {\n // convert syntax to pseudo syntax node\n // NOTE: that's not a part of match result tree\n syntax = {\n type: 'ASTNode',\n match: syntax\n };\n\n descriptor.match = function(item) {\n return match(self, syntax, item);\n };\n } else {\n if (typeof syntax === 'string') {\n // lazy parsing on first access\n Object.defineProperty(descriptor, 'syntax', {\n get: function() {\n Object.defineProperty(descriptor, 'syntax', {\n value: parse(syntax)\n });\n\n return descriptor.syntax;\n }\n });\n } else {\n descriptor.syntax = syntax;\n }\n\n descriptor.match = function(item) {\n return match(self, descriptor.syntax, item);\n };\n }\n\n return descriptor;\n },\n addProperty_: function(name, syntax) {\n this.properties[name] = this.createDescriptor(syntax, 'Property', name);\n },\n addType_: function(name, syntax) {\n this.types[name] = this.createDescriptor(syntax, 'Type', name);\n\n if (syntax === generic.expression) {\n this.valueCommonSyntax = cssWideKeywordsWithExpression;\n }\n },\n\n matchDeclaration: function(node) {\n if (node.type !== 'Declaration') {\n return buildMatchResult(null, new Error('Not a Declaration node'));\n }\n\n return this.matchProperty(node.property, node.value);\n },\n matchProperty: function(propertyName, value) {\n var property = names.property(propertyName);\n\n // don't match syntax for a custom property\n if (property.custom) {\n return buildMatchResult(null, new Error('Lexer matching doesn\\'t applicable for custom properties'));\n }\n\n var propertySyntax = property.vendor\n ? this.getProperty(property.vendor + property.name) || this.getProperty(property.name)\n : this.getProperty(property.name);\n\n if (!propertySyntax) {\n return buildMatchResult(null, new SyntaxReferenceError('Unknown property', propertyName));\n }\n\n return matchSyntax(this, propertySyntax, value);\n },\n matchType: function(typeName, value) {\n var typeSyntax = this.getType(typeName);\n\n if (!typeSyntax) {\n return buildMatchResult(null, new SyntaxReferenceError('Unknown type', typeName));\n }\n\n return matchSyntax(this, typeSyntax, value);\n },\n\n findValueFragments: function(propertyName, value, type, name) {\n return search.matchFragments(this, value, this.matchProperty(propertyName, value), type, name);\n },\n findDeclarationValueFragments: function(declaration, type, name) {\n return search.matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name);\n },\n findAllFragments: function(ast, type, name) {\n var result = [];\n\n this.syntax.walkDeclarations(ast, function(declaration) {\n result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name));\n }.bind(this));\n\n return result;\n },\n\n getProperty: function(name) {\n return this.properties.hasOwnProperty(name) ? this.properties[name] : null;\n },\n getType: function(name) {\n return this.types.hasOwnProperty(name) ? this.types[name] : null;\n },\n\n validate: function() {\n function validate(syntax, name, broken, descriptor) {\n if (broken.hasOwnProperty(name)) {\n return broken[name];\n }\n\n broken[name] = false;\n if (descriptor.syntax !== null) {\n walk(descriptor.syntax, function(node) {\n if (node.type !== 'Type' && node.type !== 'Property') {\n return;\n }\n\n var map = node.type === 'Type' ? syntax.types : syntax.properties;\n var brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;\n\n if (!map.hasOwnProperty(node.name) || validate(syntax, node.name, brokenMap, map[node.name])) {\n broken[name] = true;\n }\n }, this);\n }\n }\n\n var brokenTypes = {};\n var brokenProperties = {};\n\n for (var key in this.types) {\n validate(this, key, brokenTypes, this.types[key]);\n }\n\n for (var key in this.properties) {\n validate(this, key, brokenProperties, this.properties[key]);\n }\n\n brokenTypes = Object.keys(brokenTypes).filter(function(name) {\n return brokenTypes[name];\n });\n brokenProperties = Object.keys(brokenProperties).filter(function(name) {\n return brokenProperties[name];\n });\n\n if (brokenTypes.length || brokenProperties.length) {\n return {\n types: brokenTypes,\n properties: brokenProperties\n };\n }\n\n return null;\n },\n dump: function(syntaxAsAst) {\n return {\n generic: this.generic,\n types: dumpMapSyntax(this.types, syntaxAsAst),\n properties: dumpMapSyntax(this.properties, syntaxAsAst)\n };\n },\n toString: function() {\n return JSON.stringify(this.dump());\n }\n};\n\nmodule.exports = Lexer;\n","'use strict';\n\nvar Tokenizer = require('../tokenizer');\nvar sequence = require('./sequence');\nvar noop = function() {};\n\nfunction createParseContext(name) {\n return function() {\n return this[name]();\n };\n}\n\nfunction processConfig(config) {\n var parserConfig = {\n context: {},\n scope: {},\n atrule: {},\n pseudo: {}\n };\n\n if (config.parseContext) {\n for (var name in config.parseContext) {\n switch (typeof config.parseContext[name]) {\n case 'function':\n parserConfig.context[name] = config.parseContext[name];\n break;\n\n case 'string':\n parserConfig.context[name] = createParseContext(config.parseContext[name]);\n break;\n }\n }\n }\n\n if (config.scope) {\n for (var name in config.scope) {\n parserConfig.scope[name] = config.scope[name];\n }\n }\n\n if (config.atrule) {\n for (var name in config.atrule) {\n var atrule = config.atrule[name];\n\n if (atrule.parse) {\n parserConfig.atrule[name] = atrule.parse;\n }\n }\n }\n\n if (config.pseudo) {\n for (var name in config.pseudo) {\n var pseudo = config.pseudo[name];\n\n if (pseudo.parse) {\n parserConfig.pseudo[name] = pseudo.parse;\n }\n }\n }\n\n if (config.node) {\n for (var name in config.node) {\n parserConfig[name] = config.node[name].parse;\n }\n }\n\n return parserConfig;\n}\n\nmodule.exports = function createParser(config) {\n var parser = {\n scanner: new Tokenizer(),\n filename: '<unknown>',\n needPositions: false,\n tolerant: false,\n onParseError: noop,\n parseAtrulePrelude: true,\n parseRulePrelude: true,\n parseValue: true,\n parseCustomProperty: false,\n\n readSequence: sequence,\n\n tolerantParse: function(consumer, fallback) {\n if (this.tolerant) {\n var start = this.scanner.currentToken;\n\n try {\n return consumer.call(this);\n } catch (e) {\n var fallbackNode = fallback.call(this, start);\n this.onParseError(e, fallbackNode);\n return fallbackNode;\n }\n } else {\n return consumer.call(this);\n }\n },\n\n getLocation: function(start, end) {\n if (this.needPositions) {\n return this.scanner.getLocationRange(\n start,\n end,\n this.filename\n );\n }\n\n return null;\n },\n getLocationFromList: function(list) {\n if (this.needPositions) {\n return this.scanner.getLocationRange(\n list.head !== null ? list.first().loc.start.offset - this.scanner.startOffset : this.scanner.tokenStart,\n list.head !== null ? list.last().loc.end.offset - this.scanner.startOffset : this.scanner.tokenStart,\n this.filename\n );\n }\n\n return null;\n }\n };\n\n config = processConfig(config || {});\n for (var key in config) {\n parser[key] = config[key];\n }\n\n return function(source, options) {\n options = options || {};\n\n var context = options.context || 'default';\n var ast;\n\n parser.scanner.setSource(source, options.offset, options.line, options.column);\n parser.filename = options.filename || '<unknown>';\n parser.needPositions = Boolean(options.positions);\n parser.tolerant = Boolean(options.tolerant);\n parser.onParseError = typeof options.onParseError === 'function' ? options.onParseError : noop;\n parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;\n parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;\n parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;\n parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;\n\n if (!parser.context.hasOwnProperty(context)) {\n throw new Error('Unknown context `' + context + '`');\n }\n\n ast = parser.context[context].call(parser, options);\n\n if (!parser.scanner.eof) {\n parser.scanner.error();\n }\n\n // console.log(JSON.stringify(ast, null, 4));\n return ast;\n };\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n throw new Error(\n 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n );\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap)\n : new BasicSourceMapConsumer(sourceMap);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: Optional. the column number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n if (!this._sources.has(needle.source)) {\n return [];\n }\n needle.source = this._sources.indexOf(needle.source);\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n if (this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n if (this.sourceRoot != null) {\n source = util.relative(this.sourceRoot, source);\n }\n if (!this._sources.has(source)) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n source = this._sources.indexOf(source);\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The only parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if (section.consumer.sourceRoot !== null) {\n source = util.join(section.consumer.sourceRoot, source);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n","'use strict';\n\nvar sourceMapGenerator = require('./sourceMap');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar noop = function() {};\n\nfunction each(processChunk, node) {\n var list = node.children;\n var cursor = list.head;\n\n while (cursor !== null) {\n this.generate(processChunk, cursor.data, cursor, list);\n cursor = cursor.next;\n }\n}\n\nfunction eachComma(processChunk, node) {\n var list = node.children;\n var cursor = list.head;\n\n while (cursor !== null) {\n if (cursor.prev) {\n processChunk(',');\n }\n\n this.generate(processChunk, cursor.data, cursor, list);\n cursor = cursor.next;\n }\n}\n\nfunction createGenerator(types) {\n var context = {\n generate: function(processChunk, node, item, list) {\n if (hasOwnProperty.call(types, node.type)) {\n types[node.type].call(this, processChunk, node, item, list);\n } else {\n throw new Error('Unknown node type: ' + node.type);\n }\n },\n each: each,\n eachComma: eachComma\n };\n\n return function(node, fn) {\n if (typeof fn !== 'function') {\n // default generator concats all chunks in a single string\n var buffer = [];\n context.generate(function(chunk) {\n buffer.push(chunk);\n }, node);\n return buffer.join('');\n }\n context.generate(fn, node);\n };\n}\n\nfunction createMarkupGenerator(types) {\n var context = {\n generate: function(processChunk, node, item, list) {\n if (hasOwnProperty.call(types, node.type)) {\n var nodeBuffer = [];\n types[node.type].call(this, function(chunk) {\n nodeBuffer.push(chunk);\n }, node, item, list);\n processChunk({\n node: node,\n value: nodeBuffer\n });\n } else {\n throw new Error('Unknown node type: ' + node.type);\n }\n },\n each: each,\n eachComma: eachComma\n };\n\n return function(node, enter, leave) {\n function updatePos(str) {\n for (var i = 0; i < str.length; i++) {\n if (str.charCodeAt(i) === 10) { // \\n\n line++;\n column = 0;\n } else {\n column++;\n }\n }\n\n return str;\n }\n\n function walk(node, buffer) {\n var value = node.value;\n\n enter(node.node, buffer, line, column);\n\n if (typeof value === 'string') {\n buffer += updatePos(value);\n } else {\n for (var i = 0; i < value.length; i++) {\n if (typeof value[i] === 'string') {\n buffer += updatePos(value[i]);\n } else {\n buffer = walk(value[i], buffer);\n }\n }\n }\n\n leave(node.node, buffer, line, column);\n\n return buffer;\n }\n\n if (typeof enter !== 'function') {\n enter = noop;\n }\n if (typeof leave !== 'function') {\n leave = noop;\n }\n\n var buffer = [];\n var line = 1;\n var column = 0;\n\n context.generate(function() {\n buffer.push.apply(buffer, arguments);\n }, node);\n\n return walk(buffer[0], '');\n };\n}\n\nfunction getTypesFromConfig(config) {\n var types = {};\n\n if (config.node) {\n for (var name in config.node) {\n var nodeType = config.node[name];\n\n types[name] = nodeType.generate;\n }\n }\n\n return types;\n}\n\nmodule.exports = function(config) {\n var types = getTypesFromConfig(config);\n var markupGenerator = createMarkupGenerator(types);\n\n return {\n translate: createGenerator(types),\n translateWithSourceMap: function(node) {\n return sourceMapGenerator(markupGenerator, node);\n },\n translateMarkup: markupGenerator\n };\n};\n\nmodule.exports.createGenerator = createGenerator;\nmodule.exports.createMarkupGenerator = createMarkupGenerator;\nmodule.exports.sourceMap = require('./sourceMap');\n","'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction walkRules(node, item, list) {\n switch (node.type) {\n case 'StyleSheet':\n var oldStylesheet = this.stylesheet;\n this.stylesheet = node;\n\n node.children.each(walkRules, this);\n\n this.stylesheet = oldStylesheet;\n break;\n\n case 'Atrule':\n if (node.block !== null) {\n var oldAtrule = this.atrule;\n this.atrule = node;\n\n walkRules.call(this, node.block);\n\n this.atrule = oldAtrule;\n }\n\n this.fn(node, item, list);\n break;\n\n case 'Rule':\n this.fn(node, item, list);\n\n var oldRule = this.rule;\n this.rule = node;\n\n walkRules.call(this, node.block);\n\n this.rule = oldRule;\n break;\n\n case 'Block':\n var oldBlock = this.block;\n this.block = node;\n\n node.children.each(walkRules, this);\n\n this.block = oldBlock;\n break;\n }\n}\n\nfunction walkRulesRight(node, item, list) {\n switch (node.type) {\n case 'StyleSheet':\n var oldStylesheet = this.stylesheet;\n this.stylesheet = node;\n\n node.children.eachRight(walkRulesRight, this);\n\n this.stylesheet = oldStylesheet;\n break;\n\n case 'Atrule':\n if (node.block !== null) {\n var oldAtrule = this.atrule;\n this.atrule = node;\n\n walkRulesRight.call(this, node.block);\n\n this.atrule = oldAtrule;\n }\n\n this.fn(node, item, list);\n break;\n\n case 'Rule':\n var oldRule = this.rule;\n this.rule = node;\n\n walkRulesRight.call(this, node.block);\n\n this.rule = oldRule;\n\n this.fn(node, item, list);\n break;\n\n case 'Block':\n var oldBlock = this.block;\n this.block = node;\n\n node.children.eachRight(walkRulesRight, this);\n\n this.block = oldBlock;\n break;\n }\n}\n\nfunction walkDeclarations(node) {\n switch (node.type) {\n case 'StyleSheet':\n var oldStylesheet = this.stylesheet;\n this.stylesheet = node;\n\n node.children.each(walkDeclarations, this);\n\n this.stylesheet = oldStylesheet;\n break;\n\n case 'Atrule':\n if (node.block !== null) {\n var oldAtrule = this.atrule;\n this.atrule = node;\n\n walkDeclarations.call(this, node.block);\n\n this.atrule = oldAtrule;\n }\n break;\n\n case 'Rule':\n var oldRule = this.rule;\n this.rule = node;\n\n if (node.block !== null) {\n walkDeclarations.call(this, node.block);\n }\n\n this.rule = oldRule;\n break;\n\n case 'Block':\n node.children.each(function(node, item, list) {\n if (node.type === 'Declaration') {\n this.fn(node, item, list);\n } else {\n walkDeclarations.call(this, node);\n }\n }, this);\n break;\n }\n}\n\nfunction getWalkersFromStructure(name, nodeType) {\n var structure = nodeType.structure;\n var walkers = [];\n\n for (var key in structure) {\n if (hasOwnProperty.call(structure, key) === false) {\n continue;\n }\n\n var fieldTypes = structure[key];\n var walker = {\n name: key,\n type: false,\n nullable: false\n };\n\n if (!Array.isArray(structure[key])) {\n fieldTypes = [structure[key]];\n }\n\n for (var i = 0; i < fieldTypes.length; i++) {\n var fieldType = fieldTypes[i];\n if (fieldType === null) {\n walker.nullable = true;\n } else if (typeof fieldType === 'string') {\n walker.type = 'node';\n } else if (Array.isArray(fieldType)) {\n walker.type = 'list';\n }\n }\n\n if (walker.type) {\n walkers.push(walker);\n }\n }\n\n if (walkers.length) {\n return {\n context: nodeType.walkContext,\n fields: walkers\n };\n }\n\n return null;\n}\n\nfunction getTypesFromConfig(config) {\n var types = {};\n\n if (config.node) {\n for (var name in config.node) {\n if (hasOwnProperty.call(config.node, name)) {\n var nodeType = config.node[name];\n\n if (nodeType.structure) {\n var walkers = getWalkersFromStructure(name, nodeType);\n if (walkers !== null) {\n types[name] = walkers;\n }\n } else {\n throw new Error('Missed `structure` field in `' + name + '` node type definition');\n }\n }\n }\n }\n\n return types;\n}\n\nfunction createContext(root, fn) {\n var context = {\n fn: fn,\n root: root,\n stylesheet: null,\n atrule: null,\n atrulePrelude: null,\n rule: null,\n selector: null,\n block: null,\n declaration: null,\n function: null\n };\n\n return context;\n}\n\nmodule.exports = function createWalker(config) {\n var types = getTypesFromConfig(config);\n var walkers = {};\n\n for (var name in types) {\n if (hasOwnProperty.call(types, name)) {\n var config = types[name];\n walkers[name] = Function('node', 'context', 'walk',\n (config.context ? 'var old = context.' + config.context + ';\\ncontext.' + config.context + ' = node;\\n' : '') +\n config.fields.map(function(field) {\n var line = field.type === 'list'\n ? 'node.' + field.name + '.each(walk);'\n : 'walk(node.' + field.name + ');';\n\n if (field.nullable) {\n line = 'if (node.' + field.name + ') {\\n ' + line + '}';\n }\n\n return line;\n }).join('\\n') +\n (config.context ? '\\ncontext.' + config.context + ' = old;' : '')\n );\n }\n }\n\n return {\n walk: function(root, fn) {\n function walk(node, item, list) {\n fn.call(context, node, item, list);\n if (walkers.hasOwnProperty(node.type)) {\n walkers[node.type](node, context, walk);\n }\n }\n\n var context = createContext(root, fn);\n\n walk(root);\n },\n walkUp: function(root, fn) {\n function walk(node, item, list) {\n if (walkers.hasOwnProperty(node.type)) {\n walkers[node.type](node, context, walk);\n }\n fn.call(context, node, item, list);\n }\n\n var context = createContext(root, fn);\n\n walk(root);\n },\n walkRules: function(root, fn) {\n walkRules.call(createContext(root, fn), root);\n },\n walkRulesRight: function(root, fn) {\n walkRulesRight.call(createContext(root, fn), root);\n },\n walkDeclarations: function(root, fn) {\n walkDeclarations.call(createContext(root, fn), root);\n }\n };\n};\n","var hasOwnProperty = Object.prototype.hasOwnProperty;\nvar shape = {\n generic: true,\n types: {},\n properties: {},\n parseContext: {},\n scope: {},\n atrule: ['parse'],\n pseudo: ['parse'],\n node: ['name', 'structure', 'parse', 'generate', 'walkContext']\n};\n\nfunction isObject(value) {\n return value && value.constructor === Object;\n}\n\nfunction copy(value) {\n if (isObject(value)) {\n var res = {};\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n res[key] = value[key];\n }\n }\n return res;\n } else {\n return value;\n }\n}\n\nfunction extend(dest, src) {\n for (var key in src) {\n if (hasOwnProperty.call(src, key)) {\n if (isObject(dest[key])) {\n extend(dest[key], copy(src[key]));\n } else {\n dest[key] = copy(src[key]);\n }\n }\n }\n}\n\nfunction mix(dest, src, shape) {\n for (var key in shape) {\n if (hasOwnProperty.call(shape, key) === false) {\n continue;\n }\n\n if (shape[key] === true) {\n if (key in src) {\n if (hasOwnProperty.call(src, key)) {\n dest[key] = copy(src[key]);\n }\n }\n } else if (shape[key]) {\n if (isObject(shape[key])) {\n var res = {};\n extend(res, dest[key]);\n extend(res, src[key]);\n dest[key] = res;\n } else if (Array.isArray(shape[key])) {\n var res = {};\n var innerShape = shape[key].reduce(function(s, k) {\n s[k] = true;\n return s;\n }, {});\n for (var name in dest[key]) {\n if (hasOwnProperty.call(dest[key], name)) {\n res[name] = {};\n if (dest[key] && dest[key][name]) {\n mix(res[name], dest[key][name], innerShape);\n }\n }\n }\n for (var name in src[key]) {\n if (hasOwnProperty.call(src[key], name)) {\n if (!res[name]) {\n res[name] = {};\n }\n if (src[key] && src[key][name]) {\n mix(res[name], src[key][name], innerShape);\n }\n }\n }\n dest[key] = res;\n }\n }\n }\n return dest;\n}\n\nmodule.exports = function(dest, src) {\n return mix(dest, src, shape);\n};\n","var List = require('../utils/list');\nvar Tokenizer = require('../tokenizer');\nvar Lexer = require('../lexer/Lexer');\nvar grammar = require('../lexer/grammar');\nvar createParser = require('../parser/create');\nvar createGenerator = require('../generator/create');\nvar createConvertor = require('../convertor/create');\nvar createWalker = require('../walker/create');\nvar clone = require('../utils/clone');\nvar names = require('../utils/names');\nvar mix = require('./config/mix');\n\nfunction assign(dest, src) {\n for (var key in src) {\n dest[key] = src[key];\n }\n\n return dest;\n}\n\nfunction createSyntax(config) {\n var parse = createParser(config);\n var walker = createWalker(config);\n var generator = createGenerator(config);\n var convertor = createConvertor(walker);\n\n var syntax = {\n List: List,\n Tokenizer: Tokenizer,\n Lexer: Lexer,\n\n property: names.property,\n keyword: names.keyword,\n\n grammar: grammar,\n lexer: null,\n createLexer: function(config) {\n return new Lexer(config, syntax, syntax.lexer.structure);\n },\n\n parse: parse,\n\n walk: walker.walk,\n walkUp: walker.walkUp,\n walkRules: walker.walkRules,\n walkRulesRight: walker.walkRulesRight,\n walkDeclarations: walker.walkDeclarations,\n\n translate: generator.translate,\n translateWithSourceMap: generator.translateWithSourceMap,\n translateMarkup: generator.translateMarkup,\n\n clone: clone,\n fromPlainObject: convertor.fromPlainObject,\n toPlainObject: convertor.toPlainObject,\n\n createSyntax: function(config) {\n return createSyntax(mix({}, config));\n },\n fork: function(extension) {\n var base = mix({}, config); // copy of config\n return createSyntax(\n typeof extension === 'function'\n ? extension(base, assign)\n : mix(base, extension)\n );\n }\n };\n\n syntax.lexer = new Lexer({\n generic: true,\n types: config.types,\n properties: config.properties,\n node: config.node\n }, syntax);\n\n return syntax;\n};\n\nexports.create = function(config) {\n return createSyntax(mix({}, config));\n};\n","var mdnProperties = require('mdn-data/css/properties.json');\nvar mdnSyntaxes = require('mdn-data/css/syntaxes.json');\nvar patch = require('./patch.json');\nvar data = {\n properties: {},\n types: {}\n};\n\nfunction normalizeSyntax(syntax) {\n return syntax\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&');\n}\n\nfunction patchDict(dict, patchDict) {\n for (var key in patchDict) {\n if (key in dict) {\n if (patchDict[key].syntax) {\n dict[key].syntax = patchDict[key].syntax;\n } else {\n delete dict[key];\n }\n } else {\n if (patchDict[key].syntax) {\n dict[key] = patchDict[key];\n }\n }\n }\n}\n\n// apply patch\npatchDict(mdnProperties, patch.properties);\npatchDict(mdnSyntaxes, patch.syntaxes);\n\n// normalize source mdnProperties syntaxes, since it uses html token\nfor (var key in mdnProperties) {\n data.properties[key] = normalizeSyntax(mdnProperties[key].syntax);\n}\n\nfor (var key in mdnSyntaxes) {\n data.types[key] = normalizeSyntax(mdnSyntaxes[key].syntax);\n}\n\nmodule.exports = data;\n","var cmpChar = require('../../tokenizer').cmpChar;\nvar isNumber = require('../../tokenizer').isNumber;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar N = 110; // 'n'.charCodeAt(0)\nvar DISALLOW_SIGN = true;\nvar ALLOW_SIGN = false;\n\nfunction checkTokenIsInteger(scanner, disallowSign) {\n var pos = scanner.tokenStart;\n\n if (scanner.source.charCodeAt(pos) === PLUSSIGN ||\n scanner.source.charCodeAt(pos) === HYPHENMINUS) {\n if (disallowSign) {\n scanner.error();\n }\n pos++;\n }\n\n for (; pos < scanner.tokenEnd; pos++) {\n if (!isNumber(scanner.source.charCodeAt(pos))) {\n scanner.error('Unexpected input', pos);\n }\n }\n}\n\n// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb\nmodule.exports = {\n name: 'AnPlusB',\n structure: {\n a: [String, null],\n b: [String, null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var end = start;\n var prefix = '';\n var a = null;\n var b = null;\n\n if (this.scanner.tokenType === NUMBER ||\n this.scanner.tokenType === PLUSSIGN) {\n checkTokenIsInteger(this.scanner, ALLOW_SIGN);\n prefix = this.scanner.getTokenValue();\n this.scanner.next();\n end = this.scanner.tokenStart;\n }\n\n if (this.scanner.tokenType === IDENTIFIER) {\n var bStart = this.scanner.tokenStart;\n\n if (cmpChar(this.scanner.source, bStart, HYPHENMINUS)) {\n if (prefix === '') {\n prefix = '-';\n bStart++;\n } else {\n this.scanner.error('Unexpected hyphen minus');\n }\n }\n\n if (!cmpChar(this.scanner.source, bStart, N)) {\n this.scanner.error();\n }\n\n a = prefix === '' ? '1' :\n prefix === '+' ? '+1' :\n prefix === '-' ? '-1' :\n prefix;\n\n var len = this.scanner.tokenEnd - bStart;\n if (len > 1) {\n // ..n-..\n if (this.scanner.source.charCodeAt(bStart + 1) !== HYPHENMINUS) {\n this.scanner.error('Unexpected input', bStart + 1);\n }\n\n if (len > 2) {\n // ..n-{number}..\n this.scanner.tokenStart = bStart + 2;\n } else {\n // ..n- {number}\n this.scanner.next();\n this.scanner.skipSC();\n }\n\n checkTokenIsInteger(this.scanner, DISALLOW_SIGN);\n b = '-' + this.scanner.getTokenValue();\n this.scanner.next();\n end = this.scanner.tokenStart;\n } else {\n prefix = '';\n this.scanner.next();\n end = this.scanner.tokenStart;\n this.scanner.skipSC();\n\n if (this.scanner.tokenType === HYPHENMINUS ||\n this.scanner.tokenType === PLUSSIGN) {\n prefix = this.scanner.getTokenValue();\n this.scanner.next();\n this.scanner.skipSC();\n }\n\n if (this.scanner.tokenType === NUMBER) {\n checkTokenIsInteger(this.scanner, prefix !== '');\n\n if (!isNumber(this.scanner.source.charCodeAt(this.scanner.tokenStart))) {\n prefix = this.scanner.source.charAt(this.scanner.tokenStart);\n this.scanner.tokenStart++;\n }\n\n if (prefix === '') {\n // should be an operator before number\n this.scanner.error();\n } else if (prefix === '+') {\n // plus is using by default\n prefix = '';\n }\n\n b = prefix + this.scanner.getTokenValue();\n\n this.scanner.next();\n end = this.scanner.tokenStart;\n } else {\n if (prefix) {\n this.scanner.eat(NUMBER);\n }\n }\n }\n } else {\n if (prefix === '' || prefix === '+') { // no number\n this.scanner.error(\n 'Number or identifier is expected',\n this.scanner.tokenStart + (\n this.scanner.tokenType === PLUSSIGN ||\n this.scanner.tokenType === HYPHENMINUS\n )\n );\n }\n\n b = prefix;\n }\n\n return {\n type: 'AnPlusB',\n loc: this.getLocation(start, end),\n a: a,\n b: b\n };\n },\n generate: function(processChunk, node) {\n var a = node.a !== null && node.a !== undefined;\n var b = node.b !== null && node.b !== undefined;\n\n if (a) {\n processChunk(\n node.a === '+1' ? '+n' :\n node.a === '1' ? 'n' :\n node.a === '-1' ? '-n' :\n node.a + 'n'\n );\n\n if (b) {\n b = String(node.b);\n if (b.charAt(0) === '-' || b.charAt(0) === '+') {\n processChunk(b.charAt(0));\n processChunk(b.substr(1));\n } else {\n processChunk('+');\n processChunk(b);\n }\n }\n } else {\n processChunk(String(node.b));\n }\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar ATRULE = TYPE.Atrule;\nvar SEMICOLON = TYPE.Semicolon;\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\nvar RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, SEMICOLON, LEFTCURLYBRACKET, false, true);\n}\n\nfunction isDeclarationBlockAtrule() {\n for (var offset = 1, type; type = this.scanner.lookupType(offset); offset++) {\n if (type === RIGHTCURLYBRACKET) {\n return true;\n }\n\n if (type === LEFTCURLYBRACKET ||\n type === ATRULE) {\n return false;\n }\n }\n\n if (this.tolerant) {\n return false;\n }\n\n this.scanner.skip(offset);\n this.scanner.eat(RIGHTCURLYBRACKET);\n}\n\nmodule.exports = {\n name: 'Atrule',\n structure: {\n name: String,\n prelude: ['AtrulePrelude', 'Raw', null],\n block: ['Block', null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var name;\n var nameLowerCase;\n var prelude = null;\n var block = null;\n\n this.scanner.eat(ATRULE);\n\n name = this.scanner.substrToCursor(start + 1);\n nameLowerCase = name.toLowerCase();\n this.scanner.skipSC();\n\n // parse prelude\n if (this.scanner.eof === false &&\n this.scanner.tokenType !== LEFTCURLYBRACKET &&\n this.scanner.tokenType !== SEMICOLON) {\n if (this.parseAtrulePrelude) {\n var preludeStartToken = this.scanner.currentToken;\n prelude = this.tolerantParse(this.AtrulePrelude.bind(this, name), consumeRaw);\n\n if (this.tolerant && !this.scanner.eof) {\n if (prelude.type !== 'Raw' &&\n this.scanner.tokenType !== LEFTCURLYBRACKET &&\n this.scanner.tokenType !== SEMICOLON) {\n prelude = consumeRaw.call(this, preludeStartToken);\n }\n }\n\n // turn empty AtrulePrelude into null\n if (prelude.type === 'AtrulePrelude' && prelude.children.head === null) {\n prelude = null;\n }\n } else {\n prelude = consumeRaw.call(this, this.scanner.currentToken);\n }\n\n this.scanner.skipSC();\n }\n\n if (this.atrule.hasOwnProperty(nameLowerCase)) {\n if (typeof this.atrule[nameLowerCase].block === 'function') {\n if (this.scanner.tokenType !== LEFTCURLYBRACKET) {\n // FIXME: make tolerant\n this.scanner.error('Curly bracket is expected');\n }\n\n block = this.atrule[nameLowerCase].block.call(this);\n } else {\n if (!this.tolerant || !this.scanner.eof) {\n this.scanner.eat(SEMICOLON);\n }\n }\n } else {\n switch (this.scanner.tokenType) {\n case SEMICOLON:\n this.scanner.next();\n break;\n\n case LEFTCURLYBRACKET:\n // TODO: should consume block content as Raw?\n block = this.Block(isDeclarationBlockAtrule.call(this));\n break;\n\n default:\n if (!this.tolerant) {\n this.scanner.error('Semicolon or block is expected');\n }\n }\n }\n\n return {\n type: 'Atrule',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n prelude: prelude,\n block: block\n };\n },\n generate: function(processChunk, node) {\n processChunk('@');\n processChunk(node.name);\n\n if (node.prelude !== null) {\n processChunk(' ');\n this.generate(processChunk, node.prelude);\n }\n\n if (node.block) {\n this.generate(processChunk, node.block);\n } else {\n processChunk(';');\n }\n },\n walkContext: 'atrule'\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar STRING = TYPE.String;\nvar DOLLARSIGN = TYPE.DollarSign;\nvar ASTERISK = TYPE.Asterisk;\nvar COLON = TYPE.Colon;\nvar EQUALSSIGN = TYPE.EqualsSign;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;\nvar CIRCUMFLEXACCENT = TYPE.CircumflexAccent;\nvar VERTICALLINE = TYPE.VerticalLine;\nvar TILDE = TYPE.Tilde;\n\nfunction getAttributeName() {\n if (this.scanner.eof) {\n this.scanner.error('Unexpected end of input');\n }\n\n var start = this.scanner.tokenStart;\n var expectIdentifier = false;\n var checkColon = true;\n\n if (this.scanner.tokenType === ASTERISK) {\n expectIdentifier = true;\n checkColon = false;\n this.scanner.next();\n } else if (this.scanner.tokenType !== VERTICALLINE) {\n this.scanner.eat(IDENTIFIER);\n }\n\n if (this.scanner.tokenType === VERTICALLINE) {\n if (this.scanner.lookupType(1) !== EQUALSSIGN) {\n this.scanner.next();\n this.scanner.eat(IDENTIFIER);\n } else if (expectIdentifier) {\n this.scanner.error('Identifier is expected', this.scanner.tokenEnd);\n }\n } else if (expectIdentifier) {\n this.scanner.error('Vertical line is expected');\n }\n\n if (checkColon && this.scanner.tokenType === COLON) {\n this.scanner.next();\n this.scanner.eat(IDENTIFIER);\n }\n\n return {\n type: 'Identifier',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(start)\n };\n}\n\nfunction getOperator() {\n var start = this.scanner.tokenStart;\n var tokenType = this.scanner.tokenType;\n\n if (tokenType !== EQUALSSIGN && // =\n tokenType !== TILDE && // ~=\n tokenType !== CIRCUMFLEXACCENT && // ^=\n tokenType !== DOLLARSIGN && // $=\n tokenType !== ASTERISK && // *=\n tokenType !== VERTICALLINE // |=\n ) {\n this.scanner.error('Attribute selector (=, ~=, ^=, $=, *=, |=) is expected');\n }\n\n if (tokenType === EQUALSSIGN) {\n this.scanner.next();\n } else {\n this.scanner.next();\n this.scanner.eat(EQUALSSIGN);\n }\n\n return this.scanner.substrToCursor(start);\n}\n\n// '[' S* attrib_name ']'\n// '[' S* attrib_name S* attrib_matcher S* [ IDENT | STRING ] S* attrib_flags? S* ']'\nmodule.exports = {\n name: 'AttributeSelector',\n structure: {\n name: 'Identifier',\n matcher: [String, null],\n value: ['String', 'Identifier', null],\n flags: [String, null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var name;\n var matcher = null;\n var value = null;\n var flags = null;\n\n this.scanner.eat(LEFTSQUAREBRACKET);\n this.scanner.skipSC();\n\n name = getAttributeName.call(this);\n this.scanner.skipSC();\n\n if (this.scanner.tokenType !== RIGHTSQUAREBRACKET) {\n // avoid case `[name i]`\n if (this.scanner.tokenType !== IDENTIFIER) {\n matcher = getOperator.call(this);\n\n this.scanner.skipSC();\n\n value = this.scanner.tokenType === STRING\n ? this.String()\n : this.Identifier();\n\n this.scanner.skipSC();\n }\n\n // attribute flags\n if (this.scanner.tokenType === IDENTIFIER) {\n flags = this.scanner.getTokenValue();\n this.scanner.next();\n\n this.scanner.skipSC();\n }\n }\n\n this.scanner.eat(RIGHTSQUAREBRACKET);\n\n return {\n type: 'AttributeSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n matcher: matcher,\n value: value,\n flags: flags\n };\n },\n generate: function(processChunk, node) {\n var flagsPrefix = ' ';\n\n processChunk('[');\n this.generate(processChunk, node.name);\n\n if (node.matcher !== null) {\n processChunk(node.matcher);\n\n if (node.value !== null) {\n this.generate(processChunk, node.value);\n\n // space between string and flags is not required\n if (node.value.type === 'String') {\n flagsPrefix = '';\n }\n }\n }\n\n if (node.flags !== null) {\n processChunk(flagsPrefix);\n processChunk(node.flags);\n }\n\n processChunk(']');\n }\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar SEMICOLON = TYPE.Semicolon;\nvar ATRULE = TYPE.Atrule;\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\nvar RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, 0, 0, false, true);\n}\nfunction consumeRule() {\n return this.tolerantParse(this.Rule, consumeRaw);\n}\nfunction consumeRawDeclaration(startToken) {\n return this.Raw(startToken, 0, SEMICOLON, true, true);\n}\nfunction consumeDeclaration() {\n var node = this.tolerantParse(this.Declaration, consumeRawDeclaration);\n\n if (this.scanner.tokenType === SEMICOLON) {\n this.scanner.next();\n }\n\n return node;\n}\n\nmodule.exports = {\n name: 'Block',\n structure: {\n children: [['Atrule', 'Rule', 'Declaration']]\n },\n parse: function(isDeclaration) {\n var consumer = isDeclaration ? consumeDeclaration : consumeRule;\n\n var start = this.scanner.tokenStart;\n var children = new List();\n\n this.scanner.eat(LEFTCURLYBRACKET);\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case RIGHTCURLYBRACKET:\n break scan;\n\n case WHITESPACE:\n case COMMENT:\n this.scanner.next();\n break;\n\n case ATRULE:\n children.appendData(this.tolerantParse(this.Atrule, consumeRaw));\n break;\n\n default:\n children.appendData(consumer.call(this));\n }\n }\n\n if (!this.tolerant || !this.scanner.eof) {\n this.scanner.eat(RIGHTCURLYBRACKET);\n }\n\n return {\n type: 'Block',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(processChunk, node) {\n processChunk('{');\n this.each(processChunk, node);\n processChunk('}');\n },\n walkContext: 'block'\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar COLON = TYPE.Colon;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\nvar SOLIDUS = TYPE.Solidus;\nvar ASTERISK = TYPE.Asterisk;\nvar DOLLARSIGN = TYPE.DollarSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar SEMICOLON = TYPE.Semicolon;\nvar RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\nvar PLUSSIGN = TYPE.PlusSign;\nvar NUMBERSIGN = TYPE.NumberSign;\n\nmodule.exports = {\n name: 'Declaration',\n structure: {\n important: [Boolean, String],\n property: String,\n value: ['Value', 'Raw']\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var property = readProperty.call(this);\n var important = false;\n var value;\n\n this.scanner.skipSC();\n this.scanner.eat(COLON);\n\n if (isCustomProperty(property) ? this.parseCustomProperty : this.parseValue) {\n value = this.Value(property);\n } else {\n value = this.Raw(this.scanner.currentToken, EXCLAMATIONMARK, SEMICOLON, false, false);\n }\n\n if (this.scanner.tokenType === EXCLAMATIONMARK) {\n important = getImportant(this.scanner);\n this.scanner.skipSC();\n }\n\n // TODO: include or not to include semicolon to range?\n // if (this.scanner.tokenType === SEMICOLON) {\n // this.scanner.next();\n // }\n\n if (!this.scanner.eof &&\n this.scanner.tokenType !== SEMICOLON &&\n this.scanner.tokenType !== RIGHTPARENTHESIS &&\n this.scanner.tokenType !== RIGHTCURLYBRACKET) {\n this.scanner.error();\n }\n\n return {\n type: 'Declaration',\n loc: this.getLocation(start, this.scanner.tokenStart),\n important: important,\n property: property,\n value: value\n };\n },\n generate: function(processChunk, node, item) {\n processChunk(node.property);\n processChunk(':');\n this.generate(processChunk, node.value);\n\n if (node.important) {\n processChunk(node.important === true ? '!important' : '!' + node.important);\n }\n\n if (item && item.next) {\n processChunk(';');\n }\n },\n walkContext: 'declaration'\n};\n\nfunction isCustomProperty(name) {\n return name.length >= 2 &&\n name.charCodeAt(0) === HYPHENMINUS &&\n name.charCodeAt(1) === HYPHENMINUS;\n}\n\nfunction readProperty() {\n var start = this.scanner.tokenStart;\n var prefix = 0;\n\n // hacks\n switch (this.scanner.tokenType) {\n case ASTERISK:\n case DOLLARSIGN:\n case PLUSSIGN:\n case NUMBERSIGN:\n prefix = 1;\n break;\n\n // TODO: not sure we should support this hack\n case SOLIDUS:\n prefix = this.scanner.lookupType(1) === SOLIDUS ? 2 : 1;\n break;\n }\n\n if (this.scanner.lookupType(prefix) === HYPHENMINUS) {\n prefix++;\n }\n\n if (prefix) {\n this.scanner.skip(prefix);\n }\n\n this.scanner.eat(IDENTIFIER);\n\n return this.scanner.substrToCursor(start);\n}\n\n// ! ws* important\nfunction getImportant(scanner) {\n scanner.eat(EXCLAMATIONMARK);\n scanner.skipSC();\n\n var important = scanner.consume(IDENTIFIER);\n\n // store original value in case it differ from `important`\n // for better original source restoring and hacks like `!ie` support\n return important === 'important' ? true : important;\n}\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar SEMICOLON = TYPE.Semicolon;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, 0, SEMICOLON, true, true);\n}\n\nmodule.exports = {\n name: 'DeclarationList',\n structure: {\n children: [['Declaration']]\n },\n parse: function() {\n var children = new List();\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case WHITESPACE:\n case COMMENT:\n case SEMICOLON:\n this.scanner.next();\n break;\n\n default:\n children.appendData(this.tolerantParse(this.Declaration, consumeRaw));\n }\n }\n\n return {\n type: 'DeclarationList',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.each(processChunk, node);\n }\n};\n","var NUMBER = require('../../tokenizer').TYPE.Number;\n\n// special reader for units to avoid adjoined IE hacks (i.e. '1px\\9')\nfunction readUnit(scanner) {\n var unit = scanner.getTokenValue();\n var backSlashPos = unit.indexOf('\\\\');\n\n if (backSlashPos > 0) {\n // patch token offset\n scanner.tokenStart += backSlashPos;\n\n // return part before backslash\n return unit.substring(0, backSlashPos);\n }\n\n // no backslash in unit name\n scanner.next();\n\n return unit;\n}\n\n// number ident\nmodule.exports = {\n name: 'Dimension',\n structure: {\n value: String,\n unit: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var value = this.scanner.consume(NUMBER);\n var unit = readUnit(this.scanner);\n\n return {\n type: 'Dimension',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: value,\n unit: unit\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n processChunk(node.unit);\n }\n};\n","var isHex = require('../../tokenizer').isHex;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar NUMBERSIGN = TYPE.NumberSign;\n\nfunction consumeHexSequence(scanner, required) {\n if (!isHex(scanner.source.charCodeAt(scanner.tokenStart))) {\n if (required) {\n scanner.error('Unexpected input', scanner.tokenStart);\n } else {\n return;\n }\n }\n\n for (var pos = scanner.tokenStart + 1; pos < scanner.tokenEnd; pos++) {\n var code = scanner.source.charCodeAt(pos);\n\n // break on non-hex char\n if (!isHex(code)) {\n // break token, exclude symbol\n scanner.tokenStart = pos;\n return;\n }\n }\n\n // token is full hex sequence, go to next token\n scanner.next();\n}\n\n// # ident\nmodule.exports = {\n name: 'HexColor',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.eat(NUMBERSIGN);\n\n scan:\n switch (this.scanner.tokenType) {\n case NUMBER:\n consumeHexSequence(this.scanner, true);\n\n // if token is identifier then number consists of hex only,\n // try to add identifier to result\n if (this.scanner.tokenType === IDENTIFIER) {\n consumeHexSequence(this.scanner, false);\n }\n\n break;\n\n case IDENTIFIER:\n consumeHexSequence(this.scanner, true);\n break;\n\n default:\n this.scanner.error('Number or identifier is expected');\n }\n\n return {\n type: 'HexColor',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.substrToCursor(start + 1) // skip #\n };\n },\n generate: function(processChunk, node) {\n processChunk('#');\n processChunk(node.value);\n }\n};\n","var isNumber = require('../../tokenizer').isNumber;\nvar TYPE = require('../../tokenizer').TYPE;\nvar NUMBER = TYPE.Number;\nvar SOLIDUS = TYPE.Solidus;\nvar FULLSTOP = TYPE.FullStop;\n\n// Terms of <ratio> should to be a positive number (not zero or negative)\n// (see https://drafts.csswg.org/mediaqueries-3/#values)\n// However, -o-min-device-pixel-ratio takes fractional values as a ratio's term\n// and this is using by various sites. Therefore we relax checking on parse\n// to test a term is unsigned number without exponent part.\n// Additional checks may to be applied on lexer validation.\nfunction consumeNumber(scanner) {\n var value = scanner.consumeNonWS(NUMBER);\n\n for (var i = 0; i < value.length; i++) {\n var code = value.charCodeAt(i);\n if (!isNumber(code) && code !== FULLSTOP) {\n scanner.error('Unsigned number is expected', scanner.tokenStart - value.length + i);\n }\n }\n\n if (Number(value) === 0) {\n scanner.error('Zero number is not allowed', scanner.tokenStart - value.length);\n }\n\n return value;\n}\n\n// <positive-integer> S* '/' S* <positive-integer>\nmodule.exports = {\n name: 'Ratio',\n structure: {\n left: String,\n right: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var left = consumeNumber(this.scanner);\n var right;\n\n this.scanner.eatNonWS(SOLIDUS);\n right = consumeNumber(this.scanner);\n\n return {\n type: 'Ratio',\n loc: this.getLocation(start, this.scanner.tokenStart),\n left: left,\n right: right\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.left);\n processChunk('/');\n processChunk(node.right);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, LEFTCURLYBRACKET, 0, false, true);\n}\n\nmodule.exports = {\n name: 'Rule',\n structure: {\n prelude: ['SelectorList', 'Raw'],\n block: ['Block']\n },\n parse: function() {\n var startToken = this.scanner.currentToken;\n var startOffset = this.scanner.tokenStart;\n var prelude;\n var block;\n\n if (this.parseRulePrelude) {\n prelude = this.tolerantParse(this.SelectorList, consumeRaw);\n\n if (this.tolerant && !this.scanner.eof) {\n if (prelude.type !== 'Raw' && this.scanner.tokenType !== LEFTCURLYBRACKET) {\n prelude = consumeRaw.call(this, startToken);\n }\n }\n } else {\n prelude = consumeRaw.call(this, startToken);\n }\n\n block = this.Block(true);\n\n return {\n type: 'Rule',\n loc: this.getLocation(startOffset, this.scanner.tokenStart),\n prelude: prelude,\n block: block\n };\n },\n generate: function(processChunk, node) {\n this.generate(processChunk, node.prelude);\n this.generate(processChunk, node.block);\n },\n walkContext: 'rule'\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\nvar ATRULE = TYPE.Atrule;\nvar CDO = TYPE.CDO;\nvar CDC = TYPE.CDC;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, 0, 0, false, false);\n}\n\nmodule.exports = {\n name: 'StyleSheet',\n structure: {\n children: [['Comment', 'Atrule', 'Rule', 'Raw']]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var children = new List();\n var child;\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case WHITESPACE:\n this.scanner.next();\n continue;\n\n case COMMENT:\n // ignore comments except exclamation comments (i.e. /*! .. */) on top level\n if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK) {\n this.scanner.next();\n continue;\n }\n\n child = this.Comment();\n break;\n\n case CDO: // <!--\n child = this.CDO();\n break;\n\n case CDC: // -->\n child = this.CDC();\n break;\n\n // CSS Syntax Module Level 3\n // §2.2 Error handling\n // At the \"top level\" of a stylesheet, an <at-keyword-token> starts an at-rule.\n case ATRULE:\n child = this.Atrule();\n break;\n\n // Anything else starts a qualified rule ...\n default:\n child = this.tolerantParse(this.Rule, consumeRaw);\n }\n\n children.appendData(child);\n }\n\n return {\n type: 'StyleSheet',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.each(processChunk, node);\n },\n walkContext: 'stylesheet'\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar ASTERISK = TYPE.Asterisk;\nvar VERTICALLINE = TYPE.VerticalLine;\n\nfunction eatIdentifierOrAsterisk() {\n if (this.scanner.tokenType !== IDENTIFIER &&\n this.scanner.tokenType !== ASTERISK) {\n this.scanner.error('Identifier or asterisk is expected');\n }\n\n this.scanner.next();\n}\n\n// ident\n// ident|ident\n// ident|*\n// *\n// *|ident\n// *|*\n// |ident\n// |*\nmodule.exports = {\n name: 'TypeSelector',\n structure: {\n name: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n if (this.scanner.tokenType === VERTICALLINE) {\n this.scanner.next();\n eatIdentifierOrAsterisk.call(this);\n } else {\n eatIdentifierOrAsterisk.call(this);\n\n if (this.scanner.tokenType === VERTICALLINE) {\n this.scanner.next();\n eatIdentifierOrAsterisk.call(this);\n }\n }\n\n return {\n type: 'TypeSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(start)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.name);\n }\n};\n","var isHex = require('../../tokenizer').isHex;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar FULLSTOP = TYPE.FullStop;\nvar QUESTIONMARK = TYPE.QuestionMark;\n\nfunction scanUnicodeNumber(scanner) {\n for (var pos = scanner.tokenStart + 1; pos < scanner.tokenEnd; pos++) {\n var code = scanner.source.charCodeAt(pos);\n\n // break on fullstop or hyperminus/plussign after exponent\n if (code === FULLSTOP || code === PLUSSIGN) {\n // break token, exclude symbol\n scanner.tokenStart = pos;\n return false;\n }\n }\n\n return true;\n}\n\n// https://drafts.csswg.org/css-syntax-3/#urange\nfunction scanUnicodeRange(scanner) {\n var hexStart = scanner.tokenStart + 1; // skip +\n var hexLength = 0;\n\n scan: {\n if (scanner.tokenType === NUMBER) {\n if (scanner.source.charCodeAt(scanner.tokenStart) !== FULLSTOP && scanUnicodeNumber(scanner)) {\n scanner.next();\n } else if (scanner.source.charCodeAt(scanner.tokenStart) !== HYPHENMINUS) {\n break scan;\n }\n } else {\n scanner.next(); // PLUSSIGN\n }\n\n if (scanner.tokenType === HYPHENMINUS) {\n scanner.next();\n }\n\n if (scanner.tokenType === NUMBER) {\n scanner.next();\n }\n\n if (scanner.tokenType === IDENTIFIER) {\n scanner.next();\n }\n\n if (scanner.tokenStart === hexStart) {\n scanner.error('Unexpected input', hexStart);\n }\n }\n\n // validate for U+x{1,6} or U+x{1,6}-x{1,6}\n // where x is [0-9a-fA-F]\n for (var i = hexStart, wasHyphenMinus = false; i < scanner.tokenStart; i++) {\n var code = scanner.source.charCodeAt(i);\n\n if (isHex(code) === false && (code !== HYPHENMINUS || wasHyphenMinus)) {\n scanner.error('Unexpected input', i);\n }\n\n if (code === HYPHENMINUS) {\n // hex sequence shouldn't be an empty\n if (hexLength === 0) {\n scanner.error('Unexpected input', i);\n }\n\n wasHyphenMinus = true;\n hexLength = 0;\n } else {\n hexLength++;\n\n // too long hex sequence\n if (hexLength > 6) {\n scanner.error('Too long hex sequence', i);\n }\n }\n\n }\n\n // check we have a non-zero sequence\n if (hexLength === 0) {\n scanner.error('Unexpected input', i - 1);\n }\n\n // U+abc???\n if (!wasHyphenMinus) {\n // consume as many U+003F QUESTION MARK (?) code points as possible\n for (; hexLength < 6 && !scanner.eof; scanner.next()) {\n if (scanner.tokenType !== QUESTIONMARK) {\n break;\n }\n\n hexLength++;\n }\n }\n}\n\nmodule.exports = {\n name: 'UnicodeRange',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.next(); // U or u\n scanUnicodeRange(this.scanner);\n\n return {\n type: 'UnicodeRange',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.substrToCursor(start)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n }\n};\n","var endsWith = require('../../tokenizer').endsWith;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar FUNCTION = TYPE.Function;\nvar COLON = TYPE.Colon;\nvar SEMICOLON = TYPE.Semicolon;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\n\n// 'progid:' ws* 'DXImageTransform.Microsoft.' ident ws* '(' .* ')'\nfunction checkProgid(scanner) {\n var offset = 0;\n\n for (var type; type = scanner.lookupType(offset); offset++) {\n if (type !== WHITESPACE && type !== COMMENT) {\n break;\n }\n }\n\n if (scanner.lookupValue(offset, 'alpha(') ||\n scanner.lookupValue(offset, 'chroma(') ||\n scanner.lookupValue(offset, 'dropshadow(')) {\n if (scanner.lookupType(offset) !== FUNCTION) {\n return false;\n }\n } else {\n if (scanner.lookupValue(offset, 'progid') === false ||\n scanner.lookupType(offset + 1) !== COLON) {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = {\n name: 'Value',\n structure: {\n children: [[]]\n },\n parse: function(property) {\n // special parser for filter property since it can contains non-standart syntax for old IE\n if (property !== null && endsWith(property, 'filter') && checkProgid(this.scanner)) {\n this.scanner.skipSC();\n return this.Raw(this.scanner.currentToken, EXCLAMATIONMARK, SEMICOLON, false, false);\n }\n\n var start = this.scanner.tokenStart;\n var children = this.readSequence(this.scope.Value);\n\n return {\n type: 'Value',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.each(processChunk, node);\n }\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar IDENTIFIER = TYPE.Identifier;\nvar FUNCTION = TYPE.Function;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar COLON = TYPE.Colon;\n\nfunction consumeRaw() {\n return new List().appendData(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n}\n\nfunction parentheses() {\n var index = 0;\n\n this.scanner.skipSC();\n\n // TODO: make it simplier\n if (this.scanner.tokenType === IDENTIFIER) {\n index = 1;\n } else if (this.scanner.tokenType === HYPHENMINUS &&\n this.scanner.lookupType(1) === IDENTIFIER) {\n index = 2;\n }\n\n if (index !== 0 && this.scanner.lookupNonWSType(index) === COLON) {\n return new List().appendData(\n this.Declaration()\n );\n }\n\n return readSequence.call(this);\n}\n\nfunction readSequence() {\n var children = new List();\n var space = null;\n var child;\n\n this.scanner.skipSC();\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case WHITESPACE:\n space = this.WhiteSpace();\n continue;\n\n case COMMENT:\n this.scanner.next();\n continue;\n\n case FUNCTION:\n child = this.Function(consumeRaw, this.scope.AtrulePrelude);\n break;\n\n case IDENTIFIER:\n child = this.Identifier();\n break;\n\n case LEFTPARENTHESIS:\n child = this.Parentheses(parentheses, this.scope.AtrulePrelude);\n break;\n\n default:\n break scan;\n }\n\n if (space !== null) {\n children.appendData(space);\n space = null;\n }\n\n children.appendData(child);\n }\n\n return children;\n}\n\nmodule.exports = {\n parse: {\n prelude: function() {\n var children = readSequence.call(this);\n\n if (children.isEmpty()) {\n this.scanner.error('Condition is expected');\n }\n\n return children;\n },\n block: function() {\n return this.Block(false);\n }\n }\n};\n","'use strict';\n\nvar csstree = require('css-tree'),\n List = csstree.List,\n stable = require('stable'),\n specificity = require('csso/lib/restructure/prepare/specificity');\n\n\n/**\n * Flatten a CSS AST to a selectors list.\n *\n * @param {Object} cssAst css-tree AST to flatten\n * @return {Array} selectors\n */\nfunction flattenToSelectors(cssAst) {\n var selectors = [];\n\n csstree.walkRules(cssAst, function(node) {\n if (node.type !== 'Rule') {\n return;\n }\n\n var atrule = this.atrule;\n var rule = node;\n\n node.prelude.children.each(function(selectorNode, selectorItem) {\n var selector = {\n item: selectorItem,\n atrule: atrule,\n rule: rule,\n pseudos: []\n };\n\n selectorNode.children.each(function(selectorChildNode, selectorChildItem, selectorChildList) {\n if (selectorChildNode.type === 'PseudoClassSelector' ||\n selectorChildNode.type === 'PseudoElementSelector') {\n selector.pseudos.push({\n item: selectorChildItem,\n list: selectorChildList\n });\n }\n });\n\n selectors.push(selector);\n });\n });\n\n return selectors;\n}\n\n/**\n * Filter selectors by Media Query.\n *\n * @param {Array} selectors to filter\n * @param {Array} useMqs Array with strings of media queries that should pass (<name> <expression>)\n * @return {Array} Filtered selectors that match the passed media queries\n */\nfunction filterByMqs(selectors, useMqs) {\n return selectors.filter(function(selector) {\n if (selector.atrule === null) {\n return ~useMqs.indexOf('');\n }\n\n var mqName = selector.atrule.name;\n var mqStr = mqName;\n if (selector.atrule.expression &&\n selector.atrule.expression.children.first().type === 'MediaQueryList') {\n var mqExpr = csstree.translate(selector.atrule.expression);\n mqStr = [mqName, mqExpr].join(' ');\n }\n\n return ~useMqs.indexOf(mqStr);\n });\n}\n\n/**\n * Filter selectors by the pseudo-elements and/or -classes they contain.\n *\n * @param {Array} selectors to filter\n * @param {Array} usePseudos Array with strings of single or sequence of pseudo-elements and/or -classes that should pass\n * @return {Array} Filtered selectors that match the passed pseudo-elements and/or -classes\n */\nfunction filterByPseudos(selectors, usePseudos) {\n return selectors.filter(function(selector) {\n var pseudoSelectorsStr = csstree.translate({\n type: 'Selector',\n children: new List().fromArray(selector.pseudos.map(function(pseudo) {\n return pseudo.item.data;\n }))\n });\n return ~usePseudos.indexOf(pseudoSelectorsStr);\n });\n}\n\n/**\n * Remove pseudo-elements and/or -classes from the selectors for proper matching.\n *\n * @param {Array} selectors to clean\n * @return {Array} Selectors without pseudo-elements and/or -classes\n */\nfunction cleanPseudos(selectors) {\n selectors.forEach(function(selector) {\n selector.pseudos.forEach(function(pseudo) {\n pseudo.list.remove(pseudo.item);\n });\n });\n}\n\n\n/**\n * Compares two selector specificities.\n * extracted from https://github.com/keeganstreet/specificity/blob/master/specificity.js#L211\n *\n * @param {Array} aSpecificity Specificity of selector A\n * @param {Array} bSpecificity Specificity of selector B\n * @return {Number} Score of selector specificity A compared to selector specificity B\n */\nfunction compareSpecificity(aSpecificity, bSpecificity) {\n for (var i = 0; i < 4; i += 1) {\n if (aSpecificity[i] < bSpecificity[i]) {\n return -1;\n } else if (aSpecificity[i] > bSpecificity[i]) {\n return 1;\n }\n }\n\n return 0;\n}\n\n\n/**\n * Compare two simple selectors.\n *\n * @param {Object} aSimpleSelectorNode Simple selector A\n * @param {Object} bSimpleSelectorNode Simple selector B\n * @return {Number} Score of selector A compared to selector B\n */\nfunction compareSimpleSelectorNode(aSimpleSelectorNode, bSimpleSelectorNode) {\n var aSpecificity = specificity(aSimpleSelectorNode),\n bSpecificity = specificity(bSimpleSelectorNode);\n return compareSpecificity(aSpecificity, bSpecificity);\n}\n\nfunction _bySelectorSpecificity(selectorA, selectorB) {\n return compareSimpleSelectorNode(selectorA.item.data, selectorB.item.data);\n}\n\n\n/**\n * Sort selectors stably by their specificity.\n *\n * @param {Array} selectors to be sorted\n * @return {Array} Stable sorted selectors\n */\nfunction sortSelectors(selectors) {\n return stable(selectors, _bySelectorSpecificity);\n}\n\n\n/**\n * Convert a css-tree AST style declaration to CSSStyleDeclaration property.\n *\n * @param {Object} declaration css-tree style declaration\n * @return {Object} CSSStyleDeclaration property\n */\nfunction csstreeToStyleDeclaration(declaration) {\n var propertyName = declaration.property,\n propertyValue = csstree.translate(declaration.value),\n propertyPriority = (declaration.important ? 'important' : '');\n return {\n name: propertyName,\n value: propertyValue,\n priority: propertyPriority\n };\n}\n\n\n/**\n * Gets the CSS string of a style element\n *\n * @param {Object} element style element\n * @return {String|Array} CSS string or empty array if no styles are set\n */\nfunction getCssStr(elem) {\n return elem.content[0].text || elem.content[0].cdata || [];\n}\n\n/**\n * Sets the CSS string of a style element\n *\n * @param {Object} element style element\n * @param {String} CSS string to be set\n * @return {Object} reference to field with CSS\n */\nfunction setCssStr(elem, css) {\n // in case of cdata field\n if(elem.content[0].cdata) {\n elem.content[0].cdata = css;\n return elem.content[0].cdata;\n }\n\n // in case of text field + if nothing was set yet\n elem.content[0].text = css;\n return elem.content[0].text;\n}\n\n\nmodule.exports.flattenToSelectors = flattenToSelectors;\n\nmodule.exports.filterByMqs = filterByMqs;\nmodule.exports.filterByPseudos = filterByPseudos;\nmodule.exports.cleanPseudos = cleanPseudos;\n\nmodule.exports.compareSpecificity = compareSpecificity;\nmodule.exports.compareSimpleSelectorNode = compareSimpleSelectorNode;\n\nmodule.exports.sortSelectors = sortSelectors;\n\nmodule.exports.csstreeToStyleDeclaration = csstreeToStyleDeclaration;\n\nmodule.exports.getCssStr = getCssStr;\nmodule.exports.setCssStr = setCssStr;\n","/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 CoderPuppy\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\nvar _endianness;\nexport function endianness() {\n if (typeof _endianness === 'undefined') {\n var a = new ArrayBuffer(2);\n var b = new Uint8Array(a);\n var c = new Uint16Array(a);\n b[0] = 1;\n b[1] = 2;\n if (c[0] === 258) {\n _endianness = 'BE';\n } else if (c[0] === 513){\n _endianness = 'LE';\n } else {\n throw new Error('unable to figure out endianess');\n }\n }\n return _endianness;\n}\n\nexport function hostname() {\n if (typeof global.location !== 'undefined') {\n return global.location.hostname\n } else return '';\n}\n\nexport function loadavg() {\n return [];\n}\n\nexport function uptime() {\n return 0;\n}\n\nexport function freemem() {\n return Number.MAX_VALUE;\n}\n\nexport function totalmem() {\n return Number.MAX_VALUE;\n}\n\nexport function cpus() {\n return [];\n}\n\nexport function type() {\n return 'Browser';\n}\n\nexport function release () {\n if (typeof global.navigator !== 'undefined') {\n return global.navigator.appVersion;\n }\n return '';\n}\n\nexport function networkInterfaces(){}\nexport function getNetworkInterfaces(){}\n\nexport function arch() {\n return 'javascript';\n}\n\nexport function platform() {\n return 'browser';\n}\n\nexport function tmpDir() {\n return '/tmp';\n}\nexport var tmpdir = tmpDir;\n\nexport var EOL = '\\n';\nexport default {\n EOL: EOL,\n tmpdir: tmpdir,\n tmpDir: tmpDir,\n networkInterfaces:networkInterfaces,\n getNetworkInterfaces: getNetworkInterfaces,\n release: release,\n type: type,\n cpus: cpus,\n totalmem: totalmem,\n freemem: freemem,\n uptime: uptime,\n loadavg: loadavg,\n hostname: hostname,\n endianness: endianness,\n}\n","'use strict';\n\nvar EOL = require('os').EOL,\n textElem = require('../../plugins/_collections.js').elemsGroups.textContent.concat('title');\n\nvar defaults = {\n doctypeStart: '<!DOCTYPE',\n doctypeEnd: '>',\n procInstStart: '<?',\n procInstEnd: '?>',\n tagOpenStart: '<',\n tagOpenEnd: '>',\n tagCloseStart: '</',\n tagCloseEnd: '>',\n tagShortStart: '<',\n tagShortEnd: '/>',\n attrStart: '=\"',\n attrEnd: '\"',\n commentStart: '<!--',\n commentEnd: '-->',\n cdataStart: '<![CDATA[',\n cdataEnd: ']]>',\n textStart: '',\n textEnd: '',\n indent: 4,\n regEntities: /[&'\"<>]/g,\n regValEntities: /[&\"<>]/g,\n encodeEntity: encodeEntity,\n pretty: false,\n useShortTags: true\n};\n\nvar entities = {\n '&': '&amp;',\n '\\'': '&apos;',\n '\"': '&quot;',\n '>': '&gt;',\n '<': '&lt;',\n };\n\n/**\n * Convert SVG-as-JS object to SVG (XML) string.\n *\n * @param {Object} data input data\n * @param {Object} config config\n *\n * @return {Object} output data\n */\nmodule.exports = function(data, config) {\n\n return new JS2SVG(config).convert(data);\n\n};\n\nfunction JS2SVG(config) {\n\n if (config) {\n this.config = Object.assign({}, defaults, config);\n } else {\n this.config = defaults;\n }\n\n var indent = this.config.indent;\n if (typeof indent == 'number' && !isNaN(indent)) {\n this.config.indent = (indent < 0) ? '\\t' : ' '.repeat(indent);\n } else if (typeof indent != 'string') {\n this.config.indent = ' ';\n }\n\n if (this.config.pretty) {\n this.config.doctypeEnd += EOL;\n this.config.procInstEnd += EOL;\n this.config.commentEnd += EOL;\n this.config.cdataEnd += EOL;\n this.config.tagShortEnd += EOL;\n this.config.tagOpenEnd += EOL;\n this.config.tagCloseEnd += EOL;\n this.config.textEnd += EOL;\n }\n\n this.indentLevel = 0;\n this.textContext = null;\n\n}\n\nfunction encodeEntity(char) {\n return entities[char];\n}\n\n/**\n * Start conversion.\n *\n * @param {Object} data input data\n *\n * @return {String}\n */\nJS2SVG.prototype.convert = function(data) {\n\n var svg = '';\n\n if (data.content) {\n\n this.indentLevel++;\n\n data.content.forEach(function(item) {\n\n if (item.elem) {\n svg += this.createElem(item);\n } else if (item.text) {\n svg += this.createText(item.text);\n } else if (item.doctype) {\n svg += this.createDoctype(item.doctype);\n } else if (item.processinginstruction) {\n svg += this.createProcInst(item.processinginstruction);\n } else if (item.comment) {\n svg += this.createComment(item.comment);\n } else if (item.cdata) {\n svg += this.createCDATA(item.cdata);\n }\n\n }, this);\n\n }\n\n this.indentLevel--;\n\n return {\n data: svg,\n info: {\n width: this.width,\n height: this.height\n }\n };\n\n};\n\n/**\n * Create indent string in accordance with the current node level.\n *\n * @return {String}\n */\nJS2SVG.prototype.createIndent = function() {\n\n var indent = '';\n\n if (this.config.pretty && !this.textContext) {\n indent = this.config.indent.repeat(this.indentLevel - 1);\n }\n\n return indent;\n\n};\n\n/**\n * Create doctype tag.\n *\n * @param {String} doctype doctype body string\n *\n * @return {String}\n */\nJS2SVG.prototype.createDoctype = function(doctype) {\n\n return this.config.doctypeStart +\n doctype +\n this.config.doctypeEnd;\n\n};\n\n/**\n * Create XML Processing Instruction tag.\n *\n * @param {Object} instruction instruction object\n *\n * @return {String}\n */\nJS2SVG.prototype.createProcInst = function(instruction) {\n\n return this.config.procInstStart +\n instruction.name +\n ' ' +\n instruction.body +\n this.config.procInstEnd;\n\n};\n\n/**\n * Create comment tag.\n *\n * @param {String} comment comment body\n *\n * @return {String}\n */\nJS2SVG.prototype.createComment = function(comment) {\n\n return this.config.commentStart +\n comment +\n this.config.commentEnd;\n\n};\n\n/**\n * Create CDATA section.\n *\n * @param {String} cdata CDATA body\n *\n * @return {String}\n */\nJS2SVG.prototype.createCDATA = function(cdata) {\n\n return this.createIndent() +\n this.config.cdataStart +\n cdata +\n this.config.cdataEnd;\n\n};\n\n/**\n * Create element tag.\n *\n * @param {Object} data element object\n *\n * @return {String}\n */\nJS2SVG.prototype.createElem = function(data) {\n\n // beautiful injection for obtaining SVG information :)\n if (\n data.isElem('svg') &&\n data.hasAttr('width') &&\n data.hasAttr('height')\n ) {\n this.width = data.attr('width').value;\n this.height = data.attr('height').value;\n }\n\n // empty element and short tag\n if (data.isEmpty()) {\n if (this.config.useShortTags) {\n return this.createIndent() +\n this.config.tagShortStart +\n data.elem +\n this.createAttrs(data) +\n this.config.tagShortEnd;\n } else {\n return this.createIndent() +\n this.config.tagShortStart +\n data.elem +\n this.createAttrs(data) +\n this.config.tagOpenEnd +\n this.config.tagCloseStart +\n data.elem +\n this.config.tagCloseEnd;\n }\n // non-empty element\n } else {\n var tagOpenStart = this.config.tagOpenStart,\n tagOpenEnd = this.config.tagOpenEnd,\n tagCloseStart = this.config.tagCloseStart,\n tagCloseEnd = this.config.tagCloseEnd,\n openIndent = this.createIndent(),\n textIndent = '',\n processedData = '',\n dataEnd = '';\n\n if (this.textContext) {\n tagOpenStart = defaults.tagOpenStart;\n tagOpenEnd = defaults.tagOpenEnd;\n tagCloseStart = defaults.tagCloseStart;\n tagCloseEnd = defaults.tagCloseEnd;\n openIndent = '';\n } else if (data.isElem(textElem)) {\n if (this.config.pretty) {\n textIndent += openIndent + this.config.indent;\n }\n this.textContext = data;\n }\n\n processedData += this.convert(data).data;\n\n if (this.textContext == data) {\n this.textContext = null;\n if (this.config.pretty) dataEnd = EOL;\n }\n\n return openIndent +\n tagOpenStart +\n data.elem +\n this.createAttrs(data) +\n tagOpenEnd +\n textIndent +\n processedData +\n dataEnd +\n this.createIndent() +\n tagCloseStart +\n data.elem +\n tagCloseEnd;\n\n }\n\n};\n\n/**\n * Create element attributes.\n *\n * @param {Object} elem attributes object\n *\n * @return {String}\n */\nJS2SVG.prototype.createAttrs = function(elem) {\n\n var attrs = '';\n\n elem.eachAttr(function(attr) {\n\n if (attr.value !== undefined) {\n attrs += ' ' +\n attr.name +\n this.config.attrStart +\n String(attr.value).replace(this.config.regValEntities, this.config.encodeEntity) +\n this.config.attrEnd;\n }\n else {\n attrs += ' ' +\n attr.name;\n }\n\n\n }, this);\n\n return attrs;\n\n};\n\n/**\n * Create text node.\n *\n * @param {String} text text\n *\n * @return {String}\n */\nJS2SVG.prototype.createText = function(text) {\n\n return this.createIndent() +\n this.config.textStart +\n text.replace(this.config.regEntities, this.config.encodeEntity) +\n (this.textContext ? '' : this.config.textEnd);\n\n};\n","'use strict';\n\n/**\n * Plugins engine.\n *\n * @module plugins\n *\n * @param {Object} data input data\n * @param {Object} info extra information\n * @param {Object} plugins plugins object from config\n * @return {Object} output data\n */\nmodule.exports = function(data, info, plugins) {\n\n plugins.forEach(function(group) {\n\n switch(group[0].type) {\n case 'perItem':\n data = perItem(data, info, group);\n break;\n case 'perItemReverse':\n data = perItem(data, info, group, true);\n break;\n case 'full':\n data = full(data, info, group);\n break;\n }\n\n });\n\n return data;\n\n};\n\n/**\n * Direct or reverse per-item loop.\n *\n * @param {Object} data input data\n * @param {Object} info extra information\n * @param {Array} plugins plugins list to process\n * @param {Boolean} [reverse] reverse pass?\n * @return {Object} output data\n */\nfunction perItem(data, info, plugins, reverse) {\n\n function monkeys(items) {\n\n items.content = items.content.filter(function(item) {\n\n // reverse pass\n if (reverse && item.content) {\n monkeys(item);\n }\n\n // main filter\n var filter = true;\n\n for (var i = 0; filter && i < plugins.length; i++) {\n var plugin = plugins[i];\n\n if (plugin.active && plugin.fn(item, plugin.params, info) === false) {\n filter = false;\n }\n }\n\n // direct pass\n if (!reverse && item.content) {\n monkeys(item);\n }\n\n return filter;\n\n });\n\n return items;\n\n }\n\n return monkeys(data);\n\n}\n\n/**\n * \"Full\" plugins.\n *\n * @param {Object} data input data\n * @param {Object} info extra information\n * @param {Array} plugins plugins list to process\n * @return {Object} output data\n */\nfunction full(data, info, plugins) {\n\n plugins.forEach(function(plugin) {\n if (plugin.active) {\n data = plugin.fn(data, plugin.params, info);\n }\n });\n\n return data;\n\n}\n","'use strict';\n\n//\n// item item item item\n// /------\\ /------\\ /------\\ /------\\\n// | data | | data | | data | | data |\n// null <--+-prev |<---+-prev |<---+-prev |<---+-prev |\n// | next-+--->| next-+--->| next-+--->| next-+--> null\n// \\------/ \\------/ \\------/ \\------/\n// ^ ^\n// | list |\n// | /------\\ |\n// \\--------------+-head | |\n// | tail-+--------------/\n// \\------/\n//\n\nfunction createItem(data) {\n return {\n prev: null,\n next: null,\n data: data\n };\n}\n\nfunction allocateCursor(node, prev, next) {\n var cursor;\n\n if (cursors !== null) {\n cursor = cursors;\n cursors = cursors.cursor;\n cursor.prev = prev;\n cursor.next = next;\n cursor.cursor = node.cursor;\n } else {\n cursor = {\n prev: prev,\n next: next,\n cursor: node.cursor\n };\n }\n\n node.cursor = cursor;\n\n return cursor;\n}\n\nfunction releaseCursor(node) {\n var cursor = node.cursor;\n\n node.cursor = cursor.cursor;\n cursor.prev = null;\n cursor.next = null;\n cursor.cursor = cursors;\n cursors = cursor;\n}\n\nvar cursors = null;\nvar List = function() {\n this.cursor = null;\n this.head = null;\n this.tail = null;\n};\n\nList.createItem = createItem;\nList.prototype.createItem = createItem;\n\nList.prototype.updateCursors = function(prevOld, prevNew, nextOld, nextNew) {\n var cursor = this.cursor;\n\n while (cursor !== null) {\n if (cursor.prev === prevOld) {\n cursor.prev = prevNew;\n }\n\n if (cursor.next === nextOld) {\n cursor.next = nextNew;\n }\n\n cursor = cursor.cursor;\n }\n};\n\nList.prototype.getSize = function() {\n var size = 0;\n var cursor = this.head;\n\n while (cursor) {\n size++;\n cursor = cursor.next;\n }\n\n return size;\n};\n\nList.prototype.fromArray = function(array) {\n var cursor = null;\n\n this.head = null;\n\n for (var i = 0; i < array.length; i++) {\n var item = createItem(array[i]);\n\n if (cursor !== null) {\n cursor.next = item;\n } else {\n this.head = item;\n }\n\n item.prev = cursor;\n cursor = item;\n }\n\n this.tail = cursor;\n\n return this;\n};\n\nList.prototype.toArray = function() {\n var cursor = this.head;\n var result = [];\n\n while (cursor) {\n result.push(cursor.data);\n cursor = cursor.next;\n }\n\n return result;\n};\n\nList.prototype.toJSON = List.prototype.toArray;\n\nList.prototype.isEmpty = function() {\n return this.head === null;\n};\n\nList.prototype.first = function() {\n return this.head && this.head.data;\n};\n\nList.prototype.last = function() {\n return this.tail && this.tail.data;\n};\n\nList.prototype.each = function(fn, context) {\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, null, this.head);\n\n while (cursor.next !== null) {\n item = cursor.next;\n cursor.next = item.next;\n\n fn.call(context, item.data, item, this);\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.forEach = List.prototype.each;\n\nList.prototype.eachRight = function(fn, context) {\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, this.tail, null);\n\n while (cursor.prev !== null) {\n item = cursor.prev;\n cursor.prev = item.prev;\n\n fn.call(context, item.data, item, this);\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.forEachRight = List.prototype.eachRight;\n\nList.prototype.nextUntil = function(start, fn, context) {\n if (start === null) {\n return;\n }\n\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, null, start);\n\n while (cursor.next !== null) {\n item = cursor.next;\n cursor.next = item.next;\n\n if (fn.call(context, item.data, item, this)) {\n break;\n }\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.prevUntil = function(start, fn, context) {\n if (start === null) {\n return;\n }\n\n var item;\n\n if (context === undefined) {\n context = this;\n }\n\n // push cursor\n var cursor = allocateCursor(this, start, null);\n\n while (cursor.prev !== null) {\n item = cursor.prev;\n cursor.prev = item.prev;\n\n if (fn.call(context, item.data, item, this)) {\n break;\n }\n }\n\n // pop cursor\n releaseCursor(this);\n};\n\nList.prototype.some = function(fn, context) {\n var cursor = this.head;\n\n if (context === undefined) {\n context = this;\n }\n\n while (cursor !== null) {\n if (fn.call(context, cursor.data, cursor, this)) {\n return true;\n }\n\n cursor = cursor.next;\n }\n\n return false;\n};\n\nList.prototype.map = function(fn, context) {\n var result = new List();\n var cursor = this.head;\n\n if (context === undefined) {\n context = this;\n }\n\n while (cursor !== null) {\n result.appendData(fn.call(context, cursor.data, cursor, this));\n cursor = cursor.next;\n }\n\n return result;\n};\n\nList.prototype.filter = function(fn, context) {\n var result = new List();\n var cursor = this.head;\n\n if (context === undefined) {\n context = this;\n }\n\n while (cursor !== null) {\n if (fn.call(context, cursor.data, cursor, this)) {\n result.appendData(cursor.data);\n }\n cursor = cursor.next;\n }\n\n return result;\n};\n\nList.prototype.clear = function() {\n this.head = null;\n this.tail = null;\n};\n\nList.prototype.copy = function() {\n var result = new List();\n var cursor = this.head;\n\n while (cursor !== null) {\n result.insert(createItem(cursor.data));\n cursor = cursor.next;\n }\n\n return result;\n};\n\nList.prototype.prepend = function(item) {\n // head\n // ^\n // item\n this.updateCursors(null, item, this.head, item);\n\n // insert to the beginning of the list\n if (this.head !== null) {\n // new item <- first item\n this.head.prev = item;\n\n // new item -> first item\n item.next = this.head;\n } else {\n // if list has no head, then it also has no tail\n // in this case tail points to the new item\n this.tail = item;\n }\n\n // head always points to new item\n this.head = item;\n\n return this;\n};\n\nList.prototype.prependData = function(data) {\n return this.prepend(createItem(data));\n};\n\nList.prototype.append = function(item) {\n return this.insert(item);\n};\n\nList.prototype.appendData = function(data) {\n return this.insert(createItem(data));\n};\n\nList.prototype.insert = function(item, before) {\n if (before !== undefined && before !== null) {\n // prev before\n // ^\n // item\n this.updateCursors(before.prev, item, before, item);\n\n if (before.prev === null) {\n // insert to the beginning of list\n if (this.head !== before) {\n throw new Error('before doesn\\'t belong to list');\n }\n\n // since head points to before therefore list doesn't empty\n // no need to check tail\n this.head = item;\n before.prev = item;\n item.next = before;\n\n this.updateCursors(null, item);\n } else {\n\n // insert between two items\n before.prev.next = item;\n item.prev = before.prev;\n\n before.prev = item;\n item.next = before;\n }\n } else {\n // tail\n // ^\n // item\n this.updateCursors(this.tail, item, null, item);\n\n // insert to the ending of the list\n if (this.tail !== null) {\n // last item -> new item\n this.tail.next = item;\n\n // last item <- new item\n item.prev = this.tail;\n } else {\n // if list has no tail, then it also has no head\n // in this case head points to new item\n this.head = item;\n }\n\n // tail always points to new item\n this.tail = item;\n }\n\n return this;\n};\n\nList.prototype.insertData = function(data, before) {\n return this.insert(createItem(data), before);\n};\n\nList.prototype.remove = function(item) {\n // item\n // ^\n // prev next\n this.updateCursors(item, item.prev, item, item.next);\n\n if (item.prev !== null) {\n item.prev.next = item.next;\n } else {\n if (this.head !== item) {\n throw new Error('item doesn\\'t belong to list');\n }\n\n this.head = item.next;\n }\n\n if (item.next !== null) {\n item.next.prev = item.prev;\n } else {\n if (this.tail !== item) {\n throw new Error('item doesn\\'t belong to list');\n }\n\n this.tail = item.prev;\n }\n\n item.prev = null;\n item.next = null;\n\n return item;\n};\n\nList.prototype.push = function(data) {\n this.insert(createItem(data));\n};\n\nList.prototype.pop = function() {\n if (this.tail !== null) {\n return this.remove(this.tail);\n }\n};\n\nList.prototype.unshift = function(data) {\n this.prepend(createItem(data));\n};\n\nList.prototype.shift = function() {\n if (this.head !== null) {\n return this.remove(this.head);\n }\n};\n\nList.prototype.prependList = function(list) {\n return this.insertList(list, this.head);\n};\n\nList.prototype.appendList = function(list) {\n return this.insertList(list);\n};\n\nList.prototype.insertList = function(list, before) {\n // ignore empty lists\n if (list.head === null) {\n return this;\n }\n\n if (before !== undefined && before !== null) {\n this.updateCursors(before.prev, list.tail, before, list.head);\n\n // insert in the middle of dist list\n if (before.prev !== null) {\n // before.prev <-> list.head\n before.prev.next = list.head;\n list.head.prev = before.prev;\n } else {\n this.head = list.head;\n }\n\n before.prev = list.tail;\n list.tail.next = before;\n } else {\n this.updateCursors(this.tail, list.tail, null, list.head);\n\n // insert to end of the list\n if (this.tail !== null) {\n // if destination list has a tail, then it also has a head,\n // but head doesn't change\n\n // dest tail -> source head\n this.tail.next = list.head;\n\n // dest tail <- source head\n list.head.prev = this.tail;\n } else {\n // if list has no a tail, then it also has no a head\n // in this case points head to new item\n this.head = list.head;\n }\n\n // tail always start point to new item\n this.tail = list.tail;\n }\n\n list.head = null;\n list.tail = null;\n\n return this;\n};\n\nList.prototype.replace = function(oldItem, newItemOrList) {\n if ('head' in newItemOrList) {\n this.insertList(newItemOrList, oldItem);\n } else {\n this.insert(newItemOrList, oldItem);\n }\n\n this.remove(oldItem);\n};\n\nmodule.exports = List;\n","'use strict';\n\nvar createCustomError = require('../utils/createCustomError');\nvar MAX_LINE_LENGTH = 100;\nvar OFFSET_CORRECTION = 60;\nvar TAB_REPLACEMENT = ' ';\n\nfunction sourceFragment(error, extraLines) {\n function processLines(start, end) {\n return lines.slice(start, end).map(function(line, idx) {\n var num = String(start + idx + 1);\n\n while (num.length < maxNumLength) {\n num = ' ' + num;\n }\n\n return num + ' |' + line;\n }).join('\\n');\n }\n\n var lines = error.source.split(/\\r\\n?|\\n|\\f/);\n var line = error.line;\n var column = error.column;\n var startLine = Math.max(1, line - extraLines) - 1;\n var endLine = Math.min(line + extraLines, lines.length + 1);\n var maxNumLength = Math.max(4, String(endLine).length) + 1;\n var cutLeft = 0;\n\n // column correction according to replaced tab before column\n column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\\t/g) || []).length;\n\n if (column > MAX_LINE_LENGTH) {\n cutLeft = column - OFFSET_CORRECTION + 3;\n column = OFFSET_CORRECTION - 2;\n }\n\n for (var i = startLine; i <= endLine; i++) {\n if (i >= 0 && i < lines.length) {\n lines[i] = lines[i].replace(/\\t/g, TAB_REPLACEMENT);\n lines[i] =\n (cutLeft > 0 && lines[i].length > cutLeft ? '\\u2026' : '') +\n lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) +\n (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\\u2026' : '');\n }\n }\n\n return [\n processLines(startLine, line),\n new Array(column + maxNumLength + 2).join('-') + '^',\n processLines(line, endLine)\n ].filter(Boolean).join('\\n');\n}\n\nvar CssSyntaxError = function(message, source, offset, line, column) {\n var error = createCustomError('CssSyntaxError', message);\n\n error.source = source;\n error.offset = offset;\n error.line = line;\n error.column = column;\n\n error.sourceFragment = function(extraLines) {\n return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines);\n };\n Object.defineProperty(error, 'formattedMessage', {\n get: function() {\n return (\n 'Parse error: ' + error.message + '\\n' +\n sourceFragment(error, 2)\n );\n }\n });\n\n // for backward capability\n error.parseError = {\n offset: offset,\n line: line,\n column: column\n };\n\n return error;\n};\n\nmodule.exports = CssSyntaxError;\n","'use strict';\n\nvar constants = require('./const');\nvar PUNCTUATION = constants.PUNCTUATION;\nvar STOP_URL_RAW = constants.STOP_URL_RAW;\nvar TYPE = constants.TYPE;\nvar FULLSTOP = TYPE.FullStop;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar PUNCTUATOR = TYPE.Punctuator;\nvar TAB = 9;\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar SPACE = 32;\nvar BACK_SLASH = 92;\nvar E = 101; // 'e'.charCodeAt(0)\n\nfunction firstCharOffset(source) {\n // detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark)\n if (source.charCodeAt(0) === 0xFEFF || // UTF-16BE\n source.charCodeAt(0) === 0xFFFE) { // UTF-16LE\n return 1;\n }\n\n return 0;\n}\n\nfunction isHex(code) {\n return (code >= 48 && code <= 57) || // 0 .. 9\n (code >= 65 && code <= 70) || // A .. F\n (code >= 97 && code <= 102); // a .. f\n}\n\nfunction isNumber(code) {\n return code >= 48 && code <= 57;\n}\n\nfunction isWhiteSpace(code) {\n return code === SPACE || code === TAB || isNewline(code);\n}\n\nfunction isNewline(code) {\n return code === R || code === N || code === F;\n}\n\nfunction getNewlineLength(source, offset, code) {\n if (isNewline(code)) {\n if (code === R && offset + 1 < source.length && source.charCodeAt(offset + 1) === N) {\n return 2;\n }\n\n return 1;\n }\n\n return 0;\n}\n\nfunction cmpChar(testStr, offset, referenceCode) {\n var code = testStr.charCodeAt(offset);\n\n // code.toLowerCase() for A..Z\n if (code >= 65 && code <= 90) {\n code = code | 32;\n }\n\n return code === referenceCode;\n}\n\nfunction cmpStr(testStr, start, end, referenceStr) {\n if (end - start !== referenceStr.length) {\n return false;\n }\n\n if (start < 0 || end > testStr.length) {\n return false;\n }\n\n for (var i = start; i < end; i++) {\n var testCode = testStr.charCodeAt(i);\n var refCode = referenceStr.charCodeAt(i - start);\n\n // testCode.toLowerCase() for A..Z\n if (testCode >= 65 && testCode <= 90) {\n testCode = testCode | 32;\n }\n\n if (testCode !== refCode) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction findWhiteSpaceStart(source, offset) {\n while (offset >= 0 && isWhiteSpace(source.charCodeAt(offset))) {\n offset--;\n }\n\n return offset + 1;\n}\n\nfunction findWhiteSpaceEnd(source, offset) {\n while (offset < source.length && isWhiteSpace(source.charCodeAt(offset))) {\n offset++;\n }\n\n return offset;\n}\n\nfunction findCommentEnd(source, offset) {\n var commentEnd = source.indexOf('*/', offset);\n\n if (commentEnd === -1) {\n return source.length;\n }\n\n return commentEnd + 2;\n}\n\nfunction findStringEnd(source, offset, quote) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n // TODO: bad string\n if (code === BACK_SLASH) {\n offset++;\n } else if (code === quote) {\n offset++;\n break;\n }\n }\n\n return offset;\n}\n\nfunction findDecimalNumberEnd(source, offset) {\n while (offset < source.length && isNumber(source.charCodeAt(offset))) {\n offset++;\n }\n\n return offset;\n}\n\nfunction findNumberEnd(source, offset, allowFraction) {\n var code;\n\n offset = findDecimalNumberEnd(source, offset);\n\n // fraction: .\\d+\n if (allowFraction && offset + 1 < source.length && source.charCodeAt(offset) === FULLSTOP) {\n code = source.charCodeAt(offset + 1);\n\n if (isNumber(code)) {\n offset = findDecimalNumberEnd(source, offset + 1);\n }\n }\n\n // exponent: e[+-]\\d+\n if (offset + 1 < source.length) {\n if ((source.charCodeAt(offset) | 32) === E) { // case insensitive check for `e`\n code = source.charCodeAt(offset + 1);\n\n if (code === PLUSSIGN || code === HYPHENMINUS) {\n if (offset + 2 < source.length) {\n code = source.charCodeAt(offset + 2);\n }\n }\n\n if (isNumber(code)) {\n offset = findDecimalNumberEnd(source, offset + 2);\n }\n }\n }\n\n return offset;\n}\n\n// skip escaped unicode sequence that can ends with space\n// [0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?\nfunction findEscapeEnd(source, offset) {\n for (var i = 0; i < 7 && offset + i < source.length; i++) {\n var code = source.charCodeAt(offset + i);\n\n if (i !== 6 && isHex(code)) {\n continue;\n }\n\n if (i > 0) {\n offset += i - 1 + getNewlineLength(source, offset + i, code);\n if (code === SPACE || code === TAB) {\n offset++;\n }\n }\n\n break;\n }\n\n return offset;\n}\n\nfunction findIdentifierEnd(source, offset) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n if (code === BACK_SLASH) {\n offset = findEscapeEnd(source, offset + 1);\n } else if (code < 0x80 && PUNCTUATION[code] === PUNCTUATOR) {\n break;\n }\n }\n\n return offset;\n}\n\nfunction findUrlRawEnd(source, offset) {\n for (; offset < source.length; offset++) {\n var code = source.charCodeAt(offset);\n\n if (code === BACK_SLASH) {\n offset = findEscapeEnd(source, offset + 1);\n } else if (code < 0x80 && STOP_URL_RAW[code] === 1) {\n break;\n }\n }\n\n return offset;\n}\n\nmodule.exports = {\n firstCharOffset: firstCharOffset,\n\n isHex: isHex,\n isNumber: isNumber,\n isWhiteSpace: isWhiteSpace,\n isNewline: isNewline,\n getNewlineLength: getNewlineLength,\n\n cmpChar: cmpChar,\n cmpStr: cmpStr,\n\n findWhiteSpaceStart: findWhiteSpaceStart,\n findWhiteSpaceEnd: findWhiteSpaceEnd,\n findCommentEnd: findCommentEnd,\n findStringEnd: findStringEnd,\n findDecimalNumberEnd: findDecimalNumberEnd,\n findNumberEnd: findNumberEnd,\n findEscapeEnd: findEscapeEnd,\n findIdentifierEnd: findIdentifierEnd,\n findUrlRawEnd: findUrlRawEnd\n};\n","'use strict';\n\nvar CssSyntaxError = require('./error');\n\nvar constants = require('./const');\nvar TYPE = constants.TYPE;\nvar NAME = constants.NAME;\nvar SYMBOL_TYPE = constants.SYMBOL_TYPE;\n\nvar utils = require('./utils');\nvar firstCharOffset = utils.firstCharOffset;\nvar cmpStr = utils.cmpStr;\nvar isNumber = utils.isNumber;\nvar findWhiteSpaceStart = utils.findWhiteSpaceStart;\nvar findWhiteSpaceEnd = utils.findWhiteSpaceEnd;\nvar findCommentEnd = utils.findCommentEnd;\nvar findStringEnd = utils.findStringEnd;\nvar findNumberEnd = utils.findNumberEnd;\nvar findIdentifierEnd = utils.findIdentifierEnd;\nvar findUrlRawEnd = utils.findUrlRawEnd;\n\nvar NULL = 0;\nvar WHITESPACE = TYPE.WhiteSpace;\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar STRING = TYPE.String;\nvar COMMENT = TYPE.Comment;\nvar PUNCTUATOR = TYPE.Punctuator;\nvar CDO = TYPE.CDO;\nvar CDC = TYPE.CDC;\nvar ATKEYWORD = TYPE.AtKeyword;\nvar FUNCTION = TYPE.Function;\nvar URL = TYPE.Url;\nvar RAW = TYPE.Raw;\n\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar STAR = TYPE.Asterisk;\nvar SLASH = TYPE.Solidus;\nvar FULLSTOP = TYPE.FullStop;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar GREATERTHANSIGN = TYPE.GreaterThanSign;\nvar LESSTHANSIGN = TYPE.LessThanSign;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\nvar COMMERCIALAT = TYPE.CommercialAt;\nvar QUOTATIONMARK = TYPE.QuotationMark;\nvar APOSTROPHE = TYPE.Apostrophe;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\nvar RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;\n\nvar MIN_BUFFER_SIZE = 16 * 1024;\nvar OFFSET_MASK = 0x00FFFFFF;\nvar TYPE_SHIFT = 24;\nvar SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported\n\nfunction computeLinesAndColumns(tokenizer, source) {\n var sourceLength = source.length;\n var start = firstCharOffset(source);\n var lines = tokenizer.lines;\n var line = tokenizer.startLine;\n var columns = tokenizer.columns;\n var column = tokenizer.startColumn;\n\n if (lines === null || lines.length < sourceLength + 1) {\n lines = new SafeUint32Array(Math.max(sourceLength + 1024, MIN_BUFFER_SIZE));\n columns = new SafeUint32Array(lines.length);\n }\n\n for (var i = start; i < sourceLength; i++) {\n var code = source.charCodeAt(i);\n\n lines[i] = line;\n columns[i] = column++;\n\n if (code === N || code === R || code === F) {\n if (code === R && i + 1 < sourceLength && source.charCodeAt(i + 1) === N) {\n i++;\n lines[i] = line;\n columns[i] = column;\n }\n\n line++;\n column = 1;\n }\n }\n\n lines[i] = line;\n columns[i] = column;\n\n tokenizer.linesAnsColumnsComputed = true;\n tokenizer.lines = lines;\n tokenizer.columns = columns;\n}\n\nfunction tokenLayout(tokenizer, source, startPos) {\n var sourceLength = source.length;\n var offsetAndType = tokenizer.offsetAndType;\n var balance = tokenizer.balance;\n var tokenCount = 0;\n var prevType = 0;\n var offset = startPos;\n var anchor = 0;\n var balanceCloseCode = 0;\n var balanceStart = 0;\n var balancePrev = 0;\n\n if (offsetAndType === null || offsetAndType.length < sourceLength + 1) {\n offsetAndType = new SafeUint32Array(sourceLength + 1024);\n balance = new SafeUint32Array(sourceLength + 1024);\n }\n\n while (offset < sourceLength) {\n var code = source.charCodeAt(offset);\n var type = code < 0x80 ? SYMBOL_TYPE[code] : IDENTIFIER;\n\n balance[tokenCount] = sourceLength;\n\n switch (type) {\n case WHITESPACE:\n offset = findWhiteSpaceEnd(source, offset + 1);\n break;\n\n case PUNCTUATOR:\n switch (code) {\n case balanceCloseCode:\n balancePrev = balanceStart & OFFSET_MASK;\n balanceStart = balance[balancePrev];\n balanceCloseCode = balanceStart >> TYPE_SHIFT;\n balance[tokenCount] = balancePrev;\n balance[balancePrev++] = tokenCount;\n for (; balancePrev < tokenCount; balancePrev++) {\n if (balance[balancePrev] === sourceLength) {\n balance[balancePrev] = tokenCount;\n }\n }\n break;\n\n case LEFTSQUAREBRACKET:\n balance[tokenCount] = balanceStart;\n balanceCloseCode = RIGHTSQUAREBRACKET;\n balanceStart = (balanceCloseCode << TYPE_SHIFT) | tokenCount;\n break;\n\n case LEFTCURLYBRACKET:\n balance[tokenCount] = balanceStart;\n balanceCloseCode = RIGHTCURLYBRACKET;\n balanceStart = (balanceCloseCode << TYPE_SHIFT) | tokenCount;\n break;\n\n case LEFTPARENTHESIS:\n balance[tokenCount] = balanceStart;\n balanceCloseCode = RIGHTPARENTHESIS;\n balanceStart = (balanceCloseCode << TYPE_SHIFT) | tokenCount;\n break;\n }\n\n // /*\n if (code === STAR && prevType === SLASH) {\n type = COMMENT;\n offset = findCommentEnd(source, offset + 1);\n tokenCount--; // rewrite prev token\n break;\n }\n\n // edge case for -.123 and +.123\n if (code === FULLSTOP && (prevType === PLUSSIGN || prevType === HYPHENMINUS)) {\n if (offset + 1 < sourceLength && isNumber(source.charCodeAt(offset + 1))) {\n type = NUMBER;\n offset = findNumberEnd(source, offset + 2, false);\n tokenCount--; // rewrite prev token\n break;\n }\n }\n\n // <!--\n if (code === EXCLAMATIONMARK && prevType === LESSTHANSIGN) {\n if (offset + 2 < sourceLength &&\n source.charCodeAt(offset + 1) === HYPHENMINUS &&\n source.charCodeAt(offset + 2) === HYPHENMINUS) {\n type = CDO;\n offset = offset + 3;\n tokenCount--; // rewrite prev token\n break;\n }\n }\n\n // -->\n if (code === HYPHENMINUS && prevType === HYPHENMINUS) {\n if (offset + 1 < sourceLength && source.charCodeAt(offset + 1) === GREATERTHANSIGN) {\n type = CDC;\n offset = offset + 2;\n tokenCount--; // rewrite prev token\n break;\n }\n }\n\n // ident(\n if (code === LEFTPARENTHESIS && prevType === IDENTIFIER) {\n offset = offset + 1;\n tokenCount--; // rewrite prev token\n balance[tokenCount] = balance[tokenCount + 1];\n balanceStart--;\n\n // 4 char length identifier and equal to `url(` (case insensitive)\n if (offset - anchor === 4 && cmpStr(source, anchor, offset, 'url(')) {\n // special case for url() because it can contain any symbols sequence with few exceptions\n anchor = findWhiteSpaceEnd(source, offset);\n code = source.charCodeAt(anchor);\n if (code !== LEFTPARENTHESIS &&\n code !== RIGHTPARENTHESIS &&\n code !== QUOTATIONMARK &&\n code !== APOSTROPHE) {\n // url(\n offsetAndType[tokenCount++] = (URL << TYPE_SHIFT) | offset;\n balance[tokenCount] = sourceLength;\n\n // ws*\n if (anchor !== offset) {\n offsetAndType[tokenCount++] = (WHITESPACE << TYPE_SHIFT) | anchor;\n balance[tokenCount] = sourceLength;\n }\n\n // raw\n type = RAW;\n offset = findUrlRawEnd(source, anchor);\n } else {\n type = URL;\n }\n } else {\n type = FUNCTION;\n }\n break;\n }\n\n type = code;\n offset = offset + 1;\n break;\n\n case NUMBER:\n offset = findNumberEnd(source, offset + 1, prevType !== FULLSTOP);\n\n // merge number with a preceding dot, dash or plus\n if (prevType === FULLSTOP ||\n prevType === HYPHENMINUS ||\n prevType === PLUSSIGN) {\n tokenCount--; // rewrite prev token\n }\n\n break;\n\n case STRING:\n offset = findStringEnd(source, offset + 1, code);\n break;\n\n default:\n anchor = offset;\n offset = findIdentifierEnd(source, offset);\n\n // merge identifier with a preceding dash\n if (prevType === HYPHENMINUS) {\n // rewrite prev token\n tokenCount--;\n // restore prev prev token type\n // for case @-prefix-ident\n prevType = tokenCount === 0 ? 0 : offsetAndType[tokenCount - 1] >> TYPE_SHIFT;\n }\n\n if (prevType === COMMERCIALAT) {\n // rewrite prev token and change type to <at-keyword-token>\n tokenCount--;\n type = ATKEYWORD;\n }\n }\n\n offsetAndType[tokenCount++] = (type << TYPE_SHIFT) | offset;\n prevType = type;\n }\n\n // finalize arrays\n offsetAndType[tokenCount] = offset;\n balance[tokenCount] = sourceLength;\n balance[sourceLength] = sourceLength; // prevents false positive balance match with any token\n while (balanceStart !== 0) {\n balancePrev = balanceStart & OFFSET_MASK;\n balanceStart = balance[balancePrev];\n balance[balancePrev] = sourceLength;\n }\n\n tokenizer.offsetAndType = offsetAndType;\n tokenizer.tokenCount = tokenCount;\n tokenizer.balance = balance;\n}\n\n//\n// tokenizer\n//\n\nvar Tokenizer = function(source, startOffset, startLine, startColumn) {\n this.offsetAndType = null;\n this.balance = null;\n this.lines = null;\n this.columns = null;\n\n this.setSource(source, startOffset, startLine, startColumn);\n};\n\nTokenizer.prototype = {\n setSource: function(source, startOffset, startLine, startColumn) {\n var safeSource = String(source || '');\n var start = firstCharOffset(safeSource);\n\n this.source = safeSource;\n this.firstCharOffset = start;\n this.startOffset = typeof startOffset === 'undefined' ? 0 : startOffset;\n this.startLine = typeof startLine === 'undefined' ? 1 : startLine;\n this.startColumn = typeof startColumn === 'undefined' ? 1 : startColumn;\n this.linesAnsColumnsComputed = false;\n\n this.eof = false;\n this.currentToken = -1;\n this.tokenType = 0;\n this.tokenStart = start;\n this.tokenEnd = start;\n\n tokenLayout(this, safeSource, start);\n this.next();\n },\n\n lookupType: function(offset) {\n offset += this.currentToken;\n\n if (offset < this.tokenCount) {\n return this.offsetAndType[offset] >> TYPE_SHIFT;\n }\n\n return NULL;\n },\n lookupNonWSType: function(offset) {\n offset += this.currentToken;\n\n for (var type; offset < this.tokenCount; offset++) {\n type = this.offsetAndType[offset] >> TYPE_SHIFT;\n\n if (type !== WHITESPACE) {\n return type;\n }\n }\n\n return NULL;\n },\n lookupValue: function(offset, referenceStr) {\n offset += this.currentToken;\n\n if (offset < this.tokenCount) {\n return cmpStr(\n this.source,\n this.offsetAndType[offset - 1] & OFFSET_MASK,\n this.offsetAndType[offset] & OFFSET_MASK,\n referenceStr\n );\n }\n\n return false;\n },\n getTokenStart: function(tokenNum) {\n if (tokenNum === this.currentToken) {\n return this.tokenStart;\n }\n\n if (tokenNum > 0) {\n return tokenNum < this.tokenCount\n ? this.offsetAndType[tokenNum - 1] & OFFSET_MASK\n : this.offsetAndType[this.tokenCount] & OFFSET_MASK;\n }\n\n return this.firstCharOffset;\n },\n getOffsetExcludeWS: function() {\n if (this.currentToken > 0) {\n if ((this.offsetAndType[this.currentToken - 1] >> TYPE_SHIFT) === WHITESPACE) {\n return this.currentToken > 1\n ? this.offsetAndType[this.currentToken - 2] & OFFSET_MASK\n : this.firstCharOffset;\n }\n }\n return this.tokenStart;\n },\n getRawLength: function(startToken, endTokenType1, endTokenType2, includeTokenType2) {\n var cursor = startToken;\n var balanceEnd;\n\n loop:\n for (; cursor < this.tokenCount; cursor++) {\n balanceEnd = this.balance[cursor];\n\n // belance end points to offset before start\n if (balanceEnd < startToken) {\n break loop;\n }\n\n // check token is stop type\n switch (this.offsetAndType[cursor] >> TYPE_SHIFT) {\n case endTokenType1:\n break loop;\n\n case endTokenType2:\n if (includeTokenType2) {\n cursor++;\n }\n break loop;\n\n default:\n // fast forward to the end of balanced block\n if (this.balance[balanceEnd] === cursor) {\n cursor = balanceEnd;\n }\n }\n\n }\n\n return cursor - this.currentToken;\n },\n isBalanceEdge: function(pos) {\n var balanceStart = this.balance[this.currentToken];\n return balanceStart < pos;\n },\n\n getTokenValue: function() {\n return this.source.substring(this.tokenStart, this.tokenEnd);\n },\n substrToCursor: function(start) {\n return this.source.substring(start, this.tokenStart);\n },\n\n skipWS: function() {\n for (var i = this.currentToken, skipTokenCount = 0; i < this.tokenCount; i++, skipTokenCount++) {\n if ((this.offsetAndType[i] >> TYPE_SHIFT) !== WHITESPACE) {\n break;\n }\n }\n\n if (skipTokenCount > 0) {\n this.skip(skipTokenCount);\n }\n },\n skipSC: function() {\n while (this.tokenType === WHITESPACE || this.tokenType === COMMENT) {\n this.next();\n }\n },\n skip: function(tokenCount) {\n var next = this.currentToken + tokenCount;\n\n if (next < this.tokenCount) {\n this.currentToken = next;\n this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK;\n next = this.offsetAndType[next];\n this.tokenType = next >> TYPE_SHIFT;\n this.tokenEnd = next & OFFSET_MASK;\n } else {\n this.currentToken = this.tokenCount;\n this.next();\n }\n },\n next: function() {\n var next = this.currentToken + 1;\n\n if (next < this.tokenCount) {\n this.currentToken = next;\n this.tokenStart = this.tokenEnd;\n next = this.offsetAndType[next];\n this.tokenType = next >> TYPE_SHIFT;\n this.tokenEnd = next & OFFSET_MASK;\n } else {\n this.currentToken = this.tokenCount;\n this.eof = true;\n this.tokenType = NULL;\n this.tokenStart = this.tokenEnd = this.source.length;\n }\n },\n\n eat: function(tokenType) {\n if (this.tokenType !== tokenType) {\n var offset = this.tokenStart;\n var message = NAME[tokenType] + ' is expected';\n\n // tweak message and offset\n if (tokenType === IDENTIFIER) {\n // when identifier is expected but there is a function or url\n if (this.tokenType === FUNCTION || this.tokenType === URL) {\n offset = this.tokenEnd - 1;\n message += ' but function found';\n }\n } else {\n // when test type is part of another token show error for current position + 1\n // e.g. eat(HYPHENMINUS) will fail on \"-foo\", but pointing on \"-\" is odd\n if (this.source.charCodeAt(this.tokenStart) === tokenType) {\n offset = offset + 1;\n }\n }\n\n this.error(message, offset);\n }\n\n this.next();\n },\n eatNonWS: function(tokenType) {\n this.skipWS();\n this.eat(tokenType);\n },\n\n consume: function(tokenType) {\n var value = this.getTokenValue();\n\n this.eat(tokenType);\n\n return value;\n },\n consumeFunctionName: function() {\n var name = this.source.substring(this.tokenStart, this.tokenEnd - 1);\n\n this.eat(FUNCTION);\n\n return name;\n },\n consumeNonWS: function(tokenType) {\n this.skipWS();\n\n return this.consume(tokenType);\n },\n\n expectIdentifier: function(name) {\n if (this.tokenType !== IDENTIFIER || cmpStr(this.source, this.tokenStart, this.tokenEnd, name) === false) {\n this.error('Identifier `' + name + '` is expected');\n }\n\n this.next();\n },\n\n getLocation: function(offset, filename) {\n if (!this.linesAnsColumnsComputed) {\n computeLinesAndColumns(this, this.source);\n }\n\n return {\n source: filename,\n offset: this.startOffset + offset,\n line: this.lines[offset],\n column: this.columns[offset]\n };\n },\n\n getLocationRange: function(start, end, filename) {\n if (!this.linesAnsColumnsComputed) {\n computeLinesAndColumns(this, this.source);\n }\n\n return {\n source: filename,\n start: {\n offset: this.startOffset + start,\n line: this.lines[start],\n column: this.columns[start]\n },\n end: {\n offset: this.startOffset + end,\n line: this.lines[end],\n column: this.columns[end]\n }\n };\n },\n\n error: function(message, offset) {\n var location = typeof offset !== 'undefined' && offset < this.source.length\n ? this.getLocation(offset)\n : this.eof\n ? this.getLocation(findWhiteSpaceStart(this.source, this.source.length - 1))\n : this.getLocation(this.tokenStart);\n\n throw new CssSyntaxError(\n message || 'Unexpected input',\n this.source,\n location.offset,\n location.line,\n location.column\n );\n },\n\n dump: function() {\n var offset = 0;\n\n return Array.prototype.slice.call(this.offsetAndType, 0, this.tokenCount).map(function(item, idx) {\n var start = offset;\n var end = item & OFFSET_MASK;\n\n offset = end;\n\n return {\n idx: idx,\n type: NAME[item >> TYPE_SHIFT],\n chunk: this.source.substring(start, end),\n balance: this.balance[idx]\n };\n }, this);\n }\n};\n\n// extend with error class\nTokenizer.CssSyntaxError = CssSyntaxError;\n\n// extend tokenizer with constants\nObject.keys(constants).forEach(function(key) {\n Tokenizer[key] = constants[key];\n});\n\n// extend tokenizer with static methods from utils\nObject.keys(utils).forEach(function(key) {\n Tokenizer[key] = utils[key];\n});\n\n// warm up tokenizer to elimitate code branches that never execute\n// fix soft deoptimizations (insufficient type feedback)\nnew Tokenizer('\\n\\r\\r\\n\\f<!---->//\"\"\\'\\'/*\\r\\n\\f*/1a;.\\\\31\\t\\+2{url(a);func();+1.2e3 -.4e-5 .6e+7}').getLocation();\n\nmodule.exports = Tokenizer;\n","function noop(value) {\n return value;\n}\n\nfunction generateMultiplier(multiplier) {\n if (multiplier.min === 0 && multiplier.max === 0) {\n return '*';\n }\n\n if (multiplier.min === 0 && multiplier.max === 1) {\n return '?';\n }\n\n if (multiplier.min === 1 && multiplier.max === 0) {\n return multiplier.comma ? '#' : '+';\n }\n\n if (multiplier.min === 1 && multiplier.max === 1) {\n return '';\n }\n\n return (\n (multiplier.comma ? '#' : '') +\n (multiplier.min === multiplier.max\n ? '{' + multiplier.min + '}'\n : '{' + multiplier.min + ',' + (multiplier.max !== 0 ? multiplier.max : '') + '}'\n )\n );\n}\n\nfunction generateSequence(node, forceBraces, decorate) {\n var result = node.terms.map(function(term) {\n return generate(term, forceBraces, decorate);\n }).join(node.combinator === ' ' ? ' ' : ' ' + node.combinator + ' ');\n\n if (node.explicit || forceBraces) {\n result = (result[0] !== ',' ? '[ ' : '[') + result + ' ]';\n }\n\n return result;\n}\n\nfunction generate(node, forceBraces, decorate) {\n var result;\n\n switch (node.type) {\n case 'Group':\n result =\n generateSequence(node, forceBraces, decorate) +\n (node.disallowEmpty ? '!' : '');\n break;\n\n case 'Multiplier':\n // return since node is a composition\n return (\n generate(node.term, forceBraces, decorate) +\n decorate(generateMultiplier(node), node)\n );\n\n case 'Type':\n result = '<' + node.name + '>';\n break;\n\n case 'Property':\n result = '<\\'' + node.name + '\\'>';\n break;\n\n case 'Keyword':\n result = node.name;\n break;\n\n case 'AtKeyword':\n result = '@' + node.name;\n break;\n\n case 'Function':\n result = node.name + '(';\n break;\n\n case 'String':\n case 'Token':\n result = node.value;\n break;\n\n case 'Comma':\n result = ',';\n break;\n\n default:\n throw new Error('Unknown node type `' + node.type + '`');\n }\n\n return decorate(result, node);\n}\n\nmodule.exports = function(node, options) {\n var decorate = noop;\n var forceBraces = false;\n\n if (typeof options === 'function') {\n decorate = options;\n } else if (options) {\n forceBraces = Boolean(options.forceBraces);\n if (typeof options.decorate === 'function') {\n decorate = options.decorate;\n }\n }\n\n return generate(node, forceBraces, decorate);\n};\n","'use strict';\n\nvar createCustomError = require('../utils/createCustomError');\nvar generateGrammar = require('./grammar/generate');\n\nfunction fromMatchResult(matchResult) {\n var tokens = matchResult.tokens;\n var longestMatch = matchResult.longestMatch;\n var node = longestMatch < tokens.length ? tokens[longestMatch].node : null;\n var mismatchOffset = 0;\n var entries = 0;\n var css = '';\n\n for (var i = 0; i < tokens.length; i++) {\n if (i === longestMatch) {\n mismatchOffset = css.length;\n }\n\n if (node !== null && tokens[i].node === node) {\n if (i <= longestMatch) {\n entries++;\n } else {\n entries = 0;\n }\n }\n\n css += tokens[i].value;\n }\n\n if (node === null) {\n mismatchOffset = css.length;\n }\n\n return {\n node: node,\n css: css,\n mismatchOffset: mismatchOffset,\n last: node === null || entries > 1\n };\n}\n\nfunction getLocation(node, point) {\n var loc = node && node.loc && node.loc[point];\n\n if (loc) {\n return {\n offset: loc.offset,\n line: loc.line,\n column: loc.column\n };\n }\n\n return null;\n}\n\nvar SyntaxReferenceError = function(type, referenceName) {\n var error = createCustomError(\n 'SyntaxReferenceError',\n type + (referenceName ? ' `' + referenceName + '`' : '')\n );\n\n error.reference = referenceName;\n\n return error;\n};\n\nvar MatchError = function(message, lexer, syntax, node, matchResult) {\n var error = createCustomError('SyntaxMatchError', message);\n var details = fromMatchResult(matchResult);\n var mismatchOffset = details.mismatchOffset || 0;\n var badNode = details.node || node;\n var end = getLocation(badNode, 'end');\n var start = details.last ? end : getLocation(badNode, 'start');\n var css = details.css;\n\n error.rawMessage = message;\n error.syntax = syntax ? generateGrammar(syntax) : '<generic>';\n error.css = css;\n error.mismatchOffset = mismatchOffset;\n error.loc = {\n source: (badNode && badNode.loc && badNode.loc.source) || '<unknown>',\n start: start,\n end: end\n };\n error.line = start ? start.line : undefined;\n error.column = start ? start.column : undefined;\n error.offset = start ? start.offset : undefined;\n error.message = message + '\\n' +\n ' syntax: ' + error.syntax + '\\n' +\n ' value: ' + (error.css || '<empty string>') + '\\n' +\n ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^';\n\n return error;\n};\n\nmodule.exports = {\n SyntaxReferenceError: SyntaxReferenceError,\n MatchError: MatchError\n};\n","'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar keywords = Object.create(null);\nvar properties = Object.create(null);\nvar HYPHENMINUS = 45; // '-'.charCodeAt()\n\nfunction isCustomProperty(str, offset) {\n offset = offset || 0;\n\n return str.length - offset >= 2 &&\n str.charCodeAt(offset) === HYPHENMINUS &&\n str.charCodeAt(offset + 1) === HYPHENMINUS;\n}\n\nfunction getVendorPrefix(str, offset) {\n offset = offset || 0;\n\n // verdor prefix should be at least 3 chars length\n if (str.length - offset >= 3) {\n // vendor prefix starts with hyper minus following non-hyper minus\n if (str.charCodeAt(offset) === HYPHENMINUS &&\n str.charCodeAt(offset + 1) !== HYPHENMINUS) {\n // vendor prefix should contain a hyper minus at the ending\n var secondDashIndex = str.indexOf('-', offset + 2);\n\n if (secondDashIndex !== -1) {\n return str.substring(offset, secondDashIndex + 1);\n }\n }\n }\n\n return '';\n}\n\nfunction getKeywordDescriptor(keyword) {\n if (hasOwnProperty.call(keywords, keyword)) {\n return keywords[keyword];\n }\n\n var name = keyword.toLowerCase();\n\n if (hasOwnProperty.call(keywords, name)) {\n return keywords[keyword] = keywords[name];\n }\n\n var custom = isCustomProperty(name, 0);\n var vendor = !custom ? getVendorPrefix(name, 0) : '';\n\n return keywords[keyword] = Object.freeze({\n basename: name.substr(vendor.length),\n name: name,\n vendor: vendor,\n prefix: vendor,\n custom: custom\n });\n}\n\nfunction getPropertyDescriptor(property) {\n if (hasOwnProperty.call(properties, property)) {\n return properties[property];\n }\n\n var name = property;\n var hack = property[0];\n\n if (hack === '/') {\n hack = property[1] === '/' ? '//' : '/';\n } else if (hack !== '_' &&\n hack !== '*' &&\n hack !== '$' &&\n hack !== '#' &&\n hack !== '+') {\n hack = '';\n }\n\n var custom = isCustomProperty(name, hack.length);\n\n // re-use result when possible (the same as for lower case)\n if (!custom) {\n name = name.toLowerCase();\n if (hasOwnProperty.call(properties, name)) {\n return properties[property] = properties[name];\n }\n }\n\n var vendor = !custom ? getVendorPrefix(name, hack.length) : '';\n var prefix = name.substr(0, hack.length + vendor.length);\n\n return properties[property] = Object.freeze({\n basename: name.substr(prefix.length),\n name: name.substr(hack.length),\n hack: hack,\n vendor: vendor,\n prefix: prefix,\n custom: custom\n });\n}\n\nmodule.exports = {\n keyword: getKeywordDescriptor,\n property: getPropertyDescriptor,\n isCustomProperty: isCustomProperty,\n vendorPrefix: getVendorPrefix\n};\n","var tokenizerUtils = require('../tokenizer/utils');\nvar findIdentifierEnd = tokenizerUtils.findIdentifierEnd;\nvar findNumberEnd = tokenizerUtils.findNumberEnd;\nvar findDecimalNumberEnd = tokenizerUtils.findDecimalNumberEnd;\nvar isHex = tokenizerUtils.isHex;\nvar tokenizerConst = require('../tokenizer/const');\nvar SYMBOL_TYPE = tokenizerConst.SYMBOL_TYPE;\nvar IDENTIFIER = tokenizerConst.TYPE.Identifier;\nvar PLUSSIGN = tokenizerConst.TYPE.PlusSign;\nvar HYPHENMINUS = tokenizerConst.TYPE.HyphenMinus;\nvar NUMBERSIGN = tokenizerConst.TYPE.NumberSign;\n\nvar PERCENTAGE = {\n '%': true\n};\n\n// https://www.w3.org/TR/css-values-3/#lengths\nvar LENGTH = {\n // absolute length units\n 'px': true,\n 'mm': true,\n 'cm': true,\n 'in': true,\n 'pt': true,\n 'pc': true,\n 'q': true,\n\n // relative length units\n 'em': true,\n 'ex': true,\n 'ch': true,\n 'rem': true,\n\n // viewport-percentage lengths\n 'vh': true,\n 'vw': true,\n 'vmin': true,\n 'vmax': true,\n 'vm': true\n};\n\nvar ANGLE = {\n 'deg': true,\n 'grad': true,\n 'rad': true,\n 'turn': true\n};\n\nvar TIME = {\n 's': true,\n 'ms': true\n};\n\nvar FREQUENCY = {\n 'hz': true,\n 'khz': true\n};\n\n// https://www.w3.org/TR/css-values-3/#resolution (https://drafts.csswg.org/css-values/#resolution)\nvar RESOLUTION = {\n 'dpi': true,\n 'dpcm': true,\n 'dppx': true,\n 'x': true // https://github.com/w3c/csswg-drafts/issues/461\n};\n\n// https://drafts.csswg.org/css-grid/#fr-unit\nvar FLEX = {\n 'fr': true\n};\n\n// https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume\nvar DECIBEL = {\n 'db': true\n};\n\n// https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch\nvar SEMITONES = {\n 'st': true\n};\n\nfunction consumeFunction(token, addTokenToMatch, getNextToken) {\n var length = 1;\n var cursor;\n\n do {\n cursor = getNextToken(length++);\n } while (cursor !== null && cursor.node !== token.node);\n\n if (cursor === null) {\n return false;\n }\n\n while (true) {\n // consume tokens until cursor\n if (addTokenToMatch() === cursor) {\n break;\n }\n }\n\n return true;\n}\n\n// TODO: implement\n// can be used wherever <length>, <frequency>, <angle>, <time>, <percentage>, <number>, or <integer> values are allowed\n// https://drafts.csswg.org/css-values/#calc-notation\nfunction calc(token, addTokenToMatch, getNextToken) {\n if (token === null) {\n return false;\n }\n\n var name = token.value.toLowerCase();\n if (name !== 'calc(' &&\n name !== '-moz-calc(' &&\n name !== '-webkit-calc(') {\n return false;\n }\n\n return consumeFunction(token, addTokenToMatch, getNextToken);\n}\n\nfunction attr(token, addTokenToMatch, getNextToken) {\n if (token === null || token.value.toLowerCase() !== 'attr(') {\n return false;\n }\n\n return consumeFunction(token, addTokenToMatch, getNextToken);\n}\n\nfunction expression(token, addTokenToMatch, getNextToken) {\n if (token === null || token.value.toLowerCase() !== 'expression(') {\n return false;\n }\n\n return consumeFunction(token, addTokenToMatch, getNextToken);\n}\n\nfunction url(token, addTokenToMatch, getNextToken) {\n if (token === null || token.value.toLowerCase() !== 'url(') {\n return false;\n }\n\n return consumeFunction(token, addTokenToMatch, getNextToken);\n}\n\nfunction idSelector(token, addTokenToMatch) {\n if (token === null) {\n return false;\n }\n\n if (token.value.charCodeAt(0) !== NUMBERSIGN) {\n return false;\n }\n\n if (consumeIdentifier(token.value, 1) !== token.value.length) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n}\n\nfunction isNumber(str) {\n return /^[-+]?(\\d+|\\d*\\.\\d+)([eE][-+]?\\d+)?$/.test(str);\n}\n\nfunction consumeNumber(str, allowFraction) {\n var code = str.charCodeAt(0);\n\n return findNumberEnd(str, code === PLUSSIGN || code === HYPHENMINUS ? 1 : 0, allowFraction);\n}\n\nfunction consumeIdentifier(str, offset) {\n var code = str.charCodeAt(offset);\n\n if (code < 0x80 && SYMBOL_TYPE[code] !== IDENTIFIER && code !== HYPHENMINUS) {\n return offset;\n }\n\n return findIdentifierEnd(str, offset + 1);\n}\n\nfunction astNode(type) {\n return function(token, addTokenToMatch) {\n if (token === null || token.node.type !== type) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n };\n}\n\nfunction dimension(type) {\n return function(token, addTokenToMatch, getNextToken) {\n if (calc(token, addTokenToMatch, getNextToken)) {\n return true;\n }\n\n if (token === null) {\n return false;\n }\n\n var numberEnd = consumeNumber(token.value, true);\n if (numberEnd === 0) {\n return false;\n }\n\n if (type) {\n if (!type.hasOwnProperty(token.value.substr(numberEnd).toLowerCase())) {\n return false;\n }\n } else {\n var unitEnd = consumeIdentifier(token.value, numberEnd);\n if (unitEnd === numberEnd || unitEnd !== token.value.length) {\n return false;\n }\n }\n\n addTokenToMatch();\n return true;\n };\n}\n\nfunction zeroUnitlessDimension(type) {\n var isDimension = dimension(type);\n\n return function(token, addTokenToMatch, getNextToken) {\n if (isDimension(token, addTokenToMatch, getNextToken)) {\n return true;\n }\n\n if (token === null || Number(token.value) !== 0) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n };\n}\n\nfunction number(token, addTokenToMatch, getNextToken) {\n if (calc(token, addTokenToMatch, getNextToken)) {\n return true;\n }\n\n if (token === null) {\n return false;\n }\n\n var numberEnd = consumeNumber(token.value, true);\n if (numberEnd !== token.value.length) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n}\n\nfunction numberZeroOne(token, addTokenToMatch, getNextToken) {\n if (calc(token, addTokenToMatch, getNextToken)) {\n return true;\n }\n\n if (token === null || !isNumber(token.value)) {\n return false;\n }\n\n var value = Number(token.value);\n if (value < 0 || value > 1) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n}\n\nfunction numberOneOrGreater(token, addTokenToMatch, getNextToken) {\n if (calc(token, addTokenToMatch, getNextToken)) {\n return true;\n }\n\n if (token === null || !isNumber(token.value)) {\n return false;\n }\n\n var value = Number(token.value);\n if (value < 1) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n}\n\n// TODO: fail on 10e-2\nfunction integer(token, addTokenToMatch, getNextToken) {\n if (calc(token, addTokenToMatch, getNextToken)) {\n return true;\n }\n\n if (token === null) {\n return false;\n }\n\n var numberEnd = consumeNumber(token.value, false);\n if (numberEnd !== token.value.length) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n}\n\n// TODO: fail on 10e-2\nfunction positiveInteger(token, addTokenToMatch, getNextToken) {\n if (calc(token, addTokenToMatch, getNextToken)) {\n return true;\n }\n\n if (token === null) {\n return false;\n }\n\n var numberEnd = findDecimalNumberEnd(token.value, 0);\n if (numberEnd !== token.value.length || token.value.charCodeAt(0) === HYPHENMINUS) {\n return false;\n }\n\n addTokenToMatch();\n return true;\n}\n\nfunction hexColor(token, addTokenToMatch) {\n if (token === null || token.value.charCodeAt(0) !== NUMBERSIGN) {\n return false;\n }\n\n var length = token.value.length - 1;\n\n // valid length is 3, 4, 6 and 8 (+1 for #)\n if (length !== 3 && length !== 4 && length !== 6 && length !== 8) {\n return false;\n }\n\n for (var i = 1; i < length; i++) {\n if (!isHex(token.value.charCodeAt(i))) {\n return false;\n }\n }\n\n addTokenToMatch();\n return true;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident\n// https://drafts.csswg.org/css-values-4/#identifier-value\nfunction customIdent(token, addTokenToMatch) {\n if (token === null) {\n return false;\n }\n\n var identEnd = consumeIdentifier(token.value, 0);\n if (identEnd !== token.value.length) {\n return false;\n }\n\n var name = token.value.toLowerCase();\n\n // § 3.2. Author-defined Identifiers: the <custom-ident> type\n // The CSS-wide keywords are not valid <custom-ident>s\n if (name === 'unset' || name === 'initial' || name === 'inherit') {\n return false;\n }\n\n // The default keyword is reserved and is also not a valid <custom-ident>\n if (name === 'default') {\n return false;\n }\n\n // TODO: ignore property specific keywords (as described https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident)\n\n addTokenToMatch();\n return true;\n}\n\nmodule.exports = {\n 'angle': zeroUnitlessDimension(ANGLE),\n 'attr()': attr,\n 'custom-ident': customIdent,\n 'decibel': dimension(DECIBEL),\n 'dimension': dimension(),\n 'frequency': dimension(FREQUENCY),\n 'flex': dimension(FLEX),\n 'hex-color': hexColor,\n 'id-selector': idSelector, // element( <id-selector> )\n 'ident': astNode('Identifier'),\n 'integer': integer,\n 'length': zeroUnitlessDimension(LENGTH),\n 'number': number,\n 'number-zero-one': numberZeroOne,\n 'number-one-or-greater': numberOneOrGreater,\n 'percentage': dimension(PERCENTAGE),\n 'positive-integer': positiveInteger,\n 'resolution': dimension(RESOLUTION),\n 'semitones': dimension(SEMITONES),\n 'string': astNode('String'),\n 'time': dimension(TIME),\n 'unicode-range': astNode('UnicodeRange'),\n 'url': url,\n\n // old IE stuff\n 'progid': astNode('Raw'),\n 'expression': expression\n};\n","var Tokenizer = require('./tokenizer');\nvar TAB = 9;\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar SPACE = 32;\nvar EXCLAMATIONMARK = 33; // !\nvar NUMBERSIGN = 35; // #\nvar AMPERSAND = 38; // &\nvar APOSTROPHE = 39; // '\nvar LEFTPARENTHESIS = 40; // (\nvar RIGHTPARENTHESIS = 41; // )\nvar ASTERISK = 42; // *\nvar PLUSSIGN = 43; // +\nvar COMMA = 44; // ,\nvar LESSTHANSIGN = 60; // <\nvar GREATERTHANSIGN = 62; // >\nvar QUESTIONMARK = 63; // ?\nvar COMMERCIALAT = 64; // @\nvar LEFTSQUAREBRACKET = 91; // [\nvar RIGHTSQUAREBRACKET = 93; // ]\nvar LEFTCURLYBRACKET = 123; // {\nvar VERTICALLINE = 124; // |\nvar RIGHTCURLYBRACKET = 125; // }\nvar NAME_CHAR = createCharMap(function(ch) {\n return /[a-zA-Z0-9\\-]/.test(ch);\n});\nvar COMBINATOR_PRECEDENCE = {\n ' ': 1,\n '&&': 2,\n '||': 3,\n '|': 4\n};\n\nfunction createCharMap(fn) {\n var array = typeof Uint32Array === 'function' ? new Uint32Array(128) : new Array(128);\n for (var i = 0; i < 128; i++) {\n array[i] = fn(String.fromCharCode(i)) ? 1 : 0;\n }\n return array;\n}\n\nfunction scanSpaces(tokenizer) {\n return tokenizer.substringToPos(\n tokenizer.findWsEnd(tokenizer.pos + 1)\n );\n}\n\nfunction scanWord(tokenizer) {\n var end = tokenizer.pos;\n\n for (; end < tokenizer.str.length; end++) {\n var code = tokenizer.str.charCodeAt(end);\n if (code >= 128 || NAME_CHAR[code] === 0) {\n break;\n }\n }\n\n if (tokenizer.pos === end) {\n tokenizer.error('Expect a keyword');\n }\n\n return tokenizer.substringToPos(end);\n}\n\nfunction scanNumber(tokenizer) {\n var end = tokenizer.pos;\n\n for (; end < tokenizer.str.length; end++) {\n var code = tokenizer.str.charCodeAt(end);\n if (code < 48 || code > 57) {\n break;\n }\n }\n\n if (tokenizer.pos === end) {\n tokenizer.error('Expect a number');\n }\n\n return tokenizer.substringToPos(end);\n}\n\nfunction scanString(tokenizer) {\n var end = tokenizer.str.indexOf('\\'', tokenizer.pos + 1);\n\n if (end === -1) {\n tokenizer.pos = tokenizer.str.length;\n tokenizer.error('Expect an apostrophe');\n }\n\n return tokenizer.substringToPos(end + 1);\n}\n\nfunction readMultiplierRange(tokenizer) {\n var min = null;\n var max = null;\n\n tokenizer.eat(LEFTCURLYBRACKET);\n\n min = scanNumber(tokenizer);\n\n if (tokenizer.charCode() === COMMA) {\n tokenizer.pos++;\n if (tokenizer.charCode() !== RIGHTCURLYBRACKET) {\n max = scanNumber(tokenizer);\n }\n } else {\n max = min;\n }\n\n tokenizer.eat(RIGHTCURLYBRACKET);\n\n return {\n min: Number(min),\n max: max ? Number(max) : 0\n };\n}\n\nfunction readMultiplier(tokenizer) {\n var range = null;\n var comma = false;\n\n switch (tokenizer.charCode()) {\n case ASTERISK:\n tokenizer.pos++;\n\n range = {\n min: 0,\n max: 0\n };\n\n break;\n\n case PLUSSIGN:\n tokenizer.pos++;\n\n range = {\n min: 1,\n max: 0\n };\n\n break;\n\n case QUESTIONMARK:\n tokenizer.pos++;\n\n range = {\n min: 0,\n max: 1\n };\n\n break;\n\n case NUMBERSIGN:\n tokenizer.pos++;\n\n comma = true;\n\n if (tokenizer.charCode() === LEFTCURLYBRACKET) {\n range = readMultiplierRange(tokenizer);\n } else {\n range = {\n min: 1,\n max: 0\n };\n }\n\n break;\n\n case LEFTCURLYBRACKET:\n range = readMultiplierRange(tokenizer);\n break;\n\n default:\n return null;\n }\n\n return {\n type: 'Multiplier',\n comma: comma,\n min: range.min,\n max: range.max,\n term: null\n };\n}\n\nfunction maybeMultiplied(tokenizer, node) {\n var multiplier = readMultiplier(tokenizer);\n\n if (multiplier !== null) {\n multiplier.term = node;\n return multiplier;\n }\n\n return node;\n}\n\nfunction maybeToken(tokenizer) {\n var ch = tokenizer.peek();\n\n if (ch === '') {\n return null;\n }\n\n return {\n type: 'Token',\n value: ch\n };\n}\n\nfunction readProperty(tokenizer) {\n var name;\n\n tokenizer.eat(LESSTHANSIGN);\n tokenizer.eat(APOSTROPHE);\n\n name = scanWord(tokenizer);\n\n tokenizer.eat(APOSTROPHE);\n tokenizer.eat(GREATERTHANSIGN);\n\n return maybeMultiplied(tokenizer, {\n type: 'Property',\n name: name\n });\n}\n\nfunction readType(tokenizer) {\n var name;\n\n tokenizer.eat(LESSTHANSIGN);\n name = scanWord(tokenizer);\n\n if (tokenizer.charCode() === LEFTPARENTHESIS &&\n tokenizer.nextCharCode() === RIGHTPARENTHESIS) {\n tokenizer.pos += 2;\n name += '()';\n }\n\n tokenizer.eat(GREATERTHANSIGN);\n\n return maybeMultiplied(tokenizer, {\n type: 'Type',\n name: name\n });\n}\n\nfunction readKeywordOrFunction(tokenizer) {\n var name;\n\n name = scanWord(tokenizer);\n\n if (tokenizer.charCode() === LEFTPARENTHESIS) {\n tokenizer.pos++;\n\n return {\n type: 'Function',\n name: name\n };\n }\n\n return maybeMultiplied(tokenizer, {\n type: 'Keyword',\n name: name\n });\n}\n\nfunction regroupTerms(terms, combinators) {\n function createGroup(terms, combinator) {\n return {\n type: 'Group',\n terms: terms,\n combinator: combinator,\n disallowEmpty: false,\n explicit: false\n };\n }\n\n combinators = Object.keys(combinators).sort(function(a, b) {\n return COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b];\n });\n\n while (combinators.length > 0) {\n var combinator = combinators.shift();\n for (var i = 0, subgroupStart = 0; i < terms.length; i++) {\n var term = terms[i];\n if (term.type === 'Combinator') {\n if (term.value === combinator) {\n if (subgroupStart === -1) {\n subgroupStart = i - 1;\n }\n terms.splice(i, 1);\n i--;\n } else {\n if (subgroupStart !== -1 && i - subgroupStart > 1) {\n terms.splice(\n subgroupStart,\n i - subgroupStart,\n createGroup(terms.slice(subgroupStart, i), combinator)\n );\n i = subgroupStart + 1;\n }\n subgroupStart = -1;\n }\n }\n }\n\n if (subgroupStart !== -1 && combinators.length) {\n terms.splice(\n subgroupStart,\n i - subgroupStart,\n createGroup(terms.slice(subgroupStart, i), combinator)\n );\n }\n }\n\n return combinator;\n}\n\nfunction readImplicitGroup(tokenizer) {\n var terms = [];\n var combinators = {};\n var token;\n var prevToken = null;\n var prevTokenPos = tokenizer.pos;\n\n while (token = peek(tokenizer)) {\n if (token.type !== 'Spaces') {\n if (token.type === 'Combinator') {\n // check for combinator in group beginning and double combinator sequence\n if (prevToken === null || prevToken.type === 'Combinator') {\n tokenizer.pos = prevTokenPos;\n tokenizer.error('Unexpected combinator');\n }\n\n combinators[token.value] = true;\n } else if (prevToken !== null && prevToken.type !== 'Combinator') {\n combinators[' '] = true; // a b\n terms.push({\n type: 'Combinator',\n value: ' '\n });\n }\n\n terms.push(token);\n prevToken = token;\n prevTokenPos = tokenizer.pos;\n }\n }\n\n // check for combinator in group ending\n if (prevToken !== null && prevToken.type === 'Combinator') {\n tokenizer.pos -= prevTokenPos;\n tokenizer.error('Unexpected combinator');\n }\n\n return {\n type: 'Group',\n terms: terms,\n combinator: regroupTerms(terms, combinators) || ' ',\n disallowEmpty: false,\n explicit: false\n };\n}\n\nfunction readGroup(tokenizer) {\n var result;\n\n tokenizer.eat(LEFTSQUAREBRACKET);\n result = readImplicitGroup(tokenizer);\n tokenizer.eat(RIGHTSQUAREBRACKET);\n\n result.explicit = true;\n\n if (tokenizer.charCode() === EXCLAMATIONMARK) {\n tokenizer.pos++;\n result.disallowEmpty = true;\n }\n\n return result;\n}\n\nfunction peek(tokenizer) {\n var code = tokenizer.charCode();\n\n if (code < 128 && NAME_CHAR[code] === 1) {\n return readKeywordOrFunction(tokenizer);\n }\n\n switch (code) {\n case RIGHTSQUAREBRACKET:\n // don't eat, stop scan a group\n break;\n\n case LEFTSQUAREBRACKET:\n return maybeMultiplied(tokenizer, readGroup(tokenizer));\n\n case LESSTHANSIGN:\n return tokenizer.nextCharCode() === APOSTROPHE\n ? readProperty(tokenizer)\n : readType(tokenizer);\n\n case VERTICALLINE:\n return {\n type: 'Combinator',\n value: tokenizer.substringToPos(\n tokenizer.nextCharCode() === VERTICALLINE\n ? tokenizer.pos + 2\n : tokenizer.pos + 1\n )\n };\n\n case AMPERSAND:\n tokenizer.pos++;\n tokenizer.eat(AMPERSAND);\n\n return {\n type: 'Combinator',\n value: '&&'\n };\n\n case COMMA:\n tokenizer.pos++;\n return {\n type: 'Comma'\n };\n\n case APOSTROPHE:\n return maybeMultiplied(tokenizer, {\n type: 'String',\n value: scanString(tokenizer)\n });\n\n case SPACE:\n case TAB:\n case N:\n case R:\n case F:\n return {\n type: 'Spaces',\n value: scanSpaces(tokenizer)\n };\n\n case COMMERCIALAT:\n code = tokenizer.nextCharCode();\n\n if (code < 128 && NAME_CHAR[code] === 1) {\n tokenizer.pos++;\n return {\n type: 'AtKeyword',\n name: scanWord(tokenizer)\n };\n }\n\n return maybeToken(tokenizer);\n\n case ASTERISK:\n case PLUSSIGN:\n case QUESTIONMARK:\n case NUMBERSIGN:\n case EXCLAMATIONMARK:\n // prohibited tokens (used as a multiplier start)\n break;\n\n case LEFTCURLYBRACKET:\n // LEFTCURLYBRACKET is allowed since mdn/data uses it w/o quoting\n // check next char isn't a number, because it's likely a disjoined multiplier\n code = tokenizer.nextCharCode();\n\n if (code < 48 || code > 57) {\n return maybeToken(tokenizer);\n }\n\n break;\n\n default:\n return maybeToken(tokenizer);\n }\n}\n\nfunction parse(str) {\n var tokenizer = new Tokenizer(str);\n var result = readImplicitGroup(tokenizer);\n\n if (tokenizer.pos !== str.length) {\n tokenizer.error('Unexpected input');\n }\n\n // reduce redundant groups with single group term\n if (result.terms.length === 1 && result.terms[0].type === 'Group') {\n result = result.terms[0];\n }\n\n return result;\n}\n\n// warm up parse to elimitate code branches that never execute\n// fix soft deoptimizations (insufficient type feedback)\nparse('[a&&<b>#|<\\'c\\'>*||e() f{2} /,(% g#{1,2} h{2,})]!');\n\nmodule.exports = parse;\n","'use strict';\n\nvar noop = function() {};\n\nfunction ensureFunction(value) {\n return typeof value === 'function' ? value : noop;\n}\n\nmodule.exports = function(node, options, context) {\n function walk(node) {\n enter.call(context, node);\n\n switch (node.type) {\n case 'Group':\n node.terms.forEach(walk);\n break;\n\n case 'Multiplier':\n walk(node.term);\n break;\n\n case 'Type':\n case 'Property':\n case 'Keyword':\n case 'AtKeyword':\n case 'Function':\n case 'String':\n case 'Token':\n case 'Comma':\n break;\n\n default:\n throw new Error('Unknown type: ' + node.type);\n }\n\n leave.call(context, node);\n }\n\n var enter = noop;\n var leave = noop;\n\n if (typeof options === 'function') {\n enter = options;\n } else if (options) {\n enter = ensureFunction(options.enter);\n leave = ensureFunction(options.leave);\n }\n\n if (enter === noop && leave === noop) {\n throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\\'t a function');\n }\n\n walk(node, context);\n};\n","var parse = require('./grammar/parse');\n\nvar MATCH = { type: 'Match' };\nvar MISMATCH = { type: 'Mismatch' };\nvar DISALLOW_EMPTY = { type: 'DisallowEmpty' };\nvar LEFTPARENTHESIS = 40; // (\nvar RIGHTPARENTHESIS = 41; // )\n\nfunction createCondition(match, thenBranch, elseBranch) {\n // reduce node count\n if (thenBranch === MATCH && elseBranch === MISMATCH) {\n return match;\n }\n\n if (match === MATCH && thenBranch === MATCH && elseBranch === MATCH) {\n return match;\n }\n\n if (match.type === 'If' && match.else === MISMATCH && thenBranch === MATCH) {\n thenBranch = match.then;\n match = match.match;\n }\n\n return {\n type: 'If',\n match: match,\n then: thenBranch,\n else: elseBranch\n };\n}\n\nfunction isFunctionType(name) {\n return (\n name.length > 2 &&\n name.charCodeAt(name.length - 2) === LEFTPARENTHESIS &&\n name.charCodeAt(name.length - 1) === RIGHTPARENTHESIS\n );\n}\n\nfunction isEnumCapatible(term) {\n return (\n term.type === 'Keyword' ||\n term.type === 'AtKeyword' ||\n term.type === 'Function' ||\n term.type === 'Type' && isFunctionType(term.name)\n );\n}\n\nfunction buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) {\n switch (combinator) {\n case ' ':\n // Juxtaposing components means that all of them must occur, in the given order.\n //\n // a b c\n // =\n // match a\n // then match b\n // then match c\n // then MATCH\n // else MISMATCH\n // else MISMATCH\n // else MISMATCH\n var result = MATCH;\n\n for (var i = terms.length - 1; i >= 0; i--) {\n var term = terms[i];\n\n result = createCondition(\n term,\n result,\n MISMATCH\n );\n };\n\n return result;\n\n case '|':\n // A bar (|) separates two or more alternatives: exactly one of them must occur.\n //\n // a | b | c\n // =\n // match a\n // then MATCH\n // else match b\n // then MATCH\n // else match c\n // then MATCH\n // else MISMATCH\n\n var result = MISMATCH;\n var map = null;\n\n for (var i = terms.length - 1; i >= 0; i--) {\n var term = terms[i];\n\n // reduce sequence of keywords into a Enum\n if (isEnumCapatible(term)) {\n if (map === null && i > 0 && isEnumCapatible(terms[i - 1])) {\n map = Object.create(null);\n result = createCondition(\n {\n type: 'Enum',\n map: map\n },\n MATCH,\n result\n );\n }\n\n if (map !== null) {\n var key = (isFunctionType(term.name) ? term.name.slice(0, -1) : term.name).toLowerCase();\n if (key in map === false) {\n map[key] = term;\n continue;\n }\n }\n }\n\n map = null;\n\n // create a new conditonal node\n result = createCondition(\n term,\n MATCH,\n result\n );\n };\n\n return result;\n\n case '&&':\n // A double ampersand (&&) separates two or more components,\n // all of which must occur, in any order.\n\n // Use MatchOnce for groups with a large number of terms,\n // since &&-groups produces at least N!-node trees\n if (terms.length > 5) {\n return {\n type: 'MatchOnce',\n terms: terms,\n all: true\n };\n }\n\n // Use a combination tree for groups with small number of terms\n //\n // a && b && c\n // =\n // match a\n // then [b && c]\n // else match b\n // then [a && c]\n // else match c\n // then [a && b]\n // else MISMATCH\n //\n // a && b\n // =\n // match a\n // then match b\n // then MATCH\n // else MISMATCH\n // else match b\n // then match a\n // then MATCH\n // else MISMATCH\n // else MISMATCH\n var result = MISMATCH;\n\n for (var i = terms.length - 1; i >= 0; i--) {\n var term = terms[i];\n var thenClause;\n\n if (terms.length > 1) {\n thenClause = buildGroupMatchGraph(\n combinator,\n terms.filter(function(newGroupTerm) {\n return newGroupTerm !== term;\n }),\n false\n );\n } else {\n thenClause = MATCH;\n }\n\n result = createCondition(\n term,\n thenClause,\n result\n );\n };\n\n return result;\n\n case '||':\n // A double bar (||) separates two or more options:\n // one or more of them must occur, in any order.\n\n // Use MatchOnce for groups with a large number of terms,\n // since ||-groups produces at least N!-node trees\n if (terms.length > 5) {\n return {\n type: 'MatchOnce',\n terms: terms,\n all: false\n };;\n }\n\n // Use a combination tree for groups with small number of terms\n //\n // a || b || c\n // =\n // match a\n // then [b || c]\n // else match b\n // then [a || c]\n // else match c\n // then [a || b]\n // else MISMATCH\n //\n // a || b\n // =\n // match a\n // then match b\n // then MATCH\n // else MATCH\n // else match b\n // then match a\n // then MATCH\n // else MATCH\n // else MISMATCH\n var result = atLeastOneTermMatched ? MATCH : MISMATCH;\n\n for (var i = terms.length - 1; i >= 0; i--) {\n var term = terms[i];\n var thenClause;\n\n if (terms.length > 1) {\n thenClause = buildGroupMatchGraph(\n combinator,\n terms.filter(function(newGroupTerm) {\n return newGroupTerm !== term;\n }),\n true\n );\n } else {\n thenClause = MATCH;\n }\n\n result = createCondition(\n term,\n thenClause,\n result\n );\n };\n\n return result;\n }\n}\n\nfunction buildMultiplierMatchGraph(node) {\n var result = MATCH;\n var matchTerm = buildMatchGraph(node.term);\n\n if (node.max === 0) {\n // disable repeating of empty match to prevent infinite loop\n matchTerm = createCondition(\n matchTerm,\n DISALLOW_EMPTY,\n MISMATCH\n );\n\n // an occurrence count is not limited, make a cycle;\n // to collect more terms on each following matching mismatch\n result = createCondition(\n matchTerm,\n null, // will be a loop\n MISMATCH\n );\n\n result.then = createCondition(\n MATCH,\n MATCH,\n result // make a loop\n );\n\n if (node.comma) {\n result.then.else = createCondition(\n { type: 'Comma', syntax: node },\n result,\n MISMATCH\n );\n }\n } else {\n // create a match node chain for [min .. max] interval with optional matches\n for (var i = node.min || 1; i <= node.max; i++) {\n if (node.comma && result !== MATCH) {\n result = createCondition(\n { type: 'Comma', syntax: node },\n result,\n MISMATCH\n );\n }\n\n result = createCondition(\n matchTerm,\n createCondition(\n MATCH,\n MATCH,\n result\n ),\n MISMATCH\n );\n }\n }\n\n if (node.min === 0) {\n // allow zero match\n result = createCondition(\n MATCH,\n MATCH,\n result\n );\n } else {\n // create a match node chain to collect [0 ... min - 1] required matches\n for (var i = 0; i < node.min - 1; i++) {\n if (node.comma && result !== MATCH) {\n result = createCondition(\n { type: 'Comma', syntax: node },\n result,\n MISMATCH\n );\n }\n\n result = createCondition(\n matchTerm,\n result,\n MISMATCH\n );\n }\n }\n\n return result;\n}\n\nfunction buildMatchGraph(node) {\n if (typeof node === 'function') {\n return {\n type: 'Generic',\n fn: node\n };\n }\n\n switch (node.type) {\n case 'Group':\n var result = buildGroupMatchGraph(\n node.combinator,\n node.terms.map(buildMatchGraph),\n false\n );\n\n if (node.disallowEmpty) {\n result = createCondition(\n result,\n DISALLOW_EMPTY,\n MISMATCH\n );\n }\n\n return result;\n\n case 'Multiplier':\n return buildMultiplierMatchGraph(node);\n\n case 'Type':\n case 'Property':\n return {\n type: node.type,\n name: node.name,\n syntax: node\n };\n\n case 'Keyword':\n return {\n type: node.type,\n name: node.name.toLowerCase(),\n syntax: node\n };\n\n case 'AtKeyword':\n return {\n type: node.type,\n name: '@' + node.name.toLowerCase(),\n syntax: node\n };\n\n case 'Function':\n return {\n type: node.type,\n name: node.name.toLowerCase() + '(',\n syntax: node\n };\n\n case 'String':\n // convert a one char length String to a Token\n if (node.value.length === 3) {\n return {\n type: 'Token',\n value: node.value.charAt(1),\n syntax: node\n };\n }\n\n // otherwise use it as is\n return {\n type: node.type,\n value: node.value,\n syntax: node\n };\n\n case 'Token':\n return {\n type: node.type,\n value: node.value,\n syntax: node\n };\n\n case 'Comma':\n return {\n type: node.type,\n syntax: node\n };\n\n default:\n throw new Error('Unknown node type:', node.type);\n }\n}\n\nmodule.exports = {\n MATCH: MATCH,\n MISMATCH: MISMATCH,\n DISALLOW_EMPTY: DISALLOW_EMPTY,\n buildMatchGraph: function(syntaxTree, ref) {\n if (typeof syntaxTree === 'string') {\n syntaxTree = parse(syntaxTree);\n }\n\n return {\n type: 'MatchGraph',\n match: buildMatchGraph(syntaxTree),\n syntax: ref || null,\n source: syntaxTree\n };\n }\n};\n","'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar matchGraph = require('./match-graph');\nvar MATCH = matchGraph.MATCH;\nvar MISMATCH = matchGraph.MISMATCH;\nvar DISALLOW_EMPTY = matchGraph.DISALLOW_EMPTY;\n\nvar TOKEN = 1;\nvar OPEN_SYNTAX = 2;\nvar CLOSE_SYNTAX = 3;\n\nvar EXIT_REASON_MATCH = 'Match';\nvar EXIT_REASON_MISMATCH = 'Mismatch';\nvar EXIT_REASON_ITERATION_LIMIT = 'Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)';\n\nvar ITERATION_LIMIT = 10000;\nvar totalIterationCount = 0;\n\nfunction mapList(list, fn) {\n var result = [];\n\n while (list) {\n result.unshift(fn(list));\n list = list.prev;\n }\n\n return result;\n}\n\nfunction isCommaContextStart(token) {\n if (token === null) {\n return true;\n }\n\n token = token.value.charAt(token.value.length - 1);\n\n return (\n token === ',' ||\n token === '(' ||\n token === '[' ||\n token === '/'\n );\n}\n\nfunction isCommaContextEnd(token) {\n if (token === null) {\n return true;\n }\n\n token = token.value.charAt(0);\n\n return (\n token === ')' ||\n token === ']' ||\n token === '/'\n );\n}\n\nfunction internalMatch(tokens, syntax, syntaxes) {\n function moveToNextToken() {\n do {\n tokenCursor++;\n token = tokenCursor < tokens.length ? tokens[tokenCursor] : null;\n } while (token !== null && !/\\S/.test(token.value));\n }\n\n function getNextToken(offset) {\n var nextIndex = tokenCursor + offset;\n\n return nextIndex < tokens.length ? tokens[nextIndex] : null;\n }\n\n function pushThenStack(nextSyntax) {\n thenStack = {\n nextSyntax: nextSyntax,\n matchStack: matchStack,\n syntaxStack: syntaxStack,\n prev: thenStack\n };\n }\n\n function pushElseStack(nextSyntax) {\n elseStack = {\n nextSyntax: nextSyntax,\n matchStack: matchStack,\n syntaxStack: syntaxStack,\n thenStack: thenStack,\n tokenCursor: tokenCursor,\n token: token,\n prev: elseStack\n };\n }\n\n function addTokenToMatch() {\n matchStack = {\n type: TOKEN,\n syntax: syntax.syntax,\n token: token,\n prev: matchStack\n };\n\n moveToNextToken();\n\n if (tokenCursor > longestMatch) {\n longestMatch = tokenCursor;\n }\n\n return matchStack.token;\n }\n\n function openSyntax() {\n syntaxStack = {\n syntax: syntax,\n prev: syntaxStack\n };\n\n matchStack = {\n type: OPEN_SYNTAX,\n syntax: syntax.syntax,\n token: matchStack.token,\n prev: matchStack\n };\n }\n\n function closeSyntax() {\n if (matchStack.type === OPEN_SYNTAX) {\n matchStack = matchStack.prev;\n } else {\n matchStack = {\n type: CLOSE_SYNTAX,\n syntax: syntaxStack.syntax,\n token: matchStack.token,\n prev: matchStack\n };\n }\n\n syntaxStack = syntaxStack.prev;\n }\n\n var syntaxStack = null;\n var thenStack = null;\n var elseStack = null;\n\n var iterationCount = 0;\n var exitReason = EXIT_REASON_MATCH;\n\n var matchStack = { type: 'Stub', syntax: null, token: null, tokenCursor: -1, prev: null };\n var longestMatch = 0;\n var tokenCursor = -1;\n var token = null;\n\n moveToNextToken();\n\n while (true) {\n // console.log('--\\n',\n // '#' + iterationCount,\n // require('util').inspect({\n // match: mapList(matchStack, x => x.type === TOKEN ? x.token && x.token.value : x.syntax ? x.type + '!' + x.syntax.name : null),\n // elseStack: mapList(elseStack, x => x.id),\n // thenStack: mapList(thenStack, x => x.id),\n // token: token && token.value,\n // tokenCursor,\n // syntax\n // }, { depth: null })\n // );\n\n // prevent infinite loop\n if (++iterationCount === ITERATION_LIMIT) {\n console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations');\n exitReason = EXIT_REASON_ITERATION_LIMIT;\n break;\n }\n\n if (syntax === MATCH) {\n if (thenStack === null) {\n // turn to MISMATCH when some tokens left unmatched\n if (token !== null) {\n // doesn't mismatch if just one token left and it's an IE hack\n if (tokenCursor !== tokens.length - 1 || (token.value !== '\\\\0' && token.value !== '\\\\9')) {\n syntax = MISMATCH;\n continue;\n }\n }\n\n // break the main loop, return a result - MATCH\n exitReason = EXIT_REASON_MATCH;\n break;\n }\n\n // go to next syntax (`then` branch)\n syntax = thenStack.nextSyntax;\n\n // check match is not empty\n if (syntax === DISALLOW_EMPTY) {\n if (thenStack.matchStack.token === matchStack.token) {\n syntax = MISMATCH;\n continue;\n } else {\n syntax = MATCH;\n }\n }\n\n // close syntax if needed\n while (syntaxStack !== null && thenStack.syntaxStack !== syntaxStack) {\n closeSyntax();\n }\n\n // pop stack\n thenStack = thenStack.prev;\n continue;\n }\n\n if (syntax === MISMATCH) {\n if (elseStack === null) {\n // break the main loop, return a result - MISMATCH\n exitReason = EXIT_REASON_MISMATCH;\n break;\n }\n\n // go to next syntax (`else` branch)\n syntax = elseStack.nextSyntax;\n\n // restore all the rest stack states\n thenStack = elseStack.thenStack;\n syntaxStack = elseStack.syntaxStack;\n matchStack = elseStack.matchStack;\n tokenCursor = elseStack.tokenCursor;\n token = elseStack.token;\n\n // pop stack\n elseStack = elseStack.prev;\n continue;\n }\n\n switch (syntax.type) {\n case 'MatchGraph':\n syntax = syntax.match;\n break;\n\n case 'If':\n // IMPORTANT: else stack push must go first,\n // since it stores the state of thenStack before changes\n if (syntax.else !== MISMATCH) {\n pushElseStack(syntax.else);\n }\n\n if (syntax.then !== MATCH) {\n pushThenStack(syntax.then);\n }\n\n syntax = syntax.match;\n break;\n\n case 'MatchOnce':\n syntax = {\n type: 'MatchOnceBuffer',\n terms: syntax.terms,\n all: syntax.all,\n matchStack: matchStack,\n index: 0,\n mask: 0\n };\n break;\n\n case 'MatchOnceBuffer':\n if (syntax.index === syntax.terms.length) {\n // if no matches during a cycle\n if (syntax.matchStack === matchStack) {\n // no matches at all or it's required all terms to be matched\n if (syntax.mask === 0 || syntax.all) {\n syntax = MISMATCH;\n break;\n }\n\n // a partial match is ok\n syntax = MATCH;\n break;\n } else {\n // start trying to match from the start\n syntax.index = 0;\n syntax.matchStack = matchStack;\n }\n }\n\n for (; syntax.index < syntax.terms.length; syntax.index++) {\n if ((syntax.mask & (1 << syntax.index)) === 0) {\n // IMPORTANT: else stack push must go first,\n // since it stores the state of thenStack before changes\n pushElseStack(syntax);\n pushThenStack({\n type: 'AddMatchOnce',\n buffer: syntax\n });\n\n // match\n syntax = syntax.terms[syntax.index++];\n break;\n }\n }\n break;\n\n case 'AddMatchOnce':\n syntax = syntax.buffer;\n\n var newMask = syntax.mask | (1 << (syntax.index - 1));\n\n // all terms are matched\n if (newMask === (1 << syntax.terms.length) - 1) {\n syntax = MATCH;\n continue;\n }\n\n syntax = {\n type: 'MatchOnceBuffer',\n terms: syntax.terms,\n all: syntax.all,\n matchStack: syntax.matchStack,\n index: syntax.index,\n mask: newMask\n };\n\n break;\n\n case 'Enum':\n var name = token !== null ? token.value.toLowerCase() : '';\n\n // drop \\0 and \\9 hack from keyword name\n if (name.indexOf('\\\\') !== -1) {\n name = name.replace(/\\\\[09].*$/, '');\n }\n\n if (hasOwnProperty.call(syntax.map, name)) {\n syntax = syntax.map[name];\n } else {\n syntax = MISMATCH;\n }\n\n break;\n\n case 'Generic':\n syntax = syntax.fn(token, addTokenToMatch, getNextToken) ? MATCH : MISMATCH;\n break;\n\n case 'Type':\n case 'Property':\n openSyntax();\n\n var syntaxDict = syntax.type === 'Type' ? 'types' : 'properties';\n\n if (hasOwnProperty.call(syntaxes, syntaxDict) && syntaxes[syntaxDict][syntax.name]) {\n syntax = syntaxes[syntaxDict][syntax.name].match;\n } else {\n syntax = undefined;\n }\n\n if (!syntax) {\n throw new Error(\n 'Bad syntax reference: ' +\n (syntaxStack.syntax.type === 'Type'\n ? '<' + syntaxStack.syntax.name + '>'\n : '<\\'' + syntaxStack.syntax.name + '\\'>')\n );\n }\n\n break;\n\n case 'Keyword':\n var name = syntax.name;\n\n if (token !== null) {\n var keywordName = token.value;\n\n // drop \\0 and \\9 hack from keyword name\n if (keywordName.indexOf('\\\\') !== -1) {\n keywordName = keywordName.replace(/\\\\[09].*$/, '');\n }\n\n if (keywordName.toLowerCase() === name) {\n addTokenToMatch();\n\n syntax = MATCH;\n break;\n }\n }\n\n syntax = MISMATCH;\n break;\n\n case 'AtKeyword':\n case 'Function':\n if (token !== null && token.value.toLowerCase() === syntax.name) {\n addTokenToMatch();\n\n syntax = MATCH;\n break;\n }\n\n syntax = MISMATCH;\n break;\n\n case 'Token':\n if (token !== null && token.value === syntax.value) {\n addTokenToMatch();\n\n syntax = MATCH;\n break;\n }\n\n syntax = MISMATCH;\n break;\n\n case 'Comma':\n if (token !== null && token.value === ',') {\n if (isCommaContextStart(matchStack.token)) {\n syntax = MISMATCH;\n } else {\n addTokenToMatch();\n syntax = isCommaContextEnd(token) ? MISMATCH : MATCH;\n }\n } else {\n syntax = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH : MISMATCH;\n }\n\n break;\n\n // case 'String':\n // TODO: strings with length other than 1 char\n\n default:\n throw new Error('Unknown node type: ' + syntax.type);\n }\n }\n\n totalIterationCount += iterationCount;\n\n if (exitReason === EXIT_REASON_MATCH) {\n while (syntaxStack !== null) {\n closeSyntax();\n }\n } else {\n matchStack = null;\n }\n\n return {\n tokens: tokens,\n reason: exitReason,\n iterations: iterationCount,\n match: matchStack,\n longestMatch: longestMatch\n };\n}\n\nfunction matchAsList(tokens, matchGraph, syntaxes) {\n var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});\n\n if (matchResult.match !== null) {\n matchResult.match = mapList(matchResult.match, function(item) {\n if (item.type === OPEN_SYNTAX || item.type === CLOSE_SYNTAX) {\n return { type: item.type, syntax: item.syntax };\n }\n\n return {\n syntax: item.syntax,\n token: item.token && item.token.value,\n node: item.token && item.token.node\n };\n }).slice(1);\n }\n\n return matchResult;\n}\n\nfunction matchAsTree(tokens, matchGraph, syntaxes) {\n var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});\n\n if (matchResult.match === null) {\n return matchResult;\n }\n\n var cursor = matchResult.match;\n var host = matchResult.match = {\n syntax: matchGraph.syntax || null,\n match: []\n };\n var stack = [host];\n\n // revert a list\n var prev = null;\n var next = null;\n while (cursor !== null) {\n next = cursor.prev;\n cursor.prev = prev;\n prev = cursor;\n cursor = next;\n }\n\n // init the cursor to start with 2nd item since 1st is a stub item\n cursor = prev.prev;\n\n // build a tree\n while (cursor !== null && cursor.syntax !== null) {\n var entry = cursor;\n\n switch (entry.type) {\n case OPEN_SYNTAX:\n host.match.push(host = {\n syntax: entry.syntax,\n match: []\n });\n stack.push(host);\n break;\n\n case CLOSE_SYNTAX:\n stack.pop();\n host = stack[stack.length - 1];\n break;\n\n default:\n host.match.push({\n syntax: entry.syntax || null,\n token: entry.token.value,\n node: entry.token.node\n });\n }\n\n cursor = cursor.prev;\n }\n\n return matchResult;\n}\n\nmodule.exports = {\n matchAsList: matchAsList,\n matchAsTree: matchAsTree,\n getTotalIterationCount: function() {\n return totalIterationCount;\n }\n};\n","function getTrace(node) {\n function shouldPutToTrace(syntax) {\n if (syntax === null) {\n return false;\n }\n\n return (\n syntax.type === 'Type' ||\n syntax.type === 'Property' ||\n syntax.type === 'Keyword'\n );\n }\n\n function hasMatch(matchNode) {\n if (Array.isArray(matchNode.match)) {\n // use for-loop for better perfomance\n for (var i = 0; i < matchNode.match.length; i++) {\n if (hasMatch(matchNode.match[i])) {\n if (shouldPutToTrace(matchNode.syntax)) {\n result.unshift(matchNode.syntax);\n }\n\n return true;\n }\n }\n } else if (matchNode.node === node) {\n result = shouldPutToTrace(matchNode.syntax)\n ? [matchNode.syntax]\n : [];\n\n return true;\n }\n\n return false;\n }\n\n var result = null;\n\n if (this.matched !== null) {\n hasMatch(this.matched);\n }\n\n return result;\n}\n\nfunction testNode(match, node, fn) {\n var trace = getTrace.call(match, node);\n\n if (trace === null) {\n return false;\n }\n\n return trace.some(fn);\n}\n\nfunction isType(node, type) {\n return testNode(this, node, function(matchNode) {\n return matchNode.type === 'Type' && matchNode.name === type;\n });\n}\n\nfunction isProperty(node, property) {\n return testNode(this, node, function(matchNode) {\n return matchNode.type === 'Property' && matchNode.name === property;\n });\n}\n\nfunction isKeyword(node) {\n return testNode(this, node, function(matchNode) {\n return matchNode.type === 'Keyword';\n });\n}\n\nmodule.exports = {\n getTrace: getTrace,\n isType: isType,\n isProperty: isProperty,\n isKeyword: isKeyword\n};\n","var List = require('../utils/list');\n\nfunction getFirstMatchNode(matchNode) {\n if ('node' in matchNode) {\n return matchNode.node;\n }\n\n return getFirstMatchNode(matchNode.match[0]);\n}\n\nfunction getLastMatchNode(matchNode) {\n if ('node' in matchNode) {\n return matchNode.node;\n }\n\n return getLastMatchNode(matchNode.match[matchNode.match.length - 1]);\n}\n\nfunction matchFragments(lexer, ast, match, type, name) {\n function findFragments(matchNode) {\n if (matchNode.syntax !== null &&\n matchNode.syntax.type === type &&\n matchNode.syntax.name === name) {\n var start = getFirstMatchNode(matchNode);\n var end = getLastMatchNode(matchNode);\n\n lexer.syntax.walk(ast, function(node, item, list) {\n if (node === start) {\n var nodes = new List();\n\n do {\n nodes.appendData(item.data);\n\n if (item.data === end) {\n break;\n }\n\n item = item.next;\n } while (item !== null);\n\n fragments.push({\n parent: list,\n nodes: nodes\n });\n }\n });\n }\n\n if (Array.isArray(matchNode.match)) {\n matchNode.match.forEach(findFragments);\n }\n }\n\n var fragments = [];\n\n if (match.matched !== null) {\n findFragments(match.matched);\n }\n\n return fragments;\n}\n\nmodule.exports = {\n matchFragments: matchFragments\n};\n","var List = require('../utils/list');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction isValidNumber(value) {\n // Number.isInteger(value) && value >= 0\n return (\n typeof value === 'number' &&\n isFinite(value) &&\n Math.floor(value) === value &&\n value >= 0\n );\n}\n\nfunction isValidLocation(loc) {\n return (\n Boolean(loc) &&\n isValidNumber(loc.offset) &&\n isValidNumber(loc.line) &&\n isValidNumber(loc.column)\n );\n}\n\nfunction createNodeStructureChecker(type, fields) {\n return function checkNode(node, warn) {\n if (!node || node.constructor !== Object) {\n return warn(node, 'Type of node should be an Object');\n }\n\n for (var key in node) {\n var valid = true;\n\n if (hasOwnProperty.call(node, key) === false) {\n continue;\n }\n\n if (key === 'type') {\n if (node.type !== type) {\n warn(node, 'Wrong node type `' + node.type + '`, expected `' + type + '`');\n }\n } else if (key === 'loc') {\n if (node.loc === null) {\n continue;\n } else if (node.loc && node.loc.constructor === Object) {\n if (typeof node.loc.source !== 'string') {\n key += '.source';\n } else if (!isValidLocation(node.loc.start)) {\n key += '.start';\n } else if (!isValidLocation(node.loc.end)) {\n key += '.end';\n } else {\n continue;\n }\n }\n\n valid = false;\n } else if (fields.hasOwnProperty(key)) {\n for (var i = 0, valid = false; !valid && i < fields[key].length; i++) {\n var fieldType = fields[key][i];\n\n switch (fieldType) {\n case String:\n valid = typeof node[key] === 'string';\n break;\n\n case Boolean:\n valid = typeof node[key] === 'boolean';\n break;\n\n case null:\n valid = node[key] === null;\n break;\n\n default:\n if (typeof fieldType === 'string') {\n valid = node[key] && node[key].type === fieldType;\n } else if (Array.isArray(fieldType)) {\n valid = node[key] instanceof List;\n }\n }\n }\n } else {\n warn(node, 'Unknown field `' + key + '` for ' + type + ' node type');\n }\n\n if (!valid) {\n warn(node, 'Bad value for `' + type + '.' + key + '`');\n }\n }\n\n for (var key in fields) {\n if (hasOwnProperty.call(fields, key) &&\n hasOwnProperty.call(node, key) === false) {\n warn(node, 'Field `' + type + '.' + key + '` is missed');\n }\n }\n };\n}\n\nfunction processStructure(name, nodeType) {\n var structure = nodeType.structure;\n var fields = {\n type: String,\n loc: true\n };\n var docs = {\n type: '\"' + name + '\"'\n };\n\n for (var key in structure) {\n if (hasOwnProperty.call(structure, key) === false) {\n continue;\n }\n\n var docsTypes = [];\n var fieldTypes = fields[key] = Array.isArray(structure[key])\n ? structure[key].slice()\n : [structure[key]];\n\n for (var i = 0; i < fieldTypes.length; i++) {\n var fieldType = fieldTypes[i];\n if (fieldType === String || fieldType === Boolean) {\n docsTypes.push(fieldType.name);\n } else if (fieldType === null) {\n docsTypes.push('null');\n } else if (typeof fieldType === 'string') {\n docsTypes.push('<' + fieldType + '>');\n } else if (Array.isArray(fieldType)) {\n docsTypes.push('List'); // TODO: use type enum\n } else {\n throw new Error('Wrong value `' + fieldType + '` in `' + name + '.' + key + '` structure definition');\n }\n }\n\n docs[key] = docsTypes.join(' | ');\n }\n\n return {\n docs: docs,\n check: createNodeStructureChecker(name, fields)\n };\n}\n\nmodule.exports = {\n getStructureFromConfig: function(config) {\n var structure = {};\n\n if (config.node) {\n for (var name in config.node) {\n if (hasOwnProperty.call(config.node, name)) {\n var nodeType = config.node[name];\n\n if (nodeType.structure) {\n structure[name] = processStructure(name, nodeType);\n } else {\n throw new Error('Missed `structure` field in `' + name + '` node type definition');\n }\n }\n }\n }\n\n return structure;\n }\n};\n","'use strict';\n\nvar SyntaxReferenceError = require('./error').SyntaxReferenceError;\nvar MatchError = require('./error').MatchError;\nvar names = require('../utils/names');\nvar generic = require('./generic');\nvar parse = require('./grammar/parse');\nvar generate = require('./grammar/generate');\nvar walk = require('./grammar/walk');\nvar astToTokens = require('./ast-to-tokens');\nvar buildMatchGraph = require('./match-graph').buildMatchGraph;\nvar matchAsTree = require('./match').matchAsTree;\nvar trace = require('./trace');\nvar search = require('./search');\nvar getStructureFromConfig = require('./structure').getStructureFromConfig;\nvar cssWideKeywords = buildMatchGraph(parse('inherit | initial | unset'));\nvar cssWideKeywordsWithExpression = buildMatchGraph(parse('inherit | initial | unset | <expression>'));\n\nfunction dumpMapSyntax(map, syntaxAsAst) {\n var result = {};\n\n for (var name in map) {\n if (map[name].syntax) {\n result[name] = syntaxAsAst ? map[name].syntax : generate(map[name].syntax);\n }\n }\n\n return result;\n}\n\nfunction valueHasVar(value) {\n var hasVar = false;\n\n this.syntax.walk(value, function(node) {\n if (node.type === 'Function' && node.name.toLowerCase() === 'var') {\n hasVar = true;\n }\n });\n\n return hasVar;\n}\n\nfunction buildMatchResult(match, error, iterations) {\n return {\n matched: match,\n iterations: iterations,\n error: error,\n getTrace: trace.getTrace,\n isType: trace.isType,\n isProperty: trace.isProperty,\n isKeyword: trace.isKeyword\n };\n}\n\nfunction matchSyntax(lexer, syntax, node, useCommon) {\n if (!node) {\n return buildMatchResult(null, new Error('Node is undefined'));\n }\n\n if (valueHasVar.call(lexer, node)) {\n return buildMatchResult(null, new Error('Matching for a tree with var() is not supported'));\n }\n\n var tokens = lexer.syntax.generate(node, astToTokens);\n var result;\n\n if (useCommon) {\n result = matchAsTree(tokens, lexer.valueCommonSyntax, lexer);\n }\n\n if (!useCommon || !result.match) {\n result = matchAsTree(tokens, syntax.match, lexer);\n if (!result.match) {\n return buildMatchResult(\n null,\n new MatchError(result.reason, lexer, syntax.syntax, node, result),\n result.iterations\n );\n }\n }\n\n return buildMatchResult(result.match, null, result.iterations);\n}\n\nvar Lexer = function(config, syntax, structure) {\n this.valueCommonSyntax = cssWideKeywords;\n this.syntax = syntax;\n this.generic = false;\n this.properties = {};\n this.types = {};\n this.structure = structure || getStructureFromConfig(config);\n\n if (config) {\n if (config.generic) {\n this.generic = true;\n for (var name in generic) {\n this.addType_(name, generic[name]);\n }\n }\n\n if (config.types) {\n for (var name in config.types) {\n this.addType_(name, config.types[name]);\n }\n }\n\n if (config.properties) {\n for (var name in config.properties) {\n this.addProperty_(name, config.properties[name]);\n }\n }\n }\n};\n\nLexer.prototype = {\n structure: {},\n checkStructure: function(ast) {\n function collectWarning(node, message) {\n warns.push({\n node: node,\n message: message\n });\n }\n\n var structure = this.structure;\n var warns = [];\n\n this.syntax.walk(ast, function(node) {\n if (structure.hasOwnProperty(node.type)) {\n structure[node.type].check(node, collectWarning);\n } else {\n collectWarning(node, 'Unknown node type `' + node.type + '`');\n }\n });\n\n return warns.length ? warns : false;\n },\n\n createDescriptor: function(syntax, type, name) {\n var ref = {\n type: type,\n name: name\n };\n var descriptor = {\n type: type,\n name: name,\n syntax: null,\n match: null\n };\n\n if (typeof syntax === 'function') {\n descriptor.match = buildMatchGraph(syntax, ref);\n } else {\n if (typeof syntax === 'string') {\n // lazy parsing on first access\n Object.defineProperty(descriptor, 'syntax', {\n get: function() {\n Object.defineProperty(descriptor, 'syntax', {\n value: parse(syntax)\n });\n\n return descriptor.syntax;\n }\n });\n } else {\n descriptor.syntax = syntax;\n }\n\n Object.defineProperty(descriptor, 'match', {\n get: function() {\n Object.defineProperty(descriptor, 'match', {\n value: buildMatchGraph(descriptor.syntax, ref)\n });\n\n return descriptor.match;\n }\n });\n }\n\n return descriptor;\n },\n addProperty_: function(name, syntax) {\n this.properties[name] = this.createDescriptor(syntax, 'Property', name);\n },\n addType_: function(name, syntax) {\n this.types[name] = this.createDescriptor(syntax, 'Type', name);\n\n if (syntax === generic.expression) {\n this.valueCommonSyntax = cssWideKeywordsWithExpression;\n }\n },\n\n matchDeclaration: function(node) {\n if (node.type !== 'Declaration') {\n return buildMatchResult(null, new Error('Not a Declaration node'));\n }\n\n return this.matchProperty(node.property, node.value);\n },\n matchProperty: function(propertyName, value) {\n var property = names.property(propertyName);\n\n // don't match syntax for a custom property\n if (property.custom) {\n return buildMatchResult(null, new Error('Lexer matching doesn\\'t applicable for custom properties'));\n }\n\n var propertySyntax = property.vendor\n ? this.getProperty(property.name) || this.getProperty(property.basename)\n : this.getProperty(property.name);\n\n if (!propertySyntax) {\n return buildMatchResult(null, new SyntaxReferenceError('Unknown property', propertyName));\n }\n\n return matchSyntax(this, propertySyntax, value, true);\n },\n matchType: function(typeName, value) {\n var typeSyntax = this.getType(typeName);\n\n if (!typeSyntax) {\n return buildMatchResult(null, new SyntaxReferenceError('Unknown type', typeName));\n }\n\n return matchSyntax(this, typeSyntax, value, false);\n },\n match: function(syntax, value) {\n if (!syntax || !syntax.type) {\n return buildMatchResult(null, new SyntaxReferenceError('Bad syntax'));\n }\n\n if (!syntax.match) {\n syntax = this.createDescriptor(syntax);\n }\n\n return matchSyntax(this, syntax, value, false);\n },\n\n findValueFragments: function(propertyName, value, type, name) {\n return search.matchFragments(this, value, this.matchProperty(propertyName, value), type, name);\n },\n findDeclarationValueFragments: function(declaration, type, name) {\n return search.matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name);\n },\n findAllFragments: function(ast, type, name) {\n var result = [];\n\n this.syntax.walk(ast, {\n visit: 'Declaration',\n enter: function(declaration) {\n result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name));\n }.bind(this)\n });\n\n return result;\n },\n\n getProperty: function(name) {\n return this.properties.hasOwnProperty(name) ? this.properties[name] : null;\n },\n getType: function(name) {\n return this.types.hasOwnProperty(name) ? this.types[name] : null;\n },\n\n validate: function() {\n function validate(syntax, name, broken, descriptor) {\n if (broken.hasOwnProperty(name)) {\n return broken[name];\n }\n\n broken[name] = false;\n if (descriptor.syntax !== null) {\n walk(descriptor.syntax, function(node) {\n if (node.type !== 'Type' && node.type !== 'Property') {\n return;\n }\n\n var map = node.type === 'Type' ? syntax.types : syntax.properties;\n var brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;\n\n if (!map.hasOwnProperty(node.name) || validate(syntax, node.name, brokenMap, map[node.name])) {\n broken[name] = true;\n }\n }, this);\n }\n }\n\n var brokenTypes = {};\n var brokenProperties = {};\n\n for (var key in this.types) {\n validate(this, key, brokenTypes, this.types[key]);\n }\n\n for (var key in this.properties) {\n validate(this, key, brokenProperties, this.properties[key]);\n }\n\n brokenTypes = Object.keys(brokenTypes).filter(function(name) {\n return brokenTypes[name];\n });\n brokenProperties = Object.keys(brokenProperties).filter(function(name) {\n return brokenProperties[name];\n });\n\n if (brokenTypes.length || brokenProperties.length) {\n return {\n types: brokenTypes,\n properties: brokenProperties\n };\n }\n\n return null;\n },\n dump: function(syntaxAsAst) {\n return {\n generic: this.generic,\n types: dumpMapSyntax(this.types, syntaxAsAst),\n properties: dumpMapSyntax(this.properties, syntaxAsAst)\n };\n },\n toString: function() {\n return JSON.stringify(this.dump());\n }\n};\n\nmodule.exports = Lexer;\n","'use strict';\n\nvar Tokenizer = require('../tokenizer');\nvar List = require('../utils/list');\nvar sequence = require('./sequence');\nvar noop = function() {};\n\nfunction createParseContext(name) {\n return function() {\n return this[name]();\n };\n}\n\nfunction processConfig(config) {\n var parserConfig = {\n context: {},\n scope: {},\n atrule: {},\n pseudo: {}\n };\n\n if (config.parseContext) {\n for (var name in config.parseContext) {\n switch (typeof config.parseContext[name]) {\n case 'function':\n parserConfig.context[name] = config.parseContext[name];\n break;\n\n case 'string':\n parserConfig.context[name] = createParseContext(config.parseContext[name]);\n break;\n }\n }\n }\n\n if (config.scope) {\n for (var name in config.scope) {\n parserConfig.scope[name] = config.scope[name];\n }\n }\n\n if (config.atrule) {\n for (var name in config.atrule) {\n var atrule = config.atrule[name];\n\n if (atrule.parse) {\n parserConfig.atrule[name] = atrule.parse;\n }\n }\n }\n\n if (config.pseudo) {\n for (var name in config.pseudo) {\n var pseudo = config.pseudo[name];\n\n if (pseudo.parse) {\n parserConfig.pseudo[name] = pseudo.parse;\n }\n }\n }\n\n if (config.node) {\n for (var name in config.node) {\n parserConfig[name] = config.node[name].parse;\n }\n }\n\n return parserConfig;\n}\n\nmodule.exports = function createParser(config) {\n var parser = {\n scanner: new Tokenizer(),\n filename: '<unknown>',\n needPositions: false,\n onParseError: noop,\n onParseErrorThrow: false,\n parseAtrulePrelude: true,\n parseRulePrelude: true,\n parseValue: true,\n parseCustomProperty: false,\n\n readSequence: sequence,\n\n createList: function() {\n return new List();\n },\n createSingleNodeList: function(node) {\n return new List().appendData(node);\n },\n getFirstListNode: function(list) {\n return list && list.first();\n },\n getLastListNode: function(list) {\n return list.last();\n },\n\n parseWithFallback: function(consumer, fallback) {\n var startToken = this.scanner.currentToken;\n\n try {\n return consumer.call(this);\n } catch (e) {\n if (this.onParseErrorThrow) {\n throw e;\n }\n\n var fallbackNode = fallback.call(this, startToken);\n\n this.onParseErrorThrow = true;\n this.onParseError(e, fallbackNode);\n this.onParseErrorThrow = false;\n\n return fallbackNode;\n }\n },\n\n getLocation: function(start, end) {\n if (this.needPositions) {\n return this.scanner.getLocationRange(\n start,\n end,\n this.filename\n );\n }\n\n return null;\n },\n getLocationFromList: function(list) {\n if (this.needPositions) {\n var head = this.getFirstListNode(list);\n var tail = this.getLastListNode(list);\n return this.scanner.getLocationRange(\n head !== null ? head.loc.start.offset - this.scanner.startOffset : this.scanner.tokenStart,\n tail !== null ? tail.loc.end.offset - this.scanner.startOffset : this.scanner.tokenStart,\n this.filename\n );\n }\n\n return null;\n }\n };\n\n config = processConfig(config || {});\n for (var key in config) {\n parser[key] = config[key];\n }\n\n return function(source, options) {\n options = options || {};\n\n var context = options.context || 'default';\n var ast;\n\n parser.scanner.setSource(source, options.offset, options.line, options.column);\n parser.filename = options.filename || '<unknown>';\n parser.needPositions = Boolean(options.positions);\n parser.onParseError = typeof options.onParseError === 'function' ? options.onParseError : noop;\n parser.onParseErrorThrow = false;\n parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;\n parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;\n parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;\n parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;\n\n if (!parser.context.hasOwnProperty(context)) {\n throw new Error('Unknown context `' + context + '`');\n }\n\n ast = parser.context[context].call(parser, options);\n\n if (!parser.scanner.eof) {\n parser.scanner.error();\n }\n\n return ast;\n };\n};\n","'use strict';\n\nvar sourceMap = require('./sourceMap');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction processChildren(node, delimeter) {\n var list = node.children;\n var prev = null;\n\n if (typeof delimeter !== 'function') {\n list.forEach(this.node, this);\n } else {\n list.forEach(function(node) {\n if (prev !== null) {\n delimeter.call(this, prev);\n }\n\n this.node(node);\n prev = node;\n }, this);\n }\n}\n\nmodule.exports = function createGenerator(config) {\n function processNode(node) {\n if (hasOwnProperty.call(types, node.type)) {\n types[node.type].call(this, node);\n } else {\n throw new Error('Unknown node type: ' + node.type);\n }\n }\n\n var types = {};\n\n if (config.node) {\n for (var name in config.node) {\n types[name] = config.node[name].generate;\n }\n }\n\n return function(node, options) {\n var buffer = '';\n var handlers = {\n children: processChildren,\n node: processNode,\n chunk: function(chunk) {\n buffer += chunk;\n },\n result: function() {\n return buffer;\n }\n };\n\n if (options) {\n if (typeof options.decorator === 'function') {\n handlers = options.decorator(handlers);\n }\n\n if (options.sourceMap) {\n handlers = sourceMap(handlers);\n }\n }\n\n handlers.node(node);\n\n return handlers.result();\n };\n};\n","'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar noop = function() {};\n\nfunction ensureFunction(value) {\n return typeof value === 'function' ? value : noop;\n}\n\nfunction invokeForType(fn, type) {\n return function(node, item, list) {\n if (node.type === type) {\n fn.call(this, node, item, list);\n }\n };\n}\n\nfunction getWalkersFromStructure(name, nodeType) {\n var structure = nodeType.structure;\n var walkers = [];\n\n for (var key in structure) {\n if (hasOwnProperty.call(structure, key) === false) {\n continue;\n }\n\n var fieldTypes = structure[key];\n var walker = {\n name: key,\n type: false,\n nullable: false\n };\n\n if (!Array.isArray(structure[key])) {\n fieldTypes = [structure[key]];\n }\n\n for (var i = 0; i < fieldTypes.length; i++) {\n var fieldType = fieldTypes[i];\n if (fieldType === null) {\n walker.nullable = true;\n } else if (typeof fieldType === 'string') {\n walker.type = 'node';\n } else if (Array.isArray(fieldType)) {\n walker.type = 'list';\n }\n }\n\n if (walker.type) {\n walkers.push(walker);\n }\n }\n\n if (walkers.length) {\n return {\n context: nodeType.walkContext,\n fields: walkers\n };\n }\n\n return null;\n}\n\nfunction getTypesFromConfig(config) {\n var types = {};\n\n for (var name in config.node) {\n if (hasOwnProperty.call(config.node, name)) {\n var nodeType = config.node[name];\n\n if (!nodeType.structure) {\n throw new Error('Missed `structure` field in `' + name + '` node type definition');\n }\n\n types[name] = getWalkersFromStructure(name, nodeType);\n }\n }\n\n return types;\n}\n\nfunction createTypeIterator(config, reverse) {\n var fields = reverse ? config.fields.slice().reverse() : config.fields;\n var body = fields.map(function(field) {\n var ref = 'node.' + field.name;\n var line;\n\n if (field.type === 'list') {\n line = reverse\n ? ref + '.forEachRight(walk);'\n : ref + '.forEach(walk);';\n } else {\n line = 'walk(' + ref + ');';\n }\n\n if (field.nullable) {\n line = 'if (' + ref + ') {\\n ' + line + '}';\n }\n\n return line;\n });\n\n if (config.context) {\n body = [].concat(\n 'var old = context.' + config.context + ';',\n 'context.' + config.context + ' = node;',\n body,\n 'context.' + config.context + ' = old;'\n );\n }\n\n return new Function('node', 'context', 'walk', body.join('\\n'));\n}\n\nfunction createFastTraveralMap(iterators) {\n return {\n Atrule: {\n StyleSheet: iterators.StyleSheet,\n Atrule: iterators.Atrule,\n Rule: iterators.Rule,\n Block: iterators.Block\n },\n Rule: {\n StyleSheet: iterators.StyleSheet,\n Atrule: iterators.Atrule,\n Rule: iterators.Rule,\n Block: iterators.Block\n },\n Declaration: {\n StyleSheet: iterators.StyleSheet,\n Atrule: iterators.Atrule,\n Rule: iterators.Rule,\n Block: iterators.Block\n }\n };\n}\n\nmodule.exports = function createWalker(config) {\n var types = getTypesFromConfig(config);\n var iteratorsNatural = {};\n var iteratorsReverse = {};\n\n for (var name in types) {\n if (hasOwnProperty.call(types, name) && types[name] !== null) {\n iteratorsNatural[name] = createTypeIterator(types[name], false);\n iteratorsReverse[name] = createTypeIterator(types[name], true);\n }\n }\n\n var fastTraversalIteratorsNatural = createFastTraveralMap(iteratorsNatural);\n var fastTraversalIteratorsReverse = createFastTraveralMap(iteratorsReverse);\n\n return function walk(root, options) {\n function walkNode(node, item, list) {\n enter.call(context, node, item, list);\n\n if (iterators.hasOwnProperty(node.type)) {\n iterators[node.type](node, context, walkNode);\n }\n\n leave.call(context, node, item, list);\n }\n\n var enter = noop;\n var leave = noop;\n var iterators = iteratorsNatural;\n var context = {\n root: root,\n stylesheet: null,\n atrule: null,\n atrulePrelude: null,\n rule: null,\n selector: null,\n block: null,\n declaration: null,\n function: null\n };\n\n if (typeof options === 'function') {\n enter = options;\n } else if (options) {\n enter = ensureFunction(options.enter);\n leave = ensureFunction(options.leave);\n\n if (options.reverse) {\n iterators = iteratorsReverse;\n }\n\n if (options.visit) {\n if (fastTraversalIteratorsNatural.hasOwnProperty(options.visit)) {\n iterators = options.reverse\n ? fastTraversalIteratorsReverse[options.visit]\n : fastTraversalIteratorsNatural[options.visit];\n } else if (!types.hasOwnProperty(options.visit)) {\n throw new Error('Bad value `' + options.visit + '` for `visit` option (should be: ' + Object.keys(types).join(', ') + ')');\n }\n\n enter = invokeForType(enter, options.visit);\n leave = invokeForType(leave, options.visit);\n }\n }\n\n if (enter === noop && leave === noop) {\n throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\\'t a function');\n }\n\n // swap handlers in reverse mode to invert visit order\n if (options.reverse) {\n var tmp = enter;\n enter = leave;\n leave = tmp;\n }\n\n walkNode(root);\n };\n};\n","var hasOwnProperty = Object.prototype.hasOwnProperty;\nvar shape = {\n generic: true,\n types: {},\n properties: {},\n parseContext: {},\n scope: {},\n atrule: ['parse'],\n pseudo: ['parse'],\n node: ['name', 'structure', 'parse', 'generate', 'walkContext']\n};\n\nfunction isObject(value) {\n return value && value.constructor === Object;\n}\n\nfunction copy(value) {\n if (isObject(value)) {\n var res = {};\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n res[key] = value[key];\n }\n }\n return res;\n } else {\n return value;\n }\n}\n\nfunction extend(dest, src) {\n for (var key in src) {\n if (hasOwnProperty.call(src, key)) {\n if (isObject(dest[key])) {\n extend(dest[key], copy(src[key]));\n } else {\n dest[key] = copy(src[key]);\n }\n }\n }\n}\n\nfunction mix(dest, src, shape) {\n for (var key in shape) {\n if (hasOwnProperty.call(shape, key) === false) {\n continue;\n }\n\n if (shape[key] === true) {\n if (key in src) {\n if (hasOwnProperty.call(src, key)) {\n dest[key] = copy(src[key]);\n }\n }\n } else if (shape[key]) {\n if (isObject(shape[key])) {\n var res = {};\n extend(res, dest[key]);\n extend(res, src[key]);\n dest[key] = res;\n } else if (Array.isArray(shape[key])) {\n var res = {};\n var innerShape = shape[key].reduce(function(s, k) {\n s[k] = true;\n return s;\n }, {});\n for (var name in dest[key]) {\n if (hasOwnProperty.call(dest[key], name)) {\n res[name] = {};\n if (dest[key] && dest[key][name]) {\n mix(res[name], dest[key][name], innerShape);\n }\n }\n }\n for (var name in src[key]) {\n if (hasOwnProperty.call(src[key], name)) {\n if (!res[name]) {\n res[name] = {};\n }\n if (src[key] && src[key][name]) {\n mix(res[name], src[key][name], innerShape);\n }\n }\n }\n dest[key] = res;\n }\n }\n }\n return dest;\n}\n\nmodule.exports = function(dest, src) {\n return mix(dest, src, shape);\n};\n","var List = require('../utils/list');\nvar Tokenizer = require('../tokenizer');\nvar Lexer = require('../lexer/Lexer');\nvar grammar = require('../lexer/grammar');\nvar createParser = require('../parser/create');\nvar createGenerator = require('../generator/create');\nvar createConvertor = require('../convertor/create');\nvar createWalker = require('../walker/create');\nvar clone = require('../utils/clone');\nvar names = require('../utils/names');\nvar mix = require('./config/mix');\n\nfunction assign(dest, src) {\n for (var key in src) {\n dest[key] = src[key];\n }\n\n return dest;\n}\n\nfunction createSyntax(config) {\n var parse = createParser(config);\n var walk = createWalker(config);\n var generate = createGenerator(config);\n var convert = createConvertor(walk);\n\n var syntax = {\n List: List,\n Tokenizer: Tokenizer,\n Lexer: Lexer,\n\n vendorPrefix: names.vendorPrefix,\n keyword: names.keyword,\n property: names.property,\n isCustomProperty: names.isCustomProperty,\n\n grammar: grammar,\n lexer: null,\n createLexer: function(config) {\n return new Lexer(config, syntax, syntax.lexer.structure);\n },\n\n parse: parse,\n walk: walk,\n generate: generate,\n\n clone: clone,\n fromPlainObject: convert.fromPlainObject,\n toPlainObject: convert.toPlainObject,\n\n createSyntax: function(config) {\n return createSyntax(mix({}, config));\n },\n fork: function(extension) {\n var base = mix({}, config); // copy of config\n return createSyntax(\n typeof extension === 'function'\n ? extension(base, assign)\n : mix(base, extension)\n );\n }\n };\n\n syntax.lexer = new Lexer({\n generic: true,\n types: config.types,\n properties: config.properties,\n node: config.node\n }, syntax);\n\n return syntax;\n};\n\nexports.create = function(config) {\n return createSyntax(mix({}, config));\n};\n","var mdnProperties = require('mdn-data/css/properties.json');\nvar mdnSyntaxes = require('mdn-data/css/syntaxes.json');\nvar patch = require('./patch.json');\n\nfunction buildDictionary(dict, patchDict) {\n var result = {};\n\n // copy all syntaxes for an original dict\n for (var key in dict) {\n result[key] = dict[key].syntax;\n }\n\n // apply a patch\n for (var key in patchDict) {\n if (key in dict) {\n if (patchDict[key].syntax) {\n result[key] = patchDict[key].syntax;\n } else {\n delete result[key];\n }\n } else {\n if (patchDict[key].syntax) {\n result[key] = patchDict[key].syntax;\n }\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n properties: buildDictionary(mdnProperties, patch.properties),\n types: buildDictionary(mdnSyntaxes, patch.syntaxes)\n};\n","var cmpChar = require('../../tokenizer').cmpChar;\nvar isNumber = require('../../tokenizer').isNumber;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar N = 110; // 'n'.charCodeAt(0)\nvar DISALLOW_SIGN = true;\nvar ALLOW_SIGN = false;\n\nfunction checkTokenIsInteger(scanner, disallowSign) {\n var pos = scanner.tokenStart;\n\n if (scanner.source.charCodeAt(pos) === PLUSSIGN ||\n scanner.source.charCodeAt(pos) === HYPHENMINUS) {\n if (disallowSign) {\n scanner.error();\n }\n pos++;\n }\n\n for (; pos < scanner.tokenEnd; pos++) {\n if (!isNumber(scanner.source.charCodeAt(pos))) {\n scanner.error('Unexpected input', pos);\n }\n }\n}\n\n// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb\nmodule.exports = {\n name: 'AnPlusB',\n structure: {\n a: [String, null],\n b: [String, null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var end = start;\n var prefix = '';\n var a = null;\n var b = null;\n\n if (this.scanner.tokenType === NUMBER ||\n this.scanner.tokenType === PLUSSIGN) {\n checkTokenIsInteger(this.scanner, ALLOW_SIGN);\n prefix = this.scanner.getTokenValue();\n this.scanner.next();\n end = this.scanner.tokenStart;\n }\n\n if (this.scanner.tokenType === IDENTIFIER) {\n var bStart = this.scanner.tokenStart;\n\n if (cmpChar(this.scanner.source, bStart, HYPHENMINUS)) {\n if (prefix === '') {\n prefix = '-';\n bStart++;\n } else {\n this.scanner.error('Unexpected hyphen minus');\n }\n }\n\n if (!cmpChar(this.scanner.source, bStart, N)) {\n this.scanner.error();\n }\n\n a = prefix === '' ? '1' :\n prefix === '+' ? '+1' :\n prefix === '-' ? '-1' :\n prefix;\n\n var len = this.scanner.tokenEnd - bStart;\n if (len > 1) {\n // ..n-..\n if (this.scanner.source.charCodeAt(bStart + 1) !== HYPHENMINUS) {\n this.scanner.error('Unexpected input', bStart + 1);\n }\n\n if (len > 2) {\n // ..n-{number}..\n this.scanner.tokenStart = bStart + 2;\n } else {\n // ..n- {number}\n this.scanner.next();\n this.scanner.skipSC();\n }\n\n checkTokenIsInteger(this.scanner, DISALLOW_SIGN);\n b = '-' + this.scanner.getTokenValue();\n this.scanner.next();\n end = this.scanner.tokenStart;\n } else {\n prefix = '';\n this.scanner.next();\n end = this.scanner.tokenStart;\n this.scanner.skipSC();\n\n if (this.scanner.tokenType === HYPHENMINUS ||\n this.scanner.tokenType === PLUSSIGN) {\n prefix = this.scanner.getTokenValue();\n this.scanner.next();\n this.scanner.skipSC();\n }\n\n if (this.scanner.tokenType === NUMBER) {\n checkTokenIsInteger(this.scanner, prefix !== '');\n\n if (!isNumber(this.scanner.source.charCodeAt(this.scanner.tokenStart))) {\n prefix = this.scanner.source.charAt(this.scanner.tokenStart);\n this.scanner.tokenStart++;\n }\n\n if (prefix === '') {\n // should be an operator before number\n this.scanner.error();\n } else if (prefix === '+') {\n // plus is using by default\n prefix = '';\n }\n\n b = prefix + this.scanner.getTokenValue();\n\n this.scanner.next();\n end = this.scanner.tokenStart;\n } else {\n if (prefix) {\n this.scanner.eat(NUMBER);\n }\n }\n }\n } else {\n if (prefix === '' || prefix === '+') { // no number\n this.scanner.error(\n 'Number or identifier is expected',\n this.scanner.tokenStart + (\n this.scanner.tokenType === PLUSSIGN ||\n this.scanner.tokenType === HYPHENMINUS\n )\n );\n }\n\n b = prefix;\n }\n\n return {\n type: 'AnPlusB',\n loc: this.getLocation(start, end),\n a: a,\n b: b\n };\n },\n generate: function(node) {\n var a = node.a !== null && node.a !== undefined;\n var b = node.b !== null && node.b !== undefined;\n\n if (a) {\n this.chunk(\n node.a === '+1' ? '+n' :\n node.a === '1' ? 'n' :\n node.a === '-1' ? '-n' :\n node.a + 'n'\n );\n\n if (b) {\n b = String(node.b);\n if (b.charAt(0) === '-' || b.charAt(0) === '+') {\n this.chunk(b.charAt(0));\n this.chunk(b.substr(1));\n } else {\n this.chunk('+');\n this.chunk(b);\n }\n }\n } else {\n this.chunk(String(node.b));\n }\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar ATKEYWORD = TYPE.AtKeyword;\nvar SEMICOLON = TYPE.Semicolon;\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\nvar RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, SEMICOLON, LEFTCURLYBRACKET, false, true);\n}\n\nfunction isDeclarationBlockAtrule() {\n for (var offset = 1, type; type = this.scanner.lookupType(offset); offset++) {\n if (type === RIGHTCURLYBRACKET) {\n return true;\n }\n\n if (type === LEFTCURLYBRACKET ||\n type === ATKEYWORD) {\n return false;\n }\n }\n\n return false;\n}\n\nmodule.exports = {\n name: 'Atrule',\n structure: {\n name: String,\n prelude: ['AtrulePrelude', 'Raw', null],\n block: ['Block', null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var name;\n var nameLowerCase;\n var prelude = null;\n var block = null;\n\n this.scanner.eat(ATKEYWORD);\n\n name = this.scanner.substrToCursor(start + 1);\n nameLowerCase = name.toLowerCase();\n this.scanner.skipSC();\n\n // parse prelude\n if (this.scanner.eof === false &&\n this.scanner.tokenType !== LEFTCURLYBRACKET &&\n this.scanner.tokenType !== SEMICOLON) {\n if (this.parseAtrulePrelude) {\n prelude = this.parseWithFallback(this.AtrulePrelude.bind(this, name), consumeRaw);\n\n // turn empty AtrulePrelude into null\n if (prelude.type === 'AtrulePrelude' && prelude.children.head === null) {\n prelude = null;\n }\n } else {\n prelude = consumeRaw.call(this, this.scanner.currentToken);\n }\n\n this.scanner.skipSC();\n }\n\n switch (this.scanner.tokenType) {\n case SEMICOLON:\n this.scanner.next();\n break;\n\n case LEFTCURLYBRACKET:\n if (this.atrule.hasOwnProperty(nameLowerCase) &&\n typeof this.atrule[nameLowerCase].block === 'function') {\n block = this.atrule[nameLowerCase].block.call(this);\n } else {\n // TODO: should consume block content as Raw?\n block = this.Block(isDeclarationBlockAtrule.call(this));\n }\n\n break;\n }\n\n return {\n type: 'Atrule',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n prelude: prelude,\n block: block\n };\n },\n generate: function(node) {\n this.chunk('@');\n this.chunk(node.name);\n\n if (node.prelude !== null) {\n this.chunk(' ');\n this.node(node.prelude);\n }\n\n if (node.block) {\n this.node(node.block);\n } else {\n this.chunk(';');\n }\n },\n walkContext: 'atrule'\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar STRING = TYPE.String;\nvar DOLLARSIGN = TYPE.DollarSign;\nvar ASTERISK = TYPE.Asterisk;\nvar COLON = TYPE.Colon;\nvar EQUALSSIGN = TYPE.EqualsSign;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;\nvar CIRCUMFLEXACCENT = TYPE.CircumflexAccent;\nvar VERTICALLINE = TYPE.VerticalLine;\nvar TILDE = TYPE.Tilde;\n\nfunction getAttributeName() {\n if (this.scanner.eof) {\n this.scanner.error('Unexpected end of input');\n }\n\n var start = this.scanner.tokenStart;\n var expectIdentifier = false;\n var checkColon = true;\n\n if (this.scanner.tokenType === ASTERISK) {\n expectIdentifier = true;\n checkColon = false;\n this.scanner.next();\n } else if (this.scanner.tokenType !== VERTICALLINE) {\n this.scanner.eat(IDENTIFIER);\n }\n\n if (this.scanner.tokenType === VERTICALLINE) {\n if (this.scanner.lookupType(1) !== EQUALSSIGN) {\n this.scanner.next();\n this.scanner.eat(IDENTIFIER);\n } else if (expectIdentifier) {\n this.scanner.error('Identifier is expected', this.scanner.tokenEnd);\n }\n } else if (expectIdentifier) {\n this.scanner.error('Vertical line is expected');\n }\n\n if (checkColon && this.scanner.tokenType === COLON) {\n this.scanner.next();\n this.scanner.eat(IDENTIFIER);\n }\n\n return {\n type: 'Identifier',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(start)\n };\n}\n\nfunction getOperator() {\n var start = this.scanner.tokenStart;\n var tokenType = this.scanner.tokenType;\n\n if (tokenType !== EQUALSSIGN && // =\n tokenType !== TILDE && // ~=\n tokenType !== CIRCUMFLEXACCENT && // ^=\n tokenType !== DOLLARSIGN && // $=\n tokenType !== ASTERISK && // *=\n tokenType !== VERTICALLINE // |=\n ) {\n this.scanner.error('Attribute selector (=, ~=, ^=, $=, *=, |=) is expected');\n }\n\n if (tokenType === EQUALSSIGN) {\n this.scanner.next();\n } else {\n this.scanner.next();\n this.scanner.eat(EQUALSSIGN);\n }\n\n return this.scanner.substrToCursor(start);\n}\n\n// '[' S* attrib_name ']'\n// '[' S* attrib_name S* attrib_matcher S* [ IDENT | STRING ] S* attrib_flags? S* ']'\nmodule.exports = {\n name: 'AttributeSelector',\n structure: {\n name: 'Identifier',\n matcher: [String, null],\n value: ['String', 'Identifier', null],\n flags: [String, null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var name;\n var matcher = null;\n var value = null;\n var flags = null;\n\n this.scanner.eat(LEFTSQUAREBRACKET);\n this.scanner.skipSC();\n\n name = getAttributeName.call(this);\n this.scanner.skipSC();\n\n if (this.scanner.tokenType !== RIGHTSQUAREBRACKET) {\n // avoid case `[name i]`\n if (this.scanner.tokenType !== IDENTIFIER) {\n matcher = getOperator.call(this);\n\n this.scanner.skipSC();\n\n value = this.scanner.tokenType === STRING\n ? this.String()\n : this.Identifier();\n\n this.scanner.skipSC();\n }\n\n // attribute flags\n if (this.scanner.tokenType === IDENTIFIER) {\n flags = this.scanner.getTokenValue();\n this.scanner.next();\n\n this.scanner.skipSC();\n }\n }\n\n this.scanner.eat(RIGHTSQUAREBRACKET);\n\n return {\n type: 'AttributeSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n matcher: matcher,\n value: value,\n flags: flags\n };\n },\n generate: function(node) {\n var flagsPrefix = ' ';\n\n this.chunk('[');\n this.node(node.name);\n\n if (node.matcher !== null) {\n this.chunk(node.matcher);\n\n if (node.value !== null) {\n this.node(node.value);\n\n // space between string and flags is not required\n if (node.value.type === 'String') {\n flagsPrefix = '';\n }\n }\n }\n\n if (node.flags !== null) {\n this.chunk(flagsPrefix);\n this.chunk(node.flags);\n }\n\n this.chunk(']');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar SEMICOLON = TYPE.Semicolon;\nvar ATKEYWORD = TYPE.AtKeyword;\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\nvar RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, 0, 0, false, true);\n}\nfunction consumeRule() {\n return this.parseWithFallback(this.Rule, consumeRaw);\n}\nfunction consumeRawDeclaration(startToken) {\n return this.Raw(startToken, 0, SEMICOLON, true, true);\n}\nfunction consumeDeclaration() {\n if (this.scanner.tokenType === SEMICOLON) {\n return consumeRawDeclaration.call(this, this.scanner.currentToken);\n }\n\n var node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);\n\n if (this.scanner.tokenType === SEMICOLON) {\n this.scanner.next();\n }\n\n return node;\n}\n\nmodule.exports = {\n name: 'Block',\n structure: {\n children: [[\n 'Atrule',\n 'Rule',\n 'Declaration'\n ]]\n },\n parse: function(isDeclaration) {\n var consumer = isDeclaration ? consumeDeclaration : consumeRule;\n\n var start = this.scanner.tokenStart;\n var children = this.createList();\n\n this.scanner.eat(LEFTCURLYBRACKET);\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case RIGHTCURLYBRACKET:\n break scan;\n\n case WHITESPACE:\n case COMMENT:\n this.scanner.next();\n break;\n\n case ATKEYWORD:\n children.push(this.parseWithFallback(this.Atrule, consumeRaw));\n break;\n\n default:\n children.push(consumer.call(this));\n }\n }\n\n if (!this.scanner.eof) {\n this.scanner.eat(RIGHTCURLYBRACKET);\n }\n\n return {\n type: 'Block',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(node) {\n this.chunk('{');\n this.children(node, function(prev) {\n if (prev.type === 'Declaration') {\n this.chunk(';');\n }\n });\n this.chunk('}');\n },\n walkContext: 'block'\n};\n","var isCustomProperty = require('../../utils/names').isCustomProperty;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar COLON = TYPE.Colon;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\nvar SOLIDUS = TYPE.Solidus;\nvar ASTERISK = TYPE.Asterisk;\nvar DOLLARSIGN = TYPE.DollarSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar SEMICOLON = TYPE.Semicolon;\nvar PLUSSIGN = TYPE.PlusSign;\nvar NUMBERSIGN = TYPE.NumberSign;\n\nfunction consumeValueRaw(startToken) {\n return this.Raw(startToken, EXCLAMATIONMARK, SEMICOLON, false, true);\n}\n\nfunction consumeCustomPropertyRaw(startToken) {\n return this.Raw(startToken, EXCLAMATIONMARK, SEMICOLON, false, false);\n}\n\nfunction consumeValue() {\n var startValueToken = this.scanner.currentToken;\n var value = this.Value();\n\n if (value.type !== 'Raw' &&\n this.scanner.eof === false &&\n this.scanner.tokenType !== SEMICOLON &&\n this.scanner.tokenType !== EXCLAMATIONMARK &&\n this.scanner.isBalanceEdge(startValueToken) === false) {\n this.scanner.error();\n }\n\n return value;\n}\n\nmodule.exports = {\n name: 'Declaration',\n structure: {\n important: [Boolean, String],\n property: String,\n value: ['Value', 'Raw']\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var startToken = this.scanner.currentToken;\n var property = readProperty.call(this);\n var customProperty = isCustomProperty(property);\n var parseValue = customProperty ? this.parseCustomProperty : this.parseValue;\n var consumeRaw = customProperty ? consumeCustomPropertyRaw : consumeValueRaw;\n var important = false;\n var value;\n\n this.scanner.skipSC();\n this.scanner.eat(COLON);\n\n if (!customProperty) {\n this.scanner.skipSC();\n }\n\n if (parseValue) {\n value = this.parseWithFallback(consumeValue, consumeRaw);\n } else {\n value = consumeRaw.call(this, this.scanner.currentToken);\n }\n\n if (this.scanner.tokenType === EXCLAMATIONMARK) {\n important = getImportant(this.scanner);\n this.scanner.skipSC();\n }\n\n // Do not include semicolon to range per spec\n // https://drafts.csswg.org/css-syntax/#declaration-diagram\n\n if (this.scanner.eof === false &&\n this.scanner.tokenType !== SEMICOLON &&\n this.scanner.isBalanceEdge(startToken) === false) {\n this.scanner.error();\n }\n\n return {\n type: 'Declaration',\n loc: this.getLocation(start, this.scanner.tokenStart),\n important: important,\n property: property,\n value: value\n };\n },\n generate: function(node) {\n this.chunk(node.property);\n this.chunk(':');\n this.node(node.value);\n\n if (node.important) {\n this.chunk(node.important === true ? '!important' : '!' + node.important);\n }\n },\n walkContext: 'declaration'\n};\n\nfunction readProperty() {\n var start = this.scanner.tokenStart;\n var prefix = 0;\n\n // hacks\n switch (this.scanner.tokenType) {\n case ASTERISK:\n case DOLLARSIGN:\n case PLUSSIGN:\n case NUMBERSIGN:\n prefix = 1;\n break;\n\n // TODO: not sure we should support this hack\n case SOLIDUS:\n prefix = this.scanner.lookupType(1) === SOLIDUS ? 2 : 1;\n break;\n }\n\n if (this.scanner.lookupType(prefix) === HYPHENMINUS) {\n prefix++;\n }\n\n if (prefix) {\n this.scanner.skip(prefix);\n }\n\n this.scanner.eat(IDENTIFIER);\n\n return this.scanner.substrToCursor(start);\n}\n\n// ! ws* important\nfunction getImportant(scanner) {\n scanner.eat(EXCLAMATIONMARK);\n scanner.skipSC();\n\n var important = scanner.consume(IDENTIFIER);\n\n // store original value in case it differ from `important`\n // for better original source restoring and hacks like `!ie` support\n return important === 'important' ? true : important;\n}\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar SEMICOLON = TYPE.Semicolon;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, 0, SEMICOLON, true, true);\n}\n\nmodule.exports = {\n name: 'DeclarationList',\n structure: {\n children: [[\n 'Declaration'\n ]]\n },\n parse: function() {\n var children = this.createList();\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case WHITESPACE:\n case COMMENT:\n case SEMICOLON:\n this.scanner.next();\n break;\n\n default:\n children.push(this.parseWithFallback(this.Declaration, consumeRaw));\n }\n }\n\n return {\n type: 'DeclarationList',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(node) {\n this.children(node, function(prev) {\n if (prev.type === 'Declaration') {\n this.chunk(';');\n }\n });\n }\n};\n","var NUMBER = require('../../tokenizer').TYPE.Number;\n\n// special reader for units to avoid adjoined IE hacks (i.e. '1px\\9')\nfunction readUnit(scanner) {\n var unit = scanner.getTokenValue();\n var backSlashPos = unit.indexOf('\\\\');\n\n if (backSlashPos > 0) {\n // patch token offset\n scanner.tokenStart += backSlashPos;\n\n // return part before backslash\n return unit.substring(0, backSlashPos);\n }\n\n // no backslash in unit name\n scanner.next();\n\n return unit;\n}\n\n// number ident\nmodule.exports = {\n name: 'Dimension',\n structure: {\n value: String,\n unit: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var value = this.scanner.consume(NUMBER);\n var unit = readUnit(this.scanner);\n\n return {\n type: 'Dimension',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: value,\n unit: unit\n };\n },\n generate: function(node) {\n this.chunk(node.value);\n this.chunk(node.unit);\n }\n};\n","var isHex = require('../../tokenizer').isHex;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar NUMBERSIGN = TYPE.NumberSign;\n\nfunction consumeHexSequence(scanner, required) {\n if (!isHex(scanner.source.charCodeAt(scanner.tokenStart))) {\n if (required) {\n scanner.error('Unexpected input', scanner.tokenStart);\n } else {\n return;\n }\n }\n\n for (var pos = scanner.tokenStart + 1; pos < scanner.tokenEnd; pos++) {\n var code = scanner.source.charCodeAt(pos);\n\n // break on non-hex char\n if (!isHex(code)) {\n // break token, exclude symbol\n scanner.tokenStart = pos;\n return;\n }\n }\n\n // token is full hex sequence, go to next token\n scanner.next();\n}\n\n// # ident\nmodule.exports = {\n name: 'HexColor',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.eat(NUMBERSIGN);\n\n scan:\n switch (this.scanner.tokenType) {\n case NUMBER:\n consumeHexSequence(this.scanner, true);\n\n // if token is identifier then number consists of hex only,\n // try to add identifier to result\n if (this.scanner.tokenType === IDENTIFIER) {\n consumeHexSequence(this.scanner, false);\n }\n\n break;\n\n case IDENTIFIER:\n consumeHexSequence(this.scanner, true);\n break;\n\n default:\n this.scanner.error('Number or identifier is expected');\n }\n\n return {\n type: 'HexColor',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.substrToCursor(start + 1) // skip #\n };\n },\n generate: function(node) {\n this.chunk('#');\n this.chunk(node.value);\n }\n};\n","var isNumber = require('../../tokenizer').isNumber;\nvar TYPE = require('../../tokenizer').TYPE;\nvar NUMBER = TYPE.Number;\nvar SOLIDUS = TYPE.Solidus;\nvar FULLSTOP = TYPE.FullStop;\n\n// Terms of <ratio> should to be a positive number (not zero or negative)\n// (see https://drafts.csswg.org/mediaqueries-3/#values)\n// However, -o-min-device-pixel-ratio takes fractional values as a ratio's term\n// and this is using by various sites. Therefore we relax checking on parse\n// to test a term is unsigned number without exponent part.\n// Additional checks may to be applied on lexer validation.\nfunction consumeNumber(scanner) {\n var value = scanner.consumeNonWS(NUMBER);\n\n for (var i = 0; i < value.length; i++) {\n var code = value.charCodeAt(i);\n if (!isNumber(code) && code !== FULLSTOP) {\n scanner.error('Unsigned number is expected', scanner.tokenStart - value.length + i);\n }\n }\n\n if (Number(value) === 0) {\n scanner.error('Zero number is not allowed', scanner.tokenStart - value.length);\n }\n\n return value;\n}\n\n// <positive-integer> S* '/' S* <positive-integer>\nmodule.exports = {\n name: 'Ratio',\n structure: {\n left: String,\n right: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var left = consumeNumber(this.scanner);\n var right;\n\n this.scanner.eatNonWS(SOLIDUS);\n right = consumeNumber(this.scanner);\n\n return {\n type: 'Ratio',\n loc: this.getLocation(start, this.scanner.tokenStart),\n left: left,\n right: right\n };\n },\n generate: function(node) {\n this.chunk(node.left);\n this.chunk('/');\n this.chunk(node.right);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, LEFTCURLYBRACKET, 0, false, true);\n}\n\nfunction consumePrelude() {\n var prelude = this.SelectorList();\n\n if (prelude.type !== 'Raw' &&\n this.scanner.eof === false &&\n this.scanner.tokenType !== LEFTCURLYBRACKET) {\n this.scanner.error();\n }\n\n return prelude;\n}\n\nmodule.exports = {\n name: 'Rule',\n structure: {\n prelude: ['SelectorList', 'Raw'],\n block: ['Block']\n },\n parse: function() {\n var startToken = this.scanner.currentToken;\n var startOffset = this.scanner.tokenStart;\n var prelude;\n var block;\n\n if (this.parseRulePrelude) {\n prelude = this.parseWithFallback(consumePrelude, consumeRaw);\n } else {\n prelude = consumeRaw.call(this, startToken);\n }\n\n block = this.Block(true);\n\n return {\n type: 'Rule',\n loc: this.getLocation(startOffset, this.scanner.tokenStart),\n prelude: prelude,\n block: block\n };\n },\n generate: function(node) {\n this.node(node.prelude);\n this.node(node.block);\n },\n walkContext: 'rule'\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\nvar ATKEYWORD = TYPE.AtKeyword;\nvar CDO = TYPE.CDO;\nvar CDC = TYPE.CDC;\n\nfunction consumeRaw(startToken) {\n return this.Raw(startToken, 0, 0, false, false);\n}\n\nmodule.exports = {\n name: 'StyleSheet',\n structure: {\n children: [[\n 'Comment',\n 'CDO',\n 'CDC',\n 'Atrule',\n 'Rule',\n 'Raw'\n ]]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var children = this.createList();\n var child;\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case WHITESPACE:\n this.scanner.next();\n continue;\n\n case COMMENT:\n // ignore comments except exclamation comments (i.e. /*! .. */) on top level\n if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK) {\n this.scanner.next();\n continue;\n }\n\n child = this.Comment();\n break;\n\n case CDO: // <!--\n child = this.CDO();\n break;\n\n case CDC: // -->\n child = this.CDC();\n break;\n\n // CSS Syntax Module Level 3\n // §2.2 Error handling\n // At the \"top level\" of a stylesheet, an <at-keyword-token> starts an at-rule.\n case ATKEYWORD:\n child = this.parseWithFallback(this.Atrule, consumeRaw);\n break;\n\n // Anything else starts a qualified rule ...\n default:\n child = this.parseWithFallback(this.Rule, consumeRaw);\n }\n\n children.push(child);\n }\n\n return {\n type: 'StyleSheet',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(node) {\n this.children(node);\n },\n walkContext: 'stylesheet'\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar ASTERISK = TYPE.Asterisk;\nvar VERTICALLINE = TYPE.VerticalLine;\n\nfunction eatIdentifierOrAsterisk() {\n if (this.scanner.tokenType !== IDENTIFIER &&\n this.scanner.tokenType !== ASTERISK) {\n this.scanner.error('Identifier or asterisk is expected');\n }\n\n this.scanner.next();\n}\n\n// ident\n// ident|ident\n// ident|*\n// *\n// *|ident\n// *|*\n// |ident\n// |*\nmodule.exports = {\n name: 'TypeSelector',\n structure: {\n name: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n if (this.scanner.tokenType === VERTICALLINE) {\n this.scanner.next();\n eatIdentifierOrAsterisk.call(this);\n } else {\n eatIdentifierOrAsterisk.call(this);\n\n if (this.scanner.tokenType === VERTICALLINE) {\n this.scanner.next();\n eatIdentifierOrAsterisk.call(this);\n }\n }\n\n return {\n type: 'TypeSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(start)\n };\n },\n generate: function(node) {\n this.chunk(node.name);\n }\n};\n","var isHex = require('../../tokenizer').isHex;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar FULLSTOP = TYPE.FullStop;\nvar QUESTIONMARK = TYPE.QuestionMark;\n\nfunction scanUnicodeNumber(scanner) {\n for (var pos = scanner.tokenStart + 1; pos < scanner.tokenEnd; pos++) {\n var code = scanner.source.charCodeAt(pos);\n\n // break on fullstop or hyperminus/plussign after exponent\n if (code === FULLSTOP || code === PLUSSIGN) {\n // break token, exclude symbol\n scanner.tokenStart = pos;\n return false;\n }\n }\n\n return true;\n}\n\n// https://drafts.csswg.org/css-syntax-3/#urange\nfunction scanUnicodeRange(scanner) {\n var hexStart = scanner.tokenStart + 1; // skip +\n var hexLength = 0;\n\n scan: {\n if (scanner.tokenType === NUMBER) {\n if (scanner.source.charCodeAt(scanner.tokenStart) !== FULLSTOP && scanUnicodeNumber(scanner)) {\n scanner.next();\n } else if (scanner.source.charCodeAt(scanner.tokenStart) !== HYPHENMINUS) {\n break scan;\n }\n } else {\n scanner.next(); // PLUSSIGN\n }\n\n if (scanner.tokenType === HYPHENMINUS) {\n scanner.next();\n }\n\n if (scanner.tokenType === NUMBER) {\n scanner.next();\n }\n\n if (scanner.tokenType === IDENTIFIER) {\n scanner.next();\n }\n\n if (scanner.tokenStart === hexStart) {\n scanner.error('Unexpected input', hexStart);\n }\n }\n\n // validate for U+x{1,6} or U+x{1,6}-x{1,6}\n // where x is [0-9a-fA-F]\n for (var i = hexStart, wasHyphenMinus = false; i < scanner.tokenStart; i++) {\n var code = scanner.source.charCodeAt(i);\n\n if (isHex(code) === false && (code !== HYPHENMINUS || wasHyphenMinus)) {\n scanner.error('Unexpected input', i);\n }\n\n if (code === HYPHENMINUS) {\n // hex sequence shouldn't be an empty\n if (hexLength === 0) {\n scanner.error('Unexpected input', i);\n }\n\n wasHyphenMinus = true;\n hexLength = 0;\n } else {\n hexLength++;\n\n // too long hex sequence\n if (hexLength > 6) {\n scanner.error('Too long hex sequence', i);\n }\n }\n\n }\n\n // check we have a non-zero sequence\n if (hexLength === 0) {\n scanner.error('Unexpected input', i - 1);\n }\n\n // U+abc???\n if (!wasHyphenMinus) {\n // consume as many U+003F QUESTION MARK (?) code points as possible\n for (; hexLength < 6 && !scanner.eof; scanner.next()) {\n if (scanner.tokenType !== QUESTIONMARK) {\n break;\n }\n\n hexLength++;\n }\n }\n}\n\nmodule.exports = {\n name: 'UnicodeRange',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.next(); // U or u\n scanUnicodeRange(this.scanner);\n\n return {\n type: 'UnicodeRange',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.substrToCursor(start)\n };\n },\n generate: function(node) {\n this.chunk(node.value);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar IDENTIFIER = TYPE.Identifier;\nvar FUNCTION = TYPE.Function;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar COLON = TYPE.Colon;\n\nfunction consumeRaw() {\n return this.createSingleNodeList(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n}\n\nfunction parentheses() {\n var index = 0;\n\n this.scanner.skipSC();\n\n // TODO: make it simplier\n if (this.scanner.tokenType === IDENTIFIER) {\n index = 1;\n } else if (this.scanner.tokenType === HYPHENMINUS &&\n this.scanner.lookupType(1) === IDENTIFIER) {\n index = 2;\n }\n\n if (index !== 0 && this.scanner.lookupNonWSType(index) === COLON) {\n return this.createSingleNodeList(\n this.Declaration()\n );\n }\n\n return readSequence.call(this);\n}\n\nfunction readSequence() {\n var children = this.createList();\n var space = null;\n var child;\n\n this.scanner.skipSC();\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case WHITESPACE:\n space = this.WhiteSpace();\n continue;\n\n case COMMENT:\n this.scanner.next();\n continue;\n\n case FUNCTION:\n child = this.Function(consumeRaw, this.scope.AtrulePrelude);\n break;\n\n case IDENTIFIER:\n child = this.Identifier();\n break;\n\n case LEFTPARENTHESIS:\n child = this.Parentheses(parentheses, this.scope.AtrulePrelude);\n break;\n\n default:\n break scan;\n }\n\n if (space !== null) {\n children.push(space);\n space = null;\n }\n\n children.push(child);\n }\n\n return children;\n}\n\nmodule.exports = {\n parse: {\n prelude: function() {\n var children = readSequence.call(this);\n\n if (this.getFirstListNode(children) === null) {\n this.scanner.error('Condition is expected');\n }\n\n return children;\n },\n block: function() {\n return this.Block(false);\n }\n }\n};\n","var hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction buildMap(list, caseInsensitive) {\n var map = Object.create(null);\n\n if (!Array.isArray(list)) {\n return null;\n }\n\n for (var i = 0; i < list.length; i++) {\n var name = list[i];\n\n if (caseInsensitive) {\n name = name.toLowerCase();\n }\n\n map[name] = true;\n }\n\n return map;\n}\n\nfunction buildList(data) {\n if (!data) {\n return null;\n }\n\n var tags = buildMap(data.tags, true);\n var ids = buildMap(data.ids);\n var classes = buildMap(data.classes);\n\n if (tags === null &&\n ids === null &&\n classes === null) {\n return null;\n }\n\n return {\n tags: tags,\n ids: ids,\n classes: classes\n };\n}\n\nfunction buildIndex(data) {\n var scopes = false;\n\n if (data.scopes && Array.isArray(data.scopes)) {\n scopes = Object.create(null);\n\n for (var i = 0; i < data.scopes.length; i++) {\n var list = data.scopes[i];\n\n if (!list || !Array.isArray(list)) {\n throw new Error('Wrong usage format');\n }\n\n for (var j = 0; j < list.length; j++) {\n var name = list[j];\n\n if (hasOwnProperty.call(scopes, name)) {\n throw new Error('Class can\\'t be used for several scopes: ' + name);\n }\n\n scopes[name] = i + 1;\n }\n }\n }\n\n return {\n whitelist: buildList(data),\n blacklist: buildList(data.blacklist),\n scopes: scopes\n };\n}\n\nmodule.exports = {\n buildIndex: buildIndex\n};\n","var hasOwnProperty = Object.prototype.hasOwnProperty;\nvar walk = require('css-tree').walk;\n\nfunction cleanUnused(selectorList, usageData) {\n selectorList.children.each(function(selector, item, list) {\n var shouldRemove = false;\n\n walk(selector, function(node) {\n // ignore nodes in nested selectors\n if (this.selector === null || this.selector === selectorList) {\n switch (node.type) {\n case 'SelectorList':\n // TODO: remove toLowerCase when pseudo selectors will be normalized\n // ignore selectors inside :not()\n if (this['function'] === null || this['function'].name.toLowerCase() !== 'not') {\n if (cleanUnused(node, usageData)) {\n shouldRemove = true;\n }\n }\n break;\n\n case 'ClassSelector':\n if (usageData.whitelist !== null &&\n usageData.whitelist.classes !== null &&\n !hasOwnProperty.call(usageData.whitelist.classes, node.name)) {\n shouldRemove = true;\n }\n if (usageData.blacklist !== null &&\n usageData.blacklist.classes !== null &&\n hasOwnProperty.call(usageData.blacklist.classes, node.name)) {\n shouldRemove = true;\n }\n break;\n\n case 'IdSelector':\n if (usageData.whitelist !== null &&\n usageData.whitelist.ids !== null &&\n !hasOwnProperty.call(usageData.whitelist.ids, node.name)) {\n shouldRemove = true;\n }\n if (usageData.blacklist !== null &&\n usageData.blacklist.ids !== null &&\n hasOwnProperty.call(usageData.blacklist.ids, node.name)) {\n shouldRemove = true;\n }\n break;\n\n case 'TypeSelector':\n // TODO: remove toLowerCase when type selectors will be normalized\n // ignore universal selectors\n if (node.name.charAt(node.name.length - 1) !== '*') {\n if (usageData.whitelist !== null &&\n usageData.whitelist.tags !== null &&\n !hasOwnProperty.call(usageData.whitelist.tags, node.name.toLowerCase())) {\n shouldRemove = true;\n }\n if (usageData.blacklist !== null &&\n usageData.blacklist.tags !== null &&\n hasOwnProperty.call(usageData.blacklist.tags, node.name.toLowerCase())) {\n shouldRemove = true;\n }\n }\n break;\n }\n }\n });\n\n if (shouldRemove) {\n list.remove(item);\n }\n });\n\n return selectorList.children.isEmpty();\n}\n\nmodule.exports = function cleanRuleset(node, item, list, options) {\n var usageData = options.usage;\n\n if (usageData && (usageData.whitelist !== null || usageData.blacklist !== null)) {\n cleanUnused(node.prelude, usageData);\n }\n\n if (node.prelude.children.isEmpty() ||\n node.block.children.isEmpty()) {\n list.remove(item);\n }\n};\n","// Can unquote attribute detection\n// Adopted implementation of Mathias Bynens\n// https://github.com/mathiasbynens/mothereff.in/blob/master/unquoted-attributes/eff.js\nvar escapesRx = /\\\\([0-9A-Fa-f]{1,6})(\\r\\n|[ \\t\\n\\f\\r])?|\\\\./g;\nvar blockUnquoteRx = /^(-?\\d|--)|[\\u0000-\\u002c\\u002e\\u002f\\u003A-\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u009f]/;\n\nfunction canUnquote(value) {\n if (value === '' || value === '-') {\n return;\n }\n\n // Escapes are valid, so replace them with a valid non-empty string\n value = value.replace(escapesRx, 'a');\n\n return !blockUnquoteRx.test(value);\n}\n\nmodule.exports = function(node) {\n var attrValue = node.value;\n\n if (!attrValue || attrValue.type !== 'String') {\n return;\n }\n\n var unquotedValue = attrValue.value.replace(/^(.)(.*)\\1$/, '$2');\n if (canUnquote(unquotedValue)) {\n node.value = {\n type: 'Identifier',\n loc: attrValue.loc,\n name: unquotedValue\n };\n }\n};\n","function removeItemAndRedundantWhiteSpace(list, item) {\n var prev = item.prev;\n var next = item.next;\n\n if (next !== null) {\n if (next.data.type === 'WhiteSpace' && (prev === null || prev.data.type === 'WhiteSpace')) {\n list.remove(next);\n }\n } else if (prev !== null && prev.data.type === 'WhiteSpace') {\n list.remove(prev);\n }\n\n list.remove(item);\n}\n\nmodule.exports = function compressBorder(node) {\n node.children.each(function(node, item, list) {\n if (node.type === 'Identifier' && node.name.toLowerCase() === 'none') {\n if (list.head === list.tail) {\n // replace `none` for zero when `none` is a single term\n item.data = {\n type: 'Number',\n loc: node.loc,\n value: '0'\n };\n } else {\n removeItemAndRedundantWhiteSpace(list, item);\n }\n }\n });\n};\n","var OMIT_PLUSSIGN = /^(?:\\+|(-))?0*(\\d*)(?:\\.0*|(\\.\\d*?)0*)?$/;\nvar KEEP_PLUSSIGN = /^([\\+\\-])?0*(\\d*)(?:\\.0*|(\\.\\d*?)0*)?$/;\nvar unsafeToRemovePlusSignAfter = {\n Dimension: true,\n HexColor: true,\n Identifier: true,\n Number: true,\n Raw: true,\n UnicodeRange: true\n};\n\nfunction packNumber(value, item) {\n // omit plus sign only if no prev or prev is safe type\n var regexp = item && item.prev !== null && unsafeToRemovePlusSignAfter.hasOwnProperty(item.prev.data.type)\n ? KEEP_PLUSSIGN\n : OMIT_PLUSSIGN;\n\n // 100 -> '100'\n // 00100 -> '100'\n // +100 -> '100' (only when safe, e.g. omitting plus sign for 1px+1px leads to single dimension instead of two)\n // -100 -> '-100'\n // 0.123 -> '.123'\n // 0.12300 -> '.123'\n // 0.0 -> ''\n // 0 -> ''\n // -0 -> '-'\n value = String(value).replace(regexp, '$1$2$3');\n\n if (value === '' || value === '-') {\n value = '0';\n }\n\n return value;\n}\n\nmodule.exports = function(node, item) {\n node.value = packNumber(node.value, item);\n};\nmodule.exports.pack = packNumber;\n","var lexer = require('css-tree').lexer;\nvar packNumber = require('./Number').pack;\n\n// http://www.w3.org/TR/css3-color/#svg-color\nvar NAME_TO_HEX = {\n 'aliceblue': 'f0f8ff',\n 'antiquewhite': 'faebd7',\n 'aqua': '0ff',\n 'aquamarine': '7fffd4',\n 'azure': 'f0ffff',\n 'beige': 'f5f5dc',\n 'bisque': 'ffe4c4',\n 'black': '000',\n 'blanchedalmond': 'ffebcd',\n 'blue': '00f',\n 'blueviolet': '8a2be2',\n 'brown': 'a52a2a',\n 'burlywood': 'deb887',\n 'cadetblue': '5f9ea0',\n 'chartreuse': '7fff00',\n 'chocolate': 'd2691e',\n 'coral': 'ff7f50',\n 'cornflowerblue': '6495ed',\n 'cornsilk': 'fff8dc',\n 'crimson': 'dc143c',\n 'cyan': '0ff',\n 'darkblue': '00008b',\n 'darkcyan': '008b8b',\n 'darkgoldenrod': 'b8860b',\n 'darkgray': 'a9a9a9',\n 'darkgrey': 'a9a9a9',\n 'darkgreen': '006400',\n 'darkkhaki': 'bdb76b',\n 'darkmagenta': '8b008b',\n 'darkolivegreen': '556b2f',\n 'darkorange': 'ff8c00',\n 'darkorchid': '9932cc',\n 'darkred': '8b0000',\n 'darksalmon': 'e9967a',\n 'darkseagreen': '8fbc8f',\n 'darkslateblue': '483d8b',\n 'darkslategray': '2f4f4f',\n 'darkslategrey': '2f4f4f',\n 'darkturquoise': '00ced1',\n 'darkviolet': '9400d3',\n 'deeppink': 'ff1493',\n 'deepskyblue': '00bfff',\n 'dimgray': '696969',\n 'dimgrey': '696969',\n 'dodgerblue': '1e90ff',\n 'firebrick': 'b22222',\n 'floralwhite': 'fffaf0',\n 'forestgreen': '228b22',\n 'fuchsia': 'f0f',\n 'gainsboro': 'dcdcdc',\n 'ghostwhite': 'f8f8ff',\n 'gold': 'ffd700',\n 'goldenrod': 'daa520',\n 'gray': '808080',\n 'grey': '808080',\n 'green': '008000',\n 'greenyellow': 'adff2f',\n 'honeydew': 'f0fff0',\n 'hotpink': 'ff69b4',\n 'indianred': 'cd5c5c',\n 'indigo': '4b0082',\n 'ivory': 'fffff0',\n 'khaki': 'f0e68c',\n 'lavender': 'e6e6fa',\n 'lavenderblush': 'fff0f5',\n 'lawngreen': '7cfc00',\n 'lemonchiffon': 'fffacd',\n 'lightblue': 'add8e6',\n 'lightcoral': 'f08080',\n 'lightcyan': 'e0ffff',\n 'lightgoldenrodyellow': 'fafad2',\n 'lightgray': 'd3d3d3',\n 'lightgrey': 'd3d3d3',\n 'lightgreen': '90ee90',\n 'lightpink': 'ffb6c1',\n 'lightsalmon': 'ffa07a',\n 'lightseagreen': '20b2aa',\n 'lightskyblue': '87cefa',\n 'lightslategray': '789',\n 'lightslategrey': '789',\n 'lightsteelblue': 'b0c4de',\n 'lightyellow': 'ffffe0',\n 'lime': '0f0',\n 'limegreen': '32cd32',\n 'linen': 'faf0e6',\n 'magenta': 'f0f',\n 'maroon': '800000',\n 'mediumaquamarine': '66cdaa',\n 'mediumblue': '0000cd',\n 'mediumorchid': 'ba55d3',\n 'mediumpurple': '9370db',\n 'mediumseagreen': '3cb371',\n 'mediumslateblue': '7b68ee',\n 'mediumspringgreen': '00fa9a',\n 'mediumturquoise': '48d1cc',\n 'mediumvioletred': 'c71585',\n 'midnightblue': '191970',\n 'mintcream': 'f5fffa',\n 'mistyrose': 'ffe4e1',\n 'moccasin': 'ffe4b5',\n 'navajowhite': 'ffdead',\n 'navy': '000080',\n 'oldlace': 'fdf5e6',\n 'olive': '808000',\n 'olivedrab': '6b8e23',\n 'orange': 'ffa500',\n 'orangered': 'ff4500',\n 'orchid': 'da70d6',\n 'palegoldenrod': 'eee8aa',\n 'palegreen': '98fb98',\n 'paleturquoise': 'afeeee',\n 'palevioletred': 'db7093',\n 'papayawhip': 'ffefd5',\n 'peachpuff': 'ffdab9',\n 'peru': 'cd853f',\n 'pink': 'ffc0cb',\n 'plum': 'dda0dd',\n 'powderblue': 'b0e0e6',\n 'purple': '800080',\n 'rebeccapurple': '639',\n 'red': 'f00',\n 'rosybrown': 'bc8f8f',\n 'royalblue': '4169e1',\n 'saddlebrown': '8b4513',\n 'salmon': 'fa8072',\n 'sandybrown': 'f4a460',\n 'seagreen': '2e8b57',\n 'seashell': 'fff5ee',\n 'sienna': 'a0522d',\n 'silver': 'c0c0c0',\n 'skyblue': '87ceeb',\n 'slateblue': '6a5acd',\n 'slategray': '708090',\n 'slategrey': '708090',\n 'snow': 'fffafa',\n 'springgreen': '00ff7f',\n 'steelblue': '4682b4',\n 'tan': 'd2b48c',\n 'teal': '008080',\n 'thistle': 'd8bfd8',\n 'tomato': 'ff6347',\n 'turquoise': '40e0d0',\n 'violet': 'ee82ee',\n 'wheat': 'f5deb3',\n 'white': 'fff',\n 'whitesmoke': 'f5f5f5',\n 'yellow': 'ff0',\n 'yellowgreen': '9acd32'\n};\n\nvar HEX_TO_NAME = {\n '800000': 'maroon',\n '800080': 'purple',\n '808000': 'olive',\n '808080': 'gray',\n '00ffff': 'cyan',\n 'f0ffff': 'azure',\n 'f5f5dc': 'beige',\n 'ffe4c4': 'bisque',\n '000000': 'black',\n '0000ff': 'blue',\n 'a52a2a': 'brown',\n 'ff7f50': 'coral',\n 'ffd700': 'gold',\n '008000': 'green',\n '4b0082': 'indigo',\n 'fffff0': 'ivory',\n 'f0e68c': 'khaki',\n '00ff00': 'lime',\n 'faf0e6': 'linen',\n '000080': 'navy',\n 'ffa500': 'orange',\n 'da70d6': 'orchid',\n 'cd853f': 'peru',\n 'ffc0cb': 'pink',\n 'dda0dd': 'plum',\n 'f00': 'red',\n 'ff0000': 'red',\n 'fa8072': 'salmon',\n 'a0522d': 'sienna',\n 'c0c0c0': 'silver',\n 'fffafa': 'snow',\n 'd2b48c': 'tan',\n '008080': 'teal',\n 'ff6347': 'tomato',\n 'ee82ee': 'violet',\n 'f5deb3': 'wheat',\n 'ffffff': 'white',\n 'ffff00': 'yellow'\n};\n\nfunction hueToRgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(h, s, l, a) {\n var r;\n var g;\n var b;\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n\n r = hueToRgb(p, q, h + 1 / 3);\n g = hueToRgb(p, q, h);\n b = hueToRgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n a\n ];\n}\n\nfunction toHex(value) {\n value = value.toString(16);\n return value.length === 1 ? '0' + value : value;\n}\n\nfunction parseFunctionArgs(functionArgs, count, rgb) {\n var cursor = functionArgs.head;\n var args = [];\n var wasValue = false;\n\n while (cursor !== null) {\n var node = cursor.data;\n var type = node.type;\n\n switch (type) {\n case 'Number':\n case 'Percentage':\n if (wasValue) {\n return;\n }\n\n wasValue = true;\n args.push({\n type: type,\n value: Number(node.value)\n });\n break;\n\n case 'Operator':\n if (node.value === ',') {\n if (!wasValue) {\n return;\n }\n wasValue = false;\n } else if (wasValue || node.value !== '+') {\n return;\n }\n break;\n\n default:\n // something we couldn't understand\n return;\n }\n\n cursor = cursor.next;\n }\n\n if (args.length !== count) {\n // invalid arguments count\n // TODO: remove those tokens\n return;\n }\n\n if (args.length === 4) {\n if (args[3].type !== 'Number') {\n // 4th argument should be a number\n // TODO: remove those tokens\n return;\n }\n\n args[3].type = 'Alpha';\n }\n\n if (rgb) {\n if (args[0].type !== args[1].type || args[0].type !== args[2].type) {\n // invalid color, numbers and percentage shouldn't be mixed\n // TODO: remove those tokens\n return;\n }\n } else {\n if (args[0].type !== 'Number' ||\n args[1].type !== 'Percentage' ||\n args[2].type !== 'Percentage') {\n // invalid color, for hsl values should be: number, percentage, percentage\n // TODO: remove those tokens\n return;\n }\n\n args[0].type = 'Angle';\n }\n\n return args.map(function(arg) {\n var value = Math.max(0, arg.value);\n\n switch (arg.type) {\n case 'Number':\n // fit value to [0..255] range\n value = Math.min(value, 255);\n break;\n\n case 'Percentage':\n // convert 0..100% to value in [0..255] range\n value = Math.min(value, 100) / 100;\n\n if (!rgb) {\n return value;\n }\n\n value = 255 * value;\n break;\n\n case 'Angle':\n // fit value to (-360..360) range\n return (((value % 360) + 360) % 360) / 360;\n\n case 'Alpha':\n // fit value to [0..1] range\n return Math.min(value, 1);\n }\n\n return Math.round(value);\n });\n}\n\nfunction compressFunction(node, item, list) {\n var functionName = node.name;\n var args;\n\n if (functionName === 'rgba' || functionName === 'hsla') {\n args = parseFunctionArgs(node.children, 4, functionName === 'rgba');\n\n if (!args) {\n // something went wrong\n return;\n }\n\n if (functionName === 'hsla') {\n args = hslToRgb.apply(null, args);\n node.name = 'rgba';\n }\n\n if (args[3] === 0) {\n // try to replace `rgba(x, x, x, 0)` to `transparent`\n // always replace `rgba(0, 0, 0, 0)` to `transparent`\n // otherwise avoid replacement in gradients since it may break color transition\n // http://stackoverflow.com/questions/11829410/css3-gradient-rendering-issues-from-transparent-to-white\n var scopeFunctionName = this['function'] && this['function'].name;\n if ((args[0] === 0 && args[1] === 0 && args[2] === 0) ||\n !/^(?:to|from|color-stop)$|gradient$/i.test(scopeFunctionName)) {\n\n item.data = {\n type: 'Identifier',\n loc: node.loc,\n name: 'transparent'\n };\n\n return;\n }\n }\n\n if (args[3] !== 1) {\n // replace argument values for normalized/interpolated\n node.children.each(function(node, item, list) {\n if (node.type === 'Operator') {\n if (node.value !== ',') {\n list.remove(item);\n }\n return;\n }\n\n item.data = {\n type: 'Number',\n loc: node.loc,\n value: packNumber(args.shift(), null)\n };\n });\n\n return;\n }\n\n // otherwise convert to rgb, i.e. rgba(255, 0, 0, 1) -> rgb(255, 0, 0)\n functionName = 'rgb';\n }\n\n if (functionName === 'hsl') {\n args = args || parseFunctionArgs(node.children, 3, false);\n\n if (!args) {\n // something went wrong\n return;\n }\n\n // convert to rgb\n args = hslToRgb.apply(null, args);\n functionName = 'rgb';\n }\n\n if (functionName === 'rgb') {\n args = args || parseFunctionArgs(node.children, 3, true);\n\n if (!args) {\n // something went wrong\n return;\n }\n\n // check if color is not at the end and not followed by space\n var next = item.next;\n if (next && next.data.type !== 'WhiteSpace') {\n list.insert(list.createItem({\n type: 'WhiteSpace',\n value: ' '\n }), next);\n }\n\n item.data = {\n type: 'HexColor',\n loc: node.loc,\n value: toHex(args[0]) + toHex(args[1]) + toHex(args[2])\n };\n\n compressHex(item.data, item);\n }\n}\n\nfunction compressIdent(node, item) {\n if (this.declaration === null) {\n return;\n }\n\n var color = node.name.toLowerCase();\n\n if (NAME_TO_HEX.hasOwnProperty(color) &&\n lexer.matchDeclaration(this.declaration).isType(node, 'color')) {\n var hex = NAME_TO_HEX[color];\n\n if (hex.length + 1 <= color.length) {\n // replace for shorter hex value\n item.data = {\n type: 'HexColor',\n loc: node.loc,\n value: hex\n };\n } else {\n // special case for consistent colors\n if (color === 'grey') {\n color = 'gray';\n }\n\n // just replace value for lower cased name\n node.name = color;\n }\n }\n}\n\nfunction compressHex(node, item) {\n var color = node.value.toLowerCase();\n\n // #112233 -> #123\n if (color.length === 6 &&\n color[0] === color[1] &&\n color[2] === color[3] &&\n color[4] === color[5]) {\n color = color[0] + color[2] + color[4];\n }\n\n if (HEX_TO_NAME[color]) {\n item.data = {\n type: 'Identifier',\n loc: node.loc,\n name: HEX_TO_NAME[color]\n };\n } else {\n node.value = color;\n }\n}\n\nmodule.exports = {\n compressFunction: compressFunction,\n compressIdent: compressIdent,\n compressHex: compressHex\n};\n","var generate = require('css-tree').generate;\n\nfunction Index() {\n this.seed = 0;\n this.map = Object.create(null);\n}\n\nIndex.prototype.resolve = function(str) {\n var index = this.map[str];\n\n if (!index) {\n index = ++this.seed;\n this.map[str] = index;\n }\n\n return index;\n};\n\nmodule.exports = function createDeclarationIndexer() {\n var ids = new Index();\n\n return function markDeclaration(node) {\n var id = generate(node);\n\n node.id = ids.resolve(id);\n node.length = id.length;\n node.fingerprint = null;\n\n return node;\n };\n};\n","var List = require('css-tree').List;\nvar resolveKeyword = require('css-tree').keyword;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar walk = require('css-tree').walk;\n\nfunction addRuleToMap(map, item, list, single) {\n var node = item.data;\n var name = resolveKeyword(node.name).basename;\n var id = node.name.toLowerCase() + '/' + (node.prelude ? node.prelude.id : null);\n\n if (!hasOwnProperty.call(map, name)) {\n map[name] = Object.create(null);\n }\n\n if (single) {\n delete map[name][id];\n }\n\n if (!hasOwnProperty.call(map[name], id)) {\n map[name][id] = new List();\n }\n\n map[name][id].append(list.remove(item));\n}\n\nfunction relocateAtrules(ast, options) {\n var collected = Object.create(null);\n var topInjectPoint = null;\n\n ast.children.each(function(node, item, list) {\n if (node.type === 'Atrule') {\n var name = resolveKeyword(node.name).basename;\n\n switch (name) {\n case 'keyframes':\n addRuleToMap(collected, item, list, true);\n return;\n\n case 'media':\n if (options.forceMediaMerge) {\n addRuleToMap(collected, item, list, false);\n return;\n }\n break;\n }\n\n if (topInjectPoint === null &&\n name !== 'charset' &&\n name !== 'import') {\n topInjectPoint = item;\n }\n } else {\n if (topInjectPoint === null) {\n topInjectPoint = item;\n }\n }\n });\n\n for (var atrule in collected) {\n for (var id in collected[atrule]) {\n ast.children.insertList(\n collected[atrule][id],\n atrule === 'media' ? null : topInjectPoint\n );\n }\n }\n};\n\nfunction isMediaRule(node) {\n return node.type === 'Atrule' && node.name === 'media';\n}\n\nfunction processAtrule(node, item, list) {\n if (!isMediaRule(node)) {\n return;\n }\n\n var prev = item.prev && item.prev.data;\n\n if (!prev || !isMediaRule(prev)) {\n return;\n }\n\n // merge @media with same query\n if (node.prelude &&\n prev.prelude &&\n node.prelude.id === prev.prelude.id) {\n prev.block.children.appendList(node.block.children);\n list.remove(item);\n\n // TODO: use it when we can refer to several points in source\n // prev.loc = {\n // primary: prev.loc,\n // merged: node.loc\n // };\n }\n}\n\nmodule.exports = function rejoinAtrule(ast, options) {\n relocateAtrules(ast, options);\n\n walk(ast, {\n visit: 'Atrule',\n reverse: true,\n enter: processAtrule\n });\n};\n","var hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction isEqualSelectors(a, b) {\n var cursor1 = a.head;\n var cursor2 = b.head;\n\n while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {\n cursor1 = cursor1.next;\n cursor2 = cursor2.next;\n }\n\n return cursor1 === null && cursor2 === null;\n}\n\nfunction isEqualDeclarations(a, b) {\n var cursor1 = a.head;\n var cursor2 = b.head;\n\n while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {\n cursor1 = cursor1.next;\n cursor2 = cursor2.next;\n }\n\n return cursor1 === null && cursor2 === null;\n}\n\nfunction compareDeclarations(declarations1, declarations2) {\n var result = {\n eq: [],\n ne1: [],\n ne2: [],\n ne2overrided: []\n };\n\n var fingerprints = Object.create(null);\n var declarations2hash = Object.create(null);\n\n for (var cursor = declarations2.head; cursor; cursor = cursor.next) {\n declarations2hash[cursor.data.id] = true;\n }\n\n for (var cursor = declarations1.head; cursor; cursor = cursor.next) {\n var data = cursor.data;\n\n if (data.fingerprint) {\n fingerprints[data.fingerprint] = data.important;\n }\n\n if (declarations2hash[data.id]) {\n declarations2hash[data.id] = false;\n result.eq.push(data);\n } else {\n result.ne1.push(data);\n }\n }\n\n for (var cursor = declarations2.head; cursor; cursor = cursor.next) {\n var data = cursor.data;\n\n if (declarations2hash[data.id]) {\n // if declarations1 has overriding declaration, this is not a difference\n // but take in account !important - prev should be equal or greater than follow\n if (hasOwnProperty.call(fingerprints, data.fingerprint) &&\n Number(fingerprints[data.fingerprint]) >= Number(data.important)) {\n result.ne2overrided.push(data);\n } else {\n result.ne2.push(data);\n }\n }\n }\n\n return result;\n}\n\nfunction addSelectors(dest, source) {\n source.each(function(sourceData) {\n var newStr = sourceData.id;\n var cursor = dest.head;\n\n while (cursor) {\n var nextStr = cursor.data.id;\n\n if (nextStr === newStr) {\n return;\n }\n\n if (nextStr > newStr) {\n break;\n }\n\n cursor = cursor.next;\n }\n\n dest.insert(dest.createItem(sourceData), cursor);\n });\n\n return dest;\n}\n\n// check if simpleselectors has no equal specificity and element selector\nfunction hasSimilarSelectors(selectors1, selectors2) {\n var cursor1 = selectors1.head;\n\n while (cursor1 !== null) {\n var cursor2 = selectors2.head;\n\n while (cursor2 !== null) {\n if (cursor1.data.compareMarker === cursor2.data.compareMarker) {\n return true;\n }\n\n cursor2 = cursor2.next;\n }\n\n cursor1 = cursor1.next;\n }\n\n return false;\n}\n\n// test node can't to be skipped\nfunction unsafeToSkipNode(node) {\n switch (node.type) {\n case 'Rule':\n // unsafe skip ruleset with selector similarities\n return hasSimilarSelectors(node.prelude.children, this);\n\n case 'Atrule':\n // can skip at-rules with blocks\n if (node.block) {\n // unsafe skip at-rule if block contains something unsafe to skip\n return node.block.children.some(unsafeToSkipNode, this);\n }\n break;\n\n case 'Declaration':\n return false;\n }\n\n // unsafe by default\n return true;\n}\n\nmodule.exports = {\n isEqualSelectors: isEqualSelectors,\n isEqualDeclarations: isEqualDeclarations,\n compareDeclarations: compareDeclarations,\n addSelectors: addSelectors,\n hasSimilarSelectors: hasSimilarSelectors,\n unsafeToSkipNode: unsafeToSkipNode\n};\n","var walk = require('css-tree').walk;\nvar utils = require('./utils');\n\nfunction processRule(node, item, list) {\n var selectors = node.prelude.children;\n var declarations = node.block.children;\n\n list.prevUntil(item.prev, function(prev) {\n // skip non-ruleset node if safe\n if (prev.type !== 'Rule') {\n return utils.unsafeToSkipNode.call(selectors, prev);\n }\n\n var prevSelectors = prev.prelude.children;\n var prevDeclarations = prev.block.children;\n\n // try to join rulesets with equal pseudo signature\n if (node.pseudoSignature === prev.pseudoSignature) {\n // try to join by selectors\n if (utils.isEqualSelectors(prevSelectors, selectors)) {\n prevDeclarations.appendList(declarations);\n list.remove(item);\n return true;\n }\n\n // try to join by declarations\n if (utils.isEqualDeclarations(declarations, prevDeclarations)) {\n utils.addSelectors(prevSelectors, selectors);\n list.remove(item);\n return true;\n }\n }\n\n // go to prev ruleset if has no selector similarities\n return utils.hasSimilarSelectors(selectors, prevSelectors);\n });\n}\n\n// NOTE: direction should be left to right, since rulesets merge to left\n// ruleset. When direction right to left unmerged rulesets may prevent lookup\n// TODO: remove initial merge\nmodule.exports = function initialMergeRule(ast) {\n walk(ast, {\n visit: 'Rule',\n enter: processRule\n });\n};\n","var List = require('css-tree').List;\nvar walk = require('css-tree').walk;\n\nfunction processRule(node, item, list) {\n var selectors = node.prelude.children;\n\n // generate new rule sets:\n // .a, .b { color: red; }\n // ->\n // .a { color: red; }\n // .b { color: red; }\n\n // while there are more than 1 simple selector split for rulesets\n while (selectors.head !== selectors.tail) {\n var newSelectors = new List();\n newSelectors.insert(selectors.remove(selectors.head));\n\n list.insert(list.createItem({\n type: 'Rule',\n loc: node.loc,\n prelude: {\n type: 'SelectorList',\n loc: node.prelude.loc,\n children: newSelectors\n },\n block: {\n type: 'Block',\n loc: node.block.loc,\n children: node.block.children.copy()\n },\n pseudoSignature: node.pseudoSignature\n }), item);\n }\n}\n\nmodule.exports = function disjoinRule(ast) {\n walk(ast, {\n visit: 'Rule',\n reverse: true,\n enter: processRule\n });\n};\n","var List = require('css-tree').List;\nvar generate = require('css-tree').generate;\nvar walk = require('css-tree').walk;\n\nvar REPLACE = 1;\nvar REMOVE = 2;\nvar TOP = 0;\nvar RIGHT = 1;\nvar BOTTOM = 2;\nvar LEFT = 3;\nvar SIDES = ['top', 'right', 'bottom', 'left'];\nvar SIDE = {\n 'margin-top': 'top',\n 'margin-right': 'right',\n 'margin-bottom': 'bottom',\n 'margin-left': 'left',\n\n 'padding-top': 'top',\n 'padding-right': 'right',\n 'padding-bottom': 'bottom',\n 'padding-left': 'left',\n\n 'border-top-color': 'top',\n 'border-right-color': 'right',\n 'border-bottom-color': 'bottom',\n 'border-left-color': 'left',\n 'border-top-width': 'top',\n 'border-right-width': 'right',\n 'border-bottom-width': 'bottom',\n 'border-left-width': 'left',\n 'border-top-style': 'top',\n 'border-right-style': 'right',\n 'border-bottom-style': 'bottom',\n 'border-left-style': 'left'\n};\nvar MAIN_PROPERTY = {\n 'margin': 'margin',\n 'margin-top': 'margin',\n 'margin-right': 'margin',\n 'margin-bottom': 'margin',\n 'margin-left': 'margin',\n\n 'padding': 'padding',\n 'padding-top': 'padding',\n 'padding-right': 'padding',\n 'padding-bottom': 'padding',\n 'padding-left': 'padding',\n\n 'border-color': 'border-color',\n 'border-top-color': 'border-color',\n 'border-right-color': 'border-color',\n 'border-bottom-color': 'border-color',\n 'border-left-color': 'border-color',\n 'border-width': 'border-width',\n 'border-top-width': 'border-width',\n 'border-right-width': 'border-width',\n 'border-bottom-width': 'border-width',\n 'border-left-width': 'border-width',\n 'border-style': 'border-style',\n 'border-top-style': 'border-style',\n 'border-right-style': 'border-style',\n 'border-bottom-style': 'border-style',\n 'border-left-style': 'border-style'\n};\n\nfunction TRBL(name) {\n this.name = name;\n this.loc = null;\n this.iehack = undefined;\n this.sides = {\n 'top': null,\n 'right': null,\n 'bottom': null,\n 'left': null\n };\n}\n\nTRBL.prototype.getValueSequence = function(declaration, count) {\n var values = [];\n var iehack = '';\n var hasBadValues = declaration.value.children.some(function(child) {\n var special = false;\n\n switch (child.type) {\n case 'Identifier':\n switch (child.name) {\n case '\\\\0':\n case '\\\\9':\n iehack = child.name;\n return;\n\n case 'inherit':\n case 'initial':\n case 'unset':\n case 'revert':\n special = child.name;\n break;\n }\n break;\n\n case 'Dimension':\n switch (child.unit) {\n // is not supported until IE11\n case 'rem':\n\n // v* units is too buggy across browsers and better\n // don't merge values with those units\n case 'vw':\n case 'vh':\n case 'vmin':\n case 'vmax':\n case 'vm': // IE9 supporting \"vm\" instead of \"vmin\".\n special = child.unit;\n break;\n }\n break;\n\n case 'HexColor': // color\n case 'Number':\n case 'Percentage':\n break;\n\n case 'Function':\n special = child.name;\n break;\n\n case 'WhiteSpace':\n return false; // ignore space\n\n default:\n return true; // bad value\n }\n\n values.push({\n node: child,\n special: special,\n important: declaration.important\n });\n });\n\n if (hasBadValues || values.length > count) {\n return false;\n }\n\n if (typeof this.iehack === 'string' && this.iehack !== iehack) {\n return false;\n }\n\n this.iehack = iehack; // move outside\n\n return values;\n};\n\nTRBL.prototype.canOverride = function(side, value) {\n var currentValue = this.sides[side];\n\n return !currentValue || (value.important && !currentValue.important);\n};\n\nTRBL.prototype.add = function(name, declaration) {\n function attemptToAdd() {\n var sides = this.sides;\n var side = SIDE[name];\n\n if (side) {\n if (side in sides === false) {\n return false;\n }\n\n var values = this.getValueSequence(declaration, 1);\n\n if (!values || !values.length) {\n return false;\n }\n\n // can mix only if specials are equal\n for (var key in sides) {\n if (sides[key] !== null && sides[key].special !== values[0].special) {\n return false;\n }\n }\n\n if (!this.canOverride(side, values[0])) {\n return true;\n }\n\n sides[side] = values[0];\n return true;\n } else if (name === this.name) {\n var values = this.getValueSequence(declaration, 4);\n\n if (!values || !values.length) {\n return false;\n }\n\n switch (values.length) {\n case 1:\n values[RIGHT] = values[TOP];\n values[BOTTOM] = values[TOP];\n values[LEFT] = values[TOP];\n break;\n\n case 2:\n values[BOTTOM] = values[TOP];\n values[LEFT] = values[RIGHT];\n break;\n\n case 3:\n values[LEFT] = values[RIGHT];\n break;\n }\n\n // can mix only if specials are equal\n for (var i = 0; i < 4; i++) {\n for (var key in sides) {\n if (sides[key] !== null && sides[key].special !== values[i].special) {\n return false;\n }\n }\n }\n\n for (var i = 0; i < 4; i++) {\n if (this.canOverride(SIDES[i], values[i])) {\n sides[SIDES[i]] = values[i];\n }\n }\n\n return true;\n }\n }\n\n if (!attemptToAdd.call(this)) {\n return false;\n }\n\n // TODO: use it when we can refer to several points in source\n // if (this.loc) {\n // this.loc = {\n // primary: this.loc,\n // merged: declaration.loc\n // };\n // } else {\n // this.loc = declaration.loc;\n // }\n if (!this.loc) {\n this.loc = declaration.loc;\n }\n\n return true;\n};\n\nTRBL.prototype.isOkToMinimize = function() {\n var top = this.sides.top;\n var right = this.sides.right;\n var bottom = this.sides.bottom;\n var left = this.sides.left;\n\n if (top && right && bottom && left) {\n var important =\n top.important +\n right.important +\n bottom.important +\n left.important;\n\n return important === 0 || important === 4;\n }\n\n return false;\n};\n\nTRBL.prototype.getValue = function() {\n var result = new List();\n var sides = this.sides;\n var values = [\n sides.top,\n sides.right,\n sides.bottom,\n sides.left\n ];\n var stringValues = [\n generate(sides.top.node),\n generate(sides.right.node),\n generate(sides.bottom.node),\n generate(sides.left.node)\n ];\n\n if (stringValues[LEFT] === stringValues[RIGHT]) {\n values.pop();\n if (stringValues[BOTTOM] === stringValues[TOP]) {\n values.pop();\n if (stringValues[RIGHT] === stringValues[TOP]) {\n values.pop();\n }\n }\n }\n\n for (var i = 0; i < values.length; i++) {\n if (i) {\n result.appendData({ type: 'WhiteSpace', value: ' ' });\n }\n\n result.appendData(values[i].node);\n }\n\n if (this.iehack) {\n result.appendData({ type: 'WhiteSpace', value: ' ' });\n result.appendData({\n type: 'Identifier',\n loc: null,\n name: this.iehack\n });\n }\n\n return {\n type: 'Value',\n loc: null,\n children: result\n };\n};\n\nTRBL.prototype.getDeclaration = function() {\n return {\n type: 'Declaration',\n loc: this.loc,\n important: this.sides.top.important,\n property: this.name,\n value: this.getValue()\n };\n};\n\nfunction processRule(rule, shorts, shortDeclarations, lastShortSelector) {\n var declarations = rule.block.children;\n var selector = rule.prelude.children.first().id;\n\n rule.block.children.eachRight(function(declaration, item) {\n var property = declaration.property;\n\n if (!MAIN_PROPERTY.hasOwnProperty(property)) {\n return;\n }\n\n var key = MAIN_PROPERTY[property];\n var shorthand;\n var operation;\n\n if (!lastShortSelector || selector === lastShortSelector) {\n if (key in shorts) {\n operation = REMOVE;\n shorthand = shorts[key];\n }\n }\n\n if (!shorthand || !shorthand.add(property, declaration)) {\n operation = REPLACE;\n shorthand = new TRBL(key);\n\n // if can't parse value ignore it and break shorthand children\n if (!shorthand.add(property, declaration)) {\n lastShortSelector = null;\n return;\n }\n }\n\n shorts[key] = shorthand;\n shortDeclarations.push({\n operation: operation,\n block: declarations,\n item: item,\n shorthand: shorthand\n });\n\n lastShortSelector = selector;\n });\n\n return lastShortSelector;\n}\n\nfunction processShorthands(shortDeclarations, markDeclaration) {\n shortDeclarations.forEach(function(item) {\n var shorthand = item.shorthand;\n\n if (!shorthand.isOkToMinimize()) {\n return;\n }\n\n if (item.operation === REPLACE) {\n item.item.data = markDeclaration(shorthand.getDeclaration());\n } else {\n item.block.remove(item.item);\n }\n });\n}\n\nmodule.exports = function restructBlock(ast, indexer) {\n var stylesheetMap = {};\n var shortDeclarations = [];\n\n walk(ast, {\n visit: 'Rule',\n reverse: true,\n enter: function(node) {\n var stylesheet = this.block || this.stylesheet;\n var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;\n var ruleMap;\n var shorts;\n\n if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {\n ruleMap = {\n lastShortSelector: null\n };\n stylesheetMap[stylesheet.id] = ruleMap;\n } else {\n ruleMap = stylesheetMap[stylesheet.id];\n }\n\n if (ruleMap.hasOwnProperty(ruleId)) {\n shorts = ruleMap[ruleId];\n } else {\n shorts = {};\n ruleMap[ruleId] = shorts;\n }\n\n ruleMap.lastShortSelector = processRule.call(this, node, shorts, shortDeclarations, ruleMap.lastShortSelector);\n }\n });\n\n processShorthands(shortDeclarations, indexer.declaration);\n};\n","var resolveProperty = require('css-tree').property;\nvar resolveKeyword = require('css-tree').keyword;\nvar walk = require('css-tree').walk;\nvar generate = require('css-tree').generate;\nvar fingerprintId = 1;\nvar dontRestructure = {\n 'src': 1 // https://github.com/afelix/csso/issues/50\n};\n\nvar DONT_MIX_VALUE = {\n // https://developer.mozilla.org/en-US/docs/Web/CSS/display#Browser_compatibility\n 'display': /table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,\n // https://developer.mozilla.org/en/docs/Web/CSS/text-align\n 'text-align': /^(start|end|match-parent|justify-all)$/i\n};\n\nvar CURSOR_SAFE_VALUE = [\n 'auto', 'crosshair', 'default', 'move', 'text', 'wait', 'help',\n 'n-resize', 'e-resize', 's-resize', 'w-resize',\n 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize',\n 'pointer', 'progress', 'not-allowed', 'no-drop', 'vertical-text', 'all-scroll',\n 'col-resize', 'row-resize'\n];\n\nvar POSITION_SAFE_VALUE = [\n 'static', 'relative', 'absolute', 'fixed'\n];\n\nvar NEEDLESS_TABLE = {\n 'border-width': ['border'],\n 'border-style': ['border'],\n 'border-color': ['border'],\n 'border-top': ['border'],\n 'border-right': ['border'],\n 'border-bottom': ['border'],\n 'border-left': ['border'],\n 'border-top-width': ['border-top', 'border-width', 'border'],\n 'border-right-width': ['border-right', 'border-width', 'border'],\n 'border-bottom-width': ['border-bottom', 'border-width', 'border'],\n 'border-left-width': ['border-left', 'border-width', 'border'],\n 'border-top-style': ['border-top', 'border-style', 'border'],\n 'border-right-style': ['border-right', 'border-style', 'border'],\n 'border-bottom-style': ['border-bottom', 'border-style', 'border'],\n 'border-left-style': ['border-left', 'border-style', 'border'],\n 'border-top-color': ['border-top', 'border-color', 'border'],\n 'border-right-color': ['border-right', 'border-color', 'border'],\n 'border-bottom-color': ['border-bottom', 'border-color', 'border'],\n 'border-left-color': ['border-left', 'border-color', 'border'],\n 'margin-top': ['margin'],\n 'margin-right': ['margin'],\n 'margin-bottom': ['margin'],\n 'margin-left': ['margin'],\n 'padding-top': ['padding'],\n 'padding-right': ['padding'],\n 'padding-bottom': ['padding'],\n 'padding-left': ['padding'],\n 'font-style': ['font'],\n 'font-variant': ['font'],\n 'font-weight': ['font'],\n 'font-size': ['font'],\n 'font-family': ['font'],\n 'list-style-type': ['list-style'],\n 'list-style-position': ['list-style'],\n 'list-style-image': ['list-style']\n};\n\nfunction getPropertyFingerprint(propertyName, declaration, fingerprints) {\n var realName = resolveProperty(propertyName).basename;\n\n if (realName === 'background') {\n return propertyName + ':' + generate(declaration.value);\n }\n\n var declarationId = declaration.id;\n var fingerprint = fingerprints[declarationId];\n\n if (!fingerprint) {\n switch (declaration.value.type) {\n case 'Value':\n var vendorId = '';\n var iehack = '';\n var special = {};\n var raw = false;\n\n declaration.value.children.each(function walk(node) {\n switch (node.type) {\n case 'Value':\n case 'Brackets':\n case 'Parentheses':\n node.children.each(walk);\n break;\n\n case 'Raw':\n raw = true;\n break;\n\n case 'Identifier':\n var name = node.name;\n\n if (!vendorId) {\n vendorId = resolveKeyword(name).vendor;\n }\n\n if (/\\\\[09]/.test(name)) {\n iehack = RegExp.lastMatch;\n }\n\n if (realName === 'cursor') {\n if (CURSOR_SAFE_VALUE.indexOf(name) === -1) {\n special[name] = true;\n }\n } else if (realName === 'position') {\n if (POSITION_SAFE_VALUE.indexOf(name) === -1) {\n special[name] = true;\n }\n } else if (DONT_MIX_VALUE.hasOwnProperty(realName)) {\n if (DONT_MIX_VALUE[realName].test(name)) {\n special[name] = true;\n }\n }\n\n break;\n\n case 'Function':\n var name = node.name;\n\n if (!vendorId) {\n vendorId = resolveKeyword(name).vendor;\n }\n\n if (name === 'rect') {\n // there are 2 forms of rect:\n // rect(<top>, <right>, <bottom>, <left>) - standart\n // rect(<top> <right> <bottom> <left>) backwards compatible syntax\n // only the same form values can be merged\n var hasComma = node.children.some(function(node) {\n return node.type === 'Operator' && node.value === ',';\n });\n if (!hasComma) {\n name = 'rect-backward';\n }\n }\n\n special[name + '()'] = true;\n\n // check nested tokens too\n node.children.each(walk);\n\n break;\n\n case 'Dimension':\n var unit = node.unit;\n\n switch (unit) {\n // is not supported until IE11\n case 'rem':\n\n // v* units is too buggy across browsers and better\n // don't merge values with those units\n case 'vw':\n case 'vh':\n case 'vmin':\n case 'vmax':\n case 'vm': // IE9 supporting \"vm\" instead of \"vmin\".\n special[unit] = true;\n break;\n }\n break;\n }\n });\n\n fingerprint = raw\n ? '!' + fingerprintId++\n : '!' + Object.keys(special).sort() + '|' + iehack + vendorId;\n break;\n\n case 'Raw':\n fingerprint = '!' + declaration.value.value;\n break;\n\n default:\n fingerprint = generate(declaration.value);\n }\n\n fingerprints[declarationId] = fingerprint;\n }\n\n return propertyName + fingerprint;\n}\n\nfunction needless(props, declaration, fingerprints) {\n var property = resolveProperty(declaration.property);\n\n if (NEEDLESS_TABLE.hasOwnProperty(property.basename)) {\n var table = NEEDLESS_TABLE[property.basename];\n\n for (var i = 0; i < table.length; i++) {\n var ppre = getPropertyFingerprint(property.prefix + table[i], declaration, fingerprints);\n var prev = props.hasOwnProperty(ppre) ? props[ppre] : null;\n\n if (prev && (!declaration.important || prev.item.data.important)) {\n return prev;\n }\n }\n }\n}\n\nfunction processRule(rule, item, list, props, fingerprints) {\n var declarations = rule.block.children;\n\n declarations.eachRight(function(declaration, declarationItem) {\n var property = declaration.property;\n var fingerprint = getPropertyFingerprint(property, declaration, fingerprints);\n var prev = props[fingerprint];\n\n if (prev && !dontRestructure.hasOwnProperty(property)) {\n if (declaration.important && !prev.item.data.important) {\n props[fingerprint] = {\n block: declarations,\n item: declarationItem\n };\n\n prev.block.remove(prev.item);\n\n // TODO: use it when we can refer to several points in source\n // declaration.loc = {\n // primary: declaration.loc,\n // merged: prev.item.data.loc\n // };\n } else {\n declarations.remove(declarationItem);\n\n // TODO: use it when we can refer to several points in source\n // prev.item.data.loc = {\n // primary: prev.item.data.loc,\n // merged: declaration.loc\n // };\n }\n } else {\n var prev = needless(props, declaration, fingerprints);\n\n if (prev) {\n declarations.remove(declarationItem);\n\n // TODO: use it when we can refer to several points in source\n // prev.item.data.loc = {\n // primary: prev.item.data.loc,\n // merged: declaration.loc\n // };\n } else {\n declaration.fingerprint = fingerprint;\n\n props[fingerprint] = {\n block: declarations,\n item: declarationItem\n };\n }\n }\n });\n\n if (declarations.isEmpty()) {\n list.remove(item);\n }\n}\n\nmodule.exports = function restructBlock(ast) {\n var stylesheetMap = {};\n var fingerprints = Object.create(null);\n\n walk(ast, {\n visit: 'Rule',\n reverse: true,\n enter: function(node, item, list) {\n var stylesheet = this.block || this.stylesheet;\n var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;\n var ruleMap;\n var props;\n\n if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {\n ruleMap = {};\n stylesheetMap[stylesheet.id] = ruleMap;\n } else {\n ruleMap = stylesheetMap[stylesheet.id];\n }\n\n if (ruleMap.hasOwnProperty(ruleId)) {\n props = ruleMap[ruleId];\n } else {\n props = {};\n ruleMap[ruleId] = props;\n }\n\n processRule.call(this, node, item, list, props, fingerprints);\n }\n });\n};\n","var walk = require('css-tree').walk;\nvar utils = require('./utils');\n\n/*\n At this step all rules has single simple selector. We try to join by equal\n declaration blocks to first rule, e.g.\n\n .a { color: red }\n b { ... }\n .b { color: red }\n ->\n .a, .b { color: red }\n b { ... }\n*/\n\nfunction processRule(node, item, list) {\n var selectors = node.prelude.children;\n var declarations = node.block.children;\n var nodeCompareMarker = selectors.first().compareMarker;\n var skippedCompareMarkers = {};\n\n list.nextUntil(item.next, function(next, nextItem) {\n // skip non-ruleset node if safe\n if (next.type !== 'Rule') {\n return utils.unsafeToSkipNode.call(selectors, next);\n }\n\n if (node.pseudoSignature !== next.pseudoSignature) {\n return true;\n }\n\n var nextFirstSelector = next.prelude.children.head;\n var nextDeclarations = next.block.children;\n var nextCompareMarker = nextFirstSelector.data.compareMarker;\n\n // if next ruleset has same marked as one of skipped then stop joining\n if (nextCompareMarker in skippedCompareMarkers) {\n return true;\n }\n\n // try to join by selectors\n if (selectors.head === selectors.tail) {\n if (selectors.first().id === nextFirstSelector.data.id) {\n declarations.appendList(nextDeclarations);\n list.remove(nextItem);\n return;\n }\n }\n\n // try to join by properties\n if (utils.isEqualDeclarations(declarations, nextDeclarations)) {\n var nextStr = nextFirstSelector.data.id;\n\n selectors.some(function(data, item) {\n var curStr = data.id;\n\n if (nextStr < curStr) {\n selectors.insert(nextFirstSelector, item);\n return true;\n }\n\n if (!item.next) {\n selectors.insert(nextFirstSelector);\n return true;\n }\n });\n\n list.remove(nextItem);\n return;\n }\n\n // go to next ruleset if current one can be skipped (has no equal specificity nor element selector)\n if (nextCompareMarker === nodeCompareMarker) {\n return true;\n }\n\n skippedCompareMarkers[nextCompareMarker] = true;\n });\n}\n\nmodule.exports = function mergeRule(ast) {\n walk(ast, {\n visit: 'Rule',\n enter: processRule\n });\n};\n","var List = require('css-tree').List;\nvar walk = require('css-tree').walk;\nvar utils = require('./utils');\n\nfunction calcSelectorLength(list) {\n var length = 0;\n\n list.each(function(data) {\n length += data.id.length + 1;\n });\n\n return length - 1;\n}\n\nfunction calcDeclarationsLength(tokens) {\n var length = 0;\n\n for (var i = 0; i < tokens.length; i++) {\n length += tokens[i].length;\n }\n\n return (\n length + // declarations\n tokens.length - 1 // delimeters\n );\n}\n\nfunction processRule(node, item, list) {\n var avoidRulesMerge = this.block !== null ? this.block.avoidRulesMerge : false;\n var selectors = node.prelude.children;\n var block = node.block;\n var disallowDownMarkers = Object.create(null);\n var allowMergeUp = true;\n var allowMergeDown = true;\n\n list.prevUntil(item.prev, function(prev, prevItem) {\n // skip non-ruleset node if safe\n if (prev.type !== 'Rule') {\n return utils.unsafeToSkipNode.call(selectors, prev);\n }\n\n var prevSelectors = prev.prelude.children;\n var prevBlock = prev.block;\n\n if (node.pseudoSignature !== prev.pseudoSignature) {\n return true;\n }\n\n allowMergeDown = !prevSelectors.some(function(selector) {\n return selector.compareMarker in disallowDownMarkers;\n });\n\n // try prev ruleset if simpleselectors has no equal specifity and element selector\n if (!allowMergeDown && !allowMergeUp) {\n return true;\n }\n\n // try to join by selectors\n if (allowMergeUp && utils.isEqualSelectors(prevSelectors, selectors)) {\n prevBlock.children.appendList(block.children);\n list.remove(item);\n return true;\n }\n\n // try to join by properties\n var diff = utils.compareDeclarations(block.children, prevBlock.children);\n\n // console.log(diff.eq, diff.ne1, diff.ne2);\n\n if (diff.eq.length) {\n if (!diff.ne1.length && !diff.ne2.length) {\n // equal blocks\n if (allowMergeDown) {\n utils.addSelectors(selectors, prevSelectors);\n list.remove(prevItem);\n }\n\n return true;\n } else if (!avoidRulesMerge) { /* probably we don't need to prevent those merges for @keyframes\n TODO: need to be checked */\n\n if (diff.ne1.length && !diff.ne2.length) {\n // prevBlock is subset block\n var selectorLength = calcSelectorLength(selectors);\n var blockLength = calcDeclarationsLength(diff.eq); // declarations length\n\n if (allowMergeUp && selectorLength < blockLength) {\n utils.addSelectors(prevSelectors, selectors);\n block.children = new List().fromArray(diff.ne1);\n }\n } else if (!diff.ne1.length && diff.ne2.length) {\n // node is subset of prevBlock\n var selectorLength = calcSelectorLength(prevSelectors);\n var blockLength = calcDeclarationsLength(diff.eq); // declarations length\n\n if (allowMergeDown && selectorLength < blockLength) {\n utils.addSelectors(selectors, prevSelectors);\n prevBlock.children = new List().fromArray(diff.ne2);\n }\n } else {\n // diff.ne1.length && diff.ne2.length\n // extract equal block\n var newSelector = {\n type: 'SelectorList',\n loc: null,\n children: utils.addSelectors(prevSelectors.copy(), selectors)\n };\n var newBlockLength = calcSelectorLength(newSelector.children) + 2; // selectors length + curly braces length\n var blockLength = calcDeclarationsLength(diff.eq); // declarations length\n\n // create new ruleset if declarations length greater than\n // ruleset description overhead\n if (allowMergeDown && blockLength >= newBlockLength) {\n var newRule = {\n type: 'Rule',\n loc: null,\n prelude: newSelector,\n block: {\n type: 'Block',\n loc: null,\n children: new List().fromArray(diff.eq)\n },\n pseudoSignature: node.pseudoSignature\n };\n\n block.children = new List().fromArray(diff.ne1);\n prevBlock.children = new List().fromArray(diff.ne2.concat(diff.ne2overrided));\n list.insert(list.createItem(newRule), prevItem);\n return true;\n }\n }\n }\n }\n\n if (allowMergeUp) {\n // TODO: disallow up merge only if any property interception only (i.e. diff.ne2overrided.length > 0);\n // await property families to find property interception correctly\n allowMergeUp = !prevSelectors.some(function(prevSelector) {\n return selectors.some(function(selector) {\n return selector.compareMarker === prevSelector.compareMarker;\n });\n });\n }\n\n prevSelectors.each(function(data) {\n disallowDownMarkers[data.compareMarker] = true;\n });\n });\n}\n\nmodule.exports = function restructRule(ast) {\n walk(ast, {\n visit: 'Rule',\n reverse: true,\n enter: processRule\n });\n};\n","var List = require('css-tree').List;\nvar clone = require('css-tree').clone;\nvar usageUtils = require('./usage');\nvar clean = require('./clean');\nvar replace = require('./replace');\nvar restructure = require('./restructure');\nvar walk = require('css-tree').walk;\n\nfunction readChunk(children, specialComments) {\n var buffer = new List();\n var nonSpaceTokenInBuffer = false;\n var protectedComment;\n\n children.nextUntil(children.head, function(node, item, list) {\n if (node.type === 'Comment') {\n if (!specialComments || node.value.charAt(0) !== '!') {\n list.remove(item);\n return;\n }\n\n if (nonSpaceTokenInBuffer || protectedComment) {\n return true;\n }\n\n list.remove(item);\n protectedComment = node;\n return;\n }\n\n if (node.type !== 'WhiteSpace') {\n nonSpaceTokenInBuffer = true;\n }\n\n buffer.insert(list.remove(item));\n });\n\n return {\n comment: protectedComment,\n stylesheet: {\n type: 'StyleSheet',\n loc: null,\n children: buffer\n }\n };\n}\n\nfunction compressChunk(ast, firstAtrulesAllowed, num, options) {\n options.logger('Compress block #' + num, null, true);\n\n var seed = 1;\n\n if (ast.type === 'StyleSheet') {\n ast.firstAtrulesAllowed = firstAtrulesAllowed;\n ast.id = seed++;\n }\n\n walk(ast, {\n visit: 'Atrule',\n enter: function markScopes(node) {\n if (node.block !== null) {\n node.block.id = seed++;\n }\n }\n });\n options.logger('init', ast);\n\n // remove redundant\n clean(ast, options);\n options.logger('clean', ast);\n\n // replace nodes for shortened forms\n replace(ast, options);\n options.logger('replace', ast);\n\n // structure optimisations\n if (options.restructuring) {\n restructure(ast, options);\n }\n\n return ast;\n}\n\nfunction getCommentsOption(options) {\n var comments = 'comments' in options ? options.comments : 'exclamation';\n\n if (typeof comments === 'boolean') {\n comments = comments ? 'exclamation' : false;\n } else if (comments !== 'exclamation' && comments !== 'first-exclamation') {\n comments = false;\n }\n\n return comments;\n}\n\nfunction getRestructureOption(options) {\n return 'restructure' in options ? options.restructure :\n 'restructuring' in options ? options.restructuring :\n true;\n}\n\nfunction wrapBlock(block) {\n return new List().appendData({\n type: 'Rule',\n loc: null,\n prelude: {\n type: 'SelectorList',\n loc: null,\n children: new List().appendData({\n type: 'Selector',\n loc: null,\n children: new List().appendData({\n type: 'TypeSelector',\n loc: null,\n name: 'x'\n })\n })\n },\n block: block\n });\n}\n\nmodule.exports = function compress(ast, options) {\n ast = ast || { type: 'StyleSheet', loc: null, children: new List() };\n options = options || {};\n\n var compressOptions = {\n logger: typeof options.logger === 'function' ? options.logger : function() {},\n restructuring: getRestructureOption(options),\n forceMediaMerge: Boolean(options.forceMediaMerge),\n usage: options.usage ? usageUtils.buildIndex(options.usage) : false\n };\n var specialComments = getCommentsOption(options);\n var firstAtrulesAllowed = true;\n var input;\n var output = new List();\n var chunk;\n var chunkNum = 1;\n var chunkChildren;\n\n if (options.clone) {\n ast = clone(ast);\n }\n\n if (ast.type === 'StyleSheet') {\n input = ast.children;\n ast.children = output;\n } else {\n input = wrapBlock(ast);\n }\n\n do {\n chunk = readChunk(input, Boolean(specialComments));\n compressChunk(chunk.stylesheet, firstAtrulesAllowed, chunkNum++, compressOptions);\n chunkChildren = chunk.stylesheet.children;\n\n if (chunk.comment) {\n // add \\n before comment if there is another content in output\n if (!output.isEmpty()) {\n output.insert(List.createItem({\n type: 'Raw',\n value: '\\n'\n }));\n }\n\n output.insert(List.createItem(chunk.comment));\n\n // add \\n after comment if chunk is not empty\n if (!chunkChildren.isEmpty()) {\n output.insert(List.createItem({\n type: 'Raw',\n value: '\\n'\n }));\n }\n }\n\n if (firstAtrulesAllowed && !chunkChildren.isEmpty()) {\n var lastRule = chunkChildren.last();\n\n if (lastRule.type !== 'Atrule' ||\n (lastRule.name !== 'import' && lastRule.name !== 'charset')) {\n firstAtrulesAllowed = false;\n }\n }\n\n if (specialComments !== 'exclamation') {\n specialComments = false;\n }\n\n output.appendList(chunkChildren);\n } while (!input.isEmpty());\n\n return {\n ast: ast\n };\n};\n","var csstree = require('css-tree');\nvar parse = csstree.parse;\nvar compress = require('./compress');\nvar generate = csstree.generate;\n\nfunction debugOutput(name, options, startTime, data) {\n if (options.debug) {\n console.error('## ' + name + ' done in %d ms\\n', Date.now() - startTime);\n }\n\n return data;\n}\n\nfunction createDefaultLogger(level) {\n var lastDebug;\n\n return function logger(title, ast) {\n var line = title;\n\n if (ast) {\n line = '[' + ((Date.now() - lastDebug) / 1000).toFixed(3) + 's] ' + line;\n }\n\n if (level > 1 && ast) {\n var css = generate(ast);\n\n // when level 2, limit css to 256 symbols\n if (level === 2 && css.length > 256) {\n css = css.substr(0, 256) + '...';\n }\n\n line += '\\n ' + css + '\\n';\n }\n\n console.error(line);\n lastDebug = Date.now();\n };\n}\n\nfunction copy(obj) {\n var result = {};\n\n for (var key in obj) {\n result[key] = obj[key];\n }\n\n return result;\n}\n\nfunction buildCompressOptions(options) {\n options = copy(options);\n\n if (typeof options.logger !== 'function' && options.debug) {\n options.logger = createDefaultLogger(options.debug);\n }\n\n return options;\n}\n\nfunction runHandler(ast, options, handlers) {\n if (!Array.isArray(handlers)) {\n handlers = [handlers];\n }\n\n handlers.forEach(function(fn) {\n fn(ast, options);\n });\n}\n\nfunction minify(context, source, options) {\n options = options || {};\n\n var filename = options.filename || '<unknown>';\n var result;\n\n // parse\n var ast = debugOutput('parsing', options, Date.now(),\n parse(source, {\n context: context,\n filename: filename,\n positions: Boolean(options.sourceMap)\n })\n );\n\n // before compress handlers\n if (options.beforeCompress) {\n debugOutput('beforeCompress', options, Date.now(),\n runHandler(ast, options, options.beforeCompress)\n );\n }\n\n // compress\n var compressResult = debugOutput('compress', options, Date.now(),\n compress(ast, buildCompressOptions(options))\n );\n\n // after compress handlers\n if (options.afterCompress) {\n debugOutput('afterCompress', options, Date.now(),\n runHandler(compressResult, options, options.afterCompress)\n );\n }\n\n // generate\n if (options.sourceMap) {\n result = debugOutput('generate(sourceMap: true)', options, Date.now(), (function() {\n var tmp = generate(compressResult.ast, { sourceMap: true });\n tmp.map._file = filename; // since other tools can relay on file in source map transform chain\n tmp.map.setSourceContent(filename, source);\n return tmp;\n })());\n } else {\n result = debugOutput('generate', options, Date.now(), {\n css: generate(compressResult.ast),\n map: null\n });\n }\n\n return result;\n}\n\nfunction minifyStylesheet(source, options) {\n return minify('stylesheet', source, options);\n}\n\nfunction minifyBlock(source, options) {\n return minify('declarationList', source, options);\n}\n\nmodule.exports = {\n version: require('../package.json').version,\n\n // main methods\n minify: minifyStylesheet,\n minifyBlock: minifyBlock,\n\n // compress an AST\n compress: compress,\n\n // css syntax parser/walkers/generator/etc\n syntax: csstree\n};\n","'use strict';\n\nexports.type = 'full';\n\nexports.active = true;\n\nexports.description = 'minifies styles and removes unused styles based on usage data';\n\nexports.params = {\n // ... CSSO options goes here\n\n // additional \n usage: {\n force: false, // force to use usage data even if it unsafe (document contains <script> or on* attributes)\n ids: true,\n classes: true,\n tags: true\n }\n};\n\nvar csso = require('csso');\n\n/**\n * Minifies styles (<style> element + style attribute) using CSSO\n *\n * @author strarsis <strarsis@gmail.com>\n */\nexports.fn = function(ast, options) {\n options = options || {};\n\n var minifyOptionsForStylesheet = cloneObject(options);\n var minifyOptionsForAttribute = cloneObject(options);\n var elems = findStyleElems(ast);\n\n minifyOptionsForStylesheet.usage = collectUsageData(ast, options);\n minifyOptionsForAttribute.usage = null;\n\n elems.forEach(function(elem) {\n if (elem.isElem('style')) {\n // <style> element\n var styleCss = elem.content[0].text || elem.content[0].cdata || [];\n var DATA = styleCss.indexOf('>') >= 0 || styleCss.indexOf('<') >= 0 ? 'cdata' : 'text';\n\n elem.content[0][DATA] = csso.minify(styleCss, minifyOptionsForStylesheet).css;\n } else {\n // style attribute\n var elemStyle = elem.attr('style').value;\n\n elem.attr('style').value = csso.minifyBlock(elemStyle, minifyOptionsForAttribute).css;\n }\n });\n\n return ast;\n};\n\nfunction cloneObject(obj) {\n var result = {};\n\n for (var key in obj) {\n result[key] = obj[key];\n }\n\n return result;\n}\n\nfunction findStyleElems(ast) {\n\n function walk(items, styles) {\n for (var i = 0; i < items.content.length; i++) {\n var item = items.content[i];\n\n // go deeper\n if (item.content) {\n walk(item, styles);\n }\n\n if (item.isElem('style') && !item.isEmpty()) {\n styles.push(item);\n } else if (item.isElem() && item.hasAttr('style')) {\n styles.push(item);\n }\n }\n\n return styles;\n }\n\n return walk(ast, []);\n}\n\nfunction shouldFilter(options, name) {\n if ('usage' in options === false) {\n return true;\n }\n\n if (options.usage && name in options.usage === false) {\n return true;\n }\n\n return Boolean(options.usage && options.usage[name]);\n}\n\nfunction collectUsageData(ast, options) {\n\n function walk(items, usageData) {\n for (var i = 0; i < items.content.length; i++) {\n var item = items.content[i];\n\n // go deeper\n if (item.content) {\n walk(item, usageData);\n }\n\n if (item.isElem('script')) {\n safe = false;\n }\n\n if (item.isElem()) {\n usageData.tags[item.elem] = true;\n\n if (item.hasAttr('id')) {\n usageData.ids[item.attr('id').value] = true;\n }\n\n if (item.hasAttr('class')) {\n item.attr('class').value.replace(/^\\s+|\\s+$/g, '').split(/\\s+/).forEach(function(className) {\n usageData.classes[className] = true;\n });\n }\n\n if (item.attrs && Object.keys(item.attrs).some(function(name) { return /^on/i.test(name); })) {\n safe = false;\n }\n }\n }\n\n return usageData;\n }\n\n var safe = true;\n var usageData = {};\n var hasData = false;\n var rawData = walk(ast, {\n ids: Object.create(null),\n classes: Object.create(null),\n tags: Object.create(null)\n });\n\n if (!safe && options.usage && options.usage.force) {\n safe = true;\n }\n\n for (var key in rawData) {\n if (shouldFilter(options, key)) {\n usageData[key] = Object.keys(rawData[key]);\n hasData = true;\n }\n }\n\n return safe && hasData ? usageData : null;\n}\n","/* jshint quotmark: false */\n'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'converts style to attributes';\n\nvar stylingProps = require('./_collections').attrsGroups.presentation,\n rEscape = '\\\\\\\\(?:[0-9a-f]{1,6}\\\\s?|\\\\r\\\\n|.)', // Like \\\" or \\2051. Code points consume one space.\n rAttr = '\\\\s*(' + g('[^:;\\\\\\\\]', rEscape) + '*?)\\\\s*', // attribute name like fill\n rSingleQuotes = \"'(?:[^'\\\\n\\\\r\\\\\\\\]|\" + rEscape + \")*?(?:'|$)\", // string in single quotes: 'smth'\n rQuotes = '\"(?:[^\"\\\\n\\\\r\\\\\\\\]|' + rEscape + ')*?(?:\"|$)', // string in double quotes: \"smth\"\n rQuotedString = new RegExp('^' + g(rSingleQuotes, rQuotes) + '$'),\n\n // Parentheses, E.g.: url(data:image/png;base64,iVBO...).\n // ':' and ';' inside of it should be threated as is. (Just like in strings.)\n rParenthesis = '\\\\(' + g('[^\\'\"()\\\\\\\\]+', rEscape, rSingleQuotes, rQuotes) + '*?' + '\\\\)',\n\n // The value. It can have strings and parentheses (see above). Fallbacks to anything in case of unexpected input.\n rValue = '\\\\s*(' + g('[^\\'\"();\\\\\\\\]+?', rEscape, rSingleQuotes, rQuotes, rParenthesis, '[^;]*?') + '*?' + ')',\n\n // End of declaration. Spaces outside of capturing groups help to do natural trimming.\n rDeclEnd = '\\\\s*(?:;\\\\s*|$)',\n\n // Final RegExp to parse CSS declarations.\n regDeclarationBlock = new RegExp(rAttr + ':' + rValue + rDeclEnd, 'ig'),\n\n // Comments expression. Honors escape sequences and strings.\n regStripComments = new RegExp(g(rEscape, rSingleQuotes, rQuotes, '/\\\\*[^]*?\\\\*/'), 'ig');\n\n/**\n * Convert style in attributes. Cleanups comments and illegal declarations (without colon) as a side effect.\n *\n * @example\n * <g style=\"fill:#000; color: #fff;\">\n * ⬇\n * <g fill=\"#000\" color=\"#fff\">\n *\n * @example\n * <g style=\"fill:#000; color: #fff; -webkit-blah: blah\">\n * ⬇\n * <g fill=\"#000\" color=\"#fff\" style=\"-webkit-blah: blah\">\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n /* jshint boss: true */\n\n if (item.elem && item.hasAttr('style')) {\n // ['opacity: 1', 'color: #000']\n var styleValue = item.attr('style').value,\n styles = [],\n attrs = {};\n\n // Strip CSS comments preserving escape sequences and strings.\n styleValue = styleValue.replace(regStripComments, function(match) {\n return match[0] == '/' ? '' :\n match[0] == '\\\\' && /[-g-z]/i.test(match[1]) ? match[1] : match;\n });\n\n regDeclarationBlock.lastIndex = 0;\n for (var rule; rule = regDeclarationBlock.exec(styleValue);) {\n styles.push([rule[1], rule[2]]);\n }\n\n if (styles.length) {\n\n styles = styles.filter(function(style) {\n if (style[0]) {\n var prop = style[0].toLowerCase(),\n val = style[1];\n\n if (rQuotedString.test(val)) {\n val = val.slice(1, -1);\n }\n\n if (stylingProps.indexOf(prop) > -1) {\n\n attrs[prop] = {\n name: prop,\n value: val,\n local: prop,\n prefix: ''\n };\n\n return false;\n }\n }\n\n return true;\n });\n\n Object.assign(item.attrs, attrs);\n\n if (styles.length) {\n item.attr('style').value = styles\n .map(function(declaration) { return declaration.join(':') })\n .join(';');\n } else {\n item.removeAttr('style');\n }\n\n }\n\n }\n\n};\n\nfunction g() {\n return '(?:' + Array.prototype.join.call(arguments, '|') + ')';\n}\n","'use strict';\n\nexports.type = 'full';\n\nexports.active = true;\n\nexports.description = 'removes unused IDs and minifies used';\n\nexports.params = {\n remove: true,\n minify: true,\n prefix: '',\n preserve: [],\n force: false\n};\n\nvar referencesProps = new Set(require('./_collections').referencesProps),\n regReferencesUrl = /\\burl\\((\"|')?#(.+?)\\1\\)/,\n regReferencesHref = /^#(.+?)$/,\n regReferencesBegin = /(\\w+)\\./,\n styleOrScript = ['style', 'script'],\n generateIDchars = [\n 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'\n ],\n maxIDindex = generateIDchars.length - 1;\n\n/**\n * Remove unused and minify used IDs\n * (only if there are no any <style> or <script>).\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n *\n * @author Kir Belevich\n */\nexports.fn = function(data, params) {\n var currentID,\n currentIDstring,\n IDs = new Map(),\n referencesIDs = new Map(),\n hasStyleOrScript = false,\n preserveIDs = new Set(Array.isArray(params.preserve) ? params.preserve : params.preserve ? [params.preserve] : []),\n idValuePrefix = '#',\n idValuePostfix = '.';\n\n /**\n * Bananas!\n *\n * @param {Array} items input items\n * @return {Array} output items\n */\n function monkeys(items) {\n for (var i = 0; i < items.content.length && !hasStyleOrScript; i++) {\n var item = items.content[i];\n\n // quit if <style> of <script> presents ('force' param prevents quitting)\n if (!params.force) {\n if (item.isElem(styleOrScript)) {\n hasStyleOrScript = true;\n continue;\n }\n // Don't remove IDs if the whole SVG consists only of defs.\n if (item.isElem('defs') && item.parentNode.isElem('svg')) {\n var hasDefsOnly = true;\n for (var j = i + 1; j < items.content.length; j++) {\n if (items.content[j].isElem()) {\n hasDefsOnly = false;\n break;\n }\n }\n if (hasDefsOnly) {\n break;\n }\n }\n }\n // …and don't remove any ID if yes\n if (item.isElem()) {\n item.eachAttr(function(attr) {\n var key, match;\n\n // save IDs\n if (attr.name === 'id') {\n key = attr.value;\n if (IDs.has(key)) {\n item.removeAttr('id'); // remove repeated id\n } else {\n IDs.set(key, item);\n }\n return;\n }\n // save references\n if (referencesProps.has(attr.name) && (match = attr.value.match(regReferencesUrl))) {\n key = match[2]; // url() reference\n } else if (\n attr.local === 'href' && (match = attr.value.match(regReferencesHref)) ||\n attr.name === 'begin' && (match = attr.value.match(regReferencesBegin))\n ) {\n key = match[1]; // href reference\n }\n if (key) {\n var ref = referencesIDs.get(key) || [];\n ref.push(attr);\n referencesIDs.set(key, ref);\n }\n });\n }\n // go deeper\n if (item.content) {\n monkeys(item);\n }\n }\n return items;\n }\n\n data = monkeys(data);\n\n if (hasStyleOrScript) {\n return data;\n }\n\n for (var ref of referencesIDs) {\n var key = ref[0];\n\n if (IDs.has(key)) {\n // replace referenced IDs with the minified ones\n if (params.minify && !preserveIDs.has(key)) {\n currentIDstring = getIDstring(currentID = generateID(currentID), params);\n IDs.get(key).attr('id').value = currentIDstring;\n\n for (var attr of ref[1]) {\n attr.value = attr.value.includes(idValuePrefix) ?\n attr.value.replace(idValuePrefix + key, idValuePrefix + currentIDstring) :\n attr.value.replace(key + idValuePostfix, currentIDstring + idValuePostfix);\n }\n }\n // don't remove referenced IDs\n IDs.delete(key);\n }\n }\n // remove non-referenced IDs attributes from elements\n if (params.remove) {\n for(var keyElem of IDs) {\n if (!preserveIDs.has(keyElem[0])) {\n keyElem[1].removeAttr('id');\n }\n }\n }\n return data;\n};\n\n/**\n * Generate unique minimal ID.\n *\n * @param {Array} [currentID] current ID\n * @return {Array} generated ID array\n */\nfunction generateID(currentID) {\n if (!currentID) return [0];\n\n currentID[currentID.length - 1]++;\n\n for(var i = currentID.length - 1; i > 0; i--) {\n if (currentID[i] > maxIDindex) {\n currentID[i] = 0;\n\n if (currentID[i - 1] !== undefined) {\n currentID[i - 1]++;\n }\n }\n }\n if (currentID[0] > maxIDindex) {\n currentID[0] = 0;\n currentID.unshift(0);\n }\n return currentID;\n}\n\n/**\n * Get string from generated ID array.\n *\n * @param {Array} arr input ID array\n * @return {String} output ID string\n */\nfunction getIDstring(arr, params) {\n var str = params.prefix;\n return str + arr.map(i => generateIDchars[i]).join('');\n}\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes elements in <defs> without id';\n\nvar nonRendering = require('./_collections').elemsGroups.nonRendering;\n\n/**\n * Removes content of defs and properties that aren't rendered directly without ids.\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Lev Solntsev\n */\nexports.fn = function(item) {\n\n if (item.isElem('defs')) {\n\n if (item.content) {\n item.content = getUsefulItems(item, []);\n }\n \n if (item.isEmpty()) return false;\n\n } else if (item.isElem(nonRendering) && !item.hasAttr('id')) {\n\n return false;\n\n }\n\n};\n\nfunction getUsefulItems(item, usefulItems) {\n\n item.content.forEach(function(child) {\n if (child.hasAttr('id') || child.isElem('style')) {\n\n usefulItems.push(child);\n child.parentNode = item;\n\n } else if (!child.isEmpty()) {\n\n child.content = getUsefulItems(child, usefulItems);\n\n }\n });\n\n return usefulItems;\n}\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'converts colors: rgb() to #rrggbb and #rrggbb to #rgb';\n\nexports.params = {\n currentColor: false,\n names2hex: true,\n rgb2hex: true,\n shorthex: true,\n shortname: true\n};\n\nvar collections = require('./_collections'),\n rNumber = '([+-]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.?)%?)',\n rComma = '\\\\s*,\\\\s*',\n regRGB = new RegExp('^rgb\\\\(\\\\s*' + rNumber + rComma + rNumber + rComma + rNumber + '\\\\s*\\\\)$'),\n regHEX = /^\\#(([a-fA-F0-9])\\2){3}$/,\n none = /\\bnone\\b/i;\n\n/**\n * Convert different colors formats in element attributes to hex.\n *\n * @see http://www.w3.org/TR/SVG/types.html#DataTypeColor\n * @see http://www.w3.org/TR/SVG/single-page.html#types-ColorKeywords\n *\n * @example\n * Convert color name keyword to long hex:\n * fuchsia ➡ #ff00ff\n *\n * Convert rgb() to long hex:\n * rgb(255, 0, 255) ➡ #ff00ff\n * rgb(50%, 100, 100%) ➡ #7f64ff\n *\n * Convert long hex to short hex:\n * #aabbcc ➡ #abc\n *\n * Convert hex to short name\n * #000080 ➡ navy\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n if (item.elem) {\n\n item.eachAttr(function(attr) {\n\n if (collections.colorsProps.indexOf(attr.name) > -1) {\n\n var val = attr.value,\n match;\n\n // Convert colors to currentColor\n if (params.currentColor) {\n if (typeof params.currentColor === 'string') {\n match = val === params.currentColor;\n } else if (params.currentColor.exec) {\n match = params.currentColor.exec(val);\n } else {\n match = !val.match(none);\n }\n if (match) {\n val = 'currentColor';\n }\n }\n\n // Convert color name keyword to long hex\n if (params.names2hex && val.toLowerCase() in collections.colorsNames) {\n val = collections.colorsNames[val.toLowerCase()];\n }\n\n // Convert rgb() to long hex\n if (params.rgb2hex && (match = val.match(regRGB))) {\n match = match.slice(1, 4).map(function(m) {\n if (m.indexOf('%') > -1)\n m = Math.round(parseFloat(m) * 2.55);\n\n return Math.max(0, Math.min(m, 255));\n });\n\n val = rgb2hex(match);\n }\n\n // Convert long hex to short hex\n if (params.shorthex && (match = val.match(regHEX))) {\n val = '#' + match[0][1] + match[0][3] + match[0][5];\n }\n\n // Convert hex to short name\n if (params.shortname) {\n var lowerVal = val.toLowerCase();\n if (lowerVal in collections.colorsShortNames) {\n val = collections.colorsShortNames[lowerVal];\n }\n }\n\n attr.value = val;\n\n }\n\n });\n\n }\n\n};\n\n/**\n * Convert [r, g, b] to #rrggbb.\n *\n * @see https://gist.github.com/983535\n *\n * @example\n * rgb2hex([255, 255, 255]) // '#ffffff'\n *\n * @param {Array} rgb [r, g, b]\n * @return {String} #rrggbb\n *\n * @author Jed Schmidt\n */\nfunction rgb2hex(rgb) {\n return '#' + ('00000' + (rgb[0] << 16 | rgb[1] << 8 | rgb[2]).toString(16)).slice(-6).toUpperCase();\n}\n","'use strict';\n\nexports.type = 'perItemReverse';\n\nexports.active = true;\n\nexports.description = 'moves elements attributes to the existing group wrapper';\n\nvar inheritableAttrs = require('./_collections').inheritableAttrs,\n pathElems = require('./_collections.js').pathElems;\n\n/**\n * Collapse content's intersected and inheritable\n * attributes to the existing group wrapper.\n *\n * @example\n * <g attr1=\"val1\">\n * <g attr2=\"val2\">\n * text\n * </g>\n * <circle attr2=\"val2\" attr3=\"val3\"/>\n * </g>\n * ⬇\n * <g attr1=\"val1\" attr2=\"val2\">\n * <g>\n * text\n * </g>\n * <circle attr3=\"val3\"/>\n * </g>\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n if (item.isElem('g') && !item.isEmpty() && item.content.length > 1) {\n\n var intersection = {},\n hasTransform = false,\n hasClip = item.hasAttr('clip-path') || item.hasAttr('mask'),\n intersected = item.content.every(function(inner) {\n if (inner.isElem() && inner.hasAttr()) {\n // don't mess with possible styles (hack until CSS parsing is implemented)\n if (inner.hasAttr('class')) return false;\n if (!Object.keys(intersection).length) {\n intersection = inner.attrs;\n } else {\n intersection = intersectInheritableAttrs(intersection, inner.attrs);\n\n if (!intersection) return false;\n }\n\n return true;\n }\n }),\n allPath = item.content.every(function(inner) {\n return inner.isElem(pathElems);\n });\n\n if (intersected) {\n\n item.content.forEach(function(g) {\n\n for (var name in intersection) {\n\n if (!allPath && !hasClip || name !== 'transform') {\n\n g.removeAttr(name);\n\n if (name === 'transform') {\n if (!hasTransform) {\n if (item.hasAttr('transform')) {\n item.attr('transform').value += ' ' + intersection[name].value;\n } else {\n item.addAttr(intersection[name]);\n }\n\n hasTransform = true;\n }\n } else {\n item.addAttr(intersection[name]);\n }\n\n }\n }\n\n });\n\n }\n\n }\n\n};\n\n/**\n * Intersect inheritable attributes.\n *\n * @param {Object} a first attrs object\n * @param {Object} b second attrs object\n *\n * @return {Object} intersected attrs object\n */\nfunction intersectInheritableAttrs(a, b) {\n\n var c = {};\n\n for (var n in a) {\n if (\n b.hasOwnProperty(n) &&\n inheritableAttrs.indexOf(n) > -1 &&\n a[n].name === b[n].name &&\n a[n].value === b[n].value &&\n a[n].prefix === b[n].prefix &&\n a[n].local === b[n].local\n ) {\n c[n] = a[n];\n }\n }\n\n if (!Object.keys(c).length) return false;\n\n return c;\n\n}\n","'use strict';\n\nexports.type = 'perItemReverse';\n\nexports.active = true;\n\nexports.description = 'collapses useless groups';\n\nvar collections = require('./_collections'),\n attrsInheritable = collections.inheritableAttrs,\n animationElems = collections.elemsGroups.animation;\n\nfunction hasAnimatedAttr(item) {\n /* jshint validthis:true */\n return item.isElem(animationElems) && item.hasAttr('attributeName', this) ||\n !item.isEmpty() && item.content.some(hasAnimatedAttr, this);\n}\n\n/*\n * Collapse useless groups.\n *\n * @example\n * <g>\n * <g attr1=\"val1\">\n * <path d=\"...\"/>\n * </g>\n * </g>\n * ⬇\n * <g>\n * <g>\n * <path attr1=\"val1\" d=\"...\"/>\n * </g>\n * </g>\n * ⬇\n * <path attr1=\"val1\" d=\"...\"/>\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n // non-empty elements\n if (item.isElem() && (!item.isElem('switch') || isFeaturedSwitch(item)) && !item.isEmpty()) {\n item.content.forEach(function(g, i) {\n // non-empty groups\n if (g.isElem('g') && !g.isEmpty()) {\n // move group attibutes to the single content element\n if (g.hasAttr() && g.content.length === 1) {\n var inner = g.content[0];\n\n if (inner.isElem() && !inner.hasAttr('id') &&\n !(g.hasAttr('class') && inner.hasAttr('class')) && (\n !g.hasAttr('clip-path') && !g.hasAttr('mask') ||\n inner.isElem('g') && !g.hasAttr('transform') && !inner.hasAttr('transform')\n )\n ) {\n g.eachAttr(function(attr) {\n if (g.content.some(hasAnimatedAttr, attr.name)) return;\n\n if (!inner.hasAttr(attr.name)) {\n inner.addAttr(attr);\n } else if (attr.name == 'transform') {\n inner.attr(attr.name).value = attr.value + ' ' + inner.attr(attr.name).value;\n } else if (\n attrsInheritable.indexOf(attr.name) < 0 &&\n !inner.hasAttr(attr.name, attr.value)\n ) {\n return;\n }\n\n g.removeAttr(attr.name);\n });\n }\n }\n\n // collapse groups without attributes\n if (!g.hasAttr() && !g.content.some(function(item) { return item.isElem(animationElems) })) {\n item.spliceContent(i, 1, g.content);\n }\n } else if (isFeaturedSwitch(g)) {\n item.spliceContent(i, 1, g.content);\n }\n });\n }\n};\n\nfunction isFeaturedSwitch(elem) {\n return elem.isElem('switch') && !elem.isEmpty() && !elem.content.some(child =>\n child.hasAttr('systemLanguage') || child.hasAttr('requiredFeatures') || child.hasAttr('requiredExtensions')\n );\n}\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'optimizes path data: writes in shorter form, applies transformations';\n\nexports.params = {\n applyTransforms: true,\n applyTransformsStroked: true,\n makeArcs: {\n threshold: 2.5, // coefficient of rounding error\n tolerance: 0.5 // percentage of radius\n },\n straightCurves: true,\n lineShorthands: true,\n curveSmoothShorthands: true,\n floatPrecision: 3,\n transformPrecision: 5,\n removeUseless: true,\n collapseRepeated: true,\n utilizeAbsolute: true,\n leadingZero: true,\n negativeExtraSpace: true\n};\n\nvar pathElems = require('./_collections.js').pathElems,\n path2js = require('./_path.js').path2js,\n js2path = require('./_path.js').js2path,\n applyTransforms = require('./_path.js').applyTransforms,\n cleanupOutData = require('../lib/svgo/tools').cleanupOutData,\n roundData,\n precision,\n error,\n arcThreshold,\n arcTolerance,\n hasMarkerMid;\n\n/**\n * Convert absolute Path to relative,\n * collapse repeated instructions,\n * detect and convert Lineto shorthands,\n * remove useless instructions like \"l0,0\",\n * trim useless delimiters and leading zeros,\n * decrease accuracy of floating-point numbers.\n *\n * @see http://www.w3.org/TR/SVG/paths.html#PathData\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n if (item.isElem(pathElems) && item.hasAttr('d')) {\n\n precision = params.floatPrecision;\n error = precision !== false ? +Math.pow(.1, precision).toFixed(precision) : 1e-2;\n roundData = precision > 0 && precision < 20 ? strongRound : round;\n if (params.makeArcs) {\n arcThreshold = params.makeArcs.threshold;\n arcTolerance = params.makeArcs.tolerance;\n }\n hasMarkerMid = item.hasAttr('marker-mid');\n\n var data = path2js(item);\n\n // TODO: get rid of functions returns\n if (data.length) {\n convertToRelative(data);\n\n if (params.applyTransforms) {\n data = applyTransforms(item, data, params);\n }\n\n data = filters(data, params);\n\n if (params.utilizeAbsolute) {\n data = convertToMixed(data, params);\n }\n\n js2path(item, data, params);\n }\n\n }\n\n};\n\n/**\n * Convert absolute path data coordinates to relative.\n *\n * @param {Array} path input path data\n * @param {Object} params plugin params\n * @return {Array} output path data\n */\nfunction convertToRelative(path) {\n\n var point = [0, 0],\n subpathPoint = [0, 0],\n baseItem;\n\n path.forEach(function(item, index) {\n\n var instruction = item.instruction,\n data = item.data;\n\n // data !== !z\n if (data) {\n\n // already relative\n // recalculate current point\n if ('mcslqta'.indexOf(instruction) > -1) {\n\n point[0] += data[data.length - 2];\n point[1] += data[data.length - 1];\n\n if (instruction === 'm') {\n subpathPoint[0] = point[0];\n subpathPoint[1] = point[1];\n baseItem = item;\n }\n\n } else if (instruction === 'h') {\n\n point[0] += data[0];\n\n } else if (instruction === 'v') {\n\n point[1] += data[0];\n\n }\n\n // convert absolute path data coordinates to relative\n // if \"M\" was not transformed from \"m\"\n // M → m\n if (instruction === 'M') {\n\n if (index > 0) instruction = 'm';\n\n data[0] -= point[0];\n data[1] -= point[1];\n\n subpathPoint[0] = point[0] += data[0];\n subpathPoint[1] = point[1] += data[1];\n\n baseItem = item;\n\n }\n\n // L → l\n // T → t\n else if ('LT'.indexOf(instruction) > -1) {\n\n instruction = instruction.toLowerCase();\n\n // x y\n // 0 1\n data[0] -= point[0];\n data[1] -= point[1];\n\n point[0] += data[0];\n point[1] += data[1];\n\n // C → c\n } else if (instruction === 'C') {\n\n instruction = 'c';\n\n // x1 y1 x2 y2 x y\n // 0 1 2 3 4 5\n data[0] -= point[0];\n data[1] -= point[1];\n data[2] -= point[0];\n data[3] -= point[1];\n data[4] -= point[0];\n data[5] -= point[1];\n\n point[0] += data[4];\n point[1] += data[5];\n\n // S → s\n // Q → q\n } else if ('SQ'.indexOf(instruction) > -1) {\n\n instruction = instruction.toLowerCase();\n\n // x1 y1 x y\n // 0 1 2 3\n data[0] -= point[0];\n data[1] -= point[1];\n data[2] -= point[0];\n data[3] -= point[1];\n\n point[0] += data[2];\n point[1] += data[3];\n\n // A → a\n } else if (instruction === 'A') {\n\n instruction = 'a';\n\n // rx ry x-axis-rotation large-arc-flag sweep-flag x y\n // 0 1 2 3 4 5 6\n data[5] -= point[0];\n data[6] -= point[1];\n\n point[0] += data[5];\n point[1] += data[6];\n\n // H → h\n } else if (instruction === 'H') {\n\n instruction = 'h';\n\n data[0] -= point[0];\n\n point[0] += data[0];\n\n // V → v\n } else if (instruction === 'V') {\n\n instruction = 'v';\n\n data[0] -= point[1];\n\n point[1] += data[0];\n\n }\n\n item.instruction = instruction;\n item.data = data;\n\n // store absolute coordinates for later use\n item.coords = point.slice(-2);\n\n }\n\n // !data === z, reset current point\n else if (instruction == 'z') {\n if (baseItem) {\n item.coords = baseItem.coords;\n }\n point[0] = subpathPoint[0];\n point[1] = subpathPoint[1];\n }\n\n item.base = index > 0 ? path[index - 1].coords : [0, 0];\n\n });\n\n return path;\n\n}\n\n/**\n * Main filters loop.\n *\n * @param {Array} path input path data\n * @param {Object} params plugin params\n * @return {Array} output path data\n */\nfunction filters(path, params) {\n\n var stringify = data2Path.bind(null, params),\n relSubpoint = [0, 0],\n pathBase = [0, 0],\n prev = {};\n\n path = path.filter(function(item, index, path) {\n\n var instruction = item.instruction,\n data = item.data,\n next = path[index + 1];\n\n if (data) {\n\n var sdata = data,\n circle;\n\n if (instruction === 's') {\n sdata = [0, 0].concat(data);\n\n if ('cs'.indexOf(prev.instruction) > -1) {\n var pdata = prev.data,\n n = pdata.length;\n\n // (-x, -y) of the prev tangent point relative to the current point\n sdata[0] = pdata[n - 2] - pdata[n - 4];\n sdata[1] = pdata[n - 1] - pdata[n - 3];\n }\n\n }\n\n // convert curves to arcs if possible\n if (\n params.makeArcs &&\n (instruction == 'c' || instruction == 's') &&\n isConvex(sdata) &&\n (circle = findCircle(sdata))\n ) {\n var r = roundData([circle.radius])[0],\n angle = findArcAngle(sdata, circle),\n sweep = sdata[5] * sdata[0] - sdata[4] * sdata[1] > 0 ? 1 : 0,\n arc = {\n instruction: 'a',\n data: [r, r, 0, 0, sweep, sdata[4], sdata[5]],\n coords: item.coords.slice(),\n base: item.base\n },\n output = [arc],\n // relative coordinates to adjust the found circle\n relCenter = [circle.center[0] - sdata[4], circle.center[1] - sdata[5]],\n relCircle = { center: relCenter, radius: circle.radius },\n arcCurves = [item],\n hasPrev = 0,\n suffix = '',\n nextLonghand;\n\n if (\n prev.instruction == 'c' && isConvex(prev.data) && isArcPrev(prev.data, circle) ||\n prev.instruction == 'a' && prev.sdata && isArcPrev(prev.sdata, circle)\n ) {\n arcCurves.unshift(prev);\n arc.base = prev.base;\n arc.data[5] = arc.coords[0] - arc.base[0];\n arc.data[6] = arc.coords[1] - arc.base[1];\n var prevData = prev.instruction == 'a' ? prev.sdata : prev.data;\n angle += findArcAngle(prevData,\n {\n center: [prevData[4] + relCenter[0], prevData[5] + relCenter[1]],\n radius: circle.radius\n }\n );\n if (angle > Math.PI) arc.data[3] = 1;\n hasPrev = 1;\n }\n\n // check if next curves are fitting the arc\n for (var j = index; (next = path[++j]) && ~'cs'.indexOf(next.instruction);) {\n var nextData = next.data;\n if (next.instruction == 's') {\n nextLonghand = makeLonghand({instruction: 's', data: next.data.slice() },\n path[j - 1].data);\n nextData = nextLonghand.data;\n nextLonghand.data = nextData.slice(0, 2);\n suffix = stringify([nextLonghand]);\n }\n if (isConvex(nextData) && isArc(nextData, relCircle)) {\n angle += findArcAngle(nextData, relCircle);\n if (angle - 2 * Math.PI > 1e-3) break; // more than 360°\n if (angle > Math.PI) arc.data[3] = 1;\n arcCurves.push(next);\n if (2 * Math.PI - angle > 1e-3) { // less than 360°\n arc.coords = next.coords;\n arc.data[5] = arc.coords[0] - arc.base[0];\n arc.data[6] = arc.coords[1] - arc.base[1];\n } else {\n // full circle, make a half-circle arc and add a second one\n arc.data[5] = 2 * (relCircle.center[0] - nextData[4]);\n arc.data[6] = 2 * (relCircle.center[1] - nextData[5]);\n arc.coords = [arc.base[0] + arc.data[5], arc.base[1] + arc.data[6]];\n arc = {\n instruction: 'a',\n data: [r, r, 0, 0, sweep,\n next.coords[0] - arc.coords[0], next.coords[1] - arc.coords[1]],\n coords: next.coords,\n base: arc.coords\n };\n output.push(arc);\n j++;\n break;\n }\n relCenter[0] -= nextData[4];\n relCenter[1] -= nextData[5];\n } else break;\n }\n\n if ((stringify(output) + suffix).length < stringify(arcCurves).length) {\n if (path[j] && path[j].instruction == 's') {\n makeLonghand(path[j], path[j - 1].data);\n }\n if (hasPrev) {\n var prevArc = output.shift();\n roundData(prevArc.data);\n relSubpoint[0] += prevArc.data[5] - prev.data[prev.data.length - 2];\n relSubpoint[1] += prevArc.data[6] - prev.data[prev.data.length - 1];\n prev.instruction = 'a';\n prev.data = prevArc.data;\n item.base = prev.coords = prevArc.coords;\n }\n arc = output.shift();\n if (arcCurves.length == 1) {\n item.sdata = sdata.slice(); // preserve curve data for future checks\n } else if (arcCurves.length - 1 - hasPrev > 0) {\n // filter out consumed next items\n path.splice.apply(path, [index + 1, arcCurves.length - 1 - hasPrev].concat(output));\n }\n if (!arc) return false;\n instruction = 'a';\n data = arc.data;\n item.coords = arc.coords;\n }\n }\n\n // Rounding relative coordinates, taking in account accummulating error\n // to get closer to absolute coordinates. Sum of rounded value remains same:\n // l .25 3 .25 2 .25 3 .25 2 -> l .3 3 .2 2 .3 3 .2 2\n if (precision !== false) {\n if ('mltqsc'.indexOf(instruction) > -1) {\n for (var i = data.length; i--;) {\n data[i] += item.base[i % 2] - relSubpoint[i % 2];\n }\n } else if (instruction == 'h') {\n data[0] += item.base[0] - relSubpoint[0];\n } else if (instruction == 'v') {\n data[0] += item.base[1] - relSubpoint[1];\n } else if (instruction == 'a') {\n data[5] += item.base[0] - relSubpoint[0];\n data[6] += item.base[1] - relSubpoint[1];\n }\n roundData(data);\n\n if (instruction == 'h') relSubpoint[0] += data[0];\n else if (instruction == 'v') relSubpoint[1] += data[0];\n else {\n relSubpoint[0] += data[data.length - 2];\n relSubpoint[1] += data[data.length - 1];\n }\n roundData(relSubpoint);\n\n if (instruction.toLowerCase() == 'm') {\n pathBase[0] = relSubpoint[0];\n pathBase[1] = relSubpoint[1];\n }\n }\n\n // convert straight curves into lines segments\n if (params.straightCurves) {\n\n if (\n instruction === 'c' &&\n isCurveStraightLine(data) ||\n instruction === 's' &&\n isCurveStraightLine(sdata)\n ) {\n if (next && next.instruction == 's')\n makeLonghand(next, data); // fix up next curve\n instruction = 'l';\n data = data.slice(-2);\n }\n\n else if (\n instruction === 'q' &&\n isCurveStraightLine(data)\n ) {\n if (next && next.instruction == 't')\n makeLonghand(next, data); // fix up next curve\n instruction = 'l';\n data = data.slice(-2);\n }\n\n else if (\n instruction === 't' &&\n prev.instruction !== 'q' &&\n prev.instruction !== 't'\n ) {\n instruction = 'l';\n data = data.slice(-2);\n }\n\n else if (\n instruction === 'a' &&\n (data[0] === 0 || data[1] === 0)\n ) {\n instruction = 'l';\n data = data.slice(-2);\n }\n }\n\n // horizontal and vertical line shorthands\n // l 50 0 → h 50\n // l 0 50 → v 50\n if (\n params.lineShorthands &&\n instruction === 'l'\n ) {\n if (data[1] === 0) {\n instruction = 'h';\n data.pop();\n } else if (data[0] === 0) {\n instruction = 'v';\n data.shift();\n }\n }\n\n // collapse repeated commands\n // h 20 h 30 -> h 50\n if (\n params.collapseRepeated &&\n !hasMarkerMid &&\n ('mhv'.indexOf(instruction) > -1) &&\n prev.instruction &&\n instruction == prev.instruction.toLowerCase() &&\n (\n (instruction != 'h' && instruction != 'v') ||\n (prev.data[0] >= 0) == (item.data[0] >= 0)\n )) {\n prev.data[0] += data[0];\n if (instruction != 'h' && instruction != 'v') {\n prev.data[1] += data[1];\n }\n prev.coords = item.coords;\n path[index] = prev;\n return false;\n }\n\n // convert curves into smooth shorthands\n if (params.curveSmoothShorthands && prev.instruction) {\n\n // curveto\n if (instruction === 'c') {\n\n // c + c → c + s\n if (\n prev.instruction === 'c' &&\n data[0] === -(prev.data[2] - prev.data[4]) &&\n data[1] === -(prev.data[3] - prev.data[5])\n ) {\n instruction = 's';\n data = data.slice(2);\n }\n\n // s + c → s + s\n else if (\n prev.instruction === 's' &&\n data[0] === -(prev.data[0] - prev.data[2]) &&\n data[1] === -(prev.data[1] - prev.data[3])\n ) {\n instruction = 's';\n data = data.slice(2);\n }\n\n // [^cs] + c → [^cs] + s\n else if (\n 'cs'.indexOf(prev.instruction) === -1 &&\n data[0] === 0 &&\n data[1] === 0\n ) {\n instruction = 's';\n data = data.slice(2);\n }\n\n }\n\n // quadratic Bézier curveto\n else if (instruction === 'q') {\n\n // q + q → q + t\n if (\n prev.instruction === 'q' &&\n data[0] === (prev.data[2] - prev.data[0]) &&\n data[1] === (prev.data[3] - prev.data[1])\n ) {\n instruction = 't';\n data = data.slice(2);\n }\n\n // t + q → t + t\n else if (\n prev.instruction === 't' &&\n data[2] === prev.data[0] &&\n data[3] === prev.data[1]\n ) {\n instruction = 't';\n data = data.slice(2);\n }\n\n }\n\n }\n\n // remove useless non-first path segments\n if (params.removeUseless) {\n\n // l 0,0 / h 0 / v 0 / q 0,0 0,0 / t 0,0 / c 0,0 0,0 0,0 / s 0,0 0,0\n if (\n (\n 'lhvqtcs'.indexOf(instruction) > -1\n ) &&\n data.every(function(i) { return i === 0; })\n ) {\n path[index] = prev;\n return false;\n }\n\n // a 25,25 -30 0,1 0,0\n if (\n instruction === 'a' &&\n data[5] === 0 &&\n data[6] === 0\n ) {\n path[index] = prev;\n return false;\n }\n\n }\n\n item.instruction = instruction;\n item.data = data;\n\n prev = item;\n\n } else {\n\n // z resets coordinates\n relSubpoint[0] = pathBase[0];\n relSubpoint[1] = pathBase[1];\n if (prev.instruction == 'z') return false;\n prev = item;\n\n }\n\n return true;\n\n });\n\n return path;\n\n}\n\n/**\n * Writes data in shortest form using absolute or relative coordinates.\n *\n * @param {Array} data input path data\n * @return {Boolean} output\n */\nfunction convertToMixed(path, params) {\n\n var prev = path[0];\n\n path = path.filter(function(item, index) {\n\n if (index == 0) return true;\n if (!item.data) {\n prev = item;\n return true;\n }\n\n var instruction = item.instruction,\n data = item.data,\n adata = data && data.slice(0);\n\n if ('mltqsc'.indexOf(instruction) > -1) {\n for (var i = adata.length; i--;) {\n adata[i] += item.base[i % 2];\n }\n } else if (instruction == 'h') {\n adata[0] += item.base[0];\n } else if (instruction == 'v') {\n adata[0] += item.base[1];\n } else if (instruction == 'a') {\n adata[5] += item.base[0];\n adata[6] += item.base[1];\n }\n\n roundData(adata);\n\n var absoluteDataStr = cleanupOutData(adata, params),\n relativeDataStr = cleanupOutData(data, params);\n\n // Convert to absolute coordinates if it's shorter.\n // v-20 -> V0\n // Don't convert if it fits following previous instruction.\n // l20 30-10-50 instead of l20 30L20 30\n if (\n absoluteDataStr.length < relativeDataStr.length &&\n !(\n params.negativeExtraSpace &&\n instruction == prev.instruction &&\n prev.instruction.charCodeAt(0) > 96 &&\n absoluteDataStr.length == relativeDataStr.length - 1 &&\n (data[0] < 0 || /^0\\./.test(data[0]) && prev.data[prev.data.length - 1] % 1)\n )\n ) {\n item.instruction = instruction.toUpperCase();\n item.data = adata;\n }\n\n prev = item;\n\n return true;\n\n });\n\n return path;\n\n}\n\n/**\n * Checks if curve is convex. Control points of such a curve must form\n * a convex quadrilateral with diagonals crosspoint inside of it.\n *\n * @param {Array} data input path data\n * @return {Boolean} output\n */\nfunction isConvex(data) {\n\n var center = getIntersection([0, 0, data[2], data[3], data[0], data[1], data[4], data[5]]);\n\n return center &&\n (data[2] < center[0] == center[0] < 0) &&\n (data[3] < center[1] == center[1] < 0) &&\n (data[4] < center[0] == center[0] < data[0]) &&\n (data[5] < center[1] == center[1] < data[1]);\n\n}\n\n/**\n * Computes lines equations by two points and returns their intersection point.\n *\n * @param {Array} coords 8 numbers for 4 pairs of coordinates (x,y)\n * @return {Array|undefined} output coordinate of lines' crosspoint\n */\nfunction getIntersection(coords) {\n\n // Prev line equation parameters.\n var a1 = coords[1] - coords[3], // y1 - y2\n b1 = coords[2] - coords[0], // x2 - x1\n c1 = coords[0] * coords[3] - coords[2] * coords[1], // x1 * y2 - x2 * y1\n\n // Next line equation parameters\n a2 = coords[5] - coords[7], // y1 - y2\n b2 = coords[6] - coords[4], // x2 - x1\n c2 = coords[4] * coords[7] - coords[5] * coords[6], // x1 * y2 - x2 * y1\n denom = (a1 * b2 - a2 * b1);\n\n if (!denom) return; // parallel lines havn't an intersection\n\n var cross = [\n (b1 * c2 - b2 * c1) / denom,\n (a1 * c2 - a2 * c1) / -denom\n ];\n if (\n !isNaN(cross[0]) && !isNaN(cross[1]) &&\n isFinite(cross[0]) && isFinite(cross[1])\n ) {\n return cross;\n }\n\n}\n\n/**\n * Decrease accuracy of floating-point numbers\n * in path data keeping a specified number of decimals.\n * Smart rounds values like 2.3491 to 2.35 instead of 2.349.\n * Doesn't apply \"smartness\" if the number precision fits already.\n *\n * @param {Array} data input data array\n * @return {Array} output data array\n */\nfunction strongRound(data) {\n for (var i = data.length; i-- > 0;) {\n if (data[i].toFixed(precision) != data[i]) {\n var rounded = +data[i].toFixed(precision - 1);\n data[i] = +Math.abs(rounded - data[i]).toFixed(precision + 1) >= error ?\n +data[i].toFixed(precision) :\n rounded;\n }\n }\n return data;\n}\n\n/**\n * Simple rounding function if precision is 0.\n *\n * @param {Array} data input data array\n * @return {Array} output data array\n */\nfunction round(data) {\n for (var i = data.length; i-- > 0;) {\n data[i] = Math.round(data[i]);\n }\n return data;\n}\n\n/**\n * Checks if a curve is a straight line by measuring distance\n * from middle points to the line formed by end points.\n *\n * @param {Array} xs array of curve points x-coordinates\n * @param {Array} ys array of curve points y-coordinates\n * @return {Boolean}\n */\n\nfunction isCurveStraightLine(data) {\n\n // Get line equation a·x + b·y + c = 0 coefficients a, b (c = 0) by start and end points.\n var i = data.length - 2,\n a = -data[i + 1], // y1 y2 (y1 = 0)\n b = data[i], // x2 x1 (x1 = 0)\n d = 1 / (a * a + b * b); // same part for all points\n\n if (i <= 1 || !isFinite(d)) return false; // curve that ends at start point isn't the case\n\n // Distance from point (x0, y0) to the line is sqrt((c a·x0 b·y0)² / (a² + b²))\n while ((i -= 2) >= 0) {\n if (Math.sqrt(Math.pow(a * data[i] + b * data[i + 1], 2) * d) > error)\n return false;\n }\n\n return true;\n\n}\n\n/**\n * Converts next curve from shorthand to full form using the current curve data.\n *\n * @param {Object} item curve to convert\n * @param {Array} data current curve data\n */\n\nfunction makeLonghand(item, data) {\n switch (item.instruction) {\n case 's': item.instruction = 'c'; break;\n case 't': item.instruction = 'q'; break;\n }\n item.data.unshift(data[data.length - 2] - data[data.length - 4], data[data.length - 1] - data[data.length - 3]);\n return item;\n}\n\n/**\n * Returns distance between two points\n *\n * @param {Array} point1 first point coordinates\n * @param {Array} point2 second point coordinates\n * @return {Number} distance\n */\n\nfunction getDistance(point1, point2) {\n return Math.sqrt(Math.pow(point1[0] - point2[0], 2) + Math.pow(point1[1] - point2[1], 2));\n}\n\n/**\n * Returns coordinates of the curve point corresponding to the certain t\n * a·(1 - t)³·p1 + b·(1 - t)²·t·p2 + c·(1 - t)·t²·p3 + d·t³·p4,\n * where pN are control points and p1 is zero due to relative coordinates.\n *\n * @param {Array} curve array of curve points coordinates\n * @param {Number} t parametric position from 0 to 1\n * @return {Array} Point coordinates\n */\n\nfunction getCubicBezierPoint(curve, t) {\n var sqrT = t * t,\n cubT = sqrT * t,\n mt = 1 - t,\n sqrMt = mt * mt;\n\n return [\n 3 * sqrMt * t * curve[0] + 3 * mt * sqrT * curve[2] + cubT * curve[4],\n 3 * sqrMt * t * curve[1] + 3 * mt * sqrT * curve[3] + cubT * curve[5]\n ];\n}\n\n/**\n * Finds circle by 3 points of the curve and checks if the curve fits the found circle.\n *\n * @param {Array} curve\n * @return {Object|undefined} circle\n */\n\nfunction findCircle(curve) {\n var midPoint = getCubicBezierPoint(curve, 1/2),\n m1 = [midPoint[0] / 2, midPoint[1] / 2],\n m2 = [(midPoint[0] + curve[4]) / 2, (midPoint[1] + curve[5]) / 2],\n center = getIntersection([\n m1[0], m1[1],\n m1[0] + m1[1], m1[1] - m1[0],\n m2[0], m2[1],\n m2[0] + (m2[1] - midPoint[1]), m2[1] - (m2[0] - midPoint[0])\n ]),\n radius = center && getDistance([0, 0], center),\n tolerance = Math.min(arcThreshold * error, arcTolerance * radius / 100);\n\n if (center && [1/4, 3/4].every(function(point) {\n return Math.abs(getDistance(getCubicBezierPoint(curve, point), center) - radius) <= tolerance;\n }))\n return { center: center, radius: radius};\n}\n\n/**\n * Checks if a curve fits the given circle.\n *\n * @param {Object} circle\n * @param {Array} curve\n * @return {Boolean}\n */\n\nfunction isArc(curve, circle) {\n var tolerance = Math.min(arcThreshold * error, arcTolerance * circle.radius / 100);\n\n return [0, 1/4, 1/2, 3/4, 1].every(function(point) {\n return Math.abs(getDistance(getCubicBezierPoint(curve, point), circle.center) - circle.radius) <= tolerance;\n });\n}\n\n/**\n * Checks if a previous curve fits the given circle.\n *\n * @param {Object} circle\n * @param {Array} curve\n * @return {Boolean}\n */\n\nfunction isArcPrev(curve, circle) {\n return isArc(curve, {\n center: [circle.center[0] + curve[4], circle.center[1] + curve[5]],\n radius: circle.radius\n });\n}\n\n/**\n * Finds angle of a curve fitting the given arc.\n\n * @param {Array} curve\n * @param {Object} relCircle\n * @return {Number} angle\n */\n\nfunction findArcAngle(curve, relCircle) {\n var x1 = -relCircle.center[0],\n y1 = -relCircle.center[1],\n x2 = curve[4] - relCircle.center[0],\n y2 = curve[5] - relCircle.center[1];\n\n return Math.acos(\n (x1 * x2 + y1 * y2) /\n Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2))\n );\n}\n\n/**\n * Converts given path data to string.\n *\n * @param {Object} params\n * @param {Array} pathData\n * @return {String}\n */\n\nfunction data2Path(params, pathData) {\n return pathData.reduce(function(pathString, item) {\n return pathString + item.instruction + (item.data ? cleanupOutData(roundData(item.data.slice()), params) : '');\n }, '');\n}\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'collapses multiple transformations and optimizes it';\n\nexports.params = {\n convertToShorts: true,\n // degPrecision: 3, // transformPrecision (or matrix precision) - 2 by default\n floatPrecision: 3,\n transformPrecision: 5,\n matrixToTransform: true,\n shortTranslate: true,\n shortScale: true,\n shortRotate: true,\n removeUseless: true,\n collapseIntoOne: true,\n leadingZero: true,\n negativeExtraSpace: false\n};\n\nvar cleanupOutData = require('../lib/svgo/tools').cleanupOutData,\n transform2js = require('./_transforms.js').transform2js,\n transformsMultiply = require('./_transforms.js').transformsMultiply,\n matrixToTransform = require('./_transforms.js').matrixToTransform,\n degRound,\n floatRound,\n transformRound;\n\n/**\n * Convert matrices to the short aliases,\n * convert long translate, scale or rotate transform notations to the shorts ones,\n * convert transforms to the matrices and multiply them all into one,\n * remove useless transforms.\n *\n * @see http://www.w3.org/TR/SVG/coords.html#TransformMatrixDefined\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n if (item.elem) {\n\n // transform\n if (item.hasAttr('transform')) {\n convertTransform(item, 'transform', params);\n }\n\n // gradientTransform\n if (item.hasAttr('gradientTransform')) {\n convertTransform(item, 'gradientTransform', params);\n }\n\n // patternTransform\n if (item.hasAttr('patternTransform')) {\n convertTransform(item, 'patternTransform', params);\n }\n\n }\n\n};\n\n/**\n * Main function.\n *\n * @param {Object} item input item\n * @param {String} attrName attribute name\n * @param {Object} params plugin params\n */\nfunction convertTransform(item, attrName, params) {\n var data = transform2js(item.attr(attrName).value);\n params = definePrecision(data, params);\n\n if (params.collapseIntoOne && data.length > 1) {\n data = [transformsMultiply(data)];\n }\n\n if (params.convertToShorts) {\n data = convertToShorts(data, params);\n } else {\n data.forEach(roundTransform);\n }\n\n if (params.removeUseless) {\n data = removeUseless(data);\n }\n\n if (data.length) {\n item.attr(attrName).value = js2transform(data, params);\n } else {\n item.removeAttr(attrName);\n }\n}\n\n/**\n * Defines precision to work with certain parts.\n * transformPrecision - for scale and four first matrix parameters (needs a better precision due to multiplying),\n * floatPrecision - for translate including two last matrix and rotate parameters,\n * degPrecision - for rotate and skew. By default it's equal to (rougly)\n * transformPrecision - 2 or floatPrecision whichever is lower. Can be set in params.\n *\n * @param {Array} transforms input array\n * @param {Object} params plugin params\n * @return {Array} output array\n */\nfunction definePrecision(data, params) {\n /* jshint validthis: true */\n var matrixData = data.reduce(getMatrixData, []),\n significantDigits = params.transformPrecision;\n\n // Clone params so it don't affect other elements transformations.\n params = Object.assign({}, params);\n\n // Limit transform precision with matrix one. Calculating with larger precision doesn't add any value.\n if (matrixData.length) {\n params.transformPrecision = Math.min(params.transformPrecision,\n Math.max.apply(Math, matrixData.map(floatDigits)) || params.transformPrecision);\n\n significantDigits = Math.max.apply(Math, matrixData.map(function(n) {\n return String(n).replace(/\\D+/g, '').length; // Number of digits in a number. 123.45 → 5\n }));\n }\n // No sense in angle precision more then number of significant digits in matrix.\n if (!('degPrecision' in params)) {\n params.degPrecision = Math.max(0, Math.min(params.floatPrecision, significantDigits - 2));\n }\n\n floatRound = params.floatPrecision >= 1 && params.floatPrecision < 20 ?\n smartRound.bind(this, params.floatPrecision) :\n round;\n degRound = params.degPrecision >= 1 && params.floatPrecision < 20 ?\n smartRound.bind(this, params.degPrecision) :\n round;\n transformRound = params.transformPrecision >= 1 && params.floatPrecision < 20 ?\n smartRound.bind(this, params.transformPrecision) :\n round;\n\n return params;\n}\n\n/**\n * Gathers four first matrix parameters.\n *\n * @param {Array} a array of data\n * @param {Object} transform\n * @return {Array} output array\n */\nfunction getMatrixData(a, b) {\n return b.name == 'matrix' ? a.concat(b.data.slice(0, 4)) : a;\n}\n\n/**\n * Returns number of digits after the point. 0.125 → 3\n */\nfunction floatDigits(n) {\n return (n = String(n)).slice(n.indexOf('.')).length - 1;\n}\n\n/**\n * Convert transforms to the shorthand alternatives.\n *\n * @param {Array} transforms input array\n * @param {Object} params plugin params\n * @return {Array} output array\n */\nfunction convertToShorts(transforms, params) {\n\n for(var i = 0; i < transforms.length; i++) {\n\n var transform = transforms[i];\n\n // convert matrix to the short aliases\n if (\n params.matrixToTransform &&\n transform.name === 'matrix'\n ) {\n var decomposed = matrixToTransform(transform, params);\n if (decomposed != transform &&\n js2transform(decomposed, params).length <= js2transform([transform], params).length) {\n\n transforms.splice.apply(transforms, [i, 1].concat(decomposed));\n }\n transform = transforms[i];\n }\n\n // fixed-point numbers\n // 12.754997 → 12.755\n roundTransform(transform);\n\n // convert long translate transform notation to the shorts one\n // translate(10 0) → translate(10)\n if (\n params.shortTranslate &&\n transform.name === 'translate' &&\n transform.data.length === 2 &&\n !transform.data[1]\n ) {\n transform.data.pop();\n }\n\n // convert long scale transform notation to the shorts one\n // scale(2 2) → scale(2)\n if (\n params.shortScale &&\n transform.name === 'scale' &&\n transform.data.length === 2 &&\n transform.data[0] === transform.data[1]\n ) {\n transform.data.pop();\n }\n\n // convert long rotate transform notation to the short one\n // translate(cx cy) rotate(a) translate(-cx -cy) → rotate(a cx cy)\n if (\n params.shortRotate &&\n transforms[i - 2] &&\n transforms[i - 2].name === 'translate' &&\n transforms[i - 1].name === 'rotate' &&\n transforms[i].name === 'translate' &&\n transforms[i - 2].data[0] === -transforms[i].data[0] &&\n transforms[i - 2].data[1] === -transforms[i].data[1]\n ) {\n transforms.splice(i - 2, 3, {\n name: 'rotate',\n data: [\n transforms[i - 1].data[0],\n transforms[i - 2].data[0],\n transforms[i - 2].data[1]\n ]\n });\n\n // splice compensation\n i -= 2;\n\n transform = transforms[i];\n }\n\n }\n\n return transforms;\n\n}\n\n/**\n * Remove useless transforms.\n *\n * @param {Array} transforms input array\n * @return {Array} output array\n */\nfunction removeUseless(transforms) {\n\n return transforms.filter(function(transform) {\n\n // translate(0), rotate(0[, cx, cy]), skewX(0), skewY(0)\n if (\n ['translate', 'rotate', 'skewX', 'skewY'].indexOf(transform.name) > -1 &&\n (transform.data.length == 1 || transform.name == 'rotate') &&\n !transform.data[0] ||\n\n // translate(0, 0)\n transform.name == 'translate' &&\n !transform.data[0] &&\n !transform.data[1] ||\n\n // scale(1)\n transform.name == 'scale' &&\n transform.data[0] == 1 &&\n (transform.data.length < 2 || transform.data[1] == 1) ||\n\n // matrix(1 0 0 1 0 0)\n transform.name == 'matrix' &&\n transform.data[0] == 1 &&\n transform.data[3] == 1 &&\n !(transform.data[1] || transform.data[2] || transform.data[4] || transform.data[5])\n ) {\n return false;\n }\n\n return true;\n\n });\n\n}\n\n/**\n * Convert transforms JS representation to string.\n *\n * @param {Array} transformJS JS representation array\n * @param {Object} params plugin params\n * @return {String} output string\n */\nfunction js2transform(transformJS, params) {\n\n var transformString = '';\n\n // collect output value string\n transformJS.forEach(function(transform) {\n roundTransform(transform);\n transformString += (transformString && ' ') + transform.name + '(' + cleanupOutData(transform.data, params) + ')';\n });\n\n return transformString;\n\n}\n\nfunction roundTransform(transform) {\n switch (transform.name) {\n case 'translate':\n transform.data = floatRound(transform.data);\n break;\n case 'rotate':\n transform.data = degRound(transform.data.slice(0, 1)).concat(floatRound(transform.data.slice(1)));\n break;\n case 'skewX':\n case 'skewY':\n transform.data = degRound(transform.data);\n break;\n case 'scale':\n transform.data = transformRound(transform.data);\n break;\n case 'matrix':\n transform.data = transformRound(transform.data.slice(0, 4)).concat(floatRound(transform.data.slice(4)));\n break;\n }\n return transform;\n}\n\n/**\n * Rounds numbers in array.\n *\n * @param {Array} data input data array\n * @return {Array} output data array\n */\nfunction round(data) {\n return data.map(Math.round);\n}\n\n/**\n * Decrease accuracy of floating-point numbers\n * in transforms keeping a specified number of decimals.\n * Smart rounds values like 2.349 to 2.35.\n *\n * @param {Number} fixed number of decimals\n * @param {Array} data input data array\n * @return {Array} output data array\n */\nfunction smartRound(precision, data) {\n for (var i = data.length, tolerance = +Math.pow(.1, precision).toFixed(precision); i--;) {\n if (data[i].toFixed(precision) != data[i]) {\n var rounded = +data[i].toFixed(precision - 1);\n data[i] = +Math.abs(rounded - data[i]).toFixed(precision + 1) >= tolerance ?\n +data[i].toFixed(precision) :\n rounded;\n }\n }\n return data;\n}\n","\"use strict\";\nimport '../utils/node-globals/global';\nimport svg2js from 'svgo/lib/svgo/svg2js';\nimport js2svg from 'svgo/lib/svgo/js2svg';\nimport JSAPI from 'svgo/lib/svgo/jsAPI';\nimport CSSClassList from 'svgo/lib/svgo/css-class-list';\nimport CSSStyleDeclaration from 'svgo/lib/svgo/css-style-declaration';\nimport plugins from 'svgo/lib/svgo/plugins';\n\nimport removeDoctype from 'svgo/plugins/removeDoctype';\nimport removeXMLProcInst from 'svgo/plugins/removeXMLProcInst';\nimport removeComments from 'svgo/plugins/removeComments';\nimport removeMetadata from 'svgo/plugins/removeMetadata';\nimport removeXMLNS from 'svgo/plugins/removeXMLNS';\nimport removeEditorsNSData from 'svgo/plugins/removeEditorsNSData';\nimport cleanupAttrs from 'svgo/plugins/cleanupAttrs';\nimport inlineStyles from 'svgo/plugins/inlineStyles';\nimport minifyStyles from 'svgo/plugins/minifyStyles';\nimport convertStyleToAttrs from 'svgo/plugins/convertStyleToAttrs';\nimport cleanupIDs from 'svgo/plugins/cleanupIDs';\nimport removeRasterImages from 'svgo/plugins/removeRasterImages';\nimport removeUselessDefs from 'svgo/plugins/removeUselessDefs';\nimport cleanupNumericValues from 'svgo/plugins/cleanupNumericValues';\nimport cleanupListOfValues from 'svgo/plugins/cleanupListOfValues';\nimport convertColors from 'svgo/plugins/convertColors';\nimport removeUnknownsAndDefaults from 'svgo/plugins/removeUnknownsAndDefaults';\nimport removeNonInheritableGroupAttrs from 'svgo/plugins/removeNonInheritableGroupAttrs';\nimport removeUselessStrokeAndFill from 'svgo/plugins/removeUselessStrokeAndFill';\nimport removeViewBox from 'svgo/plugins/removeViewBox';\nimport cleanupEnableBackground from 'svgo/plugins/cleanupEnableBackground';\nimport removeHiddenElems from 'svgo/plugins/removeHiddenElems';\nimport removeEmptyText from 'svgo/plugins/removeEmptyText';\nimport convertShapeToPath from 'svgo/plugins/convertShapeToPath';\nimport moveElemsAttrsToGroup from 'svgo/plugins/moveElemsAttrsToGroup';\nimport moveGroupAttrsToElems from 'svgo/plugins/moveGroupAttrsToElems';\nimport collapseGroups from 'svgo/plugins/collapseGroups';\nimport convertPathData from 'svgo/plugins/convertPathData';\nimport convertTransform from 'svgo/plugins/convertTransform';\nimport removeEmptyAttrs from 'svgo/plugins/removeEmptyAttrs';\nimport removeEmptyContainers from 'svgo/plugins/removeEmptyContainers';\nimport mergePaths from 'svgo/plugins/mergePaths';\nimport removeUnusedNS from 'svgo/plugins/removeUnusedNS';\nimport sortAttrs from 'svgo/plugins/sortAttrs';\nimport removeTitle from 'svgo/plugins/removeTitle';\nimport removeDesc from 'svgo/plugins/removeDesc';\nimport removeDimensions from 'svgo/plugins/removeDimensions';\nimport removeStyleElement from 'svgo/plugins/removeStyleElement';\nimport removeScriptElement from 'svgo/plugins/removeScriptElement';\n\n// the order is from https://github.com/svg/svgo/blob/master/.svgo.yml\n// Some are commented out if they have no default action.\nconst pluginsData = {\n removeDoctype,\n removeXMLProcInst,\n removeComments,\n removeMetadata,\n removeXMLNS,\n removeEditorsNSData,\n cleanupAttrs,\n inlineStyles,\n minifyStyles,\n convertStyleToAttrs,\n cleanupIDs,\n //prefixIds,\n removeRasterImages,\n removeUselessDefs,\n cleanupNumericValues,\n cleanupListOfValues,\n convertColors,\n removeUnknownsAndDefaults,\n removeNonInheritableGroupAttrs,\n removeUselessStrokeAndFill,\n removeViewBox,\n cleanupEnableBackground,\n removeHiddenElems,\n removeEmptyText,\n convertShapeToPath,\n moveElemsAttrsToGroup,\n moveGroupAttrsToElems,\n collapseGroups,\n convertPathData,\n convertTransform,\n removeEmptyAttrs,\n removeEmptyContainers,\n mergePaths,\n removeUnusedNS,\n sortAttrs,\n removeTitle,\n removeDesc,\n removeDimensions,\n //removeAttrs,\n //removeElementsByAttr,\n //addClassesToSVGElement,\n removeStyleElement,\n removeScriptElement,\n //addAttributesToSVGElement,\n};\n\n// Clone is currently broken. Hack it:\nfunction cloneParsedSvg(svg) {\n const clones = new Map();\n\n function cloneKeys(target, obj) {\n for (const key of Object.keys(obj)) {\n target[key] = clone(obj[key]);\n }\n return target;\n }\n\n function clone(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n if (clones.has(obj)) {\n return clones.get(obj);\n }\n\n let objClone;\n\n if (obj.constructor === JSAPI) {\n objClone = new JSAPI({}, obj.parentNode);\n clones.set(obj, objClone);\n\n if (obj.parentNode) {\n objClone.parentNode = clone(obj.parentNode);\n }\n cloneKeys(objClone, obj);\n }\n else if (\n obj.constructor === CSSClassList ||\n obj.constructor === CSSStyleDeclaration ||\n obj.constructor === Object ||\n obj.constructor === Array\n ) {\n objClone = new obj.constructor();\n clones.set(obj, objClone);\n cloneKeys(objClone, obj);\n }\n else if (obj.constructor === Map) {\n objClone = new Map();\n clones.set(obj, objClone);\n\n for (const [key, val] of obj) {\n objClone.set(clone(key), clone(val));\n }\n }\n else if (obj.constructor === Set) {\n objClone = new Set();\n clones.set(obj, objClone);\n\n for (const val of obj) {\n objClone.add(clone(val));\n }\n }\n else {\n throw Error('unexpected type');\n }\n\n return objClone;\n }\n\n return clone(svg);\n}\n\n// Arrange plugins by type - this is what plugins() expects\nfunction optimizePluginsArray(plugins) {\n return plugins.map(item => [item]).reduce((arr, item) => {\n const last = arr[arr.length - 1];\n\n if (last && item[0].type === last[0].type) {\n last.push(item[0]);\n }\n else {\n arr.push(item);\n }\n return arr;\n }, []);\n}\n\nconst optimisedPluginsData = optimizePluginsArray(Object.values(pluginsData));\n\nfunction getDimensions(parsedSvg) {\n const svgEl = parsedSvg.content.filter(el => el.isElem('svg'))[0];\n\n if (!svgEl) {\n return {};\n }\n\n if (svgEl.hasAttr('width') && svgEl.hasAttr('height')) {\n return {\n width: parseFloat(svgEl.attr('width').value),\n height: parseFloat(svgEl.attr('height').value)\n };\n }\n\n if (svgEl.hasAttr('viewBox')) {\n const viewBox = svgEl.attr('viewBox').value.split(/(?:,\\s*|\\s+)/);\n\n return {\n width: parseFloat(viewBox[2]),\n height: parseFloat(viewBox[3])\n };\n }\n\n return {};\n}\n\nfunction* multipassCompress(settings) {\n // activate/deactivate plugins\n Object.keys(settings.plugins).forEach(pluginName => {\n pluginsData[pluginName].active = settings.plugins[pluginName];\n });\n\n // Set floatPrecision across all the plugins\n const floatPrecision = Number(settings.floatPrecision);\n\n for (const plugin of Object.values(pluginsData)) {\n if (plugin.params && 'floatPrecision' in plugin.params) {\n plugin.params.floatPrecision = floatPrecision;\n }\n }\n\n const svg = cloneParsedSvg(parsedSvg);\n let svgData;\n let previousDataLength;\n\n while (svgData === undefined || svgData.length != previousDataLength) {\n previousDataLength = svgData && svgData.length;\n plugins(svg, {input: 'string'}, optimisedPluginsData);\n svgData = js2svg(svg, {\n indent: ' ',\n pretty: settings.pretty\n }).data;\n\n yield {\n data: svgData,\n dimensions: getDimensions(svg)\n };\n }\n}\n\nlet parsedSvg;\nlet multipassInstance;\n\nconst actions = {\n load({ data }) {\n svg2js(data, p => parsedSvg = p);\n\n if (parsedSvg.error) throw Error(parsedSvg.error);\n\n return getDimensions(parsedSvg);\n },\n process({ settings }) {\n multipassInstance = multipassCompress(settings);\n return multipassInstance.next().value;\n },\n nextPass() {\n return multipassInstance.next().value;\n }\n};\n\nself.onmessage = event => {\n try {\n self.postMessage({\n id: event.data.id,\n result: actions[event.data.action](event.data)\n });\n }\n catch (e) {\n self.postMessage({\n id: event.data.id,\n error: e.message\n });\n }\n};\n","'use strict';\n\nvar regTransformTypes = /matrix|translate|scale|rotate|skewX|skewY/,\n regTransformSplit = /\\s*(matrix|translate|scale|rotate|skewX|skewY)\\s*\\(\\s*(.+?)\\s*\\)[\\s,]*/,\n regNumericValues = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\n/**\n * Convert transform string to JS representation.\n *\n * @param {String} transformString input string\n * @param {Object} params plugin params\n * @return {Array} output array\n */\nexports.transform2js = function(transformString) {\n\n // JS representation of the transform data\n var transforms = [],\n // current transform context\n current;\n\n // split value into ['', 'translate', '10 50', '', 'scale', '2', '', 'rotate', '-45', '']\n transformString.split(regTransformSplit).forEach(function(item) {\n /*jshint -W084 */\n var num;\n\n if (item) {\n // if item is a translate function\n if (regTransformTypes.test(item)) {\n // then collect it and change current context\n transforms.push(current = { name: item });\n // else if item is data\n } else {\n // then split it into [10, 50] and collect as context.data\n while (num = regNumericValues.exec(item)) {\n num = Number(num);\n if (current.data)\n current.data.push(num);\n else\n current.data = [num];\n }\n }\n }\n });\n\n // return empty array if broken transform (no data)\n return current && current.data ? transforms : [];\n};\n\n/**\n * Multiply transforms into one.\n *\n * @param {Array} input transforms array\n * @return {Array} output matrix array\n */\nexports.transformsMultiply = function(transforms) {\n\n // convert transforms objects to the matrices\n transforms = transforms.map(function(transform) {\n if (transform.name === 'matrix') {\n return transform.data;\n }\n return transformToMatrix(transform);\n });\n\n // multiply all matrices into one\n transforms = {\n name: 'matrix',\n data: transforms.length > 0 ? transforms.reduce(multiplyTransformMatrices) : []\n };\n\n return transforms;\n\n};\n\n/**\n * Do math like a schoolgirl.\n *\n * @type {Object}\n */\nvar mth = exports.mth = {\n\n rad: function(deg) {\n return deg * Math.PI / 180;\n },\n\n deg: function(rad) {\n return rad * 180 / Math.PI;\n },\n\n cos: function(deg) {\n return Math.cos(this.rad(deg));\n },\n\n acos: function(val, floatPrecision) {\n return +(this.deg(Math.acos(val)).toFixed(floatPrecision));\n },\n\n sin: function(deg) {\n return Math.sin(this.rad(deg));\n },\n\n asin: function(val, floatPrecision) {\n return +(this.deg(Math.asin(val)).toFixed(floatPrecision));\n },\n\n tan: function(deg) {\n return Math.tan(this.rad(deg));\n },\n\n atan: function(val, floatPrecision) {\n return +(this.deg(Math.atan(val)).toFixed(floatPrecision));\n }\n\n};\n\n/**\n * Decompose matrix into simple transforms. See\n * http://www.maths-informatique-jeux.com/blog/frederic/?post/2013/12/01/Decomposition-of-2D-transform-matrices\n *\n * @param {Object} data matrix transform object\n * @return {Object|Array} transforms array or original transform object\n */\nexports.matrixToTransform = function(transform, params) {\n var floatPrecision = params.floatPrecision,\n data = transform.data,\n transforms = [],\n sx = +Math.sqrt(data[0] * data[0] + data[1] * data[1]).toFixed(params.transformPrecision),\n sy = +((data[0] * data[3] - data[1] * data[2]) / sx).toFixed(params.transformPrecision),\n colsSum = data[0] * data[2] + data[1] * data[3],\n rowsSum = data[0] * data[1] + data[2] * data[3],\n scaleBefore = rowsSum || +(sx == sy);\n\n // [..., ..., ..., ..., tx, ty] → translate(tx, ty)\n if (data[4] || data[5]) {\n transforms.push({ name: 'translate', data: data.slice(4, data[5] ? 6 : 5) });\n }\n\n // [sx, 0, tan(a)·sy, sy, 0, 0] → skewX(a)·scale(sx, sy)\n if (!data[1] && data[2]) {\n transforms.push({ name: 'skewX', data: [mth.atan(data[2] / sy, floatPrecision)] });\n\n // [sx, sx·tan(a), 0, sy, 0, 0] → skewY(a)·scale(sx, sy)\n } else if (data[1] && !data[2]) {\n transforms.push({ name: 'skewY', data: [mth.atan(data[1] / data[0], floatPrecision)] });\n sx = data[0];\n sy = data[3];\n\n // [sx·cos(a), sx·sin(a), sy·-sin(a), sy·cos(a), x, y] → rotate(a[, cx, cy])·(scale or skewX) or\n // [sx·cos(a), sy·sin(a), sx·-sin(a), sy·cos(a), x, y] → scale(sx, sy)·rotate(a[, cx, cy]) (if !scaleBefore)\n } else if (!colsSum || (sx == 1 && sy == 1) || !scaleBefore) {\n if (!scaleBefore) {\n sx = (data[0] < 0 ? -1 : 1) * Math.sqrt(data[0] * data[0] + data[2] * data[2]);\n sy = (data[3] < 0 ? -1 : 1) * Math.sqrt(data[1] * data[1] + data[3] * data[3]);\n transforms.push({ name: 'scale', data: [sx, sy] });\n }\n var rotate = [mth.acos(data[0] / sx, floatPrecision) * (data[1] * sy < 0 ? -1 : 1)];\n\n if (rotate[0]) transforms.push({ name: 'rotate', data: rotate });\n\n if (rowsSum && colsSum) transforms.push({\n name: 'skewX',\n data: [mth.atan(colsSum / (sx * sx), floatPrecision)]\n });\n\n // rotate(a, cx, cy) can consume translate() within optional arguments cx, cy (rotation point)\n if (rotate[0] && (data[4] || data[5])) {\n transforms.shift();\n var cos = data[0] / sx,\n sin = data[1] / (scaleBefore ? sx : sy),\n x = data[4] * (scaleBefore || sy),\n y = data[5] * (scaleBefore || sx),\n denom = (Math.pow(1 - cos, 2) + Math.pow(sin, 2)) * (scaleBefore || sx * sy);\n rotate.push(((1 - cos) * x - sin * y) / denom);\n rotate.push(((1 - cos) * y + sin * x) / denom);\n }\n\n // Too many transformations, return original matrix if it isn't just a scale/translate\n } else if (data[1] || data[2]) {\n return transform;\n }\n\n if (scaleBefore && (sx != 1 || sy != 1) || !transforms.length) transforms.push({\n name: 'scale',\n data: sx == sy ? [sx] : [sx, sy]\n });\n\n return transforms;\n};\n\n/**\n * Convert transform to the matrix data.\n *\n * @param {Object} transform transform object\n * @return {Array} matrix data\n */\nfunction transformToMatrix(transform) {\n\n if (transform.name === 'matrix') return transform.data;\n\n var matrix;\n\n switch (transform.name) {\n case 'translate':\n // [1, 0, 0, 1, tx, ty]\n matrix = [1, 0, 0, 1, transform.data[0], transform.data[1] || 0];\n break;\n case 'scale':\n // [sx, 0, 0, sy, 0, 0]\n matrix = [transform.data[0], 0, 0, transform.data[1] || transform.data[0], 0, 0];\n break;\n case 'rotate':\n // [cos(a), sin(a), -sin(a), cos(a), x, y]\n var cos = mth.cos(transform.data[0]),\n sin = mth.sin(transform.data[0]),\n cx = transform.data[1] || 0,\n cy = transform.data[2] || 0;\n\n matrix = [cos, sin, -sin, cos, (1 - cos) * cx + sin * cy, (1 - cos) * cy - sin * cx];\n break;\n case 'skewX':\n // [1, 0, tan(a), 1, 0, 0]\n matrix = [1, 0, mth.tan(transform.data[0]), 1, 0, 0];\n break;\n case 'skewY':\n // [1, tan(a), 0, 1, 0, 0]\n matrix = [1, mth.tan(transform.data[0]), 0, 1, 0, 0];\n break;\n }\n\n return matrix;\n\n}\n\n/**\n * Applies transformation to an arc. To do so, we represent ellipse as a matrix, multiply it\n * by the transformation matrix and use a singular value decomposition to represent in a form\n * rotate(θ)·scale(a b)·rotate(φ). This gives us new ellipse params a, b and θ.\n * SVD is being done with the formulae provided by Wolffram|Alpha (svd {{m0, m2}, {m1, m3}})\n *\n * @param {Array} arc [a, b, rotation in deg]\n * @param {Array} transform transformation matrix\n * @return {Array} arc transformed input arc\n */\nexports.transformArc = function(arc, transform) {\n\n var a = arc[0],\n b = arc[1],\n rot = arc[2] * Math.PI / 180,\n cos = Math.cos(rot),\n sin = Math.sin(rot),\n h = Math.pow(arc[5] * cos + arc[6] * sin, 2) / (4 * a * a) +\n Math.pow(arc[6] * cos - arc[5] * sin, 2) / (4 * b * b);\n if (h > 1) {\n h = Math.sqrt(h);\n a *= h;\n b *= h;\n }\n var ellipse = [a * cos, a * sin, -b * sin, b * cos, 0, 0],\n m = multiplyTransformMatrices(transform, ellipse),\n // Decompose the new ellipse matrix\n lastCol = m[2] * m[2] + m[3] * m[3],\n squareSum = m[0] * m[0] + m[1] * m[1] + lastCol,\n root = Math.sqrt(\n (Math.pow(m[0] - m[3], 2) + Math.pow(m[1] + m[2], 2)) *\n (Math.pow(m[0] + m[3], 2) + Math.pow(m[1] - m[2], 2))\n );\n\n if (!root) { // circle\n arc[0] = arc[1] = Math.sqrt(squareSum / 2);\n arc[2] = 0;\n } else {\n var majorAxisSqr = (squareSum + root) / 2,\n minorAxisSqr = (squareSum - root) / 2,\n major = Math.abs(majorAxisSqr - lastCol) > 1e-6,\n sub = (major ? majorAxisSqr : minorAxisSqr) - lastCol,\n rowsSum = m[0] * m[2] + m[1] * m[3],\n term1 = m[0] * sub + m[2] * rowsSum,\n term2 = m[1] * sub + m[3] * rowsSum;\n arc[0] = Math.sqrt(majorAxisSqr);\n arc[1] = Math.sqrt(minorAxisSqr);\n arc[2] = ((major ? term2 < 0 : term1 > 0) ? -1 : 1) *\n Math.acos((major ? term1 : term2) / Math.sqrt(term1 * term1 + term2 * term2)) * 180 / Math.PI;\n }\n\n if ((transform[0] < 0) !== (transform[3] < 0)) {\n // Flip the sweep flag if coordinates are being flipped horizontally XOR vertically\n arc[4] = 1 - arc[4];\n }\n\n return arc;\n\n};\n\n/**\n * Multiply transformation matrices.\n *\n * @param {Array} a matrix A data\n * @param {Array} b matrix B data\n * @return {Array} result\n */\nfunction multiplyTransformMatrices(a, b) {\n\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5]\n ];\n\n}\n","module.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n",";(function (sax) { // wrapper for non-node envs\n sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n sax.SAXParser = SAXParser\n sax.SAXStream = SAXStream\n sax.createStream = createStream\n\n // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n // since that's the earliest that a buffer overrun could occur. This way, checks are\n // as rare as required, but as often as necessary to ensure never crossing this bound.\n // Furthermore, buffers are only tested at most once per write(), so passing a very\n // large string into write() might have undesirable effects, but this is manageable by\n // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme\n // edge case, result in creating at most one complete copy of the string passed in.\n // Set to Infinity to have unlimited buffers.\n sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n var buffers = [\n 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n 'procInstName', 'procInstBody', 'entity', 'attribName',\n 'attribValue', 'cdata', 'script'\n ]\n\n sax.EVENTS = [\n 'text',\n 'processinginstruction',\n 'sgmldeclaration',\n 'doctype',\n 'comment',\n 'opentagstart',\n 'attribute',\n 'opentag',\n 'closetag',\n 'opencdata',\n 'cdata',\n 'closecdata',\n 'error',\n 'end',\n 'ready',\n 'script',\n 'opennamespace',\n 'closenamespace'\n ]\n\n function SAXParser (strict, opt) {\n if (!(this instanceof SAXParser)) {\n return new SAXParser(strict, opt)\n }\n\n var parser = this\n clearBuffers(parser)\n parser.q = parser.c = ''\n parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n parser.opt = opt || {}\n parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n parser.tags = []\n parser.closed = parser.closedRoot = parser.sawRoot = false\n parser.tag = parser.error = null\n parser.strict = !!strict\n parser.noscript = !!(strict || parser.opt.noscript)\n parser.state = S.BEGIN\n parser.strictEntities = parser.opt.strictEntities\n parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n parser.attribList = []\n\n // namespaces form a prototype chain.\n // it always points at the current tag,\n // which protos to its parent tag.\n if (parser.opt.xmlns) {\n parser.ns = Object.create(rootNS)\n }\n\n // mostly just for error reporting\n parser.trackPosition = parser.opt.position !== false\n if (parser.trackPosition) {\n parser.position = parser.line = parser.column = 0\n }\n emit(parser, 'onready')\n }\n\n if (!Object.create) {\n Object.create = function (o) {\n function F () {}\n F.prototype = o\n var newf = new F()\n return newf\n }\n }\n\n if (!Object.keys) {\n Object.keys = function (o) {\n var a = []\n for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n return a\n }\n }\n\n function checkBufferLength (parser) {\n var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n var maxActual = 0\n for (var i = 0, l = buffers.length; i < l; i++) {\n var len = parser[buffers[i]].length\n if (len > maxAllowed) {\n // Text/cdata nodes can get big, and since they're buffered,\n // we can get here under normal conditions.\n // Avoid issues by emitting the text node now,\n // so at least it won't get any bigger.\n switch (buffers[i]) {\n case 'textNode':\n closeText(parser)\n break\n\n case 'cdata':\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n break\n\n case 'script':\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n break\n\n default:\n error(parser, 'Max buffer length exceeded: ' + buffers[i])\n }\n }\n maxActual = Math.max(maxActual, len)\n }\n // schedule the next check for the earliest possible buffer overrun.\n var m = sax.MAX_BUFFER_LENGTH - maxActual\n parser.bufferCheckPosition = m + parser.position\n }\n\n function clearBuffers (parser) {\n for (var i = 0, l = buffers.length; i < l; i++) {\n parser[buffers[i]] = ''\n }\n }\n\n function flushBuffers (parser) {\n closeText(parser)\n if (parser.cdata !== '') {\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n }\n if (parser.script !== '') {\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n }\n\n SAXParser.prototype = {\n end: function () { end(this) },\n write: write,\n resume: function () { this.error = null; return this },\n close: function () { return this.write(null) },\n flush: function () { flushBuffers(this) }\n }\n\n var Stream\n try {\n Stream = require('stream').Stream\n } catch (ex) {\n Stream = function () {}\n }\n\n var streamWraps = sax.EVENTS.filter(function (ev) {\n return ev !== 'error' && ev !== 'end'\n })\n\n function createStream (strict, opt) {\n return new SAXStream(strict, opt)\n }\n\n function SAXStream (strict, opt) {\n if (!(this instanceof SAXStream)) {\n return new SAXStream(strict, opt)\n }\n\n Stream.apply(this)\n\n this._parser = new SAXParser(strict, opt)\n this.writable = true\n this.readable = true\n\n var me = this\n\n this._parser.onend = function () {\n me.emit('end')\n }\n\n this._parser.onerror = function (er) {\n me.emit('error', er)\n\n // if didn't throw, then means error was handled.\n // go ahead and clear error, so we can write again.\n me._parser.error = null\n }\n\n this._decoder = null\n\n streamWraps.forEach(function (ev) {\n Object.defineProperty(me, 'on' + ev, {\n get: function () {\n return me._parser['on' + ev]\n },\n set: function (h) {\n if (!h) {\n me.removeAllListeners(ev)\n me._parser['on' + ev] = h\n return h\n }\n me.on(ev, h)\n },\n enumerable: true,\n configurable: false\n })\n })\n }\n\n SAXStream.prototype = Object.create(Stream.prototype, {\n constructor: {\n value: SAXStream\n }\n })\n\n SAXStream.prototype.write = function (data) {\n if (typeof Buffer === 'function' &&\n typeof Buffer.isBuffer === 'function' &&\n Buffer.isBuffer(data)) {\n if (!this._decoder) {\n var SD = require('string_decoder').StringDecoder\n this._decoder = new SD('utf8')\n }\n data = this._decoder.write(data)\n }\n\n this._parser.write(data.toString())\n this.emit('data', data)\n return true\n }\n\n SAXStream.prototype.end = function (chunk) {\n if (chunk && chunk.length) {\n this.write(chunk)\n }\n this._parser.end()\n return true\n }\n\n SAXStream.prototype.on = function (ev, handler) {\n var me = this\n if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n me._parser['on' + ev] = function () {\n var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n args.splice(0, 0, ev)\n me.emit.apply(me, args)\n }\n }\n\n return Stream.prototype.on.call(me, ev, handler)\n }\n\n // this really needs to be replaced with character classes.\n // XML allows all manner of ridiculous numbers and digits.\n var CDATA = '[CDATA['\n var DOCTYPE = 'DOCTYPE'\n var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n // This implementation works on strings, a single character at a time\n // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n // without a significant breaking change to either this parser, or the\n // JavaScript language. Implementation of an emoji-capable xml parser\n // is left as an exercise for the reader.\n var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n function isWhitespace (c) {\n return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n }\n\n function isQuote (c) {\n return c === '\"' || c === '\\''\n }\n\n function isAttribEnd (c) {\n return c === '>' || isWhitespace(c)\n }\n\n function isMatch (regex, c) {\n return regex.test(c)\n }\n\n function notMatch (regex, c) {\n return !isMatch(regex, c)\n }\n\n var S = 0\n sax.STATE = {\n BEGIN: S++, // leading byte order mark or whitespace\n BEGIN_WHITESPACE: S++, // leading whitespace\n TEXT: S++, // general stuff\n TEXT_ENTITY: S++, // &amp and such.\n OPEN_WAKA: S++, // <\n SGML_DECL: S++, // <!BLARG\n SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n DOCTYPE: S++, // <!DOCTYPE\n DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n COMMENT_STARTING: S++, // <!-\n COMMENT: S++, // <!--\n COMMENT_ENDING: S++, // <!-- blah -\n COMMENT_ENDED: S++, // <!-- blah --\n CDATA: S++, // <![CDATA[ something\n CDATA_ENDING: S++, // ]\n CDATA_ENDING_2: S++, // ]]\n PROC_INST: S++, // <?hi\n PROC_INST_BODY: S++, // <?hi there\n PROC_INST_ENDING: S++, // <?hi \"there\" ?\n OPEN_TAG: S++, // <strong\n OPEN_TAG_SLASH: S++, // <strong /\n ATTRIB: S++, // <a\n ATTRIB_NAME: S++, // <a foo\n ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n ATTRIB_VALUE: S++, // <a foo=\n ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\"&quot;\"\n ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot\n CLOSE_TAG: S++, // </a\n CLOSE_TAG_SAW_WHITE: S++, // </a >\n SCRIPT: S++, // <script> ...\n SCRIPT_ENDING: S++ // <script> ... <\n }\n\n sax.XML_ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\"\n }\n\n sax.ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\",\n 'AElig': 198,\n 'Aacute': 193,\n 'Acirc': 194,\n 'Agrave': 192,\n 'Aring': 197,\n 'Atilde': 195,\n 'Auml': 196,\n 'Ccedil': 199,\n 'ETH': 208,\n 'Eacute': 201,\n 'Ecirc': 202,\n 'Egrave': 200,\n 'Euml': 203,\n 'Iacute': 205,\n 'Icirc': 206,\n 'Igrave': 204,\n 'Iuml': 207,\n 'Ntilde': 209,\n 'Oacute': 211,\n 'Ocirc': 212,\n 'Ograve': 210,\n 'Oslash': 216,\n 'Otilde': 213,\n 'Ouml': 214,\n 'THORN': 222,\n 'Uacute': 218,\n 'Ucirc': 219,\n 'Ugrave': 217,\n 'Uuml': 220,\n 'Yacute': 221,\n 'aacute': 225,\n 'acirc': 226,\n 'aelig': 230,\n 'agrave': 224,\n 'aring': 229,\n 'atilde': 227,\n 'auml': 228,\n 'ccedil': 231,\n 'eacute': 233,\n 'ecirc': 234,\n 'egrave': 232,\n 'eth': 240,\n 'euml': 235,\n 'iacute': 237,\n 'icirc': 238,\n 'igrave': 236,\n 'iuml': 239,\n 'ntilde': 241,\n 'oacute': 243,\n 'ocirc': 244,\n 'ograve': 242,\n 'oslash': 248,\n 'otilde': 245,\n 'ouml': 246,\n 'szlig': 223,\n 'thorn': 254,\n 'uacute': 250,\n 'ucirc': 251,\n 'ugrave': 249,\n 'uuml': 252,\n 'yacute': 253,\n 'yuml': 255,\n 'copy': 169,\n 'reg': 174,\n 'nbsp': 160,\n 'iexcl': 161,\n 'cent': 162,\n 'pound': 163,\n 'curren': 164,\n 'yen': 165,\n 'brvbar': 166,\n 'sect': 167,\n 'uml': 168,\n 'ordf': 170,\n 'laquo': 171,\n 'not': 172,\n 'shy': 173,\n 'macr': 175,\n 'deg': 176,\n 'plusmn': 177,\n 'sup1': 185,\n 'sup2': 178,\n 'sup3': 179,\n 'acute': 180,\n 'micro': 181,\n 'para': 182,\n 'middot': 183,\n 'cedil': 184,\n 'ordm': 186,\n 'raquo': 187,\n 'frac14': 188,\n 'frac12': 189,\n 'frac34': 190,\n 'iquest': 191,\n 'times': 215,\n 'divide': 247,\n 'OElig': 338,\n 'oelig': 339,\n 'Scaron': 352,\n 'scaron': 353,\n 'Yuml': 376,\n 'fnof': 402,\n 'circ': 710,\n 'tilde': 732,\n 'Alpha': 913,\n 'Beta': 914,\n 'Gamma': 915,\n 'Delta': 916,\n 'Epsilon': 917,\n 'Zeta': 918,\n 'Eta': 919,\n 'Theta': 920,\n 'Iota': 921,\n 'Kappa': 922,\n 'Lambda': 923,\n 'Mu': 924,\n 'Nu': 925,\n 'Xi': 926,\n 'Omicron': 927,\n 'Pi': 928,\n 'Rho': 929,\n 'Sigma': 931,\n 'Tau': 932,\n 'Upsilon': 933,\n 'Phi': 934,\n 'Chi': 935,\n 'Psi': 936,\n 'Omega': 937,\n 'alpha': 945,\n 'beta': 946,\n 'gamma': 947,\n 'delta': 948,\n 'epsilon': 949,\n 'zeta': 950,\n 'eta': 951,\n 'theta': 952,\n 'iota': 953,\n 'kappa': 954,\n 'lambda': 955,\n 'mu': 956,\n 'nu': 957,\n 'xi': 958,\n 'omicron': 959,\n 'pi': 960,\n 'rho': 961,\n 'sigmaf': 962,\n 'sigma': 963,\n 'tau': 964,\n 'upsilon': 965,\n 'phi': 966,\n 'chi': 967,\n 'psi': 968,\n 'omega': 969,\n 'thetasym': 977,\n 'upsih': 978,\n 'piv': 982,\n 'ensp': 8194,\n 'emsp': 8195,\n 'thinsp': 8201,\n 'zwnj': 8204,\n 'zwj': 8205,\n 'lrm': 8206,\n 'rlm': 8207,\n 'ndash': 8211,\n 'mdash': 8212,\n 'lsquo': 8216,\n 'rsquo': 8217,\n 'sbquo': 8218,\n 'ldquo': 8220,\n 'rdquo': 8221,\n 'bdquo': 8222,\n 'dagger': 8224,\n 'Dagger': 8225,\n 'bull': 8226,\n 'hellip': 8230,\n 'permil': 8240,\n 'prime': 8242,\n 'Prime': 8243,\n 'lsaquo': 8249,\n 'rsaquo': 8250,\n 'oline': 8254,\n 'frasl': 8260,\n 'euro': 8364,\n 'image': 8465,\n 'weierp': 8472,\n 'real': 8476,\n 'trade': 8482,\n 'alefsym': 8501,\n 'larr': 8592,\n 'uarr': 8593,\n 'rarr': 8594,\n 'darr': 8595,\n 'harr': 8596,\n 'crarr': 8629,\n 'lArr': 8656,\n 'uArr': 8657,\n 'rArr': 8658,\n 'dArr': 8659,\n 'hArr': 8660,\n 'forall': 8704,\n 'part': 8706,\n 'exist': 8707,\n 'empty': 8709,\n 'nabla': 8711,\n 'isin': 8712,\n 'notin': 8713,\n 'ni': 8715,\n 'prod': 8719,\n 'sum': 8721,\n 'minus': 8722,\n 'lowast': 8727,\n 'radic': 8730,\n 'prop': 8733,\n 'infin': 8734,\n 'ang': 8736,\n 'and': 8743,\n 'or': 8744,\n 'cap': 8745,\n 'cup': 8746,\n 'int': 8747,\n 'there4': 8756,\n 'sim': 8764,\n 'cong': 8773,\n 'asymp': 8776,\n 'ne': 8800,\n 'equiv': 8801,\n 'le': 8804,\n 'ge': 8805,\n 'sub': 8834,\n 'sup': 8835,\n 'nsub': 8836,\n 'sube': 8838,\n 'supe': 8839,\n 'oplus': 8853,\n 'otimes': 8855,\n 'perp': 8869,\n 'sdot': 8901,\n 'lceil': 8968,\n 'rceil': 8969,\n 'lfloor': 8970,\n 'rfloor': 8971,\n 'lang': 9001,\n 'rang': 9002,\n 'loz': 9674,\n 'spades': 9824,\n 'clubs': 9827,\n 'hearts': 9829,\n 'diams': 9830\n }\n\n Object.keys(sax.ENTITIES).forEach(function (key) {\n var e = sax.ENTITIES[key]\n var s = typeof e === 'number' ? String.fromCharCode(e) : e\n sax.ENTITIES[key] = s\n })\n\n for (var s in sax.STATE) {\n sax.STATE[sax.STATE[s]] = s\n }\n\n // shorthand\n S = sax.STATE\n\n function emit (parser, event, data) {\n parser[event] && parser[event](data)\n }\n\n function emitNode (parser, nodeType, data) {\n if (parser.textNode) closeText(parser)\n emit(parser, nodeType, data)\n }\n\n function closeText (parser) {\n parser.textNode = textopts(parser.opt, parser.textNode)\n if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n parser.textNode = ''\n }\n\n function textopts (opt, text) {\n if (opt.trim) text = text.trim()\n if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n return text\n }\n\n function error (parser, er) {\n closeText(parser)\n if (parser.trackPosition) {\n er += '\\nLine: ' + parser.line +\n '\\nColumn: ' + parser.column +\n '\\nChar: ' + parser.c\n }\n er = new Error(er)\n parser.error = er\n emit(parser, 'onerror', er)\n return parser\n }\n\n function end (parser) {\n if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n if ((parser.state !== S.BEGIN) &&\n (parser.state !== S.BEGIN_WHITESPACE) &&\n (parser.state !== S.TEXT)) {\n error(parser, 'Unexpected end')\n }\n closeText(parser)\n parser.c = ''\n parser.closed = true\n emit(parser, 'onend')\n SAXParser.call(parser, parser.strict, parser.opt)\n return parser\n }\n\n function strictFail (parser, message) {\n if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n throw new Error('bad call to strictFail')\n }\n if (parser.strict) {\n error(parser, message)\n }\n }\n\n function newTag (parser) {\n if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n var parent = parser.tags[parser.tags.length - 1] || parser\n var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n if (parser.opt.xmlns) {\n tag.ns = parent.ns\n }\n parser.attribList.length = 0\n emitNode(parser, 'onopentagstart', tag)\n }\n\n function qname (name, attribute) {\n var i = name.indexOf(':')\n var qualName = i < 0 ? [ '', name ] : name.split(':')\n var prefix = qualName[0]\n var local = qualName[1]\n\n // <x \"xmlns\"=\"http://foo\">\n if (attribute && name === 'xmlns') {\n prefix = 'xmlns'\n local = ''\n }\n\n return { prefix: prefix, local: local }\n }\n\n function attrib (parser) {\n if (!parser.strict) {\n parser.attribName = parser.attribName[parser.looseCase]()\n }\n\n if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n parser.attribName = parser.attribValue = ''\n return\n }\n\n if (parser.opt.xmlns) {\n var qn = qname(parser.attribName, true)\n var prefix = qn.prefix\n var local = qn.local\n\n if (prefix === 'xmlns') {\n // namespace binding attribute. push the binding into scope\n if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n strictFail(parser,\n 'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n strictFail(parser,\n 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else {\n var tag = parser.tag\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns === parent.ns) {\n tag.ns = Object.create(parent.ns)\n }\n tag.ns[local] = parser.attribValue\n }\n }\n\n // defer onattribute events until all attributes have been seen\n // so any new bindings can take effect. preserve attribute order\n // so deferred events can be emitted in document order\n parser.attribList.push([parser.attribName, parser.attribValue])\n } else {\n // in non-xmlns mode, we can emit the event right away\n parser.tag.attributes[parser.attribName] = parser.attribValue\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: parser.attribValue\n })\n }\n\n parser.attribName = parser.attribValue = ''\n }\n\n function openTag (parser, selfClosing) {\n if (parser.opt.xmlns) {\n // emit namespace binding events\n var tag = parser.tag\n\n // add namespace info to tag\n var qn = qname(parser.tagName)\n tag.prefix = qn.prefix\n tag.local = qn.local\n tag.uri = tag.ns[qn.prefix] || ''\n\n if (tag.prefix && !tag.uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(parser.tagName))\n tag.uri = qn.prefix\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns && parent.ns !== tag.ns) {\n Object.keys(tag.ns).forEach(function (p) {\n emitNode(parser, 'onopennamespace', {\n prefix: p,\n uri: tag.ns[p]\n })\n })\n }\n\n // handle deferred onattribute events\n // Note: do not apply default ns to attributes:\n // http://www.w3.org/TR/REC-xml-names/#defaulting\n for (var i = 0, l = parser.attribList.length; i < l; i++) {\n var nv = parser.attribList[i]\n var name = nv[0]\n var value = nv[1]\n var qualName = qname(name, true)\n var prefix = qualName.prefix\n var local = qualName.local\n var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n var a = {\n name: name,\n value: value,\n prefix: prefix,\n local: local,\n uri: uri\n }\n\n // if there's any attributes with an undefined namespace,\n // then fail on them now.\n if (prefix && prefix !== 'xmlns' && !uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(prefix))\n a.uri = prefix\n }\n parser.tag.attributes[name] = a\n emitNode(parser, 'onattribute', a)\n }\n parser.attribList.length = 0\n }\n\n parser.tag.isSelfClosing = !!selfClosing\n\n // process the tag\n parser.sawRoot = true\n parser.tags.push(parser.tag)\n emitNode(parser, 'onopentag', parser.tag)\n if (!selfClosing) {\n // special case for <script> in non-strict mode.\n if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n parser.state = S.SCRIPT\n } else {\n parser.state = S.TEXT\n }\n parser.tag = null\n parser.tagName = ''\n }\n parser.attribName = parser.attribValue = ''\n parser.attribList.length = 0\n }\n\n function closeTag (parser) {\n if (!parser.tagName) {\n strictFail(parser, 'Weird empty close tag.')\n parser.textNode += '</>'\n parser.state = S.TEXT\n return\n }\n\n if (parser.script) {\n if (parser.tagName !== 'script') {\n parser.script += '</' + parser.tagName + '>'\n parser.tagName = ''\n parser.state = S.SCRIPT\n return\n }\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n\n // first make sure that the closing tag actually exists.\n // <a><b></c></b></a> will close everything, otherwise.\n var t = parser.tags.length\n var tagName = parser.tagName\n if (!parser.strict) {\n tagName = tagName[parser.looseCase]()\n }\n var closeTo = tagName\n while (t--) {\n var close = parser.tags[t]\n if (close.name !== closeTo) {\n // fail the first time in strict mode\n strictFail(parser, 'Unexpected close tag')\n } else {\n break\n }\n }\n\n // didn't find it. we already failed for strict, so just abort.\n if (t < 0) {\n strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n parser.textNode += '</' + parser.tagName + '>'\n parser.state = S.TEXT\n return\n }\n parser.tagName = tagName\n var s = parser.tags.length\n while (s-- > t) {\n var tag = parser.tag = parser.tags.pop()\n parser.tagName = parser.tag.name\n emitNode(parser, 'onclosetag', parser.tagName)\n\n var x = {}\n for (var i in tag.ns) {\n x[i] = tag.ns[i]\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (parser.opt.xmlns && tag.ns !== parent.ns) {\n // remove namespace bindings introduced by tag\n Object.keys(tag.ns).forEach(function (p) {\n var n = tag.ns[p]\n emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n })\n }\n }\n if (t === 0) parser.closedRoot = true\n parser.tagName = parser.attribValue = parser.attribName = ''\n parser.attribList.length = 0\n parser.state = S.TEXT\n }\n\n function parseEntity (parser) {\n var entity = parser.entity\n var entityLC = entity.toLowerCase()\n var num\n var numStr = ''\n\n if (parser.ENTITIES[entity]) {\n return parser.ENTITIES[entity]\n }\n if (parser.ENTITIES[entityLC]) {\n return parser.ENTITIES[entityLC]\n }\n entity = entityLC\n if (entity.charAt(0) === '#') {\n if (entity.charAt(1) === 'x') {\n entity = entity.slice(2)\n num = parseInt(entity, 16)\n numStr = num.toString(16)\n } else {\n entity = entity.slice(1)\n num = parseInt(entity, 10)\n numStr = num.toString(10)\n }\n }\n entity = entity.replace(/^0+/, '')\n if (isNaN(num) || numStr.toLowerCase() !== entity) {\n strictFail(parser, 'Invalid character entity')\n return '&' + parser.entity + ';'\n }\n\n return String.fromCodePoint(num)\n }\n\n function beginWhiteSpace (parser, c) {\n if (c === '<') {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else if (!isWhitespace(c)) {\n // have to process this as a text node.\n // weird, but happens.\n strictFail(parser, 'Non-whitespace before first tag.')\n parser.textNode = c\n parser.state = S.TEXT\n }\n }\n\n function charAt (chunk, i) {\n var result = ''\n if (i < chunk.length) {\n result = chunk.charAt(i)\n }\n return result\n }\n\n function write (chunk) {\n var parser = this\n if (this.error) {\n throw this.error\n }\n if (parser.closed) {\n return error(parser,\n 'Cannot write after close. Assign an onready handler.')\n }\n if (chunk === null) {\n return end(parser)\n }\n if (typeof chunk === 'object') {\n chunk = chunk.toString()\n }\n var i = 0\n var c = ''\n while (true) {\n c = charAt(chunk, i++)\n parser.c = c\n\n if (!c) {\n break\n }\n\n if (parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n\n switch (parser.state) {\n case S.BEGIN:\n parser.state = S.BEGIN_WHITESPACE\n if (c === '\\uFEFF') {\n continue\n }\n beginWhiteSpace(parser, c)\n continue\n\n case S.BEGIN_WHITESPACE:\n beginWhiteSpace(parser, c)\n continue\n\n case S.TEXT:\n if (parser.sawRoot && !parser.closedRoot) {\n var starti = i - 1\n while (c && c !== '<' && c !== '&') {\n c = charAt(chunk, i++)\n if (c && parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n }\n parser.textNode += chunk.substring(starti, i - 1)\n }\n if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else {\n if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {\n strictFail(parser, 'Text data outside of root node.')\n }\n if (c === '&') {\n parser.state = S.TEXT_ENTITY\n } else {\n parser.textNode += c\n }\n }\n continue\n\n case S.SCRIPT:\n // only non-strict\n if (c === '<') {\n parser.state = S.SCRIPT_ENDING\n } else {\n parser.script += c\n }\n continue\n\n case S.SCRIPT_ENDING:\n if (c === '/') {\n parser.state = S.CLOSE_TAG\n } else {\n parser.script += '<' + c\n parser.state = S.SCRIPT\n }\n continue\n\n case S.OPEN_WAKA:\n // either a /, ?, !, or text is coming next.\n if (c === '!') {\n parser.state = S.SGML_DECL\n parser.sgmlDecl = ''\n } else if (isWhitespace(c)) {\n // wait for it...\n } else if (isMatch(nameStart, c)) {\n parser.state = S.OPEN_TAG\n parser.tagName = c\n } else if (c === '/') {\n parser.state = S.CLOSE_TAG\n parser.tagName = ''\n } else if (c === '?') {\n parser.state = S.PROC_INST\n parser.procInstName = parser.procInstBody = ''\n } else {\n strictFail(parser, 'Unencoded <')\n // if there was some whitespace, then add that in.\n if (parser.startTagPosition + 1 < parser.position) {\n var pad = parser.position - parser.startTagPosition\n c = new Array(pad).join(' ') + c\n }\n parser.textNode += '<' + c\n parser.state = S.TEXT\n }\n continue\n\n case S.SGML_DECL:\n if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n emitNode(parser, 'onopencdata')\n parser.state = S.CDATA\n parser.sgmlDecl = ''\n parser.cdata = ''\n } else if (parser.sgmlDecl + c === '--') {\n parser.state = S.COMMENT\n parser.comment = ''\n parser.sgmlDecl = ''\n } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n parser.state = S.DOCTYPE\n if (parser.doctype || parser.sawRoot) {\n strictFail(parser,\n 'Inappropriately located doctype declaration')\n }\n parser.doctype = ''\n parser.sgmlDecl = ''\n } else if (c === '>') {\n emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n parser.sgmlDecl = ''\n parser.state = S.TEXT\n } else if (isQuote(c)) {\n parser.state = S.SGML_DECL_QUOTED\n parser.sgmlDecl += c\n } else {\n parser.sgmlDecl += c\n }\n continue\n\n case S.SGML_DECL_QUOTED:\n if (c === parser.q) {\n parser.state = S.SGML_DECL\n parser.q = ''\n }\n parser.sgmlDecl += c\n continue\n\n case S.DOCTYPE:\n if (c === '>') {\n parser.state = S.TEXT\n emitNode(parser, 'ondoctype', parser.doctype)\n parser.doctype = true // just remember that we saw it.\n } else {\n parser.doctype += c\n if (c === '[') {\n parser.state = S.DOCTYPE_DTD\n } else if (isQuote(c)) {\n parser.state = S.DOCTYPE_QUOTED\n parser.q = c\n }\n }\n continue\n\n case S.DOCTYPE_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.q = ''\n parser.state = S.DOCTYPE\n }\n continue\n\n case S.DOCTYPE_DTD:\n parser.doctype += c\n if (c === ']') {\n parser.state = S.DOCTYPE\n } else if (isQuote(c)) {\n parser.state = S.DOCTYPE_DTD_QUOTED\n parser.q = c\n }\n continue\n\n case S.DOCTYPE_DTD_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.state = S.DOCTYPE_DTD\n parser.q = ''\n }\n continue\n\n case S.COMMENT:\n if (c === '-') {\n parser.state = S.COMMENT_ENDING\n } else {\n parser.comment += c\n }\n continue\n\n case S.COMMENT_ENDING:\n if (c === '-') {\n parser.state = S.COMMENT_ENDED\n parser.comment = textopts(parser.opt, parser.comment)\n if (parser.comment) {\n emitNode(parser, 'oncomment', parser.comment)\n }\n parser.comment = ''\n } else {\n parser.comment += '-' + c\n parser.state = S.COMMENT\n }\n continue\n\n case S.COMMENT_ENDED:\n if (c !== '>') {\n strictFail(parser, 'Malformed comment')\n // allow <!-- blah -- bloo --> in non-strict mode,\n // which is a comment of \" blah -- bloo \"\n parser.comment += '--' + c\n parser.state = S.COMMENT\n } else {\n parser.state = S.TEXT\n }\n continue\n\n case S.CDATA:\n if (c === ']') {\n parser.state = S.CDATA_ENDING\n } else {\n parser.cdata += c\n }\n continue\n\n case S.CDATA_ENDING:\n if (c === ']') {\n parser.state = S.CDATA_ENDING_2\n } else {\n parser.cdata += ']' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.CDATA_ENDING_2:\n if (c === '>') {\n if (parser.cdata) {\n emitNode(parser, 'oncdata', parser.cdata)\n }\n emitNode(parser, 'onclosecdata')\n parser.cdata = ''\n parser.state = S.TEXT\n } else if (c === ']') {\n parser.cdata += ']'\n } else {\n parser.cdata += ']]' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.PROC_INST:\n if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else if (isWhitespace(c)) {\n parser.state = S.PROC_INST_BODY\n } else {\n parser.procInstName += c\n }\n continue\n\n case S.PROC_INST_BODY:\n if (!parser.procInstBody && isWhitespace(c)) {\n continue\n } else if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else {\n parser.procInstBody += c\n }\n continue\n\n case S.PROC_INST_ENDING:\n if (c === '>') {\n emitNode(parser, 'onprocessinginstruction', {\n name: parser.procInstName,\n body: parser.procInstBody\n })\n parser.procInstName = parser.procInstBody = ''\n parser.state = S.TEXT\n } else {\n parser.procInstBody += '?' + c\n parser.state = S.PROC_INST_BODY\n }\n continue\n\n case S.OPEN_TAG:\n if (isMatch(nameBody, c)) {\n parser.tagName += c\n } else {\n newTag(parser)\n if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else {\n if (!isWhitespace(c)) {\n strictFail(parser, 'Invalid character in tag name')\n }\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.OPEN_TAG_SLASH:\n if (c === '>') {\n openTag(parser, true)\n closeTag(parser)\n } else {\n strictFail(parser, 'Forward-slash in opening tag not followed by >')\n parser.state = S.ATTRIB\n }\n continue\n\n case S.ATTRIB:\n // haven't read the attribute name yet.\n if (isWhitespace(c)) {\n continue\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (isMatch(nameStart, c)) {\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (c === '>') {\n strictFail(parser, 'Attribute without value')\n parser.attribValue = parser.attribName\n attrib(parser)\n openTag(parser)\n } else if (isWhitespace(c)) {\n parser.state = S.ATTRIB_NAME_SAW_WHITE\n } else if (isMatch(nameBody, c)) {\n parser.attribName += c\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME_SAW_WHITE:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (isWhitespace(c)) {\n continue\n } else {\n strictFail(parser, 'Attribute without value')\n parser.tag.attributes[parser.attribName] = ''\n parser.attribValue = ''\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: ''\n })\n parser.attribName = ''\n if (c === '>') {\n openTag(parser)\n } else if (isMatch(nameStart, c)) {\n parser.attribName = c\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.ATTRIB_VALUE:\n if (isWhitespace(c)) {\n continue\n } else if (isQuote(c)) {\n parser.q = c\n parser.state = S.ATTRIB_VALUE_QUOTED\n } else {\n strictFail(parser, 'Unquoted attribute value')\n parser.state = S.ATTRIB_VALUE_UNQUOTED\n parser.attribValue = c\n }\n continue\n\n case S.ATTRIB_VALUE_QUOTED:\n if (c !== parser.q) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_Q\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n parser.q = ''\n parser.state = S.ATTRIB_VALUE_CLOSED\n continue\n\n case S.ATTRIB_VALUE_CLOSED:\n if (isWhitespace(c)) {\n parser.state = S.ATTRIB\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (isMatch(nameStart, c)) {\n strictFail(parser, 'No whitespace between attributes')\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_VALUE_UNQUOTED:\n if (!isAttribEnd(c)) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_U\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n if (c === '>') {\n openTag(parser)\n } else {\n parser.state = S.ATTRIB\n }\n continue\n\n case S.CLOSE_TAG:\n if (!parser.tagName) {\n if (isWhitespace(c)) {\n continue\n } else if (notMatch(nameStart, c)) {\n if (parser.script) {\n parser.script += '</' + c\n parser.state = S.SCRIPT\n } else {\n strictFail(parser, 'Invalid tagname in closing tag.')\n }\n } else {\n parser.tagName = c\n }\n } else if (c === '>') {\n closeTag(parser)\n } else if (isMatch(nameBody, c)) {\n parser.tagName += c\n } else if (parser.script) {\n parser.script += '</' + parser.tagName\n parser.tagName = ''\n parser.state = S.SCRIPT\n } else {\n if (!isWhitespace(c)) {\n strictFail(parser, 'Invalid tagname in closing tag')\n }\n parser.state = S.CLOSE_TAG_SAW_WHITE\n }\n continue\n\n case S.CLOSE_TAG_SAW_WHITE:\n if (isWhitespace(c)) {\n continue\n }\n if (c === '>') {\n closeTag(parser)\n } else {\n strictFail(parser, 'Invalid characters in closing tag')\n }\n continue\n\n case S.TEXT_ENTITY:\n case S.ATTRIB_VALUE_ENTITY_Q:\n case S.ATTRIB_VALUE_ENTITY_U:\n var returnState\n var buffer\n switch (parser.state) {\n case S.TEXT_ENTITY:\n returnState = S.TEXT\n buffer = 'textNode'\n break\n\n case S.ATTRIB_VALUE_ENTITY_Q:\n returnState = S.ATTRIB_VALUE_QUOTED\n buffer = 'attribValue'\n break\n\n case S.ATTRIB_VALUE_ENTITY_U:\n returnState = S.ATTRIB_VALUE_UNQUOTED\n buffer = 'attribValue'\n break\n }\n\n if (c === ';') {\n parser[buffer] += parseEntity(parser)\n parser.entity = ''\n parser.state = returnState\n } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {\n parser.entity += c\n } else {\n strictFail(parser, 'Invalid character in entity name')\n parser[buffer] += '&' + parser.entity + c\n parser.entity = ''\n parser.state = returnState\n }\n\n continue\n\n default:\n throw new Error(parser, 'Unknown state: ' + parser.state)\n }\n } // while\n\n if (parser.position >= parser.bufferCheckPosition) {\n checkBufferLength(parser)\n }\n return parser\n }\n\n /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n /* istanbul ignore next */\n if (!String.fromCodePoint) {\n (function () {\n var stringFromCharCode = String.fromCharCode\n var floor = Math.floor\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000\n var codeUnits = []\n var highSurrogate\n var lowSurrogate\n var index = -1\n var length = arguments.length\n if (!length) {\n return ''\n }\n var result = ''\n while (++index < length) {\n var codePoint = Number(arguments[index])\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) !== codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint)\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint)\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000\n highSurrogate = (codePoint >> 10) + 0xD800\n lowSurrogate = (codePoint % 0x400) + 0xDC00\n codeUnits.push(highSurrogate, lowSurrogate)\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits)\n codeUnits.length = 0\n }\n }\n return result\n }\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(String, 'fromCodePoint', {\n value: fromCodePoint,\n configurable: true,\n writable: true\n })\n } else {\n String.fromCodePoint = fromCodePoint\n }\n }())\n }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n","self.global = global;","\nvar inherits;\nif (typeof Object.create === 'function'){\n inherits = function inherits(ctor, superCtor) {\n // implementation from standard node.js 'util' module\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n inherits = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\nexport default inherits;\n","var toString = {}.toString;\n\nexport default Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","//Types of elements found in the DOM\nmodule.exports = {\n\tText: \"text\", //Text\n\tDirective: \"directive\", //<? ... ?>\n\tComment: \"comment\", //<!-- ... -->\n\tScript: \"script\", //<script> tags\n\tStyle: \"style\", //<style> tags\n\tTag: \"tag\", //Any tag\n\tCDATA: \"cdata\", //<![CDATA[ ... ]]>\n\tDoctype: \"doctype\",\n\n\tisTag: function(elem){\n\t\treturn elem.type === \"tag\" || elem.type === \"script\" || elem.type === \"style\";\n\t}\n};\n","//Types of elements found in the DOM\nmodule.exports = {\n\tText: \"text\", //Text\n\tDirective: \"directive\", //<? ... ?>\n\tComment: \"comment\", //<!-- ... -->\n\tScript: \"script\", //<script> tags\n\tStyle: \"style\", //<style> tags\n\tTag: \"tag\", //Any tag\n\tCDATA: \"cdata\", //<![CDATA[ ... ]]>\n\n\tisTag: function(elem){\n\t\treturn elem.type === \"tag\" || elem.type === \"script\" || elem.type === \"style\";\n\t}\n};","var decodeMap = require(\"../maps/decode.json\");\n\nmodule.exports = decodeCodePoint;\n\n// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119\nfunction decodeCodePoint(codePoint){\n\n\tif((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF){\n\t\treturn \"\\uFFFD\";\n\t}\n\n\tif(codePoint in decodeMap){\n\t\tcodePoint = decodeMap[codePoint];\n\t}\n\n\tvar output = \"\";\n\n\tif(codePoint > 0xFFFF){\n\t\tcodePoint -= 0x10000;\n\t\toutput += String.fromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);\n\t\tcodePoint = 0xDC00 | codePoint & 0x3FF;\n\t}\n\n\toutput += String.fromCharCode(codePoint);\n\treturn output;\n}\n","var encode = require(\"./lib/encode.js\"),\n decode = require(\"./lib/decode.js\");\n\nexports.decode = function(data, level){\n\treturn (!level || level <= 0 ? decode.XML : decode.HTML)(data);\n};\n\nexports.decodeStrict = function(data, level){\n\treturn (!level || level <= 0 ? decode.XML : decode.HTMLStrict)(data);\n};\n\nexports.encode = function(data, level){\n\treturn (!level || level <= 0 ? encode.XML : encode.HTML)(data);\n};\n\nexports.encodeXML = encode.XML;\n\nexports.encodeHTML4 =\nexports.encodeHTML5 =\nexports.encodeHTML = encode.HTML;\n\nexports.decodeXML =\nexports.decodeXMLStrict = decode.XML;\n\nexports.decodeHTML4 =\nexports.decodeHTML5 =\nexports.decodeHTML = decode.HTML;\n\nexports.decodeHTML4Strict =\nexports.decodeHTML5Strict =\nexports.decodeHTMLStrict = decode.HTMLStrict;\n\nexports.escape = encode.escape;\n","/*\n Module dependencies\n*/\nvar ElementType = require('domelementtype');\nvar entities = require('entities');\n\n/*\n Boolean Attributes\n*/\nvar booleanAttributes = {\n __proto__: null,\n allowfullscreen: true,\n async: true,\n autofocus: true,\n autoplay: true,\n checked: true,\n controls: true,\n default: true,\n defer: true,\n disabled: true,\n hidden: true,\n ismap: true,\n loop: true,\n multiple: true,\n muted: true,\n open: true,\n readonly: true,\n required: true,\n reversed: true,\n scoped: true,\n seamless: true,\n selected: true,\n typemustmatch: true\n};\n\nvar unencodedElements = {\n __proto__: null,\n style: true,\n script: true,\n xmp: true,\n iframe: true,\n noembed: true,\n noframes: true,\n plaintext: true,\n noscript: true\n};\n\n/*\n Format attributes\n*/\nfunction formatAttrs(attributes, opts) {\n if (!attributes) return;\n\n var output = '',\n value;\n\n // Loop through the attributes\n for (var key in attributes) {\n value = attributes[key];\n if (output) {\n output += ' ';\n }\n\n if (!value && booleanAttributes[key]) {\n output += key;\n } else {\n output += key + '=\"' + (opts.decodeEntities ? entities.encodeXML(value) : value) + '\"';\n }\n }\n\n return output;\n}\n\n/*\n Self-enclosing tags (stolen from node-htmlparser)\n*/\nvar singleTag = {\n __proto__: null,\n area: true,\n base: true,\n basefont: true,\n br: true,\n col: true,\n command: true,\n embed: true,\n frame: true,\n hr: true,\n img: true,\n input: true,\n isindex: true,\n keygen: true,\n link: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true,\n};\n\n\nvar render = module.exports = function(dom, opts) {\n if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];\n opts = opts || {};\n\n var output = '';\n\n for(var i = 0; i < dom.length; i++){\n var elem = dom[i];\n\n if (elem.type === 'root')\n output += render(elem.children, opts);\n else if (ElementType.isTag(elem))\n output += renderTag(elem, opts);\n else if (elem.type === ElementType.Directive)\n output += renderDirective(elem);\n else if (elem.type === ElementType.Comment)\n output += renderComment(elem);\n else if (elem.type === ElementType.CDATA)\n output += renderCdata(elem);\n else\n output += renderText(elem, opts);\n }\n\n return output;\n};\n\nfunction renderTag(elem, opts) {\n // Handle SVG\n if (elem.name === \"svg\") opts = {decodeEntities: opts.decodeEntities, xmlMode: true};\n\n var tag = '<' + elem.name,\n attribs = formatAttrs(elem.attribs, opts);\n\n if (attribs) {\n tag += ' ' + attribs;\n }\n\n if (\n opts.xmlMode\n && (!elem.children || elem.children.length === 0)\n ) {\n tag += '/>';\n } else {\n tag += '>';\n if (elem.children) {\n tag += render(elem.children, opts);\n }\n\n if (!singleTag[elem.name] || opts.xmlMode) {\n tag += '</' + elem.name + '>';\n }\n }\n\n return tag;\n}\n\nfunction renderDirective(elem) {\n return '<' + elem.data + '>';\n}\n\nfunction renderText(elem, opts) {\n var data = elem.data || '';\n\n // if entities weren't decoded, no need to encode them back\n if (opts.decodeEntities && !(elem.parent && elem.parent.name in unencodedElements)) {\n data = entities.encodeXML(data);\n }\n\n return data;\n}\n\nfunction renderCdata(elem) {\n return '<![CDATA[' + elem.children[0].data + ']]>';\n}\n\nfunction renderComment(elem) {\n return '<!--' + elem.data + '-->';\n}\n","var getChildren = exports.getChildren = function(elem){\n\treturn elem.children;\n};\n\nvar getParent = exports.getParent = function(elem){\n\treturn elem.parent;\n};\n\nexports.getSiblings = function(elem){\n\tvar parent = getParent(elem);\n\treturn parent ? getChildren(parent) : [elem];\n};\n\nexports.getAttributeValue = function(elem, name){\n\treturn elem.attribs && elem.attribs[name];\n};\n\nexports.hasAttrib = function(elem, name){\n\treturn !!elem.attribs && hasOwnProperty.call(elem.attribs, name);\n};\n\nexports.getName = function(elem){\n\treturn elem.name;\n};\n","exports.removeElement = function(elem){\n\tif(elem.prev) elem.prev.next = elem.next;\n\tif(elem.next) elem.next.prev = elem.prev;\n\n\tif(elem.parent){\n\t\tvar childs = elem.parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 1);\n\t}\n};\n\nexports.replaceElement = function(elem, replacement){\n\tvar prev = replacement.prev = elem.prev;\n\tif(prev){\n\t\tprev.next = replacement;\n\t}\n\n\tvar next = replacement.next = elem.next;\n\tif(next){\n\t\tnext.prev = replacement;\n\t}\n\n\tvar parent = replacement.parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds[childs.lastIndexOf(elem)] = replacement;\n\t}\n};\n\nexports.appendChild = function(elem, child){\n\tchild.parent = elem;\n\n\tif(elem.children.push(child) !== 1){\n\t\tvar sibling = elem.children[elem.children.length - 2];\n\t\tsibling.next = child;\n\t\tchild.prev = sibling;\n\t\tchild.next = null;\n\t}\n};\n\nexports.append = function(elem, next){\n\tvar parent = elem.parent,\n\t\tcurrNext = elem.next;\n\n\tnext.next = currNext;\n\tnext.prev = elem;\n\telem.next = next;\n\tnext.parent = parent;\n\n\tif(currNext){\n\t\tcurrNext.prev = next;\n\t\tif(parent){\n\t\t\tvar childs = parent.children;\n\t\t\tchilds.splice(childs.lastIndexOf(currNext), 0, next);\n\t\t}\n\t} else if(parent){\n\t\tparent.children.push(next);\n\t}\n};\n\nexports.prepend = function(elem, prev){\n\tvar parent = elem.parent;\n\tif(parent){\n\t\tvar childs = parent.children;\n\t\tchilds.splice(childs.lastIndexOf(elem), 0, prev);\n\t}\n\n\tif(elem.prev){\n\t\telem.prev.next = prev;\n\t}\n\t\n\tprev.parent = parent;\n\tprev.prev = elem.prev;\n\tprev.next = elem;\n\telem.prev = prev;\n};\n\n\n","var ElementType = require(\"domelementtype\");\nvar isTag = exports.isTag = ElementType.isTag;\n\nexports.testElement = function(options, element){\n\tfor(var key in options){\n\t\tif(!options.hasOwnProperty(key));\n\t\telse if(key === \"tag_name\"){\n\t\t\tif(!isTag(element) || !options.tag_name(element.name)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(key === \"tag_type\"){\n\t\t\tif(!options.tag_type(element.type)) return false;\n\t\t} else if(key === \"tag_contains\"){\n\t\t\tif(isTag(element) || !options.tag_contains(element.data)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(!element.attribs || !options[key](element.attribs[key])){\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n};\n\nvar Checks = {\n\ttag_name: function(name){\n\t\tif(typeof name === \"function\"){\n\t\t\treturn function(elem){ return isTag(elem) && name(elem.name); };\n\t\t} else if(name === \"*\"){\n\t\t\treturn isTag;\n\t\t} else {\n\t\t\treturn function(elem){ return isTag(elem) && elem.name === name; };\n\t\t}\n\t},\n\ttag_type: function(type){\n\t\tif(typeof type === \"function\"){\n\t\t\treturn function(elem){ return type(elem.type); };\n\t\t} else {\n\t\t\treturn function(elem){ return elem.type === type; };\n\t\t}\n\t},\n\ttag_contains: function(data){\n\t\tif(typeof data === \"function\"){\n\t\t\treturn function(elem){ return !isTag(elem) && data(elem.data); };\n\t\t} else {\n\t\t\treturn function(elem){ return !isTag(elem) && elem.data === data; };\n\t\t}\n\t}\n};\n\nfunction getAttribCheck(attrib, value){\n\tif(typeof value === \"function\"){\n\t\treturn function(elem){ return elem.attribs && value(elem.attribs[attrib]); };\n\t} else {\n\t\treturn function(elem){ return elem.attribs && elem.attribs[attrib] === value; };\n\t}\n}\n\nfunction combineFuncs(a, b){\n\treturn function(elem){\n\t\treturn a(elem) || b(elem);\n\t};\n}\n\nexports.getElements = function(options, element, recurse, limit){\n\tvar funcs = Object.keys(options).map(function(key){\n\t\tvar value = options[key];\n\t\treturn key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n\t});\n\n\treturn funcs.length === 0 ? [] : this.filter(\n\t\tfuncs.reduce(combineFuncs),\n\t\telement, recurse, limit\n\t);\n};\n\nexports.getElementById = function(id, element, recurse){\n\tif(!Array.isArray(element)) element = [element];\n\treturn this.findOne(getAttribCheck(\"id\", id), element, recurse !== false);\n};\n\nexports.getElementsByTagName = function(name, element, recurse, limit){\n\treturn this.filter(Checks.tag_name(name), element, recurse, limit);\n};\n\nexports.getElementsByTagType = function(type, element, recurse, limit){\n\treturn this.filter(Checks.tag_type(type), element, recurse, limit);\n};\n","// removeSubsets\n// Given an array of nodes, remove any member that is contained by another.\nexports.removeSubsets = function(nodes) {\n\tvar idx = nodes.length, node, ancestor, replace;\n\n\t// Check if each node (or one of its ancestors) is already contained in the\n\t// array.\n\twhile (--idx > -1) {\n\t\tnode = ancestor = nodes[idx];\n\n\t\t// Temporarily remove the node under consideration\n\t\tnodes[idx] = null;\n\t\treplace = true;\n\n\t\twhile (ancestor) {\n\t\t\tif (nodes.indexOf(ancestor) > -1) {\n\t\t\t\treplace = false;\n\t\t\t\tnodes.splice(idx, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tancestor = ancestor.parent;\n\t\t}\n\n\t\t// If the node has been found to be unique, re-insert it.\n\t\tif (replace) {\n\t\t\tnodes[idx] = node;\n\t\t}\n\t}\n\n\treturn nodes;\n};\n\n// Source: http://dom.spec.whatwg.org/#dom-node-comparedocumentposition\nvar POSITION = {\n\tDISCONNECTED: 1,\n\tPRECEDING: 2,\n\tFOLLOWING: 4,\n\tCONTAINS: 8,\n\tCONTAINED_BY: 16\n};\n\n// Compare the position of one node against another node in any other document.\n// The return value is a bitmask with the following values:\n//\n// document order:\n// > There is an ordering, document order, defined on all the nodes in the\n// > document corresponding to the order in which the first character of the\n// > XML representation of each node occurs in the XML representation of the\n// > document after expansion of general entities. Thus, the document element\n// > node will be the first node. Element nodes occur before their children.\n// > Thus, document order orders element nodes in order of the occurrence of\n// > their start-tag in the XML (after expansion of entities). The attribute\n// > nodes of an element occur after the element and before its children. The\n// > relative order of attribute nodes is implementation-dependent./\n// Source:\n// http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n//\n// @argument {Node} nodaA The first node to use in the comparison\n// @argument {Node} nodeB The second node to use in the comparison\n//\n// @return {Number} A bitmask describing the input nodes' relative position.\n// See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n// a description of these values.\nvar comparePos = exports.compareDocumentPosition = function(nodeA, nodeB) {\n\tvar aParents = [];\n\tvar bParents = [];\n\tvar current, sharedParent, siblings, aSibling, bSibling, idx;\n\n\tif (nodeA === nodeB) {\n\t\treturn 0;\n\t}\n\n\tcurrent = nodeA;\n\twhile (current) {\n\t\taParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\tcurrent = nodeB;\n\twhile (current) {\n\t\tbParents.unshift(current);\n\t\tcurrent = current.parent;\n\t}\n\n\tidx = 0;\n\twhile (aParents[idx] === bParents[idx]) {\n\t\tidx++;\n\t}\n\n\tif (idx === 0) {\n\t\treturn POSITION.DISCONNECTED;\n\t}\n\n\tsharedParent = aParents[idx - 1];\n\tsiblings = sharedParent.children;\n\taSibling = aParents[idx];\n\tbSibling = bParents[idx];\n\n\tif (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n\t\tif (sharedParent === nodeB) {\n\t\t\treturn POSITION.FOLLOWING | POSITION.CONTAINED_BY;\n\t\t}\n\t\treturn POSITION.FOLLOWING;\n\t} else {\n\t\tif (sharedParent === nodeA) {\n\t\t\treturn POSITION.PRECEDING | POSITION.CONTAINS;\n\t\t}\n\t\treturn POSITION.PRECEDING;\n\t}\n};\n\n// Sort an array of nodes based on their relative position in the document and\n// remove any duplicate nodes. If the array contains nodes that do not belong\n// to the same document, sort order is unspecified.\n//\n// @argument {Array} nodes Array of DOM nodes\n//\n// @returns {Array} collection of unique nodes, sorted in document order\nexports.uniqueSort = function(nodes) {\n\tvar idx = nodes.length, node, position;\n\n\tnodes = nodes.slice();\n\n\twhile (--idx > -1) {\n\t\tnode = nodes[idx];\n\t\tposition = nodes.indexOf(node);\n\t\tif (position > -1 && position < idx) {\n\t\t\tnodes.splice(idx, 1);\n\t\t}\n\t}\n\tnodes.sort(function(a, b) {\n\t\tvar relative = comparePos(a, b);\n\t\tif (relative & POSITION.PRECEDING) {\n\t\t\treturn -1;\n\t\t} else if (relative & POSITION.FOLLOWING) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\treturn nodes;\n};\n","var DomUtils = module.exports;\n\n[\n\trequire(\"./lib/stringify\"),\n\trequire(\"./lib/traversal\"),\n\trequire(\"./lib/manipulation\"),\n\trequire(\"./lib/querying\"),\n\trequire(\"./lib/legacy\"),\n\trequire(\"./lib/helpers\")\n].forEach(function(ext){\n\tObject.keys(ext).forEach(function(key){\n\t\tDomUtils[key] = ext[key].bind(DomUtils);\n\t});\n});\n","module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};","var falseFunc = require(\"boolbase\").falseFunc;\n\n//https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js#L469\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\n\nfunction factory(adapter){\n\t/*\n\t\tattribute selectors\n\t*/\n\tvar attributeRules = {\n\t\t__proto__: null,\n\t\tequals: function(next, data){\n\t\t\tvar name = data.name,\n\t\t\t\tvalue = data.value;\n\n\t\t\tif(data.ignoreCase){\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\treturn function equalsIC(elem){\n\t\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\t\treturn attr != null && attr.toLowerCase() === value && next(elem);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function equals(elem){\n\t\t\t\treturn adapter.getAttributeValue(elem, name) === value && next(elem);\n\t\t\t};\n\t\t},\n\t\thyphen: function(next, data){\n\t\t\tvar name = data.name,\n\t\t\t\tvalue = data.value,\n\t\t\t\tlen = value.length;\n\n\t\t\tif(data.ignoreCase){\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\treturn function hyphenIC(elem){\n\t\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\t\treturn attr != null &&\n\t\t\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\t\t\tattr.substr(0, len).toLowerCase() === value &&\n\t\t\t\t\t\t\tnext(elem);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function hyphen(elem){\n\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\treturn attr != null &&\n\t\t\t\t\t\tattr.substr(0, len) === value &&\n\t\t\t\t\t\t(attr.length === len || attr.charAt(len) === \"-\") &&\n\t\t\t\t\t\tnext(elem);\n\t\t\t};\n\t\t},\n\t\telement: function(next, data){\n\t\t\tvar name = data.name,\n\t\t\t\tvalue = data.value;\n\n\t\t\tif(/\\s/.test(value)){\n\t\t\t\treturn falseFunc;\n\t\t\t}\n\n\t\t\tvalue = value.replace(reChars, \"\\\\$&\");\n\n\t\t\tvar pattern = \"(?:^|\\\\s)\" + value + \"(?:$|\\\\s)\",\n\t\t\t\tflags = data.ignoreCase ? \"i\" : \"\",\n\t\t\t\tregex = new RegExp(pattern, flags);\n\n\t\t\treturn function element(elem){\n\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t\t};\n\t\t},\n\t\texists: function(next, data){\n\t\t\tvar name = data.name;\n\t\t\treturn function exists(elem){\n\t\t\t\treturn adapter.hasAttrib(elem, name) && next(elem);\n\t\t\t};\n\t\t},\n\t\tstart: function(next, data){\n\t\t\tvar name = data.name,\n\t\t\t\tvalue = data.value,\n\t\t\t\tlen = value.length;\n\n\t\t\tif(len === 0){\n\t\t\t\treturn falseFunc;\n\t\t\t}\n\n\t\t\tif(data.ignoreCase){\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\treturn function startIC(elem){\n\t\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\t\treturn attr != null && attr.substr(0, len).toLowerCase() === value && next(elem);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function start(elem){\n\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(0, len) === value && next(elem);\n\t\t\t};\n\t\t},\n\t\tend: function(next, data){\n\t\t\tvar name = data.name,\n\t\t\t\tvalue = data.value,\n\t\t\t\tlen = -value.length;\n\n\t\t\tif(len === 0){\n\t\t\t\treturn falseFunc;\n\t\t\t}\n\n\t\t\tif(data.ignoreCase){\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\treturn function endIC(elem){\n\t\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\t\treturn attr != null && attr.substr(len).toLowerCase() === value && next(elem);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function end(elem){\n\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.substr(len) === value && next(elem);\n\t\t\t};\n\t\t},\n\t\tany: function(next, data){\n\t\t\tvar name = data.name,\n\t\t\t\tvalue = data.value;\n\n\t\t\tif(value === \"\"){\n\t\t\t\treturn falseFunc;\n\t\t\t}\n\n\t\t\tif(data.ignoreCase){\n\t\t\t\tvar regex = new RegExp(value.replace(reChars, \"\\\\$&\"), \"i\");\n\n\t\t\t\treturn function anyIC(elem){\n\t\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\t\treturn attr != null && regex.test(attr) && next(elem);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function any(elem){\n\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\treturn attr != null && attr.indexOf(value) >= 0 && next(elem);\n\t\t\t};\n\t\t},\n\t\tnot: function(next, data){\n\t\t\tvar name = data.name,\n\t\t\t\tvalue = data.value;\n\n\t\t\tif(value === \"\"){\n\t\t\t\treturn function notEmpty(elem){\n\t\t\t\t\treturn !!adapter.getAttributeValue(elem, name) && next(elem);\n\t\t\t\t};\n\t\t\t} else if(data.ignoreCase){\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\treturn function notIC(elem){\n\t\t\t\t\tvar attr = adapter.getAttributeValue(elem, name);\n\t\t\t\t\treturn attr != null && attr.toLowerCase() !== value && next(elem);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function not(elem){\n\t\t\t\treturn adapter.getAttributeValue(elem, name) !== value && next(elem);\n\t\t\t};\n\t\t}\n\t};\n\n\treturn {\n\t\tcompile: function(next, data, options){\n\t\t\tif(options && options.strict && (\n\t\t\t\tdata.ignoreCase || data.action === \"not\"\n\t\t\t)) throw new Error(\"Unsupported attribute selector\");\n\t\t\treturn attributeRules[data.action](next, data);\n\t\t},\n\t\trules: attributeRules\n\t};\n}\n\nmodule.exports = factory;\n","var attributeFactory = require(\"./attributes.js\");\n\nfunction generalFactory(adapter, Pseudos){\n\t/*\n\t\tall available rules\n\t*/\n\treturn {\n\t\t__proto__: null,\n\n\t\tattribute: attributeFactory(adapter).compile,\n\t\tpseudo: Pseudos.compile,\n\n\t\t//tags\n\t\ttag: function(next, data){\n\t\t\tvar name = data.name;\n\t\t\treturn function tag(elem){\n\t\t\t\treturn adapter.getName(elem) === name && next(elem);\n\t\t\t};\n\t\t},\n\n\t\t//traversal\n\t\tdescendant: function(next){\n\t\t\treturn function descendant(elem){\n\n\t\t\t\tvar found = false;\n\n\t\t\t\twhile(!found && (elem = adapter.getParent(elem))){\n\t\t\t\t\tfound = next(elem);\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t};\n\t\t},\n\t\t_flexibleDescendant: function(next){\n\t\t\t// Include element itself, only used while querying an array\n\t\t\treturn function descendant(elem){\n\n\t\t\t\tvar found = next(elem);\n\n\t\t\t\twhile(!found && (elem = adapter.getParent(elem))){\n\t\t\t\t\tfound = next(elem);\n\t\t\t\t}\n\n\t\t\t\treturn found;\n\t\t\t};\n\t\t},\n\t\tparent: function(next, data, options){\n\t\t\tif(options && options.strict) throw new Error(\"Parent selector isn't part of CSS3\");\n\n\t\t\treturn function parent(elem){\n\t\t\t\treturn adapter.getChildren(elem).some(test);\n\t\t\t};\n\n\t\t\tfunction test(elem){\n\t\t\t\treturn adapter.isTag(elem) && next(elem);\n\t\t\t}\n\t\t},\n\t\tchild: function(next){\n\t\t\treturn function child(elem){\n\t\t\t\tvar parent = adapter.getParent(elem);\n\t\t\t\treturn !!parent && next(parent);\n\t\t\t};\n\t\t},\n\t\tsibling: function(next){\n\t\t\treturn function sibling(elem){\n\t\t\t\tvar siblings = adapter.getSiblings(elem);\n\n\t\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\t\tif(next(siblings[i])) return true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\t\tadjacent: function(next){\n\t\t\treturn function adjacent(elem){\n\t\t\t\tvar siblings = adapter.getSiblings(elem),\n\t\t\t\t\tlastElement;\n\n\t\t\t\tfor(var i = 0; i < siblings.length; i++){\n\t\t\t\t\tif(adapter.isTag(siblings[i])){\n\t\t\t\t\t\tif(siblings[i] === elem) break;\n\t\t\t\t\t\tlastElement = siblings[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn !!lastElement && next(lastElement);\n\t\t\t};\n\t\t},\n\t\tuniversal: function(next){\n\t\t\treturn next;\n\t\t}\n\t};\n}\n\nmodule.exports = generalFactory;\n","module.exports = parse;\n\n//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo\n\n//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?\nvar re_nthElement = /^([+\\-]?\\d*n)?\\s*(?:([+\\-]?)\\s*(\\d+))?$/;\n\n/*\n\tparses a nth-check formula, returns an array of two numbers\n*/\nfunction parse(formula){\n\tformula = formula.trim().toLowerCase();\n\n\tif(formula === \"even\"){\n\t\treturn [2, 0];\n\t} else if(formula === \"odd\"){\n\t\treturn [2, 1];\n\t} else {\n\t\tvar parsed = formula.match(re_nthElement);\n\n\t\tif(!parsed){\n\t\t\tthrow new SyntaxError(\"n-th rule couldn't be parsed ('\" + formula + \"')\");\n\t\t}\n\n\t\tvar a;\n\n\t\tif(parsed[1]){\n\t\t\ta = parseInt(parsed[1], 10);\n\t\t\tif(isNaN(a)){\n\t\t\t\tif(parsed[1].charAt(0) === \"-\") a = -1;\n\t\t\t\telse a = 1;\n\t\t\t}\n\t\t} else a = 0;\n\n\t\treturn [\n\t\t\ta,\n\t\t\tparsed[3] ? parseInt((parsed[2] || \"\") + parsed[3], 10) : 0\n\t\t];\n\t}\n}\n","module.exports = compile;\n\nvar BaseFuncs = require(\"boolbase\"),\n trueFunc = BaseFuncs.trueFunc,\n falseFunc = BaseFuncs.falseFunc;\n\n/*\n\treturns a function that checks if an elements index matches the given rule\n\thighly optimized to return the fastest solution\n*/\nfunction compile(parsed){\n\tvar a = parsed[0],\n\t b = parsed[1] - 1;\n\n\t//when b <= 0, a*n won't be possible for any matches when a < 0\n\t//besides, the specification says that no element is matched when a and b are 0\n\tif(b < 0 && a <= 0) return falseFunc;\n\n\t//when a is in the range -1..1, it matches any element (so only b is checked)\n\tif(a ===-1) return function(pos){ return pos <= b; };\n\tif(a === 0) return function(pos){ return pos === b; };\n\t//when b <= 0 and a === 1, they match any element\n\tif(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };\n\n\t//when a > 0, modulo can be used to check if there is a match\n\tvar bMod = b % a;\n\tif(bMod < 0) bMod += a;\n\n\tif(a > 1){\n\t\treturn function(pos){\n\t\t\treturn pos >= b && pos % a === bMod;\n\t\t};\n\t}\n\n\ta *= -1; //make `a` positive\n\n\treturn function(pos){\n\t\treturn pos <= b && pos % a === bMod;\n\t};\n}","var parse = require(\"./parse.js\"),\n compile = require(\"./compile.js\");\n\nmodule.exports = function nthCheck(formula){\n\treturn compile(parse(formula));\n};\n\nmodule.exports.parse = parse;\nmodule.exports.compile = compile;","/*\n\tcompiles a selector to an executable function\n*/\n\nmodule.exports = compileFactory;\n\nvar parse = require(\"css-what\"),\n\tBaseFuncs = require(\"boolbase\"),\n\tsortRules = require(\"./sort.js\"),\n\tprocedure = require(\"./procedure.json\"),\n\trulesFactory = require(\"./general.js\"),\n\tpseudosFactory = require(\"./pseudos.js\"),\n\ttrueFunc = BaseFuncs.trueFunc,\n\tfalseFunc = BaseFuncs.falseFunc;\n\nfunction compileFactory(adapter){\n\tvar Pseudos = pseudosFactory(adapter),\n\t\tfilters = Pseudos.filters,\n\t\tRules \t\t\t= rulesFactory(adapter, Pseudos);\n\n\tfunction compile(selector, options, context){\n\t\tvar next = compileUnsafe(selector, options, context);\n\t\treturn wrap(next);\n\t}\n\n\tfunction wrap(next){\n\t\treturn function base(elem){\n\t\t\treturn adapter.isTag(elem) && next(elem);\n\t\t};\n\t}\n\n\tfunction compileUnsafe(selector, options, context){\n\t\tvar token = parse(selector, options);\n\t\treturn compileToken(token, options, context);\n\t}\n\n\tfunction includesScopePseudo(t){\n\t\treturn t.type === \"pseudo\" && (\n\t\t\tt.name === \"scope\" || (\n\t\t\t\tArray.isArray(t.data) &&\n\t\t\t\tt.data.some(function(data){\n\t\t\t\t\treturn data.some(includesScopePseudo);\n\t\t\t\t})\n\t\t\t)\n\t\t);\n\t}\n\n\tvar DESCENDANT_TOKEN = {type: \"descendant\"},\n\t\tFLEXIBLE_DESCENDANT_TOKEN = {type: \"_flexibleDescendant\"},\n\t\tSCOPE_TOKEN = {type: \"pseudo\", name: \"scope\"},\n\t\tPLACEHOLDER_ELEMENT = {};\n\n\t//CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector\n\t//http://www.w3.org/TR/selectors4/#absolutizing\n\tfunction absolutize(token, context){\n\t\t//TODO better check if context is document\n\t\tvar hasContext = !!context && !!context.length && context.every(function(e){\n\t\t\treturn e === PLACEHOLDER_ELEMENT || !!adapter.getParent(e);\n\t\t});\n\n\n\t\ttoken.forEach(function(t){\n\t\t\tif(t.length > 0 && isTraversal(t[0]) && t[0].type !== \"descendant\"){\n\t\t\t\t//don't return in else branch\n\t\t\t} else if(hasContext && !includesScopePseudo(t)){\n\t\t\t\tt.unshift(DESCENDANT_TOKEN);\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tt.unshift(SCOPE_TOKEN);\n\t\t});\n\t}\n\n\tfunction compileToken(token, options, context){\n\t\ttoken = token.filter(function(t){ return t.length > 0; });\n\n\t\ttoken.forEach(sortRules);\n\n\t\tvar isArrayContext = Array.isArray(context);\n\n\t\tcontext = (options && options.context) || context;\n\n\t\tif(context && !isArrayContext) context = [context];\n\n\t\tabsolutize(token, context);\n\n\t\tvar shouldTestNextSiblings = false;\n\n\t\tvar query = token\n\t\t\t.map(function(rules){\n\t\t\t\tif(rules[0] && rules[1] && rules[0].name === \"scope\"){\n\t\t\t\t\tvar ruleType = rules[1].type;\n\t\t\t\t\tif(isArrayContext && ruleType === \"descendant\") rules[1] = FLEXIBLE_DESCENDANT_TOKEN;\n\t\t\t\t\telse if(ruleType === \"adjacent\" || ruleType === \"sibling\") shouldTestNextSiblings = true;\n\t\t\t\t}\n\t\t\t\treturn compileRules(rules, options, context);\n\t\t\t})\n\t\t\t.reduce(reduceRules, falseFunc);\n\n\t\tquery.shouldTestNextSiblings = shouldTestNextSiblings;\n\n\t\treturn query;\n\t}\n\n\tfunction isTraversal(t){\n\t\treturn procedure[t.type] < 0;\n\t}\n\n\tfunction compileRules(rules, options, context){\n\t\treturn rules.reduce(function(func, rule){\n\t\t\tif(func === falseFunc) return func;\n\t\t\treturn Rules[rule.type](func, rule, options, context);\n\t\t}, options && options.rootFunc || trueFunc);\n\t}\n\n\tfunction reduceRules(a, b){\n\t\tif(b === falseFunc || a === trueFunc){\n\t\t\treturn a;\n\t\t}\n\t\tif(a === falseFunc || b === trueFunc){\n\t\t\treturn b;\n\t\t}\n\n\t\treturn function combine(elem){\n\t\t\treturn a(elem) || b(elem);\n\t\t};\n\t}\n\n\tfunction containsTraversal(t){\n\t\treturn t.some(isTraversal);\n\t}\n\n\t//:not, :has and :matches have to compile selectors\n\t//doing this in lib/pseudos.js would lead to circular dependencies,\n\t//so we add them here\n\tfilters.not = function(next, token, options, context){\n\t\tvar opts = {\n\t\t\txmlMode: !!(options && options.xmlMode),\n\t\t\tstrict: !!(options && options.strict)\n\t\t};\n\n\t\tif(opts.strict){\n\t\t\tif(token.length > 1 || token.some(containsTraversal)){\n\t\t\t\tthrow new Error(\"complex selectors in :not aren't allowed in strict mode\");\n\t\t\t}\n\t\t}\n\n\t\tvar func = compileToken(token, opts, context);\n\n\t\tif(func === falseFunc) return next;\n\t\tif(func === trueFunc) return falseFunc;\n\n\t\treturn function(elem){\n\t\t\treturn !func(elem) && next(elem);\n\t\t};\n\t};\n\n\tfilters.has = function(next, token, options){\n\t\tvar opts = {\n\t\t\txmlMode: !!(options && options.xmlMode),\n\t\t\tstrict: !!(options && options.strict)\n\t\t};\n\n\t\t//FIXME: Uses an array as a pointer to the current element (side effects)\n\t\tvar context = token.some(containsTraversal) ? [PLACEHOLDER_ELEMENT] : null;\n\n\t\tvar func = compileToken(token, opts, context);\n\n\t\tif(func === falseFunc) return falseFunc;\n\t\tif(func === trueFunc){\n\t\t\treturn function(elem){\n\t\t\t\treturn adapter.getChildren(elem).some(adapter.isTag) && next(elem);\n\t\t\t};\n\t\t}\n\n\t\tfunc = wrap(func);\n\n\t\tif(context){\n\t\t\treturn function has(elem){\n\t\t\t\treturn next(elem) && (\n\t\t\t\t\t(context[0] = elem), adapter.existsOne(func, adapter.getChildren(elem))\n\t\t\t\t);\n\t\t\t};\n\t\t}\n\n\t\treturn function has(elem){\n\t\t\treturn next(elem) && adapter.existsOne(func, adapter.getChildren(elem));\n\t\t};\n\t};\n\n\tfilters.matches = function(next, token, options, context){\n\t\tvar opts = {\n\t\t\txmlMode: !!(options && options.xmlMode),\n\t\t\tstrict: !!(options && options.strict),\n\t\t\trootFunc: next\n\t\t};\n\n\t\treturn compileToken(token, opts, context);\n\t};\n\n\tcompile.compileToken = compileToken;\n\tcompile.compileUnsafe = compileUnsafe;\n\tcompile.Pseudos = Pseudos;\n\n\treturn compile;\n}\n","'use strict';\n\nvar baseCssAdapter = require('css-select-base-adapter');\n\n/**\n * DOMUtils API for SVGO AST (used by css-select)\n */\nvar svgoCssSelectAdapterMin = {\n\n // is the node a tag?\n // isTag: ( node:Node ) => isTag:Boolean\n isTag: function(node) {\n return node.isElem();\n },\n\n // get the parent of the node\n // getParent: ( node:Node ) => parentNode:Node\n // returns null when no parent exists\n getParent: function(node) {\n return node.parentNode || null;\n },\n\n // get the node's children\n // getChildren: ( node:Node ) => children:[Node]\n getChildren: function(node) {\n return node.content || [];\n },\n\n // get the name of the tag\n // getName: ( elem:ElementNode ) => tagName:String\n getName: function(elemAst) {\n return elemAst.elem;\n },\n\n // get the text content of the node, and its children if it has any\n // getText: ( node:Node ) => text:String\n // returns empty string when there is no text\n getText: function(node) {\n return node.content[0].text || node.content[0].cdata || '';\n },\n\n // get the attribute value\n // getAttributeValue: ( elem:ElementNode, name:String ) => value:String\n // returns null when attribute doesn't exist\n getAttributeValue: function(elem, name) {\n return elem.hasAttr(name) ? elem.attr(name).value : null;\n }\n};\n\n// use base adapter for default implementation\nvar svgoCssSelectAdapter = baseCssAdapter(svgoCssSelectAdapterMin);\n\nmodule.exports = svgoCssSelectAdapter;\n","'use strict';\n\nvar cssSelect = require('css-select');\n\nvar svgoCssSelectAdapter = require('./css-select-adapter');\nvar cssSelectOpts = {\n xmlMode: true,\n adapter: svgoCssSelectAdapter\n};\n\nvar JSAPI = module.exports = function(data, parentNode) {\n Object.assign(this, data);\n if (parentNode) {\n Object.defineProperty(this, 'parentNode', {\n writable: true,\n value: parentNode\n });\n }\n};\n\n/**\n * Perform a deep clone of this node.\n *\n * @return {Object} element\n */\nJSAPI.prototype.clone = function() {\n var node = this;\n var nodeData = {};\n\n Object.keys(node).forEach(function(key) {\n if (key !== 'content') {\n nodeData[key] = node[key];\n }\n });\n\n // Deep-clone node data\n nodeData = JSON.parse(JSON.stringify(nodeData));\n\n // parentNode gets set to a proper object by the parent clone,\n // but it needs to be true/false now to do the right thing\n // in the constructor.\n var clonedNode = new JSAPI(nodeData, !!node.parentNode);\n\n if (node.content) {\n clonedNode.content = node.content.map(function(childNode) {\n var clonedChild = childNode.clone();\n clonedChild.parentNode = clonedNode;\n return clonedChild;\n });\n }\n\n return clonedNode;\n};\n\n/**\n * Determine if item is an element\n * (any, with a specific name or in a names array).\n *\n * @param {String|Array} [param] element name or names arrays\n * @return {Boolean}\n */\nJSAPI.prototype.isElem = function(param) {\n\n if (!param) return !!this.elem;\n\n if (Array.isArray(param)) return !!this.elem && (param.indexOf(this.elem) > -1);\n\n return !!this.elem && this.elem === param;\n\n};\n\n/**\n * Renames an element\n *\n * @param {String} name new element name\n * @return {Object} element\n */\nJSAPI.prototype.renameElem = function(name) {\n\n if (name && typeof name === 'string')\n this.elem = this.local = name;\n\n return this;\n\n};\n\n/**\n * Determine if element is empty.\n *\n * @return {Boolean}\n */\n JSAPI.prototype.isEmpty = function() {\n\n return !this.content || !this.content.length;\n\n};\n\n/**\n * Find the closest ancestor of the current element.\n * @param elemName\n *\n * @return {?Object}\n */\n JSAPI.prototype.closestElem = function(elemName) {\n var elem = this;\n\n while ((elem = elem.parentNode) && !elem.isElem(elemName));\n\n return elem;\n};\n\n/**\n * Changes content by removing elements and/or adding new elements.\n *\n * @param {Number} start Index at which to start changing the content.\n * @param {Number} n Number of elements to remove.\n * @param {Array|Object} [insertion] Elements to add to the content.\n * @return {Array} Removed elements.\n */\n JSAPI.prototype.spliceContent = function(start, n, insertion) {\n\n if (arguments.length < 2) return [];\n\n if (!Array.isArray(insertion))\n insertion = Array.apply(null, arguments).slice(2);\n\n insertion.forEach(function(inner) { inner.parentNode = this }, this);\n\n return this.content.splice.apply(this.content, [start, n].concat(insertion));\n\n\n};\n\n/**\n * Determine if element has an attribute\n * (any, or by name or by name + value).\n *\n * @param {String} [name] attribute name\n * @param {String} [val] attribute value (will be toString()'ed)\n * @return {Boolean}\n */\n JSAPI.prototype.hasAttr = function(name, val) {\n\n if (!this.attrs || !Object.keys(this.attrs).length) return false;\n\n if (!arguments.length) return !!this.attrs;\n\n if (val !== undefined) return !!this.attrs[name] && this.attrs[name].value === val.toString();\n\n return !!this.attrs[name];\n\n};\n\n/**\n * Determine if element has an attribute by local name\n * (any, or by name or by name + value).\n *\n * @param {String} [localName] local attribute name\n * @param {Number|String|RegExp|Function} [val] attribute value (will be toString()'ed or executed, otherwise ignored)\n * @return {Boolean}\n */\n JSAPI.prototype.hasAttrLocal = function(localName, val) {\n\n if (!this.attrs || !Object.keys(this.attrs).length) return false;\n\n if (!arguments.length) return !!this.attrs;\n\n var callback;\n\n switch (val != null && val.constructor && val.constructor.name) {\n case 'Number': // same as String\n case 'String': callback = stringValueTest; break;\n case 'RegExp': callback = regexpValueTest; break;\n case 'Function': callback = funcValueTest; break;\n default: callback = nameTest;\n }\n return this.someAttr(callback);\n\n function nameTest(attr) {\n return attr.local === localName;\n }\n\n function stringValueTest(attr) {\n return attr.local === localName && val == attr.value;\n }\n\n function regexpValueTest(attr) {\n return attr.local === localName && val.test(attr.value);\n }\n\n function funcValueTest(attr) {\n return attr.local === localName && val(attr.value);\n }\n\n};\n\n/**\n * Get a specific attribute from an element\n * (by name or name + value).\n *\n * @param {String} name attribute name\n * @param {String} [val] attribute value (will be toString()'ed)\n * @return {Object|Undefined}\n */\n JSAPI.prototype.attr = function(name, val) {\n\n if (!this.hasAttr() || !arguments.length) return undefined;\n\n if (val !== undefined) return this.hasAttr(name, val) ? this.attrs[name] : undefined;\n\n return this.attrs[name];\n\n};\n\n/**\n * Get computed attribute value from an element\n *\n * @param {String} name attribute name\n * @return {Object|Undefined}\n */\n JSAPI.prototype.computedAttr = function(name, val) {\n /* jshint eqnull: true */\n if (!arguments.length) return;\n\n for (var elem = this; elem && (!elem.hasAttr(name) || !elem.attr(name).value); elem = elem.parentNode);\n\n if (val != null) {\n return elem ? elem.hasAttr(name, val) : false;\n } else if (elem && elem.hasAttr(name)) {\n return elem.attrs[name].value;\n }\n\n};\n\n/**\n * Remove a specific attribute.\n *\n * @param {String|Array} name attribute name\n * @param {String} [val] attribute value\n * @return {Boolean}\n */\n JSAPI.prototype.removeAttr = function(name, val, recursive) {\n\n if (!arguments.length) return false;\n\n if (Array.isArray(name)) name.forEach(this.removeAttr, this);\n\n if (!this.hasAttr(name)) return false;\n\n if (!recursive && val && this.attrs[name].value !== val) return false;\n\n delete this.attrs[name];\n\n if (!Object.keys(this.attrs).length) delete this.attrs;\n\n return true;\n\n};\n\n/**\n * Add attribute.\n *\n * @param {Object} [attr={}] attribute object\n * @return {Object|Boolean} created attribute or false if no attr was passed in\n */\n JSAPI.prototype.addAttr = function(attr) {\n attr = attr || {};\n\n if (attr.name === undefined ||\n attr.prefix === undefined ||\n attr.local === undefined\n ) return false;\n\n this.attrs = this.attrs || {};\n this.attrs[attr.name] = attr;\n\n if(attr.name === 'class') { // newly added class attribute\n this.class.hasClass();\n }\n\n if(attr.name === 'style') { // newly added style attribute\n this.style.hasStyle();\n }\n\n return this.attrs[attr.name];\n\n};\n\n/**\n * Iterates over all attributes.\n *\n * @param {Function} callback callback\n * @param {Object} [context] callback context\n * @return {Boolean} false if there are no any attributes\n */\n JSAPI.prototype.eachAttr = function(callback, context) {\n\n if (!this.hasAttr()) return false;\n\n for (var name in this.attrs) {\n callback.call(context, this.attrs[name]);\n }\n\n return true;\n\n};\n\n/**\n * Tests whether some attribute passes the test.\n *\n * @param {Function} callback callback\n * @param {Object} [context] callback context\n * @return {Boolean} false if there are no any attributes\n */\n JSAPI.prototype.someAttr = function(callback, context) {\n\n if (!this.hasAttr()) return false;\n\n for (var name in this.attrs) {\n if (callback.call(context, this.attrs[name])) return true;\n }\n\n return false;\n\n};\n\n/**\n * Evaluate a string of CSS selectors against the element and returns matched elements.\n *\n * @param {String} selectors CSS selector(s) string\n * @return {Array} null if no elements matched\n */\n JSAPI.prototype.querySelectorAll = function(selectors) {\n\n var matchedEls = cssSelect(selectors, this, cssSelectOpts);\n\n return matchedEls.length > 0 ? matchedEls : null;\n\n};\n\n/**\n * Evaluate a string of CSS selectors against the element and returns only the first matched element.\n *\n * @param {String} selectors CSS selector(s) string\n * @return {Array} null if no element matched\n */\n JSAPI.prototype.querySelector = function(selectors) {\n\n return cssSelect.selectOne(selectors, this, cssSelectOpts);\n\n};\n\n/**\n * Test if a selector matches a given element.\n *\n * @param {String} selector CSS selector string\n * @return {Boolean} true if element would be selected by selector string, false if it does not\n */\n JSAPI.prototype.matches = function(selector) {\n\n return cssSelect.is(this, selector, cssSelectOpts);\n\n};\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n","'use strict';\n\n// modified from https://github.com/es-shims/es5-shim\nvar has = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\nvar isEnumerable = Object.prototype.propertyIsEnumerable;\nvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\nvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\nvar dontEnums = [\n\t'toString',\n\t'toLocaleString',\n\t'valueOf',\n\t'hasOwnProperty',\n\t'isPrototypeOf',\n\t'propertyIsEnumerable',\n\t'constructor'\n];\nvar equalsConstructorPrototype = function (o) {\n\tvar ctor = o.constructor;\n\treturn ctor && ctor.prototype === o;\n};\nvar excludedKeys = {\n\t$applicationCache: true,\n\t$console: true,\n\t$external: true,\n\t$frame: true,\n\t$frameElement: true,\n\t$frames: true,\n\t$innerHeight: true,\n\t$innerWidth: true,\n\t$outerHeight: true,\n\t$outerWidth: true,\n\t$pageXOffset: true,\n\t$pageYOffset: true,\n\t$parent: true,\n\t$scrollLeft: true,\n\t$scrollTop: true,\n\t$scrollX: true,\n\t$scrollY: true,\n\t$self: true,\n\t$webkitIndexedDB: true,\n\t$webkitStorageInfo: true,\n\t$window: true\n};\nvar hasAutomationEqualityBug = (function () {\n\t/* global window */\n\tif (typeof window === 'undefined') { return false; }\n\tfor (var k in window) {\n\t\ttry {\n\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\ttry {\n\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}());\nvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t/* global window */\n\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\treturn equalsConstructorPrototype(o);\n\t}\n\ttry {\n\t\treturn equalsConstructorPrototype(o);\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar keysShim = function keys(object) {\n\tvar isObject = object !== null && typeof object === 'object';\n\tvar isFunction = toStr.call(object) === '[object Function]';\n\tvar isArguments = isArgs(object);\n\tvar isString = isObject && toStr.call(object) === '[object String]';\n\tvar theKeys = [];\n\n\tif (!isObject && !isFunction && !isArguments) {\n\t\tthrow new TypeError('Object.keys called on a non-object');\n\t}\n\n\tvar skipProto = hasProtoEnumBug && isFunction;\n\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\ttheKeys.push(String(i));\n\t\t}\n\t}\n\n\tif (isArguments && object.length > 0) {\n\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\ttheKeys.push(String(j));\n\t\t}\n\t} else {\n\t\tfor (var name in object) {\n\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\ttheKeys.push(String(name));\n\t\t\t}\n\t\t}\n\t}\n\n\tif (hasDontEnumBug) {\n\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t}\n\t\t}\n\t}\n\treturn theKeys;\n};\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\treturn (Object.keys(arguments) || '').length === 2;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tvar originalKeys = Object.keys;\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t} else {\n\t\t\t\t\treturn originalKeys(object);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n","\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toString = Object.prototype.toString;\n\nmodule.exports = function forEach (obj, fn, ctx) {\n if (toString.call(fn) !== '[object Function]') {\n throw new TypeError('iterator must be a function');\n }\n var l = obj.length;\n if (l === +l) {\n for (var i = 0; i < l; i++) {\n fn.call(ctx, obj[i], i, obj);\n }\n } else {\n for (var k in obj) {\n if (hasOwn.call(obj, k)) {\n fn.call(ctx, obj[k], k, obj);\n }\n }\n }\n};\n\n","'use strict';\n\nvar keys = require('object-keys');\nvar foreach = require('foreach');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\n\nvar toStr = Object.prototype.toString;\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar arePropertyDescriptorsSupported = function () {\n\tvar obj = {};\n\ttry {\n\t\tObject.defineProperty(obj, 'x', { enumerable: false, value: obj });\n /* eslint-disable no-unused-vars, no-restricted-syntax */\n for (var _ in obj) { return false; }\n /* eslint-enable no-unused-vars, no-restricted-syntax */\n\t\treturn obj.x === obj;\n\t} catch (e) { /* this is IE 8. */\n\t\treturn false;\n\t}\n};\nvar supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object && (!isFunction(predicate) || !predicate())) {\n\t\treturn;\n\t}\n\tif (supportsDescriptors) {\n\t\tObject.defineProperty(object, name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: value,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\tobject[name] = value;\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = props.concat(Object.getOwnPropertySymbols(map));\n\t}\n\tforeach(props, function (name) {\n\t\tdefineProperty(object, name, map[name], predicates[name]);\n\t});\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slice.call(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n }\n };\n\n var boundLength = Math.max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs.push('$' + i);\n }\n\n bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\nvar bind = require('function-bind');\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n","module.exports = function isPrimitive(value) {\n\treturn value === null || (typeof value !== 'function' && typeof value !== 'object');\n};\n","'use strict';\n\nvar fnToStr = Function.prototype.toString;\n\nvar constructorRegex = /^\\s*class\\b/;\nvar isES6ClassFn = function isES6ClassFunction(value) {\n\ttry {\n\t\tvar fnStr = fnToStr.call(value);\n\t\treturn constructorRegex.test(fnStr);\n\t} catch (e) {\n\t\treturn false; // not a function\n\t}\n};\n\nvar tryFunctionObject = function tryFunctionToStr(value) {\n\ttry {\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tfnToStr.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar fnClass = '[object Function]';\nvar genClass = '[object GeneratorFunction]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isCallable(value) {\n\tif (!value) { return false; }\n\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\tif (typeof value === 'function' && !value.prototype) { return true; }\n\tif (hasToStringTag) { return tryFunctionObject(value); }\n\tif (isES6ClassFn(value)) { return false; }\n\tvar strClass = toStr.call(value);\n\treturn strClass === fnClass || strClass === genClass;\n};\n","'use strict';\n\nvar getDay = Date.prototype.getDay;\nvar tryDateObject = function tryDateObject(value) {\n\ttry {\n\t\tgetDay.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\nvar toStr = Object.prototype.toString;\nvar dateClass = '[object Date]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isDateObject(value) {\n\tif (typeof value !== 'object' || value === null) { return false; }\n\treturn hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;\n};\n","'use strict';\n\nvar toStr = Object.prototype.toString;\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';\n\nif (hasSymbols) {\n\tvar symToStr = Symbol.prototype.toString;\n\tvar symStringRegex = /^Symbol\\(.*\\)$/;\n\tvar isSymbolObject = function isSymbolObject(value) {\n\t\tif (typeof value.valueOf() !== 'symbol') { return false; }\n\t\treturn symStringRegex.test(symToStr.call(value));\n\t};\n\tmodule.exports = function isSymbol(value) {\n\t\tif (typeof value === 'symbol') { return true; }\n\t\tif (toStr.call(value) !== '[object Symbol]') { return false; }\n\t\ttry {\n\t\t\treturn isSymbolObject(value);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n} else {\n\tmodule.exports = function isSymbol(value) {\n\t\t// this environment does not support Symbols.\n\t\treturn false;\n\t};\n}\n","'use strict';\n\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';\n\nvar isPrimitive = require('./helpers/isPrimitive');\nvar isCallable = require('is-callable');\nvar isDate = require('is-date-object');\nvar isSymbol = require('is-symbol');\n\nvar ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {\n\tif (typeof O === 'undefined' || O === null) {\n\t\tthrow new TypeError('Cannot call method on ' + O);\n\t}\n\tif (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {\n\t\tthrow new TypeError('hint must be \"string\" or \"number\"');\n\t}\n\tvar methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];\n\tvar method, result, i;\n\tfor (i = 0; i < methodNames.length; ++i) {\n\t\tmethod = O[methodNames[i]];\n\t\tif (isCallable(method)) {\n\t\t\tresult = method.call(O);\n\t\t\tif (isPrimitive(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tthrow new TypeError('No default value');\n};\n\nvar GetMethod = function GetMethod(O, P) {\n\tvar func = O[P];\n\tif (func !== null && typeof func !== 'undefined') {\n\t\tif (!isCallable(func)) {\n\t\t\tthrow new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');\n\t\t}\n\t\treturn func;\n\t}\n};\n\n// http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive\nmodule.exports = function ToPrimitive(input, PreferredType) {\n\tif (isPrimitive(input)) {\n\t\treturn input;\n\t}\n\tvar hint = 'default';\n\tif (arguments.length > 1) {\n\t\tif (PreferredType === String) {\n\t\t\thint = 'string';\n\t\t} else if (PreferredType === Number) {\n\t\t\thint = 'number';\n\t\t}\n\t}\n\n\tvar exoticToPrim;\n\tif (hasSymbols) {\n\t\tif (Symbol.toPrimitive) {\n\t\t\texoticToPrim = GetMethod(input, Symbol.toPrimitive);\n\t\t} else if (isSymbol(input)) {\n\t\t\texoticToPrim = Symbol.prototype.valueOf;\n\t\t}\n\t}\n\tif (typeof exoticToPrim !== 'undefined') {\n\t\tvar result = exoticToPrim.call(input, hint);\n\t\tif (isPrimitive(result)) {\n\t\t\treturn result;\n\t\t}\n\t\tthrow new TypeError('unable to convert exotic object to primitive');\n\t}\n\tif (hint === 'default' && (isDate(input) || isSymbol(input))) {\n\t\thint = 'string';\n\t}\n\treturn ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);\n};\n","'use strict';\n\n/* globals\n\tSet,\n\tMap,\n\tWeakSet,\n\tWeakMap,\n\n\tPromise,\n\n\tSymbol,\n\tProxy,\n\n\tAtomics,\n\tSharedArrayBuffer,\n\n\tArrayBuffer,\n\tDataView,\n\tUint8Array,\n\tFloat32Array,\n\tFloat64Array,\n\tInt8Array,\n\tInt16Array,\n\tInt32Array,\n\tUint8ClampedArray,\n\tUint16Array,\n\tUint32Array,\n*/\n\nvar undefined; // eslint-disable-line no-shadow-restricted-names\n\nvar ThrowTypeError = Object.getOwnPropertyDescriptor\n\t? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())\n\t: function () { throw new TypeError(); };\n\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar generator; // = function * () {};\nvar generatorFunction = generator ? getProto(generator) : undefined;\nvar asyncFn; // async function() {};\nvar asyncFunction = asyncFn ? asyncFn.constructor : undefined;\nvar asyncGen; // async function * () {};\nvar asyncGenFunction = asyncGen ? getProto(asyncGen) : undefined;\nvar asyncGenIterator = asyncGen ? asyncGen() : undefined;\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'$ %Array%': Array,\n\t'$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer.prototype,\n\t'$ %ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'$ %ArrayPrototype%': Array.prototype,\n\t'$ %ArrayProto_entries%': Array.prototype.entries,\n\t'$ %ArrayProto_forEach%': Array.prototype.forEach,\n\t'$ %ArrayProto_keys%': Array.prototype.keys,\n\t'$ %ArrayProto_values%': Array.prototype.values,\n\t'$ %AsyncFromSyncIteratorPrototype%': undefined,\n\t'$ %AsyncFunction%': asyncFunction,\n\t'$ %AsyncFunctionPrototype%': asyncFunction ? asyncFunction.prototype : undefined,\n\t'$ %AsyncGenerator%': asyncGen ? getProto(asyncGenIterator) : undefined,\n\t'$ %AsyncGeneratorFunction%': asyncGenFunction,\n\t'$ %AsyncGeneratorPrototype%': asyncGenFunction ? asyncGenFunction.prototype : undefined,\n\t'$ %AsyncIteratorPrototype%': asyncGenIterator && hasSymbols && Symbol.asyncIterator ? asyncGenIterator[Symbol.asyncIterator]() : undefined,\n\t'$ %Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'$ %Boolean%': Boolean,\n\t'$ %BooleanPrototype%': Boolean.prototype,\n\t'$ %DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined : DataView.prototype,\n\t'$ %Date%': Date,\n\t'$ %DatePrototype%': Date.prototype,\n\t'$ %decodeURI%': decodeURI,\n\t'$ %decodeURIComponent%': decodeURIComponent,\n\t'$ %encodeURI%': encodeURI,\n\t'$ %encodeURIComponent%': encodeURIComponent,\n\t'$ %Error%': Error,\n\t'$ %ErrorPrototype%': Error.prototype,\n\t'$ %eval%': eval, // eslint-disable-line no-eval\n\t'$ %EvalError%': EvalError,\n\t'$ %EvalErrorPrototype%': EvalError.prototype,\n\t'$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined : Float32Array.prototype,\n\t'$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined : Float64Array.prototype,\n\t'$ %Function%': Function,\n\t'$ %FunctionPrototype%': Function.prototype,\n\t'$ %Generator%': generator ? getProto(generator()) : undefined,\n\t'$ %GeneratorFunction%': generatorFunction,\n\t'$ %GeneratorPrototype%': generatorFunction ? generatorFunction.prototype : undefined,\n\t'$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined : Int8Array.prototype,\n\t'$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined : Int8Array.prototype,\n\t'$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined : Int32Array.prototype,\n\t'$ %isFinite%': isFinite,\n\t'$ %isNaN%': isNaN,\n\t'$ %IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'$ %JSON%': JSON,\n\t'$ %JSONParse%': JSON.parse,\n\t'$ %Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'$ %MapPrototype%': typeof Map === 'undefined' ? undefined : Map.prototype,\n\t'$ %Math%': Math,\n\t'$ %Number%': Number,\n\t'$ %NumberPrototype%': Number.prototype,\n\t'$ %Object%': Object,\n\t'$ %ObjectPrototype%': Object.prototype,\n\t'$ %ObjProto_toString%': Object.prototype.toString,\n\t'$ %ObjProto_valueOf%': Object.prototype.valueOf,\n\t'$ %parseFloat%': parseFloat,\n\t'$ %parseInt%': parseInt,\n\t'$ %Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined : Promise.prototype,\n\t'$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined : Promise.prototype.then,\n\t'$ %Promise_all%': typeof Promise === 'undefined' ? undefined : Promise.all,\n\t'$ %Promise_reject%': typeof Promise === 'undefined' ? undefined : Promise.reject,\n\t'$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined : Promise.resolve,\n\t'$ %Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'$ %RangeError%': RangeError,\n\t'$ %RangeErrorPrototype%': RangeError.prototype,\n\t'$ %ReferenceError%': ReferenceError,\n\t'$ %ReferenceErrorPrototype%': ReferenceError.prototype,\n\t'$ %Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'$ %RegExp%': RegExp,\n\t'$ %RegExpPrototype%': RegExp.prototype,\n\t'$ %Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'$ %SetPrototype%': typeof Set === 'undefined' ? undefined : Set.prototype,\n\t'$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer.prototype,\n\t'$ %String%': String,\n\t'$ %StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'$ %StringPrototype%': String.prototype,\n\t'$ %Symbol%': hasSymbols ? Symbol : undefined,\n\t'$ %SymbolPrototype%': hasSymbols ? Symbol.prototype : undefined,\n\t'$ %SyntaxError%': SyntaxError,\n\t'$ %SyntaxErrorPrototype%': SyntaxError.prototype,\n\t'$ %ThrowTypeError%': ThrowTypeError,\n\t'$ %TypedArray%': TypedArray,\n\t'$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined,\n\t'$ %TypeError%': TypeError,\n\t'$ %TypeErrorPrototype%': TypeError.prototype,\n\t'$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array.prototype,\n\t'$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray.prototype,\n\t'$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array.prototype,\n\t'$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array.prototype,\n\t'$ %URIError%': URIError,\n\t'$ %URIErrorPrototype%': URIError.prototype,\n\t'$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined : WeakMap.prototype,\n\t'$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\t'$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined : WeakSet.prototype\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tvar key = '$ ' + name;\n\tif (!(key in INTRINSICS)) {\n\t\tthrow new SyntaxError('intrinsic ' + name + ' does not exist!');\n\t}\n\n\t// istanbul ignore if // hopefully this is impossible to test :-)\n\tif (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {\n\t\tthrow new TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t}\n\treturn INTRINSICS[key];\n};\n","var $isNaN = Number.isNaN || function (a) { return a !== a; };\n\nmodule.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };\n","var bind = require('function-bind');\nvar has = bind.call(Function.call, Object.prototype.hasOwnProperty);\n\nvar $assign = Object.assign;\n\nmodule.exports = function assign(target, source) {\n\tif ($assign) {\n\t\treturn $assign(target, source);\n\t}\n\n\tfor (var key in source) {\n\t\tif (has(source, key)) {\n\t\t\ttarget[key] = source[key];\n\t\t}\n\t}\n\treturn target;\n};\n","module.exports = function sign(number) {\n\treturn number >= 0 ? 1 : -1;\n};\n","module.exports = function mod(number, modulo) {\n\tvar remain = number % modulo;\n\treturn Math.floor(remain >= 0 ? remain : remain + modulo);\n};\n","module.exports = function isPrimitive(value) {\n\treturn value === null || (typeof value !== 'function' && typeof value !== 'object');\n};\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nvar isPrimitive = require('./helpers/isPrimitive');\n\nvar isCallable = require('is-callable');\n\n// https://es5.github.io/#x8.12\nvar ES5internalSlots = {\n\t'[[DefaultValue]]': function (O, hint) {\n\t\tvar actualHint = hint || (toStr.call(O) === '[object Date]' ? String : Number);\n\n\t\tif (actualHint === String || actualHint === Number) {\n\t\t\tvar methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];\n\t\t\tvar value, i;\n\t\t\tfor (i = 0; i < methods.length; ++i) {\n\t\t\t\tif (isCallable(O[methods[i]])) {\n\t\t\t\t\tvalue = O[methods[i]]();\n\t\t\t\t\tif (isPrimitive(value)) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new TypeError('No default value');\n\t\t}\n\t\tthrow new TypeError('invalid [[DefaultValue]] hint supplied');\n\t}\n};\n\n// https://es5.github.io/#x9\nmodule.exports = function ToPrimitive(input, PreferredType) {\n\tif (isPrimitive(input)) {\n\t\treturn input;\n\t}\n\treturn ES5internalSlots['[[DefaultValue]]'](input, PreferredType);\n};\n","'use strict';\n\nvar GetIntrinsic = require('./GetIntrinsic');\n\nvar $Object = GetIntrinsic('%Object%');\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $String = GetIntrinsic('%String%');\n\nvar $isNaN = require('./helpers/isNaN');\nvar $isFinite = require('./helpers/isFinite');\n\nvar sign = require('./helpers/sign');\nvar mod = require('./helpers/mod');\n\nvar IsCallable = require('is-callable');\nvar toPrimitive = require('es-to-primitive/es5');\n\nvar has = require('has');\n\n// https://es5.github.io/#x9\nvar ES5 = {\n\tToPrimitive: toPrimitive,\n\n\tToBoolean: function ToBoolean(value) {\n\t\treturn !!value;\n\t},\n\tToNumber: function ToNumber(value) {\n\t\treturn +value; // eslint-disable-line no-implicit-coercion\n\t},\n\tToInteger: function ToInteger(value) {\n\t\tvar number = this.ToNumber(value);\n\t\tif ($isNaN(number)) { return 0; }\n\t\tif (number === 0 || !$isFinite(number)) { return number; }\n\t\treturn sign(number) * Math.floor(Math.abs(number));\n\t},\n\tToInt32: function ToInt32(x) {\n\t\treturn this.ToNumber(x) >> 0;\n\t},\n\tToUint32: function ToUint32(x) {\n\t\treturn this.ToNumber(x) >>> 0;\n\t},\n\tToUint16: function ToUint16(value) {\n\t\tvar number = this.ToNumber(value);\n\t\tif ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }\n\t\tvar posInt = sign(number) * Math.floor(Math.abs(number));\n\t\treturn mod(posInt, 0x10000);\n\t},\n\tToString: function ToString(value) {\n\t\treturn $String(value);\n\t},\n\tToObject: function ToObject(value) {\n\t\tthis.CheckObjectCoercible(value);\n\t\treturn $Object(value);\n\t},\n\tCheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {\n\t\t/* jshint eqnull:true */\n\t\tif (value == null) {\n\t\t\tthrow new $TypeError(optMessage || 'Cannot call method on ' + value);\n\t\t}\n\t\treturn value;\n\t},\n\tIsCallable: IsCallable,\n\tSameValue: function SameValue(x, y) {\n\t\tif (x === y) { // 0 === -0, but they are not identical.\n\t\t\tif (x === 0) { return 1 / x === 1 / y; }\n\t\t\treturn true;\n\t\t}\n\t\treturn $isNaN(x) && $isNaN(y);\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/5.1/#sec-8\n\tType: function Type(x) {\n\t\tif (x === null) {\n\t\t\treturn 'Null';\n\t\t}\n\t\tif (typeof x === 'undefined') {\n\t\t\treturn 'Undefined';\n\t\t}\n\t\tif (typeof x === 'function' || typeof x === 'object') {\n\t\t\treturn 'Object';\n\t\t}\n\t\tif (typeof x === 'number') {\n\t\t\treturn 'Number';\n\t\t}\n\t\tif (typeof x === 'boolean') {\n\t\t\treturn 'Boolean';\n\t\t}\n\t\tif (typeof x === 'string') {\n\t\t\treturn 'String';\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type\n\tIsPropertyDescriptor: function IsPropertyDescriptor(Desc) {\n\t\tif (this.Type(Desc) !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\tvar allowed = {\n\t\t\t'[[Configurable]]': true,\n\t\t\t'[[Enumerable]]': true,\n\t\t\t'[[Get]]': true,\n\t\t\t'[[Set]]': true,\n\t\t\t'[[Value]]': true,\n\t\t\t'[[Writable]]': true\n\t\t};\n\t\t// jscs:disable\n\t\tfor (var key in Desc) { // eslint-disable-line\n\t\t\tif (has(Desc, key) && !allowed[key]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t// jscs:enable\n\t\tvar isData = has(Desc, '[[Value]]');\n\t\tvar IsAccessor = has(Desc, '[[Get]]') || has(Desc, '[[Set]]');\n\t\tif (isData && IsAccessor) {\n\t\t\tthrow new $TypeError('Property Descriptors may not be both accessor and data descriptors');\n\t\t}\n\t\treturn true;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.1\n\tIsAccessorDescriptor: function IsAccessorDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.IsPropertyDescriptor(Desc)) {\n\t\t\tthrow new $TypeError('Desc must be a Property Descriptor');\n\t\t}\n\n\t\tif (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.2\n\tIsDataDescriptor: function IsDataDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.IsPropertyDescriptor(Desc)) {\n\t\t\tthrow new $TypeError('Desc must be a Property Descriptor');\n\t\t}\n\n\t\tif (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.3\n\tIsGenericDescriptor: function IsGenericDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.IsPropertyDescriptor(Desc)) {\n\t\t\tthrow new $TypeError('Desc must be a Property Descriptor');\n\t\t}\n\n\t\tif (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.4\n\tFromPropertyDescriptor: function FromPropertyDescriptor(Desc) {\n\t\tif (typeof Desc === 'undefined') {\n\t\t\treturn Desc;\n\t\t}\n\n\t\tif (!this.IsPropertyDescriptor(Desc)) {\n\t\t\tthrow new $TypeError('Desc must be a Property Descriptor');\n\t\t}\n\n\t\tif (this.IsDataDescriptor(Desc)) {\n\t\t\treturn {\n\t\t\t\tvalue: Desc['[[Value]]'],\n\t\t\t\twritable: !!Desc['[[Writable]]'],\n\t\t\t\tenumerable: !!Desc['[[Enumerable]]'],\n\t\t\t\tconfigurable: !!Desc['[[Configurable]]']\n\t\t\t};\n\t\t} else if (this.IsAccessorDescriptor(Desc)) {\n\t\t\treturn {\n\t\t\t\tget: Desc['[[Get]]'],\n\t\t\t\tset: Desc['[[Set]]'],\n\t\t\t\tenumerable: !!Desc['[[Enumerable]]'],\n\t\t\t\tconfigurable: !!Desc['[[Configurable]]']\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new $TypeError('FromPropertyDescriptor must be called with a fully populated Property Descriptor');\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5\n\tToPropertyDescriptor: function ToPropertyDescriptor(Obj) {\n\t\tif (this.Type(Obj) !== 'Object') {\n\t\t\tthrow new $TypeError('ToPropertyDescriptor requires an object');\n\t\t}\n\n\t\tvar desc = {};\n\t\tif (has(Obj, 'enumerable')) {\n\t\t\tdesc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);\n\t\t}\n\t\tif (has(Obj, 'configurable')) {\n\t\t\tdesc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);\n\t\t}\n\t\tif (has(Obj, 'value')) {\n\t\t\tdesc['[[Value]]'] = Obj.value;\n\t\t}\n\t\tif (has(Obj, 'writable')) {\n\t\t\tdesc['[[Writable]]'] = this.ToBoolean(Obj.writable);\n\t\t}\n\t\tif (has(Obj, 'get')) {\n\t\t\tvar getter = Obj.get;\n\t\t\tif (typeof getter !== 'undefined' && !this.IsCallable(getter)) {\n\t\t\t\tthrow new TypeError('getter must be a function');\n\t\t\t}\n\t\t\tdesc['[[Get]]'] = getter;\n\t\t}\n\t\tif (has(Obj, 'set')) {\n\t\t\tvar setter = Obj.set;\n\t\t\tif (typeof setter !== 'undefined' && !this.IsCallable(setter)) {\n\t\t\t\tthrow new $TypeError('setter must be a function');\n\t\t\t}\n\t\t\tdesc['[[Set]]'] = setter;\n\t\t}\n\n\t\tif ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {\n\t\t\tthrow new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');\n\t\t}\n\t\treturn desc;\n\t}\n};\n\nmodule.exports = ES5;\n","'use strict';\n\nvar has = require('has');\nvar regexExec = RegExp.prototype.exec;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar tryRegexExecCall = function tryRegexExec(value) {\n\ttry {\n\t\tvar lastIndex = value.lastIndex;\n\t\tvalue.lastIndex = 0;\n\n\t\tregexExec.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\tvalue.lastIndex = lastIndex;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar regexClass = '[object RegExp]';\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n\nmodule.exports = function isRegex(value) {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\tif (!hasToStringTag) {\n\t\treturn toStr.call(value) === regexClass;\n\t}\n\n\tvar descriptor = gOPD(value, 'lastIndex');\n\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\tif (!hasLastIndexDataProperty) {\n\t\treturn false;\n\t}\n\n\treturn tryRegexExecCall(value);\n};\n","'use strict';\n\nvar has = require('has');\nvar toPrimitive = require('es-to-primitive/es6');\n\nvar GetIntrinsic = require('./GetIntrinsic');\n\nvar $TypeError = GetIntrinsic('%TypeError%');\nvar $SyntaxError = GetIntrinsic('%SyntaxError%');\nvar $Array = GetIntrinsic('%Array%');\nvar $String = GetIntrinsic('%String%');\nvar $Object = GetIntrinsic('%Object%');\nvar $Number = GetIntrinsic('%Number%');\nvar $Symbol = GetIntrinsic('%Symbol%', true);\nvar $RegExp = GetIntrinsic('%RegExp%');\n\nvar hasSymbols = !!$Symbol;\n\nvar $isNaN = require('./helpers/isNaN');\nvar $isFinite = require('./helpers/isFinite');\nvar MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;\n\nvar assign = require('./helpers/assign');\nvar sign = require('./helpers/sign');\nvar mod = require('./helpers/mod');\nvar isPrimitive = require('./helpers/isPrimitive');\nvar parseInteger = parseInt;\nvar bind = require('function-bind');\nvar arraySlice = bind.call(Function.call, $Array.prototype.slice);\nvar strSlice = bind.call(Function.call, $String.prototype.slice);\nvar isBinary = bind.call(Function.call, $RegExp.prototype.test, /^0b[01]+$/i);\nvar isOctal = bind.call(Function.call, $RegExp.prototype.test, /^0o[0-7]+$/i);\nvar regexExec = bind.call(Function.call, $RegExp.prototype.exec);\nvar nonWS = ['\\u0085', '\\u200b', '\\ufffe'].join('');\nvar nonWSregex = new $RegExp('[' + nonWS + ']', 'g');\nvar hasNonWS = bind.call(Function.call, $RegExp.prototype.test, nonWSregex);\nvar invalidHexLiteral = /^[-+]0x[0-9a-f]+$/i;\nvar isInvalidHexLiteral = bind.call(Function.call, $RegExp.prototype.test, invalidHexLiteral);\nvar $charCodeAt = bind.call(Function.call, $String.prototype.charCodeAt);\n\nvar toStr = bind.call(Function.call, Object.prototype.toString);\n\nvar $floor = Math.floor;\nvar $abs = Math.abs;\n\nvar $ObjectCreate = Object.create;\nvar $gOPD = $Object.getOwnPropertyDescriptor;\n\nvar $isExtensible = $Object.isExtensible;\n\n// whitespace from: http://es5.github.io/#x15.5.4.20\n// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324\nvar ws = [\n\t'\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003',\n\t'\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028',\n\t'\\u2029\\uFEFF'\n].join('');\nvar trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');\nvar replace = bind.call(Function.call, $String.prototype.replace);\nvar trim = function (value) {\n\treturn replace(value, trimRegex, '');\n};\n\nvar ES5 = require('./es5');\n\nvar hasRegExpMatcher = require('is-regex');\n\n// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations\nvar ES6 = assign(assign({}, ES5), {\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args\n\tCall: function Call(F, V) {\n\t\tvar args = arguments.length > 2 ? arguments[2] : [];\n\t\tif (!this.IsCallable(F)) {\n\t\t\tthrow new $TypeError(F + ' is not a function');\n\t\t}\n\t\treturn F.apply(V, args);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive\n\tToPrimitive: toPrimitive,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean\n\t// ToBoolean: ES5.ToBoolean,\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-tonumber\n\tToNumber: function ToNumber(argument) {\n\t\tvar value = isPrimitive(argument) ? argument : toPrimitive(argument, $Number);\n\t\tif (typeof value === 'symbol') {\n\t\t\tthrow new $TypeError('Cannot convert a Symbol value to a number');\n\t\t}\n\t\tif (typeof value === 'string') {\n\t\t\tif (isBinary(value)) {\n\t\t\t\treturn this.ToNumber(parseInteger(strSlice(value, 2), 2));\n\t\t\t} else if (isOctal(value)) {\n\t\t\t\treturn this.ToNumber(parseInteger(strSlice(value, 2), 8));\n\t\t\t} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {\n\t\t\t\treturn NaN;\n\t\t\t} else {\n\t\t\t\tvar trimmed = trim(value);\n\t\t\t\tif (trimmed !== value) {\n\t\t\t\t\treturn this.ToNumber(trimmed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $Number(value);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger\n\t// ToInteger: ES5.ToNumber,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32\n\t// ToInt32: ES5.ToInt32,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32\n\t// ToUint32: ES5.ToUint32,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16\n\tToInt16: function ToInt16(argument) {\n\t\tvar int16bit = this.ToUint16(argument);\n\t\treturn int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16\n\t// ToUint16: ES5.ToUint16,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8\n\tToInt8: function ToInt8(argument) {\n\t\tvar int8bit = this.ToUint8(argument);\n\t\treturn int8bit >= 0x80 ? int8bit - 0x100 : int8bit;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8\n\tToUint8: function ToUint8(argument) {\n\t\tvar number = this.ToNumber(argument);\n\t\tif ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }\n\t\tvar posInt = sign(number) * $floor($abs(number));\n\t\treturn mod(posInt, 0x100);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp\n\tToUint8Clamp: function ToUint8Clamp(argument) {\n\t\tvar number = this.ToNumber(argument);\n\t\tif ($isNaN(number) || number <= 0) { return 0; }\n\t\tif (number >= 0xFF) { return 0xFF; }\n\t\tvar f = $floor(argument);\n\t\tif (f + 0.5 < number) { return f + 1; }\n\t\tif (number < f + 0.5) { return f; }\n\t\tif (f % 2 !== 0) { return f + 1; }\n\t\treturn f;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring\n\tToString: function ToString(argument) {\n\t\tif (typeof argument === 'symbol') {\n\t\t\tthrow new $TypeError('Cannot convert a Symbol value to a string');\n\t\t}\n\t\treturn $String(argument);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject\n\tToObject: function ToObject(value) {\n\t\tthis.RequireObjectCoercible(value);\n\t\treturn $Object(value);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey\n\tToPropertyKey: function ToPropertyKey(argument) {\n\t\tvar key = this.ToPrimitive(argument, $String);\n\t\treturn typeof key === 'symbol' ? key : this.ToString(key);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n\tToLength: function ToLength(argument) {\n\t\tvar len = this.ToInteger(argument);\n\t\tif (len <= 0) { return 0; } // includes converting -0 to +0\n\t\tif (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }\n\t\treturn len;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring\n\tCanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {\n\t\tif (toStr(argument) !== '[object String]') {\n\t\t\tthrow new $TypeError('must be a string');\n\t\t}\n\t\tif (argument === '-0') { return -0; }\n\t\tvar n = this.ToNumber(argument);\n\t\tif (this.SameValue(this.ToString(n), argument)) { return n; }\n\t\treturn void 0;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible\n\tRequireObjectCoercible: ES5.CheckObjectCoercible,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray\n\tIsArray: $Array.isArray || function IsArray(argument) {\n\t\treturn toStr(argument) === '[object Array]';\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable\n\t// IsCallable: ES5.IsCallable,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor\n\tIsConstructor: function IsConstructor(argument) {\n\t\treturn typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o\n\tIsExtensible: Object.preventExtensions\n\t\t? function IsExtensible(obj) {\n\t\t\tif (isPrimitive(obj)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn $isExtensible(obj);\n\t\t}\n\t\t: function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger\n\tIsInteger: function IsInteger(argument) {\n\t\tif (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {\n\t\t\treturn false;\n\t\t}\n\t\tvar abs = $abs(argument);\n\t\treturn $floor(abs) === abs;\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey\n\tIsPropertyKey: function IsPropertyKey(argument) {\n\t\treturn typeof argument === 'string' || typeof argument === 'symbol';\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-isregexp\n\tIsRegExp: function IsRegExp(argument) {\n\t\tif (!argument || typeof argument !== 'object') {\n\t\t\treturn false;\n\t\t}\n\t\tif (hasSymbols) {\n\t\t\tvar isRegExp = argument[$Symbol.match];\n\t\t\tif (typeof isRegExp !== 'undefined') {\n\t\t\t\treturn ES5.ToBoolean(isRegExp);\n\t\t\t}\n\t\t}\n\t\treturn hasRegExpMatcher(argument);\n\t},\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue\n\t// SameValue: ES5.SameValue,\n\n\t// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero\n\tSameValueZero: function SameValueZero(x, y) {\n\t\treturn (x === y) || ($isNaN(x) && $isNaN(y));\n\t},\n\n\t/**\n\t * 7.3.2 GetV (V, P)\n\t * 1. Assert: IsPropertyKey(P) is true.\n\t * 2. Let O be ToObject(V).\n\t * 3. ReturnIfAbrupt(O).\n\t * 4. Return O.[[Get]](P, V).\n\t */\n\tGetV: function GetV(V, P) {\n\t\t// 7.3.2.1\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\n\t\t// 7.3.2.2-3\n\t\tvar O = this.ToObject(V);\n\n\t\t// 7.3.2.4\n\t\treturn O[P];\n\t},\n\n\t/**\n\t * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod\n\t * 1. Assert: IsPropertyKey(P) is true.\n\t * 2. Let func be GetV(O, P).\n\t * 3. ReturnIfAbrupt(func).\n\t * 4. If func is either undefined or null, return undefined.\n\t * 5. If IsCallable(func) is false, throw a TypeError exception.\n\t * 6. Return func.\n\t */\n\tGetMethod: function GetMethod(O, P) {\n\t\t// 7.3.9.1\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\n\t\t// 7.3.9.2\n\t\tvar func = this.GetV(O, P);\n\n\t\t// 7.3.9.4\n\t\tif (func == null) {\n\t\t\treturn void 0;\n\t\t}\n\n\t\t// 7.3.9.5\n\t\tif (!this.IsCallable(func)) {\n\t\t\tthrow new $TypeError(P + 'is not a function');\n\t\t}\n\n\t\t// 7.3.9.6\n\t\treturn func;\n\t},\n\n\t/**\n\t * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p\n\t * 1. Assert: Type(O) is Object.\n\t * 2. Assert: IsPropertyKey(P) is true.\n\t * 3. Return O.[[Get]](P, O).\n\t */\n\tGet: function Get(O, P) {\n\t\t// 7.3.1.1\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\t// 7.3.1.2\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\t\t// 7.3.1.3\n\t\treturn O[P];\n\t},\n\n\tType: function Type(x) {\n\t\tif (typeof x === 'symbol') {\n\t\t\treturn 'Symbol';\n\t\t}\n\t\treturn ES5.Type(x);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor\n\tSpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tvar C = O.constructor;\n\t\tif (typeof C === 'undefined') {\n\t\t\treturn defaultConstructor;\n\t\t}\n\t\tif (this.Type(C) !== 'Object') {\n\t\t\tthrow new $TypeError('O.constructor is not an Object');\n\t\t}\n\t\tvar S = hasSymbols && $Symbol.species ? C[$Symbol.species] : void 0;\n\t\tif (S == null) {\n\t\t\treturn defaultConstructor;\n\t\t}\n\t\tif (this.IsConstructor(S)) {\n\t\t\treturn S;\n\t\t}\n\t\tthrow new $TypeError('no constructor found');\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor\n\tCompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {\n\t\tif (!this.IsPropertyDescriptor(Desc)) {\n\t\t\tthrow new $TypeError('Desc must be a Property Descriptor');\n\t\t}\n\n\t\tif (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {\n\t\t\tif (!has(Desc, '[[Value]]')) {\n\t\t\t\tDesc['[[Value]]'] = void 0;\n\t\t\t}\n\t\t\tif (!has(Desc, '[[Writable]]')) {\n\t\t\t\tDesc['[[Writable]]'] = false;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!has(Desc, '[[Get]]')) {\n\t\t\t\tDesc['[[Get]]'] = void 0;\n\t\t\t}\n\t\t\tif (!has(Desc, '[[Set]]')) {\n\t\t\t\tDesc['[[Set]]'] = void 0;\n\t\t\t}\n\t\t}\n\t\tif (!has(Desc, '[[Enumerable]]')) {\n\t\t\tDesc['[[Enumerable]]'] = false;\n\t\t}\n\t\tif (!has(Desc, '[[Configurable]]')) {\n\t\t\tDesc['[[Configurable]]'] = false;\n\t\t}\n\t\treturn Desc;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw\n\tSet: function Set(O, P, V, Throw) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\tif (this.Type(Throw) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Throw must be a Boolean');\n\t\t}\n\t\tif (Throw) {\n\t\t\tO[P] = V;\n\t\t\treturn true;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tO[P] = V;\n\t\t\t} catch (e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty\n\tHasOwnProperty: function HasOwnProperty(O, P) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\treturn has(O, P);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty\n\tHasProperty: function HasProperty(O, P) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('O must be an Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\treturn P in O;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable\n\tIsConcatSpreadable: function IsConcatSpreadable(O) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\tif (hasSymbols && typeof $Symbol.isConcatSpreadable === 'symbol') {\n\t\t\tvar spreadable = this.Get(O, Symbol.isConcatSpreadable);\n\t\t\tif (typeof spreadable !== 'undefined') {\n\t\t\t\treturn this.ToBoolean(spreadable);\n\t\t\t}\n\t\t}\n\t\treturn this.IsArray(O);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-invoke\n\tInvoke: function Invoke(O, P) {\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('P must be a Property Key');\n\t\t}\n\t\tvar argumentsList = arraySlice(arguments, 2);\n\t\tvar func = this.GetV(O, P);\n\t\treturn this.Call(func, O, argumentsList);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-getiterator\n\tGetIterator: function GetIterator(obj, method) {\n\t\tif (!hasSymbols) {\n\t\t\tthrow new SyntaxError('ES.GetIterator depends on native iterator support.');\n\t\t}\n\n\t\tvar actualMethod = method;\n\t\tif (arguments.length < 2) {\n\t\t\tactualMethod = this.GetMethod(obj, $Symbol.iterator);\n\t\t}\n\t\tvar iterator = this.Call(actualMethod, obj);\n\t\tif (this.Type(iterator) !== 'Object') {\n\t\t\tthrow new $TypeError('iterator must return an object');\n\t\t}\n\n\t\treturn iterator;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext\n\tIteratorNext: function IteratorNext(iterator, value) {\n\t\tvar result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);\n\t\tif (this.Type(result) !== 'Object') {\n\t\t\tthrow new $TypeError('iterator next must return an object');\n\t\t}\n\t\treturn result;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete\n\tIteratorComplete: function IteratorComplete(iterResult) {\n\t\tif (this.Type(iterResult) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(iterResult) is not Object');\n\t\t}\n\t\treturn this.ToBoolean(this.Get(iterResult, 'done'));\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue\n\tIteratorValue: function IteratorValue(iterResult) {\n\t\tif (this.Type(iterResult) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(iterResult) is not Object');\n\t\t}\n\t\treturn this.Get(iterResult, 'value');\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep\n\tIteratorStep: function IteratorStep(iterator) {\n\t\tvar result = this.IteratorNext(iterator);\n\t\tvar done = this.IteratorComplete(result);\n\t\treturn done === true ? false : result;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose\n\tIteratorClose: function IteratorClose(iterator, completion) {\n\t\tif (this.Type(iterator) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(iterator) is not Object');\n\t\t}\n\t\tif (!this.IsCallable(completion)) {\n\t\t\tthrow new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');\n\t\t}\n\t\tvar completionThunk = completion;\n\n\t\tvar iteratorReturn = this.GetMethod(iterator, 'return');\n\n\t\tif (typeof iteratorReturn === 'undefined') {\n\t\t\treturn completionThunk();\n\t\t}\n\n\t\tvar completionRecord;\n\t\ttry {\n\t\t\tvar innerResult = this.Call(iteratorReturn, iterator, []);\n\t\t} catch (e) {\n\t\t\t// if we hit here, then \"e\" is the innerResult completion that needs re-throwing\n\n\t\t\t// if the completion is of type \"throw\", this will throw.\n\t\t\tcompletionRecord = completionThunk();\n\t\t\tcompletionThunk = null; // ensure it's not called twice.\n\n\t\t\t// if not, then return the innerResult completion\n\t\t\tthrow e;\n\t\t}\n\t\tcompletionRecord = completionThunk(); // if innerResult worked, then throw if the completion does\n\t\tcompletionThunk = null; // ensure it's not called twice.\n\n\t\tif (this.Type(innerResult) !== 'Object') {\n\t\t\tthrow new $TypeError('iterator .return must return an object');\n\t\t}\n\n\t\treturn completionRecord;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject\n\tCreateIterResultObject: function CreateIterResultObject(value, done) {\n\t\tif (this.Type(done) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(done) is not Boolean');\n\t\t}\n\t\treturn {\n\t\t\tvalue: value,\n\t\t\tdone: done\n\t\t};\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec\n\tRegExpExec: function RegExpExec(R, S) {\n\t\tif (this.Type(R) !== 'Object') {\n\t\t\tthrow new $TypeError('R must be an Object');\n\t\t}\n\t\tif (this.Type(S) !== 'String') {\n\t\t\tthrow new $TypeError('S must be a String');\n\t\t}\n\t\tvar exec = this.Get(R, 'exec');\n\t\tif (this.IsCallable(exec)) {\n\t\t\tvar result = this.Call(exec, R, [S]);\n\t\t\tif (result === null || this.Type(result) === 'Object') {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tthrow new $TypeError('\"exec\" method must return `null` or an Object');\n\t\t}\n\t\treturn regexExec(R, S);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate\n\tArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {\n\t\tif (!this.IsInteger(length) || length < 0) {\n\t\t\tthrow new $TypeError('Assertion failed: length must be an integer >= 0');\n\t\t}\n\t\tvar len = length === 0 ? 0 : length;\n\t\tvar C;\n\t\tvar isArray = this.IsArray(originalArray);\n\t\tif (isArray) {\n\t\t\tC = this.Get(originalArray, 'constructor');\n\t\t\t// TODO: figure out how to make a cross-realm normal Array, a same-realm Array\n\t\t\t// if (this.IsConstructor(C)) {\n\t\t\t// \tif C is another realm's Array, C = undefined\n\t\t\t// \tObject.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?\n\t\t\t// }\n\t\t\tif (this.Type(C) === 'Object' && hasSymbols && $Symbol.species) {\n\t\t\t\tC = this.Get(C, $Symbol.species);\n\t\t\t\tif (C === null) {\n\t\t\t\t\tC = void 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof C === 'undefined') {\n\t\t\treturn $Array(len);\n\t\t}\n\t\tif (!this.IsConstructor(C)) {\n\t\t\tthrow new $TypeError('C must be a constructor');\n\t\t}\n\t\treturn new C(len); // this.Construct(C, len);\n\t},\n\n\tCreateDataProperty: function CreateDataProperty(O, P, V) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\t\tvar oldDesc = $gOPD(O, P);\n\t\tvar extensible = oldDesc || (typeof $isExtensible !== 'function' || $isExtensible(O));\n\t\tvar immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);\n\t\tif (immutable || !extensible) {\n\t\t\treturn false;\n\t\t}\n\t\tvar newDesc = {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: V,\n\t\t\twritable: true\n\t\t};\n\t\tObject.defineProperty(O, P, newDesc);\n\t\treturn true;\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow\n\tCreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {\n\t\tif (this.Type(O) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: Type(O) is not Object');\n\t\t}\n\t\tif (!this.IsPropertyKey(P)) {\n\t\t\tthrow new $TypeError('Assertion failed: IsPropertyKey(P) is not true');\n\t\t}\n\t\tvar success = this.CreateDataProperty(O, P, V);\n\t\tif (!success) {\n\t\t\tthrow new $TypeError('unable to create data property');\n\t\t}\n\t\treturn success;\n\t},\n\n\t// https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate\n\tObjectCreate: function ObjectCreate(proto, internalSlotsList) {\n\t\tif (proto !== null && this.Type(proto) !== 'Object') {\n\t\t\tthrow new $TypeError('Assertion failed: proto must be null or an object');\n\t\t}\n\t\tvar slots = arguments.length < 2 ? [] : internalSlotsList;\n\t\tif (slots.length > 0) {\n\t\t\tthrow new $SyntaxError('es-abstract does not yet support internal slots');\n\t\t}\n\n\t\tif (proto === null && !$ObjectCreate) {\n\t\t\tthrow new $SyntaxError('native Object.create support is required to create null objects');\n\t\t}\n\n\t\treturn $ObjectCreate(proto);\n\t},\n\n\t// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex\n\tAdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {\n\t\tif (this.Type(S) !== 'String') {\n\t\t\tthrow new $TypeError('S must be a String');\n\t\t}\n\t\tif (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {\n\t\t\tthrow new $TypeError('Assertion failed: length must be an integer >= 0 and <= 2**53');\n\t\t}\n\t\tif (this.Type(unicode) !== 'Boolean') {\n\t\t\tthrow new $TypeError('Assertion failed: unicode must be a Boolean');\n\t\t}\n\t\tif (!unicode) {\n\t\t\treturn index + 1;\n\t\t}\n\t\tvar length = S.length;\n\t\tif ((index + 1) >= length) {\n\t\t\treturn index + 1;\n\t\t}\n\n\t\tvar first = $charCodeAt(S, index);\n\t\tif (first < 0xD800 || first > 0xDBFF) {\n\t\t\treturn index + 1;\n\t\t}\n\n\t\tvar second = $charCodeAt(S, index + 1);\n\t\tif (second < 0xDC00 || second > 0xDFFF) {\n\t\t\treturn index + 1;\n\t\t}\n\n\t\treturn index + 2;\n\t}\n});\n\ndelete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible\n\nmodule.exports = ES6;\n","'use strict';\n\nvar ES2015 = require('./es2015');\nvar assign = require('./helpers/assign');\n\nvar ES2016 = assign(assign({}, ES2015), {\n\t// https://github.com/tc39/ecma262/pull/60\n\tSameValueNonNumber: function SameValueNonNumber(x, y) {\n\t\tif (typeof x === 'number' || typeof x !== typeof y) {\n\t\t\tthrow new TypeError('SameValueNonNumber requires two non-number values of the same type.');\n\t\t}\n\t\treturn this.SameValue(x, y);\n\t}\n});\n\nmodule.exports = ES2016;\n","'use strict';\n\nvar ES = require('es-abstract/es7');\nvar has = require('has');\nvar bind = require('function-bind');\nvar isEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);\n\nmodule.exports = function values(O) {\n\tvar obj = ES.RequireObjectCoercible(O);\n\tvar vals = [];\n\tfor (var key in obj) {\n\t\tif (has(obj, key) && isEnumerable(obj, key)) {\n\t\t\tvals.push(obj[key]);\n\t\t}\n\t}\n\treturn vals;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.values === 'function' ? Object.values : implementation;\n};\n","'use strict';\n\nvar define = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = getPolyfill();\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n","'use strict';\n\nvar getPolyfill = require('./polyfill');\nvar define = require('define-properties');\n\nmodule.exports = function shimValues() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { values: polyfill }, {\n\t\tvalues: function testValues() {\n\t\t\treturn Object.values !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n","'use strict';\n\nvar values = require('object.values');\nif (!Object.values) {\n values.shim();\n}\n\n\nvar CSSClassList = function(node) {\n this.parentNode = node;\n this.classNames = new Set();\n this.classAttr = null;\n //this.classValue = null;\n};\n\n\nCSSClassList.prototype.hasClass = function() {\n this.classAttr = { // empty class attr\n 'name': 'class',\n 'value': null\n };\n\n this.addClassHandler();\n};\n\n\n// attr.class\n\nCSSClassList.prototype.addClassHandler = function() {\n\n Object.defineProperty(this.parentNode.attrs, 'class', {\n get: this.getClassAttr.bind(this),\n set: this.setClassAttr.bind(this),\n enumerable: true,\n configurable: true\n });\n\n this.addClassValueHandler();\n};\n\n// attr.class.value\n\nCSSClassList.prototype.addClassValueHandler = function() {\n\n Object.defineProperty(this.classAttr, 'value', {\n get: this.getClassValue.bind(this),\n set: this.setClassValue.bind(this),\n enumerable: true,\n configurable: true\n });\n};\n\nCSSClassList.prototype.getClassAttr = function() {\n return this.classAttr;\n};\n\nCSSClassList.prototype.setClassAttr = function(newClassAttr) {\n this.setClassValue(newClassAttr.value); // must before applying value handler!\n\n this.classAttr = newClassAttr;\n this.addClassValueHandler();\n};\n\nCSSClassList.prototype.getClassValue = function() {\n var arrClassNames = Array.from(this.classNames);\n return arrClassNames.join(' ');\n};\n\nCSSClassList.prototype.setClassValue = function(newValue) {\n if(typeof newValue === 'undefined') {\n this.classNames.clear();\n return;\n }\n var arrClassNames = newValue.split(' ');\n this.classNames = new Set(arrClassNames);\n};\n\n\nCSSClassList.prototype.add = function(/* variadic */) {\n this.hasClass();\n Object.values(arguments).forEach(this._addSingle.bind(this));\n};\n\nCSSClassList.prototype._addSingle = function(className) {\n this.classNames.add(className);\n};\n\n\nCSSClassList.prototype.remove = function(/* variadic */) {\n this.hasClass();\n Object.values(arguments).forEach(this._removeSingle.bind(this));\n};\n\nCSSClassList.prototype._removeSingle = function(className) {\n this.classNames.delete(className);\n};\n\n\nCSSClassList.prototype.item = function(index) {\n var arrClassNames = Array.from(this.classNames);\n return arrClassNames[index];\n};\n\nCSSClassList.prototype.toggle = function(className, force) {\n if(this.contains(className) || force === false) {\n this.classNames.delete(className);\n }\n this.classNames.add(className);\n};\n\nCSSClassList.prototype.contains = function(className) {\n return this.classNames.has(className);\n};\n\n\nmodule.exports = CSSClassList;","module.exports = function createCustomError(name, message) {\n // use Object.create(), because some VMs prevent setting line/column otherwise\n // (iOS Safari 10 even throws an exception)\n var error = Object.create(SyntaxError.prototype);\n var errorStack = new Error();\n\n error.name = name;\n error.message = message;\n\n Object.defineProperty(error, 'stack', {\n get: function() {\n return (errorStack.stack || '').replace(/^(.+\\n){1,3}/, name + ': ' + message + '\\n');\n }\n });\n\n return error;\n};\n","'use strict';\n\n// token types (note: value shouldn't intersect with used char codes)\nvar WHITESPACE = 1;\nvar IDENTIFIER = 2;\nvar NUMBER = 3;\nvar STRING = 4;\nvar COMMENT = 5;\nvar PUNCTUATOR = 6;\nvar CDO = 7;\nvar CDC = 8;\nvar ATRULE = 14;\nvar FUNCTION = 15;\nvar URL = 16;\nvar RAW = 17;\n\nvar TAB = 9;\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar SPACE = 32;\n\nvar TYPE = {\n WhiteSpace: WHITESPACE,\n Identifier: IDENTIFIER,\n Number: NUMBER,\n String: STRING,\n Comment: COMMENT,\n Punctuator: PUNCTUATOR,\n CDO: CDO,\n CDC: CDC,\n Atrule: ATRULE,\n Function: FUNCTION,\n Url: URL,\n Raw: RAW,\n\n ExclamationMark: 33, // !\n QuotationMark: 34, // \"\n NumberSign: 35, // #\n DollarSign: 36, // $\n PercentSign: 37, // %\n Ampersand: 38, // &\n Apostrophe: 39, // '\n LeftParenthesis: 40, // (\n RightParenthesis: 41, // )\n Asterisk: 42, // *\n PlusSign: 43, // +\n Comma: 44, // ,\n HyphenMinus: 45, // -\n FullStop: 46, // .\n Solidus: 47, // /\n Colon: 58, // :\n Semicolon: 59, // ;\n LessThanSign: 60, // <\n EqualsSign: 61, // =\n GreaterThanSign: 62, // >\n QuestionMark: 63, // ?\n CommercialAt: 64, // @\n LeftSquareBracket: 91, // [\n Backslash: 92, // \\\n RightSquareBracket: 93, // ]\n CircumflexAccent: 94, // ^\n LowLine: 95, // _\n GraveAccent: 96, // `\n LeftCurlyBracket: 123, // {\n VerticalLine: 124, // |\n RightCurlyBracket: 125, // }\n Tilde: 126 // ~\n};\n\nvar NAME = Object.keys(TYPE).reduce(function(result, key) {\n result[TYPE[key]] = key;\n return result;\n}, {});\n\n// https://drafts.csswg.org/css-syntax/#tokenizer-definitions\n// > non-ASCII code point\n// > A code point with a value equal to or greater than U+0080 <control>\n// > name-start code point\n// > A letter, a non-ASCII code point, or U+005F LOW LINE (_).\n// > name code point\n// > A name-start code point, a digit, or U+002D HYPHEN-MINUS (-)\n// That means only ASCII code points has a special meaning and we a maps for 0..127 codes only\nvar SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported\nvar SYMBOL_TYPE = new SafeUint32Array(0x80);\nvar PUNCTUATION = new SafeUint32Array(0x80);\nvar STOP_URL_RAW = new SafeUint32Array(0x80);\n\nfor (var i = 0; i < SYMBOL_TYPE.length; i++) {\n SYMBOL_TYPE[i] = IDENTIFIER;\n}\n\n// fill categories\n[\n TYPE.ExclamationMark, // !\n TYPE.QuotationMark, // \"\n TYPE.NumberSign, // #\n TYPE.DollarSign, // $\n TYPE.PercentSign, // %\n TYPE.Ampersand, // &\n TYPE.Apostrophe, // '\n TYPE.LeftParenthesis, // (\n TYPE.RightParenthesis, // )\n TYPE.Asterisk, // *\n TYPE.PlusSign, // +\n TYPE.Comma, // ,\n TYPE.HyphenMinus, // -\n TYPE.FullStop, // .\n TYPE.Solidus, // /\n TYPE.Colon, // :\n TYPE.Semicolon, // ;\n TYPE.LessThanSign, // <\n TYPE.EqualsSign, // =\n TYPE.GreaterThanSign, // >\n TYPE.QuestionMark, // ?\n TYPE.CommercialAt, // @\n TYPE.LeftSquareBracket, // [\n // TYPE.Backslash, // \\\n TYPE.RightSquareBracket, // ]\n TYPE.CircumflexAccent, // ^\n // TYPE.LowLine, // _\n TYPE.GraveAccent, // `\n TYPE.LeftCurlyBracket, // {\n TYPE.VerticalLine, // |\n TYPE.RightCurlyBracket, // }\n TYPE.Tilde // ~\n].forEach(function(key) {\n SYMBOL_TYPE[Number(key)] = PUNCTUATOR;\n PUNCTUATION[Number(key)] = PUNCTUATOR;\n});\n\nfor (var i = 48; i <= 57; i++) {\n SYMBOL_TYPE[i] = NUMBER;\n}\n\nSYMBOL_TYPE[SPACE] = WHITESPACE;\nSYMBOL_TYPE[TAB] = WHITESPACE;\nSYMBOL_TYPE[N] = WHITESPACE;\nSYMBOL_TYPE[R] = WHITESPACE;\nSYMBOL_TYPE[F] = WHITESPACE;\n\nSYMBOL_TYPE[TYPE.Apostrophe] = STRING;\nSYMBOL_TYPE[TYPE.QuotationMark] = STRING;\n\nSTOP_URL_RAW[SPACE] = 1;\nSTOP_URL_RAW[TAB] = 1;\nSTOP_URL_RAW[N] = 1;\nSTOP_URL_RAW[R] = 1;\nSTOP_URL_RAW[F] = 1;\nSTOP_URL_RAW[TYPE.Apostrophe] = 1;\nSTOP_URL_RAW[TYPE.QuotationMark] = 1;\nSTOP_URL_RAW[TYPE.LeftParenthesis] = 1;\nSTOP_URL_RAW[TYPE.RightParenthesis] = 1;\n\n// whitespace is punctuation ...\nPUNCTUATION[SPACE] = PUNCTUATOR;\nPUNCTUATION[TAB] = PUNCTUATOR;\nPUNCTUATION[N] = PUNCTUATOR;\nPUNCTUATION[R] = PUNCTUATOR;\nPUNCTUATION[F] = PUNCTUATOR;\n// ... hyper minus is not\nPUNCTUATION[TYPE.HyphenMinus] = 0;\n\nmodule.exports = {\n TYPE: TYPE,\n NAME: NAME,\n\n SYMBOL_TYPE: SYMBOL_TYPE,\n PUNCTUATION: PUNCTUATION,\n STOP_URL_RAW: STOP_URL_RAW\n};\n","'use strict';\n\nvar createCustomError = require('../../utils/createCustomError');\n\nvar SyntaxParseError = function(message, syntaxStr, offset) {\n var error = createCustomError('SyntaxParseError', message);\n\n error.rawMessage = message;\n error.syntax = syntaxStr;\n error.offset = offset;\n error.message = error.rawMessage + '\\n' +\n ' ' + error.syntax + '\\n' +\n '--' + new Array((error.offset || error.syntax.length) + 1).join('-') + '^';\n\n return error;\n};\n\nmodule.exports = {\n SyntaxParseError: SyntaxParseError\n};\n","'use strict';\n\nmodule.exports = function walk(node, fn, context) {\n switch (node.type) {\n case 'Group':\n node.terms.forEach(function(term) {\n walk(term, fn, context);\n });\n break;\n\n case 'Function':\n case 'Parentheses':\n walk(node.children, fn, context);\n break;\n\n case 'Keyword':\n case 'Type':\n case 'Property':\n case 'Combinator':\n case 'Comma':\n case 'Slash':\n case 'String':\n case 'Percent':\n break;\n\n default:\n throw new Error('Unknown type: ' + node.type);\n }\n\n fn.call(context, node);\n};\n","module.exports = {\n SyntaxParseError: require('./error').SyntaxParseError,\n parse: require('./parse'),\n translate: require('./translate'),\n walk: require('./walk')\n};\n","var List = require('../utils/list');\nvar TYPE = require('../tokenizer').TYPE;\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\n\nmodule.exports = function readSequence(recognizer) {\n var children = new List();\n var child = null;\n var context = {\n recognizer: recognizer,\n space: null,\n ignoreWS: false,\n ignoreWSAfter: false\n };\n\n this.scanner.skipSC();\n\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case COMMENT:\n this.scanner.next();\n continue;\n\n case WHITESPACE:\n if (context.ignoreWS) {\n this.scanner.next();\n } else {\n context.space = this.WhiteSpace();\n }\n continue;\n }\n\n child = recognizer.getNode.call(this, context);\n\n if (child === undefined) {\n break;\n }\n\n if (context.space !== null) {\n children.appendData(context.space);\n context.space = null;\n }\n\n children.appendData(child);\n\n if (context.ignoreWSAfter) {\n context.ignoreWSAfter = false;\n context.ignoreWS = true;\n } else {\n context.ignoreWS = false;\n }\n }\n\n return children;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n","'use strict';\n\nvar SourceMapGenerator = require('source-map').SourceMapGenerator;\nvar trackNodes = {\n Atrule: true,\n Selector: true,\n Declaration: true\n};\n\nmodule.exports = function generateSourceMap(generator, ast) {\n var map = new SourceMapGenerator();\n var generated = {\n line: 1,\n column: 0\n };\n var original = {\n line: 0, // should be zero to add first mapping\n column: 0\n };\n var sourceMappingActive = false;\n var activatedGenerated = {\n line: 1,\n column: 0\n };\n var activatedMapping = {\n generated: activatedGenerated\n };\n\n var css = generator(ast, function(node, buffer, line, column) {\n if (!node.loc ||\n !node.loc.start ||\n !trackNodes.hasOwnProperty(node.type)) {\n return;\n }\n\n var nodeLine = node.loc.start.line;\n var nodeColumn = node.loc.start.column - 1;\n\n if (original.line !== nodeLine ||\n original.column !== nodeColumn) {\n original.line = nodeLine;\n original.column = nodeColumn;\n\n generated.line = line;\n generated.column = column;\n\n if (sourceMappingActive) {\n sourceMappingActive = false;\n if (generated.line !== activatedGenerated.line ||\n generated.column !== activatedGenerated.column) {\n map.addMapping(activatedMapping);\n }\n }\n\n sourceMappingActive = true;\n map.addMapping({\n source: node.loc.source,\n original: original,\n generated: generated\n });\n }\n\n }, function(node, buffer, line, column) {\n if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) {\n activatedGenerated.line = line;\n activatedGenerated.column = column;\n }\n });\n\n if (sourceMappingActive) {\n map.addMapping(activatedMapping);\n }\n\n return {\n css: css,\n map: map\n };\n};\n","var List = require('../utils/list');\n\nmodule.exports = function createConvertors(walker) {\n var walk = walker.walk;\n var walkUp = walker.walkUp;\n\n return {\n fromPlainObject: function(ast) {\n walk(ast, function(node) {\n if (node.children && node.children instanceof List === false) {\n node.children = new List().fromArray(node.children);\n }\n });\n\n return ast;\n },\n toPlainObject: function(ast) {\n walkUp(ast, function(node) {\n if (node.children && node.children instanceof List) {\n node.children = node.children.toArray();\n }\n });\n\n return ast;\n }\n };\n};\n","'use strict';\n\nvar List = require('./list');\n\nmodule.exports = function clone(node) {\n var result = {};\n\n for (var key in node) {\n var value = node[key];\n\n if (value) {\n if (Array.isArray(value)) {\n value = value.slice(0);\n } else if (value instanceof List) {\n value = new List().fromArray(value.map(clone));\n } else if (value.constructor === Object) {\n value = clone(value);\n }\n }\n\n result[key] = value;\n }\n\n return result;\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;\n\n// currently only Grid Layout uses square brackets, but left it universal\n// https://drafts.csswg.org/css-grid/#track-sizing\n// [ ident* ]\nmodule.exports = {\n name: 'Brackets',\n structure: {\n children: [[]]\n },\n parse: function(readSequence, recognizer) {\n var start = this.scanner.tokenStart;\n var children = null;\n\n this.scanner.eat(LEFTSQUAREBRACKET);\n children = readSequence.call(this, recognizer);\n this.scanner.eat(RIGHTSQUAREBRACKET);\n\n return {\n type: 'Brackets',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(processChunk, node) {\n processChunk('[');\n this.each(processChunk, node);\n processChunk(']');\n }\n};\n","var CDC = require('../../tokenizer').TYPE.CDC;\n\nmodule.exports = {\n name: 'CDC',\n structure: [],\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.eat(CDC); // -->\n\n return {\n type: 'CDC',\n loc: this.getLocation(start, this.scanner.tokenStart)\n };\n },\n generate: function(processChunk) {\n processChunk('-->');\n }\n};\n","var CDO = require('../../tokenizer').TYPE.CDO;\n\nmodule.exports = {\n name: 'CDO',\n structure: [],\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.eat(CDO); // <!--\n\n return {\n type: 'CDO',\n loc: this.getLocation(start, this.scanner.tokenStart)\n };\n },\n generate: function(processChunk) {\n processChunk('<!--');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar IDENTIFIER = TYPE.Identifier;\nvar FULLSTOP = TYPE.FullStop;\n\n// '.' ident\nmodule.exports = {\n name: 'ClassSelector',\n structure: {\n name: String\n },\n parse: function() {\n this.scanner.eat(FULLSTOP);\n\n return {\n type: 'ClassSelector',\n loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),\n name: this.scanner.consume(IDENTIFIER)\n };\n },\n generate: function(processChunk, node) {\n processChunk('.');\n processChunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar PLUSSIGN = TYPE.PlusSign;\nvar SOLIDUS = TYPE.Solidus;\nvar GREATERTHANSIGN = TYPE.GreaterThanSign;\nvar TILDE = TYPE.Tilde;\n\n// + | > | ~ | /deep/\nmodule.exports = {\n name: 'Combinator',\n structure: {\n name: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n switch (this.scanner.tokenType) {\n case GREATERTHANSIGN:\n case PLUSSIGN:\n case TILDE:\n this.scanner.next();\n break;\n\n case SOLIDUS:\n this.scanner.next();\n this.scanner.expectIdentifier('deep');\n this.scanner.eat(SOLIDUS);\n break;\n\n default:\n this.scanner.error('Combinator is expected');\n }\n\n return {\n type: 'Combinator',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(start)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar ASTERISK = TYPE.Asterisk;\nvar SOLIDUS = TYPE.Solidus;\n\n// '/*' .* '*/'\nmodule.exports = {\n name: 'Comment',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var end = this.scanner.tokenEnd;\n\n if ((end - start + 2) >= 2 &&\n this.scanner.source.charCodeAt(end - 2) === ASTERISK &&\n this.scanner.source.charCodeAt(end - 1) === SOLIDUS) {\n end -= 2;\n }\n\n this.scanner.next();\n\n return {\n type: 'Comment',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.source.substring(start + 2, end)\n };\n },\n generate: function(processChunk, node) {\n processChunk('/*');\n processChunk(node.value);\n processChunk('*/');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// <function-token> <sequence> ')'\nmodule.exports = {\n name: 'Function',\n structure: {\n name: String,\n children: [[]]\n },\n parse: function(readSequence, recognizer) {\n var start = this.scanner.tokenStart;\n var name = this.scanner.consumeFunctionName();\n var nameLowerCase = name.toLowerCase();\n var children;\n\n children = recognizer.hasOwnProperty(nameLowerCase)\n ? recognizer[nameLowerCase].call(this, recognizer)\n : readSequence.call(this, recognizer);\n\n this.scanner.eat(RIGHTPARENTHESIS);\n\n return {\n type: 'Function',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n children: children\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.name);\n processChunk('(');\n this.each(processChunk, node);\n processChunk(')');\n },\n walkContext: 'function'\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar IDENTIFIER = TYPE.Identifier;\n\nmodule.exports = {\n name: 'Identifier',\n structure: {\n name: String\n },\n parse: function() {\n return {\n type: 'Identifier',\n loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n name: this.scanner.consume(IDENTIFIER)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBERSIGN = TYPE.NumberSign;\n\n// '#' ident\nmodule.exports = {\n name: 'IdSelector',\n structure: {\n name: String\n },\n parse: function() {\n this.scanner.eat(NUMBERSIGN);\n\n return {\n type: 'IdSelector',\n loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),\n name: this.scanner.consume(IDENTIFIER)\n };\n },\n generate: function(processChunk, node) {\n processChunk('#');\n processChunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\nvar COLON = TYPE.Colon;\nvar SOLIDUS = TYPE.Solidus;\n\nmodule.exports = {\n name: 'MediaFeature',\n structure: {\n name: String,\n value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var name;\n var value = null;\n\n this.scanner.eat(LEFTPARENTHESIS);\n this.scanner.skipSC();\n\n name = this.scanner.consume(IDENTIFIER);\n this.scanner.skipSC();\n\n if (this.scanner.tokenType !== RIGHTPARENTHESIS) {\n this.scanner.eat(COLON);\n this.scanner.skipSC();\n\n switch (this.scanner.tokenType) {\n case NUMBER:\n if (this.scanner.lookupType(1) === IDENTIFIER) {\n value = this.Dimension();\n } else if (this.scanner.lookupNonWSType(1) === SOLIDUS) {\n value = this.Ratio();\n } else {\n value = this.Number();\n }\n\n break;\n\n case IDENTIFIER:\n value = this.Identifier();\n\n break;\n\n default:\n this.scanner.error('Number, dimension, ratio or identifier is expected');\n }\n\n this.scanner.skipSC();\n }\n\n this.scanner.eat(RIGHTPARENTHESIS);\n\n return {\n type: 'MediaFeature',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n value: value\n };\n },\n generate: function(processChunk, node) {\n processChunk('(');\n processChunk(node.name);\n if (node.value !== null) {\n processChunk(':');\n this.generate(processChunk, node.value);\n }\n processChunk(')');\n }\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar IDENTIFIER = TYPE.Identifier;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\n\nmodule.exports = {\n name: 'MediaQuery',\n structure: {\n children: [['Identifier', 'MediaFeature', 'WhiteSpace']]\n },\n parse: function() {\n this.scanner.skipSC();\n\n var children = new List();\n var child = null;\n var space = null;\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case COMMENT:\n this.scanner.next();\n continue;\n\n case WHITESPACE:\n space = this.WhiteSpace();\n continue;\n\n case IDENTIFIER:\n child = this.Identifier();\n break;\n\n case LEFTPARENTHESIS:\n child = this.MediaFeature();\n break;\n\n default:\n break scan;\n }\n\n if (space !== null) {\n children.appendData(space);\n space = null;\n }\n\n children.appendData(child);\n }\n\n if (child === null) {\n this.scanner.error('Identifier or parenthesis is expected');\n }\n\n return {\n type: 'MediaQuery',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.each(processChunk, node);\n }\n};\n","var List = require('../../utils/list');\nvar COMMA = require('../../tokenizer').TYPE.Comma;\n\nmodule.exports = {\n name: 'MediaQueryList',\n structure: {\n children: [['MediaQuery']]\n },\n parse: function(relative) {\n var children = new List();\n\n this.scanner.skipSC();\n\n while (!this.scanner.eof) {\n children.appendData(this.MediaQuery(relative));\n\n if (this.scanner.tokenType !== COMMA) {\n break;\n }\n\n this.scanner.next();\n }\n\n return {\n type: 'MediaQueryList',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.eachComma(processChunk, node);\n }\n};\n","var NUMBER = require('../../tokenizer').TYPE.Number;\n\nmodule.exports = {\n name: 'Number',\n structure: {\n value: String\n },\n parse: function() {\n return {\n type: 'Number',\n loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n value: this.scanner.consume(NUMBER)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n }\n};\n","// '/' | '*' | ',' | ':' | '+' | '-'\nmodule.exports = {\n name: 'Operator',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.next();\n\n return {\n type: 'Operator',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.substrToCursor(start)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\nmodule.exports = {\n name: 'Parentheses',\n structure: {\n children: [[]]\n },\n parse: function(readSequence, recognizer) {\n var start = this.scanner.tokenStart;\n var children = null;\n\n this.scanner.eat(LEFTPARENTHESIS);\n children = readSequence.call(this, recognizer);\n this.scanner.eat(RIGHTPARENTHESIS);\n\n return {\n type: 'Parentheses',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(processChunk, node) {\n processChunk('(');\n this.each(processChunk, node);\n processChunk(')');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar NUMBER = TYPE.Number;\nvar PERCENTSIGN = TYPE.PercentSign;\n\nmodule.exports = {\n name: 'Percentage',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var number = this.scanner.consume(NUMBER);\n\n this.scanner.eat(PERCENTSIGN);\n\n return {\n type: 'Percentage',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: number\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n processChunk('%');\n }\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar FUNCTION = TYPE.Function;\nvar COLON = TYPE.Colon;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// : ident [ '(' .. ')' ]?\nmodule.exports = {\n name: 'PseudoClassSelector',\n structure: {\n name: String,\n children: [['Raw'], null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var children = null;\n var name;\n var nameLowerCase;\n\n this.scanner.eat(COLON);\n\n if (this.scanner.tokenType === FUNCTION) {\n name = this.scanner.consumeFunctionName();\n nameLowerCase = name.toLowerCase();\n\n if (this.pseudo.hasOwnProperty(nameLowerCase)) {\n this.scanner.skipSC();\n children = this.pseudo[nameLowerCase].call(this);\n this.scanner.skipSC();\n } else {\n children = new List().appendData(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n }\n\n this.scanner.eat(RIGHTPARENTHESIS);\n } else {\n name = this.scanner.consume(IDENTIFIER);\n }\n\n return {\n type: 'PseudoClassSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n children: children\n };\n },\n generate: function(processChunk, node) {\n processChunk(':');\n processChunk(node.name);\n\n if (node.children !== null) {\n processChunk('(');\n this.each(processChunk, node);\n processChunk(')');\n }\n },\n walkContext: 'function'\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar FUNCTION = TYPE.Function;\nvar COLON = TYPE.Colon;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// :: ident [ '(' .. ')' ]?\nmodule.exports = {\n name: 'PseudoElementSelector',\n structure: {\n name: String,\n children: [['Raw'], null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var children = null;\n var name;\n var nameLowerCase;\n\n this.scanner.eat(COLON);\n this.scanner.eat(COLON);\n\n if (this.scanner.tokenType === FUNCTION) {\n name = this.scanner.consumeFunctionName();\n nameLowerCase = name.toLowerCase();\n\n if (this.pseudo.hasOwnProperty(nameLowerCase)) {\n this.scanner.skipSC();\n children = this.pseudo[nameLowerCase].call(this);\n this.scanner.skipSC();\n } else {\n children = new List().appendData(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n }\n\n this.scanner.eat(RIGHTPARENTHESIS);\n } else {\n name = this.scanner.consume(IDENTIFIER);\n }\n\n return {\n type: 'PseudoElementSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n children: children\n };\n },\n generate: function(processChunk, node) {\n processChunk('::');\n processChunk(node.name);\n\n if (node.children !== null) {\n processChunk('(');\n this.each(processChunk, node);\n processChunk(')');\n }\n },\n walkContext: 'function'\n};\n","module.exports = {\n name: 'Raw',\n structure: {\n value: String\n },\n parse: function(startToken, endTokenType1, endTokenType2, includeTokenType2, excludeWhiteSpace) {\n var startOffset = this.scanner.getTokenStart(startToken);\n var endOffset;\n\n this.scanner.skip(\n this.scanner.getRawLength(\n startToken,\n endTokenType1,\n endTokenType2,\n includeTokenType2\n )\n );\n\n if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {\n endOffset = this.scanner.getOffsetExcludeWS();\n } else {\n endOffset = this.scanner.tokenStart;\n }\n\n return {\n type: 'Raw',\n loc: this.getLocation(startOffset, endOffset),\n value: this.scanner.source.substring(startOffset, endOffset)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n }\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar COMMA = TYPE.Comma;\n\nmodule.exports = {\n name: 'SelectorList',\n structure: {\n children: [['Selector', 'Raw']]\n },\n parse: function() {\n var children = new List();\n\n while (!this.scanner.eof) {\n children.appendData(this.Selector());\n\n if (this.scanner.tokenType === COMMA) {\n this.scanner.next();\n continue;\n }\n\n break;\n }\n\n return {\n type: 'SelectorList',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.eachComma(processChunk, node);\n },\n walkContext: 'selector'\n};\n","var STRING = require('../../tokenizer').TYPE.String;\n\nmodule.exports = {\n name: 'String',\n structure: {\n value: String\n },\n parse: function() {\n return {\n type: 'String',\n loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n value: this.scanner.consume(STRING)\n };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar STRING = TYPE.String;\nvar URL = TYPE.Url;\nvar RAW = TYPE.Raw;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// url '(' S* (string | raw) S* ')'\nmodule.exports = {\n name: 'Url',\n structure: {\n value: ['String', 'Raw']\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var value;\n\n this.scanner.eat(URL);\n this.scanner.skipSC();\n\n switch (this.scanner.tokenType) {\n case STRING:\n value = this.String();\n break;\n\n case RAW:\n value = this.Raw(this.scanner.currentToken, 0, RAW, true, false);\n break;\n\n default:\n this.scanner.error('String or Raw is expected');\n }\n\n this.scanner.skipSC();\n this.scanner.eat(RIGHTPARENTHESIS);\n\n return {\n type: 'Url',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: value\n };\n },\n generate: function(processChunk, node) {\n processChunk('url');\n processChunk('(');\n this.generate(processChunk, node.value);\n processChunk(')');\n }\n};\n","var WHITESPACE = require('../../tokenizer').TYPE.WhiteSpace;\nvar SPACE = Object.freeze({\n type: 'WhiteSpace',\n loc: null,\n value: ' '\n});\n\nmodule.exports = {\n name: 'WhiteSpace',\n structure: {\n value: String\n },\n parse: function() {\n this.scanner.eat(WHITESPACE);\n return SPACE;\n\n // return {\n // type: 'WhiteSpace',\n // loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n // value: this.scanner.consume(WHITESPACE)\n // };\n },\n generate: function(processChunk, node) {\n processChunk(node.value);\n }\n};\n","module.exports = {\n AnPlusB: require('./AnPlusB'),\n Atrule: require('./Atrule'),\n AtrulePrelude: require('./AtrulePrelude'),\n AttributeSelector: require('./AttributeSelector'),\n Block: require('./Block'),\n Brackets: require('./Brackets'),\n CDC: require('./CDC'),\n CDO: require('./CDO'),\n ClassSelector: require('./ClassSelector'),\n Combinator: require('./Combinator'),\n Comment: require('./Comment'),\n Declaration: require('./Declaration'),\n DeclarationList: require('./DeclarationList'),\n Dimension: require('./Dimension'),\n Function: require('./Function'),\n HexColor: require('./HexColor'),\n Identifier: require('./Identifier'),\n IdSelector: require('./IdSelector'),\n MediaFeature: require('./MediaFeature'),\n MediaQuery: require('./MediaQuery'),\n MediaQueryList: require('./MediaQueryList'),\n Nth: require('./Nth'),\n Number: require('./Number'),\n Operator: require('./Operator'),\n Parentheses: require('./Parentheses'),\n Percentage: require('./Percentage'),\n PseudoClassSelector: require('./PseudoClassSelector'),\n PseudoElementSelector: require('./PseudoElementSelector'),\n Ratio: require('./Ratio'),\n Raw: require('./Raw'),\n Rule: require('./Rule'),\n Selector: require('./Selector'),\n SelectorList: require('./SelectorList'),\n String: require('./String'),\n StyleSheet: require('./StyleSheet'),\n TypeSelector: require('./TypeSelector'),\n UnicodeRange: require('./UnicodeRange'),\n Url: require('./Url'),\n Value: require('./Value'),\n WhiteSpace: require('./WhiteSpace')\n};\n","var List = require('../../utils/list');\n\nmodule.exports = {\n name: 'AtrulePrelude',\n structure: {\n children: [[]]\n },\n parse: function(name) {\n var children = null;\n\n if (name !== null) {\n name = name.toLowerCase();\n }\n\n if (this.atrule.hasOwnProperty(name)) {\n // custom consumer\n if (typeof this.atrule[name].prelude === 'function') {\n children = this.atrule[name].prelude.call(this);\n }\n } else {\n // default consumer\n this.scanner.skipSC();\n children = this.readSequence(this.scope.AtrulePrelude);\n }\n\n if (children === null) {\n children = new List();\n }\n\n return {\n type: 'AtrulePrelude',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.each(processChunk, node);\n },\n walkContext: 'atrulePrelude'\n};\n","// https://drafts.csswg.org/css-syntax-3/#the-anb-type\nmodule.exports = {\n name: 'Nth',\n structure: {\n nth: ['AnPlusB', 'Identifier'],\n selector: ['SelectorList', null]\n },\n parse: function(allowOfClause) {\n this.scanner.skipSC();\n\n var start = this.scanner.tokenStart;\n var end = start;\n var selector = null;\n var query;\n\n if (this.scanner.lookupValue(0, 'odd') || this.scanner.lookupValue(0, 'even')) {\n query = this.Identifier();\n } else {\n query = this.AnPlusB();\n }\n\n this.scanner.skipSC();\n\n if (allowOfClause && this.scanner.lookupValue(0, 'of')) {\n this.scanner.next();\n\n selector = this.SelectorList();\n\n if (this.needPositions) {\n end = selector.children.last().loc.end.offset;\n }\n } else {\n if (this.needPositions) {\n end = query.loc.end.offset;\n }\n }\n\n return {\n type: 'Nth',\n loc: this.getLocation(start, end),\n nth: query,\n selector: selector\n };\n },\n generate: function(processChunk, node) {\n this.generate(processChunk, node.nth);\n if (node.selector !== null) {\n processChunk(' of ');\n this.generate(processChunk, node.selector);\n }\n }\n};\n","module.exports = {\n name: 'Selector',\n structure: {\n children: [[\n 'TypeSelector',\n 'IdSelector',\n 'ClassSelector',\n 'AttributeSelector',\n 'PseudoClassSelector',\n 'PseudoElementSelector',\n 'Combinator',\n 'WhiteSpace'\n ]]\n },\n parse: function() {\n var children = this.readSequence(this.scope.Selector);\n\n // nothing were consumed\n if (children.isEmpty()) {\n this.scanner.error('Selector is expected');\n }\n\n return {\n type: 'Selector',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(processChunk, node) {\n this.each(processChunk, node);\n }\n};\n","var data = require('../../../data');\n\nmodule.exports = {\n generic: true,\n types: data.types,\n properties: data.properties,\n node: require('../node')\n};\n","var cmpChar = require('../../tokenizer').cmpChar;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar STRING = TYPE.String;\nvar NUMBER = TYPE.Number;\nvar FUNCTION = TYPE.Function;\nvar URL = TYPE.Url;\nvar NUMBERSIGN = TYPE.NumberSign;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar COMMA = TYPE.Comma;\nvar SOLIDUS = TYPE.Solidus;\nvar ASTERISK = TYPE.Asterisk;\nvar PERCENTSIGN = TYPE.PercentSign;\nvar BACKSLASH = TYPE.Backslash;\nvar U = 117; // 'u'.charCodeAt(0)\n\nmodule.exports = function defaultRecognizer(context) {\n switch (this.scanner.tokenType) {\n case NUMBERSIGN:\n return this.HexColor();\n\n case COMMA:\n context.space = null;\n context.ignoreWSAfter = true;\n return this.Operator();\n\n case SOLIDUS:\n case ASTERISK:\n case PLUSSIGN:\n case HYPHENMINUS:\n return this.Operator();\n\n case LEFTPARENTHESIS:\n return this.Parentheses(this.readSequence, context.recognizer);\n\n case LEFTSQUAREBRACKET:\n return this.Brackets(this.readSequence, context.recognizer);\n\n case STRING:\n return this.String();\n\n case NUMBER:\n switch (this.scanner.lookupType(1)) {\n case PERCENTSIGN:\n return this.Percentage();\n\n case IDENTIFIER:\n // edge case: number with folowing \\0 and \\9 hack shouldn't to be a Dimension\n if (cmpChar(this.scanner.source, this.scanner.tokenEnd, BACKSLASH)) {\n return this.Number();\n } else {\n return this.Dimension();\n }\n\n default:\n return this.Number();\n }\n\n case FUNCTION:\n return this.Function(this.readSequence, context.recognizer);\n\n case URL:\n return this.Url();\n\n case IDENTIFIER:\n // check for unicode range, it should start with u+ or U+\n if (cmpChar(this.scanner.source, this.scanner.tokenStart, U) &&\n cmpChar(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN)) {\n return this.UnicodeRange();\n } else {\n return this.Identifier();\n }\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar NUMBERSIGN = TYPE.NumberSign;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar PLUSSIGN = TYPE.PlusSign;\nvar SOLIDUS = TYPE.Solidus;\nvar ASTERISK = TYPE.Asterisk;\nvar FULLSTOP = TYPE.FullStop;\nvar COLON = TYPE.Colon;\nvar GREATERTHANSIGN = TYPE.GreaterThanSign;\nvar VERTICALLINE = TYPE.VerticalLine;\nvar TILDE = TYPE.Tilde;\n\nfunction getNode(context) {\n switch (this.scanner.tokenType) {\n case PLUSSIGN:\n case GREATERTHANSIGN:\n case TILDE:\n context.space = null;\n context.ignoreWSAfter = true;\n return this.Combinator();\n\n case SOLIDUS: // /deep/\n return this.Combinator();\n\n case FULLSTOP:\n return this.ClassSelector();\n\n case LEFTSQUAREBRACKET:\n return this.AttributeSelector();\n\n case NUMBERSIGN:\n return this.IdSelector();\n\n case COLON:\n if (this.scanner.lookupType(1) === COLON) {\n return this.PseudoElementSelector();\n } else {\n return this.PseudoClassSelector();\n }\n\n case IDENTIFIER:\n case ASTERISK:\n case VERTICALLINE:\n return this.TypeSelector();\n\n case NUMBER:\n return this.Percentage();\n }\n};\n\nmodule.exports = {\n getNode: getNode\n};\n","var List = require('../../utils/list');\n\n// https://drafts.csswg.org/css-images-4/#element-notation\n// https://developer.mozilla.org/en-US/docs/Web/CSS/element\nmodule.exports = function() {\n this.scanner.skipSC();\n\n var id = this.IdSelector();\n\n this.scanner.skipSC();\n\n return new List().appendData(\n id\n );\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar COMMA = TYPE.Comma;\nvar SEMICOLON = TYPE.Semicolon;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\n\n// var '(' ident (',' <value>? )? ')'\nmodule.exports = function() {\n var children = new List();\n\n this.scanner.skipSC();\n\n var identStart = this.scanner.tokenStart;\n\n this.scanner.eat(HYPHENMINUS);\n if (this.scanner.source.charCodeAt(this.scanner.tokenStart) !== HYPHENMINUS) {\n this.scanner.error('HyphenMinus is expected');\n }\n this.scanner.eat(IDENTIFIER);\n\n children.appendData({\n type: 'Identifier',\n loc: this.getLocation(identStart, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(identStart)\n });\n\n this.scanner.skipSC();\n\n if (this.scanner.tokenType === COMMA) {\n children.appendData(this.Operator());\n children.appendData(this.parseCustomProperty\n ? this.Value(null)\n : this.Raw(this.scanner.currentToken, EXCLAMATIONMARK, SEMICOLON, false, false)\n );\n }\n\n return children;\n};\n","var List = require('../../utils/list');\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar STRING = TYPE.String;\nvar IDENTIFIER = TYPE.Identifier;\nvar URL = TYPE.Url;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\n\nmodule.exports = {\n parse: {\n prelude: function() {\n var children = new List();\n\n this.scanner.skipSC();\n\n switch (this.scanner.tokenType) {\n case STRING:\n children.appendData(this.String());\n break;\n\n case URL:\n children.appendData(this.Url());\n break;\n\n default:\n this.scanner.error('String or url() is expected');\n }\n\n if (this.scanner.lookupNonWSType(0) === IDENTIFIER ||\n this.scanner.lookupNonWSType(0) === LEFTPARENTHESIS) {\n children.appendData(this.WhiteSpace());\n children.appendData(this.MediaQueryList());\n }\n\n return children;\n },\n block: null\n }\n};\n","var List = require('../../../utils/list');\n\nmodule.exports = {\n parse: function selectorList() {\n return new List().appendData(\n this.SelectorList()\n );\n }\n};\n","var List = require('../../../utils/list');\nvar ALLOW_OF_CLAUSE = true;\n\nmodule.exports = {\n parse: function() {\n return new List().appendData(\n this.Nth(ALLOW_OF_CLAUSE)\n );\n }\n};\n","var List = require('../../../utils/list');\nvar DISALLOW_OF_CLAUSE = false;\n\nmodule.exports = {\n parse: function nth() {\n return new List().appendData(\n this.Nth(DISALLOW_OF_CLAUSE)\n );\n }\n};\n","function merge() {\n var dest = {};\n\n for (var i = 0; i < arguments.length; i++) {\n var src = arguments[i];\n for (var key in src) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nmodule.exports = require('./create').create(\n merge(\n require('./config/lexer'),\n require('./config/parser'),\n require('./config/walker')\n )\n);\n","module.exports = {\n parseContext: {\n default: 'StyleSheet',\n stylesheet: 'StyleSheet',\n atrule: 'Atrule',\n atrulePrelude: function(options) {\n return this.AtrulePrelude(options.atrule ? String(options.atrule) : null);\n },\n mediaQueryList: 'MediaQueryList',\n mediaQuery: 'MediaQuery',\n rule: 'Rule',\n selectorList: 'SelectorList',\n selector: 'Selector',\n block: function() {\n return this.Block(true);\n },\n declarationList: 'DeclarationList',\n declaration: 'Declaration',\n value: function(options) {\n return this.Value(options.property ? String(options.property) : null);\n }\n },\n scope: require('../scope'),\n atrule: require('../atrule'),\n pseudo: require('../pseudo'),\n node: require('../node')\n};\n","module.exports = {\n AtrulePrelude: require('./atrulePrelude'),\n Selector: require('./selector'),\n Value: require('./value')\n};\n","module.exports = {\n getNode: require('./default')\n};\n","module.exports = {\n getNode: require('./default'),\n '-moz-element': require('../function/element'),\n 'element': require('../function/element'),\n 'expression': require('../function/expression'),\n 'var': require('../function/var')\n};\n","var List = require('../../utils/list');\n\n// legacy IE function\n// expression '(' raw ')'\nmodule.exports = function() {\n return new List().appendData(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n};\n","module.exports = {\n 'font-face': require('./font-face'),\n 'import': require('./import'),\n 'media': require('./media'),\n 'page': require('./page'),\n 'supports': require('./supports')\n};\n","module.exports = {\n parse: {\n prelude: null,\n block: function() {\n return this.Block(true);\n }\n }\n};\n","var List = require('../../utils/list');\n\nmodule.exports = {\n parse: {\n prelude: function() {\n return new List().appendData(\n this.MediaQueryList()\n );\n },\n block: function() {\n return this.Block(false);\n }\n }\n};\n","var List = require('../../utils/list');\n\nmodule.exports = {\n parse: {\n prelude: function() {\n return new List().appendData(\n this.SelectorList()\n );\n },\n block: function() {\n return this.Block(true);\n }\n }\n};\n","module.exports = {\n 'dir': require('./dir'),\n 'has': require('./has'),\n 'lang': require('./lang'),\n 'matches': require('./matches'),\n 'not': require('./not'),\n 'nth-child': require('./nth-child'),\n 'nth-last-child': require('./nth-last-child'),\n 'nth-last-of-type': require('./nth-last-of-type'),\n 'nth-of-type': require('./nth-of-type'),\n 'slotted': require('./slotted')\n};\n","var List = require('../../utils/list');\n\nmodule.exports = {\n parse: function() {\n return new List().appendData(\n this.Identifier()\n );\n }\n};\n","var List = require('../../utils/list');\n\nmodule.exports = {\n parse: function() {\n return new List().appendData(\n this.SelectorList()\n );\n }\n};\n","var List = require('../../utils/list');\n\nmodule.exports = {\n parse: function() {\n return new List().appendData(\n this.Identifier()\n );\n }\n};\n","var List = require('../../utils/list');\n\nmodule.exports = {\n parse: function compoundSelector() {\n return new List().appendData(\n this.Selector()\n );\n }\n};\n","module.exports = {\n node: require('../node')\n};\n","//! stable.js 0.1.8, https://github.com/Two-Screen/stable\n//! © 2018 Angry Bytes and contributors. MIT licensed.\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.stable = factory());\n}(this, (function () { 'use strict';\n\n // A stable array sort, because `Array#sort()` is not guaranteed stable.\n // This is an implementation of merge sort, without recursion.\n\n var stable = function (arr, comp) {\n return exec(arr.slice(), comp)\n };\n\n stable.inplace = function (arr, comp) {\n var result = exec(arr, comp);\n\n // This simply copies back if the result isn't in the original array,\n // which happens on an odd number of passes.\n if (result !== arr) {\n pass(result, null, arr.length, arr);\n }\n\n return arr\n };\n\n // Execute the sort using the input array and a second buffer as work space.\n // Returns one of those two, containing the final result.\n function exec(arr, comp) {\n if (typeof(comp) !== 'function') {\n comp = function (a, b) {\n return String(a).localeCompare(b)\n };\n }\n\n // Short-circuit when there's nothing to sort.\n var len = arr.length;\n if (len <= 1) {\n return arr\n }\n\n // Rather than dividing input, simply iterate chunks of 1, 2, 4, 8, etc.\n // Chunks are the size of the left or right hand in merge sort.\n // Stop when the left-hand covers all of the array.\n var buffer = new Array(len);\n for (var chk = 1; chk < len; chk *= 2) {\n pass(arr, comp, chk, buffer);\n\n var tmp = arr;\n arr = buffer;\n buffer = tmp;\n }\n\n return arr\n }\n\n // Run a single pass with the given chunk size.\n var pass = function (arr, comp, chk, result) {\n var len = arr.length;\n var i = 0;\n // Step size / double chunk size.\n var dbl = chk * 2;\n // Bounds of the left and right chunks.\n var l, r, e;\n // Iterators over the left and right chunk.\n var li, ri;\n\n // Iterate over pairs of chunks.\n for (l = 0; l < len; l += dbl) {\n r = l + chk;\n e = r + chk;\n if (r > len) r = len;\n if (e > len) e = len;\n\n // Iterate both chunks in parallel.\n li = l;\n ri = r;\n while (true) {\n // Compare the chunks.\n if (li < r && ri < e) {\n // This works for a regular `sort()` compatible comparator,\n // but also for a simple comparator like: `a > b`\n if (comp(arr[li], arr[ri]) <= 0) {\n result[i++] = arr[li++];\n }\n else {\n result[i++] = arr[ri++];\n }\n }\n // Nothing to compare, just flush what's left.\n else if (li < r) {\n result[i++] = arr[li++];\n }\n else if (ri < e) {\n result[i++] = arr[ri++];\n }\n // Both iterators are at the chunk ends.\n else {\n break\n }\n }\n }\n };\n\n return stable;\n\n})));\n","module.exports = function specificity(simpleSelector) {\n var A = 0;\n var B = 0;\n var C = 0;\n\n simpleSelector.children.each(function walk(node) {\n switch (node.type) {\n case 'SelectorList':\n case 'Selector':\n node.children.each(walk);\n break;\n\n case 'IdSelector':\n A++;\n break;\n\n case 'ClassSelector':\n case 'AttributeSelector':\n B++;\n break;\n\n case 'PseudoClassSelector':\n switch (node.name.toLowerCase()) {\n case 'not':\n node.children.each(walk);\n break;\n\n case 'before':\n case 'after':\n case 'first-line':\n case 'first-letter':\n C++;\n break;\n\n // TODO: support for :nth-*(.. of <SelectorList>), :matches(), :has()\n\n default:\n B++;\n }\n break;\n\n case 'PseudoElementSelector':\n C++;\n break;\n\n case 'TypeSelector':\n // ignore universal selector\n if (node.name.charAt(node.name.length - 1) !== '*') {\n C++;\n }\n break;\n\n }\n });\n\n return [A, B, C];\n};\n","'use strict';\n\nvar csstree = require('css-tree'),\n csstools = require('../css-tools');\n\n\nvar CSSStyleDeclaration = function(node) {\n this.parentNode = node;\n\n this.properties = new Map();\n this.hasSynced = false;\n\n this.styleAttr = null;\n this.styleValue = null;\n\n this.parseError = false;\n};\n\n\nCSSStyleDeclaration.prototype.hasStyle = function() {\n this.addStyleHandler();\n};\n\n\n\n\n// attr.style\n\nCSSStyleDeclaration.prototype.addStyleHandler = function() {\n\n this.styleAttr = { // empty style attr\n 'name': 'style',\n 'value': null\n };\n\n Object.defineProperty(this.parentNode.attrs, 'style', {\n get: this.getStyleAttr.bind(this),\n set: this.setStyleAttr.bind(this),\n enumerable: true,\n configurable: true\n });\n\n this.addStyleValueHandler();\n};\n\n// attr.style.value\n\nCSSStyleDeclaration.prototype.addStyleValueHandler = function() {\n\n Object.defineProperty(this.styleAttr, 'value', {\n get: this.getStyleValue.bind(this),\n set: this.setStyleValue.bind(this),\n enumerable: true,\n configurable: true\n });\n};\n\nCSSStyleDeclaration.prototype.getStyleAttr = function() {\n return this.styleAttr;\n};\n\nCSSStyleDeclaration.prototype.setStyleAttr = function(newStyleAttr) {\n this.setStyleValue(newStyleAttr.value); // must before applying value handler!\n\n this.styleAttr = newStyleAttr;\n this.addStyleValueHandler();\n this.hasSynced = false; // raw css changed\n};\n\nCSSStyleDeclaration.prototype.getStyleValue = function() {\n return this.getCssText();\n};\n\nCSSStyleDeclaration.prototype.setStyleValue = function(newValue) {\n this.properties.clear(); // reset all existing properties\n this.styleValue = newValue;\n this.hasSynced = false; // raw css changed\n};\n\n\n\n\nCSSStyleDeclaration.prototype._loadCssText = function() {\n if (this.hasSynced) {\n return;\n }\n this.hasSynced = true; // must be set here to prevent loop in setProperty(...)\n\n if (!this.styleValue || this.styleValue.length === 0) {\n return;\n }\n var inlineCssStr = this.styleValue;\n\n var declarations = {};\n try {\n declarations = csstree.parse(inlineCssStr, {\n context: 'declarationList',\n parseValue: false\n });\n } catch (parseError) {\n this.parseError = parseError;\n return;\n }\n this.parseError = false;\n\n var self = this;\n declarations.children.each(function(declaration) {\n var styleDeclaration = csstools.csstreeToStyleDeclaration(declaration);\n self.setProperty(styleDeclaration.name, styleDeclaration.value, styleDeclaration.priority);\n });\n};\n\n\n// only reads from properties\n\n/**\n * Get the textual representation of the declaration block (equivalent to .cssText attribute).\n *\n * @return {String} Textual representation of the declaration block (empty string for no properties)\n */\nCSSStyleDeclaration.prototype.getCssText = function() {\n var properties = this.getProperties();\n\n if (this.parseError) {\n // in case of a parse error, pass through original styles\n return this.styleValue;\n }\n\n var cssText = [];\n properties.forEach(function(property, propertyName) {\n var strImportant = property.priority === 'important' ? '!important' : '';\n cssText.push(propertyName.trim() + ':' + property.value.trim() + strImportant);\n });\n return cssText.join(';');\n};\n\nCSSStyleDeclaration.prototype._handleParseError = function() {\n if (this.parseError) {\n console.warn('Warning: Parse error when parsing inline styles, style properties of this element cannot be used. The raw styles can still be get/set using .attr(\\'style\\').value. Error details: ' + this.parseError);\n }\n};\n\n\nCSSStyleDeclaration.prototype._getProperty = function(propertyName) {\n if(typeof propertyName === 'undefined') {\n throw Error('1 argument required, but only 0 present.');\n }\n\n var properties = this.getProperties();\n this._handleParseError();\n\n var property = properties.get(propertyName.trim());\n return property;\n};\n\n/**\n * Return the optional priority, \"important\".\n *\n * @param {String} propertyName representing the property name to be checked.\n * @return {String} priority that represents the priority (e.g. \"important\") if one exists. If none exists, returns the empty string.\n */\nCSSStyleDeclaration.prototype.getPropertyPriority = function(propertyName) {\n var property = this._getProperty(propertyName);\n return property ? property.priority : '';\n};\n\n/**\n * Return the property value given a property name.\n *\n * @param {String} propertyName representing the property name to be checked.\n * @return {String} value containing the value of the property. If not set, returns the empty string.\n */\nCSSStyleDeclaration.prototype.getPropertyValue = function(propertyName) {\n var property = this._getProperty(propertyName);\n return property ? property.value : null;\n};\n\n/**\n * Return a property name.\n *\n * @param {Number} index of the node to be fetched. The index is zero-based.\n * @return {String} propertyName that is the name of the CSS property at the specified index.\n */\nCSSStyleDeclaration.prototype.item = function(index) {\n if(typeof index === 'undefined') {\n throw Error('1 argument required, but only 0 present.');\n }\n\n var properties = this.getProperties();\n this._handleParseError();\n\n return Array.from(properties.keys())[index];\n};\n\n/**\n * Return all properties of the node.\n *\n * @return {Map} properties that is a Map with propertyName as key and property (propertyValue + propertyPriority) as value.\n */\nCSSStyleDeclaration.prototype.getProperties = function() {\n this._loadCssText();\n return this.properties;\n};\n\n\n// writes to properties\n\n/**\n * Remove a property from the CSS declaration block.\n *\n * @param {String} propertyName representing the property name to be removed.\n * @return {String} oldValue equal to the value of the CSS property before it was removed.\n */\nCSSStyleDeclaration.prototype.removeProperty = function(propertyName) {\n if(typeof propertyName === 'undefined') {\n throw Error('1 argument required, but only 0 present.');\n }\n\n this.hasStyle();\n\n var properties = this.getProperties();\n this._handleParseError();\n\n var oldValue = this.getPropertyValue(propertyName);\n properties.delete(propertyName.trim());\n return oldValue;\n};\n\n/**\n * Modify an existing CSS property or creates a new CSS property in the declaration block.\n *\n * @param {String} propertyName representing the CSS property name to be modified.\n * @param {String} [value] containing the new property value. If not specified, treated as the empty string. value must not contain \"!important\" -- that should be set using the priority parameter.\n * @param {String} [priority] allowing the \"important\" CSS priority to be set. If not specified, treated as the empty string.\n * @return {undefined}\n */\nCSSStyleDeclaration.prototype.setProperty = function(propertyName, value, priority) {\n if(typeof propertyName === 'undefined') {\n throw Error('propertyName argument required, but only not present.');\n }\n\n this.hasStyle();\n\n var properties = this.getProperties();\n this._handleParseError();\n\n var property = {\n value: value.trim(),\n priority: priority.trim()\n };\n properties.set(propertyName.trim(), property);\n\n return property;\n};\n\n\nmodule.exports = CSSStyleDeclaration;\n","'use strict';\n\nvar SAX = require('sax'),\n JSAPI = require('./jsAPI.js'),\n CSSClassList = require('./css-class-list'),\n CSSStyleDeclaration = require('./css-style-declaration'),\n entityDeclaration = /<!ENTITY\\s+(\\S+)\\s+(?:'([^\\']+)'|\"([^\\\"]+)\")\\s*>/g;\n\nvar config = {\n strict: true,\n trim: false,\n normalize: true,\n lowercase: true,\n xmlns: true,\n position: true\n};\n\n/**\n * Convert SVG (XML) string to SVG-as-JS object.\n *\n * @param {String} data input data\n * @param {Function} callback\n */\nmodule.exports = function(data, callback) {\n\n var sax = SAX.parser(config.strict, config),\n root = new JSAPI({ elem: '#document', content: [] }),\n current = root,\n stack = [root],\n textContext = null,\n parsingError = false;\n\n function pushToContent(content) {\n\n content = new JSAPI(content, current);\n\n (current.content = current.content || []).push(content);\n\n return content;\n\n }\n\n sax.ondoctype = function(doctype) {\n\n pushToContent({\n doctype: doctype\n });\n\n var subsetStart = doctype.indexOf('['),\n entityMatch;\n\n if (subsetStart >= 0) {\n entityDeclaration.lastIndex = subsetStart;\n\n while ((entityMatch = entityDeclaration.exec(data)) != null) {\n sax.ENTITIES[entityMatch[1]] = entityMatch[2] || entityMatch[3];\n }\n }\n };\n\n sax.onprocessinginstruction = function(data) {\n\n pushToContent({\n processinginstruction: data\n });\n\n };\n\n sax.oncomment = function(comment) {\n\n pushToContent({\n comment: comment.trim()\n });\n\n };\n\n sax.oncdata = function(cdata) {\n\n pushToContent({\n cdata: cdata\n });\n\n };\n\n sax.onopentag = function(data) {\n\n var elem = {\n elem: data.name,\n prefix: data.prefix,\n local: data.local,\n attrs: {}\n };\n\n elem.class = new CSSClassList(elem);\n elem.style = new CSSStyleDeclaration(elem);\n\n if (Object.keys(data.attributes).length) {\n for (var name in data.attributes) {\n\n if (name === 'class') { // has class attribute\n elem.class.hasClass();\n }\n\n if (name === 'style') { // has style attribute\n elem.style.hasStyle();\n }\n\n elem.attrs[name] = {\n name: name,\n value: data.attributes[name].value,\n prefix: data.attributes[name].prefix,\n local: data.attributes[name].local\n };\n }\n }\n\n elem = pushToContent(elem);\n current = elem;\n\n // Save info about <text> tag to prevent trimming of meaningful whitespace\n if (data.name == 'text' && !data.prefix) {\n textContext = current;\n }\n\n stack.push(elem);\n\n };\n\n sax.ontext = function(text) {\n\n if (/\\S/.test(text) || textContext) {\n\n if (!textContext)\n text = text.trim();\n\n pushToContent({\n text: text\n });\n\n }\n\n };\n\n sax.onclosetag = function() {\n\n var last = stack.pop();\n\n // Trim text inside <text> tag.\n if (last == textContext) {\n trim(textContext);\n textContext = null;\n }\n current = stack[stack.length - 1];\n\n };\n\n sax.onerror = function(e) {\n\n e.message = 'Error in parsing SVG: ' + e.message;\n if (e.message.indexOf('Unexpected end') < 0) {\n throw e;\n }\n\n };\n\n sax.onend = function() {\n\n if (!this.error) {\n callback(root);\n } else {\n callback({ error: this.error.message });\n }\n\n };\n\n try {\n sax.write(data);\n } catch (e) {\n callback({ error: e.message });\n parsingError = true;\n }\n if (!parsingError) sax.close();\n\n function trim(elem) {\n if (!elem.content) return elem;\n\n var start = elem.content[0],\n end = elem.content[elem.content.length - 1];\n\n while (start && start.content && !start.text) start = start.content[0];\n if (start && start.text) start.text = start.text.replace(/^\\s+/, '');\n\n while (end && end.content && !end.text) end = end.content[end.content.length - 1];\n if (end && end.text) end.text = end.text.replace(/\\s+$/, '');\n\n return elem;\n\n }\n\n};\n","'use strict';\n\n// http://www.w3.org/TR/SVG/intro.html#Definitions\nexports.elemsGroups = {\n animation: ['animate', 'animateColor', 'animateMotion', 'animateTransform', 'set'],\n descriptive: ['desc', 'metadata', 'title'],\n shape: ['circle', 'ellipse', 'line', 'path', 'polygon', 'polyline', 'rect'],\n structural: ['defs', 'g', 'svg', 'symbol', 'use'],\n paintServer: ['solidColor', 'linearGradient', 'radialGradient', 'meshGradient', 'pattern', 'hatch'],\n nonRendering: ['linearGradient', 'radialGradient', 'pattern', 'clipPath', 'mask', 'marker', 'symbol', 'filter', 'solidColor'],\n container: ['a', 'defs', 'g', 'marker', 'mask', 'missing-glyph', 'pattern', 'svg', 'switch', 'symbol', 'foreignObject'],\n textContent: ['altGlyph', 'altGlyphDef', 'altGlyphItem', 'glyph', 'glyphRef', 'textPath', 'text', 'tref', 'tspan'],\n textContentChild: ['altGlyph', 'textPath', 'tref', 'tspan'],\n lightSource: ['feDiffuseLighting', 'feSpecularLighting', 'feDistantLight', 'fePointLight', 'feSpotLight'],\n filterPrimitive: ['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feFlood', 'feGaussianBlur', 'feImage', 'feMerge', 'feMorphology', 'feOffset', 'feSpecularLighting', 'feTile', 'feTurbulence']\n};\n\nexports.pathElems = ['path', 'glyph', 'missing-glyph'];\n\n// http://www.w3.org/TR/SVG/intro.html#Definitions\nexports.attrsGroups = {\n animationAddition: ['additive', 'accumulate'],\n animationAttributeTarget: ['attributeType', 'attributeName'],\n animationEvent: ['onbegin', 'onend', 'onrepeat', 'onload'],\n animationTiming: ['begin', 'dur', 'end', 'min', 'max', 'restart', 'repeatCount', 'repeatDur', 'fill'],\n animationValue: ['calcMode', 'values', 'keyTimes', 'keySplines', 'from', 'to', 'by'],\n conditionalProcessing: ['requiredFeatures', 'requiredExtensions', 'systemLanguage'],\n core: ['id', 'tabindex', 'xml:base', 'xml:lang', 'xml:space'],\n graphicalEvent: ['onfocusin', 'onfocusout', 'onactivate', 'onclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmousemove', 'onmouseout', 'onload'],\n presentation: [\n 'alignment-baseline',\n 'baseline-shift',\n 'buffered-rendering',\n 'clip',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cursor',\n 'direction',\n 'display',\n 'dominant-baseline',\n 'enable-background',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'glyph-orientation-horizontal',\n 'glyph-orientation-vertical',\n 'image-rendering',\n 'kerning',\n 'letter-spacing',\n 'lighting-color',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'mask',\n 'opacity',\n 'overflow',\n 'pointer-events',\n 'shape-rendering',\n 'solid-color',\n 'solid-opacity',\n 'stop-color',\n 'stop-opacity',\n 'stroke',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'paint-order',\n 'text-anchor',\n 'text-decoration',\n 'text-overflow',\n 'white-space',\n 'text-rendering',\n 'unicode-bidi',\n 'vector-effect',\n 'viewport-fill',\n 'viewport-fill-opacity',\n 'visibility',\n 'white-space',\n 'word-spacing',\n 'writing-mode'\n ],\n xlink: ['xlink:href', 'xlink:show', 'xlink:actuate', 'xlink:type', 'xlink:role', 'xlink:arcrole', 'xlink:title'],\n documentEvent: ['onunload', 'onabort', 'onerror', 'onresize', 'onscroll', 'onzoom'],\n filterPrimitive: ['x', 'y', 'width', 'height', 'result'],\n transferFunction: ['type', 'tableValues', 'slope', 'intercept', 'amplitude', 'exponent', 'offset']\n};\n\nexports.attrsGroupsDefaults = {\n core: {'xml:space': 'preserve'},\n filterPrimitive: {x: '0', y: '0', width: '100%', height: '100%'},\n presentation: {\n clip: 'auto',\n 'clip-path': 'none',\n 'clip-rule': 'nonzero',\n mask: 'none',\n opacity: '1',\n 'solid-color': '#000',\n 'solid-opacity': '1',\n 'stop-color': '#000',\n 'stop-opacity': '1',\n 'fill-opacity': '1',\n 'fill-rule': 'nonzero',\n fill: '#000',\n stroke: 'none',\n 'stroke-width': '1',\n 'stroke-linecap': 'butt',\n 'stroke-linejoin': 'miter',\n 'stroke-miterlimit': '4',\n 'stroke-dasharray': 'none',\n 'stroke-dashoffset': '0',\n 'stroke-opacity': '1',\n 'paint-order': 'normal',\n 'vector-effect': 'none',\n 'viewport-fill': 'none',\n 'viewport-fill-opacity': '1',\n display: 'inline',\n visibility: 'visible',\n 'marker-start': 'none',\n 'marker-mid': 'none',\n 'marker-end': 'none',\n 'color-interpolation': 'sRGB',\n 'color-interpolation-filters': 'linearRGB',\n 'color-rendering': 'auto',\n 'shape-rendering': 'auto',\n 'text-rendering': 'auto',\n 'image-rendering': 'auto',\n 'buffered-rendering': 'auto',\n 'font-style': 'normal',\n 'font-variant': 'normal',\n 'font-weight': 'normal',\n 'font-stretch': 'normal',\n 'font-size': 'medium',\n 'font-size-adjust': 'none',\n kerning: 'auto',\n 'letter-spacing': 'normal',\n 'word-spacing': 'normal',\n 'text-decoration': 'none',\n 'text-anchor': 'start',\n 'text-overflow': 'clip',\n 'writing-mode': 'lr-tb',\n 'glyph-orientation-vertical': 'auto',\n 'glyph-orientation-horizontal': '0deg',\n direction: 'ltr',\n 'unicode-bidi': 'normal',\n 'dominant-baseline': 'auto',\n 'alignment-baseline': 'baseline',\n 'baseline-shift': 'baseline'\n },\n transferFunction: {slope: '1', intercept: '0', amplitude: '1', exponent: '1', offset: '0'}\n};\n\n// http://www.w3.org/TR/SVG/eltindex.html\nexports.elems = {\n a: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'target'\n ],\n defaults: {\n target: '_self'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n altGlyph: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'glyphRef',\n 'format',\n 'rotate'\n ]\n },\n altGlyphDef: {\n attrsGroups: [\n 'core'\n ],\n content: [\n 'glyphRef'\n ]\n },\n altGlyphItem: {\n attrsGroups: [\n 'core'\n ],\n content: [\n 'glyphRef',\n 'altGlyphItem'\n ]\n },\n animate: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'animationAddition',\n 'animationAttributeTarget',\n 'animationEvent',\n 'animationTiming',\n 'animationValue',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'externalResourcesRequired'\n ],\n contentGroups: [\n 'descriptive'\n ]\n },\n animateColor: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'animationEvent',\n 'xlink',\n 'animationAttributeTarget',\n 'animationTiming',\n 'animationValue',\n 'animationAddition',\n 'presentation'\n ],\n attrs: [\n 'externalResourcesRequired'\n ],\n contentGroups: [\n 'descriptive'\n ]\n },\n animateMotion: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'animationEvent',\n 'xlink',\n 'animationTiming',\n 'animationValue',\n 'animationAddition'\n ],\n attrs: [\n 'externalResourcesRequired',\n 'path',\n 'keyPoints',\n 'rotate',\n 'origin'\n ],\n defaults: {\n 'rotate': '0'\n },\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'mpath'\n ]\n },\n animateTransform: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'animationEvent',\n 'xlink',\n 'animationAttributeTarget',\n 'animationTiming',\n 'animationValue',\n 'animationAddition'\n ],\n attrs: [\n 'externalResourcesRequired',\n 'type'\n ],\n contentGroups: [\n 'descriptive'\n ]\n },\n circle: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'cx',\n 'cy',\n 'r'\n ],\n defaults: {\n cx: '0',\n cy: '0'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n clipPath: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'clipPathUnits'\n ],\n defaults: {\n clipPathUnits: 'userSpaceOnUse'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape'\n ],\n content: [\n 'text',\n 'use'\n ]\n },\n 'color-profile': {\n attrsGroups: [\n 'core',\n 'xlink'\n ],\n attrs: [\n 'local',\n 'name',\n 'rendering-intent'\n ],\n defaults: {\n name: 'sRGB',\n 'rendering-intent': 'auto'\n },\n contentGroups: [\n 'descriptive'\n ]\n },\n cursor: {\n attrsGroups: [\n 'core',\n 'conditionalProcessing',\n 'xlink'\n ],\n attrs: [\n 'externalResourcesRequired',\n 'x',\n 'y'\n ],\n defaults: {\n x: '0',\n y: '0'\n },\n contentGroups: [\n 'descriptive'\n ]\n },\n defs: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform'\n ],\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n desc: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'class',\n 'style'\n ]\n },\n ellipse: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'cx',\n 'cy',\n 'rx',\n 'ry'\n ],\n defaults: {\n cx: '0',\n cy: '0'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n feBlend: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n // TODO: in - 'If no value is provided and this is the first filter primitive,\n // then this filter primitive will use SourceGraphic as its input'\n 'in',\n 'in2',\n 'mode'\n ],\n defaults: {\n mode: 'normal'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feColorMatrix: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'type',\n 'values'\n ],\n defaults: {\n type: 'matrix'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feComponentTransfer: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in'\n ],\n content: [\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR'\n ]\n },\n feComposite: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'in2',\n 'operator',\n 'k1',\n 'k2',\n 'k3',\n 'k4'\n ],\n defaults: {\n operator: 'over',\n k1: '0',\n k2: '0',\n k3: '0',\n k4: '0'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feConvolveMatrix: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'order',\n 'kernelMatrix',\n // TODO: divisor - 'The default value is the sum of all values in kernelMatrix,\n // with the exception that if the sum is zero, then the divisor is set to 1'\n 'divisor',\n 'bias',\n // TODO: targetX - 'By default, the convolution matrix is centered in X over each\n // pixel of the input image (i.e., targetX = floor ( orderX / 2 ))'\n 'targetX',\n 'targetY',\n 'edgeMode',\n // TODO: kernelUnitLength - 'The first number is the <dx> value. The second number\n // is the <dy> value. If the <dy> value is not specified, it defaults to the same value as <dx>'\n 'kernelUnitLength',\n 'preserveAlpha'\n ],\n defaults: {\n order: '3',\n bias: '0',\n edgeMode: 'duplicate',\n preserveAlpha: 'false'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feDiffuseLighting: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'surfaceScale',\n 'diffuseConstant',\n 'kernelUnitLength'\n ],\n defaults: {\n surfaceScale: '1',\n diffuseConstant: '1'\n },\n contentGroups: [\n 'descriptive'\n ],\n content: [\n // TODO: 'exactly one light source element, in any order'\n 'feDistantLight',\n 'fePointLight',\n 'feSpotLight'\n ]\n },\n feDisplacementMap: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'in2',\n 'scale',\n 'xChannelSelector',\n 'yChannelSelector'\n ],\n defaults: {\n scale: '0',\n xChannelSelector: 'A',\n yChannelSelector: 'A'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feDistantLight: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'azimuth',\n 'elevation'\n ],\n defaults: {\n azimuth: '0',\n elevation: '0'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feFlood: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style'\n ],\n content: [\n 'animate',\n 'animateColor',\n 'set'\n ]\n },\n feFuncA: {\n attrsGroups: [\n 'core',\n 'transferFunction'\n ],\n content: [\n 'set',\n 'animate'\n ]\n },\n feFuncB: {\n attrsGroups: [\n 'core',\n 'transferFunction'\n ],\n content: [\n 'set',\n 'animate'\n ]\n },\n feFuncG: {\n attrsGroups: [\n 'core',\n 'transferFunction'\n ],\n content: [\n 'set',\n 'animate'\n ]\n },\n feFuncR: {\n attrsGroups: [\n 'core',\n 'transferFunction'\n ],\n content: [\n 'set',\n 'animate'\n ]\n },\n feGaussianBlur: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'stdDeviation'\n ],\n defaults: {\n stdDeviation: '0'\n },\n content: [\n 'set',\n 'animate'\n ]\n },\n feImage: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'preserveAspectRatio',\n 'href',\n 'xlink:href'\n ],\n defaults: {\n preserveAspectRatio: 'xMidYMid meet'\n },\n content: [\n 'animate',\n 'animateTransform',\n 'set'\n ]\n },\n feMerge: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style'\n ],\n content: [\n 'feMergeNode'\n ]\n },\n feMergeNode: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'in'\n ],\n content: [\n 'animate',\n 'set'\n ]\n },\n feMorphology: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'operator',\n 'radius'\n ],\n defaults: {\n operator: 'erode',\n radius: '0'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feOffset: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'dx',\n 'dy'\n ],\n defaults: {\n dx: '0',\n dy: '0'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n fePointLight: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'x',\n 'y',\n 'z'\n ],\n defaults: {\n x: '0',\n y: '0',\n z: '0'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feSpecularLighting: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in',\n 'surfaceScale',\n 'specularConstant',\n 'specularExponent',\n 'kernelUnitLength'\n ],\n defaults: {\n surfaceScale: '1',\n specularConstant: '1',\n specularExponent: '1'\n },\n contentGroups: [\n 'descriptive',\n // TODO: exactly one 'light source element'\n 'lightSource'\n ]\n },\n feSpotLight: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'x',\n 'y',\n 'z',\n 'pointsAtX',\n 'pointsAtY',\n 'pointsAtZ',\n 'specularExponent',\n 'limitingConeAngle'\n ],\n defaults: {\n x: '0',\n y: '0',\n z: '0',\n pointsAtX: '0',\n pointsAtY: '0',\n pointsAtZ: '0',\n specularExponent: '1'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n feTile: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'in'\n ],\n content: [\n 'animate',\n 'set'\n ]\n },\n feTurbulence: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'filterPrimitive'\n ],\n attrs: [\n 'class',\n 'style',\n 'baseFrequency',\n 'numOctaves',\n 'seed',\n 'stitchTiles',\n 'type'\n ],\n defaults: {\n baseFrequency: '0',\n numOctaves: '1',\n seed: '0',\n stitchTiles: 'noStitch',\n type: 'turbulence'\n },\n content: [\n 'animate',\n 'set'\n ]\n },\n filter: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'x',\n 'y',\n 'width',\n 'height',\n 'filterRes',\n 'filterUnits',\n 'primitiveUnits',\n 'href',\n 'xlink:href'\n ],\n defaults: {\n primitiveUnits: 'userSpaceOnUse',\n x: '-10%',\n y: '-10%',\n width: '120%',\n height: '120%'\n },\n contentGroups: [\n 'descriptive',\n 'filterPrimitive'\n ],\n content: [\n 'animate',\n 'set'\n ]\n },\n font: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'horiz-origin-x',\n 'horiz-origin-y',\n 'horiz-adv-x',\n 'vert-origin-x',\n 'vert-origin-y',\n 'vert-adv-y'\n ],\n defaults: {\n 'horiz-origin-x': '0',\n 'horiz-origin-y': '0'\n },\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'font-face',\n 'glyph',\n 'hkern',\n 'missing-glyph',\n 'vkern'\n ]\n },\n 'font-face': {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'font-family',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'font-stretch',\n 'font-size',\n 'unicode-range',\n 'units-per-em',\n 'panose-1',\n 'stemv',\n 'stemh',\n 'slope',\n 'cap-height',\n 'x-height',\n 'accent-height',\n 'ascent',\n 'descent',\n 'widths',\n 'bbox',\n 'ideographic',\n 'alphabetic',\n 'mathematical',\n 'hanging',\n 'v-ideographic',\n 'v-alphabetic',\n 'v-mathematical',\n 'v-hanging',\n 'underline-position',\n 'underline-thickness',\n 'strikethrough-position',\n 'strikethrough-thickness',\n 'overline-position',\n 'overline-thickness'\n ],\n defaults: {\n 'font-style': 'all',\n 'font-variant': 'normal',\n 'font-weight': 'all',\n 'font-stretch': 'normal',\n 'unicode-range': 'U+0-10FFFF',\n 'units-per-em': '1000',\n 'panose-1': '0 0 0 0 0 0 0 0 0 0',\n 'slope': '0'\n },\n contentGroups: [\n 'descriptive'\n ],\n content: [\n // TODO: \"at most one 'font-face-src' element\"\n 'font-face-src'\n ]\n },\n // TODO: empty content\n 'font-face-format': {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'string'\n ]\n },\n 'font-face-name': {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'name'\n ]\n },\n 'font-face-src': {\n attrsGroups: [\n 'core'\n ],\n content: [\n 'font-face-name',\n 'font-face-uri'\n ]\n },\n 'font-face-uri': {\n attrsGroups: [\n 'core',\n 'xlink'\n ],\n attrs: [\n 'href',\n 'xlink:href'\n ],\n content: [\n 'font-face-format'\n ]\n },\n foreignObject: {\n attrsGroups: [\n 'core',\n 'conditionalProcessing',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'x',\n 'y',\n 'width',\n 'height'\n ],\n defaults: {\n x: 0,\n y: 0\n }\n },\n g: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform'\n ],\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n glyph: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'd',\n 'horiz-adv-x',\n 'vert-origin-x',\n 'vert-origin-y',\n 'vert-adv-y',\n 'unicode',\n 'glyph-name',\n 'orientation',\n 'arabic-form',\n 'lang'\n ],\n defaults: {\n 'arabic-form': 'initial'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ],\n },\n glyphRef: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'd',\n 'horiz-adv-x',\n 'vert-origin-x',\n 'vert-origin-y',\n 'vert-adv-y'\n ],\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n hatch: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'x',\n 'y',\n 'pitch',\n 'rotate',\n 'hatchUnits',\n 'hatchContentUnits',\n 'transform'\n ],\n defaults: {\n hatchUnits: 'objectBoundingBox',\n hatchContentUnits: 'userSpaceOnUse',\n x: '0',\n y: '0',\n pitch: '0',\n rotate: '0'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ],\n content: [\n 'hatchPath'\n ]\n },\n hatchPath: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'd',\n 'offset'\n ],\n defaults: {\n offset: '0'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n hkern: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'u1',\n 'g1',\n 'u2',\n 'g2',\n 'k'\n ]\n },\n image: {\n attrsGroups: [\n 'core',\n 'conditionalProcessing',\n 'graphicalEvent',\n 'xlink',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'preserveAspectRatio',\n 'transform',\n 'x',\n 'y',\n 'width',\n 'height',\n 'href',\n 'xlink:href'\n ],\n defaults: {\n x: '0',\n y: '0',\n preserveAspectRatio: 'xMidYMid meet'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n line: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'x1',\n 'y1',\n 'x2',\n 'y2'\n ],\n defaults: {\n x1: '0',\n y1: '0',\n x2: '0',\n y2: '0'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n linearGradient: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n 'spreadMethod',\n 'href',\n 'xlink:href'\n ],\n defaults: {\n x1: '0',\n y1: '0',\n x2: '100%',\n y2: '0',\n spreadMethod: 'pad'\n },\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'animate',\n 'animateTransform',\n 'set',\n 'stop'\n ]\n },\n marker: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'viewBox',\n 'preserveAspectRatio',\n 'refX',\n 'refY',\n 'markerUnits',\n 'markerWidth',\n 'markerHeight',\n 'orient'\n ],\n defaults: {\n markerUnits: 'strokeWidth',\n refX: '0',\n refY: '0',\n markerWidth: '3',\n markerHeight: '3'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n mask: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'x',\n 'y',\n 'width',\n 'height',\n 'maskUnits',\n 'maskContentUnits'\n ],\n defaults: {\n maskUnits: 'objectBoundingBox',\n maskContentUnits: 'userSpaceOnUse',\n x: '-10%',\n y: '-10%',\n width: '120%',\n height: '120%'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n metadata: {\n attrsGroups: [\n 'core'\n ]\n },\n 'missing-glyph': {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'd',\n 'horiz-adv-x',\n 'vert-origin-x',\n 'vert-origin-y',\n 'vert-adv-y'\n ],\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n mpath: {\n attrsGroups: [\n 'core',\n 'xlink'\n ],\n attrs: [\n 'externalResourcesRequired',\n 'href',\n 'xlink:href'\n ],\n contentGroups: [\n 'descriptive'\n ]\n },\n path: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'd',\n 'pathLength'\n ],\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n pattern: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'viewBox',\n 'preserveAspectRatio',\n 'x',\n 'y',\n 'width',\n 'height',\n 'patternUnits',\n 'patternContentUnits',\n 'patternTransform',\n 'href',\n 'xlink:href'\n ],\n defaults: {\n patternUnits: 'objectBoundingBox',\n patternContentUnits: 'userSpaceOnUse',\n x: '0',\n y: '0',\n width: '0',\n height: '0',\n preserveAspectRatio: 'xMidYMid meet'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'paintServer',\n 'shape',\n 'structural'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n polygon: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'points'\n ],\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n polyline: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'points'\n ],\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n radialGradient: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n 'gradientUnits',\n 'gradientTransform',\n 'spreadMethod',\n 'href',\n 'xlink:href'\n ],\n defaults: {\n gradientUnits: 'objectBoundingBox',\n cx: '50%',\n cy: '50%',\n r: '50%'\n },\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'animate',\n 'animateTransform',\n 'set',\n 'stop'\n ]\n },\n meshGradient: {\n attrsGroups: [\n 'core',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'x',\n 'y',\n 'gradientUnits',\n 'transform'\n ],\n contentGroups: [\n 'descriptive',\n 'paintServer',\n 'animation',\n ],\n content: [\n 'meshRow'\n ]\n },\n meshRow: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style'\n ],\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'meshPatch'\n ]\n },\n meshPatch: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style'\n ],\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'stop'\n ]\n },\n rect: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'x',\n 'y',\n 'width',\n 'height',\n 'rx',\n 'ry'\n ],\n defaults: {\n x: '0',\n y: '0'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n script: {\n attrsGroups: [\n 'core',\n 'xlink'\n ],\n attrs: [\n 'externalResourcesRequired',\n 'type',\n 'href',\n 'xlink:href'\n ]\n },\n set: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'animation',\n 'xlink',\n 'animationAttributeTarget',\n 'animationTiming',\n ],\n attrs: [\n 'externalResourcesRequired',\n 'to'\n ],\n contentGroups: [\n 'descriptive'\n ]\n },\n solidColor: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style'\n ],\n contentGroups: [\n 'paintServer'\n ]\n },\n stop: {\n attrsGroups: [\n 'core',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'offset',\n 'path'\n ],\n content: [\n 'animate',\n 'animateColor',\n 'set'\n ]\n },\n style: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'type',\n 'media',\n 'title'\n ],\n defaults: {\n type: 'text/css'\n }\n },\n svg: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'documentEvent',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'x',\n 'y',\n 'width',\n 'height',\n 'viewBox',\n 'preserveAspectRatio',\n 'zoomAndPan',\n 'version',\n 'baseProfile',\n 'contentScriptType',\n 'contentStyleType'\n ],\n defaults: {\n x: '0',\n y: '0',\n width: '100%',\n height: '100%',\n preserveAspectRatio: 'xMidYMid meet',\n zoomAndPan: 'magnify',\n version: '1.1',\n baseProfile: 'none',\n contentScriptType: 'application/ecmascript',\n contentStyleType: 'text/css'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n switch: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform'\n ],\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape'\n ],\n content: [\n 'a',\n 'foreignObject',\n 'g',\n 'image',\n 'svg',\n 'switch',\n 'text',\n 'use'\n ]\n },\n symbol: {\n attrsGroups: [\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'preserveAspectRatio',\n 'viewBox',\n 'refX',\n 'refY'\n ],\n defaults: {\n refX: 0,\n refY: 0\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'shape',\n 'structural',\n 'paintServer'\n ],\n content: [\n 'a',\n 'altGlyphDef',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'filter',\n 'font',\n 'font-face',\n 'foreignObject',\n 'image',\n 'marker',\n 'mask',\n 'pattern',\n 'script',\n 'style',\n 'switch',\n 'text',\n 'view'\n ]\n },\n text: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'lengthAdjust',\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'rotate',\n 'textLength'\n ],\n defaults: {\n x: '0',\n y: '0',\n lengthAdjust: 'spacing'\n },\n contentGroups: [\n 'animation',\n 'descriptive',\n 'textContentChild'\n ],\n content: [\n 'a'\n ]\n },\n textPath: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'href',\n 'xlink:href',\n 'startOffset',\n 'method',\n 'spacing',\n 'd'\n ],\n defaults: {\n startOffset: '0',\n method: 'align',\n spacing: 'exact'\n },\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'a',\n 'altGlyph',\n 'animate',\n 'animateColor',\n 'set',\n 'tref',\n 'tspan'\n ]\n },\n title: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'class',\n 'style'\n ]\n },\n tref: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'href',\n 'xlink:href'\n ],\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'animate',\n 'animateColor',\n 'set'\n ]\n },\n tspan: {\n attrsGroups: [\n 'conditionalProcessing',\n 'core',\n 'graphicalEvent',\n 'presentation'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'x',\n 'y',\n 'dx',\n 'dy',\n 'rotate',\n 'textLength',\n 'lengthAdjust'\n ],\n contentGroups: [\n 'descriptive'\n ],\n content: [\n 'a',\n 'altGlyph',\n 'animate',\n 'animateColor',\n 'set',\n 'tref',\n 'tspan'\n ]\n },\n use: {\n attrsGroups: [\n 'core',\n 'conditionalProcessing',\n 'graphicalEvent',\n 'presentation',\n 'xlink'\n ],\n attrs: [\n 'class',\n 'style',\n 'externalResourcesRequired',\n 'transform',\n 'x',\n 'y',\n 'width',\n 'height',\n 'href',\n 'xlink:href'\n ],\n defaults: {\n x: '0',\n y: '0'\n },\n contentGroups: [\n 'animation',\n 'descriptive'\n ]\n },\n view: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'externalResourcesRequired',\n 'viewBox',\n 'preserveAspectRatio',\n 'zoomAndPan',\n 'viewTarget'\n ],\n contentGroups: [\n 'descriptive'\n ]\n },\n vkern: {\n attrsGroups: [\n 'core'\n ],\n attrs: [\n 'u1',\n 'g1',\n 'u2',\n 'g2',\n 'k'\n ]\n }\n};\n\n// http://wiki.inkscape.org/wiki/index.php/Inkscape-specific_XML_attributes\nexports.editorNamespaces = [\n 'http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd',\n 'http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd',\n 'http://www.inkscape.org/namespaces/inkscape',\n 'http://www.bohemiancoding.com/sketch/ns',\n 'http://ns.adobe.com/AdobeIllustrator/10.0/',\n 'http://ns.adobe.com/Graphs/1.0/',\n 'http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/',\n 'http://ns.adobe.com/Variables/1.0/',\n 'http://ns.adobe.com/SaveForWeb/1.0/',\n 'http://ns.adobe.com/Extensibility/1.0/',\n 'http://ns.adobe.com/Flows/1.0/',\n 'http://ns.adobe.com/ImageReplacement/1.0/',\n 'http://ns.adobe.com/GenericCustomNamespace/1.0/',\n 'http://ns.adobe.com/XPath/1.0/'\n];\n\n// http://www.w3.org/TR/SVG/linking.html#processingIRI\nexports.referencesProps = [\n 'clip-path',\n 'color-profile',\n 'fill',\n 'filter',\n 'marker-start',\n 'marker-mid',\n 'marker-end',\n 'mask',\n 'stroke',\n 'style'\n];\n\n// http://www.w3.org/TR/SVG/propidx.html\nexports.inheritableAttrs = [\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cursor',\n 'direction',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'font',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'glyph-orientation-horizontal',\n 'glyph-orientation-vertical',\n 'image-rendering',\n 'kerning',\n 'letter-spacing',\n 'marker',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'pointer-events',\n 'shape-rendering',\n 'stroke',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'text-anchor',\n 'text-rendering',\n 'transform',\n 'visibility',\n 'white-space',\n 'word-spacing',\n 'writing-mode'\n];\n\n// http://www.w3.org/TR/SVG/single-page.html#types-ColorKeywords\nexports.colorsNames = {\n 'aliceblue': '#f0f8ff',\n 'antiquewhite': '#faebd7',\n 'aqua': '#0ff',\n 'aquamarine': '#7fffd4',\n 'azure': '#f0ffff',\n 'beige': '#f5f5dc',\n 'bisque': '#ffe4c4',\n 'black': '#000',\n 'blanchedalmond': '#ffebcd',\n 'blue': '#00f',\n 'blueviolet': '#8a2be2',\n 'brown': '#a52a2a',\n 'burlywood': '#deb887',\n 'cadetblue': '#5f9ea0',\n 'chartreuse': '#7fff00',\n 'chocolate': '#d2691e',\n 'coral': '#ff7f50',\n 'cornflowerblue': '#6495ed',\n 'cornsilk': '#fff8dc',\n 'crimson': '#dc143c',\n 'cyan': '#0ff',\n 'darkblue': '#00008b',\n 'darkcyan': '#008b8b',\n 'darkgoldenrod': '#b8860b',\n 'darkgray': '#a9a9a9',\n 'darkgreen': '#006400',\n 'darkgrey': '#a9a9a9',\n 'darkkhaki': '#bdb76b',\n 'darkmagenta': '#8b008b',\n 'darkolivegreen': '#556b2f',\n 'darkorange': '#ff8c00',\n 'darkorchid': '#9932cc',\n 'darkred': '#8b0000',\n 'darksalmon': '#e9967a',\n 'darkseagreen': '#8fbc8f',\n 'darkslateblue': '#483d8b',\n 'darkslategray': '#2f4f4f',\n 'darkslategrey': '#2f4f4f',\n 'darkturquoise': '#00ced1',\n 'darkviolet': '#9400d3',\n 'deeppink': '#ff1493',\n 'deepskyblue': '#00bfff',\n 'dimgray': '#696969',\n 'dimgrey': '#696969',\n 'dodgerblue': '#1e90ff',\n 'firebrick': '#b22222',\n 'floralwhite': '#fffaf0',\n 'forestgreen': '#228b22',\n 'fuchsia': '#f0f',\n 'gainsboro': '#dcdcdc',\n 'ghostwhite': '#f8f8ff',\n 'gold': '#ffd700',\n 'goldenrod': '#daa520',\n 'gray': '#808080',\n 'green': '#008000',\n 'greenyellow': '#adff2f',\n 'grey': '#808080',\n 'honeydew': '#f0fff0',\n 'hotpink': '#ff69b4',\n 'indianred': '#cd5c5c',\n 'indigo': '#4b0082',\n 'ivory': '#fffff0',\n 'khaki': '#f0e68c',\n 'lavender': '#e6e6fa',\n 'lavenderblush': '#fff0f5',\n 'lawngreen': '#7cfc00',\n 'lemonchiffon': '#fffacd',\n 'lightblue': '#add8e6',\n 'lightcoral': '#f08080',\n 'lightcyan': '#e0ffff',\n 'lightgoldenrodyellow': '#fafad2',\n 'lightgray': '#d3d3d3',\n 'lightgreen': '#90ee90',\n 'lightgrey': '#d3d3d3',\n 'lightpink': '#ffb6c1',\n 'lightsalmon': '#ffa07a',\n 'lightseagreen': '#20b2aa',\n 'lightskyblue': '#87cefa',\n 'lightslategray': '#789',\n 'lightslategrey': '#789',\n 'lightsteelblue': '#b0c4de',\n 'lightyellow': '#ffffe0',\n 'lime': '#0f0',\n 'limegreen': '#32cd32',\n 'linen': '#faf0e6',\n 'magenta': '#f0f',\n 'maroon': '#800000',\n 'mediumaquamarine': '#66cdaa',\n 'mediumblue': '#0000cd',\n 'mediumorchid': '#ba55d3',\n 'mediumpurple': '#9370db',\n 'mediumseagreen': '#3cb371',\n 'mediumslateblue': '#7b68ee',\n 'mediumspringgreen': '#00fa9a',\n 'mediumturquoise': '#48d1cc',\n 'mediumvioletred': '#c71585',\n 'midnightblue': '#191970',\n 'mintcream': '#f5fffa',\n 'mistyrose': '#ffe4e1',\n 'moccasin': '#ffe4b5',\n 'navajowhite': '#ffdead',\n 'navy': '#000080',\n 'oldlace': '#fdf5e6',\n 'olive': '#808000',\n 'olivedrab': '#6b8e23',\n 'orange': '#ffa500',\n 'orangered': '#ff4500',\n 'orchid': '#da70d6',\n 'palegoldenrod': '#eee8aa',\n 'palegreen': '#98fb98',\n 'paleturquoise': '#afeeee',\n 'palevioletred': '#db7093',\n 'papayawhip': '#ffefd5',\n 'peachpuff': '#ffdab9',\n 'peru': '#cd853f',\n 'pink': '#ffc0cb',\n 'plum': '#dda0dd',\n 'powderblue': '#b0e0e6',\n 'purple': '#800080',\n 'rebeccapurple': '#639',\n 'red': '#f00',\n 'rosybrown': '#bc8f8f',\n 'royalblue': '#4169e1',\n 'saddlebrown': '#8b4513',\n 'salmon': '#fa8072',\n 'sandybrown': '#f4a460',\n 'seagreen': '#2e8b57',\n 'seashell': '#fff5ee',\n 'sienna': '#a0522d',\n 'silver': '#c0c0c0',\n 'skyblue': '#87ceeb',\n 'slateblue': '#6a5acd',\n 'slategray': '#708090',\n 'slategrey': '#708090',\n 'snow': '#fffafa',\n 'springgreen': '#00ff7f',\n 'steelblue': '#4682b4',\n 'tan': '#d2b48c',\n 'teal': '#008080',\n 'thistle': '#d8bfd8',\n 'tomato': '#ff6347',\n 'turquoise': '#40e0d0',\n 'violet': '#ee82ee',\n 'wheat': '#f5deb3',\n 'white': '#fff',\n 'whitesmoke': '#f5f5f5',\n 'yellow': '#ff0',\n 'yellowgreen': '#9acd32'\n};\n\nexports.colorsShortNames = {\n '#f0ffff': 'azure',\n '#f5f5dc': 'beige',\n '#ffe4c4': 'bisque',\n '#a52a2a': 'brown',\n '#ff7f50': 'coral',\n '#ffd700': 'gold',\n '#808080': 'gray',\n '#008000': 'green',\n '#4b0082': 'indigo',\n '#fffff0': 'ivory',\n '#f0e68c': 'khaki',\n '#faf0e6': 'linen',\n '#800000': 'maroon',\n '#000080': 'navy',\n '#808000': 'olive',\n '#ffa500': 'orange',\n '#da70d6': 'orchid',\n '#cd853f': 'peru',\n '#ffc0cb': 'pink',\n '#dda0dd': 'plum',\n '#800080': 'purple',\n '#f00': 'red',\n '#ff0000': 'red',\n '#fa8072': 'salmon',\n '#a0522d': 'sienna',\n '#c0c0c0': 'silver',\n '#fffafa': 'snow',\n '#d2b48c': 'tan',\n '#008080': 'teal',\n '#ff6347': 'tomato',\n '#ee82ee': 'violet',\n '#f5deb3': 'wheat'\n};\n\n// http://www.w3.org/TR/SVG/single-page.html#types-DataTypeColor\nexports.colorsProps = [\n 'color', 'fill', 'stroke', 'stop-color', 'flood-color', 'lighting-color'\n];\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes editors namespaces, elements and attributes';\n\nvar editorNamespaces = require('./_collections').editorNamespaces,\n prefixes = [];\n\nexports.params = {\n additionalNamespaces: []\n};\n\n/**\n * Remove editors namespaces, elements and attributes.\n *\n * @example\n * <svg xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\">\n * <sodipodi:namedview/>\n * <path sodipodi:nodetypes=\"cccc\"/>\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n if (Array.isArray(params.additionalNamespaces)) {\n editorNamespaces = editorNamespaces.concat(params.additionalNamespaces);\n }\n\n if (item.elem) {\n\n if (item.isElem('svg')) {\n\n item.eachAttr(function(attr) {\n if (attr.prefix === 'xmlns' && editorNamespaces.indexOf(attr.value) > -1) {\n prefixes.push(attr.local);\n\n // <svg xmlns:sodipodi=\"\">\n item.removeAttr(attr.name);\n }\n });\n\n }\n\n // <* sodipodi:*=\"\">\n item.eachAttr(function(attr) {\n if (prefixes.indexOf(attr.prefix) > -1) {\n item.removeAttr(attr.name);\n }\n });\n\n // <sodipodi:*>\n if (prefixes.indexOf(item.prefix) > -1) {\n return false;\n }\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'cleanups attributes from newlines, trailing and repeating spaces';\n\nexports.params = {\n newlines: true,\n trim: true,\n spaces: true\n};\n\nvar regNewlinesNeedSpace = /(\\S)\\r?\\n(\\S)/g,\n regNewlines = /\\r?\\n/g,\n regSpaces = /\\s{2,}/g;\n\n/**\n * Cleanup attributes values from newlines, trailing and repeating spaces.\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n if (item.isElem()) {\n\n item.eachAttr(function(attr) {\n\n if (params.newlines) {\n // new line which requires a space instead of themselve\n attr.value = attr.value.replace(regNewlinesNeedSpace, function(match, p1, p2) {\n return p1 + ' ' + p2;\n });\n\n // simple new line\n attr.value = attr.value.replace(regNewlines, '');\n }\n\n if (params.trim) {\n attr.value = attr.value.trim();\n }\n\n if (params.spaces) {\n attr.value = attr.value.replace(regSpaces, ' ');\n }\n\n });\n\n }\n\n};\n","module.exports = function createCustomError(name, message) {\n // use Object.create(), because some VMs prevent setting line/column otherwise\n // (iOS Safari 10 even throws an exception)\n var error = Object.create(SyntaxError.prototype);\n var errorStack = new Error();\n\n error.name = name;\n error.message = message;\n\n Object.defineProperty(error, 'stack', {\n get: function() {\n return (errorStack.stack || '').replace(/^(.+\\n){1,3}/, name + ': ' + message + '\\n');\n }\n });\n\n return error;\n};\n","'use strict';\n\n// token types (note: value shouldn't intersect with used char codes)\nvar WHITESPACE = 1;\nvar IDENTIFIER = 2;\nvar NUMBER = 3;\nvar STRING = 4;\nvar COMMENT = 5;\nvar PUNCTUATOR = 6;\nvar CDO = 7;\nvar CDC = 8;\nvar ATKEYWORD = 14;\nvar FUNCTION = 15;\nvar URL = 16;\nvar RAW = 17;\n\nvar TAB = 9;\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar SPACE = 32;\n\nvar TYPE = {\n WhiteSpace: WHITESPACE,\n Identifier: IDENTIFIER,\n Number: NUMBER,\n String: STRING,\n Comment: COMMENT,\n Punctuator: PUNCTUATOR,\n CDO: CDO,\n CDC: CDC,\n AtKeyword: ATKEYWORD,\n Function: FUNCTION,\n Url: URL,\n Raw: RAW,\n\n ExclamationMark: 33, // !\n QuotationMark: 34, // \"\n NumberSign: 35, // #\n DollarSign: 36, // $\n PercentSign: 37, // %\n Ampersand: 38, // &\n Apostrophe: 39, // '\n LeftParenthesis: 40, // (\n RightParenthesis: 41, // )\n Asterisk: 42, // *\n PlusSign: 43, // +\n Comma: 44, // ,\n HyphenMinus: 45, // -\n FullStop: 46, // .\n Solidus: 47, // /\n Colon: 58, // :\n Semicolon: 59, // ;\n LessThanSign: 60, // <\n EqualsSign: 61, // =\n GreaterThanSign: 62, // >\n QuestionMark: 63, // ?\n CommercialAt: 64, // @\n LeftSquareBracket: 91, // [\n Backslash: 92, // \\\n RightSquareBracket: 93, // ]\n CircumflexAccent: 94, // ^\n LowLine: 95, // _\n GraveAccent: 96, // `\n LeftCurlyBracket: 123, // {\n VerticalLine: 124, // |\n RightCurlyBracket: 125, // }\n Tilde: 126 // ~\n};\n\nvar NAME = Object.keys(TYPE).reduce(function(result, key) {\n result[TYPE[key]] = key;\n return result;\n}, {});\n\n// https://drafts.csswg.org/css-syntax/#tokenizer-definitions\n// > non-ASCII code point\n// > A code point with a value equal to or greater than U+0080 <control>\n// > name-start code point\n// > A letter, a non-ASCII code point, or U+005F LOW LINE (_).\n// > name code point\n// > A name-start code point, a digit, or U+002D HYPHEN-MINUS (-)\n// That means only ASCII code points has a special meaning and we a maps for 0..127 codes only\nvar SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported\nvar SYMBOL_TYPE = new SafeUint32Array(0x80);\nvar PUNCTUATION = new SafeUint32Array(0x80);\nvar STOP_URL_RAW = new SafeUint32Array(0x80);\n\nfor (var i = 0; i < SYMBOL_TYPE.length; i++) {\n SYMBOL_TYPE[i] = IDENTIFIER;\n}\n\n// fill categories\n[\n TYPE.ExclamationMark, // !\n TYPE.QuotationMark, // \"\n TYPE.NumberSign, // #\n TYPE.DollarSign, // $\n TYPE.PercentSign, // %\n TYPE.Ampersand, // &\n TYPE.Apostrophe, // '\n TYPE.LeftParenthesis, // (\n TYPE.RightParenthesis, // )\n TYPE.Asterisk, // *\n TYPE.PlusSign, // +\n TYPE.Comma, // ,\n TYPE.HyphenMinus, // -\n TYPE.FullStop, // .\n TYPE.Solidus, // /\n TYPE.Colon, // :\n TYPE.Semicolon, // ;\n TYPE.LessThanSign, // <\n TYPE.EqualsSign, // =\n TYPE.GreaterThanSign, // >\n TYPE.QuestionMark, // ?\n TYPE.CommercialAt, // @\n TYPE.LeftSquareBracket, // [\n // TYPE.Backslash, // \\\n TYPE.RightSquareBracket, // ]\n TYPE.CircumflexAccent, // ^\n // TYPE.LowLine, // _\n TYPE.GraveAccent, // `\n TYPE.LeftCurlyBracket, // {\n TYPE.VerticalLine, // |\n TYPE.RightCurlyBracket, // }\n TYPE.Tilde // ~\n].forEach(function(key) {\n SYMBOL_TYPE[Number(key)] = PUNCTUATOR;\n PUNCTUATION[Number(key)] = PUNCTUATOR;\n});\n\nfor (var i = 48; i <= 57; i++) {\n SYMBOL_TYPE[i] = NUMBER;\n}\n\nSYMBOL_TYPE[SPACE] = WHITESPACE;\nSYMBOL_TYPE[TAB] = WHITESPACE;\nSYMBOL_TYPE[N] = WHITESPACE;\nSYMBOL_TYPE[R] = WHITESPACE;\nSYMBOL_TYPE[F] = WHITESPACE;\n\nSYMBOL_TYPE[TYPE.Apostrophe] = STRING;\nSYMBOL_TYPE[TYPE.QuotationMark] = STRING;\n\nSTOP_URL_RAW[SPACE] = 1;\nSTOP_URL_RAW[TAB] = 1;\nSTOP_URL_RAW[N] = 1;\nSTOP_URL_RAW[R] = 1;\nSTOP_URL_RAW[F] = 1;\nSTOP_URL_RAW[TYPE.Apostrophe] = 1;\nSTOP_URL_RAW[TYPE.QuotationMark] = 1;\nSTOP_URL_RAW[TYPE.LeftParenthesis] = 1;\nSTOP_URL_RAW[TYPE.RightParenthesis] = 1;\n\n// whitespace is punctuation ...\nPUNCTUATION[SPACE] = PUNCTUATOR;\nPUNCTUATION[TAB] = PUNCTUATOR;\nPUNCTUATION[N] = PUNCTUATOR;\nPUNCTUATION[R] = PUNCTUATOR;\nPUNCTUATION[F] = PUNCTUATOR;\n// ... hyper minus is not\nPUNCTUATION[TYPE.HyphenMinus] = 0;\n\nmodule.exports = {\n TYPE: TYPE,\n NAME: NAME,\n\n SYMBOL_TYPE: SYMBOL_TYPE,\n PUNCTUATION: PUNCTUATION,\n STOP_URL_RAW: STOP_URL_RAW\n};\n","var createCustomError = require('../../utils/createCustomError');\n\nvar SyntaxParseError = function(message, input, offset) {\n var error = createCustomError('SyntaxParseError', message);\n\n error.input = input;\n error.offset = offset;\n error.rawMessage = message;\n error.message = error.rawMessage + '\\n' +\n ' ' + error.input + '\\n' +\n '--' + new Array((error.offset || error.input.length) + 1).join('-') + '^';\n\n return error;\n};\n\nmodule.exports = {\n SyntaxParseError: SyntaxParseError\n};\n","var SyntaxParseError = require('./error').SyntaxParseError;\n\nvar TAB = 9;\nvar N = 10;\nvar F = 12;\nvar R = 13;\nvar SPACE = 32;\n\nvar Tokenizer = function(str) {\n this.str = str;\n this.pos = 0;\n};\n\nTokenizer.prototype = {\n charCodeAt: function(pos) {\n return pos < this.str.length ? this.str.charCodeAt(pos) : 0;\n },\n charCode: function() {\n return this.charCodeAt(this.pos);\n },\n nextCharCode: function() {\n return this.charCodeAt(this.pos + 1);\n },\n nextNonWsCode: function(pos) {\n return this.charCodeAt(this.findWsEnd(pos));\n },\n findWsEnd: function(pos) {\n for (; pos < this.str.length; pos++) {\n var code = this.str.charCodeAt(pos);\n if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {\n break;\n }\n }\n\n return pos;\n },\n substringToPos: function(end) {\n return this.str.substring(this.pos, this.pos = end);\n },\n eat: function(code) {\n if (this.charCode() !== code) {\n this.error('Expect `' + String.fromCharCode(code) + '`');\n }\n\n this.pos++;\n },\n peek: function() {\n return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';\n },\n error: function(message) {\n throw new SyntaxParseError(message, this.str, this.pos);\n }\n};\n\nmodule.exports = Tokenizer;\n","module.exports = {\n decorator: function(handlers) {\n var curNode = null;\n var prev = null;\n var tokens = [];\n\n return {\n children: handlers.children,\n node: function(node) {\n var tmp = curNode;\n curNode = node;\n handlers.node.call(this, node);\n curNode = tmp;\n },\n chunk: function(chunk) {\n if (tokens.length > 0) {\n switch (curNode.type) {\n case 'Dimension':\n case 'HexColor':\n case 'IdSelector':\n case 'Percentage':\n if (prev.node === curNode) {\n prev.value += chunk;\n return;\n }\n break;\n\n case 'Function':\n case 'PseudoClassSelector':\n case 'PseudoElementSelector':\n case 'Url':\n if (chunk === '(') {\n prev.value += chunk;\n return;\n }\n break;\n\n case 'Atrule':\n if (prev.node === curNode && prev.value === '@') {\n prev.value += chunk;\n return;\n }\n break;\n }\n }\n\n tokens.push(prev = {\n value: chunk,\n node: curNode\n });\n },\n result: function() {\n return tokens;\n }\n };\n }\n};\n","module.exports = {\n SyntaxParseError: require('./error').SyntaxParseError,\n parse: require('./parse'),\n generate: require('./generate'),\n walk: require('./walk')\n};\n","var TYPE = require('../tokenizer').TYPE;\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\n\nmodule.exports = function readSequence(recognizer) {\n var children = this.createList();\n var child = null;\n var context = {\n recognizer: recognizer,\n space: null,\n ignoreWS: false,\n ignoreWSAfter: false\n };\n\n this.scanner.skipSC();\n\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case COMMENT:\n this.scanner.next();\n continue;\n\n case WHITESPACE:\n if (context.ignoreWS) {\n this.scanner.next();\n } else {\n context.space = this.WhiteSpace();\n }\n continue;\n }\n\n child = recognizer.getNode.call(this, context);\n\n if (child === undefined) {\n break;\n }\n\n if (context.space !== null) {\n children.push(context.space);\n context.space = null;\n }\n\n children.push(child);\n\n if (context.ignoreWSAfter) {\n context.ignoreWSAfter = false;\n context.ignoreWS = true;\n } else {\n context.ignoreWS = false;\n }\n }\n\n return children;\n};\n","'use strict';\n\nvar SourceMapGenerator = require('source-map').SourceMapGenerator;\nvar trackNodes = {\n Atrule: true,\n Selector: true,\n Declaration: true\n};\n\nmodule.exports = function generateSourceMap(handlers) {\n var map = new SourceMapGenerator();\n var line = 1;\n var column = 0;\n var generated = {\n line: 1,\n column: 0\n };\n var original = {\n line: 0, // should be zero to add first mapping\n column: 0\n };\n var sourceMappingActive = false;\n var activatedGenerated = {\n line: 1,\n column: 0\n };\n var activatedMapping = {\n generated: activatedGenerated\n };\n\n var handlersNode = handlers.node;\n handlers.node = function(node) {\n if (node.loc && node.loc.start && trackNodes.hasOwnProperty(node.type)) {\n var nodeLine = node.loc.start.line;\n var nodeColumn = node.loc.start.column - 1;\n\n if (original.line !== nodeLine ||\n original.column !== nodeColumn) {\n original.line = nodeLine;\n original.column = nodeColumn;\n\n generated.line = line;\n generated.column = column;\n\n if (sourceMappingActive) {\n sourceMappingActive = false;\n if (generated.line !== activatedGenerated.line ||\n generated.column !== activatedGenerated.column) {\n map.addMapping(activatedMapping);\n }\n }\n\n sourceMappingActive = true;\n map.addMapping({\n source: node.loc.source,\n original: original,\n generated: generated\n });\n }\n }\n\n handlersNode.call(this, node);\n\n if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) {\n activatedGenerated.line = line;\n activatedGenerated.column = column;\n }\n };\n\n var handlersChunk = handlers.chunk;\n handlers.chunk = function(chunk) {\n for (var i = 0; i < chunk.length; i++) {\n if (chunk.charCodeAt(i) === 10) { // \\n\n line++;\n column = 0;\n } else {\n column++;\n }\n }\n\n handlersChunk(chunk);\n };\n\n var handlersResult = handlers.result;\n handlers.result = function() {\n if (sourceMappingActive) {\n map.addMapping(activatedMapping);\n }\n\n return {\n css: handlersResult(),\n map: map\n };\n };\n\n return handlers;\n};\n","var List = require('../utils/list');\n\nmodule.exports = function createConvertors(walk) {\n return {\n fromPlainObject: function(ast) {\n walk(ast, {\n enter: function(node) {\n if (node.children && node.children instanceof List === false) {\n node.children = new List().fromArray(node.children);\n }\n }\n });\n\n return ast;\n },\n toPlainObject: function(ast) {\n walk(ast, {\n leave: function(node) {\n if (node.children && node.children instanceof List) {\n node.children = node.children.toArray();\n }\n }\n });\n\n return ast;\n }\n };\n};\n","'use strict';\n\nvar List = require('./list');\n\nmodule.exports = function clone(node) {\n var result = {};\n\n for (var key in node) {\n var value = node[key];\n\n if (value) {\n if (Array.isArray(value) || value instanceof List) {\n value = value.map(clone);\n } else if (value.constructor === Object) {\n value = clone(value);\n }\n }\n\n result[key] = value;\n }\n\n return result;\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar SEMICOLON = TYPE.Semicolon;\nvar LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;\n\nmodule.exports = {\n name: 'AtrulePrelude',\n structure: {\n children: [[]]\n },\n parse: function(name) {\n var children = null;\n\n if (name !== null) {\n name = name.toLowerCase();\n }\n\n this.scanner.skipSC();\n\n if (this.atrule.hasOwnProperty(name) &&\n typeof this.atrule[name].prelude === 'function') {\n // custom consumer\n children = this.atrule[name].prelude.call(this);\n } else {\n // default consumer\n children = this.readSequence(this.scope.AtrulePrelude);\n }\n\n this.scanner.skipSC();\n\n if (this.scanner.eof !== true &&\n this.scanner.tokenType !== LEFTCURLYBRACKET &&\n this.scanner.tokenType !== SEMICOLON) {\n this.scanner.error('Semicolon or block is expected');\n }\n\n if (children === null) {\n children = this.createList();\n }\n\n return {\n type: 'AtrulePrelude',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(node) {\n this.children(node);\n },\n walkContext: 'atrulePrelude'\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;\n\nmodule.exports = {\n name: 'Brackets',\n structure: {\n children: [[]]\n },\n parse: function(readSequence, recognizer) {\n var start = this.scanner.tokenStart;\n var children = null;\n\n this.scanner.eat(LEFTSQUAREBRACKET);\n\n children = readSequence.call(this, recognizer);\n\n if (!this.scanner.eof) {\n this.scanner.eat(RIGHTSQUAREBRACKET);\n }\n\n return {\n type: 'Brackets',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(node) {\n this.chunk('[');\n this.children(node);\n this.chunk(']');\n }\n};\n","var CDC = require('../../tokenizer').TYPE.CDC;\n\nmodule.exports = {\n name: 'CDC',\n structure: [],\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.eat(CDC); // -->\n\n return {\n type: 'CDC',\n loc: this.getLocation(start, this.scanner.tokenStart)\n };\n },\n generate: function() {\n this.chunk('-->');\n }\n};\n","var CDO = require('../../tokenizer').TYPE.CDO;\n\nmodule.exports = {\n name: 'CDO',\n structure: [],\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.eat(CDO); // <!--\n\n return {\n type: 'CDO',\n loc: this.getLocation(start, this.scanner.tokenStart)\n };\n },\n generate: function() {\n this.chunk('<!--');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar IDENTIFIER = TYPE.Identifier;\nvar FULLSTOP = TYPE.FullStop;\n\n// '.' ident\nmodule.exports = {\n name: 'ClassSelector',\n structure: {\n name: String\n },\n parse: function() {\n this.scanner.eat(FULLSTOP);\n\n return {\n type: 'ClassSelector',\n loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),\n name: this.scanner.consume(IDENTIFIER)\n };\n },\n generate: function(node) {\n this.chunk('.');\n this.chunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar PLUSSIGN = TYPE.PlusSign;\nvar SOLIDUS = TYPE.Solidus;\nvar GREATERTHANSIGN = TYPE.GreaterThanSign;\nvar TILDE = TYPE.Tilde;\n\n// + | > | ~ | /deep/\nmodule.exports = {\n name: 'Combinator',\n structure: {\n name: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n switch (this.scanner.tokenType) {\n case GREATERTHANSIGN:\n case PLUSSIGN:\n case TILDE:\n this.scanner.next();\n break;\n\n case SOLIDUS:\n this.scanner.next();\n this.scanner.expectIdentifier('deep');\n this.scanner.eat(SOLIDUS);\n break;\n\n default:\n this.scanner.error('Combinator is expected');\n }\n\n return {\n type: 'Combinator',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(start)\n };\n },\n generate: function(node) {\n this.chunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar ASTERISK = TYPE.Asterisk;\nvar SOLIDUS = TYPE.Solidus;\n\n// '/*' .* '*/'\nmodule.exports = {\n name: 'Comment',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var end = this.scanner.tokenEnd;\n\n if ((end - start + 2) >= 2 &&\n this.scanner.source.charCodeAt(end - 2) === ASTERISK &&\n this.scanner.source.charCodeAt(end - 1) === SOLIDUS) {\n end -= 2;\n }\n\n this.scanner.next();\n\n return {\n type: 'Comment',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.source.substring(start + 2, end)\n };\n },\n generate: function(node) {\n this.chunk('/*');\n this.chunk(node.value);\n this.chunk('*/');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// <function-token> <sequence> ')'\nmodule.exports = {\n name: 'Function',\n structure: {\n name: String,\n children: [[]]\n },\n parse: function(readSequence, recognizer) {\n var start = this.scanner.tokenStart;\n var name = this.scanner.consumeFunctionName();\n var nameLowerCase = name.toLowerCase();\n var children;\n\n children = recognizer.hasOwnProperty(nameLowerCase)\n ? recognizer[nameLowerCase].call(this, recognizer)\n : readSequence.call(this, recognizer);\n\n if (!this.scanner.eof) {\n this.scanner.eat(RIGHTPARENTHESIS);\n }\n\n return {\n type: 'Function',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n children: children\n };\n },\n generate: function(node) {\n this.chunk(node.name);\n this.chunk('(');\n this.children(node);\n this.chunk(')');\n },\n walkContext: 'function'\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar IDENTIFIER = TYPE.Identifier;\n\nmodule.exports = {\n name: 'Identifier',\n structure: {\n name: String\n },\n parse: function() {\n return {\n type: 'Identifier',\n loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n name: this.scanner.consume(IDENTIFIER)\n };\n },\n generate: function(node) {\n this.chunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBERSIGN = TYPE.NumberSign;\n\n// '#' ident\nmodule.exports = {\n name: 'IdSelector',\n structure: {\n name: String\n },\n parse: function() {\n this.scanner.eat(NUMBERSIGN);\n\n return {\n type: 'IdSelector',\n loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),\n name: this.scanner.consume(IDENTIFIER)\n };\n },\n generate: function(node) {\n this.chunk('#');\n this.chunk(node.name);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\nvar COLON = TYPE.Colon;\nvar SOLIDUS = TYPE.Solidus;\n\nmodule.exports = {\n name: 'MediaFeature',\n structure: {\n name: String,\n value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var name;\n var value = null;\n\n this.scanner.eat(LEFTPARENTHESIS);\n this.scanner.skipSC();\n\n name = this.scanner.consume(IDENTIFIER);\n this.scanner.skipSC();\n\n if (this.scanner.tokenType !== RIGHTPARENTHESIS) {\n this.scanner.eat(COLON);\n this.scanner.skipSC();\n\n switch (this.scanner.tokenType) {\n case NUMBER:\n if (this.scanner.lookupType(1) === IDENTIFIER) {\n value = this.Dimension();\n } else if (this.scanner.lookupNonWSType(1) === SOLIDUS) {\n value = this.Ratio();\n } else {\n value = this.Number();\n }\n\n break;\n\n case IDENTIFIER:\n value = this.Identifier();\n\n break;\n\n default:\n this.scanner.error('Number, dimension, ratio or identifier is expected');\n }\n\n this.scanner.skipSC();\n }\n\n this.scanner.eat(RIGHTPARENTHESIS);\n\n return {\n type: 'MediaFeature',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n value: value\n };\n },\n generate: function(node) {\n this.chunk('(');\n this.chunk(node.name);\n if (node.value !== null) {\n this.chunk(':');\n this.node(node.value);\n }\n this.chunk(')');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar WHITESPACE = TYPE.WhiteSpace;\nvar COMMENT = TYPE.Comment;\nvar IDENTIFIER = TYPE.Identifier;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\n\nmodule.exports = {\n name: 'MediaQuery',\n structure: {\n children: [[\n 'Identifier',\n 'MediaFeature',\n 'WhiteSpace'\n ]]\n },\n parse: function() {\n this.scanner.skipSC();\n\n var children = this.createList();\n var child = null;\n var space = null;\n\n scan:\n while (!this.scanner.eof) {\n switch (this.scanner.tokenType) {\n case COMMENT:\n this.scanner.next();\n continue;\n\n case WHITESPACE:\n space = this.WhiteSpace();\n continue;\n\n case IDENTIFIER:\n child = this.Identifier();\n break;\n\n case LEFTPARENTHESIS:\n child = this.MediaFeature();\n break;\n\n default:\n break scan;\n }\n\n if (space !== null) {\n children.push(space);\n space = null;\n }\n\n children.push(child);\n }\n\n if (child === null) {\n this.scanner.error('Identifier or parenthesis is expected');\n }\n\n return {\n type: 'MediaQuery',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(node) {\n this.children(node);\n }\n};\n","var COMMA = require('../../tokenizer').TYPE.Comma;\n\nmodule.exports = {\n name: 'MediaQueryList',\n structure: {\n children: [[\n 'MediaQuery'\n ]]\n },\n parse: function(relative) {\n var children = this.createList();\n\n this.scanner.skipSC();\n\n while (!this.scanner.eof) {\n children.push(this.MediaQuery(relative));\n\n if (this.scanner.tokenType !== COMMA) {\n break;\n }\n\n this.scanner.next();\n }\n\n return {\n type: 'MediaQueryList',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(node) {\n this.children(node, function() {\n this.chunk(',');\n });\n }\n};\n","var NUMBER = require('../../tokenizer').TYPE.Number;\n\nmodule.exports = {\n name: 'Number',\n structure: {\n value: String\n },\n parse: function() {\n return {\n type: 'Number',\n loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n value: this.scanner.consume(NUMBER)\n };\n },\n generate: function(node) {\n this.chunk(node.value);\n }\n};\n","// '/' | '*' | ',' | ':' | '+' | '-'\nmodule.exports = {\n name: 'Operator',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n\n this.scanner.next();\n\n return {\n type: 'Operator',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: this.scanner.substrToCursor(start)\n };\n },\n generate: function(node) {\n this.chunk(node.value);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\nmodule.exports = {\n name: 'Parentheses',\n structure: {\n children: [[]]\n },\n parse: function(readSequence, recognizer) {\n var start = this.scanner.tokenStart;\n var children = null;\n\n this.scanner.eat(LEFTPARENTHESIS);\n\n children = readSequence.call(this, recognizer);\n\n if (!this.scanner.eof) {\n this.scanner.eat(RIGHTPARENTHESIS);\n }\n\n return {\n type: 'Parentheses',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(node) {\n this.chunk('(');\n this.children(node);\n this.chunk(')');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar NUMBER = TYPE.Number;\nvar PERCENTSIGN = TYPE.PercentSign;\n\nmodule.exports = {\n name: 'Percentage',\n structure: {\n value: String\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var number = this.scanner.consume(NUMBER);\n\n this.scanner.eat(PERCENTSIGN);\n\n return {\n type: 'Percentage',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: number\n };\n },\n generate: function(node) {\n this.chunk(node.value);\n this.chunk('%');\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar FUNCTION = TYPE.Function;\nvar COLON = TYPE.Colon;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// : ident [ '(' .. ')' ]?\nmodule.exports = {\n name: 'PseudoClassSelector',\n structure: {\n name: String,\n children: [['Raw'], null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var children = null;\n var name;\n var nameLowerCase;\n\n this.scanner.eat(COLON);\n\n if (this.scanner.tokenType === FUNCTION) {\n name = this.scanner.consumeFunctionName();\n nameLowerCase = name.toLowerCase();\n\n if (this.pseudo.hasOwnProperty(nameLowerCase)) {\n this.scanner.skipSC();\n children = this.pseudo[nameLowerCase].call(this);\n this.scanner.skipSC();\n } else {\n children = this.createList();\n children.push(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n }\n\n this.scanner.eat(RIGHTPARENTHESIS);\n } else {\n name = this.scanner.consume(IDENTIFIER);\n }\n\n return {\n type: 'PseudoClassSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n children: children\n };\n },\n generate: function(node) {\n this.chunk(':');\n this.chunk(node.name);\n\n if (node.children !== null) {\n this.chunk('(');\n this.children(node);\n this.chunk(')');\n }\n },\n walkContext: 'function'\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar FUNCTION = TYPE.Function;\nvar COLON = TYPE.Colon;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// :: ident [ '(' .. ')' ]?\nmodule.exports = {\n name: 'PseudoElementSelector',\n structure: {\n name: String,\n children: [['Raw'], null]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var children = null;\n var name;\n var nameLowerCase;\n\n this.scanner.eat(COLON);\n this.scanner.eat(COLON);\n\n if (this.scanner.tokenType === FUNCTION) {\n name = this.scanner.consumeFunctionName();\n nameLowerCase = name.toLowerCase();\n\n if (this.pseudo.hasOwnProperty(nameLowerCase)) {\n this.scanner.skipSC();\n children = this.pseudo[nameLowerCase].call(this);\n this.scanner.skipSC();\n } else {\n children = this.createList();\n children.push(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n }\n\n this.scanner.eat(RIGHTPARENTHESIS);\n } else {\n name = this.scanner.consume(IDENTIFIER);\n }\n\n return {\n type: 'PseudoElementSelector',\n loc: this.getLocation(start, this.scanner.tokenStart),\n name: name,\n children: children\n };\n },\n generate: function(node) {\n this.chunk('::');\n this.chunk(node.name);\n\n if (node.children !== null) {\n this.chunk('(');\n this.children(node);\n this.chunk(')');\n }\n },\n walkContext: 'function'\n};\n","module.exports = {\n name: 'Raw',\n structure: {\n value: String\n },\n parse: function(startToken, endTokenType1, endTokenType2, includeTokenType2, excludeWhiteSpace) {\n var startOffset = this.scanner.getTokenStart(startToken);\n var endOffset;\n\n this.scanner.skip(\n this.scanner.getRawLength(\n startToken,\n endTokenType1,\n endTokenType2,\n includeTokenType2\n )\n );\n\n if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {\n endOffset = this.scanner.getOffsetExcludeWS();\n } else {\n endOffset = this.scanner.tokenStart;\n }\n\n return {\n type: 'Raw',\n loc: this.getLocation(startOffset, endOffset),\n value: this.scanner.source.substring(startOffset, endOffset)\n };\n },\n generate: function(node) {\n this.chunk(node.value);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar COMMA = TYPE.Comma;\n\nmodule.exports = {\n name: 'SelectorList',\n structure: {\n children: [[\n 'Selector',\n 'Raw'\n ]]\n },\n parse: function() {\n var children = this.createList();\n\n while (!this.scanner.eof) {\n children.push(this.Selector());\n\n if (this.scanner.tokenType === COMMA) {\n this.scanner.next();\n continue;\n }\n\n break;\n }\n\n return {\n type: 'SelectorList',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(node) {\n this.children(node, function() {\n this.chunk(',');\n });\n },\n walkContext: 'selector'\n};\n","var STRING = require('../../tokenizer').TYPE.String;\n\nmodule.exports = {\n name: 'String',\n structure: {\n value: String\n },\n parse: function() {\n return {\n type: 'String',\n loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n value: this.scanner.consume(STRING)\n };\n },\n generate: function(node) {\n this.chunk(node.value);\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar STRING = TYPE.String;\nvar URL = TYPE.Url;\nvar RAW = TYPE.Raw;\nvar RIGHTPARENTHESIS = TYPE.RightParenthesis;\n\n// url '(' S* (string | raw) S* ')'\nmodule.exports = {\n name: 'Url',\n structure: {\n value: ['String', 'Raw']\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var value;\n\n this.scanner.eat(URL);\n this.scanner.skipSC();\n\n switch (this.scanner.tokenType) {\n case STRING:\n value = this.String();\n break;\n\n case RAW:\n value = this.Raw(this.scanner.currentToken, 0, RAW, true, false);\n break;\n\n default:\n this.scanner.error('String or Raw is expected');\n }\n\n this.scanner.skipSC();\n this.scanner.eat(RIGHTPARENTHESIS);\n\n return {\n type: 'Url',\n loc: this.getLocation(start, this.scanner.tokenStart),\n value: value\n };\n },\n generate: function(node) {\n this.chunk('url');\n this.chunk('(');\n this.node(node.value);\n this.chunk(')');\n }\n};\n","var WHITESPACE = require('../../tokenizer').TYPE.WhiteSpace;\nvar SPACE = Object.freeze({\n type: 'WhiteSpace',\n loc: null,\n value: ' '\n});\n\nmodule.exports = {\n name: 'WhiteSpace',\n structure: {\n value: String\n },\n parse: function() {\n this.scanner.eat(WHITESPACE);\n return SPACE;\n\n // return {\n // type: 'WhiteSpace',\n // loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),\n // value: this.scanner.consume(WHITESPACE)\n // };\n },\n generate: function(node) {\n this.chunk(node.value);\n }\n};\n","module.exports = {\n AnPlusB: require('./AnPlusB'),\n Atrule: require('./Atrule'),\n AtrulePrelude: require('./AtrulePrelude'),\n AttributeSelector: require('./AttributeSelector'),\n Block: require('./Block'),\n Brackets: require('./Brackets'),\n CDC: require('./CDC'),\n CDO: require('./CDO'),\n ClassSelector: require('./ClassSelector'),\n Combinator: require('./Combinator'),\n Comment: require('./Comment'),\n Declaration: require('./Declaration'),\n DeclarationList: require('./DeclarationList'),\n Dimension: require('./Dimension'),\n Function: require('./Function'),\n HexColor: require('./HexColor'),\n Identifier: require('./Identifier'),\n IdSelector: require('./IdSelector'),\n MediaFeature: require('./MediaFeature'),\n MediaQuery: require('./MediaQuery'),\n MediaQueryList: require('./MediaQueryList'),\n Nth: require('./Nth'),\n Number: require('./Number'),\n Operator: require('./Operator'),\n Parentheses: require('./Parentheses'),\n Percentage: require('./Percentage'),\n PseudoClassSelector: require('./PseudoClassSelector'),\n PseudoElementSelector: require('./PseudoElementSelector'),\n Ratio: require('./Ratio'),\n Raw: require('./Raw'),\n Rule: require('./Rule'),\n Selector: require('./Selector'),\n SelectorList: require('./SelectorList'),\n String: require('./String'),\n StyleSheet: require('./StyleSheet'),\n TypeSelector: require('./TypeSelector'),\n UnicodeRange: require('./UnicodeRange'),\n Url: require('./Url'),\n Value: require('./Value'),\n WhiteSpace: require('./WhiteSpace')\n};\n","// https://drafts.csswg.org/css-syntax-3/#the-anb-type\nmodule.exports = {\n name: 'Nth',\n structure: {\n nth: ['AnPlusB', 'Identifier'],\n selector: ['SelectorList', null]\n },\n parse: function(allowOfClause) {\n this.scanner.skipSC();\n\n var start = this.scanner.tokenStart;\n var end = start;\n var selector = null;\n var query;\n\n if (this.scanner.lookupValue(0, 'odd') || this.scanner.lookupValue(0, 'even')) {\n query = this.Identifier();\n } else {\n query = this.AnPlusB();\n }\n\n this.scanner.skipSC();\n\n if (allowOfClause && this.scanner.lookupValue(0, 'of')) {\n this.scanner.next();\n\n selector = this.SelectorList();\n\n if (this.needPositions) {\n end = this.getLastListNode(selector.children).loc.end.offset;\n }\n } else {\n if (this.needPositions) {\n end = query.loc.end.offset;\n }\n }\n\n return {\n type: 'Nth',\n loc: this.getLocation(start, end),\n nth: query,\n selector: selector\n };\n },\n generate: function(node) {\n this.node(node.nth);\n if (node.selector !== null) {\n this.chunk(' of ');\n this.node(node.selector);\n }\n }\n};\n","module.exports = {\n name: 'Selector',\n structure: {\n children: [[\n 'TypeSelector',\n 'IdSelector',\n 'ClassSelector',\n 'AttributeSelector',\n 'PseudoClassSelector',\n 'PseudoElementSelector',\n 'Combinator',\n 'WhiteSpace'\n ]]\n },\n parse: function() {\n var children = this.readSequence(this.scope.Selector);\n\n // nothing were consumed\n if (this.getFirstListNode(children) === null) {\n this.scanner.error('Selector is expected');\n }\n\n return {\n type: 'Selector',\n loc: this.getLocationFromList(children),\n children: children\n };\n },\n generate: function(node) {\n this.children(node);\n }\n};\n","module.exports = {\n name: 'Value',\n structure: {\n children: [[]]\n },\n parse: function() {\n var start = this.scanner.tokenStart;\n var children = this.readSequence(this.scope.Value);\n\n return {\n type: 'Value',\n loc: this.getLocation(start, this.scanner.tokenStart),\n children: children\n };\n },\n generate: function(node) {\n this.children(node);\n }\n};\n","var data = require('../../../data');\n\nmodule.exports = {\n generic: true,\n types: data.types,\n properties: data.properties,\n node: require('../node')\n};\n","var cmpChar = require('../../tokenizer').cmpChar;\nvar TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar STRING = TYPE.String;\nvar NUMBER = TYPE.Number;\nvar FUNCTION = TYPE.Function;\nvar URL = TYPE.Url;\nvar NUMBERSIGN = TYPE.NumberSign;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar PLUSSIGN = TYPE.PlusSign;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar COMMA = TYPE.Comma;\nvar SOLIDUS = TYPE.Solidus;\nvar ASTERISK = TYPE.Asterisk;\nvar PERCENTSIGN = TYPE.PercentSign;\nvar BACKSLASH = TYPE.Backslash;\nvar U = 117; // 'u'.charCodeAt(0)\n\nmodule.exports = function defaultRecognizer(context) {\n switch (this.scanner.tokenType) {\n case NUMBERSIGN:\n return this.HexColor();\n\n case COMMA:\n context.space = null;\n context.ignoreWSAfter = true;\n return this.Operator();\n\n case SOLIDUS:\n case ASTERISK:\n case PLUSSIGN:\n case HYPHENMINUS:\n return this.Operator();\n\n case LEFTPARENTHESIS:\n return this.Parentheses(this.readSequence, context.recognizer);\n\n case LEFTSQUAREBRACKET:\n return this.Brackets(this.readSequence, context.recognizer);\n\n case STRING:\n return this.String();\n\n case NUMBER:\n switch (this.scanner.lookupType(1)) {\n case PERCENTSIGN:\n return this.Percentage();\n\n case IDENTIFIER:\n // edge case: number with folowing \\0 and \\9 hack shouldn't to be a Dimension\n if (cmpChar(this.scanner.source, this.scanner.tokenEnd, BACKSLASH)) {\n return this.Number();\n } else {\n return this.Dimension();\n }\n\n default:\n return this.Number();\n }\n\n case FUNCTION:\n return this.Function(this.readSequence, context.recognizer);\n\n case URL:\n return this.Url();\n\n case IDENTIFIER:\n // check for unicode range, it should start with u+ or U+\n if (cmpChar(this.scanner.source, this.scanner.tokenStart, U) &&\n cmpChar(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN)) {\n return this.UnicodeRange();\n } else {\n return this.Identifier();\n }\n }\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar NUMBER = TYPE.Number;\nvar NUMBERSIGN = TYPE.NumberSign;\nvar LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;\nvar PLUSSIGN = TYPE.PlusSign;\nvar SOLIDUS = TYPE.Solidus;\nvar ASTERISK = TYPE.Asterisk;\nvar FULLSTOP = TYPE.FullStop;\nvar COLON = TYPE.Colon;\nvar GREATERTHANSIGN = TYPE.GreaterThanSign;\nvar VERTICALLINE = TYPE.VerticalLine;\nvar TILDE = TYPE.Tilde;\n\nfunction getNode(context) {\n switch (this.scanner.tokenType) {\n case PLUSSIGN:\n case GREATERTHANSIGN:\n case TILDE:\n context.space = null;\n context.ignoreWSAfter = true;\n return this.Combinator();\n\n case SOLIDUS: // /deep/\n return this.Combinator();\n\n case FULLSTOP:\n return this.ClassSelector();\n\n case LEFTSQUAREBRACKET:\n return this.AttributeSelector();\n\n case NUMBERSIGN:\n return this.IdSelector();\n\n case COLON:\n if (this.scanner.lookupType(1) === COLON) {\n return this.PseudoElementSelector();\n } else {\n return this.PseudoClassSelector();\n }\n\n case IDENTIFIER:\n case ASTERISK:\n case VERTICALLINE:\n return this.TypeSelector();\n\n case NUMBER:\n return this.Percentage();\n }\n};\n\nmodule.exports = {\n getNode: getNode\n};\n","// https://drafts.csswg.org/css-images-4/#element-notation\n// https://developer.mozilla.org/en-US/docs/Web/CSS/element\nmodule.exports = function() {\n this.scanner.skipSC();\n\n var children = this.createSingleNodeList(\n this.IdSelector()\n );\n\n this.scanner.skipSC();\n\n return children;\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar IDENTIFIER = TYPE.Identifier;\nvar COMMA = TYPE.Comma;\nvar SEMICOLON = TYPE.Semicolon;\nvar HYPHENMINUS = TYPE.HyphenMinus;\nvar EXCLAMATIONMARK = TYPE.ExclamationMark;\n\n// var '(' ident (',' <value>? )? ')'\nmodule.exports = function() {\n var children = this.createList();\n\n this.scanner.skipSC();\n\n var identStart = this.scanner.tokenStart;\n\n this.scanner.eat(HYPHENMINUS);\n if (this.scanner.source.charCodeAt(this.scanner.tokenStart) !== HYPHENMINUS) {\n this.scanner.error('HyphenMinus is expected');\n }\n this.scanner.eat(IDENTIFIER);\n\n children.push({\n type: 'Identifier',\n loc: this.getLocation(identStart, this.scanner.tokenStart),\n name: this.scanner.substrToCursor(identStart)\n });\n\n this.scanner.skipSC();\n\n if (this.scanner.tokenType === COMMA) {\n children.push(this.Operator());\n children.push(this.parseCustomProperty\n ? this.Value(null)\n : this.Raw(this.scanner.currentToken, EXCLAMATIONMARK, SEMICOLON, false, false)\n );\n }\n\n return children;\n};\n","var TYPE = require('../../tokenizer').TYPE;\n\nvar STRING = TYPE.String;\nvar IDENTIFIER = TYPE.Identifier;\nvar URL = TYPE.Url;\nvar LEFTPARENTHESIS = TYPE.LeftParenthesis;\n\nmodule.exports = {\n parse: {\n prelude: function() {\n var children = this.createList();\n\n this.scanner.skipSC();\n\n switch (this.scanner.tokenType) {\n case STRING:\n children.push(this.String());\n break;\n\n case URL:\n children.push(this.Url());\n break;\n\n default:\n this.scanner.error('String or url() is expected');\n }\n\n if (this.scanner.lookupNonWSType(0) === IDENTIFIER ||\n this.scanner.lookupNonWSType(0) === LEFTPARENTHESIS) {\n children.push(this.WhiteSpace());\n children.push(this.MediaQueryList());\n }\n\n return children;\n },\n block: null\n }\n};\n","module.exports = {\n parse: function selectorList() {\n return this.createSingleNodeList(\n this.SelectorList()\n );\n }\n};\n","var ALLOW_OF_CLAUSE = true;\n\nmodule.exports = {\n parse: function nthWithOfClause() {\n return this.createSingleNodeList(\n this.Nth(ALLOW_OF_CLAUSE)\n );\n }\n};\n","var DISALLOW_OF_CLAUSE = false;\n\nmodule.exports = {\n parse: function nth() {\n return this.createSingleNodeList(\n this.Nth(DISALLOW_OF_CLAUSE)\n );\n }\n};\n","function merge() {\n var dest = {};\n\n for (var i = 0; i < arguments.length; i++) {\n var src = arguments[i];\n for (var key in src) {\n dest[key] = src[key];\n }\n }\n\n return dest;\n}\n\nmodule.exports = require('./create').create(\n merge(\n require('./config/lexer'),\n require('./config/parser'),\n require('./config/walker')\n )\n);\n","module.exports = {\n parseContext: {\n default: 'StyleSheet',\n stylesheet: 'StyleSheet',\n atrule: 'Atrule',\n atrulePrelude: function(options) {\n return this.AtrulePrelude(options.atrule ? String(options.atrule) : null);\n },\n mediaQueryList: 'MediaQueryList',\n mediaQuery: 'MediaQuery',\n rule: 'Rule',\n selectorList: 'SelectorList',\n selector: 'Selector',\n block: function() {\n return this.Block(true);\n },\n declarationList: 'DeclarationList',\n declaration: 'Declaration',\n value: 'Value'\n },\n scope: require('../scope'),\n atrule: require('../atrule'),\n pseudo: require('../pseudo'),\n node: require('../node')\n};\n","module.exports = {\n AtrulePrelude: require('./atrulePrelude'),\n Selector: require('./selector'),\n Value: require('./value')\n};\n","module.exports = {\n getNode: require('./default')\n};\n","module.exports = {\n getNode: require('./default'),\n '-moz-element': require('../function/element'),\n 'element': require('../function/element'),\n 'expression': require('../function/expression'),\n 'var': require('../function/var')\n};\n","// legacy IE function\n// expression '(' raw ')'\nmodule.exports = function() {\n return this.createSingleNodeList(\n this.Raw(this.scanner.currentToken, 0, 0, false, false)\n );\n};\n","module.exports = {\n 'font-face': require('./font-face'),\n 'import': require('./import'),\n 'media': require('./media'),\n 'page': require('./page'),\n 'supports': require('./supports')\n};\n","module.exports = {\n parse: {\n prelude: null,\n block: function() {\n return this.Block(true);\n }\n }\n};\n","module.exports = {\n parse: {\n prelude: function() {\n return this.createSingleNodeList(\n this.MediaQueryList()\n );\n },\n block: function() {\n return this.Block(false);\n }\n }\n};\n","module.exports = {\n parse: {\n prelude: function() {\n return this.createSingleNodeList(\n this.SelectorList()\n );\n },\n block: function() {\n return this.Block(true);\n }\n }\n};\n","module.exports = {\n 'dir': require('./dir'),\n 'has': require('./has'),\n 'lang': require('./lang'),\n 'matches': require('./matches'),\n 'not': require('./not'),\n 'nth-child': require('./nth-child'),\n 'nth-last-child': require('./nth-last-child'),\n 'nth-last-of-type': require('./nth-last-of-type'),\n 'nth-of-type': require('./nth-of-type'),\n 'slotted': require('./slotted')\n};\n","module.exports = {\n parse: function() {\n return this.createSingleNodeList(\n this.Identifier()\n );\n }\n};\n","module.exports = {\n parse: function() {\n return this.createSingleNodeList(\n this.SelectorList()\n );\n }\n};\n","module.exports = {\n parse: function() {\n return this.createSingleNodeList(\n this.Identifier()\n );\n }\n};\n","module.exports = {\n parse: function compoundSelector() {\n return this.createSingleNodeList(\n this.Selector()\n );\n }\n};\n","module.exports = {\n node: require('../node')\n};\n","var resolveKeyword = require('css-tree').keyword;\n\nmodule.exports = function cleanAtrule(node, item, list) {\n if (node.block) {\n // otherwise removed at-rule don't prevent @import for removal\n if (this.stylesheet !== null) {\n this.stylesheet.firstAtrulesAllowed = false;\n }\n\n if (node.block.children.isEmpty()) {\n list.remove(item);\n return;\n }\n }\n\n switch (node.name) {\n case 'charset':\n if (!node.prelude || node.prelude.children.isEmpty()) {\n list.remove(item);\n return;\n }\n\n // if there is any rule before @charset -> remove it\n if (item.prev) {\n list.remove(item);\n return;\n }\n\n break;\n\n case 'import':\n if (this.stylesheet === null || !this.stylesheet.firstAtrulesAllowed) {\n list.remove(item);\n return;\n }\n\n // if there are some rules that not an @import or @charset before @import\n // remove it\n list.prevUntil(item.prev, function(rule) {\n if (rule.type === 'Atrule') {\n if (rule.name === 'import' || rule.name === 'charset') {\n return;\n }\n }\n\n this.root.firstAtrulesAllowed = false;\n list.remove(item);\n return true;\n }, this);\n\n break;\n\n default:\n var name = resolveKeyword(node.name).basename;\n if (name === 'keyframes' ||\n name === 'media' ||\n name === 'supports') {\n\n // drop at-rule with no prelude\n if (!node.prelude || node.prelude.children.isEmpty()) {\n list.remove(item);\n }\n }\n }\n};\n","var walk = require('css-tree').walk;\nvar handlers = {\n Atrule: require('./Atrule'),\n Rule: require('./Rule'),\n Declaration: require('./Declaration'),\n TypeSelector: require('./TypeSelector'),\n Comment: require('./Comment'),\n Operator: require('./Operator'),\n WhiteSpace: require('./WhiteSpace')\n};\n\nmodule.exports = function(ast, options) {\n walk(ast, {\n leave: function(node, item, list) {\n if (handlers.hasOwnProperty(node.type)) {\n handlers[node.type].call(this, node, item, list, options);\n }\n }\n });\n};\n","module.exports = function cleanDeclartion(node, item, list) {\n if (node.value.children && node.value.children.isEmpty()) {\n list.remove(item);\n }\n};\n","// remove useless universal selector\nmodule.exports = function cleanType(node, item, list) {\n var name = item.data.name;\n\n // check it's a non-namespaced universal selector\n if (name !== '*') {\n return;\n }\n\n // remove when universal selector before other selectors\n var nextType = item.next && item.next.data.type;\n if (nextType === 'IdSelector' ||\n nextType === 'ClassSelector' ||\n nextType === 'AttributeSelector' ||\n nextType === 'PseudoClassSelector' ||\n nextType === 'PseudoElementSelector') {\n list.remove(item);\n }\n};\n","module.exports = function cleanComment(data, item, list) {\n list.remove(item);\n};\n","// remove white spaces around operators when safe\nmodule.exports = function cleanWhitespace(node, item, list) {\n if (node.value === '+' || node.value === '-') {\n return;\n }\n\n if (item.prev !== null && item.prev.data.type === 'WhiteSpace') {\n list.remove(item.prev);\n }\n\n if (item.next !== null && item.next.data.type === 'WhiteSpace') {\n list.remove(item.next);\n }\n};\n","module.exports = function cleanWhitespace(node, item, list) {\n // remove when first or last item in sequence\n if (item.next === null || item.prev === null) {\n list.remove(item);\n return;\n }\n\n // remove when previous node is whitespace\n if (item.prev.data.type === 'WhiteSpace') {\n list.remove(item);\n return;\n }\n\n if ((this.stylesheet !== null && this.stylesheet.children === list) ||\n (this.block !== null && this.block.children === list)) {\n list.remove(item);\n return;\n }\n};\n","module.exports = function(node) {\n node.block.children.each(function(rule) {\n rule.prelude.children.each(function(simpleselector) {\n simpleselector.children.each(function(data, item) {\n if (data.type === 'Percentage' && data.value === '100') {\n item.data = {\n type: 'TypeSelector',\n loc: data.loc,\n name: 'to'\n };\n } else if (data.type === 'TypeSelector' && data.name === 'from') {\n item.data = {\n type: 'Percentage',\n loc: data.loc,\n value: '0'\n };\n }\n });\n });\n });\n};\n","var resolveKeyword = require('css-tree').keyword;\nvar compressKeyframes = require('./atrule/keyframes');\n\nmodule.exports = function(node) {\n // compress @keyframe selectors\n if (resolveKeyword(node.name).basename === 'keyframes') {\n compressKeyframes(node);\n }\n};\n","var List = require('css-tree').List;\n\nmodule.exports = function compressBackground(node) {\n function lastType() {\n if (buffer.length) {\n return buffer[buffer.length - 1].type;\n }\n }\n\n function flush() {\n if (lastType() === 'WhiteSpace') {\n buffer.pop();\n }\n\n if (!buffer.length) {\n buffer.unshift(\n {\n type: 'Number',\n loc: null,\n value: '0'\n },\n {\n type: 'WhiteSpace',\n value: ' '\n },\n {\n type: 'Number',\n loc: null,\n value: '0'\n }\n );\n }\n\n newValue.push.apply(newValue, buffer);\n\n buffer = [];\n }\n\n var newValue = [];\n var buffer = [];\n\n node.children.each(function(node) {\n if (node.type === 'Operator' && node.value === ',') {\n flush();\n newValue.push(node);\n return;\n }\n\n // remove defaults\n if (node.type === 'Identifier') {\n if (node.name === 'transparent' ||\n node.name === 'none' ||\n node.name === 'repeat' ||\n node.name === 'scroll') {\n return;\n }\n }\n\n // don't add redundant spaces\n if (node.type === 'WhiteSpace' && (!buffer.length || lastType() === 'WhiteSpace')) {\n return;\n }\n\n buffer.push(node);\n });\n\n flush();\n node.children = new List().fromArray(newValue);\n};\n","var resolveName = require('css-tree').property;\nvar handlers = {\n 'font': require('./property/font'),\n 'font-weight': require('./property/font-weight'),\n 'background': require('./property/background'),\n 'border': require('./property/border'),\n 'outline': require('./property/border')\n};\n\nmodule.exports = function compressValue(node) {\n if (!this.declaration) {\n return;\n }\n\n var property = resolveName(this.declaration.property);\n\n if (handlers.hasOwnProperty(property.basename)) {\n handlers[property.basename](node);\n }\n};\n","module.exports = function compressFont(node) {\n var list = node.children;\n\n list.eachRight(function(node, item) {\n if (node.type === 'Identifier') {\n if (node.name === 'bold') {\n item.data = {\n type: 'Number',\n loc: node.loc,\n value: '700'\n };\n } else if (node.name === 'normal') {\n var prev = item.prev;\n\n if (prev && prev.data.type === 'Operator' && prev.data.value === '/') {\n this.remove(prev);\n }\n\n this.remove(item);\n } else if (node.name === 'medium') {\n var next = item.next;\n\n if (!next || next.data.type !== 'Operator') {\n this.remove(item);\n }\n }\n }\n });\n\n // remove redundant spaces\n list.each(function(node, item) {\n if (node.type === 'WhiteSpace') {\n if (!item.prev || !item.next || item.next.data.type === 'WhiteSpace') {\n this.remove(item);\n }\n }\n });\n\n if (list.isEmpty()) {\n list.insert(list.createItem({\n type: 'Identifier',\n name: 'normal'\n }));\n }\n};\n","module.exports = function compressFontWeight(node) {\n var value = node.children.head.data;\n\n if (value.type === 'Identifier') {\n switch (value.name) {\n case 'normal':\n node.children.head.data = {\n type: 'Number',\n loc: value.loc,\n value: '400'\n };\n break;\n case 'bold':\n node.children.head.data = {\n type: 'Number',\n loc: value.loc,\n value: '700'\n };\n break;\n }\n }\n};\n","var packNumber = require('./Number').pack;\nvar LENGTH_UNIT = {\n // absolute length units\n 'px': true,\n 'mm': true,\n 'cm': true,\n 'in': true,\n 'pt': true,\n 'pc': true,\n\n // relative length units\n 'em': true,\n 'ex': true,\n 'ch': true,\n 'rem': true,\n\n // viewport-percentage lengths\n 'vh': true,\n 'vw': true,\n 'vmin': true,\n 'vmax': true,\n 'vm': true\n};\n\nmodule.exports = function compressDimension(node, item) {\n var value = packNumber(node.value, item);\n\n node.value = value;\n\n if (value === '0' && this.declaration !== null && this.atrulePrelude === null) {\n var unit = node.unit.toLowerCase();\n\n // only length values can be compressed\n if (!LENGTH_UNIT.hasOwnProperty(unit)) {\n return;\n }\n\n // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11\n // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11\n if (this.declaration.property === '-ms-flex' ||\n this.declaration.property === 'flex') {\n return;\n }\n\n // issue #222: don't remove units inside calc\n if (this['function'] && this['function'].name === 'calc') {\n return;\n }\n\n item.data = {\n type: 'Number',\n loc: node.loc,\n value: value\n };\n }\n};\n","var packNumber = require('./Number').pack;\nvar PERCENTAGE_LENGTH_PROPERTY = {\n 'margin': true,\n 'margin-top': true,\n 'margin-left': true,\n 'margin-bottom': true,\n 'margin-right': true,\n\n 'padding': true,\n 'padding-top': true,\n 'padding-left': true,\n 'padding-bottom': true,\n 'padding-right': true,\n\n 'top': true,\n 'left': true,\n 'bottom': true,\n 'right': true,\n\n 'background-position': true,\n 'background-position-x': true,\n 'background-position-y': true,\n 'background-size': true,\n\n 'border': true,\n 'border-width': true,\n 'border-top-width': true,\n 'border-left-width': true,\n 'border-bottom-width': true,\n 'border-right-width': true,\n 'border-image-width': true,\n\n 'border-radius': true,\n 'border-bottom-left-radius': true,\n 'border-bottom-right-radius': true,\n 'border-top-left-radius': true,\n 'border-top-right-radius': true\n};\n\nmodule.exports = function compressPercentage(node, item) {\n var value = packNumber(node.value, item);\n var property = this.declaration !== null ? this.declaration.property : null;\n\n node.value = value;\n\n if (property !== null && PERCENTAGE_LENGTH_PROPERTY.hasOwnProperty(property)) {\n if (value === '0') {\n item.data = {\n type: 'Number',\n loc: node.loc,\n value: value\n };\n }\n }\n};\n","var UNICODE = '\\\\\\\\[0-9a-f]{1,6}(\\\\r\\\\n|[ \\\\n\\\\r\\\\t\\\\f])?';\nvar ESCAPE = '(' + UNICODE + '|\\\\\\\\[^\\\\n\\\\r\\\\f0-9a-fA-F])';\nvar NONPRINTABLE = '\\u0000\\u0008\\u000b\\u000e-\\u001f\\u007f';\nvar SAFE_URL = new RegExp('^(' + ESCAPE + '|[^\\\"\\'\\\\(\\\\)\\\\\\\\\\\\s' + NONPRINTABLE + '])*$', 'i');\n\nmodule.exports = function(node) {\n var value = node.value;\n\n if (value.type !== 'String') {\n return;\n }\n\n var quote = value.value[0];\n var url = value.value.substr(1, value.value.length - 2);\n\n // convert `\\\\` to `/`\n url = url.replace(/\\\\\\\\/g, '/');\n\n // remove quotes when safe\n // https://www.w3.org/TR/css-syntax-3/#url-unquoted-diagram\n if (SAFE_URL.test(url)) {\n node.value = {\n type: 'Raw',\n loc: node.value.loc,\n value: url\n };\n } else {\n // use double quotes if string has no double quotes\n // otherwise use original quotes\n // TODO: make better quote type selection\n node.value.value = url.indexOf('\"') === -1 ? '\"' + url + '\"' : quote + url + quote;\n }\n};\n","var walk = require('css-tree').walk;\nvar handlers = {\n Atrule: require('./Atrule'),\n AttributeSelector: require('./AttributeSelector'),\n Value: require('./Value'),\n Dimension: require('./Dimension'),\n Percentage: require('./Percentage'),\n Number: require('./Number'),\n String: require('./String'),\n Url: require('./Url'),\n HexColor: require('./color').compressHex,\n Identifier: require('./color').compressIdent,\n Function: require('./color').compressFunction\n};\n\nmodule.exports = function(ast) {\n walk(ast, {\n leave: function(node, item, list) {\n if (handlers.hasOwnProperty(node.type)) {\n handlers[node.type].call(this, node, item, list);\n }\n }\n });\n};\n","module.exports = function(node) {\n var value = node.value;\n\n // remove escaped newlines, i.e.\n // .a { content: \"foo\\\n // bar\"}\n // ->\n // .a { content: \"foobar\" }\n value = value.replace(/\\\\(\\r\\n|\\r|\\n|\\f)/g, '');\n\n node.value = value;\n};\n","var generate = require('css-tree').generate;\nvar specificity = require('./specificity');\n\nvar nonFreezePseudoElements = {\n 'first-letter': true,\n 'first-line': true,\n 'after': true,\n 'before': true\n};\nvar nonFreezePseudoClasses = {\n 'link': true,\n 'visited': true,\n 'hover': true,\n 'active': true,\n 'first-letter': true,\n 'first-line': true,\n 'after': true,\n 'before': true\n};\n\nmodule.exports = function freeze(node, usageData) {\n var pseudos = Object.create(null);\n var hasPseudo = false;\n\n node.prelude.children.each(function(simpleSelector) {\n var tagName = '*';\n var scope = 0;\n\n simpleSelector.children.each(function(node) {\n switch (node.type) {\n case 'ClassSelector':\n if (usageData && usageData.scopes) {\n var classScope = usageData.scopes[node.name] || 0;\n\n if (scope !== 0 && classScope !== scope) {\n throw new Error('Selector can\\'t has classes from different scopes: ' + generate(simpleSelector));\n }\n\n scope = classScope;\n }\n break;\n\n case 'PseudoClassSelector':\n var name = node.name.toLowerCase();\n\n if (!nonFreezePseudoClasses.hasOwnProperty(name)) {\n pseudos[name] = true;\n hasPseudo = true;\n }\n break;\n\n case 'PseudoElementSelector':\n var name = node.name.toLowerCase();\n\n if (!nonFreezePseudoElements.hasOwnProperty(name)) {\n pseudos[name] = true;\n hasPseudo = true;\n }\n break;\n\n case 'TypeSelector':\n tagName = node.name.toLowerCase();\n break;\n\n case 'AttributeSelector':\n if (node.flags) {\n pseudos['[' + node.flags.toLowerCase() + ']'] = true;\n hasPseudo = true;\n }\n break;\n\n case 'WhiteSpace':\n case 'Combinator':\n tagName = '*';\n break;\n }\n });\n\n simpleSelector.compareMarker = specificity(simpleSelector).toString();\n simpleSelector.id = null; // pre-init property to avoid multiple hidden class\n simpleSelector.id = generate(simpleSelector);\n\n if (scope) {\n simpleSelector.compareMarker += ':' + scope;\n }\n\n if (tagName !== '*') {\n simpleSelector.compareMarker += ',' + tagName;\n }\n });\n\n // add property to all rule nodes to avoid multiple hidden class\n node.pseudoSignature = hasPseudo && Object.keys(pseudos).sort().join(',');\n};\n","var resolveKeyword = require('css-tree').keyword;\nvar walk = require('css-tree').walk;\nvar generate = require('css-tree').generate;\nvar createDeclarationIndexer = require('./createDeclarationIndexer');\nvar processSelector = require('./processSelector');\n\nmodule.exports = function prepare(ast, options) {\n var markDeclaration = createDeclarationIndexer();\n\n walk(ast, {\n visit: 'Rule',\n enter: function processRule(node) {\n node.block.children.each(markDeclaration);\n processSelector(node, options.usage);\n }\n });\n\n walk(ast, {\n visit: 'Atrule',\n enter: function(node) {\n if (node.prelude) {\n node.prelude.id = null; // pre-init property to avoid multiple hidden class for generate\n node.prelude.id = generate(node.prelude);\n }\n\n // compare keyframe selectors by its values\n // NOTE: still no clarification about problems with keyframes selector grouping (issue #197)\n if (resolveKeyword(node.name).basename === 'keyframes') {\n node.block.avoidRulesMerge = true; /* probably we don't need to prevent those merges for @keyframes\n TODO: need to be checked */\n node.block.children.each(function(rule) {\n rule.prelude.children.each(function(simpleselector) {\n simpleselector.compareMarker = simpleselector.id;\n });\n });\n }\n }\n });\n\n return {\n declaration: markDeclaration\n };\n};\n","var prepare = require('./prepare/index');\nvar mergeAtrule = require('./1-mergeAtrule');\nvar initialMergeRuleset = require('./2-initialMergeRuleset');\nvar disjoinRuleset = require('./3-disjoinRuleset');\nvar restructShorthand = require('./4-restructShorthand');\nvar restructBlock = require('./6-restructBlock');\nvar mergeRuleset = require('./7-mergeRuleset');\nvar restructRuleset = require('./8-restructRuleset');\n\nmodule.exports = function(ast, options) {\n // prepare ast for restructing\n var indexer = prepare(ast, options);\n options.logger('prepare', ast);\n\n mergeAtrule(ast, options);\n options.logger('mergeAtrule', ast);\n\n initialMergeRuleset(ast);\n options.logger('initialMergeRuleset', ast);\n\n disjoinRuleset(ast);\n options.logger('disjoinRuleset', ast);\n\n restructShorthand(ast, indexer);\n options.logger('restructShorthand', ast);\n\n restructBlock(ast);\n options.logger('restructBlock', ast);\n\n mergeRuleset(ast);\n options.logger('mergeRuleset', ast);\n\n restructRuleset(ast);\n options.logger('restructRuleset', ast);\n};\n","'use strict';\n\n/**\n * Encode plain SVG data string into Data URI string.\n *\n * @param {String} str input string\n * @param {String} type Data URI type\n * @return {String} output string\n */\nexports.encodeSVGDatauri = function(str, type) {\n\n var prefix = 'data:image/svg+xml';\n\n // base64\n if (!type || type === 'base64') {\n\n prefix += ';base64,';\n\n str = prefix + new Buffer(str).toString('base64');\n\n // URI encoded\n } else if (type === 'enc') {\n\n str = prefix + ',' + encodeURIComponent(str);\n\n // unencoded\n } else if (type === 'unenc') {\n\n str = prefix + ',' + str;\n\n }\n\n return str;\n\n};\n\n/**\n * Decode SVG Data URI string into plain SVG string.\n *\n * @param {string} str input string\n * @return {String} output string\n */\nexports.decodeSVGDatauri = function(str) {\n var regexp = /data:image\\/svg\\+xml(;charset=[^;,]*)?(;base64)?,(.*)/;\n var match = regexp.exec(str);\n\n // plain string\n if (!match) return str;\n\n var data = match[3];\n\n // base64\n if (match[2]) {\n\n str = new Buffer(data, 'base64').toString('utf8');\n\n // URI encoded\n } else if (data.charAt(0) === '%') {\n\n str = decodeURIComponent(data);\n\n // unencoded\n } else if (data.charAt(0) === '<') {\n\n str = data;\n\n }\n\n return str;\n};\n\nexports.intersectArrays = function(a, b) {\n return a.filter(function(n) {\n return b.indexOf(n) > -1;\n });\n};\n\nexports.cleanupOutData = function(data, params) {\n\n var str = '',\n delimiter,\n prev;\n\n data.forEach(function(item, i) {\n\n // space delimiter by default\n delimiter = ' ';\n\n // no extra space in front of first number\n if (i === 0) {\n delimiter = '';\n }\n\n // remove floating-point numbers leading zeros\n // 0.5 → .5\n // -0.5 → -.5\n if (params.leadingZero) {\n item = removeLeadingZero(item);\n }\n\n // no extra space in front of negative number or\n // in front of a floating number if a previous number is floating too\n if (\n params.negativeExtraSpace &&\n (item < 0 ||\n (String(item).charCodeAt(0) == 46 && prev % 1 !== 0)\n )\n ) {\n delimiter = '';\n }\n\n // save prev item value\n prev = item;\n\n str += delimiter + item;\n\n });\n\n return str;\n\n};\n\n/**\n * Remove floating-point numbers leading zero.\n *\n * @example\n * 0.5 → .5\n *\n * @example\n * -0.5 → -.5\n *\n * @param {Float} num input number\n *\n * @return {String} output number as string\n */\nvar removeLeadingZero = exports.removeLeadingZero = function(num) {\n var strNum = num.toString();\n\n if (0 < num && num < 1 && strNum.charCodeAt(0) == 48) {\n strNum = strNum.slice(1);\n } else if (-1 < num && num < 0 && strNum.charCodeAt(1) == 48) {\n strNum = strNum.charAt(0) + strNum.slice(2);\n }\n\n return strNum;\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'rounds numeric values to the fixed precision, removes default px units';\n\nexports.params = {\n floatPrecision: 3,\n leadingZero: true,\n defaultPx: true,\n convertToPx: true\n};\n\nvar regNumericValues = /^([\\-+]?\\d*\\.?\\d+([eE][\\-+]?\\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/,\n removeLeadingZero = require('../lib/svgo/tools').removeLeadingZero,\n absoluteLengths = { // relative to px\n cm: 96/2.54,\n mm: 96/25.4,\n in: 96,\n pt: 4/3,\n pc: 16\n };\n\n/**\n * Round numeric values to the fixed precision,\n * remove default 'px' units.\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n if (item.isElem()) {\n\n var floatPrecision = params.floatPrecision;\n\n if (item.hasAttr('viewBox')) {\n var nums = item.attr('viewBox').value.split(/[ ,]/g);\n item.attr('viewBox').value = nums.map(function(value) {\n var num = +value;\n return isNaN(num) ? value : +num.toFixed(floatPrecision);\n }).join(' ');\n }\n\n item.eachAttr(function(attr) {\n var match = attr.value.match(regNumericValues);\n\n // if attribute value matches regNumericValues\n if (match) {\n // round it to the fixed precision\n var num = +(+match[1]).toFixed(floatPrecision),\n units = match[3] || '';\n\n // convert absolute values to pixels\n if (params.convertToPx && units && (units in absoluteLengths)) {\n var pxNum = +(absoluteLengths[units] * match[1]).toFixed(floatPrecision);\n\n if (String(pxNum).length < match[0].length) {\n num = pxNum;\n units = 'px';\n }\n }\n\n // and remove leading zero\n if (params.leadingZero) {\n num = removeLeadingZero(num);\n }\n\n // remove default 'px' units\n if (params.defaultPx && units === 'px') {\n units = '';\n }\n\n attr.value = num + units;\n }\n });\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = false;\n\nexports.description = 'rounds list of values to the fixed precision';\n\nexports.params = {\n floatPrecision: 3,\n leadingZero: true,\n defaultPx: true,\n convertToPx: true\n};\n\nvar regNumericValues = /^([\\-+]?\\d*\\.?\\d+([eE][\\-+]?\\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/,\n regSeparator = /\\s+,?\\s*|,\\s*/,\n removeLeadingZero = require('../lib/svgo/tools').removeLeadingZero,\n absoluteLengths = { // relative to px\n cm: 96/2.54,\n mm: 96/25.4,\n in: 96,\n pt: 4/3,\n pc: 16\n };\n\n/**\n * Round list of values to the fixed precision.\n *\n * @example\n * <svg viewBox=\"0 0 200.28423 200.28423\" enable-background=\"new 0 0 200.28423 200.28423\">\n * ⬇\n * <svg viewBox=\"0 0 200.284 200.284\" enable-background=\"new 0 0 200.284 200.284\">\n *\n *\n * <polygon points=\"208.250977 77.1308594 223.069336 ... \"/>\n * ⬇\n * <polygon points=\"208.251 77.131 223.069 ... \"/>\n *\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author kiyopikko\n */\nexports.fn = function(item, params) {\n\n\n if ( item.hasAttr('points') ) {\n roundValues(item.attrs.points);\n }\n\n if ( item.hasAttr('enable-background') ) {\n roundValues(item.attrs['enable-background']);\n }\n\n if ( item.hasAttr('viewBox') ) {\n roundValues(item.attrs.viewBox);\n }\n\n if ( item.hasAttr('stroke-dasharray') ) {\n roundValues(item.attrs['stroke-dasharray']);\n }\n\n if ( item.hasAttr('dx') ) {\n roundValues(item.attrs.dx);\n }\n\n if ( item.hasAttr('dy') ) {\n roundValues(item.attrs.dy);\n }\n\n if ( item.hasAttr('x') ) {\n roundValues(item.attrs.x);\n }\n\n if ( item.hasAttr('y') ) {\n roundValues(item.attrs.y);\n }\n\n\n function roundValues($prop){\n\n var num, units,\n match,\n matchNew,\n lists = $prop.value,\n listsArr = lists.split(regSeparator),\n roundedListArr = [],\n roundedList;\n\n listsArr.forEach(function(elem){\n\n match = elem.match(regNumericValues);\n matchNew = elem.match(/new/);\n\n // if attribute value matches regNumericValues\n if(match){\n\n // round it to the fixed precision\n num = +(+match[1]).toFixed(params.floatPrecision),\n units = match[3] || '';\n\n // convert absolute values to pixels\n if (params.convertToPx && units && (units in absoluteLengths)) {\n var pxNum = +(absoluteLengths[units] * match[1]).toFixed(params.floatPrecision);\n\n if (String(pxNum).length < match[0].length)\n num = pxNum,\n units = 'px';\n }\n\n // and remove leading zero\n if (params.leadingZero) {\n num = removeLeadingZero(num);\n }\n\n // remove default 'px' units\n if (params.defaultPx && units === 'px') {\n units = '';\n }\n\n roundedListArr.push(num+units);\n\n }\n // if attribute value is \"new\"(only enable-background).\n else if(matchNew){\n\n roundedListArr.push('new');\n\n }\n\n });\n\n roundedList = roundedListArr.join(' ');\n $prop.value = roundedList;\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes unknown elements content and attributes, removes attrs with default values';\n\nexports.params = {\n unknownContent: true,\n unknownAttrs: true,\n defaultAttrs: true,\n uselessOverrides: true,\n keepDataAttrs: true,\n keepAriaAttrs: true\n};\n\nvar collections = require('./_collections'),\n elems = collections.elems,\n attrsGroups = collections.attrsGroups,\n elemsGroups = collections.elemsGroups,\n attrsGroupsDefaults = collections.attrsGroupsDefaults,\n attrsInheritable = collections.inheritableAttrs;\n\n// collect and extend all references\nfor (var elem in elems) {\n elem = elems[elem];\n\n if (elem.attrsGroups) {\n elem.attrs = elem.attrs || [];\n\n elem.attrsGroups.forEach(function(attrsGroupName) {\n elem.attrs = elem.attrs.concat(attrsGroups[attrsGroupName]);\n\n var groupDefaults = attrsGroupsDefaults[attrsGroupName];\n\n if (groupDefaults) {\n elem.defaults = elem.defaults || {};\n\n for (var attrName in groupDefaults) {\n elem.defaults[attrName] = groupDefaults[attrName];\n }\n }\n });\n\n }\n\n if (elem.contentGroups) {\n elem.content = elem.content || [];\n\n elem.contentGroups.forEach(function(contentGroupName) {\n elem.content = elem.content.concat(elemsGroups[contentGroupName]);\n });\n }\n}\n\n/**\n * Remove unknown elements content and attributes,\n * remove attributes with default values.\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n // elems w/o namespace prefix\n if (item.isElem() && !item.prefix) {\n\n var elem = item.elem;\n\n // remove unknown element's content\n if (\n params.unknownContent &&\n !item.isEmpty() &&\n elems[elem] && // make sure we know of this element before checking its children\n elem !== 'foreignObject' // Don't check foreignObject\n ) {\n item.content.forEach(function(content, i) {\n if (\n content.isElem() &&\n !content.prefix &&\n (\n (\n elems[elem].content && // Do we have a record of its permitted content?\n elems[elem].content.indexOf(content.elem) === -1\n ) ||\n (\n !elems[elem].content && // we dont know about its permitted content\n !elems[content.elem] // check that we know about the element at all\n )\n )\n ) {\n item.content.splice(i, 1);\n }\n });\n }\n\n // remove element's unknown attrs and attrs with default values\n if (elems[elem] && elems[elem].attrs) {\n\n item.eachAttr(function(attr) {\n\n if (\n attr.name !== 'xmlns' &&\n (attr.prefix === 'xml' || !attr.prefix) &&\n (!params.keepDataAttrs || attr.name.indexOf('data-') != 0) &&\n (!params.keepAriaAttrs || attr.name.indexOf('aria-') != 0)\n ) {\n if (\n // unknown attrs\n (\n params.unknownAttrs &&\n elems[elem].attrs.indexOf(attr.name) === -1\n ) ||\n // attrs with default values\n (\n params.defaultAttrs &&\n elems[elem].defaults &&\n elems[elem].defaults[attr.name] === attr.value && (\n attrsInheritable.indexOf(attr.name) < 0 ||\n !item.parentNode.computedAttr(attr.name)\n )\n ) ||\n // useless overrides\n (\n params.uselessOverrides &&\n attr.name !== 'transform' &&\n attrsInheritable.indexOf(attr.name) > -1 &&\n item.parentNode.computedAttr(attr.name, attr.value)\n )\n ) {\n item.removeAttr(attr.name);\n }\n }\n\n });\n\n }\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes non-inheritable groups presentational attributes';\n\nvar inheritableAttrs = require('./_collections').inheritableAttrs,\n attrsGroups = require('./_collections').attrsGroups,\n excludedAttrs = ['display', 'opacity'];\n\n/**\n * Remove non-inheritable group's \"presentation\" attributes.\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n if (item.isElem('g')) {\n\n item.eachAttr(function(attr) {\n if (\n ~attrsGroups.presentation.indexOf(attr.name) &&\n ~attrsGroups.graphicalEvent.indexOf(attr.name) &&\n ~attrsGroups.core.indexOf(attr.name) &&\n ~attrsGroups.conditionalProcessing.indexOf(attr.name) &&\n !~excludedAttrs.indexOf(attr.name) &&\n !~inheritableAttrs.indexOf(attr.name)\n ) {\n item.removeAttr(attr.name);\n }\n });\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes useless stroke and fill attributes';\n\nexports.params = {\n stroke: true,\n fill: true,\n removeNone: false,\n hasStyleOrScript: false\n};\n\nvar shape = require('./_collections').elemsGroups.shape,\n regStrokeProps = /^stroke/,\n regFillProps = /^fill-/,\n styleOrScript = ['style', 'script'];\n\n/**\n * Remove useless stroke and fill attrs.\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n \n if (item.isElem(styleOrScript)) {\n params.hasStyleOrScript = true;\n }\n\n if (!params.hasStyleOrScript && item.isElem(shape) && !item.computedAttr('id')) {\n\n var stroke = params.stroke && item.computedAttr('stroke'),\n fill = params.fill && !item.computedAttr('fill', 'none');\n\n // remove stroke*\n if (\n params.stroke &&\n (!stroke ||\n stroke == 'none' ||\n item.computedAttr('stroke-opacity', '0') ||\n item.computedAttr('stroke-width', '0')\n )\n ) {\n var parentStroke = item.parentNode.computedAttr('stroke'),\n declineStroke = parentStroke && parentStroke != 'none';\n\n item.eachAttr(function(attr) {\n if (regStrokeProps.test(attr.name)) {\n item.removeAttr(attr.name);\n }\n });\n\n if (declineStroke) item.addAttr({\n name: 'stroke',\n value: 'none',\n prefix: '',\n local: 'stroke'\n });\n }\n\n // remove fill*\n if (\n params.fill &&\n (!fill || item.computedAttr('fill-opacity', '0'))\n ) {\n item.eachAttr(function(attr) {\n if (regFillProps.test(attr.name)) {\n item.removeAttr(attr.name);\n }\n });\n\n if (fill) {\n if (item.hasAttr('fill'))\n item.attr('fill').value = 'none';\n else\n item.addAttr({\n name: 'fill',\n value: 'none',\n prefix: '',\n local: 'fill'\n });\n }\n }\n\n if (params.removeNone && \n (!stroke || item.hasAttr('stroke') && item.attr('stroke').value=='none') &&\n (!fill || item.hasAttr('fill') && item.attr('fill').value=='none')) {\n\n return false;\n }\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes viewBox attribute when possible';\n\nvar viewBoxElems = ['svg', 'pattern', 'symbol'];\n\n/**\n * Remove viewBox attr which coincides with a width/height box.\n *\n * @see http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n *\n * @example\n * <svg width=\"100\" height=\"50\" viewBox=\"0 0 100 50\">\n * ⬇\n * <svg width=\"100\" height=\"50\">\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n if (\n item.isElem(viewBoxElems) &&\n item.hasAttr('viewBox') &&\n item.hasAttr('width') &&\n item.hasAttr('height')\n ) {\n\n var nums = item.attr('viewBox').value.split(/[ ,]+/g);\n\n if (\n nums[0] === '0' &&\n nums[1] === '0' &&\n item.attr('width').value.replace(/px$/, '') === nums[2] && // could use parseFloat too\n item.attr('height').value.replace(/px$/, '') === nums[3]\n ) {\n item.removeAttr('viewBox');\n }\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes hidden elements (zero sized, with absent attributes)';\n\nexports.params = {\n displayNone: true,\n opacity0: true,\n circleR0: true,\n ellipseRX0: true,\n ellipseRY0: true,\n rectWidth0: true,\n rectHeight0: true,\n patternWidth0: true,\n patternHeight0: true,\n imageWidth0: true,\n imageHeight0: true,\n pathEmptyD: true,\n polylineEmptyPoints: true,\n polygonEmptyPoints: true\n};\n\nvar regValidPath = /M\\s*(?:[-+]?(?:\\d*\\.\\d+|\\d+(?:\\.|(?!\\.)))([eE][-+]?\\d+)?(?!\\d)\\s*,?\\s*){2}\\D*\\d/i;\n\n/**\n * Remove hidden elements with disabled rendering:\n * - display=\"none\"\n * - opacity=\"0\"\n * - circle with zero radius\n * - ellipse with zero x-axis or y-axis radius\n * - rectangle with zero width or height\n * - pattern with zero width or height\n * - image with zero width or height\n * - path with empty data\n * - polyline with empty points\n * - polygon with empty points\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n if (item.elem) {\n\n // display=\"none\"\n //\n // http://www.w3.org/TR/SVG/painting.html#DisplayProperty\n // \"A value of display: none indicates that the given element\n // and its children shall not be rendered directly\"\n if (\n params.displayNone &&\n item.hasAttr('display', 'none')\n ) return false;\n\n // opacity=\"0\"\n //\n // http://www.w3.org/TR/SVG/masking.html#ObjectAndGroupOpacityProperties\n if (\n params.opacity0 &&\n item.hasAttr('opacity', '0')\n ) return false;\n\n // Circles with zero radius\n //\n // http://www.w3.org/TR/SVG/shapes.html#CircleElementRAttribute\n // \"A value of zero disables rendering of the element\"\n //\n // <circle r=\"0\">\n if (\n params.circleR0 &&\n item.isElem('circle') &&\n item.isEmpty() &&\n item.hasAttr('r', '0')\n ) return false;\n\n // Ellipse with zero x-axis radius\n //\n // http://www.w3.org/TR/SVG/shapes.html#EllipseElementRXAttribute\n // \"A value of zero disables rendering of the element\"\n //\n // <ellipse rx=\"0\">\n if (\n params.ellipseRX0 &&\n item.isElem('ellipse') &&\n item.isEmpty() &&\n item.hasAttr('rx', '0')\n ) return false;\n\n // Ellipse with zero y-axis radius\n //\n // http://www.w3.org/TR/SVG/shapes.html#EllipseElementRYAttribute\n // \"A value of zero disables rendering of the element\"\n //\n // <ellipse ry=\"0\">\n if (\n params.ellipseRY0 &&\n item.isElem('ellipse') &&\n item.isEmpty() &&\n item.hasAttr('ry', '0')\n ) return false;\n\n // Rectangle with zero width\n //\n // http://www.w3.org/TR/SVG/shapes.html#RectElementWidthAttribute\n // \"A value of zero disables rendering of the element\"\n //\n // <rect width=\"0\">\n if (\n params.rectWidth0 &&\n item.isElem('rect') &&\n item.isEmpty() &&\n item.hasAttr('width', '0')\n ) return false;\n\n // Rectangle with zero height\n //\n // http://www.w3.org/TR/SVG/shapes.html#RectElementHeightAttribute\n // \"A value of zero disables rendering of the element\"\n //\n // <rect height=\"0\">\n if (\n params.rectHeight0 &&\n params.rectWidth0 &&\n item.isElem('rect') &&\n item.isEmpty() &&\n item.hasAttr('height', '0')\n ) return false;\n\n // Pattern with zero width\n //\n // http://www.w3.org/TR/SVG/pservers.html#PatternElementWidthAttribute\n // \"A value of zero disables rendering of the element (i.e., no paint is applied)\"\n //\n // <pattern width=\"0\">\n if (\n params.patternWidth0 &&\n item.isElem('pattern') &&\n item.hasAttr('width', '0')\n ) return false;\n\n // Pattern with zero height\n //\n // http://www.w3.org/TR/SVG/pservers.html#PatternElementHeightAttribute\n // \"A value of zero disables rendering of the element (i.e., no paint is applied)\"\n //\n // <pattern height=\"0\">\n if (\n params.patternHeight0 &&\n item.isElem('pattern') &&\n item.hasAttr('height', '0')\n ) return false;\n\n // Image with zero width\n //\n // http://www.w3.org/TR/SVG/struct.html#ImageElementWidthAttribute\n // \"A value of zero disables rendering of the element\"\n //\n // <image width=\"0\">\n if (\n params.imageWidth0 &&\n item.isElem('image') &&\n item.hasAttr('width', '0')\n ) return false;\n\n // Image with zero height\n //\n // http://www.w3.org/TR/SVG/struct.html#ImageElementHeightAttribute\n // \"A value of zero disables rendering of the element\"\n //\n // <image height=\"0\">\n if (\n params.imageHeight0 &&\n item.isElem('image') &&\n item.hasAttr('height', '0')\n ) return false;\n\n // Path with empty data\n //\n // http://www.w3.org/TR/SVG/paths.html#DAttribute\n //\n // <path d=\"\"/>\n if (\n params.pathEmptyD &&\n item.isElem('path') &&\n (!item.hasAttr('d') || !regValidPath.test(item.attr('d').value))\n ) return false;\n\n // Polyline with empty points\n //\n // http://www.w3.org/TR/SVG/shapes.html#PolylineElementPointsAttribute\n //\n // <polyline points=\"\">\n if (\n params.polylineEmptyPoints &&\n item.isElem('polyline') &&\n !item.hasAttr('points')\n ) return false;\n\n // Polygon with empty points\n //\n // http://www.w3.org/TR/SVG/shapes.html#PolygonElementPointsAttribute\n //\n // <polygon points=\"\">\n if (\n params.polygonEmptyPoints &&\n item.isElem('polygon') &&\n !item.hasAttr('points')\n ) return false;\n\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'converts basic shapes to more compact path form';\n\nexports.params = {\n convertArcs: false\n};\n\nvar none = { value: 0 },\n regNumber = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\n/**\n * Converts basic shape to more compact path.\n * It also allows further optimizations like\n * combining paths with similar attributes.\n *\n * @see http://www.w3.org/TR/SVG/shapes.html\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Lev Solntsev\n */\nexports.fn = function(item, params) {\n var convertArcs = params && params.convertArcs;\n\n if (\n item.isElem('rect') &&\n item.hasAttr('width') &&\n item.hasAttr('height') &&\n !item.hasAttr('rx') &&\n !item.hasAttr('ry')\n ) {\n\n var x = +(item.attr('x') || none).value,\n y = +(item.attr('y') || none).value,\n width = +item.attr('width').value,\n height = +item.attr('height').value;\n\n // Values like '100%' compute to NaN, thus running after\n // cleanupNumericValues when 'px' units has already been removed.\n // TODO: Calculate sizes from % and non-px units if possible.\n if (isNaN(x - y + width - height)) return;\n\n var pathData =\n 'M' + x + ' ' + y +\n 'H' + (x + width) +\n 'V' + (y + height) +\n 'H' + x +\n 'z';\n\n item.addAttr({\n name: 'd',\n value: pathData,\n prefix: '',\n local: 'd'\n });\n\n item.renameElem('path')\n .removeAttr(['x', 'y', 'width', 'height']);\n\n } else if (item.isElem('line')) {\n\n var x1 = +(item.attr('x1') || none).value,\n y1 = +(item.attr('y1') || none).value,\n x2 = +(item.attr('x2') || none).value,\n y2 = +(item.attr('y2') || none).value;\n if (isNaN(x1 - y1 + x2 - y2)) return;\n\n item.addAttr({\n name: 'd',\n value: 'M' + x1 + ' ' + y1 + 'L' + x2 + ' ' + y2,\n prefix: '',\n local: 'd'\n });\n\n item.renameElem('path')\n .removeAttr(['x1', 'y1', 'x2', 'y2']);\n\n } else if ((\n item.isElem('polyline') ||\n item.isElem('polygon')\n ) &&\n item.hasAttr('points')\n ) {\n\n var coords = (item.attr('points').value.match(regNumber) || []).map(Number);\n if (coords.length < 4) return false;\n\n item.addAttr({\n name: 'd',\n value: 'M' + coords.slice(0,2).join(' ') +\n 'L' + coords.slice(2).join(' ') +\n (item.isElem('polygon') ? 'z' : ''),\n prefix: '',\n local: 'd'\n });\n\n item.renameElem('path')\n .removeAttr('points');\n } else if (item.isElem('circle') && convertArcs) {\n\n var cx = +(item.attr('cx') || none).value;\n var cy = +(item.attr('cy') || none).value;\n var r = +(item.attr('r') || none).value;\n if (isNaN(cx - cy + r)) {\n return;\n }\n var cPathData =\n 'M' + cx + ' ' + (cy - r) +\n 'A' + r + ' ' + r + ' 0 1 0 ' + cx + ' ' + (cy + r) +\n 'A' + r + ' ' + r + ' 0 1 0 ' + cx + ' ' + (cy - r) +\n 'Z';\n item.addAttr({\n name: 'd',\n value: cPathData,\n prefix: '',\n local: 'd',\n });\n item.renameElem('path').removeAttr(['cx', 'cy', 'r']);\n\n } else if (item.isElem('ellipse') && convertArcs) {\n\n var ecx = +(item.attr('cx') || none).value;\n var ecy = +(item.attr('cy') || none).value;\n var rx = +(item.attr('rx') || none).value;\n var ry = +(item.attr('ry') || none).value;\n if (isNaN(ecx - ecy + rx - ry)) {\n return;\n }\n var ePathData =\n 'M' + ecx + ' ' + (ecy - ry) +\n 'A' + rx + ' ' + ry + ' 0 1 0 ' + ecx + ' ' + (ecy + ry) +\n 'A' + rx + ' ' + ry + ' 0 1 0 ' + ecx + ' ' + (ecy - ry) +\n 'Z';\n item.addAttr({\n name: 'd',\n value: ePathData,\n prefix: '',\n local: 'd',\n });\n item.renameElem('path').removeAttr(['cx', 'cy', 'rx', 'ry']);\n }\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'moves some group attributes to the content elements';\n\nvar collections = require('./_collections.js'),\n pathElems = collections.pathElems.concat(['g', 'text']),\n referencesProps = collections.referencesProps;\n\n/**\n * Move group attrs to the content elements.\n *\n * @example\n * <g transform=\"scale(2)\">\n * <path transform=\"rotate(45)\" d=\"M0,0 L10,20\"/>\n * <path transform=\"translate(10, 20)\" d=\"M0,10 L20,30\"/>\n * </g>\n * ⬇\n * <g>\n * <path transform=\"scale(2) rotate(45)\" d=\"M0,0 L10,20\"/>\n * <path transform=\"scale(2) translate(10, 20)\" d=\"M0,10 L20,30\"/>\n * </g>\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n // move group transform attr to content's pathElems\n if (\n item.isElem('g') &&\n item.hasAttr('transform') &&\n !item.isEmpty() &&\n !item.someAttr(function(attr) {\n return ~referencesProps.indexOf(attr.name) && ~attr.value.indexOf('url(');\n }) &&\n item.content.every(function(inner) {\n return inner.isElem(pathElems) && !inner.hasAttr('id');\n })\n ) {\n item.content.forEach(function(inner) {\n var attr = item.attr('transform');\n if (inner.hasAttr('transform')) {\n inner.attr('transform').value = attr.value + ' ' + inner.attr('transform').value;\n } else {\n inner.addAttr({\n 'name': attr.name,\n 'local': attr.local,\n 'prefix': attr.prefix,\n 'value': attr.value\n });\n }\n });\n\n item.removeAttr('transform');\n }\n\n};\n","/* global a2c */\n'use strict';\n\nvar regPathInstructions = /([MmLlHhVvCcSsQqTtAaZz])\\s*/,\n regPathData = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)([eE][-+]?\\d+)?/g,\n regNumericValues = /[-+]?(\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/,\n transform2js = require('./_transforms').transform2js,\n transformsMultiply = require('./_transforms').transformsMultiply,\n transformArc = require('./_transforms').transformArc,\n collections = require('./_collections.js'),\n referencesProps = collections.referencesProps,\n defaultStrokeWidth = collections.attrsGroupsDefaults.presentation['stroke-width'],\n cleanupOutData = require('../lib/svgo/tools').cleanupOutData,\n removeLeadingZero = require('../lib/svgo/tools').removeLeadingZero,\n prevCtrlPoint;\n\n/**\n * Convert path string to JS representation.\n *\n * @param {String} pathString input string\n * @param {Object} params plugin params\n * @return {Array} output array\n */\nexports.path2js = function(path) {\n if (path.pathJS) return path.pathJS;\n\n var paramsLength = { // Number of parameters of every path command\n H: 1, V: 1, M: 2, L: 2, T: 2, Q: 4, S: 4, C: 6, A: 7,\n h: 1, v: 1, m: 2, l: 2, t: 2, q: 4, s: 4, c: 6, a: 7\n },\n pathData = [], // JS representation of the path data\n instruction, // current instruction context\n startMoveto = false;\n\n // splitting path string into array like ['M', '10 50', 'L', '20 30']\n path.attr('d').value.split(regPathInstructions).forEach(function(data) {\n if (!data) return;\n if (!startMoveto) {\n if (data == 'M' || data == 'm') {\n startMoveto = true;\n } else return;\n }\n\n // instruction item\n if (regPathInstructions.test(data)) {\n instruction = data;\n\n // z - instruction w/o data\n if (instruction == 'Z' || instruction == 'z') {\n pathData.push({\n instruction: 'z'\n });\n }\n // data item\n } else {\n data = data.match(regPathData);\n if (!data) return;\n\n data = data.map(Number);\n\n // Subsequent moveto pairs of coordinates are threated as implicit lineto commands\n // http://www.w3.org/TR/SVG/paths.html#PathDataMovetoCommands\n if (instruction == 'M' || instruction == 'm') {\n pathData.push({\n instruction: pathData.length == 0 ? 'M' : instruction,\n data: data.splice(0, 2)\n });\n instruction = instruction == 'M' ? 'L' : 'l';\n }\n\n for (var pair = paramsLength[instruction]; data.length;) {\n pathData.push({\n instruction: instruction,\n data: data.splice(0, pair)\n });\n }\n }\n });\n\n // First moveto is actually absolute. Subsequent coordinates were separated above.\n if (pathData.length && pathData[0].instruction == 'm') {\n pathData[0].instruction = 'M';\n }\n path.pathJS = pathData;\n\n return pathData;\n};\n\n/**\n * Convert relative Path data to absolute.\n *\n * @param {Array} data input data\n * @return {Array} output data\n */\nvar relative2absolute = exports.relative2absolute = function(data) {\n var currentPoint = [0, 0],\n subpathPoint = [0, 0],\n i;\n\n return data.map(function(item) {\n\n var instruction = item.instruction,\n itemData = item.data && item.data.slice();\n\n if (instruction == 'M') {\n\n set(currentPoint, itemData);\n set(subpathPoint, itemData);\n\n } else if ('mlcsqt'.indexOf(instruction) > -1) {\n\n for (i = 0; i < itemData.length; i++) {\n itemData[i] += currentPoint[i % 2];\n }\n set(currentPoint, itemData);\n\n if (instruction == 'm') {\n set(subpathPoint, itemData);\n }\n\n } else if (instruction == 'a') {\n\n itemData[5] += currentPoint[0];\n itemData[6] += currentPoint[1];\n set(currentPoint, itemData);\n\n } else if (instruction == 'h') {\n\n itemData[0] += currentPoint[0];\n currentPoint[0] = itemData[0];\n\n } else if (instruction == 'v') {\n\n itemData[0] += currentPoint[1];\n currentPoint[1] = itemData[0];\n\n } else if ('MZLCSQTA'.indexOf(instruction) > -1) {\n\n set(currentPoint, itemData);\n\n } else if (instruction == 'H') {\n\n currentPoint[0] = itemData[0];\n\n } else if (instruction == 'V') {\n\n currentPoint[1] = itemData[0];\n\n } else if (instruction == 'z') {\n\n set(currentPoint, subpathPoint);\n\n }\n\n return instruction == 'z' ?\n { instruction: 'z' } :\n {\n instruction: instruction.toUpperCase(),\n data: itemData\n };\n\n });\n};\n\n/**\n * Apply transformation(s) to the Path data.\n *\n * @param {Object} elem current element\n * @param {Array} path input path data\n * @param {Object} params whether to apply transforms to stroked lines and transform precision (used for stroke width)\n * @return {Array} output path data\n */\nexports.applyTransforms = function(elem, path, params) {\n // if there are no 'stroke' attr and references to other objects such as\n // gradiends or clip-path which are also subjects to transform.\n if (!elem.hasAttr('transform') || !elem.attr('transform').value ||\n elem.someAttr(function(attr) {\n return ~referencesProps.indexOf(attr.name) && ~attr.value.indexOf('url(');\n }))\n return path;\n\n var matrix = transformsMultiply(transform2js(elem.attr('transform').value)),\n stroke = elem.computedAttr('stroke'),\n id = elem.computedAttr('id'),\n transformPrecision = params.transformPrecision,\n newPoint, scale;\n\n if (stroke && stroke != 'none') {\n if (!params.applyTransformsStroked ||\n (matrix.data[0] != matrix.data[3] || matrix.data[1] != -matrix.data[2]) &&\n (matrix.data[0] != -matrix.data[3] || matrix.data[1] != matrix.data[2]))\n return path;\n\n // \"stroke-width\" should be inside the part with ID, otherwise it can be overrided in <use>\n if (id) {\n var idElem = elem,\n hasStrokeWidth = false;\n\n do {\n if (idElem.hasAttr('stroke-width')) hasStrokeWidth = true;\n } while (!idElem.hasAttr('id', id) && !hasStrokeWidth && (idElem = idElem.parentNode));\n\n if (!hasStrokeWidth) return path;\n }\n\n scale = +Math.sqrt(matrix.data[0] * matrix.data[0] + matrix.data[1] * matrix.data[1]).toFixed(transformPrecision);\n\n if (scale !== 1) {\n var strokeWidth = elem.computedAttr('stroke-width') || defaultStrokeWidth;\n\n if (elem.hasAttr('stroke-width')) {\n elem.attrs['stroke-width'].value = elem.attrs['stroke-width'].value.trim()\n .replace(regNumericValues, function(num) { return removeLeadingZero(num * scale) });\n } else {\n elem.addAttr({\n name: 'stroke-width',\n prefix: '',\n local: 'stroke-width',\n value: strokeWidth.replace(regNumericValues, function(num) { return removeLeadingZero(num * scale) })\n });\n }\n }\n } else if (id) { // Stroke and stroke-width can be redefined with <use>\n return path;\n }\n\n path.forEach(function(pathItem) {\n\n if (pathItem.data) {\n\n // h -> l\n if (pathItem.instruction === 'h') {\n\n pathItem.instruction = 'l';\n pathItem.data[1] = 0;\n\n // v -> l\n } else if (pathItem.instruction === 'v') {\n\n pathItem.instruction = 'l';\n pathItem.data[1] = pathItem.data[0];\n pathItem.data[0] = 0;\n\n }\n\n // if there is a translate() transform\n if (pathItem.instruction === 'M' &&\n (matrix.data[4] !== 0 ||\n matrix.data[5] !== 0)\n ) {\n\n // then apply it only to the first absoluted M\n newPoint = transformPoint(matrix.data, pathItem.data[0], pathItem.data[1]);\n set(pathItem.data, newPoint);\n set(pathItem.coords, newPoint);\n\n // clear translate() data from transform matrix\n matrix.data[4] = 0;\n matrix.data[5] = 0;\n\n } else {\n\n if (pathItem.instruction == 'a') {\n\n transformArc(pathItem.data, matrix.data);\n\n // reduce number of digits in rotation angle\n if (Math.abs(pathItem.data[2]) > 80) {\n var a = pathItem.data[0],\n rotation = pathItem.data[2];\n pathItem.data[0] = pathItem.data[1];\n pathItem.data[1] = a;\n pathItem.data[2] = rotation + (rotation > 0 ? -90 : 90);\n }\n\n newPoint = transformPoint(matrix.data, pathItem.data[5], pathItem.data[6]);\n pathItem.data[5] = newPoint[0];\n pathItem.data[6] = newPoint[1];\n\n } else {\n\n for (var i = 0; i < pathItem.data.length; i += 2) {\n newPoint = transformPoint(matrix.data, pathItem.data[i], pathItem.data[i + 1]);\n pathItem.data[i] = newPoint[0];\n pathItem.data[i + 1] = newPoint[1];\n }\n }\n\n pathItem.coords[0] = pathItem.base[0] + pathItem.data[pathItem.data.length - 2];\n pathItem.coords[1] = pathItem.base[1] + pathItem.data[pathItem.data.length - 1];\n\n }\n\n }\n\n });\n\n // remove transform attr\n elem.removeAttr('transform');\n\n return path;\n};\n\n/**\n * Apply transform 3x3 matrix to x-y point.\n *\n * @param {Array} matrix transform 3x3 matrix\n * @param {Array} point x-y point\n * @return {Array} point with new coordinates\n */\nfunction transformPoint(matrix, x, y) {\n\n return [\n matrix[0] * x + matrix[2] * y + matrix[4],\n matrix[1] * x + matrix[3] * y + matrix[5]\n ];\n\n}\n\n/**\n * Compute Cubic Bézie bounding box.\n *\n * @see http://processingjs.nihongoresources.com/bezierinfo/\n *\n * @param {Float} xa\n * @param {Float} ya\n * @param {Float} xb\n * @param {Float} yb\n * @param {Float} xc\n * @param {Float} yc\n * @param {Float} xd\n * @param {Float} yd\n *\n * @return {Object}\n */\nexports.computeCubicBoundingBox = function(xa, ya, xb, yb, xc, yc, xd, yd) {\n\n var minx = Number.POSITIVE_INFINITY,\n miny = Number.POSITIVE_INFINITY,\n maxx = Number.NEGATIVE_INFINITY,\n maxy = Number.NEGATIVE_INFINITY,\n ts,\n t,\n x,\n y,\n i;\n\n // X\n if (xa < minx) { minx = xa; }\n if (xa > maxx) { maxx = xa; }\n if (xd < minx) { minx= xd; }\n if (xd > maxx) { maxx = xd; }\n\n ts = computeCubicFirstDerivativeRoots(xa, xb, xc, xd);\n\n for (i = 0; i < ts.length; i++) {\n\n t = ts[i];\n\n if (t >= 0 && t <= 1) {\n x = computeCubicBaseValue(t, xa, xb, xc, xd);\n // y = computeCubicBaseValue(t, ya, yb, yc, yd);\n\n if (x < minx) { minx = x; }\n if (x > maxx) { maxx = x; }\n }\n\n }\n\n // Y\n if (ya < miny) { miny = ya; }\n if (ya > maxy) { maxy = ya; }\n if (yd < miny) { miny = yd; }\n if (yd > maxy) { maxy = yd; }\n\n ts = computeCubicFirstDerivativeRoots(ya, yb, yc, yd);\n\n for (i = 0; i < ts.length; i++) {\n\n t = ts[i];\n\n if (t >= 0 && t <= 1) {\n // x = computeCubicBaseValue(t, xa, xb, xc, xd);\n y = computeCubicBaseValue(t, ya, yb, yc, yd);\n\n if (y < miny) { miny = y; }\n if (y > maxy) { maxy = y; }\n }\n\n }\n\n return {\n minx: minx,\n miny: miny,\n maxx: maxx,\n maxy: maxy\n };\n\n};\n\n// compute the value for the cubic bezier function at time=t\nfunction computeCubicBaseValue(t, a, b, c, d) {\n\n var mt = 1 - t;\n\n return mt * mt * mt * a + 3 * mt * mt * t * b + 3 * mt * t * t * c + t * t * t * d;\n\n}\n\n// compute the value for the first derivative of the cubic bezier function at time=t\nfunction computeCubicFirstDerivativeRoots(a, b, c, d) {\n\n var result = [-1, -1],\n tl = -a + 2 * b - c,\n tr = -Math.sqrt(-a * (c - d) + b * b - b * (c + d) + c * c),\n dn = -a + 3 * b - 3 * c + d;\n\n if (dn !== 0) {\n result[0] = (tl + tr) / dn;\n result[1] = (tl - tr) / dn;\n }\n\n return result;\n\n}\n\n/**\n * Compute Quadratic Bézier bounding box.\n *\n * @see http://processingjs.nihongoresources.com/bezierinfo/\n *\n * @param {Float} xa\n * @param {Float} ya\n * @param {Float} xb\n * @param {Float} yb\n * @param {Float} xc\n * @param {Float} yc\n *\n * @return {Object}\n */\nexports.computeQuadraticBoundingBox = function(xa, ya, xb, yb, xc, yc) {\n\n var minx = Number.POSITIVE_INFINITY,\n miny = Number.POSITIVE_INFINITY,\n maxx = Number.NEGATIVE_INFINITY,\n maxy = Number.NEGATIVE_INFINITY,\n t,\n x,\n y;\n\n // X\n if (xa < minx) { minx = xa; }\n if (xa > maxx) { maxx = xa; }\n if (xc < minx) { minx = xc; }\n if (xc > maxx) { maxx = xc; }\n\n t = computeQuadraticFirstDerivativeRoot(xa, xb, xc);\n\n if (t >= 0 && t <= 1) {\n x = computeQuadraticBaseValue(t, xa, xb, xc);\n // y = computeQuadraticBaseValue(t, ya, yb, yc);\n\n if (x < minx) { minx = x; }\n if (x > maxx) { maxx = x; }\n }\n\n // Y\n if (ya < miny) { miny = ya; }\n if (ya > maxy) { maxy = ya; }\n if (yc < miny) { miny = yc; }\n if (yc > maxy) { maxy = yc; }\n\n t = computeQuadraticFirstDerivativeRoot(ya, yb, yc);\n\n if (t >= 0 && t <=1 ) {\n // x = computeQuadraticBaseValue(t, xa, xb, xc);\n y = computeQuadraticBaseValue(t, ya, yb, yc);\n\n if (y < miny) { miny = y; }\n if (y > maxy) { maxy = y ; }\n\n }\n\n return {\n minx: minx,\n miny: miny,\n maxx: maxx,\n maxy: maxy\n };\n\n};\n\n// compute the value for the quadratic bezier function at time=t\nfunction computeQuadraticBaseValue(t, a, b, c) {\n\n var mt = 1 - t;\n\n return mt * mt * a + 2 * mt * t * b + t * t * c;\n\n}\n\n// compute the value for the first derivative of the quadratic bezier function at time=t\nfunction computeQuadraticFirstDerivativeRoot(a, b, c) {\n\n var t = -1,\n denominator = a - 2 * b + c;\n\n if (denominator !== 0) {\n t = (a - b) / denominator;\n }\n\n return t;\n\n}\n\n/**\n * Convert path array to string.\n *\n * @param {Array} path input path data\n * @param {Object} params plugin params\n * @return {String} output path string\n */\nexports.js2path = function(path, data, params) {\n\n path.pathJS = data;\n\n if (params.collapseRepeated) {\n data = collapseRepeated(data);\n }\n\n path.attr('d').value = data.reduce(function(pathString, item) {\n return pathString += item.instruction + (item.data ? cleanupOutData(item.data, params) : '');\n }, '');\n\n};\n\n/**\n * Collapse repeated instructions data\n *\n * @param {Array} path input path data\n * @return {Array} output path data\n */\nfunction collapseRepeated(data) {\n\n var prev,\n prevIndex;\n\n // copy an array and modifieds item to keep original data untouched\n data = data.reduce(function(newPath, item) {\n if (\n prev && item.data &&\n item.instruction == prev.instruction\n ) {\n // concat previous data with current\n if (item.instruction != 'M') {\n prev = newPath[prevIndex] = {\n instruction: prev.instruction,\n data: prev.data.concat(item.data),\n coords: item.coords,\n base: prev.base\n };\n } else {\n prev.data = item.data;\n prev.coords = item.coords;\n }\n } else {\n newPath.push(item);\n prev = item;\n prevIndex = newPath.length - 1;\n }\n\n return newPath;\n }, []);\n\n return data;\n\n}\n\nfunction set(dest, source) {\n dest[0] = source[source.length - 2];\n dest[1] = source[source.length - 1];\n return dest;\n}\n\n/**\n * Checks if two paths have an intersection by checking convex hulls\n * collision using Gilbert-Johnson-Keerthi distance algorithm\n * http://entropyinteractive.com/2011/04/gjk-algorithm/\n *\n * @param {Array} path1 JS path representation\n * @param {Array} path2 JS path representation\n * @return {Boolean}\n */\nexports.intersects = function(path1, path2) {\n if (path1.length < 3 || path2.length < 3) return false; // nothing to fill\n\n // Collect points of every subpath.\n var points1 = relative2absolute(path1).reduce(gatherPoints, []),\n points2 = relative2absolute(path2).reduce(gatherPoints, []);\n\n // Axis-aligned bounding box check.\n if (points1.maxX <= points2.minX || points2.maxX <= points1.minX ||\n points1.maxY <= points2.minY || points2.maxY <= points1.minY ||\n points1.every(function (set1) {\n return points2.every(function (set2) {\n return set1[set1.maxX][0] <= set2[set2.minX][0] ||\n set2[set2.maxX][0] <= set1[set1.minX][0] ||\n set1[set1.maxY][1] <= set2[set2.minY][1] ||\n set2[set2.maxY][1] <= set1[set1.minY][1];\n });\n })\n ) return false;\n\n // Get a convex hull from points of each subpath. Has the most complexity O(n·log n).\n var hullNest1 = points1.map(convexHull),\n hullNest2 = points2.map(convexHull);\n\n // Check intersection of every subpath of the first path with every subpath of the second.\n return hullNest1.some(function(hull1) {\n if (hull1.length < 3) return false;\n\n return hullNest2.some(function(hull2) {\n if (hull2.length < 3) return false;\n\n var simplex = [getSupport(hull1, hull2, [1, 0])], // create the initial simplex\n direction = minus(simplex[0]); // set the direction to point towards the origin\n\n var iterations = 1e4; // infinite loop protection, 10 000 iterations is more than enough\n while (true) {\n if (iterations-- == 0) {\n console.error('Error: infinite loop while processing mergePaths plugin.');\n return true; // true is the safe value that means “do nothing with paths”\n }\n // add a new point\n simplex.push(getSupport(hull1, hull2, direction));\n // see if the new point was on the correct side of the origin\n if (dot(direction, simplex[simplex.length - 1]) <= 0) return false;\n // process the simplex\n if (processSimplex(simplex, direction)) return true;\n }\n });\n });\n\n function getSupport(a, b, direction) {\n return sub(supportPoint(a, direction), supportPoint(b, minus(direction)));\n }\n\n // Computes farthest polygon point in particular direction.\n // Thanks to knowledge of min/max x and y coordinates we can choose a quadrant to search in.\n // Since we're working on convex hull, the dot product is increasing until we find the farthest point.\n function supportPoint(polygon, direction) {\n var index = direction[1] >= 0 ?\n direction[0] < 0 ? polygon.maxY : polygon.maxX :\n direction[0] < 0 ? polygon.minX : polygon.minY,\n max = -Infinity,\n value;\n while ((value = dot(polygon[index], direction)) > max) {\n max = value;\n index = ++index % polygon.length;\n }\n return polygon[(index || polygon.length) - 1];\n }\n};\n\nfunction processSimplex(simplex, direction) {\n /* jshint -W004 */\n\n // we only need to handle to 1-simplex and 2-simplex\n if (simplex.length == 2) { // 1-simplex\n var a = simplex[1],\n b = simplex[0],\n AO = minus(simplex[1]),\n AB = sub(b, a);\n // AO is in the same direction as AB\n if (dot(AO, AB) > 0) {\n // get the vector perpendicular to AB facing O\n set(direction, orth(AB, a));\n } else {\n set(direction, AO);\n // only A remains in the simplex\n simplex.shift();\n }\n } else { // 2-simplex\n var a = simplex[2], // [a, b, c] = simplex\n b = simplex[1],\n c = simplex[0],\n AB = sub(b, a),\n AC = sub(c, a),\n AO = minus(a),\n ACB = orth(AB, AC), // the vector perpendicular to AB facing away from C\n ABC = orth(AC, AB); // the vector perpendicular to AC facing away from B\n\n if (dot(ACB, AO) > 0) {\n if (dot(AB, AO) > 0) { // region 4\n set(direction, ACB);\n simplex.shift(); // simplex = [b, a]\n } else { // region 5\n set(direction, AO);\n simplex.splice(0, 2); // simplex = [a]\n }\n } else if (dot(ABC, AO) > 0) {\n if (dot(AC, AO) > 0) { // region 6\n set(direction, ABC);\n simplex.splice(1, 1); // simplex = [c, a]\n } else { // region 5 (again)\n set(direction, AO);\n simplex.splice(0, 2); // simplex = [a]\n }\n } else // region 7\n return true;\n }\n return false;\n}\n\nfunction minus(v) {\n return [-v[0], -v[1]];\n}\n\nfunction sub(v1, v2) {\n return [v1[0] - v2[0], v1[1] - v2[1]];\n}\n\nfunction dot(v1, v2) {\n return v1[0] * v2[0] + v1[1] * v2[1];\n}\n\nfunction orth(v, from) {\n var o = [-v[1], v[0]];\n return dot(o, minus(from)) < 0 ? minus(o) : o;\n}\n\nfunction gatherPoints(points, item, index, path) {\n\n var subPath = points.length && points[points.length - 1],\n prev = index && path[index - 1],\n basePoint = subPath.length && subPath[subPath.length - 1],\n data = item.data,\n ctrlPoint = basePoint;\n\n switch (item.instruction) {\n case 'M':\n points.push(subPath = []);\n break;\n case 'H':\n addPoint(subPath, [data[0], basePoint[1]]);\n break;\n case 'V':\n addPoint(subPath, [basePoint[0], data[0]]);\n break;\n case 'Q':\n addPoint(subPath, data.slice(0, 2));\n prevCtrlPoint = [data[2] - data[0], data[3] - data[1]]; // Save control point for shorthand\n break;\n case 'T':\n if (prev.instruction == 'Q' || prev.instruction == 'T') {\n ctrlPoint = [basePoint[0] + prevCtrlPoint[0], basePoint[1] + prevCtrlPoint[1]];\n addPoint(subPath, ctrlPoint);\n prevCtrlPoint = [data[0] - ctrlPoint[0], data[1] - ctrlPoint[1]];\n }\n break;\n case 'C':\n // Approximate quibic Bezier curve with middle points between control points\n addPoint(subPath, [.5 * (basePoint[0] + data[0]), .5 * (basePoint[1] + data[1])]);\n addPoint(subPath, [.5 * (data[0] + data[2]), .5 * (data[1] + data[3])]);\n addPoint(subPath, [.5 * (data[2] + data[4]), .5 * (data[3] + data[5])]);\n prevCtrlPoint = [data[4] - data[2], data[5] - data[3]]; // Save control point for shorthand\n break;\n case 'S':\n if (prev.instruction == 'C' || prev.instruction == 'S') {\n addPoint(subPath, [basePoint[0] + .5 * prevCtrlPoint[0], basePoint[1] + .5 * prevCtrlPoint[1]]);\n ctrlPoint = [basePoint[0] + prevCtrlPoint[0], basePoint[1] + prevCtrlPoint[1]];\n }\n addPoint(subPath, [.5 * (ctrlPoint[0] + data[0]), .5 * (ctrlPoint[1]+ data[1])]);\n addPoint(subPath, [.5 * (data[0] + data[2]), .5 * (data[1] + data[3])]);\n prevCtrlPoint = [data[2] - data[0], data[3] - data[1]];\n break;\n case 'A':\n // Convert the arc to bezier curves and use the same approximation\n var curves = a2c.apply(0, basePoint.concat(data));\n for (var cData; (cData = curves.splice(0,6).map(toAbsolute)).length;) {\n addPoint(subPath, [.5 * (basePoint[0] + cData[0]), .5 * (basePoint[1] + cData[1])]);\n addPoint(subPath, [.5 * (cData[0] + cData[2]), .5 * (cData[1] + cData[3])]);\n addPoint(subPath, [.5 * (cData[2] + cData[4]), .5 * (cData[3] + cData[5])]);\n if (curves.length) addPoint(subPath, basePoint = cData.slice(-2));\n }\n break;\n }\n // Save final command coordinates\n if (data && data.length >= 2) addPoint(subPath, data.slice(-2));\n return points;\n\n function toAbsolute(n, i) { return n + basePoint[i % 2] }\n\n // Writes data about the extreme points on each axle\n function addPoint(path, point) {\n if (!path.length || point[1] > path[path.maxY][1]) {\n path.maxY = path.length;\n points.maxY = points.length ? Math.max(point[1], points.maxY) : point[1];\n }\n if (!path.length || point[0] > path[path.maxX][0]) {\n path.maxX = path.length;\n points.maxX = points.length ? Math.max(point[0], points.maxX) : point[0];\n }\n if (!path.length || point[1] < path[path.minY][1]) {\n path.minY = path.length;\n points.minY = points.length ? Math.min(point[1], points.minY) : point[1];\n }\n if (!path.length || point[0] < path[path.minX][0]) {\n path.minX = path.length;\n points.minX = points.length ? Math.min(point[0], points.minX) : point[0];\n }\n path.push(point);\n }\n}\n\n/**\n * Forms a convex hull from set of points of every subpath using monotone chain convex hull algorithm.\n * http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain\n *\n * @param points An array of [X, Y] coordinates\n */\nfunction convexHull(points) {\n /* jshint -W004 */\n\n points.sort(function(a, b) {\n return a[0] == b[0] ? a[1] - b[1] : a[0] - b[0];\n });\n\n var lower = [],\n minY = 0,\n bottom = 0;\n for (var i = 0; i < points.length; i++) {\n while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], points[i]) <= 0) {\n lower.pop();\n }\n if (points[i][1] < points[minY][1]) {\n minY = i;\n bottom = lower.length;\n }\n lower.push(points[i]);\n }\n\n var upper = [],\n maxY = points.length - 1,\n top = 0;\n for (var i = points.length; i--;) {\n while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], points[i]) <= 0) {\n upper.pop();\n }\n if (points[i][1] > points[maxY][1]) {\n maxY = i;\n top = upper.length;\n }\n upper.push(points[i]);\n }\n\n // last points are equal to starting points of the other part\n upper.pop();\n lower.pop();\n\n var hull = lower.concat(upper);\n\n hull.minX = 0; // by sorting\n hull.maxX = lower.length;\n hull.minY = bottom;\n hull.maxY = (lower.length + top) % hull.length;\n\n return hull;\n}\n\nfunction cross(o, a, b) {\n return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);\n}\n\n/* Based on code from Snap.svg (Apache 2 license). http://snapsvg.io/\n * Thanks to Dmitry Baranovskiy for his great work!\n */\n\n// jshint ignore: start\nfunction a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n var _120 = Math.PI * 120 / 180,\n rad = Math.PI / 180 * (+angle || 0),\n res = [],\n rotateX = function(x, y, rad) { return x * Math.cos(rad) - y * Math.sin(rad) },\n rotateY = function(x, y, rad) { return x * Math.sin(rad) + y * Math.cos(rad) };\n if (!recursive) {\n x1 = rotateX(x1, y1, -rad);\n y1 = rotateY(x1, y1, -rad);\n x2 = rotateX(x2, y2, -rad);\n y2 = rotateY(x2, y2, -rad);\n var x = (x1 - x2) / 2,\n y = (y1 - y2) / 2;\n var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx = h * rx;\n ry = h * ry;\n }\n var rx2 = rx * rx,\n ry2 = ry * ry,\n k = (large_arc_flag == sweep_flag ? -1 : 1) *\n Math.sqrt(Math.abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n cx = k * rx * y / ry + (x1 + x2) / 2,\n cy = k * -ry * x / rx + (y1 + y2) / 2,\n f1 = Math.asin(((y1 - cy) / ry).toFixed(9)),\n f2 = Math.asin(((y2 - cy) / ry).toFixed(9));\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n f1 < 0 && (f1 = Math.PI * 2 + f1);\n f2 < 0 && (f2 = Math.PI * 2 + f2);\n if (sweep_flag && f1 > f2) {\n f1 = f1 - Math.PI * 2;\n }\n if (!sweep_flag && f2 > f1) {\n f2 = f2 - Math.PI * 2;\n }\n } else {\n f1 = recursive[0];\n f2 = recursive[1];\n cx = recursive[2];\n cy = recursive[3];\n }\n var df = f2 - f1;\n if (Math.abs(df) > _120) {\n var f2old = f2,\n x2old = x2,\n y2old = y2;\n f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n }\n df = f2 - f1;\n var c1 = Math.cos(f1),\n s1 = Math.sin(f1),\n c2 = Math.cos(f2),\n s2 = Math.sin(f2),\n t = Math.tan(df / 4),\n hx = 4 / 3 * rx * t,\n hy = 4 / 3 * ry * t,\n m = [\n - hx * s1, hy * c1,\n x2 + hx * s2 - x1, y2 - hy * c2 - y1,\n x2 - x1, y2 - y1\n ];\n if (recursive) {\n return m.concat(res);\n } else {\n res = m.concat(res);\n var newres = [];\n for (var i = 0, n = res.length; i < n; i++) {\n newres[i] = i % 2 ? rotateY(res[i - 1], res[i], rad) : rotateX(res[i], res[i + 1], rad);\n }\n return newres;\n }\n}\n// jshint ignore: end\n","'use strict';\n\nexports.type = 'perItemReverse';\n\nexports.active = true;\n\nexports.description = 'removes empty container elements';\n\nvar container = require('./_collections').elemsGroups.container;\n\n/**\n * Remove empty containers.\n *\n * @see http://www.w3.org/TR/SVG/intro.html#TermContainerElement\n *\n * @example\n * <defs/>\n *\n * @example\n * <g><marker><a/></marker></g>\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n return !(item.isElem(container) && !item.isElem('svg') && item.isEmpty() &&\n (!item.isElem('pattern') || !item.hasAttrLocal('href')));\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'merges multiple paths in one if possible';\n\nexports.params = {\n collapseRepeated: true,\n leadingZero: true,\n negativeExtraSpace: true\n};\n\nvar path2js = require('./_path.js').path2js,\n js2path = require('./_path.js').js2path,\n intersects = require('./_path.js').intersects;\n\n/**\n * Merge multiple Paths into one.\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich, Lev Solntsev\n */\nexports.fn = function(item, params) {\n\n if (!item.isElem() || item.isEmpty()) return;\n\n var prevContentItem = null,\n prevContentItemKeys = null;\n\n item.content = item.content.filter(function(contentItem) {\n\n if (prevContentItem &&\n prevContentItem.isElem('path') &&\n prevContentItem.isEmpty() &&\n prevContentItem.hasAttr('d') &&\n contentItem.isElem('path') &&\n contentItem.isEmpty() &&\n contentItem.hasAttr('d')\n ) {\n\n if (!prevContentItemKeys) {\n prevContentItemKeys = Object.keys(prevContentItem.attrs);\n }\n\n var contentItemAttrs = Object.keys(contentItem.attrs),\n equalData = prevContentItemKeys.length == contentItemAttrs.length &&\n contentItemAttrs.every(function(key) {\n return key == 'd' ||\n prevContentItem.hasAttr(key) &&\n prevContentItem.attr(key).value == contentItem.attr(key).value;\n }),\n prevPathJS = path2js(prevContentItem),\n curPathJS = path2js(contentItem);\n\n if (equalData && !intersects(prevPathJS, curPathJS)) {\n js2path(prevContentItem, prevPathJS.concat(curPathJS), params);\n return false;\n }\n }\n\n prevContentItem = contentItem;\n prevContentItemKeys = null;\n return true;\n\n });\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.params = {\n removeAny: true\n};\n\nexports.description = 'removes <desc>';\n\nvar standardDescs = /^(Created with|Created using)/;\n\n/**\n * Removes <desc>.\n * Removes only standard editors content or empty elements 'cause it can be used for accessibility.\n * Enable parameter 'removeAny' to remove any description.\n *\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Element/desc\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Daniel Wabyick\n */\nexports.fn = function(item, params) {\n\n return !item.isElem('desc') || !(params.removeAny || item.isEmpty() ||\n standardDescs.test(item.content[0].text));\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes doctype declaration';\n\n/**\n * Remove DOCTYPE declaration.\n *\n * \"Unfortunately the SVG DTDs are a source of so many\n * issues that the SVG WG has decided not to write one\n * for the upcoming SVG 1.2 standard. In fact SVG WG\n * members are even telling people not to use a DOCTYPE\n * declaration in SVG 1.0 and 1.1 documents\"\n * https://jwatt.org/svg/authoring/#doctype-declaration\n *\n * @example\n * <!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n * q\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n *\n * @example\n * <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n * \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\" [\n * <!-- an internal subset can be embedded here -->\n * ]>\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n if (item.doctype) {\n return false;\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes XML processing instructions';\n\n/**\n * Remove XML Processing Instruction.\n *\n * @example\n * <?xml version=\"1.0\" encoding=\"utf-8\"?>\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n return !(item.processinginstruction && item.processinginstruction.name === 'xml');\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes comments';\n\n/**\n * Remove comments.\n *\n * @example\n * <!-- Generator: Adobe Illustrator 15.0.0, SVG Export\n * Plug-In . SVG Version: 6.00 Build 0) -->\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n if (item.comment && item.comment.charAt(0) !== '!') {\n return false;\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes <metadata>';\n\n/**\n * Remove <metadata>.\n *\n * http://www.w3.org/TR/SVG/metadata.html\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n return !item.isElem('metadata');\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = false;\n\nexports.description = 'removes xmlns attribute (for inline svg, disabled by default)';\n\n/**\n * Remove the xmlns attribute when present.\n *\n * @example\n * <svg viewBox=\"0 0 100 50\" xmlns=\"http://www.w3.org/2000/svg\">\n * ↓\n * <svg viewBox=\"0 0 100 50\">\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if true, xmlns will be filtered out\n *\n * @author Ricardo Tomasi\n */\nexports.fn = function(item) {\n\n if (item.isElem('svg') && item.hasAttr('xmlns')) {\n item.removeAttr('xmlns');\n }\n\n};","'use strict';\n\nexports.type = 'full';\n\nexports.active = true;\n\nexports.params = {\n onlyMatchedOnce: true,\n removeMatchedSelectors: true,\n useMqs: ['', 'screen'],\n usePseudos: ['']\n};\n\nexports.description = 'inline styles (additional options)';\n\n\nvar csstree = require('css-tree'),\n cssTools = require('../lib/css-tools');\n\n/**\n * Moves + merges styles from style elements to element styles\n *\n * Options\n * onlyMatchedOnce (default: true)\n * inline only selectors that match once\n *\n * removeMatchedSelectors (default: true)\n * clean up matched selectors,\n * leave selectors that hadn't matched\n *\n * useMqs (default: ['', 'screen'])\n * what media queries to be used\n * empty string element for styles outside media queries\n *\n * usePseudos (default: [''])\n * what pseudo-classes/-elements to be used\n * empty string element for all non-pseudo-classes and/or -elements\n *\n * @param {Object} document document element\n * @param {Object} opts plugin params\n *\n * @author strarsis <strarsis@gmail.com>\n */\nexports.fn = function(document, opts) {\n\n // collect <style/>s\n var styleEls = document.querySelectorAll('style');\n\n //no <styles/>s, nothing to do\n if (styleEls === null) {\n return document;\n }\n\n var styles = [],\n selectors = [];\n\n for (var styleEl of styleEls) {\n if (styleEl.isEmpty() || styleEl.closestElem('foreignObject')) {\n // skip empty <style/>s or <foreignObject> content.\n continue;\n }\n\n var cssStr = cssTools.getCssStr(styleEl);\n\n // collect <style/>s and their css ast\n var cssAst = {};\n try {\n cssAst = csstree.parse(cssStr, {\n parseValue: false,\n parseCustomProperty: false\n });\n } catch (parseError) {\n // console.warn('Warning: Parse error of styles of <style/> element, skipped. Error details: ' + parseError);\n continue;\n }\n\n styles.push({\n styleEl: styleEl,\n cssAst: cssAst\n });\n\n selectors = selectors.concat(cssTools.flattenToSelectors(cssAst));\n }\n\n\n // filter for mediaqueries to be used or without any mediaquery\n var selectorsMq = cssTools.filterByMqs(selectors, opts.useMqs);\n\n\n // filter for pseudo elements to be used\n var selectorsPseudo = cssTools.filterByPseudos(selectorsMq, opts.usePseudos);\n\n // remove PseudoClass from its SimpleSelector for proper matching\n cssTools.cleanPseudos(selectorsPseudo);\n\n\n // stable sort selectors\n var sortedSelectors = cssTools.sortSelectors(selectorsPseudo).reverse();\n\n\n var selector,\n selectedEl;\n\n // match selectors\n for (selector of sortedSelectors) {\n var selectorStr = csstree.translate(selector.item.data),\n selectedEls = null;\n\n try {\n selectedEls = document.querySelectorAll(selectorStr);\n } catch (selectError) {\n if (selectError.constructor === SyntaxError) {\n // console.warn('Warning: Syntax error when trying to select \\n\\n' + selectorStr + '\\n\\n, skipped. Error details: ' + selectError);\n continue;\n }\n throw selectError;\n }\n\n if (selectedEls === null) {\n // nothing selected\n continue;\n }\n\n selector.selectedEls = selectedEls;\n }\n\n\n // apply <style/> styles to matched elements\n for (selector of sortedSelectors) {\n if(!selector.selectedEls) {\n continue;\n }\n\n if (opts.onlyMatchedOnce && selector.selectedEls !== null && selector.selectedEls.length > 1) {\n // skip selectors that match more than once if option onlyMatchedOnce is enabled\n continue;\n }\n\n // apply <style/> to matched elements\n for (selectedEl of selector.selectedEls) {\n if (selector.rule === null) {\n continue;\n }\n\n // merge declarations\n csstree.walkDeclarations(selector.rule, function(styleCsstreeDeclaration) {\n\n // existing inline styles have higher priority\n // no inline styles, external styles, external styles used\n // inline styles, external styles same priority as inline styles, inline styles used\n // inline styles, external styles higher priority than inline styles, external styles used\n var styleDeclaration = cssTools.csstreeToStyleDeclaration(styleCsstreeDeclaration);\n if (selectedEl.style.getPropertyValue(styleDeclaration.name) !== null &&\n selectedEl.style.getPropertyPriority(styleDeclaration.name) >= styleDeclaration.priority) {\n return;\n }\n selectedEl.style.setProperty(styleDeclaration.name, styleDeclaration.value, styleDeclaration.priority);\n });\n }\n\n if (opts.removeMatchedSelectors && selector.selectedEls !== null && selector.selectedEls.length > 0) {\n // clean up matching simple selectors if option removeMatchedSelectors is enabled\n selector.rule.prelude.children.remove(selector.item);\n }\n }\n\n\n if (!opts.removeMatchedSelectors) {\n return document; // no further processing required\n }\n\n\n // clean up matched class + ID attribute values\n for (selector of sortedSelectors) {\n if(!selector.selectedEls) {\n continue;\n }\n\n if (opts.onlyMatchedOnce && selector.selectedEls !== null && selector.selectedEls.length > 1) {\n // skip selectors that match more than once if option onlyMatchedOnce is enabled\n continue;\n }\n\n for (selectedEl of selector.selectedEls) {\n // class\n var firstSubSelector = selector.item.data.children.first();\n if(firstSubSelector.type === 'ClassSelector') {\n selectedEl.class.remove(firstSubSelector.name);\n }\n // clean up now empty class attributes\n if(typeof selectedEl.class.item(0) === 'undefined') {\n selectedEl.removeAttr('class');\n }\n\n // ID\n if(firstSubSelector.type === 'IdSelector') {\n selectedEl.removeAttr('id', firstSubSelector.name);\n }\n }\n }\n\n\n // clean up now empty elements\n for (var style of styles) {\n csstree.walkRules(style.cssAst, function(node, item, list) {\n // clean up <style/> atrules without any rulesets left\n if (node.type === 'Atrule' &&\n // only Atrules containing rulesets\n node.block !== null &&\n node.block.children.isEmpty()) {\n list.remove(item);\n return;\n }\n\n // clean up <style/> rulesets without any css selectors left\n if (node.type === 'Rule' &&\n node.prelude.children.isEmpty()) {\n list.remove(item);\n }\n });\n\n\n if (style.cssAst.children.isEmpty()) {\n // clean up now emtpy <style/>s\n var styleParentEl = style.styleEl.parentNode;\n styleParentEl.spliceContent(styleParentEl.content.indexOf(style.styleEl), 1);\n\n if (styleParentEl.elem === 'defs' &&\n styleParentEl.content.length === 0) {\n // also clean up now empty <def/>s\n var defsParentEl = styleParentEl.parentNode;\n defsParentEl.spliceContent(defsParentEl.content.indexOf(styleParentEl), 1);\n }\n\n continue;\n }\n\n\n // update existing, left over <style>s\n cssTools.setCssStr(style.styleEl, csstree.translate(style.cssAst));\n }\n\n\n return document;\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = false;\n\nexports.description = 'removes raster images (disabled by default)';\n\n/**\n * Remove raster images references in <image>.\n *\n * @see https://bugs.webkit.org/show_bug.cgi?id=63548\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n if (\n item.isElem('image') &&\n item.hasAttrLocal('href', /(\\.|image\\/)(jpg|png|gif)/)\n ) {\n return false;\n }\n\n};\n","'use strict';\n\nexports.type = 'full';\n\nexports.active = true;\n\nexports.description = 'remove or cleanup enable-background attribute when possible';\n\n/**\n * Remove or cleanup enable-background attr which coincides with a width/height box.\n *\n * @see http://www.w3.org/TR/SVG/filters.html#EnableBackgroundProperty\n *\n * @example\n * <svg width=\"100\" height=\"50\" enable-background=\"new 0 0 100 50\">\n * ⬇\n * <svg width=\"100\" height=\"50\">\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(data) {\n\n var regEnableBackground = /^new\\s0\\s0\\s([\\-+]?\\d*\\.?\\d+([eE][\\-+]?\\d+)?)\\s([\\-+]?\\d*\\.?\\d+([eE][\\-+]?\\d+)?)$/,\n hasFilter = false,\n elems = ['svg', 'mask', 'pattern'];\n\n function checkEnableBackground(item) {\n if (\n item.isElem(elems) &&\n item.hasAttr('enable-background') &&\n item.hasAttr('width') &&\n item.hasAttr('height')\n ) {\n\n var match = item.attr('enable-background').value.match(regEnableBackground);\n\n if (match) {\n if (\n item.attr('width').value === match[1] &&\n item.attr('height').value === match[3]\n ) {\n if (item.isElem('svg')) {\n item.removeAttr('enable-background');\n } else {\n item.attr('enable-background').value = 'new';\n }\n }\n }\n\n }\n }\n\n function checkForFilter(item) {\n if (item.isElem('filter')) {\n hasFilter = true;\n }\n }\n\n function monkeys(items, fn) {\n items.content.forEach(function(item) {\n fn(item);\n\n if (item.content) {\n monkeys(item, fn);\n }\n });\n return items;\n }\n\n var firstStep = monkeys(data, function(item) {\n checkEnableBackground(item);\n if (!hasFilter) {\n checkForFilter(item);\n }\n });\n\n return hasFilter ? firstStep : monkeys(firstStep, function(item) {\n //we don't need 'enable-background' if we have no filters\n item.removeAttr('enable-background');\n });\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes empty <text> elements';\n\nexports.params = {\n text: true,\n tspan: true,\n tref: true\n};\n\n/**\n * Remove empty Text elements.\n *\n * @see http://www.w3.org/TR/SVG/text.html\n *\n * @example\n * Remove empty text element:\n * <text/>\n *\n * Remove empty tspan element:\n * <tspan/>\n *\n * Remove tref with empty xlink:href attribute:\n * <tref xlink:href=\"\"/>\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item, params) {\n\n // Remove empty text element\n if (\n params.text &&\n item.isElem('text') &&\n item.isEmpty()\n ) return false;\n\n // Remove empty tspan element\n if (\n params.tspan &&\n item.isElem('tspan') &&\n item.isEmpty()\n ) return false;\n\n // Remove tref with empty xlink:href attribute\n if (\n params.tref &&\n item.isElem('tref') &&\n !item.hasAttrLocal('href')\n ) return false;\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes empty attributes';\n\n/**\n * Remove attributes with empty values.\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(item) {\n\n if (item.elem) {\n\n item.eachAttr(function(attr) {\n if (attr.value === '') {\n item.removeAttr(attr.name);\n }\n });\n\n }\n\n};\n","'use strict';\n\nexports.type = 'full';\n\nexports.active = true;\n\nexports.description = 'removes unused namespaces declaration';\n\n/**\n * Remove unused namespaces declaration.\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Kir Belevich\n */\nexports.fn = function(data) {\n\n var svgElem,\n xmlnsCollection = [];\n\n /**\n * Remove namespace from collection.\n *\n * @param {String} ns namescape name\n */\n function removeNSfromCollection(ns) {\n\n var pos = xmlnsCollection.indexOf(ns);\n\n // if found - remove ns from the namespaces collection\n if (pos > -1) {\n xmlnsCollection.splice(pos, 1);\n }\n\n }\n\n /**\n * Bananas!\n *\n * @param {Array} items input items\n *\n * @return {Array} output items\n */\n function monkeys(items) {\n\n var i = 0,\n length = items.content.length;\n\n while(i < length) {\n\n var item = items.content[i];\n\n if (item.isElem('svg')) {\n\n item.eachAttr(function(attr) {\n // collect namespaces\n if (attr.prefix === 'xmlns' && attr.local) {\n xmlnsCollection.push(attr.local);\n }\n });\n\n // if svg element has ns-attr\n if (xmlnsCollection.length) {\n // save svg element\n svgElem = item;\n }\n\n } else if (xmlnsCollection.length) {\n\n // check item for the ns-attrs\n if (item.prefix) {\n removeNSfromCollection(item.prefix);\n }\n\n // check each attr for the ns-attrs\n item.eachAttr(function(attr) {\n removeNSfromCollection(attr.prefix);\n });\n\n }\n\n // if nothing is found - go deeper\n if (xmlnsCollection.length && item.content) {\n monkeys(item);\n }\n\n i++;\n\n }\n\n return items;\n\n }\n\n data = monkeys(data);\n\n // remove svg element ns-attributes if they are not used even once\n if (xmlnsCollection.length) {\n xmlnsCollection.forEach(function(name) {\n svgElem.removeAttr('xmlns:' + name);\n });\n }\n\n return data;\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = false;\n\nexports.description = 'sorts element attributes (disabled by default)';\n\nexports.params = {\n\torder: [\n\t\t'id',\n\t\t'width', 'height',\n\t\t'x', 'x1', 'x2',\n\t\t'y', 'y1', 'y2',\n\t\t'cx', 'cy', 'r',\n\t\t'fill', 'stroke', 'marker',\n\t\t'd', 'points'\n\t]\n};\n\n/**\n * Sort element attributes for epic readability.\n *\n * @param {Object} item current iteration item\n * @param {Object} params plugin params\n *\n * @author Nikolay Frantsev\n */\nexports.fn = function(item, params) {\n\n\tvar attrs = [],\n\t\tsorted = {},\n\t\torderlen = params.order.length + 1;\n\n\tif (item.elem) {\n\n\t\titem.eachAttr(function(attr) {\n\t\t\tattrs.push(attr);\n\t\t});\n\n\t\tattrs.sort(function(a, b) {\n\t\t\tif (a.prefix != b.prefix) {\n\t\t\t\t// xmlns attributes implicitly have the prefix xmlns\n\t\t\t\tif (a.prefix == 'xmlns')\n\t\t\t\t\treturn -1;\n\t\t\t\tif (b.prefix == 'xmlns')\n\t\t\t\t\treturn 1;\n\t\t\t\treturn a.prefix < b.prefix ? -1 : 1;\n\t\t\t}\n\n\t\t\tvar aindex = orderlen;\n\t\t\tvar bindex = orderlen;\n\n\t\t\tfor (var i = 0; i < params.order.length; i++) {\n\t\t\t\tif (a.name == params.order[i]) {\n\t\t\t\t\taindex = i;\n\t\t\t\t} else if (a.name.indexOf(params.order[i] + '-') === 0) {\n\t\t\t\t\taindex = i + .5;\n\t\t\t\t}\n\t\t\t\tif (b.name == params.order[i]) {\n\t\t\t\t\tbindex = i;\n\t\t\t\t} else if (b.name.indexOf(params.order[i] + '-') === 0) {\n\t\t\t\t\tbindex = i + .5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (aindex != bindex) {\n\t\t\t\treturn aindex - bindex;\n\t\t\t}\n\t\t\treturn a.name < b.name ? -1 : 1;\n\t\t});\n\n\t\tattrs.forEach(function (attr) {\n\t\t\tsorted[attr.name] = attr;\n\t\t});\n\n\t\titem.attrs = sorted;\n\n\t}\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = true;\n\nexports.description = 'removes <title>';\n\n/**\n * Remove <title>.\n *\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Igor Kalashnikov\n */\nexports.fn = function(item) {\n\n return !item.isElem('title');\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = false;\n\nexports.description = 'removes width and height in presence of viewBox (opposite to removeViewBox, disable it first)';\n\n/**\n * Remove width/height attributes when a viewBox attribute is present.\n *\n * @example\n * <svg width=\"100\" height=\"50\" viewBox=\"0 0 100 50\">\n * ↓\n * <svg viewBox=\"0 0 100 50\">\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if true, with and height will be filtered out\n *\n * @author Benny Schudel\n */\nexports.fn = function(item) {\n\n if (\n item.isElem('svg') &&\n item.hasAttr('viewBox')\n ) {\n item.removeAttr('width');\n item.removeAttr('height');\n }\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = false;\n\nexports.description = 'removes <style> element (disabled by default)';\n\n/**\n * Remove <style>.\n *\n * http://www.w3.org/TR/SVG/styling.html#StyleElement\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Betsy Dupuis\n */\nexports.fn = function(item) {\n\n return !item.isElem('style');\n\n};\n","'use strict';\n\nexports.type = 'perItem';\n\nexports.active = false;\n\nexports.description = 'removes <script> elements (disabled by default)';\n\n/**\n * Remove <script>.\n *\n * https://www.w3.org/TR/SVG/script.html\n *\n * @param {Object} item current iteration item\n * @return {Boolean} if false, item will be filtered out\n *\n * @author Patrick Klingemann\n */\nexports.fn = function(item) {\n\n return !item.isElem('script');\n\n};\n"],"names":["init","call","_maxListeners","defaultMaxListeners","length","apply","TypeError","_events","newListener","emit","listener","_eventsCount","unshift","push","warned","Error","name","emitter","type","count","console","warn","log","removeListener","arguments","pop","Array","setTimeout","clearTimeout","concat","run","fun","array","join","replace","JSON","stringify","global","process","noDeprecation","throwDeprecation","traceDeprecation","trace","error","seen","stylize","depth","colors","showHidden","customInspect","styles","forEach","inspect","constructor","prototype","Object","keys","getOwnPropertyNames","indexOf","RegExp","toString","Date","toUTCString","map","hasOwnProperty","match","getOwnPropertyDescriptor","value","get","set","split","substr","reduce","isArray","charCodeAt","NaN","Infinity","isNaN","Math","LN2","Buffer","TYPED_ARRAY_SUPPORT","RangeError","Uint8Array","__proto__","ArrayBuffer","fill","isEncoding","write","slice","byteLength","copy","buffer","data","_isBuffer","isView","toLowerCase","from","lastIndexOf","readUInt16BE","read","parseInt","base64.fromByteArray","String","ieee754.write","trim","base64.toByteArray","isBuffer","readFloatLE","head","tail","encoding","surrogateSize","detectIncompleteChar","charBuffer","charReceived","charLength","prependListener","on","listeners","objectMode","readableObjectMode","highWaterMark","pipes","pipesCount","flowing","ended","endEmitted","reading","sync","needReadable","emittedReadable","readableListening","resumeScheduled","defaultEncoding","ranOut","awaitDrain","readingMore","decoder","_readableState","readable","_read","end","shift","clear","next","allocUnsafe","chunk","callback","defineProperty","getBuffer","writableObjectMode","needDrain","ending","finished","decodeStrings","writing","corked","bufferProcessing","onwrite","writecb","writelen","bufferedRequest","lastBufferedRequest","pendingcb","prefinished","errorEmitted","bufferedRequestCount","corkedRequestsFree","_writableState","writable","_write","writev","_writev","entry","finish","once","Readable","Writable","allowHalfOpen","afterTransform","needTransform","transforming","writechunk","writeencoding","_transformState","Duplex","transform","_transform","flush","_flush","Transform","EE","sort","toUpperCase","charAt","decodeCodePoint","ElementType","CDATA","children","Text","isTag","SyntaxError","action","ignoreCase","lowerCaseAttributeNames","xmlMode","test","lowerCaseTags","procedure","attribute","equals","pseudo","getParent","attributesFactory","rules","contains","getText","icontains","getNCheck","getSiblings","getName","root","scope","checkbox","file","password","radio","reset","image","submit","empty","getChildren","some","link","hasAttrib","visited","selected","disabled","enabled","checked","required","optional","parent","header","button","getAttributeValue","input","text","compileFactory","adapter","compile","compileUnsafe","shouldTestNextSiblings","context","removeSubsets","filter","splice","existsOne","findOne","findAll","prev","cursor","source","line","column","Boolean","lines","startLine","columns","startColumn","linesAnsColumnsComputed","offsetAndType","balance","isNumber","tokenCount","min","max","comma","explicit","terms","combinator","disallowEmpty","multiplier","loc","offset","substring","keyword","vendor","unit","pos","str","substringToPos","eat","charCode","nextCharCode","syntax","node","badNode","lastNode","mismatch","matchSyntax","childrenMatch","toJSON","getType","getProperty","matched","isFinite","start","structure","docs","check","translate","walk","getTrace","isType","isProperty","isKeyword","valueCommonSyntax","atrule","parseContext","parse","_array","_set","Map","create","generatedLine","generatedColumn","util","compareByGeneratedPositionsInflated","_sorted","_last","_file","getArg","_sourceRoot","_skipValidation","_sources","_names","_mappings","_sourcesContents","random","swap","sections","_version","normalize","isAbsolute","relative","ArraySet","fromArray","sourceRoot","sourcesContent","originalLine","originalColumn","_sections","url","generatedOffset","consumer","sourceContents","add","generate","each","eachComma","stylesheet","block","fn","rule","eachRight","nullable","walkContext","fields","atrulePrelude","selector","declaration","function","isObject","createParser","createWalker","createGenerator","createConvertor","List","Tokenizer","Lexer","property","grammar","lexer","createLexer","walkUp","walkRules","walkRulesRight","walkDeclarations","translateWithSourceMap","translateMarkup","clone","fromPlainObject","toPlainObject","createSyntax","mix","fork","generic","types","properties","tokenStart","tokenEnd","Raw","scanner","lookupType","tolerant","skip","eof","tokenType","getLocation","substrToCursor","tolerantParse","Rule","Declaration","skipSC","consume","getTokenValue","isHex","consumeNonWS","scan","lookupValue","appendData","currentToken","lookupNonWSType","WhiteSpace","Function","AtrulePrelude","Identifier","Parentheses","item","Uint16Array","location","hostname","navigator","appVersion","config","assign","indent","repeat","pretty","doctypeEnd","procInstEnd","commentEnd","cdataEnd","tagShortEnd","tagOpenEnd","tagCloseEnd","textEnd","indentLevel","textContext","content","active","params","cursors","TAB_REPLACEMENT","OFFSET_CORRECTION","MAX_LINE_LENGTH","isNewline","firstCharOffset","SYMBOL_TYPE","findWhiteSpaceEnd","findCommentEnd","findNumberEnd","cmpStr","URL","WHITESPACE","findUrlRawEnd","findStringEnd","findIdentifierEnd","term","tokens","longestMatch","css","mismatchOffset","last","consumeNumber","dimension","findWsEnd","NAME_CHAR","scanNumber","readMultiplierRange","readMultiplier","peek","scanWord","maybeMultiplied","COMBINATOR_PRECEDENCE","regroupTerms","readImplicitGroup","readKeywordOrFunction","readGroup","readProperty","readType","scanString","scanSpaces","else","then","all","buildMatchGraph","nextSyntax","matchStack","syntaxStack","thenStack","tokenCursor","token","index","mask","reason","iterations","getFirstMatchNode","getLastMatchNode","isValidNumber","isValidLocation","createNodeStructureChecker","buildMatchResult","valueHasVar","createParseContext","getWalkersFromStructure","reverse","Atrule","StyleSheet","Block","extend","vendorPrefix","names","isCustomProperty","parseWithFallback","consumeRawDeclaration","Value","isBalanceEdge","SelectorList","scanUnicodeNumber","createSingleNodeList","readSequence","createList","tags","ids","classes","whitelist","blacklist","remove","isEmpty","seed","resolveKeyword","basename","prelude","id","append","forceMediaMerge","insertList","appendList","compareMarker","prevUntil","utils","unsafeToSkipNode","pseudoSignature","isEqualSelectors","isEqualDeclarations","addSelectors","hasSimilarSelectors","insert","createItem","iehack","sides","first","operation","shorthand","isOkToMinimize","getDeclaration","lastMatch","prefix","important","fingerprint","nextUntil","avoidRulesMerge","compareDeclarations","eq","ne1","ne2","ne2overrided","comment","logger","firstAtrulesAllowed","visit","enter","restructuring","comments","restructure","debug","now","toFixed","filename","positions","sourceMap","beforeCompress","afterCompress","ast","setSourceContent","isElem","hasAttr","usage","elem","attr","attrs","force","parentNode","inheritableAttrs","local","instruction","coords","base","bind","makeArcs","radius","center","sdata","straightCurves","lineShorthands","collapseRepeated","curveSmoothShorthands","removeUseless","every","negativeExtraSpace","collapseIntoOne","convertToShorts","removeAttr","transformPrecision","degPrecision","floatPrecision","matrixToTransform","shortTranslate","shortScale","shortRotate","cleanupOutData","round","has","Set","width","parseFloat","height","plugins","values","dimensions","sqrt","tan","asin","sin","acos","cos","PI","Number","MAX_VALUE","fromCharCode","abs","pow","floor","self","EventEmitter","usingDomains","domain","Domain","getPrototypeOf","setMaxListeners","getMaxListeners","domainEmitter","domainThrown","addListener","prependOnceListener","removeAllListeners","listenerCount","eventNames","Reflect","ownKeys","performance","mozNow","msNow","oNow","webkitNow","getTime","nextTick","title","browser","env","argv","version","versions","off","binding","cwd","chdir","umask","hrtime","platform","release","uptime","super_","enumerable","configurable","poolSize","_augment","alloc","allocUnsafeSlow","compare","swap16","swap32","swap64","includes","_arr","subarray","readUIntLE","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","ieee754.read","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","BufferList","ReadableState","NODE_DEBUG","inherits","isPaused","setEncoding","pipe","pause","unpipe","resume","wrap","_fromList","WritableState","cork","uncork","setDefaultEncoding","PassThrough","Stream","destroy","_isStdio","q","c","bufferCheckPosition","MAX_BUFFER_LENGTH","opt","lowercase","lowercasetags","looseCase","closed","closedRoot","sawRoot","tag","strict","noscript","state","BEGIN","strictEntities","ENTITIES","XML_ENTITIES","attribList","xmlns","ns","trackPosition","position","cdata","script","_parser","onend","onerror","_decoder","textNode","BEGIN_WHITESPACE","TEXT","tagName","attributes","attribName","attribValue","uri","isSelfClosing","SCRIPT","entity","OPEN_WAKA","startTagPosition","fromCodePoint","parser","SAXParser","SAXStream","createStream","EVENTS","TEXT_ENTITY","SCRIPT_ENDING","CLOSE_TAG","SGML_DECL","sgmlDecl","OPEN_TAG","PROC_INST","procInstName","procInstBody","COMMENT","DOCTYPE","doctype","SGML_DECL_QUOTED","DOCTYPE_DTD","DOCTYPE_QUOTED","DOCTYPE_DTD_QUOTED","COMMENT_ENDING","COMMENT_ENDED","CDATA_ENDING","CDATA_ENDING_2","PROC_INST_ENDING","PROC_INST_BODY","body","OPEN_TAG_SLASH","ATTRIB","ATTRIB_NAME","ATTRIB_VALUE","ATTRIB_NAME_SAW_WHITE","ATTRIB_VALUE_QUOTED","ATTRIB_VALUE_UNQUOTED","ATTRIB_VALUE_ENTITY_Q","ATTRIB_VALUE_CLOSED","ATTRIB_VALUE_ENTITY_U","CLOSE_TAG_SAW_WHITE","close","require$$1","StringDecoder","xml","STATE","COMMENT_STARTING","Directive","Comment","Script","Style","Tag","Doctype","XML","HTML","HTMLStrict","escape","decodeEntities","encodeXML","attribs","allowfullscreen","async","autofocus","autoplay","controls","default","defer","hidden","ismap","loop","multiple","muted","open","readonly","reversed","scoped","seamless","typemustmatch","style","xmp","iframe","noembed","noframes","plaintext","area","basefont","br","col","command","embed","frame","hr","img","isindex","keygen","meta","param","track","wbr","cheerio","getInnerHTML","getOuterHTML","require$$0","find","findOneChild","tag_name","tag_type","tag_contains","DISCONNECTED","PRECEDING","FOLLOWING","CONTAINS","CONTAINED_BY","exports","trueFunc","falseFunc","exists","not","any","hyphen","element","attributeFactory","descendant","_flexibleDescendant","child","sibling","adjacent","universal","BaseFuncs","filters","pseudos","rootFunc","pseudosFactory","rulesFactory","matches","compileToken","Pseudos","selectAll","selectOne","is","iterate","_compileUnsafe","_compileToken","baseCssAdapter","renameElem","closestElem","spliceContent","hasAttrLocal","someAttr","computedAttr","addAttr","class","hasClass","hasStyle","eachAttr","querySelectorAll","querySelector","toStr","callee","propertyIsEnumerable","$applicationCache","$console","$external","$frame","$frameElement","$frames","$innerHeight","$innerWidth","$outerHeight","$outerWidth","$pageXOffset","$pageYOffset","$parent","$scrollLeft","$scrollTop","$scrollX","$scrollY","$self","$webkitIndexedDB","$webkitStorageInfo","$window","window","isArguments","isArgs","shim","Symbol","isFunction","x","getOwnPropertySymbols","supportsDescriptors","toStringTag","getDay","hasToStringTag","valueOf","hasSymbols","iterator","isPrimitive","toPrimitive","isSymbol","isDate","entries","asyncIterator","Atomics","DataView","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","eval","EvalError","Float32Array","Float64Array","Int8Array","Int16Array","Int32Array","Promise","reject","resolve","Proxy","ReferenceError","SharedArrayBuffer","Uint8ClampedArray","Uint32Array","URIError","WeakMap","WeakSet","undefined","$Object","$TypeError","$String","ToPrimitive","ToBoolean","ToNumber","ToInteger","$isNaN","$isFinite","ToInt32","ToUint32","ToUint16","ToString","ToObject","CheckObjectCoercible","IsCallable","SameValue","Type","IsPropertyDescriptor","IsAccessorDescriptor","IsDataDescriptor","IsGenericDescriptor","FromPropertyDescriptor","ToPropertyDescriptor","regexExec","exec","lastIndex","MAX_SAFE_INTEGER","isExtensible","Call","ToInt16","ToInt8","ToUint8","ToUint8Clamp","RequireObjectCoercible","ToPropertyKey","ToLength","CanonicalNumericIndexString","ES5","IsArray","IsConstructor","IsExtensible","preventExtensions","IsInteger","IsPropertyKey","IsRegExp","hasRegExpMatcher","SameValueZero","GetV","GetMethod","Get","SpeciesConstructor","species","CompletePropertyDescriptor","HasOwnProperty","HasProperty","IsConcatSpreadable","isConcatSpreadable","Invoke","GetIterator","IteratorNext","IteratorComplete","IteratorValue","IteratorStep","IteratorClose","CreateIterResultObject","done","RegExpExec","ArraySpeciesCreate","CreateDataProperty","CreateDataPropertyOrThrow","ObjectCreate","AdvanceStringIndex","SameValueNonNumber","isEnumerable","ES","getPolyfill","define","implementation","classNames","classAttr","addClassHandler","getClassAttr","setClassAttr","addClassValueHandler","getClassValue","setClassValue","_addSingle","_removeSingle","delete","toggle","getSize","toArray","updateCursors","prepend","prependData","insertData","message","stack","sourceFragment","parseError","IDENTIFIER","NUMBER","STRING","PUNCTUATOR","N","F","R","TYPE","Punctuator","CDO","CDC","Url","ExclamationMark","QuotationMark","NumberSign","DollarSign","PercentSign","Ampersand","Apostrophe","LeftParenthesis","RightParenthesis","Asterisk","PlusSign","Comma","HyphenMinus","FullStop","Solidus","Colon","Semicolon","LessThanSign","EqualsSign","GreaterThanSign","QuestionMark","CommercialAt","LeftSquareBracket","Backslash","RightSquareBracket","CircumflexAccent","LowLine","GraveAccent","LeftCurlyBracket","VerticalLine","RightCurlyBracket","Tilde","NAME","SafeUint32Array","PUNCTUATION","STOP_URL_RAW","constants","FULLSTOP","PLUSSIGN","HYPHENMINUS","TAB","SPACE","cmpChar","endsWith","findLastNonSpaceLocation","findDecimalNumberEnd","findEscaseEnd","setSource","startOffset","getTokenStart","getOffsetExcludeWS","getRawLength","skipWS","eatNonWS","consumeFunctionName","expectIdentifier","getLocationRange","dump","idx","CssSyntaxError","SyntaxReferenceError","reference","MatchError","rawMessage","translateGrammar","freeze","hack","custom","SyntaxParseError","EXCLAMATIONMARK","APOSTROPHE","LEFTPARENTHESIS","RIGHTPARENTHESIS","LESSTHANSIGN","GREATERTHANSIGN","LEFTSQUAREBRACKET","RIGHTSQUAREBRACKET","LEFTCURLYBRACKET","RIGHTCURLYBRACKET","MULTIPLIER_DEFAULT","matchFragments","nodes","getStructureFromConfig","addType_","addProperty_","checkStructure","createDescriptor","expression","matchDeclaration","matchProperty","matchType","findValueFragments","findDeclarationValueFragments","findAllFragments","validate","recognizer","space","ignoreWS","ignoreWSAfter","getNode","noop","needPositions","onParseError","parseAtrulePrelude","parseRulePrelude","parseValue","parseCustomProperty","getLocationFromList","encode","decode","rest","scheme","auth","host","port","path","size","toSetString","at","MappingList","unsortedForEach","SourceMapGenerator","fromSourceMap","eachMapping","generated","original","addMapping","sources","sourceContentFor","_validateMapping","applySourceMap","originalPositionFor","_serializeMappings","base64VLQ","_generateSourcesContent","mappings","LEAST_UPPER_BOUND","GREATEST_LOWER_BOUND","quickSort","SourceMapConsumer","__generatedMappings","_parseMappings","__originalMappings","_charIsMappingSeparator","GENERATED_ORDER","ORIGINAL_ORDER","_generatedMappings","_originalMappings","allGeneratedPositionsFor","_findMapping","compareByOriginalPositions","lastColumn","compareByGeneratedPositionsDeflated","search","computeColumnSpans","lastGeneratedColumn","hasContentsOfAllSources","urlParse","generatedPositionFor","bias","SourceNode","fromStringWithSourceMap","replaceRight","walkSourceContents","fromSetString","toStringWithSourceMap","code","require$$2","Selector","sourceMapGenerator","getTypesFromConfig","patch","syntaxes","a","b","ATRULE","ASTERISK","VERTICALLINE","matcher","flags","SEMICOLON","SOLIDUS","TILDE","COLON","DOLLARSIGN","NUMBERSIGN","Dimension","Ratio","COMMA","PERCENTSIGN","FUNCTION","left","right","QUESTIONMARK","RAW","AnPlusB","AttributeSelector","Brackets","ClassSelector","Combinator","DeclarationList","HexColor","IdSelector","MediaFeature","MediaQuery","MediaQueryList","Nth","nth","Operator","Percentage","PseudoClassSelector","PseudoElementSelector","consumeRaw","TypeSelector","UnicodeRange","mediaQueryList","mediaQuery","selectorList","declarationList","localeCompare","inplace","csstree","list","priority","hasSynced","styleAttr","styleValue","addStyleHandler","getStyleAttr","setStyleAttr","addStyleValueHandler","getStyleValue","setStyleValue","getCssText","_loadCssText","csstools","csstreeToStyleDeclaration","setProperty","getProperties","_handleParseError","_getProperty","getPropertyPriority","getPropertyValue","removeProperty","sax","SAX","ondoctype","onprocessinginstruction","processinginstruction","oncomment","oncdata","onopentag","ontext","onclosetag","EOL","tmpdir","tmpDir","networkInterfaces","getNetworkInterfaces","cpus","totalmem","freemem","loadavg","endianness","animation","descriptive","shape","structural","paintServer","nonRendering","container","textContent","textContentChild","lightSource","filterPrimitive","animationAddition","animationAttributeTarget","animationEvent","animationTiming","animationValue","conditionalProcessing","core","graphicalEvent","presentation","xlink","documentEvent","transferFunction","y","clip","opacity","stroke","display","visibility","kerning","direction","slope","intercept","amplitude","exponent","attrsGroups","defaults","target","contentGroups","altGlyph","altGlyphDef","altGlyphItem","animate","animateColor","animateMotion","animateTransform","circle","cx","cy","clipPath","clipPathUnits","defs","desc","ellipse","feBlend","mode","feColorMatrix","feComponentTransfer","feComposite","operator","k1","k2","k3","k4","feConvolveMatrix","order","edgeMode","preserveAlpha","feDiffuseLighting","surfaceScale","diffuseConstant","feDisplacementMap","scale","xChannelSelector","yChannelSelector","feDistantLight","azimuth","elevation","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","stdDeviation","feImage","preserveAspectRatio","feMerge","feMergeNode","feMorphology","feOffset","dx","dy","fePointLight","z","feSpecularLighting","specularConstant","specularExponent","feSpotLight","pointsAtX","pointsAtY","pointsAtZ","feTile","feTurbulence","baseFrequency","numOctaves","stitchTiles","primitiveUnits","font","foreignObject","g","glyph","glyphRef","hatch","hatchUnits","hatchContentUnits","pitch","rotate","hatchPath","hkern","x1","y1","x2","y2","linearGradient","spreadMethod","marker","markerUnits","refX","refY","markerWidth","markerHeight","maskUnits","maskContentUnits","metadata","mpath","pattern","patternUnits","patternContentUnits","polygon","polyline","radialGradient","gradientUnits","r","meshGradient","meshRow","meshPatch","rect","solidColor","stop","svg","zoomAndPan","baseProfile","contentScriptType","contentStyleType","switch","symbol","lengthAdjust","textPath","method","spacing","tref","tspan","use","view","vkern","elemsGroups","doctypeStart","procInstStart","tagOpenStart","tagCloseStart","tagShortStart","attrStart","attrEnd","commentStart","cdataStart","textStart","regEntities","regValEntities","encodeEntity","entities","useShortTags","convert","createElem","createText","createDoctype","createProcInst","createComment","createCDATA","info","createIndent","createAttrs","editorNamespaces","allocateCursor","releaseCursor","forEachRight","prependList","createCustomError","AtKeyword","i","BACK_SLASH","isWhiteSpace","getNewlineLength","findWhiteSpaceStart","findEscapeEnd","NULL","STAR","SLASH","COMMERCIALAT","QUOTATIONMARK","MIN_BUFFER_SIZE","OFFSET_MASK","TYPE_SHIFT","tokenLayout","computeLinesAndColumns","forceBraces","decorate","generateGrammar","keywords","getVendorPrefix","tokenizerUtils","tokenizerConst","zeroUnitlessDimension","astNode","nextNonWsCode","AMPERSAND","leave","decorator","result","MATCH","MISMATCH","DISALLOW_EMPTY","testNode","matchAsList","matchAsTree","matchGraph","getTotalIterationCount","processStructure","require$$3","cssWideKeywords","cssWideKeywordsWithExpression","dumpMapSyntax","onParseErrorThrow","getFirstListNode","getLastListNode","processConfig","trackNodes","ensureFunction","checkTokenIsInteger","ATKEYWORD","isDeclarationBlockAtrule","EQUALSSIGN","CIRCUMFLEXACCENT","getAttributeName","getOperator","getImportant","readUnit","consumeHexSequence","eatIdentifierOrAsterisk","scanUnicodeRange","BACKSLASH","merge","buildIndex","scopes","handlers","packNumber","pack","compressFunction","toHex","compressIdent","compressHex","compressKeyframes","require$$9","getValueSequence","special","canOverride","top","bottom","getValue","lastShortSelector","processRule","mergeAtrule","initialMergeRuleset","disjoinRuleset","restructShorthand","restructBlock","mergeRuleset","restructRuleset","usageUtils","minify","minifyBlock","compress","referencesProps","leadingZero","removeLeadingZero","cm","mm","in","pt","pc","regNumericValues","absoluteLengths","elems","collections","attrsGroupsDefaults","styleOrScript","none","pathElems","attrsInheritable","rad","deg","atan","maxY","maxX","minY","minX","NEGATIVE_INFINITY","POSITIVE_INFINITY","transform2js","transformsMultiply","transformArc","pathJS","H","V","M","L","T","Q","S","C","A","h","v","m","l","t","s","applyTransformsStroked","minx","miny","maxx","maxy","path2js","js2path","applyTransforms","intersects","removeDoctype","removeXMLProcInst","removeComments","removeMetadata","removeXMLNS","removeEditorsNSData","additionalNamespaces","cleanupAttrs","newlines","spaces","inlineStyles","onlyMatchedOnce","removeMatchedSelectors","useMqs","usePseudos","getCssStr","styleEl","cssAst","flattenToSelectors","filterByMqs","filterByPseudos","cleanPseudos","sortSelectors","selectedEls","setCssStr","minifyStyles","csso","convertStyleToAttrs","cleanupIDs","preserve","removeRasterImages","removeUselessDefs","cleanupNumericValues","defaultPx","convertToPx","cleanupListOfValues","points","viewBox","convertColors","currentColor","names2hex","rgb2hex","shorthex","shortname","colorsProps","colorsNames","colorsShortNames","removeUnknownsAndDefaults","unknownContent","unknownAttrs","defaultAttrs","uselessOverrides","keepDataAttrs","keepAriaAttrs","removeNonInheritableGroupAttrs","removeUselessStrokeAndFill","removeNone","hasStyleOrScript","removeViewBox","cleanupEnableBackground","removeHiddenElems","displayNone","opacity0","circleR0","ellipseRX0","ellipseRY0","rectWidth0","rectHeight0","patternWidth0","patternHeight0","imageWidth0","imageHeight0","pathEmptyD","polylineEmptyPoints","polygonEmptyPoints","removeEmptyText","convertShapeToPath","convertArcs","moveElemsAttrsToGroup","moveGroupAttrsToElems","collapseGroups","convertPathData","threshold","tolerance","utilizeAbsolute","removeEmptyAttrs","removeEmptyContainers","mergePaths","removeUnusedNS","sortAttrs","removeTitle","removeDesc","removeAny","removeDimensions","removeStyleElement","removeScriptElement","load","settings","nextPass","onmessage","postMessage"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvZXZlbnRzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9wcm9jZXNzLWVzNi9icm93c2VyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtYnVpbHRpbnMvc3JjL2VzNi91dGlsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2Jhc2U2NC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvYnVmZmVyLWVzNi9pZWVlNzU0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtYnVpbHRpbnMvc3JjL2VzNi9yZWFkYWJsZS1zdHJlYW0vYnVmZmVyLWxpc3QuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9zcmMvZXM2L3N0cmluZy1kZWNvZGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtYnVpbHRpbnMvc3JjL2VzNi9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9zcmMvZXM2L3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvcmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvcmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvcmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtYnVpbHRpbnMvc3JjL2VzNi9zdHJlYW0uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9lbmNvZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9kZWNvZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2RvbXV0aWxzL2xpYi9zdHJpbmdpZnkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2RvbXV0aWxzL2xpYi9xdWVyeWluZy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXdoYXQvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy1zZWxlY3QvbGliL3NvcnQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy1zZWxlY3QvbGliL3BzZXVkb3MuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy1zZWxlY3QvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy1zZWxlY3QtYmFzZS1hZGFwdGVyL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvdXRpbHMvbGlzdC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3Rva2VuaXplci9lcnJvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3Rva2VuaXplci91dGlscy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3Rva2VuaXplci9Ub2tlbml6ZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9ncmFtbWFyL3RyYW5zbGF0ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL2xleGVyL2Vycm9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvdXRpbHMvbmFtZXMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9nZW5lcmljLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvZ3JhbW1hci9wYXJzZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL2xleGVyL21hdGNoLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvdHJhY2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9zZWFyY2guanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9zdHJ1Y3R1cmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9MZXhlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3BhcnNlci9jcmVhdGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC12bHEuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2FycmF5LXNldC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvbWFwcGluZy1saXN0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvcXVpY2stc29ydC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW5vZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9nZW5lcmF0b3IvY3JlYXRlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvd2Fsa2VyL2NyZWF0ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9jb25maWcvbWl4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2NyZWF0ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvZGF0YS9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0FuUGx1c0IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9BdHJ1bGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9BdHRyaWJ1dGVTZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0Jsb2NrLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvRGVjbGFyYXRpb24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9EZWNsYXJhdGlvbkxpc3QuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9EaW1lbnNpb24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9IZXhDb2xvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1JhdGlvLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvUnVsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1N0eWxlU2hlZXQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9UeXBlU2VsZWN0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9Vbmljb2RlUmFuZ2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9WYWx1ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9hdHJ1bGUvc3VwcG9ydHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vbGliL2Nzcy10b29scy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvb3MuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vbGliL3N2Z28vanMyc3ZnLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL2xpYi9zdmdvL3BsdWdpbnMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi91dGlscy9saXN0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvdG9rZW5pemVyL2Vycm9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvdG9rZW5pemVyL3V0aWxzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvdG9rZW5pemVyL1Rva2VuaXplci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL2xleGVyL2dyYW1tYXIvZ2VuZXJhdGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9lcnJvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3V0aWxzL25hbWVzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvZ2VuZXJpYy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL2xleGVyL2dyYW1tYXIvcGFyc2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9ncmFtbWFyL3dhbGsuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9tYXRjaC1ncmFwaC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL2xleGVyL21hdGNoLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvdHJhY2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9zZWFyY2guanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9zdHJ1Y3R1cmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9MZXhlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3BhcnNlci9jcmVhdGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9nZW5lcmF0b3IvY3JlYXRlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvd2Fsa2VyL2NyZWF0ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9jb25maWcvbWl4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2NyZWF0ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvZGF0YS9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0FuUGx1c0IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9BdHJ1bGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9BdHRyaWJ1dGVTZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0Jsb2NrLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvRGVjbGFyYXRpb24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9EZWNsYXJhdGlvbkxpc3QuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9EaW1lbnNpb24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9IZXhDb2xvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1JhdGlvLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvUnVsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1N0eWxlU2hlZXQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9UeXBlU2VsZWN0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9Vbmljb2RlUmFuZ2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvYXRydWxlL3N1cHBvcnRzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi91c2FnZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvY2xlYW4vUnVsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVwbGFjZS9BdHRyaWJ1dGVTZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVwbGFjZS9wcm9wZXJ0eS9ib3JkZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL3JlcGxhY2UvTnVtYmVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXBsYWNlL2NvbG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXN0cnVjdHVyZS9wcmVwYXJlL2NyZWF0ZURlY2xhcmF0aW9uSW5kZXhlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvMS1tZXJnZUF0cnVsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvdXRpbHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL3Jlc3RydWN0dXJlLzItaW5pdGlhbE1lcmdlUnVsZXNldC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvMy1kaXNqb2luUnVsZXNldC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvNC1yZXN0cnVjdFNob3J0aGFuZC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvNi1yZXN0cnVjdEJsb2NrLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXN0cnVjdHVyZS83LW1lcmdlUnVsZXNldC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvOC1yZXN0cnVjdFJ1bGVzZXQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL2NvbXByZXNzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL21pbmlmeVN0eWxlcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL2NvbnZlcnRTdHlsZVRvQXR0cnMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9jbGVhbnVwSURzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlVXNlbGVzc0RlZnMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9jb252ZXJ0Q29sb3JzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvbW92ZUVsZW1zQXR0cnNUb0dyb3VwLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvY29sbGFwc2VHcm91cHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9jb252ZXJ0UGF0aERhdGEuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9jb252ZXJ0VHJhbnNmb3JtLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL3NyYy9qcy9zdmdvLXdvcmtlci9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL190cmFuc2Zvcm1zLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2lzTmFOLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zYXgvbGliL3NheC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9zcmMvanMvdXRpbHMvbm9kZS1nbG9iYWxzL2dsb2JhbC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvaW5oZXJpdHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaXNBcnJheS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZG9tZWxlbWVudHR5cGUvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2RvbS1zZXJpYWxpemVyL25vZGVfbW9kdWxlcy9kb21lbGVtZW50dHlwZS9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2RlY29kZV9jb2RlcG9pbnQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2VudGl0aWVzL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9kb20tc2VyaWFsaXplci9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZG9tdXRpbHMvbGliL3RyYXZlcnNhbC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZG9tdXRpbHMvbGliL21hbmlwdWxhdGlvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZG9tdXRpbHMvbGliL2xlZ2FjeS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZG9tdXRpbHMvbGliL2hlbHBlcnMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2RvbXV0aWxzL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9ib29sYmFzZS9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC9saWIvYXR0cmlidXRlcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXNlbGVjdC9saWIvZ2VuZXJhbC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvbnRoLWNoZWNrL3BhcnNlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9udGgtY2hlY2svY29tcGlsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvbnRoLWNoZWNrL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3Mtc2VsZWN0L2xpYi9jb21waWxlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL2xpYi9zdmdvL2Nzcy1zZWxlY3QtYWRhcHRlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9saWIvc3Znby9qc0FQSS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaXNBcmd1bWVudHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9mb3JlYWNoL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvaGFzL3NyYy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvZXMtdG8tcHJpbWl0aXZlL2hlbHBlcnMvaXNQcmltaXRpdmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2lzLWNhbGxhYmxlL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9pcy1kYXRlLW9iamVjdC9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvaXMtc3ltYm9sL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXM2LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9HZXRJbnRyaW5zaWMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvaXNGaW5pdGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvYXNzaWduLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL3NpZ24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvbW9kLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2lzUHJpbWl0aXZlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXM1LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9lczUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2lzLXJlZ2V4L2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9lczIwMTUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2VzMjAxNi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvb2JqZWN0LnZhbHVlcy9pbXBsZW1lbnRhdGlvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvb2JqZWN0LnZhbHVlcy9wb2x5ZmlsbC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvb2JqZWN0LnZhbHVlcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvb2JqZWN0LnZhbHVlcy9zaGltLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL2xpYi9zdmdvL2Nzcy1jbGFzcy1saXN0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvdXRpbHMvY3JlYXRlQ3VzdG9tRXJyb3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi90b2tlbml6ZXIvY29uc3QuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9sZXhlci9ncmFtbWFyL2Vycm9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvZ3JhbW1hci93YWxrLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvZ3JhbW1hci9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3BhcnNlci9zZXF1ZW5jZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmFzZTY0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi91dGlsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9iaW5hcnktc2VhcmNoLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL3NvdXJjZS1tYXAuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9nZW5lcmF0b3Ivc291cmNlTWFwLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvY29udmVydG9yL2NyZWF0ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3V0aWxzL2Nsb25lLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvQnJhY2tldHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9DREMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9DRE8uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9DbGFzc1NlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvQ29tYmluYXRvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0NvbW1lbnQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9GdW5jdGlvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0lkZW50aWZpZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9JZFNlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvTWVkaWFGZWF0dXJlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvTWVkaWFRdWVyeS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL01lZGlhUXVlcnlMaXN0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvTnVtYmVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvT3BlcmF0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9QYXJlbnRoZXNlcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1BlcmNlbnRhZ2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9Qc2V1ZG9DbGFzc1NlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvUHNldWRvRWxlbWVudFNlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvUmF3LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvU2VsZWN0b3JMaXN0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvU3RyaW5nLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvVXJsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvV2hpdGVTcGFjZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvQXRydWxlUHJlbHVkZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL050aC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1NlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2NvbmZpZy9sZXhlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9zY29wZS9kZWZhdWx0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3Njb3BlL3NlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2Z1bmN0aW9uL2VsZW1lbnQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvZnVuY3Rpb24vdmFyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2F0cnVsZS9pbXBvcnQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvcHNldWRvL2NvbW1vbi9zZWxlY3Rvckxpc3QuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvcHNldWRvL2NvbW1vbi9udGhXaXRoT2ZDbGF1c2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvcHNldWRvL2NvbW1vbi9udGguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvY29uZmlnL3BhcnNlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9zY29wZS9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9zY29wZS9hdHJ1bGVQcmVsdWRlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3Njb3BlL3ZhbHVlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2Z1bmN0aW9uL2V4cHJlc3Npb24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvYXRydWxlL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2F0cnVsZS9mb250LWZhY2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvYXRydWxlL21lZGlhLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L2F0cnVsZS9wYWdlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3BzZXVkby9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9wc2V1ZG8vZGlyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3BzZXVkby9oYXMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvcHNldWRvL2xhbmcuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvcHNldWRvL3Nsb3R0ZWQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvY29uZmlnL3dhbGtlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3RhYmxlL3N0YWJsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvcHJlcGFyZS9zcGVjaWZpY2l0eS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9saWIvc3Znby9jc3Mtc3R5bGUtZGVjbGFyYXRpb24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vbGliL3N2Z28vc3ZnMmpzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvX2NvbGxlY3Rpb25zLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlRWRpdG9yc05TRGF0YS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL2NsZWFudXBBdHRycy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3V0aWxzL2NyZWF0ZUN1c3RvbUVycm9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvdG9rZW5pemVyL2NvbnN0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvZ3JhbW1hci9lcnJvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL2xleGVyL2dyYW1tYXIvdG9rZW5pemVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvbGV4ZXIvYXN0LXRvLXRva2Vucy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL2xleGVyL2dyYW1tYXIvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9wYXJzZXIvc2VxdWVuY2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9nZW5lcmF0b3Ivc291cmNlTWFwLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvY29udmVydG9yL2NyZWF0ZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3V0aWxzL2Nsb25lLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvQXRydWxlUHJlbHVkZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0JyYWNrZXRzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvQ0RDLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvQ0RPLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvQ2xhc3NTZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL0NvbWJpbmF0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9Db21tZW50LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvRnVuY3Rpb24uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9JZGVudGlmaWVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvSWRTZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL01lZGlhRmVhdHVyZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL01lZGlhUXVlcnkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9NZWRpYVF1ZXJ5TGlzdC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL051bWJlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL09wZXJhdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvUGFyZW50aGVzZXMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9QZXJjZW50YWdlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvUHNldWRvQ2xhc3NTZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1BzZXVkb0VsZW1lbnRTZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1Jhdy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1NlbGVjdG9yTGlzdC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1N0cmluZy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1VybC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1doaXRlU3BhY2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvbm9kZS9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL050aC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9ub2RlL1NlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L25vZGUvVmFsdWUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvY29uZmlnL2xleGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3Njb3BlL2RlZmF1bHQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvc2NvcGUvc2VsZWN0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvZnVuY3Rpb24vZWxlbWVudC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9mdW5jdGlvbi92YXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvYXRydWxlL2ltcG9ydC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9wc2V1ZG8vY29tbW9uL3NlbGVjdG9yTGlzdC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9wc2V1ZG8vY29tbW9uL250aFdpdGhPZkNsYXVzZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9wc2V1ZG8vY29tbW9uL250aC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9jb25maWcvcGFyc2VyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3Njb3BlL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3Njb3BlL2F0cnVsZVByZWx1ZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvc2NvcGUvdmFsdWUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvZnVuY3Rpb24vZXhwcmVzc2lvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9hdHJ1bGUvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvYXRydWxlL2ZvbnQtZmFjZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9hdHJ1bGUvbWVkaWEuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvYXRydWxlL3BhZ2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvcHNldWRvL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL25vZGVfbW9kdWxlcy9jc3MtdHJlZS9saWIvc3ludGF4L3BzZXVkby9kaXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbm9kZV9tb2R1bGVzL2Nzcy10cmVlL2xpYi9zeW50YXgvcHNldWRvL2hhcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9wc2V1ZG8vbGFuZy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9wc2V1ZG8vc2xvdHRlZC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9ub2RlX21vZHVsZXMvY3NzLXRyZWUvbGliL3N5bnRheC9jb25maWcvd2Fsa2VyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9jbGVhbi9BdHJ1bGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL2NsZWFuL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9jbGVhbi9EZWNsYXJhdGlvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvY2xlYW4vVHlwZVNlbGVjdG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9jbGVhbi9Db21tZW50LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9jbGVhbi9PcGVyYXRvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvY2xlYW4vV2hpdGVTcGFjZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVwbGFjZS9hdHJ1bGUva2V5ZnJhbWVzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXBsYWNlL0F0cnVsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVwbGFjZS9wcm9wZXJ0eS9iYWNrZ3JvdW5kLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXBsYWNlL1ZhbHVlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXBsYWNlL3Byb3BlcnR5L2ZvbnQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL3JlcGxhY2UvcHJvcGVydHkvZm9udC13ZWlnaHQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL3JlcGxhY2UvRGltZW5zaW9uLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXBsYWNlL1BlcmNlbnRhZ2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL3JlcGxhY2UvVXJsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXBsYWNlL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9jc3NvL2xpYi9yZXBsYWNlL1N0cmluZy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvY3Nzby9saWIvcmVzdHJ1Y3R1cmUvcHJlcGFyZS9wcm9jZXNzU2VsZWN0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL3Jlc3RydWN0dXJlL3ByZXBhcmUvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL2Nzc28vbGliL3Jlc3RydWN0dXJlL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL2xpYi9zdmdvL3Rvb2xzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvY2xlYW51cE51bWVyaWNWYWx1ZXMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9jbGVhbnVwTGlzdE9mVmFsdWVzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlVW5rbm93bnNBbmREZWZhdWx0cy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL3JlbW92ZU5vbkluaGVyaXRhYmxlR3JvdXBBdHRycy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL3JlbW92ZVVzZWxlc3NTdHJva2VBbmRGaWxsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlVmlld0JveC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL3JlbW92ZUhpZGRlbkVsZW1zLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvY29udmVydFNoYXBlVG9QYXRoLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvbW92ZUdyb3VwQXR0cnNUb0VsZW1zLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvX3BhdGguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9yZW1vdmVFbXB0eUNvbnRhaW5lcnMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9tZXJnZVBhdGhzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlRGVzYy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL3JlbW92ZURvY3R5cGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9yZW1vdmVYTUxQcm9jSW5zdC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL3JlbW92ZUNvbW1lbnRzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlTWV0YWRhdGEuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9yZW1vdmVYTUxOUy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL2lubGluZVN0eWxlcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL3JlbW92ZVJhc3RlckltYWdlcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL2NsZWFudXBFbmFibGVCYWNrZ3JvdW5kLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlRW1wdHlUZXh0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlRW1wdHlBdHRycy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9qYWtlYXJjaGliYWxkL3N2Z29tZy9ub2RlX21vZHVsZXMvc3Znby9wbHVnaW5zL3JlbW92ZVVudXNlZE5TLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvc29ydEF0dHJzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlVGl0bGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvamFrZWFyY2hpYmFsZC9zdmdvbWcvbm9kZV9tb2R1bGVzL3N2Z28vcGx1Z2lucy9yZW1vdmVEaW1lbnNpb25zLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlU3R5bGVFbGVtZW50LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2pha2VhcmNoaWJhbGQvc3Znb21nL25vZGVfbW9kdWxlcy9zdmdvL3BsdWdpbnMvcmVtb3ZlU2NyaXB0RWxlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBkb21haW47XG5cbi8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBzdG9yZSBldmVudCBoYW5kbGVycy4gSW5zdGFudGlhdGluZyB0aGlzIGlzXG4vLyBmYXN0ZXIgdGhhbiBleHBsaWNpdGx5IGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIHRvIGdldCBhIFwiY2xlYW5cIiBlbXB0eVxuLy8gb2JqZWN0ICh0ZXN0ZWQgd2l0aCB2OCB2NC45KS5cbmZ1bmN0aW9uIEV2ZW50SGFuZGxlcnMoKSB7fVxuRXZlbnRIYW5kbGVycy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5leHBvcnQgZGVmYXVsdCBFdmVudEVtaXR0ZXI7XG5leHBvcnQge0V2ZW50RW1pdHRlcn07XG5cbi8vIG5vZGVqcyBvZGRpdHlcbi8vIHJlcXVpcmUoJ2V2ZW50cycpID09PSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXJcblxuRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucyA9IGZhbHNlO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmRvbWFpbiA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kb21haW4gPSBudWxsO1xuICBpZiAoRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucykge1xuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkb21haW4sIHRoZW4gYXR0YWNoIHRvIGl0LlxuICAgIGlmIChkb21haW4uYWN0aXZlICYmICEodGhpcyBpbnN0YW5jZW9mIGRvbWFpbi5Eb21haW4pKSB7XG4gICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbi5hY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJuXCIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uICRnZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuICRnZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG4vLyBUaGVzZSBzdGFuZGFsb25lIGVtaXQqIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBjYWxsaW5nIG9mIGV2ZW50XG4vLyBoYW5kbGVycyBmb3IgZmFzdCBjYXNlcyBiZWNhdXNlIGVtaXQoKSBpdHNlbGYgb2Z0ZW4gaGFzIGEgdmFyaWFibGUgbnVtYmVyIG9mXG4vLyBhcmd1bWVudHMgYW5kIGNhbiBiZSBkZW9wdGltaXplZCBiZWNhdXNlIG9mIHRoYXQuIFRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgaGF2ZVxuLy8gdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgdGh1cyBkbyBub3QgZ2V0IGRlb3B0aW1pemVkLCBzbyB0aGUgY29kZVxuLy8gaW5zaWRlIHRoZW0gY2FuIGV4ZWN1dGUgZmFzdGVyLlxuZnVuY3Rpb24gZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgc2VsZikge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZik7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmKTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdE9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEpO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZ3MpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGV2ZW50cywgZG9tYWluO1xuICB2YXIgbmVlZERvbWFpbkV4aXQgPSBmYWxzZTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT0gbnVsbCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBkb21haW4gPSB0aGlzLmRvbWFpbjtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgaWYgKGRvbWFpbikge1xuICAgICAgaWYgKCFlcilcbiAgICAgICAgZXIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQnKTtcbiAgICAgIGVyLmRvbWFpbkVtaXR0ZXIgPSB0aGlzO1xuICAgICAgZXIuZG9tYWluID0gZG9tYWluO1xuICAgICAgZXIuZG9tYWluVGhyb3duID0gZmFsc2U7XG4gICAgICBkb21haW4uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmICghaGFuZGxlcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGlzRm4gPSB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJztcbiAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgc3dpdGNoIChsZW4pIHtcbiAgICAvLyBmYXN0IGNhc2VzXG4gICAgY2FzZSAxOlxuICAgICAgZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgdGhpcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSwgYXJndW1lbnRzWzNdKTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIHNsb3dlclxuICAgIGRlZmF1bHQ6XG4gICAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgaWYgKG5lZWREb21haW5FeGl0KVxuICAgIGRvbWFpbi5leGl0KCk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKCFleGlzdGluZykge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBpZiAoIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICAgIGlmIChtICYmIG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0pIHtcbiAgICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgdHlwZSArICcgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgICAgZW1pdFdhcm5pbmcodyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGVtaXRXYXJuaW5nKGUpIHtcbiAgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnNvbGUud2FybihlKSA6IGNvbnNvbGUubG9nKGUpO1xufVxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgZmlyZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHJldHVybiBnO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmICghZXZlbnRzKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmICghbGlzdClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCAobGlzdC5saXN0ZW5lciAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGxpc3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cztcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKCFldmVudHMpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoIWV2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGtleTsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBkbyB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfSB3aGlsZSAobGlzdGVuZXJzWzBdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICB2YXIgZXZsaXN0ZW5lcjtcbiAgdmFyIHJldDtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoIWV2ZW50cylcbiAgICByZXQgPSBbXTtcbiAgZWxzZSB7XG4gICAgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgICBpZiAoIWV2bGlzdGVuZXIpXG4gICAgICByZXQgPSBbXTtcbiAgICBlbHNlIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHJldCA9IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdO1xuICAgIGVsc2VcbiAgICAgIHJldCA9IHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbi8vIEFib3V0IDEuNXggZmFzdGVyIHRoYW4gdGhlIHR3by1hcmcgdmVyc2lvbiBvZiBBcnJheSNzcGxpY2UoKS5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpXG4gICAgbGlzdFtpXSA9IGxpc3Rba107XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBpKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG4vLyBiYXNlZCBvZmYgaHR0cHM6Ly9naXRodWIuY29tL2RlZnVuY3R6b21iaWUvbm9kZS1wcm9jZXNzL2Jsb2IvbWFzdGVyL2Jyb3dzZXIuanNcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG52YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbmlmICh0eXBlb2YgZ2xvYmFsLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbn1cbmlmICh0eXBlb2YgZ2xvYmFsLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbn1cblxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5leHRUaWNrKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59XG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xuZXhwb3J0IHZhciB0aXRsZSA9ICdicm93c2VyJztcbmV4cG9ydCB2YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG5leHBvcnQgdmFyIGJyb3dzZXIgPSB0cnVlO1xuZXhwb3J0IHZhciBlbnYgPSB7fTtcbmV4cG9ydCB2YXIgYXJndiA9IFtdO1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5leHBvcnQgdmFyIHZlcnNpb25zID0ge307XG5leHBvcnQgdmFyIHJlbGVhc2UgPSB7fTtcbmV4cG9ydCB2YXIgY29uZmlnID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgdmFyIG9uID0gbm9vcDtcbmV4cG9ydCB2YXIgYWRkTGlzdGVuZXIgPSBub29wO1xuZXhwb3J0IHZhciBvbmNlID0gbm9vcDtcbmV4cG9ydCB2YXIgb2ZmID0gbm9vcDtcbmV4cG9ydCB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuZXhwb3J0IHZhciByZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xuZXhwb3J0IHZhciBlbWl0ID0gbm9vcDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRpbmcobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN3ZCAoKSB7IHJldHVybiAnLycgfVxuZXhwb3J0IGZ1bmN0aW9uIGNoZGlyIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiB1bWFzaygpIHsgcmV0dXJuIDA7IH1cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20va3VtYXZpcy9icm93c2VyLXByb2Nlc3MtaHJ0aW1lL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG52YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwucGVyZm9ybWFuY2UgfHwge31cbnZhciBwZXJmb3JtYW5jZU5vdyA9XG4gIHBlcmZvcm1hbmNlLm5vdyAgICAgICAgfHxcbiAgcGVyZm9ybWFuY2UubW96Tm93ICAgICB8fFxuICBwZXJmb3JtYW5jZS5tc05vdyAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm9Ob3cgICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uud2Via2l0Tm93ICB8fFxuICBmdW5jdGlvbigpeyByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9XG5cbi8vIGdlbmVyYXRlIHRpbWVzdGFtcCBvciBkZWx0YVxuLy8gc2VlIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19wcm9jZXNzX2hydGltZVxuZXhwb3J0IGZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCl7XG4gIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSoxZS0zXG4gIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUpXG4gIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoKGNsb2NrdGltZSUxKSoxZTkpXG4gIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF1cbiAgICBuYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMV1cbiAgICBpZiAobmFub3NlY29uZHM8MCkge1xuICAgICAgc2Vjb25kcy0tXG4gICAgICBuYW5vc2Vjb25kcyArPSAxZTlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtzZWNvbmRzLG5hbm9zZWNvbmRzXVxufVxuXG52YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbmV4cG9ydCBmdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG4gIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgcmV0dXJuIGRpZiAvIDEwMDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmV4dFRpY2s6IG5leHRUaWNrLFxuICB0aXRsZTogdGl0bGUsXG4gIGJyb3dzZXI6IGJyb3dzZXIsXG4gIGVudjogZW52LFxuICBhcmd2OiBhcmd2LFxuICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICB2ZXJzaW9uczogdmVyc2lvbnMsXG4gIG9uOiBvbixcbiAgYWRkTGlzdGVuZXI6IGFkZExpc3RlbmVyLFxuICBvbmNlOiBvbmNlLFxuICBvZmY6IG9mZixcbiAgcmVtb3ZlTGlzdGVuZXI6IHJlbW92ZUxpc3RlbmVyLFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IHJlbW92ZUFsbExpc3RlbmVycyxcbiAgZW1pdDogZW1pdCxcbiAgYmluZGluZzogYmluZGluZyxcbiAgY3dkOiBjd2QsXG4gIGNoZGlyOiBjaGRpcixcbiAgdW1hc2s6IHVtYXNrLFxuICBocnRpbWU6IGhydGltZSxcbiAgcGxhdGZvcm06IHBsYXRmb3JtLFxuICByZWxlYXNlOiByZWxlYXNlLFxuICBjb25maWc6IGNvbmZpZyxcbiAgdXB0aW1lOiB1cHRpbWVcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0IGZ1bmN0aW9uIGRlcHJlY2F0ZShmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnbG9nKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IDA7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBpbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J1ZmZlcihtYXliZUJ1Zikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG1heWJlQnVmKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0IGZ1bmN0aW9uIGxvZygpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xufVxuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5pbXBvcnQgaW5oZXJpdHMgZnJvbSAnLi9pbmhlcml0cyc7XG5leHBvcnQge2luaGVyaXRzfVxuXG5leHBvcnQgZnVuY3Rpb24gX2V4dGVuZChvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbmhlcml0czogaW5oZXJpdHMsXG4gIF9leHRlbmQ6IF9leHRlbmQsXG4gIGxvZzogbG9nLFxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gIGlzUHJpbWl0aXZlOiBpc1ByaW1pdGl2ZSxcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNFcnJvcjogaXNFcnJvcixcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzU3ltYm9sOiBpc1N5bWJvbCxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzTnVsbE9yVW5kZWZpbmVkOiBpc051bGxPclVuZGVmaW5lZCxcbiAgaXNOdWxsOiBpc051bGwsXG4gIGlzQm9vbGVhbjogaXNCb29sZWFuLFxuICBpc0FycmF5OiBpc0FycmF5LFxuICBpbnNwZWN0OiBpbnNwZWN0LFxuICBkZXByZWNhdGU6IGRlcHJlY2F0ZSxcbiAgZm9ybWF0OiBmb3JtYXQsXG4gIGRlYnVnbG9nOiBkZWJ1Z2xvZ1xufVxuIiwiXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxudmFyIGluaXRlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIGluaXRlZCA9IHRydWU7XG4gIHZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgbG9va3VwW2ldID0gY29kZVtpXVxuICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxuICB9XG5cbiAgcmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG4gIHJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICBpZiAoIWluaXRlZCkge1xuICAgIGluaXQoKTtcbiAgfVxuICB2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICBwbGFjZUhvbGRlcnMgPSBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwXG5cbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIGFyciA9IG5ldyBBcnIobGVuICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICB2YXIgTCA9IDBcblxuICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgaWYgKCFpbml0ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiXG5leHBvcnQgZnVuY3Rpb24gcmVhZCAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cblxuaW1wb3J0ICogYXMgYmFzZTY0IGZyb20gJy4vYmFzZTY0J1xuaW1wb3J0ICogYXMgaWVlZTc1NCBmcm9tICcuL2llZWU3NTQnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXknXG5cbmV4cG9ydCB2YXIgSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHRydWVcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xudmFyIF9rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5leHBvcnQge19rTWF4TGVuZ3RoIGFzIGtNYXhMZW5ndGh9O1xuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICByZXR1cm4gdHJ1ZTtcbiAgLy8gcm9sbHVwIGlzc3Vlc1xuICAvLyB0cnkge1xuICAvLyAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAvLyAgIGFyci5fX3Byb3RvX18gPSB7XG4gIC8vICAgICBfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLFxuICAvLyAgICAgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gIC8vICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gIC8vICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIC8vIH0gY2F0Y2ggKGUpIHtcbiAgLy8gICByZXR1cm4gZmFsc2VcbiAgLy8gfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgIC8vICAgdmFsdWU6IG51bGwsXG4gICAgLy8gICBjb25maWd1cmFibGU6IHRydWVcbiAgICAvLyB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuQnVmZmVyLmlzQnVmZmVyID0gaXNCdWZmZXI7XG5mdW5jdGlvbiBpbnRlcm5hbElzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYSkgfHwgIWludGVybmFsSXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoaW50ZXJuYWxJc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBJTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoaW50ZXJuYWxJc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBpbnRlcm5hbElzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cbi8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2Vcbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbmV4cG9ydCBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmICghIW9iai5faXNCdWZmZXIgfHwgaXNGYXN0QnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikpXG59XG5cbmZ1bmN0aW9uIGlzRmFzdEJ1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzRmFzdEJ1ZmZlcihvYmouc2xpY2UoMCwgMCkpXG59XG4iLCJpbXBvcnQge0J1ZmZlcn0gZnJvbSAnYnVmZmVyJztcblxuZXhwb3J0IGRlZmF1bHQgQnVmZmVyTGlzdDtcblxuZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgdGhpcy5oZWFkID0gbnVsbDtcbiAgdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgdGhpcy50YWlsID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiB0aGlzLmhlYWQgfTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgdGhpcy5oZWFkID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gIC0tdGhpcy5sZW5ndGg7XG4gIHJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChzKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHJldCArPSBzICsgcC5kYXRhO1xuICB9cmV0dXJuIHJldDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gIHZhciBwID0gdGhpcy5oZWFkO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChwKSB7XG4gICAgcC5kYXRhLmNvcHkocmV0LCBpKTtcbiAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgcCA9IHAubmV4dDtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge0J1ZmZlcn0gZnJvbSAnYnVmZmVyJztcbnZhciBpc0J1ZmZlckVuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmdcbiAgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgIGNhc2UgJ2hleCc6IGNhc2UgJ3V0ZjgnOiBjYXNlICd1dGYtOCc6IGNhc2UgJ2FzY2lpJzogY2FzZSAnYmluYXJ5JzogY2FzZSAnYmFzZTY0JzogY2FzZSAndWNzMic6IGNhc2UgJ3Vjcy0yJzogY2FzZSAndXRmMTZsZSc6IGNhc2UgJ3V0Zi0xNmxlJzogY2FzZSAncmF3JzogcmV0dXJuIHRydWU7XG4gICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgICB9XG5cblxuZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgaWYgKGVuY29kaW5nICYmICFpc0J1ZmZlckVuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgfVxufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuIENFU1UtOCBpcyBoYW5kbGVkIGFzIHBhcnQgb2YgdGhlIFVURi04IGVuY29kaW5nLlxuLy9cbi8vIEBUT0RPIEhhbmRsaW5nIGFsbCBlbmNvZGluZ3MgaW5zaWRlIGEgc2luZ2xlIG9iamVjdCBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdFxuLy8gdG8gcmVhc29uIGFib3V0IHRoaXMgY29kZSwgc28gaXQgc2hvdWxkIGJlIHNwbGl0IHVwIGluIHRoZSBmdXR1cmUuXG4vLyBAVE9ETyBUaGVyZSBzaG91bGQgYmUgYSB1dGY4LXN0cmljdCBlbmNvZGluZyB0aGF0IHJlamVjdHMgaW52YWxpZCBVVEYtOCBjb2RlXG4vLyBwb2ludHMgYXMgdXNlZCBieSBDRVNVLTguXG5leHBvcnQgZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IHtpbmhlcml0cywgZGVidWdsb2d9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IEJ1ZmZlckxpc3QgZnJvbSAnLi9idWZmZXItbGlzdCc7XG5pbXBvcnQge1N0cmluZ0RlY29kZXJ9IGZyb20gJ3N0cmluZ19kZWNvZGVyJztcbmltcG9ydCB7RHVwbGV4fSBmcm9tICcuL2R1cGxleCc7XG5pbXBvcnQge25leHRUaWNrfSBmcm9tICdwcm9jZXNzJztcblxudmFyIGRlYnVnID0gZGVidWdsb2coJ3N0cmVhbScpO1xuaW5oZXJpdHMoUmVhZGFibGUsIEV2ZW50RW1pdHRlcik7XG5cbmZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4pIHtcbiAgLy8gU2FkbHkgdGhpcyBpcyBub3QgY2FjaGVhYmxlIGFzIHNvbWUgbGlicmFyaWVzIGJ1bmRsZSB0aGVpciBvd25cbiAgLy8gZXZlbnQgZW1pdHRlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZW0uXG4gIGlmICh0eXBlb2YgZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gICAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gICAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAgIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSlcbiAgICAgIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKVxuICAgICAgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtcbiAgICBlbHNlXG4gICAgICBlbWl0dGVyLl9ldmVudHNbZXZlbnRdID0gW2ZuLCBlbWl0dGVyLl9ldmVudHNbZXZlbnRdXTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCAoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBSZWFkYWJsZTtcbmV4cG9ydCBmdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIF9lID0gbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgX2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcEFkZDtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICBza2lwQWRkID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgY2h1bmsubGVuZ3RoID09PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBidWZmZXIgaWYgd2UndmUgZGVjb2RlZCB0byBhbiBlbXB0eSBzdHJpbmcgY2h1bmsgYW5kXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gb2JqZWN0IG1vZGVcbiAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgbmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIG5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSk7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBuZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAobGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBzcmMubGlzdGVuZXJzKCdkYXRhJykubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsZW47IF9pKyspIHtcbiAgICAgIGRlc3RzW19pXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaSA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaSA9PT0gLTEpIHJldHVybiB0aGlzO1xuXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpLCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIG5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBuZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICB2YXIgcmV0O1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0ID0gc3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZS5sZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGxpc3RcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYgKHN0YXRlLmJ1ZmZlci5sZW5ndGggPT09IDEpIHJldCA9IHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGE7ZWxzZSByZXQgPSBzdGF0ZS5idWZmZXIuY29uY2F0KHN0YXRlLmxlbmd0aCk7XG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3RcbiAgICByZXQgPSBmcm9tTGlzdFBhcnRpYWwobiwgc3RhdGUuYnVmZmVyLCBzdGF0ZS5kZWNvZGVyKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8vIEV4dHJhY3RzIG9ubHkgZW5vdWdoIGJ1ZmZlcmVkIGRhdGEgdG8gc2F0aXNmeSB0aGUgYW1vdW50IHJlcXVlc3RlZC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sIGxpc3QsIGhhc1N0cmluZ3MpIHtcbiAgdmFyIHJldDtcbiAgaWYgKG4gPCBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5nc1xuICAgIHJldCA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKDAsIG4pO1xuICAgIGxpc3QuaGVhZC5kYXRhID0gbGlzdC5oZWFkLmRhdGEuc2xpY2Uobik7XG4gIH0gZWxzZSBpZiAobiA9PT0gbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc3VsdCBzcGFucyBtb3JlIHRoYW4gb25lIGJ1ZmZlclxuICAgIHJldCA9IGhhc1N0cmluZ3MgPyBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSA6IGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGFcbi8vIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkge1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICB2YXIgcmV0ID0gcC5kYXRhO1xuICBuIC09IHJldC5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gc3RyLmxlbmd0aCA/IHN0ci5sZW5ndGggOiBuO1xuICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IHN0ci5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXIobiwgbGlzdCkge1xuICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICBwLmRhdGEuY29weShyZXQpO1xuICBuIC09IHAuZGF0YS5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIGJ1ZiA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGggOiBuO1xuICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgbmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG4iLCIvLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cblxuaW1wb3J0IHtpbmhlcml0cywgZGVwcmVjYXRlfSBmcm9tICd1dGlsJztcbmltcG9ydCB7QnVmZmVyfSBmcm9tICdidWZmZXInO1xuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7RHVwbGV4fSBmcm9tICcuL2R1cGxleCc7XG5pbXBvcnQge25leHRUaWNrfSBmcm9tICdwcm9jZXNzJztcbmluaGVyaXRzKFdyaXRhYmxlLCBFdmVudEVtaXR0ZXIpO1xuXG5mdW5jdGlvbiBub3AoKSB7fVxuXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYnVmZmVyJywge1xuICAgIGdldDogZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgfSk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod20gfHwgaHdtID09PSAwID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH4gfnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlO1xuICAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlO1xuICAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7XG5cbiAgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuICB0aGlzLmNvcmtlZCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gd3JpdGFibGVTdGF0ZUdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFdyaXRhYmxlO1xuZXhwb3J0IGZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBuZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIHZhciBlciA9IGZhbHNlO1xuICAvLyBBbHdheXMgdGhyb3cgZXJyb3IgaWYgYSBudWxsIGlzIHdyaXR0ZW5cbiAgLy8gaWYgd2UgYXJlIG5vdCBpbiBvYmplY3QgbW9kZSB0aGVuIHRocm93XG4gIC8vIGlmIGl0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBvciB1bmRlZmluZWQuXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nKTtcbiAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgbmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmICh2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO1xuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbmV3IFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG4gIGlmIChzeW5jKSBuZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICAgIG5leHRUaWNrKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgbmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuXG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBlbnRyeSA9IF90aGlzLmVudHJ5O1xuICAgIF90aGlzLmVudHJ5ID0gbnVsbDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgICBjYihlcnIpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlKSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IF90aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBfdGhpcztcbiAgICB9XG4gIH07XG59XG4iLCJcbmltcG9ydCB7aW5oZXJpdHN9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHtuZXh0VGlja30gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQge1JlYWRhYmxlfSBmcm9tICcuL3JlYWRhYmxlJztcbmltcG9ydCB7V3JpdGFibGV9IGZyb20gJy4vd3JpdGFibGUnO1xuXG5cbmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG52YXIga2V5cyA9IE9iamVjdC5rZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cbmV4cG9ydCBkZWZhdWx0IER1cGxleDtcbmV4cG9ydCBmdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBuZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG4iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cblxuaW1wb3J0IHtEdXBsZXh9IGZyb20gJy4vZHVwbGV4JztcblxuXG5pbXBvcnQge2luaGVyaXRzfSBmcm9tICd1dGlsJztcbmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKSBzdHJlYW0ucHVzaChkYXRhKTtcblxuICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgVHJhbnNmb3JtO1xuZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtcblxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKTtcblxuICAvLyB3aGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHZhciBzdHJlYW0gPSB0aGlzO1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICB0aGlzLm9uY2UoJ3ByZWZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaChmdW5jdGlvbiAoZXIpIHtcbiAgICAgIGRvbmUoc3RyZWFtLCBlcik7XG4gICAgfSk7ZWxzZSBkb25lKHN0cmVhbSk7XG4gIH0pO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRvbmUoc3RyZWFtLCBlcikge1xuICBpZiAoZXIpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHRzLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufVxuIiwiXG5pbXBvcnQge1RyYW5zZm9ybX0gZnJvbSAnLi90cmFuc2Zvcm0nO1xuXG5pbXBvcnQge2luaGVyaXRzfSBmcm9tICd1dGlsJztcbmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuZXhwb3J0IGRlZmF1bHQgUGFzc1Rocm91Z2g7XG5leHBvcnQgZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG4iLCJpbXBvcnQgRUUgZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7aW5oZXJpdHN9IGZyb20gJ3V0aWwnO1xuXG5pbXBvcnQge0R1cGxleH0gZnJvbSAnLi9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzJztcbmltcG9ydCB7UmVhZGFibGV9IGZyb20gJy4vcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzJztcbmltcG9ydCB7V3JpdGFibGV9IGZyb20gJy4vcmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzJztcbmltcG9ydCB7VHJhbnNmb3JtfSBmcm9tICcuL3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtQYXNzVGhyb3VnaH0gZnJvbSAnLi9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMnO1xuaW5oZXJpdHMoU3RyZWFtLCBFRSk7XG5TdHJlYW0uUmVhZGFibGUgPSBSZWFkYWJsZTtcblN0cmVhbS5Xcml0YWJsZSA9IFdyaXRhYmxlO1xuU3RyZWFtLkR1cGxleCA9IER1cGxleDtcblN0cmVhbS5UcmFuc2Zvcm0gPSBUcmFuc2Zvcm07XG5TdHJlYW0uUGFzc1Rocm91Z2ggPSBQYXNzVGhyb3VnaDtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC40LnhcblN0cmVhbS5TdHJlYW0gPSBTdHJlYW07XG5cbmV4cG9ydCBkZWZhdWx0IFN0cmVhbTtcbmV4cG9ydCB7UmVhZGFibGUsV3JpdGFibGUsRHVwbGV4LFRyYW5zZm9ybSxQYXNzVGhyb3VnaCxTdHJlYW19XG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCJ2YXIgaW52ZXJzZVhNTCA9IGdldEludmVyc2VPYmoocmVxdWlyZShcIi4uL21hcHMveG1sLmpzb25cIikpLFxuICAgIHhtbFJlcGxhY2VyID0gZ2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2VYTUwpO1xuXG5leHBvcnRzLlhNTCA9IGdldEludmVyc2UoaW52ZXJzZVhNTCwgeG1sUmVwbGFjZXIpO1xuXG52YXIgaW52ZXJzZUhUTUwgPSBnZXRJbnZlcnNlT2JqKHJlcXVpcmUoXCIuLi9tYXBzL2VudGl0aWVzLmpzb25cIikpLFxuICAgIGh0bWxSZXBsYWNlciA9IGdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlSFRNTCk7XG5cbmV4cG9ydHMuSFRNTCA9IGdldEludmVyc2UoaW52ZXJzZUhUTUwsIGh0bWxSZXBsYWNlcik7XG5cbmZ1bmN0aW9uIGdldEludmVyc2VPYmoob2JqKXtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG9iaikuc29ydCgpLnJlZHVjZShmdW5jdGlvbihpbnZlcnNlLCBuYW1lKXtcblx0XHRpbnZlcnNlW29ialtuYW1lXV0gPSBcIiZcIiArIG5hbWUgKyBcIjtcIjtcblx0XHRyZXR1cm4gaW52ZXJzZTtcblx0fSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZSl7XG5cdHZhciBzaW5nbGUgPSBbXSxcblx0ICAgIG11bHRpcGxlID0gW107XG5cblx0T2JqZWN0LmtleXMoaW52ZXJzZSkuZm9yRWFjaChmdW5jdGlvbihrKXtcblx0XHRpZihrLmxlbmd0aCA9PT0gMSl7XG5cdFx0XHRzaW5nbGUucHVzaChcIlxcXFxcIiArIGspO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtdWx0aXBsZS5wdXNoKGspO1xuXHRcdH1cblx0fSk7XG5cblx0Ly9UT0RPIGFkZCByYW5nZXNcblx0bXVsdGlwbGUudW5zaGlmdChcIltcIiArIHNpbmdsZS5qb2luKFwiXCIpICsgXCJdXCIpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKG11bHRpcGxlLmpvaW4oXCJ8XCIpLCBcImdcIik7XG59XG5cbnZhciByZV9ub25BU0NJSSA9IC9bXlxcMC1cXHg3Rl0vZyxcbiAgICByZV9hc3RyYWxTeW1ib2xzID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcblxuZnVuY3Rpb24gc2luZ2xlQ2hhclJlcGxhY2VyKGMpe1xuXHRyZXR1cm4gXCImI3hcIiArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiO1wiO1xufVxuXG5mdW5jdGlvbiBhc3RyYWxSZXBsYWNlcihjKXtcblx0Ly8gaHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcblx0dmFyIGhpZ2ggPSBjLmNoYXJDb2RlQXQoMCk7XG5cdHZhciBsb3cgID0gYy5jaGFyQ29kZUF0KDEpO1xuXHR2YXIgY29kZVBvaW50ID0gKGhpZ2ggLSAweEQ4MDApICogMHg0MDAgKyBsb3cgLSAweERDMDAgKyAweDEwMDAwO1xuXHRyZXR1cm4gXCImI3hcIiArIGNvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiO1wiO1xufVxuXG5mdW5jdGlvbiBnZXRJbnZlcnNlKGludmVyc2UsIHJlKXtcblx0ZnVuY3Rpb24gZnVuYyhuYW1lKXtcblx0XHRyZXR1cm4gaW52ZXJzZVtuYW1lXTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbihkYXRhKXtcblx0XHRyZXR1cm4gZGF0YVxuXHRcdFx0XHQucmVwbGFjZShyZSwgZnVuYylcblx0XHRcdFx0LnJlcGxhY2UocmVfYXN0cmFsU3ltYm9scywgYXN0cmFsUmVwbGFjZXIpXG5cdFx0XHRcdC5yZXBsYWNlKHJlX25vbkFTQ0lJLCBzaW5nbGVDaGFyUmVwbGFjZXIpO1xuXHR9O1xufVxuXG52YXIgcmVfeG1sQ2hhcnMgPSBnZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZVhNTCk7XG5cbmZ1bmN0aW9uIGVzY2FwZVhNTChkYXRhKXtcblx0cmV0dXJuIGRhdGFcblx0XHRcdC5yZXBsYWNlKHJlX3htbENoYXJzLCBzaW5nbGVDaGFyUmVwbGFjZXIpXG5cdFx0XHQucmVwbGFjZShyZV9hc3RyYWxTeW1ib2xzLCBhc3RyYWxSZXBsYWNlcilcblx0XHRcdC5yZXBsYWNlKHJlX25vbkFTQ0lJLCBzaW5nbGVDaGFyUmVwbGFjZXIpO1xufVxuXG5leHBvcnRzLmVzY2FwZSA9IGVzY2FwZVhNTDtcbiIsInZhciBlbnRpdHlNYXAgPSByZXF1aXJlKFwiLi4vbWFwcy9lbnRpdGllcy5qc29uXCIpLFxuICAgIGxlZ2FjeU1hcCA9IHJlcXVpcmUoXCIuLi9tYXBzL2xlZ2FjeS5qc29uXCIpLFxuICAgIHhtbE1hcCAgICA9IHJlcXVpcmUoXCIuLi9tYXBzL3htbC5qc29uXCIpLFxuICAgIGRlY29kZUNvZGVQb2ludCA9IHJlcXVpcmUoXCIuL2RlY29kZV9jb2RlcG9pbnQuanNcIik7XG5cbnZhciBkZWNvZGVYTUxTdHJpY3QgID0gZ2V0U3RyaWN0RGVjb2Rlcih4bWxNYXApLFxuICAgIGRlY29kZUhUTUxTdHJpY3QgPSBnZXRTdHJpY3REZWNvZGVyKGVudGl0eU1hcCk7XG5cbmZ1bmN0aW9uIGdldFN0cmljdERlY29kZXIobWFwKXtcblx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhtYXApLmpvaW4oXCJ8XCIpLFxuXHQgICAgcmVwbGFjZSA9IGdldFJlcGxhY2VyKG1hcCk7XG5cblx0a2V5cyArPSBcInwjW3hYXVtcXFxcZGEtZkEtRl0rfCNcXFxcZCtcIjtcblxuXHR2YXIgcmUgPSBuZXcgUmVnRXhwKFwiJig/OlwiICsga2V5cyArIFwiKTtcIiwgXCJnXCIpO1xuXG5cdHJldHVybiBmdW5jdGlvbihzdHIpe1xuXHRcdHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKHJlLCByZXBsYWNlKTtcblx0fTtcbn1cblxudmFyIGRlY29kZUhUTUwgPSAoZnVuY3Rpb24oKXtcblx0dmFyIGxlZ2FjeSA9IE9iamVjdC5rZXlzKGxlZ2FjeU1hcClcblx0XHQuc29ydChzb3J0ZXIpO1xuXG5cdHZhciBrZXlzID0gT2JqZWN0LmtleXMoZW50aXR5TWFwKVxuXHRcdC5zb3J0KHNvcnRlcik7XG5cblx0Zm9yKHZhciBpID0gMCwgaiA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcblx0XHRpZihsZWdhY3lbal0gPT09IGtleXNbaV0pe1xuXHRcdFx0a2V5c1tpXSArPSBcIjs/XCI7XG5cdFx0XHRqKys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtleXNbaV0gKz0gXCI7XCI7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHJlID0gbmV3IFJlZ0V4cChcIiYoPzpcIiArIGtleXMuam9pbihcInxcIikgKyBcInwjW3hYXVtcXFxcZGEtZkEtRl0rOz98I1xcXFxkKzs/KVwiLCBcImdcIiksXG5cdCAgICByZXBsYWNlID0gZ2V0UmVwbGFjZXIoZW50aXR5TWFwKTtcblxuXHRmdW5jdGlvbiByZXBsYWNlcihzdHIpe1xuXHRcdGlmKHN0ci5zdWJzdHIoLTEpICE9PSBcIjtcIikgc3RyICs9IFwiO1wiO1xuXHRcdHJldHVybiByZXBsYWNlKHN0cik7XG5cdH1cblxuXHQvL1RPRE8gY29uc2lkZXIgY3JlYXRpbmcgYSBtZXJnZWQgbWFwXG5cdHJldHVybiBmdW5jdGlvbihzdHIpe1xuXHRcdHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKHJlLCByZXBsYWNlcik7XG5cdH07XG59KCkpO1xuXG5mdW5jdGlvbiBzb3J0ZXIoYSwgYil7XG5cdHJldHVybiBhIDwgYiA/IDEgOiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVwbGFjZXIobWFwKXtcblx0cmV0dXJuIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyKXtcblx0XHRpZihzdHIuY2hhckF0KDEpID09PSBcIiNcIil7XG5cdFx0XHRpZihzdHIuY2hhckF0KDIpID09PSBcIlhcIiB8fCBzdHIuY2hhckF0KDIpID09PSBcInhcIil7XG5cdFx0XHRcdHJldHVybiBkZWNvZGVDb2RlUG9pbnQocGFyc2VJbnQoc3RyLnN1YnN0cigzKSwgMTYpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkZWNvZGVDb2RlUG9pbnQocGFyc2VJbnQoc3RyLnN1YnN0cigyKSwgMTApKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hcFtzdHIuc2xpY2UoMSwgLTEpXTtcblx0fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdFhNTDogZGVjb2RlWE1MU3RyaWN0LFxuXHRIVE1MOiBkZWNvZGVIVE1MLFxuXHRIVE1MU3RyaWN0OiBkZWNvZGVIVE1MU3RyaWN0XG59OyIsInZhciBFbGVtZW50VHlwZSA9IHJlcXVpcmUoXCJkb21lbGVtZW50dHlwZVwiKSxcbiAgICBnZXRPdXRlckhUTUwgPSByZXF1aXJlKFwiZG9tLXNlcmlhbGl6ZXJcIiksXG4gICAgaXNUYWcgPSBFbGVtZW50VHlwZS5pc1RhZztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGdldElubmVySFRNTDogZ2V0SW5uZXJIVE1MLFxuXHRnZXRPdXRlckhUTUw6IGdldE91dGVySFRNTCxcblx0Z2V0VGV4dDogZ2V0VGV4dFxufTtcblxuZnVuY3Rpb24gZ2V0SW5uZXJIVE1MKGVsZW0sIG9wdHMpe1xuXHRyZXR1cm4gZWxlbS5jaGlsZHJlbiA/IGVsZW0uY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGVsZW0pe1xuXHRcdHJldHVybiBnZXRPdXRlckhUTUwoZWxlbSwgb3B0cyk7XG5cdH0pLmpvaW4oXCJcIikgOiBcIlwiO1xufVxuXG5mdW5jdGlvbiBnZXRUZXh0KGVsZW0pe1xuXHRpZihBcnJheS5pc0FycmF5KGVsZW0pKSByZXR1cm4gZWxlbS5tYXAoZ2V0VGV4dCkuam9pbihcIlwiKTtcblx0aWYoaXNUYWcoZWxlbSkgfHwgZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5DREFUQSkgcmV0dXJuIGdldFRleHQoZWxlbS5jaGlsZHJlbik7XG5cdGlmKGVsZW0udHlwZSA9PT0gRWxlbWVudFR5cGUuVGV4dCkgcmV0dXJuIGVsZW0uZGF0YTtcblx0cmV0dXJuIFwiXCI7XG59XG4iLCJ2YXIgaXNUYWcgPSByZXF1aXJlKFwiZG9tZWxlbWVudHR5cGVcIikuaXNUYWc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRmaWx0ZXI6IGZpbHRlcixcblx0ZmluZDogZmluZCxcblx0ZmluZE9uZUNoaWxkOiBmaW5kT25lQ2hpbGQsXG5cdGZpbmRPbmU6IGZpbmRPbmUsXG5cdGV4aXN0c09uZTogZXhpc3RzT25lLFxuXHRmaW5kQWxsOiBmaW5kQWxsXG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIodGVzdCwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHRpZighQXJyYXkuaXNBcnJheShlbGVtZW50KSkgZWxlbWVudCA9IFtlbGVtZW50XTtcblxuXHRpZih0eXBlb2YgbGltaXQgIT09IFwibnVtYmVyXCIgfHwgIWlzRmluaXRlKGxpbWl0KSl7XG5cdFx0bGltaXQgPSBJbmZpbml0eTtcblx0fVxuXHRyZXR1cm4gZmluZCh0ZXN0LCBlbGVtZW50LCByZWN1cnNlICE9PSBmYWxzZSwgbGltaXQpO1xufVxuXG5mdW5jdGlvbiBmaW5kKHRlc3QsIGVsZW1zLCByZWN1cnNlLCBsaW1pdCl7XG5cdHZhciByZXN1bHQgPSBbXSwgY2hpbGRzO1xuXG5cdGZvcih2YXIgaSA9IDAsIGogPSBlbGVtcy5sZW5ndGg7IGkgPCBqOyBpKyspe1xuXHRcdGlmKHRlc3QoZWxlbXNbaV0pKXtcblx0XHRcdHJlc3VsdC5wdXNoKGVsZW1zW2ldKTtcblx0XHRcdGlmKC0tbGltaXQgPD0gMCkgYnJlYWs7XG5cdFx0fVxuXG5cdFx0Y2hpbGRzID0gZWxlbXNbaV0uY2hpbGRyZW47XG5cdFx0aWYocmVjdXJzZSAmJiBjaGlsZHMgJiYgY2hpbGRzLmxlbmd0aCA+IDApe1xuXHRcdFx0Y2hpbGRzID0gZmluZCh0ZXN0LCBjaGlsZHMsIHJlY3Vyc2UsIGxpbWl0KTtcblx0XHRcdHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoY2hpbGRzKTtcblx0XHRcdGxpbWl0IC09IGNoaWxkcy5sZW5ndGg7XG5cdFx0XHRpZihsaW1pdCA8PSAwKSBicmVhaztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmaW5kT25lQ2hpbGQodGVzdCwgZWxlbXMpe1xuXHRmb3IodmFyIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKXtcblx0XHRpZih0ZXN0KGVsZW1zW2ldKSkgcmV0dXJuIGVsZW1zW2ldO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRPbmUodGVzdCwgZWxlbXMpe1xuXHR2YXIgZWxlbSA9IG51bGw7XG5cblx0Zm9yKHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGwgJiYgIWVsZW07IGkrKyl7XG5cdFx0aWYoIWlzVGFnKGVsZW1zW2ldKSl7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9IGVsc2UgaWYodGVzdChlbGVtc1tpXSkpe1xuXHRcdFx0ZWxlbSA9IGVsZW1zW2ldO1xuXHRcdH0gZWxzZSBpZihlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGggPiAwKXtcblx0XHRcdGVsZW0gPSBmaW5kT25lKHRlc3QsIGVsZW1zW2ldLmNoaWxkcmVuKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gZXhpc3RzT25lKHRlc3QsIGVsZW1zKXtcblx0Zm9yKHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGw7IGkrKyl7XG5cdFx0aWYoXG5cdFx0XHRpc1RhZyhlbGVtc1tpXSkgJiYgKFxuXHRcdFx0XHR0ZXN0KGVsZW1zW2ldKSB8fCAoXG5cdFx0XHRcdFx0ZWxlbXNbaV0uY2hpbGRyZW4ubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdGV4aXN0c09uZSh0ZXN0LCBlbGVtc1tpXS5jaGlsZHJlbilcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdCl7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRBbGwodGVzdCwgZWxlbXMpe1xuXHR2YXIgcmVzdWx0ID0gW107XG5cdGZvcih2YXIgaSA9IDAsIGogPSBlbGVtcy5sZW5ndGg7IGkgPCBqOyBpKyspe1xuXHRcdGlmKCFpc1RhZyhlbGVtc1tpXSkpIGNvbnRpbnVlO1xuXHRcdGlmKHRlc3QoZWxlbXNbaV0pKSByZXN1bHQucHVzaChlbGVtc1tpXSk7XG5cblx0XHRpZihlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGggPiAwKXtcblx0XHRcdHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZmluZEFsbCh0ZXN0LCBlbGVtc1tpXS5jaGlsZHJlbikpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG5cbnZhciByZV9uYW1lID0gL14oPzpcXFxcLnxbXFx3XFwtXFx1MDBjMC1cXHVGRkZGXSkrLyxcbiAgICByZV9lc2NhcGUgPSAvXFxcXChbXFxkYS1mXXsxLDZ9XFxzP3woXFxzKXwuKS9pZyxcbiAgICAvL21vZGlmaWVkIHZlcnNpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvYmxvYi9tYXN0ZXIvc3JjL3NpenpsZS5qcyNMODdcbiAgICByZV9hdHRyID0gL15cXHMqKCg/OlxcXFwufFtcXHdcXHUwMGMwLVxcdUZGRkZcXC1dKSspXFxzKig/OihcXFM/KT1cXHMqKD86KFsnXCJdKSguKj8pXFwzfCgjPyg/OlxcXFwufFtcXHdcXHUwMGMwLVxcdUZGRkZcXC1dKSopfCl8KVxccyooaSk/XFxdLztcblxudmFyIGFjdGlvblR5cGVzID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwidW5kZWZpbmVkXCI6IFwiZXhpc3RzXCIsXG5cdFwiXCI6ICBcImVxdWFsc1wiLFxuXHRcIn5cIjogXCJlbGVtZW50XCIsXG5cdFwiXlwiOiBcInN0YXJ0XCIsXG5cdFwiJFwiOiBcImVuZFwiLFxuXHRcIipcIjogXCJhbnlcIixcblx0XCIhXCI6IFwibm90XCIsXG5cdFwifFwiOiBcImh5cGhlblwiXG59O1xuXG52YXIgc2ltcGxlU2VsZWN0b3JzID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiPlwiOiBcImNoaWxkXCIsXG5cdFwiPFwiOiBcInBhcmVudFwiLFxuXHRcIn5cIjogXCJzaWJsaW5nXCIsXG5cdFwiK1wiOiBcImFkamFjZW50XCJcbn07XG5cbnZhciBhdHRyaWJTZWxlY3RvcnMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCIjXCI6IFtcImlkXCIsIFwiZXF1YWxzXCJdLFxuXHRcIi5cIjogW1wiY2xhc3NcIiwgXCJlbGVtZW50XCJdXG59O1xuXG4vL3BzZXVkb3MsIHdob3NlIGRhdGEtcHJvcGVydHkgaXMgcGFyc2VkIGFzIHdlbGxcbnZhciB1bnBhY2tQc2V1ZG9zID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFwiaGFzXCI6IHRydWUsXG5cdFwibm90XCI6IHRydWUsXG5cdFwibWF0Y2hlc1wiOiB0cnVlXG59O1xuXG52YXIgc3RyaXBRdW90ZXNGcm9tUHNldWRvcyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRcImNvbnRhaW5zXCI6IHRydWUsXG5cdFwiaWNvbnRhaW5zXCI6IHRydWVcbn07XG5cbnZhciBxdW90ZXMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0XCJcXFwiXCI6IHRydWUsXG5cdFwiJ1wiOiB0cnVlXG59O1xuXG4vL3VuZXNjYXBlIGZ1bmN0aW9uIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvYmxvYi9tYXN0ZXIvc3JjL3NpenpsZS5qcyNMMTM5XG5mdW5jdGlvbiBmdW5lc2NhcGUoIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkge1xuXHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHQvLyBTdXBwb3J0OiBGaXJlZm94XG5cdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0ZXNjYXBlZCA6XG5cdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdGhpZ2ggPCAwID9cblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVDU1Moc3RyKXtcblx0cmV0dXJuIHN0ci5yZXBsYWNlKHJlX2VzY2FwZSwgZnVuZXNjYXBlKTtcbn1cblxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGMpe1xuXHRyZXR1cm4gYyA9PT0gXCIgXCIgfHwgYyA9PT0gXCJcXG5cIiB8fCBjID09PSBcIlxcdFwiIHx8IGMgPT09IFwiXFxmXCIgfHwgYyA9PT0gXCJcXHJcIjtcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc2VsZWN0b3IsIG9wdGlvbnMpe1xuXHR2YXIgc3Vic2VsZWN0cyA9IFtdO1xuXG5cdHNlbGVjdG9yID0gcGFyc2VTZWxlY3RvcihzdWJzZWxlY3RzLCBzZWxlY3RvciArIFwiXCIsIG9wdGlvbnMpO1xuXG5cdGlmKHNlbGVjdG9yICE9PSBcIlwiKXtcblx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJVbm1hdGNoZWQgc2VsZWN0b3I6IFwiICsgc2VsZWN0b3IpO1xuXHR9XG5cblx0cmV0dXJuIHN1YnNlbGVjdHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2VsZWN0b3Ioc3Vic2VsZWN0cywgc2VsZWN0b3IsIG9wdGlvbnMpe1xuXHR2YXIgdG9rZW5zID0gW10sXG5cdFx0c2F3V1MgPSBmYWxzZSxcblx0XHRkYXRhLCBmaXJzdENoYXIsIG5hbWUsIHF1b3Q7XG5cblx0ZnVuY3Rpb24gZ2V0TmFtZSgpe1xuXHRcdHZhciBzdWIgPSBzZWxlY3Rvci5tYXRjaChyZV9uYW1lKVswXTtcblx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihzdWIubGVuZ3RoKTtcblx0XHRyZXR1cm4gdW5lc2NhcGVDU1Moc3ViKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHN0cmlwV2hpdGVzcGFjZShzdGFydCl7XG5cdFx0d2hpbGUoaXNXaGl0ZXNwYWNlKHNlbGVjdG9yLmNoYXJBdChzdGFydCkpKSBzdGFydCsrO1xuXHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHN0YXJ0KTtcblx0fVxuXG5cdHN0cmlwV2hpdGVzcGFjZSgwKTtcblxuXHR3aGlsZShzZWxlY3RvciAhPT0gXCJcIil7XG5cdFx0Zmlyc3RDaGFyID0gc2VsZWN0b3IuY2hhckF0KDApO1xuXG5cdFx0aWYoaXNXaGl0ZXNwYWNlKGZpcnN0Q2hhcikpe1xuXHRcdFx0c2F3V1MgPSB0cnVlO1xuXHRcdFx0c3RyaXBXaGl0ZXNwYWNlKDEpO1xuXHRcdH0gZWxzZSBpZihmaXJzdENoYXIgaW4gc2ltcGxlU2VsZWN0b3JzKXtcblx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBzaW1wbGVTZWxlY3RvcnNbZmlyc3RDaGFyXX0pO1xuXHRcdFx0c2F3V1MgPSBmYWxzZTtcblxuXHRcdFx0c3RyaXBXaGl0ZXNwYWNlKDEpO1xuXHRcdH0gZWxzZSBpZihmaXJzdENoYXIgPT09IFwiLFwiKXtcblx0XHRcdGlmKHRva2Vucy5sZW5ndGggPT09IDApe1xuXHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJlbXB0eSBzdWItc2VsZWN0b3JcIik7XG5cdFx0XHR9XG5cdFx0XHRzdWJzZWxlY3RzLnB1c2godG9rZW5zKTtcblx0XHRcdHRva2VucyA9IFtdO1xuXHRcdFx0c2F3V1MgPSBmYWxzZTtcblx0XHRcdHN0cmlwV2hpdGVzcGFjZSgxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYoc2F3V1Mpe1xuXHRcdFx0XHRpZih0b2tlbnMubGVuZ3RoID4gMCl7XG5cdFx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFwiZGVzY2VuZGFudFwifSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2F3V1MgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYoZmlyc3RDaGFyID09PSBcIipcIil7XG5cdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7dHlwZTogXCJ1bml2ZXJzYWxcIn0pO1xuXHRcdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciBpbiBhdHRyaWJTZWxlY3RvcnMpe1xuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IFwiYXR0cmlidXRlXCIsXG5cdFx0XHRcdFx0bmFtZTogYXR0cmliU2VsZWN0b3JzW2ZpcnN0Q2hhcl1bMF0sXG5cdFx0XHRcdFx0YWN0aW9uOiBhdHRyaWJTZWxlY3RvcnNbZmlyc3RDaGFyXVsxXSxcblx0XHRcdFx0XHR2YWx1ZTogZ2V0TmFtZSgpLFxuXHRcdFx0XHRcdGlnbm9yZUNhc2U6IGZhbHNlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmKGZpcnN0Q2hhciA9PT0gXCJbXCIpe1xuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0ZGF0YSA9IHNlbGVjdG9yLm1hdGNoKHJlX2F0dHIpO1xuXHRcdFx0XHRpZighZGF0YSl7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKFwiTWFsZm9ybWVkIGF0dHJpYnV0ZSBzZWxlY3RvcjogXCIgKyBzZWxlY3Rvcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHIoZGF0YVswXS5sZW5ndGgpO1xuXHRcdFx0XHRuYW1lID0gdW5lc2NhcGVDU1MoZGF0YVsxXSk7XG5cblx0XHRcdFx0aWYoXG5cdFx0XHRcdFx0IW9wdGlvbnMgfHwgKFxuXHRcdFx0XHRcdFx0XCJsb3dlckNhc2VBdHRyaWJ1dGVOYW1lc1wiIGluIG9wdGlvbnMgP1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLmxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzIDpcblx0XHRcdFx0XHRcdFx0IW9wdGlvbnMueG1sTW9kZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KXtcblx0XHRcdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IFwiYXR0cmlidXRlXCIsXG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRhY3Rpb246IGFjdGlvblR5cGVzW2RhdGFbMl1dLFxuXHRcdFx0XHRcdHZhbHVlOiB1bmVzY2FwZUNTUyhkYXRhWzRdIHx8IGRhdGFbNV0gfHwgXCJcIiksXG5cdFx0XHRcdFx0aWdub3JlQ2FzZTogISFkYXRhWzZdXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHR9IGVsc2UgaWYoZmlyc3RDaGFyID09PSBcIjpcIil7XG5cdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdCgxKSA9PT0gXCI6XCIpe1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDIpO1xuXHRcdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInBzZXVkby1lbGVtZW50XCIsIG5hbWU6IGdldE5hbWUoKS50b0xvd2VyQ2FzZSgpfSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblxuXHRcdFx0XHRuYW1lID0gZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdGRhdGEgPSBudWxsO1xuXG5cdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdCgwKSA9PT0gXCIoXCIpe1xuXHRcdFx0XHRcdGlmKG5hbWUgaW4gdW5wYWNrUHNldWRvcyl7XG5cdFx0XHRcdFx0XHRxdW90ID0gc2VsZWN0b3IuY2hhckF0KDEpO1xuXHRcdFx0XHRcdFx0dmFyIHF1b3RlZCA9IHF1b3QgaW4gcXVvdGVzO1xuXG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cihxdW90ZWQgKyAxKTtcblxuXHRcdFx0XHRcdFx0ZGF0YSA9IFtdO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPSBwYXJzZVNlbGVjdG9yKGRhdGEsIHNlbGVjdG9yLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0aWYocXVvdGVkKXtcblx0XHRcdFx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KDApICE9PSBxdW90KXtcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJ1bm1hdGNoZWQgcXVvdGVzIGluIDpcIiArIG5hbWUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmKHNlbGVjdG9yLmNoYXJBdCgwKSAhPT0gXCIpXCIpe1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJtaXNzaW5nIGNsb3NpbmcgcGFyZW50aGVzaXMgaW4gOlwiICsgbmFtZSArIFwiIFwiICsgc2VsZWN0b3IpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cigxKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFyIHBvcyA9IDEsIGNvdW50ZXIgPSAxO1xuXG5cdFx0XHRcdFx0XHRmb3IoOyBjb3VudGVyID4gMCAmJiBwb3MgPCBzZWxlY3Rvci5sZW5ndGg7IHBvcysrKXtcblx0XHRcdFx0XHRcdFx0aWYoc2VsZWN0b3IuY2hhckF0KHBvcykgPT09IFwiKFwiKSBjb3VudGVyKys7XG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYoc2VsZWN0b3IuY2hhckF0KHBvcykgPT09IFwiKVwiKSBjb3VudGVyLS07XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmKGNvdW50ZXIpe1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJwYXJlbnRoZXNpcyBub3QgbWF0Y2hlZFwiKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZGF0YSA9IHNlbGVjdG9yLnN1YnN0cigxLCBwb3MgLSAyKTtcblx0XHRcdFx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyKHBvcyk7XG5cblx0XHRcdFx0XHRcdGlmKG5hbWUgaW4gc3RyaXBRdW90ZXNGcm9tUHNldWRvcyl7XG5cdFx0XHRcdFx0XHRcdHF1b3QgPSBkYXRhLmNoYXJBdCgwKTtcblxuXHRcdFx0XHRcdFx0XHRpZihxdW90ID09PSBkYXRhLnNsaWNlKC0xKSAmJiBxdW90IGluIHF1b3Rlcyl7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IGRhdGEuc2xpY2UoMSwgLTEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0ZGF0YSA9IHVuZXNjYXBlQ1NTKGRhdGEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInBzZXVkb1wiLCBuYW1lOiBuYW1lLCBkYXRhOiBkYXRhfSk7XG5cdFx0XHR9IGVsc2UgaWYocmVfbmFtZS50ZXN0KHNlbGVjdG9yKSl7XG5cdFx0XHRcdG5hbWUgPSBnZXROYW1lKCk7XG5cblx0XHRcdFx0aWYoIW9wdGlvbnMgfHwgKFwibG93ZXJDYXNlVGFnc1wiIGluIG9wdGlvbnMgPyBvcHRpb25zLmxvd2VyQ2FzZVRhZ3MgOiAhb3B0aW9ucy54bWxNb2RlKSl7XG5cdFx0XHRcdFx0bmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBcInRhZ1wiLCBuYW1lOiBuYW1lfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZih0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0udHlwZSA9PT0gXCJkZXNjZW5kYW50XCIpe1xuXHRcdFx0XHRcdHRva2Vucy5wb3AoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRUb2tlbihzdWJzZWxlY3RzLCB0b2tlbnMpO1xuXHRcdFx0XHRyZXR1cm4gc2VsZWN0b3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YWRkVG9rZW4oc3Vic2VsZWN0cywgdG9rZW5zKTtcblxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZFRva2VuKHN1YnNlbGVjdHMsIHRva2Vucyl7XG5cdGlmKHN1YnNlbGVjdHMubGVuZ3RoID4gMCAmJiB0b2tlbnMubGVuZ3RoID09PSAwKXtcblx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJlbXB0eSBzdWItc2VsZWN0b3JcIik7XG5cdH1cblxuXHRzdWJzZWxlY3RzLnB1c2godG9rZW5zKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gc29ydEJ5UHJvY2VkdXJlO1xuXG4vKlxuXHRzb3J0IHRoZSBwYXJ0cyBvZiB0aGUgcGFzc2VkIHNlbGVjdG9yLFxuXHRhcyB0aGVyZSBpcyBwb3RlbnRpYWwgZm9yIG9wdGltaXphdGlvblxuXHQoc29tZSB0eXBlcyBvZiBzZWxlY3RvcnMgYXJlIGZhc3RlciB0aGFuIG90aGVycylcbiovXG5cbnZhciBwcm9jZWR1cmUgPSByZXF1aXJlKFwiLi9wcm9jZWR1cmUuanNvblwiKTtcblxudmFyIGF0dHJpYnV0ZXMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0ZXhpc3RzOiAxMCxcblx0ZXF1YWxzOiA4LFxuXHRub3Q6IDcsXG5cdHN0YXJ0OiA2LFxuXHRlbmQ6IDYsXG5cdGFueTogNSxcblx0aHlwaGVuOiA0LFxuXHRlbGVtZW50OiA0XG59O1xuXG5mdW5jdGlvbiBzb3J0QnlQcm9jZWR1cmUoYXJyKXtcblx0dmFyIHByb2NzID0gYXJyLm1hcChnZXRQcm9jZWR1cmUpO1xuXHRmb3IodmFyIGkgPSAxOyBpIDwgYXJyLmxlbmd0aDsgaSsrKXtcblx0XHR2YXIgcHJvY05ldyA9IHByb2NzW2ldO1xuXG5cdFx0aWYocHJvY05ldyA8IDApIGNvbnRpbnVlO1xuXG5cdFx0Zm9yKHZhciBqID0gaSAtIDE7IGogPj0gMCAmJiBwcm9jTmV3IDwgcHJvY3Nbal07IGotLSl7XG5cdFx0XHR2YXIgdG9rZW4gPSBhcnJbaiArIDFdO1xuXHRcdFx0YXJyW2ogKyAxXSA9IGFycltqXTtcblx0XHRcdGFycltqXSA9IHRva2VuO1xuXHRcdFx0cHJvY3NbaiArIDFdID0gcHJvY3Nbal07XG5cdFx0XHRwcm9jc1tqXSA9IHByb2NOZXc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFByb2NlZHVyZSh0b2tlbil7XG5cdHZhciBwcm9jID0gcHJvY2VkdXJlW3Rva2VuLnR5cGVdO1xuXG5cdGlmKHByb2MgPT09IHByb2NlZHVyZS5hdHRyaWJ1dGUpe1xuXHRcdHByb2MgPSBhdHRyaWJ1dGVzW3Rva2VuLmFjdGlvbl07XG5cblx0XHRpZihwcm9jID09PSBhdHRyaWJ1dGVzLmVxdWFscyAmJiB0b2tlbi5uYW1lID09PSBcImlkXCIpe1xuXHRcdFx0Ly9wcmVmZXIgSUQgc2VsZWN0b3JzIChlZy4gI0lEKVxuXHRcdFx0cHJvYyA9IDk7XG5cdFx0fVxuXG5cdFx0aWYodG9rZW4uaWdub3JlQ2FzZSl7XG5cdFx0XHQvL2lnbm9yZUNhc2UgYWRkcyBzb21lIG92ZXJoZWFkLCBwcmVmZXIgXCJub3JtYWxcIiB0b2tlblxuXHRcdFx0Ly90aGlzIGlzIGEgYmluYXJ5IG9wZXJhdGlvbiwgdG8gZW5zdXJlIGl0J3Mgc3RpbGwgYW4gaW50XG5cdFx0XHRwcm9jID4+PSAxO1xuXHRcdH1cblx0fSBlbHNlIGlmKHByb2MgPT09IHByb2NlZHVyZS5wc2V1ZG8pe1xuXHRcdGlmKCF0b2tlbi5kYXRhKXtcblx0XHRcdHByb2MgPSAzO1xuXHRcdH0gZWxzZSBpZih0b2tlbi5uYW1lID09PSBcImhhc1wiIHx8IHRva2VuLm5hbWUgPT09IFwiY29udGFpbnNcIil7XG5cdFx0XHRwcm9jID0gMDsgLy9leHBlbnNpdmUgaW4gYW55IGNhc2Vcblx0XHR9IGVsc2UgaWYodG9rZW4ubmFtZSA9PT0gXCJtYXRjaGVzXCIgfHwgdG9rZW4ubmFtZSA9PT0gXCJub3RcIil7XG5cdFx0XHRwcm9jID0gMDtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0b2tlbi5kYXRhLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0Ly9UT0RPIGJldHRlciBoYW5kbGluZyBvZiBjb21wbGV4IHNlbGVjdG9yc1xuXHRcdFx0XHRpZih0b2tlbi5kYXRhW2ldLmxlbmd0aCAhPT0gMSkgY29udGludWU7XG5cdFx0XHRcdHZhciBjdXIgPSBnZXRQcm9jZWR1cmUodG9rZW4uZGF0YVtpXVswXSk7XG5cdFx0XHRcdC8vYXZvaWQgZXhlY3V0aW5nIDpoYXMgb3IgOmNvbnRhaW5zXG5cdFx0XHRcdGlmKGN1ciA9PT0gMCl7XG5cdFx0XHRcdFx0cHJvYyA9IDA7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoY3VyID4gcHJvYykgcHJvYyA9IGN1cjtcblx0XHRcdH1cblx0XHRcdGlmKHRva2VuLmRhdGEubGVuZ3RoID4gMSAmJiBwcm9jID4gMCkgcHJvYyAtPSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9jID0gMTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb2M7XG59XG4iLCIvKlxuXHRwc2V1ZG8gc2VsZWN0b3JzXG5cblx0LS0tXG5cblx0dGhleSBhcmUgYXZhaWxhYmxlIGluIHR3byBmb3Jtczpcblx0KiBmaWx0ZXJzIGNhbGxlZCB3aGVuIHRoZSBzZWxlY3RvclxuXHQgIGlzIGNvbXBpbGVkIGFuZCByZXR1cm4gYSBmdW5jdGlvblxuXHQgIHRoYXQgbmVlZHMgdG8gcmV0dXJuIG5leHQoKVxuXHQqIHBzZXVkb3MgZ2V0IGNhbGxlZCBvbiBleGVjdXRpb25cblx0ICB0aGV5IG5lZWQgdG8gcmV0dXJuIGEgYm9vbGVhblxuKi9cblxudmFyIGdldE5DaGVjayAgICAgICAgID0gcmVxdWlyZShcIm50aC1jaGVja1wiKSxcblx0QmFzZUZ1bmNzICAgICAgICAgPSByZXF1aXJlKFwiYm9vbGJhc2VcIiksXG5cdGF0dHJpYnV0ZXNGYWN0b3J5ID0gcmVxdWlyZShcIi4vYXR0cmlidXRlcy5qc1wiKSxcblx0dHJ1ZUZ1bmMgICAgICAgICAgPSBCYXNlRnVuY3MudHJ1ZUZ1bmMsXG5cdGZhbHNlRnVuYyAgICAgICAgID0gQmFzZUZ1bmNzLmZhbHNlRnVuYztcblxuZnVuY3Rpb24gZmlsdGVyc0ZhY3RvcnkoYWRhcHRlcil7XG5cdHZhciBhdHRyaWJ1dGVzICA9IGF0dHJpYnV0ZXNGYWN0b3J5KGFkYXB0ZXIpLFxuXHRcdGNoZWNrQXR0cmliID0gYXR0cmlidXRlcy5ydWxlcy5lcXVhbHM7XG5cblx0Ly9oZWxwZXIgbWV0aG9kc1xuXHRmdW5jdGlvbiBlcXVhbHMoYSwgYil7XG5cdFx0aWYodHlwZW9mIGFkYXB0ZXIuZXF1YWxzID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBhZGFwdGVyLmVxdWFscyhhLCBiKTtcblxuXHRcdHJldHVybiBhID09PSBiO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0QXR0cmliRnVuYyhuYW1lLCB2YWx1ZSl7XG5cdFx0dmFyIGRhdGEgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfTtcblx0XHRyZXR1cm4gZnVuY3Rpb24gYXR0cmliRnVuYyhuZXh0KXtcblx0XHRcdHJldHVybiBjaGVja0F0dHJpYihuZXh0LCBkYXRhKTtcblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q2hpbGRGdW5jKG5leHQpe1xuXHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhIWFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0fTtcblx0fVxuXG5cdHZhciBmaWx0ZXJzID0ge1xuXHRcdGNvbnRhaW5zOiBmdW5jdGlvbihuZXh0LCB0ZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBjb250YWlucyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIG5leHQoZWxlbSkgJiYgYWRhcHRlci5nZXRUZXh0KGVsZW0pLmluZGV4T2YodGV4dCkgPj0gMDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRpY29udGFpbnM6IGZ1bmN0aW9uKG5leHQsIHRleHQpe1xuXHRcdFx0dmFyIGl0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGljb250YWlucyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIG5leHQoZWxlbSkgJiZcblx0XHRcdFx0XHRhZGFwdGVyLmdldFRleHQoZWxlbSkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGl0ZXh0KSA+PSAwO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Ly9sb2NhdGlvbiBzcGVjaWZpYyBtZXRob2RzXG5cdFx0XCJudGgtY2hpbGRcIjogZnVuY3Rpb24obmV4dCwgcnVsZSl7XG5cdFx0XHR2YXIgZnVuYyA9IGdldE5DaGVjayhydWxlKTtcblxuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGdldENoaWxkRnVuYyhuZXh0KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG50aENoaWxkKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgaSA9IDAsIHBvcyA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0ZWxzZSBwb3MrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZnVuYyhwb3MpICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0XCJudGgtbGFzdC1jaGlsZFwiOiBmdW5jdGlvbihuZXh0LCBydWxlKXtcblx0XHRcdHZhciBmdW5jID0gZ2V0TkNoZWNrKHJ1bGUpO1xuXG5cdFx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBmdW5jO1xuXHRcdFx0aWYoZnVuYyA9PT0gdHJ1ZUZ1bmMpICByZXR1cm4gZ2V0Q2hpbGRGdW5jKG5leHQpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gbnRoTGFzdENoaWxkKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgcG9zID0gMCwgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRlbHNlIHBvcysrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmdW5jKHBvcykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRcIm50aC1vZi10eXBlXCI6IGZ1bmN0aW9uKG5leHQsIHJ1bGUpe1xuXHRcdFx0dmFyIGZ1bmMgPSBnZXROQ2hlY2socnVsZSk7XG5cblx0XHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZ1bmM7XG5cdFx0XHRpZihmdW5jID09PSB0cnVlRnVuYykgIHJldHVybiBnZXRDaGlsZEZ1bmMobmV4dCk7XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBudGhPZlR5cGUoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBwb3MgPSAwLCBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRpZihhZGFwdGVyLmdldE5hbWUoc2libGluZ3NbaV0pID09PSBhZGFwdGVyLmdldE5hbWUoZWxlbSkpIHBvcysrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmdW5jKHBvcykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRcIm50aC1sYXN0LW9mLXR5cGVcIjogZnVuY3Rpb24obmV4dCwgcnVsZSl7XG5cdFx0XHR2YXIgZnVuYyA9IGdldE5DaGVjayhydWxlKTtcblxuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGdldENoaWxkRnVuYyhuZXh0KTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG50aExhc3RPZlR5cGUoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdFx0Zm9yKHZhciBwb3MgPSAwLCBpID0gc2libGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSBicmVhaztcblx0XHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgcG9zKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmMocG9zKSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Ly9UT0RPIGRldGVybWluZSB0aGUgYWN0dWFsIHJvb3QgZWxlbWVudFxuXHRcdHJvb3Q6IGZ1bmN0aW9uKG5leHQpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gIWFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRzY29wZTogZnVuY3Rpb24obmV4dCwgcnVsZSwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0XHRpZighY29udGV4dCB8fCBjb250ZXh0Lmxlbmd0aCA9PT0gMCl7XG5cdFx0XHRcdC8vZXF1aXZhbGVudCB0byA6cm9vdFxuXHRcdFx0XHRyZXR1cm4gZmlsdGVycy5yb290KG5leHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihjb250ZXh0Lmxlbmd0aCA9PT0gMSl7XG5cdFx0XHRcdC8vTk9URTogY2FuJ3QgYmUgdW5wYWNrZWQsIGFzIDpoYXMgdXNlcyB0aGlzIGZvciBzaWRlLWVmZmVjdHNcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRcdHJldHVybiBlcXVhbHMoY29udGV4dFswXSwgZWxlbSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5pbmRleE9mKGVsZW0pID49IDAgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8valF1ZXJ5IGV4dGVuc2lvbnMgKG90aGVycyBmb2xsb3cgYXMgcHNldWRvcylcblx0XHRjaGVja2JveDogZ2V0QXR0cmliRnVuYyhcInR5cGVcIiwgXCJjaGVja2JveFwiKSxcblx0XHRmaWxlOiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcImZpbGVcIiksXG5cdFx0cGFzc3dvcmQ6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwicGFzc3dvcmRcIiksXG5cdFx0cmFkaW86IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwicmFkaW9cIiksXG5cdFx0cmVzZXQ6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwicmVzZXRcIiksXG5cdFx0aW1hZ2U6IGdldEF0dHJpYkZ1bmMoXCJ0eXBlXCIsIFwiaW1hZ2VcIiksXG5cdFx0c3VibWl0OiBnZXRBdHRyaWJGdW5jKFwidHlwZVwiLCBcInN1Ym1pdFwiKVxuXHR9O1xuXHRyZXR1cm4gZmlsdGVycztcbn1cblxuZnVuY3Rpb24gcHNldWRvc0ZhY3RvcnkoYWRhcHRlcil7XG5cdC8vaGVscGVyIG1ldGhvZHNcblx0ZnVuY3Rpb24gZ2V0Rmlyc3RFbGVtZW50KGVsZW1zKXtcblx0XHRmb3IodmFyIGkgPSAwOyBlbGVtcyAmJiBpIDwgZWxlbXMubGVuZ3RoOyBpKyspe1xuXHRcdFx0aWYoYWRhcHRlci5pc1RhZyhlbGVtc1tpXSkpIHJldHVybiBlbGVtc1tpXTtcblx0XHR9XG5cdH1cblxuXHQvL3doaWxlIGZpbHRlcnMgYXJlIHByZWNvbXBpbGVkLCBwc2V1ZG9zIGdldCBjYWxsZWQgd2hlbiB0aGV5IGFyZSBuZWVkZWRcblx0dmFyIHBzZXVkb3MgPSB7XG5cdFx0ZW1wdHk6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICFhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pLnNvbWUoZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmlzVGFnKGVsZW0pIHx8IGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCI7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJmaXJzdC1jaGlsZFwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBnZXRGaXJzdEVsZW1lbnQoYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKSkgPT09IGVsZW07XG5cdFx0fSxcblx0XHRcImxhc3QtY2hpbGRcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG5cdFx0XHRcdGlmKHNpYmxpbmdzW2ldID09PSBlbGVtKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpIGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRcImZpcnN0LW9mLXR5cGVcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0XCJsYXN0LW9mLXR5cGVcIjogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRmb3IodmFyIGkgPSBzaWJsaW5ncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5nZXROYW1lKHNpYmxpbmdzW2ldKSA9PT0gYWRhcHRlci5nZXROYW1lKGVsZW0pKSBicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRcIm9ubHktb2YtdHlwZVwiOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSk7XG5cblx0XHRcdGZvcih2YXIgaSA9IDAsIGogPSBzaWJsaW5ncy5sZW5ndGg7IGkgPCBqOyBpKyspe1xuXHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKGFkYXB0ZXIuZ2V0TmFtZShzaWJsaW5nc1tpXSkgPT09IGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0XCJvbmx5LWNoaWxkXCI6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkgJiYgc2libGluZ3NbaV0gIT09IGVsZW0pIHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdC8vOm1hdGNoZXMoYSwgYXJlYSwgbGluaylbaHJlZl1cblx0XHRsaW5rOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcImhyZWZcIik7XG5cdFx0fSxcblx0XHR2aXNpdGVkOiBmYWxzZUZ1bmMsIC8vc2VlbXMgdG8gYmUgYSB2YWxpZCBpbXBsZW1lbnRhdGlvblxuXHRcdC8vVE9ETzogOmFueS1saW5rIG9uY2UgdGhlIG5hbWUgaXMgZmluYWxpemVkIChhcyBhbiBhbGlhcyBvZiA6bGluaylcblxuXHRcdC8vZm9ybXNcblx0XHQvL3RvIGNvbnNpZGVyOiA6dGFyZ2V0XG5cblx0XHQvLzptYXRjaGVzKFtzZWxlY3RlZF0sIHNlbGVjdDpub3QoW211bHRpcGxlXSk6bm90KD4gb3B0aW9uW3NlbGVjdGVkXSkgPiBvcHRpb246Zmlyc3Qtb2YtdHlwZSlcblx0XHRzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRpZihhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcInNlbGVjdGVkXCIpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGVsc2UgaWYoYWRhcHRlci5nZXROYW1lKGVsZW0pICE9PSBcIm9wdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cblx0XHRcdC8vdGhlIGZpcnN0IDxvcHRpb24+IGluIGEgPHNlbGVjdD4gaXMgYWxzbyBzZWxlY3RlZFxuXHRcdFx0dmFyIHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW0pO1xuXG5cdFx0XHRpZihcblx0XHRcdFx0IXBhcmVudCB8fFxuXHRcdFx0XHRhZGFwdGVyLmdldE5hbWUocGFyZW50KSAhPT0gXCJzZWxlY3RcIiB8fFxuXHRcdFx0XHRhZGFwdGVyLmhhc0F0dHJpYihwYXJlbnQsIFwibXVsdGlwbGVcIilcblx0XHRcdCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCksXG5cdFx0XHRcdHNhd0VsZW0gID0gZmFsc2U7XG5cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdGlmKGFkYXB0ZXIuaXNUYWcoc2libGluZ3NbaV0pKXtcblx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSl7XG5cdFx0XHRcdFx0XHRzYXdFbGVtID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoIXNhd0VsZW0pe1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZihhZGFwdGVyLmhhc0F0dHJpYihzaWJsaW5nc1tpXSwgXCJzZWxlY3RlZFwiKSl7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzYXdFbGVtO1xuXHRcdH0sXG5cdFx0Ly9odHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNkaXNhYmxlZC1lbGVtZW50c1xuXHRcdC8vOm1hdGNoZXMoXG5cdFx0Ly8gIDptYXRjaGVzKGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIG1lbnVpdGVtLCBvcHRncm91cCwgb3B0aW9uKVtkaXNhYmxlZF0sXG5cdFx0Ly8gIG9wdGdyb3VwW2Rpc2FibGVkXSA+IG9wdGlvbiksXG5cdFx0Ly8gZmllbGRzZXRbZGlzYWJsZWRdICogLy9UT0RPIG5vdCBjaGlsZCBvZiBmaXJzdCA8bGVnZW5kPlxuXHRcdC8vKVxuXHRcdGRpc2FibGVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcImRpc2FibGVkXCIpO1xuXHRcdH0sXG5cdFx0ZW5hYmxlZDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIWFkYXB0ZXIuaGFzQXR0cmliKGVsZW0sIFwiZGlzYWJsZWRcIik7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKDptYXRjaGVzKDpyYWRpbywgOmNoZWNrYm94KVtjaGVja2VkXSwgOnNlbGVjdGVkKSAoVE9ETyBtZW51aXRlbSlcblx0XHRjaGVja2VkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcImNoZWNrZWRcIikgfHwgcHNldWRvcy5zZWxlY3RlZChlbGVtKTtcblx0XHR9LFxuXHRcdC8vOm1hdGNoZXMoaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEpW3JlcXVpcmVkXVxuXHRcdHJlcXVpcmVkOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcInJlcXVpcmVkXCIpO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyhpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSk6bm90KFtyZXF1aXJlZF0pXG5cdFx0b3B0aW9uYWw6IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0cmV0dXJuICFhZGFwdGVyLmhhc0F0dHJpYihlbGVtLCBcInJlcXVpcmVkXCIpO1xuXHRcdH0sXG5cblx0XHQvL2pRdWVyeSBleHRlbnNpb25zXG5cblx0XHQvLzpub3QoOmVtcHR5KVxuXHRcdHBhcmVudDogZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRyZXR1cm4gIXBzZXVkb3MuZW1wdHkoZWxlbSk7XG5cdFx0fSxcblx0XHQvLzptYXRjaGVzKGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYpXG5cdFx0aGVhZGVyOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBuYW1lID0gYWRhcHRlci5nZXROYW1lKGVsZW0pO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaDFcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDJcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDNcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDRcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDVcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaDZcIjtcblx0XHR9LFxuXG5cdFx0Ly86bWF0Y2hlcyhidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSlcblx0XHRidXR0b246IGZ1bmN0aW9uKGVsZW0pe1xuXHRcdFx0dmFyIG5hbWUgPSBhZGFwdGVyLmdldE5hbWUoZWxlbSk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJidXR0b25cIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRcdGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgXCJ0eXBlXCIpID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cdFx0Ly86bWF0Y2hlcyhpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgYnV0dG9uKVxuXHRcdGlucHV0OiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBuYW1lID0gYWRhcHRlci5nZXROYW1lKGVsZW0pO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwidGV4dGFyZWFcIiB8fFxuXHRcdFx0XHRcdG5hbWUgPT09IFwic2VsZWN0XCIgfHxcblx0XHRcdFx0XHRuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cdFx0Ly9pbnB1dDptYXRjaGVzKDpub3QoW3R5cGUhPScnXSksIFt0eXBlPSd0ZXh0JyBpXSlcblx0XHR0ZXh0OiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0TmFtZShlbGVtKSA9PT0gXCJpbnB1dFwiICYmIChcblx0XHRcdFx0IShhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBcInR5cGVcIikpIHx8XG5cdFx0XHRcdGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCJcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBwc2V1ZG9zO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlBcmdzKGZ1bmMsIG5hbWUsIHN1YnNlbGVjdCl7XG5cdGlmKHN1YnNlbGVjdCA9PT0gbnVsbCl7XG5cdFx0aWYoZnVuYy5sZW5ndGggPiAxICYmIG5hbWUgIT09IFwic2NvcGVcIil7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwc2V1ZG8tc2VsZWN0b3IgOlwiICsgbmFtZSArIFwiIHJlcXVpcmVzIGFuIGFyZ3VtZW50XCIpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZihmdW5jLmxlbmd0aCA9PT0gMSl7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwc2V1ZG8tc2VsZWN0b3IgOlwiICsgbmFtZSArIFwiIGRvZXNuJ3QgaGF2ZSBhbnkgYXJndW1lbnRzXCIpO1xuXHRcdH1cblx0fVxufVxuXG4vL0ZJWE1FIHRoaXMgZmVlbHMgaGFja3lcbnZhciByZV9DU1MzID0gL14oPzooPzpudGh8bGFzdHxmaXJzdHxvbmx5KS0oPzpjaGlsZHxvZi10eXBlKXxyb290fGVtcHR5fCg/OmVufGRpcylhYmxlZHxjaGVja2VkfG5vdCkkLztcblxuZnVuY3Rpb24gZmFjdG9yeShhZGFwdGVyKXtcblx0dmFyIHBzZXVkb3MgPSBwc2V1ZG9zRmFjdG9yeShhZGFwdGVyKTtcblx0dmFyIGZpbHRlcnMgPSBmaWx0ZXJzRmFjdG9yeShhZGFwdGVyKTtcblxuXHRyZXR1cm4ge1xuXHRcdGNvbXBpbGU6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHN1YnNlbGVjdCA9IGRhdGEuZGF0YTtcblxuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCAmJiAhcmVfQ1NTMy50ZXN0KG5hbWUpKXtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiOlwiICsgbmFtZSArIFwiIGlzbid0IHBhcnQgb2YgQ1NTM1wiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYodHlwZW9mIGZpbHRlcnNbbmFtZV0gPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRcdHZlcmlmeUFyZ3MoZmlsdGVyc1tuYW1lXSwgbmFtZSwgIHN1YnNlbGVjdCk7XG5cdFx0XHRcdHJldHVybiBmaWx0ZXJzW25hbWVdKG5leHQsIHN1YnNlbGVjdCwgb3B0aW9ucywgY29udGV4dCk7XG5cdFx0XHR9IGVsc2UgaWYodHlwZW9mIHBzZXVkb3NbbmFtZV0gPT09IFwiZnVuY3Rpb25cIil7XG5cdFx0XHRcdHZhciBmdW5jID0gcHNldWRvc1tuYW1lXTtcblx0XHRcdFx0dmVyaWZ5QXJncyhmdW5jLCBuYW1lLCBzdWJzZWxlY3QpO1xuXG5cdFx0XHRcdGlmKG5leHQgPT09IHRydWVGdW5jKSByZXR1cm4gZnVuYztcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gcHNldWRvQXJncyhlbGVtKXtcblx0XHRcdFx0XHRyZXR1cm4gZnVuYyhlbGVtLCBzdWJzZWxlY3QpICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bm1hdGNoZWQgcHNldWRvLWNsYXNzIDpcIiArIG5hbWUpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRwc2V1ZG9zOiBwc2V1ZG9zXG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENTU3NlbGVjdDtcblxudmFyIERvbVV0aWxzICAgICAgID0gcmVxdWlyZShcImRvbXV0aWxzXCIpLFxuXHRmYWxzZUZ1bmMgICAgICA9IHJlcXVpcmUoXCJib29sYmFzZVwiKS5mYWxzZUZ1bmMsXG5cdGNvbXBpbGVGYWN0b3J5ID0gcmVxdWlyZShcIi4vbGliL2NvbXBpbGUuanNcIiksXG5cdGRlZmF1bHRDb21waWxlID0gY29tcGlsZUZhY3RvcnkoRG9tVXRpbHMpO1xuXG5mdW5jdGlvbiBhZGFwdGVyQ29tcGlsZShhZGFwdGVyKXtcblx0cmV0dXJuIGFkYXB0ZXIgPT09IERvbVV0aWxzID8gZGVmYXVsdENvbXBpbGUgOiBjb21waWxlRmFjdG9yeShhZGFwdGVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JGdW5jKHNlYXJjaEZ1bmMpe1xuXHRyZXR1cm4gZnVuY3Rpb24gc2VsZWN0KHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblx0XHRvcHRpb25zLmFkYXB0ZXIgPSBvcHRpb25zLmFkYXB0ZXIgfHwgRG9tVXRpbHM7XG5cdFx0dmFyIGNvbXBpbGUgPSBhZGFwdGVyQ29tcGlsZShvcHRpb25zLmFkYXB0ZXIpO1xuXG5cdFx0aWYodHlwZW9mIHF1ZXJ5ICE9PSBcImZ1bmN0aW9uXCIpIHF1ZXJ5ID0gY29tcGlsZS5jb21waWxlVW5zYWZlKHF1ZXJ5LCBvcHRpb25zLCBlbGVtcyk7XG5cdFx0aWYocXVlcnkuc2hvdWxkVGVzdE5leHRTaWJsaW5ncykgZWxlbXMgPSBhcHBlbmROZXh0U2libGluZ3MoKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCBlbGVtcywgb3B0aW9ucy5hZGFwdGVyKTtcblx0XHRpZighQXJyYXkuaXNBcnJheShlbGVtcykpIGVsZW1zID0gb3B0aW9ucy5hZGFwdGVyLmdldENoaWxkcmVuKGVsZW1zKTtcblx0XHRlbHNlIGVsZW1zID0gb3B0aW9ucy5hZGFwdGVyLnJlbW92ZVN1YnNldHMoZWxlbXMpO1xuXHRcdHJldHVybiBzZWFyY2hGdW5jKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldE5leHRTaWJsaW5ncyhlbGVtLCBhZGFwdGVyKXtcblx0dmFyIHNpYmxpbmdzID0gYWRhcHRlci5nZXRTaWJsaW5ncyhlbGVtKTtcblx0aWYoIUFycmF5LmlzQXJyYXkoc2libGluZ3MpKSByZXR1cm4gW107XG5cdHNpYmxpbmdzID0gc2libGluZ3Muc2xpY2UoMCk7XG5cdHdoaWxlKHNpYmxpbmdzLnNoaWZ0KCkgIT09IGVsZW0pO1xuXHRyZXR1cm4gc2libGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZE5leHRTaWJsaW5ncyhlbGVtcywgYWRhcHRlcil7XG5cdC8vIE9yZGVyIG1hdHRlcnMgYmVjYXVzZSBqUXVlcnkgc2VlbXMgdG8gY2hlY2sgdGhlIGNoaWxkcmVuIGJlZm9yZSB0aGUgc2libGluZ3Ncblx0aWYoIUFycmF5LmlzQXJyYXkoZWxlbXMpKSBlbGVtcyA9IFtlbGVtc107XG5cdHZhciBuZXdFbGVtcyA9IGVsZW1zLnNsaWNlKDApO1xuXG5cdGZvcih2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXtcblx0XHR2YXIgbmV4dFNpYmxpbmdzID0gZ2V0TmV4dFNpYmxpbmdzKG5ld0VsZW1zW2ldLCBhZGFwdGVyKTtcblx0XHRuZXdFbGVtcy5wdXNoLmFwcGx5KG5ld0VsZW1zLCBuZXh0U2libGluZ3MpO1xuXHR9XG5cdHJldHVybiBuZXdFbGVtcztcbn1cblxudmFyIHNlbGVjdEFsbCA9IGdldFNlbGVjdG9yRnVuYyhmdW5jdGlvbiBzZWxlY3RBbGwocXVlcnksIGVsZW1zLCBvcHRpb25zKXtcblx0cmV0dXJuIChxdWVyeSA9PT0gZmFsc2VGdW5jIHx8ICFlbGVtcyB8fCBlbGVtcy5sZW5ndGggPT09IDApID8gW10gOiBvcHRpb25zLmFkYXB0ZXIuZmluZEFsbChxdWVyeSwgZWxlbXMpO1xufSk7XG5cbnZhciBzZWxlY3RPbmUgPSBnZXRTZWxlY3RvckZ1bmMoZnVuY3Rpb24gc2VsZWN0T25lKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyl7XG5cdHJldHVybiAocXVlcnkgPT09IGZhbHNlRnVuYyB8fCAhZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKSA/IG51bGwgOiBvcHRpb25zLmFkYXB0ZXIuZmluZE9uZShxdWVyeSwgZWxlbXMpO1xufSk7XG5cbmZ1bmN0aW9uIGlzKGVsZW0sIHF1ZXJ5LCBvcHRpb25zKXtcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblx0b3B0aW9ucy5hZGFwdGVyID0gb3B0aW9ucy5hZGFwdGVyIHx8IERvbVV0aWxzO1xuXHR2YXIgY29tcGlsZSA9IGFkYXB0ZXJDb21waWxlKG9wdGlvbnMuYWRhcHRlcik7XG5cdHJldHVybiAodHlwZW9mIHF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBxdWVyeSA6IGNvbXBpbGUocXVlcnksIG9wdGlvbnMpKShlbGVtKTtcbn1cblxuLypcblx0dGhlIGV4cG9ydGVkIGludGVyZmFjZVxuKi9cbmZ1bmN0aW9uIENTU3NlbGVjdChxdWVyeSwgZWxlbXMsIG9wdGlvbnMpe1xuXHRyZXR1cm4gc2VsZWN0QWxsKHF1ZXJ5LCBlbGVtcywgb3B0aW9ucyk7XG59XG5cbkNTU3NlbGVjdC5jb21waWxlID0gZGVmYXVsdENvbXBpbGU7XG5DU1NzZWxlY3QuZmlsdGVycyA9IGRlZmF1bHRDb21waWxlLlBzZXVkb3MuZmlsdGVycztcbkNTU3NlbGVjdC5wc2V1ZG9zID0gZGVmYXVsdENvbXBpbGUuUHNldWRvcy5wc2V1ZG9zO1xuXG5DU1NzZWxlY3Quc2VsZWN0QWxsID0gc2VsZWN0QWxsO1xuQ1NTc2VsZWN0LnNlbGVjdE9uZSA9IHNlbGVjdE9uZTtcblxuQ1NTc2VsZWN0LmlzID0gaXM7XG5cbi8vbGVnYWN5IG1ldGhvZHMgKG1pZ2h0IGJlIHJlbW92ZWQpXG5DU1NzZWxlY3QucGFyc2UgPSBkZWZhdWx0Q29tcGlsZTtcbkNTU3NlbGVjdC5pdGVyYXRlID0gc2VsZWN0QWxsO1xuXG4vL2hvb2tzXG5DU1NzZWxlY3QuX2NvbXBpbGVVbnNhZmUgPSBkZWZhdWx0Q29tcGlsZS5jb21waWxlVW5zYWZlO1xuQ1NTc2VsZWN0Ll9jb21waWxlVG9rZW4gPSBkZWZhdWx0Q29tcGlsZS5jb21waWxlVG9rZW47XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBhZGFwdGVyRmFjdG9yeTtcblxuZnVuY3Rpb24gYWRhcHRlckZhY3RvcnkoaW1wbGVtZW50YXRpb24pe1xuXHRlbnN1cmVJbXBsZW1lbnRhdGlvbihpbXBsZW1lbnRhdGlvbik7XG5cblx0dmFyIGFkYXB0ZXIgPSB7fVxuXG5cdHZhciBiYXNlQWRhcHRlciA9IHtcblx0XHRyZW1vdmVTdWJzZXRzOiBmdW5jdGlvbiAobm9kZXMpe1xuXHRcdFx0cmV0dXJuIHJlbW92ZVN1YnNldHMoYWRhcHRlciwgbm9kZXMpO1xuXHRcdH0sXG5cdFx0ZXhpc3RzT25lOiBmdW5jdGlvbih0ZXN0LCBlbGVtcyl7XG5cdFx0XHRyZXR1cm4gZXhpc3RzT25lKGFkYXB0ZXIsIHRlc3QsIGVsZW1zKTtcblx0XHR9LFxuXHRcdGdldFNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiBnZXRTaWJsaW5ncyhhZGFwdGVyLCBlbGVtKTtcblx0XHR9LFxuXHRcdGhhc0F0dHJpYjogZnVuY3Rpb24oZWxlbSwgbmFtZSl7XG5cdFx0XHRyZXR1cm4gaGFzQXR0cmliKGFkYXB0ZXIsIGVsZW0sIG5hbWUpO1xuXHRcdH0sXG5cdFx0ZmluZE9uZTogZnVuY3Rpb24odGVzdCwgYXJyKXtcblx0XHRcdHJldHVybiBmaW5kT25lKGFkYXB0ZXIsIHRlc3QsIGFycik7XG5cdFx0fSxcblx0XHRmaW5kQWxsOiBmdW5jdGlvbih0ZXN0LCBlbGVtcyl7XG5cdFx0XHRyZXR1cm4gZmluZEFsbChhZGFwdGVyLCB0ZXN0LCBlbGVtcylcblx0XHR9XG5cdH07XG5cblx0T2JqZWN0LmFzc2lnbihhZGFwdGVyLCBiYXNlQWRhcHRlciwgaW1wbGVtZW50YXRpb24pO1xuXG5cdHJldHVybiBhZGFwdGVyO1xufVxuXG52YXIgZXhwZWN0SW1wbGVtZW50ZWQgPSBbXG5cdFwiaXNUYWdcIiwgXCJnZXRBdHRyaWJ1dGVWYWx1ZVwiLCBcImdldENoaWxkcmVuXCIsIFwiZ2V0TmFtZVwiLCBcImdldFBhcmVudFwiLFxuXHRcImdldFRleHRcIlxuXTtcblxuZnVuY3Rpb24gZW5zdXJlSW1wbGVtZW50YXRpb24oaW1wbGVtZW50YXRpb24pe1xuXHRpZighaW1wbGVtZW50YXRpb24pXHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgaW1wbGVtZW50YXRpb25cIilcblxuXHR2YXIgbm90SW1wbGVtZW50ZWQgPSBleHBlY3RJbXBsZW1lbnRlZC5maWx0ZXIoZnVuY3Rpb24oZm5hbWUpe1xuXHRcdHJldHVybiB0eXBlb2YgaW1wbGVtZW50YXRpb25bZm5hbWVdICE9PSBcImZ1bmN0aW9uXCI7XG5cdH0pO1xuXG5cdGlmKG5vdEltcGxlbWVudGVkLmxlbmd0aCl7XG5cdFx0dmFyIG5vdExpc3QgPSBcIihcIiArIG5vdEltcGxlbWVudGVkLmpvaW4oXCIsIFwiKSArIFwiKVwiO1xuXHRcdHZhciBtZXNzYWdlID0gXCJFeHBlY3RlZCBmdW5jdGlvbnMgXCIgKyBub3RMaXN0ICsgXCIgdG8gYmUgaW1wbGVtZW50ZWRcIjtcblx0XHR0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3Vic2V0cyhhZGFwdGVyLCBub2Rlcyl7XG5cdHZhciBpZHggPSBub2Rlcy5sZW5ndGgsIG5vZGUsIGFuY2VzdG9yLCByZXBsYWNlO1xuXG5cdC8vIENoZWNrIGlmIGVhY2ggbm9kZSAob3Igb25lIG9mIGl0cyBhbmNlc3RvcnMpIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZVxuXHQvLyBhcnJheS5cblx0d2hpbGUoLS1pZHggPiAtMSl7XG5cdFx0bm9kZSA9IGFuY2VzdG9yID0gbm9kZXNbaWR4XTtcblxuXHRcdC8vIFRlbXBvcmFyaWx5IHJlbW92ZSB0aGUgbm9kZSB1bmRlciBjb25zaWRlcmF0aW9uXG5cdFx0bm9kZXNbaWR4XSA9IG51bGw7XG5cdFx0cmVwbGFjZSA9IHRydWU7XG5cblx0XHR3aGlsZShhbmNlc3Rvcil7XG5cdFx0XHRpZihub2Rlcy5pbmRleE9mKGFuY2VzdG9yKSA+IC0xKXtcblx0XHRcdFx0cmVwbGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRub2Rlcy5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRhbmNlc3RvciA9IGFkYXB0ZXIuZ2V0UGFyZW50KGFuY2VzdG9yKVxuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBub2RlIGhhcyBiZWVuIGZvdW5kIHRvIGJlIHVuaXF1ZSwgcmUtaW5zZXJ0IGl0LlxuXHRcdGlmKHJlcGxhY2Upe1xuXHRcdFx0bm9kZXNbaWR4XSA9IG5vZGU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5vZGVzO1xufVxuXG5mdW5jdGlvbiBleGlzdHNPbmUoYWRhcHRlciwgdGVzdCwgZWxlbXMpe1xuXHRyZXR1cm4gZWxlbXMuc29tZShmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gYWRhcHRlci5pc1RhZyhlbGVtKSA/XG5cdFx0XHR0ZXN0KGVsZW0pIHx8IGFkYXB0ZXIuZXhpc3RzT25lKHRlc3QsIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkpIDpcblx0XHRcdGZhbHNlO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U2libGluZ3MoYWRhcHRlciwgZWxlbSl7XG5cdHZhciBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKTtcblx0cmV0dXJuIHBhcmVudCAmJiBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7XG59XG5cblxuZnVuY3Rpb24gaGFzQXR0cmliKGFkYXB0ZXIsIGVsZW0sIG5hbWUpe1xuXHRyZXR1cm4gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLG5hbWUpICE9PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gZmluZE9uZShhZGFwdGVyLCB0ZXN0LCBhcnIpe1xuXHR2YXIgZWxlbSA9IG51bGw7XG5cblx0Zm9yKHZhciBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsICYmICFlbGVtOyBpKyspe1xuXHRcdGlmKHRlc3QoYXJyW2ldKSl7XG5cdFx0XHRlbGVtID0gYXJyW2ldO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgY2hpbGRzID0gYWRhcHRlci5nZXRDaGlsZHJlbihhcnJbaV0pO1xuXHRcdFx0aWYoY2hpbGRzICYmIGNoaWxkcy5sZW5ndGggPiAwKXtcblx0XHRcdFx0ZWxlbSA9IGFkYXB0ZXIuZmluZE9uZSh0ZXN0LCBjaGlsZHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBmaW5kQWxsKGFkYXB0ZXIsIHRlc3QsIGVsZW1zKXtcblx0dmFyIHJlc3VsdCA9IFtdO1xuXG5cdGZvcih2YXIgaSA9IDAsIGogPSBlbGVtcy5sZW5ndGg7IGkgPCBqOyBpKyspe1xuXHRcdGlmKCFhZGFwdGVyLmlzVGFnKGVsZW1zW2ldKSkgY29udGludWU7XG5cdFx0aWYodGVzdChlbGVtc1tpXSkpIHJlc3VsdC5wdXNoKGVsZW1zW2ldKTtcblx0XHR2YXIgY2hpbGRzID0gYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtc1tpXSk7XG5cdFx0aWYoY2hpbGRzKSByZXN1bHQgPSByZXN1bHQuY29uY2F0KGFkYXB0ZXIuZmluZEFsbCh0ZXN0LCBjaGlsZHMpKTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vXG4vLyAgICAgICAgICAgIGl0ZW0gICAgICAgIGl0ZW0gICAgICAgIGl0ZW0gICAgICAgIGl0ZW1cbi8vICAgICAgICAgIC8tLS0tLS1cXCAgICAvLS0tLS0tXFwgICAgLy0tLS0tLVxcICAgIC8tLS0tLS1cXFxuLy8gICAgICAgICAgfCBkYXRhIHwgICAgfCBkYXRhIHwgICAgfCBkYXRhIHwgICAgfCBkYXRhIHxcbi8vICBudWxsIDwtLSstcHJldiB8PC0tLSstcHJldiB8PC0tLSstcHJldiB8PC0tLSstcHJldiB8XG4vLyAgICAgICAgICB8IG5leHQtKy0tLT58IG5leHQtKy0tLT58IG5leHQtKy0tLT58IG5leHQtKy0tPiBudWxsXG4vLyAgICAgICAgICBcXC0tLS0tLS8gICAgXFwtLS0tLS0vICAgIFxcLS0tLS0tLyAgICBcXC0tLS0tLS9cbi8vICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXG4vLyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIGxpc3QgICAgICAgICAgICAgICAgfFxuLy8gICAgICAgICAgICAgfCAgICAgICAgICAgICAgLy0tLS0tLVxcICAgICAgICAgICAgICB8XG4vLyAgICAgICAgICAgICBcXC0tLS0tLS0tLS0tLS0tKy1oZWFkIHwgICAgICAgICAgICAgIHxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFpbC0rLS0tLS0tLS0tLS0tLS0vXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXC0tLS0tLS9cbi8vXG5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW0oZGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHByZXY6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICB9O1xufVxuXG52YXIgY3Vyc29ycyA9IG51bGw7XG52YXIgTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG59O1xuXG5MaXN0LmNyZWF0ZUl0ZW0gPSBjcmVhdGVJdGVtO1xuTGlzdC5wcm90b3R5cGUuY3JlYXRlSXRlbSA9IGNyZWF0ZUl0ZW07XG5cbkxpc3QucHJvdG90eXBlLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIGN1cnNvciA9IHRoaXMuaGVhZDtcblxuICAgIHdoaWxlIChjdXJzb3IpIHtcbiAgICAgICAgc2l6ZSsrO1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3IubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZTtcbn07XG5cbkxpc3QucHJvdG90eXBlLmZyb21BcnJheSA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIGN1cnNvciA9IG51bGw7XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IGNyZWF0ZUl0ZW0oYXJyYXlbaV0pO1xuXG4gICAgICAgIGlmIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0ID0gaXRlbTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IGl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLnByZXYgPSBjdXJzb3I7XG4gICAgICAgIGN1cnNvciA9IGl0ZW07XG4gICAgfVxuXG4gICAgdGhpcy50YWlsID0gY3Vyc29yO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5MaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGN1cnNvciA9IHRoaXMuaGVhZDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoY3Vyc29yKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGN1cnNvci5kYXRhKTtcbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkxpc3QucHJvdG90eXBlLnRvSlNPTiA9IExpc3QucHJvdG90eXBlLnRvQXJyYXk7XG5cbkxpc3QucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkID09PSBudWxsO1xufTtcblxuTGlzdC5wcm90b3R5cGUuZmlyc3QgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkICYmIHRoaXMuaGVhZC5kYXRhO1xufTtcblxuTGlzdC5wcm90b3R5cGUubGFzdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRhaWwgJiYgdGhpcy50YWlsLmRhdGE7XG59O1xuXG5mdW5jdGlvbiBhbGxvY2F0ZUN1cnNvcihub2RlLCBwcmV2LCBuZXh0KSB7XG4gICAgdmFyIGN1cnNvcjtcblxuICAgIGlmIChjdXJzb3JzICE9PSBudWxsKSB7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvcnM7XG4gICAgICAgIGN1cnNvcnMgPSBjdXJzb3JzLmN1cnNvcjtcbiAgICAgICAgY3Vyc29yLnByZXYgPSBwcmV2O1xuICAgICAgICBjdXJzb3IubmV4dCA9IG5leHQ7XG4gICAgICAgIGN1cnNvci5jdXJzb3IgPSBub2RlLmN1cnNvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdXJzb3IgPSB7XG4gICAgICAgICAgICBwcmV2OiBwcmV2LFxuICAgICAgICAgICAgbmV4dDogbmV4dCxcbiAgICAgICAgICAgIGN1cnNvcjogbm9kZS5jdXJzb3JcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBub2RlLmN1cnNvciA9IGN1cnNvcjtcblxuICAgIHJldHVybiBjdXJzb3I7XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VDdXJzb3Iobm9kZSkge1xuICAgIHZhciBjdXJzb3IgPSBub2RlLmN1cnNvcjtcblxuICAgIG5vZGUuY3Vyc29yID0gY3Vyc29yLmN1cnNvcjtcbiAgICBjdXJzb3IucHJldiA9IG51bGw7XG4gICAgY3Vyc29yLm5leHQgPSBudWxsO1xuICAgIGN1cnNvci5jdXJzb3IgPSBjdXJzb3JzO1xuICAgIGN1cnNvcnMgPSBjdXJzb3I7XG59XG5cbkxpc3QucHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihmbiwgY29udGV4dCkge1xuICAgIHZhciBpdGVtO1xuXG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZXh0ID0gdGhpcztcbiAgICB9XG5cbiAgICAvLyBwdXNoIGN1cnNvclxuICAgIHZhciBjdXJzb3IgPSBhbGxvY2F0ZUN1cnNvcih0aGlzLCBudWxsLCB0aGlzLmhlYWQpO1xuXG4gICAgd2hpbGUgKGN1cnNvci5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0gPSBjdXJzb3IubmV4dDtcbiAgICAgICAgY3Vyc29yLm5leHQgPSBpdGVtLm5leHQ7XG5cbiAgICAgICAgZm4uY2FsbChjb250ZXh0LCBpdGVtLmRhdGEsIGl0ZW0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIHBvcCBjdXJzb3JcbiAgICByZWxlYXNlQ3Vyc29yKHRoaXMpO1xufTtcblxuTGlzdC5wcm90b3R5cGUuZWFjaFJpZ2h0ID0gZnVuY3Rpb24oZm4sIGNvbnRleHQpIHtcbiAgICB2YXIgaXRlbTtcblxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgfVxuXG4gICAgLy8gcHVzaCBjdXJzb3JcbiAgICB2YXIgY3Vyc29yID0gYWxsb2NhdGVDdXJzb3IodGhpcywgdGhpcy50YWlsLCBudWxsKTtcblxuICAgIHdoaWxlIChjdXJzb3IucHJldiAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtID0gY3Vyc29yLnByZXY7XG4gICAgICAgIGN1cnNvci5wcmV2ID0gaXRlbS5wcmV2O1xuXG4gICAgICAgIGZuLmNhbGwoY29udGV4dCwgaXRlbS5kYXRhLCBpdGVtLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBwb3AgY3Vyc29yXG4gICAgcmVsZWFzZUN1cnNvcih0aGlzKTtcbn07XG5cbkxpc3QucHJvdG90eXBlLm5leHRVbnRpbCA9IGZ1bmN0aW9uKHN0YXJ0LCBmbiwgY29udGV4dCkge1xuICAgIGlmIChzdGFydCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGl0ZW07XG5cbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIH1cblxuICAgIC8vIHB1c2ggY3Vyc29yXG4gICAgdmFyIGN1cnNvciA9IGFsbG9jYXRlQ3Vyc29yKHRoaXMsIG51bGwsIHN0YXJ0KTtcblxuICAgIHdoaWxlIChjdXJzb3IubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtID0gY3Vyc29yLm5leHQ7XG4gICAgICAgIGN1cnNvci5uZXh0ID0gaXRlbS5uZXh0O1xuXG4gICAgICAgIGlmIChmbi5jYWxsKGNvbnRleHQsIGl0ZW0uZGF0YSwgaXRlbSwgdGhpcykpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcG9wIGN1cnNvclxuICAgIHJlbGVhc2VDdXJzb3IodGhpcyk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5wcmV2VW50aWwgPSBmdW5jdGlvbihzdGFydCwgZm4sIGNvbnRleHQpIHtcbiAgICBpZiAoc3RhcnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpdGVtO1xuXG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZXh0ID0gdGhpcztcbiAgICB9XG5cbiAgICAvLyBwdXNoIGN1cnNvclxuICAgIHZhciBjdXJzb3IgPSBhbGxvY2F0ZUN1cnNvcih0aGlzLCBzdGFydCwgbnVsbCk7XG5cbiAgICB3aGlsZSAoY3Vyc29yLnByZXYgIT09IG51bGwpIHtcbiAgICAgICAgaXRlbSA9IGN1cnNvci5wcmV2O1xuICAgICAgICBjdXJzb3IucHJldiA9IGl0ZW0ucHJldjtcblxuICAgICAgICBpZiAoZm4uY2FsbChjb250ZXh0LCBpdGVtLmRhdGEsIGl0ZW0sIHRoaXMpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBvcCBjdXJzb3JcbiAgICByZWxlYXNlQ3Vyc29yKHRoaXMpO1xufTtcblxuTGlzdC5wcm90b3R5cGUuc29tZSA9IGZ1bmN0aW9uKGZuLCBjb250ZXh0KSB7XG4gICAgdmFyIGN1cnNvciA9IHRoaXMuaGVhZDtcblxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoZm4uY2FsbChjb250ZXh0LCBjdXJzb3IuZGF0YSwgY3Vyc29yLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3IgPSBjdXJzb3IubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihmbiwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgY3Vyc29yID0gdGhpcy5oZWFkO1xuXG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZXh0ID0gdGhpcztcbiAgICB9XG5cbiAgICB3aGlsZSAoY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGZuLmNhbGwoY29udGV4dCwgY3Vyc29yLmRhdGEsIGN1cnNvciwgdGhpcykpO1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3IubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0KCk7XG4gICAgdmFyIGN1cnNvciA9IHRoaXMuaGVhZDtcblxuICAgIHdoaWxlIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0Lmluc2VydChjcmVhdGVJdGVtKGN1cnNvci5kYXRhKSk7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5MaXN0LnByb3RvdHlwZS51cGRhdGVDdXJzb3JzID0gZnVuY3Rpb24ocHJldk9sZCwgcHJldk5ldywgbmV4dE9sZCwgbmV4dE5ldykge1xuICAgIHZhciBjdXJzb3IgPSB0aGlzLmN1cnNvcjtcblxuICAgIHdoaWxlIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGN1cnNvci5wcmV2ID09PSBwcmV2T2xkKSB7XG4gICAgICAgICAgICBjdXJzb3IucHJldiA9IHByZXZOZXc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3Vyc29yLm5leHQgPT09IG5leHRPbGQpIHtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0ID0gbmV4dE5ldztcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5jdXJzb3I7XG4gICAgfVxufTtcblxuTGlzdC5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAvLyAgICAgIGhlYWRcbiAgICAvLyAgICBeXG4gICAgLy8gaXRlbVxuICAgIHRoaXMudXBkYXRlQ3Vyc29ycyhudWxsLCBpdGVtLCB0aGlzLmhlYWQsIGl0ZW0pO1xuXG4gICAgLy8gaW5zZXJ0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcbiAgICBpZiAodGhpcy5oZWFkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIG5ldyBpdGVtIDwtIGZpcnN0IGl0ZW1cbiAgICAgICAgdGhpcy5oZWFkLnByZXYgPSBpdGVtO1xuXG4gICAgICAgIC8vIG5ldyBpdGVtIC0+IGZpcnN0IGl0ZW1cbiAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5oZWFkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIGxpc3QgaGFzIG5vIGhlYWQsIHRoZW4gaXQgYWxzbyBoYXMgbm8gdGFpbFxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGFpbCBwb2ludHMgdG8gdGhlIG5ldyBpdGVtXG4gICAgICAgIHRoaXMudGFpbCA9IGl0ZW07XG4gICAgfVxuXG4gICAgLy8gaGVhZCBhbHdheXMgcG9pbnRzIHRvIG5ldyBpdGVtXG4gICAgdGhpcy5oZWFkID0gaXRlbTtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuTGlzdC5wcm90b3R5cGUucHJlcGVuZERhdGEgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGVuZChjcmVhdGVJdGVtKGRhdGEpKTtcbn07XG5cbkxpc3QucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAvLyB0YWlsXG4gICAgLy8gICAgICBeXG4gICAgLy8gICAgICBpdGVtXG4gICAgdGhpcy51cGRhdGVDdXJzb3JzKHRoaXMudGFpbCwgaXRlbSwgbnVsbCwgaXRlbSk7XG5cbiAgICAvLyBpbnNlcnQgdG8gdGhlIGVuZGluZyBvZiB0aGUgbGlzdFxuICAgIGlmICh0aGlzLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgLy8gbGFzdCBpdGVtIC0+IG5ldyBpdGVtXG4gICAgICAgIHRoaXMudGFpbC5uZXh0ID0gaXRlbTtcblxuICAgICAgICAvLyBsYXN0IGl0ZW0gPC0gbmV3IGl0ZW1cbiAgICAgICAgaXRlbS5wcmV2ID0gdGhpcy50YWlsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIGxpc3QgaGFzIG5vIHRhaWwsIHRoZW4gaXQgYWxzbyBoYXMgbm8gaGVhZFxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgaGVhZCBwb2ludHMgdG8gbmV3IGl0ZW1cbiAgICAgICAgdGhpcy5oZWFkID0gaXRlbTtcbiAgICB9XG5cbiAgICAvLyB0YWlsIGFsd2F5cyBwb2ludHMgdG8gbmV3IGl0ZW1cbiAgICB0aGlzLnRhaWwgPSBpdGVtO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5hcHBlbmREYXRhID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZChjcmVhdGVJdGVtKGRhdGEpKTtcbn07XG5cbkxpc3QucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKGl0ZW0sIGJlZm9yZSkge1xuICAgIGlmIChiZWZvcmUgIT09IHVuZGVmaW5lZCAmJiBiZWZvcmUgIT09IG51bGwpIHtcbiAgICAgICAgLy8gcHJldiAgIGJlZm9yZVxuICAgICAgICAvLyAgICAgIF5cbiAgICAgICAgLy8gICAgIGl0ZW1cbiAgICAgICAgdGhpcy51cGRhdGVDdXJzb3JzKGJlZm9yZS5wcmV2LCBpdGVtLCBiZWZvcmUsIGl0ZW0pO1xuXG4gICAgICAgIGlmIChiZWZvcmUucHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaW5zZXJ0IHRvIHRoZSBiZWdpbm5pbmcgb2YgbGlzdFxuICAgICAgICAgICAgaWYgKHRoaXMuaGVhZCAhPT0gYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiZWZvcmUgZG9lc25cXCd0IGJlbG9uZyB0byBsaXN0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNpbmNlIGhlYWQgcG9pbnRzIHRvIGJlZm9yZSB0aGVyZWZvcmUgbGlzdCBkb2Vzbid0IGVtcHR5XG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIHRhaWxcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IGl0ZW07XG4gICAgICAgICAgICBiZWZvcmUucHJldiA9IGl0ZW07XG4gICAgICAgICAgICBpdGVtLm5leHQgPSBiZWZvcmU7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3Vyc29ycyhudWxsLCBpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLy8gaW5zZXJ0IGJldHdlZW4gdHdvIGl0ZW1zXG4gICAgICAgICAgICBiZWZvcmUucHJldi5uZXh0ID0gaXRlbTtcbiAgICAgICAgICAgIGl0ZW0ucHJldiA9IGJlZm9yZS5wcmV2O1xuXG4gICAgICAgICAgICBiZWZvcmUucHJldiA9IGl0ZW07XG4gICAgICAgICAgICBpdGVtLm5leHQgPSBiZWZvcmU7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwcGVuZChpdGVtKTtcbiAgICB9XG59O1xuXG5MaXN0LnByb3RvdHlwZS5pbnNlcnREYXRhID0gZnVuY3Rpb24oZGF0YSwgYmVmb3JlKSB7XG4gICAgdGhpcy5pbnNlcnQoY3JlYXRlSXRlbShkYXRhKSwgYmVmb3JlKTtcbn07XG5cbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAvLyAgICAgIGl0ZW1cbiAgICAvLyAgICAgICBeXG4gICAgLy8gcHJldiAgICAgbmV4dFxuICAgIHRoaXMudXBkYXRlQ3Vyc29ycyhpdGVtLCBpdGVtLnByZXYsIGl0ZW0sIGl0ZW0ubmV4dCk7XG5cbiAgICBpZiAoaXRlbS5wcmV2ICE9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0ucHJldi5uZXh0ID0gaXRlbS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhlYWQgIT09IGl0ZW0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXRlbSBkb2VzblxcJ3QgYmVsb25nIHRvIGxpc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGVhZCA9IGl0ZW0ubmV4dDtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0ubmV4dC5wcmV2ID0gaXRlbS5wcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnRhaWwgIT09IGl0ZW0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXRlbSBkb2VzblxcJ3QgYmVsb25nIHRvIGxpc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFpbCA9IGl0ZW0ucHJldjtcbiAgICB9XG5cbiAgICBpdGVtLnByZXYgPSBudWxsO1xuICAgIGl0ZW0ubmV4dCA9IG51bGw7XG5cbiAgICByZXR1cm4gaXRlbTtcbn07XG5cbkxpc3QucHJvdG90eXBlLmFwcGVuZExpc3QgPSBmdW5jdGlvbihsaXN0KSB7XG4gICAgLy8gaWdub3JlIGVtcHR5IGxpc3RzXG4gICAgaWYgKGxpc3QuaGVhZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVDdXJzb3JzKHRoaXMudGFpbCwgbGlzdC50YWlsLCBudWxsLCBsaXN0LmhlYWQpO1xuXG4gICAgLy8gaW5zZXJ0IHRvIGVuZCBvZiB0aGUgbGlzdFxuICAgIGlmICh0aGlzLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgLy8gaWYgZGVzdGluYXRpb24gbGlzdCBoYXMgYSB0YWlsLCB0aGVuIGl0IGFsc28gaGFzIGEgaGVhZCxcbiAgICAgICAgLy8gYnV0IGhlYWQgZG9lc24ndCBjaGFuZ2VcblxuICAgICAgICAvLyBkZXN0IHRhaWwgLT4gc291cmNlIGhlYWRcbiAgICAgICAgdGhpcy50YWlsLm5leHQgPSBsaXN0LmhlYWQ7XG5cbiAgICAgICAgLy8gZGVzdCB0YWlsIDwtIHNvdXJjZSBoZWFkXG4gICAgICAgIGxpc3QuaGVhZC5wcmV2ID0gdGhpcy50YWlsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIGxpc3QgaGFzIG5vIGEgdGFpbCwgdGhlbiBpdCBhbHNvIGhhcyBubyBhIGhlYWRcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHBvaW50cyBoZWFkIHRvIG5ldyBpdGVtXG4gICAgICAgIHRoaXMuaGVhZCA9IGxpc3QuaGVhZDtcbiAgICB9XG5cbiAgICAvLyB0YWlsIGFsd2F5cyBzdGFydCBwb2ludCB0byBuZXcgaXRlbVxuICAgIHRoaXMudGFpbCA9IGxpc3QudGFpbDtcblxuICAgIGxpc3QuaGVhZCA9IG51bGw7XG4gICAgbGlzdC50YWlsID0gbnVsbDtcbn07XG5cbkxpc3QucHJvdG90eXBlLmluc2VydExpc3QgPSBmdW5jdGlvbihsaXN0LCBiZWZvcmUpIHtcbiAgICBpZiAoYmVmb3JlICE9PSB1bmRlZmluZWQgJiYgYmVmb3JlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIGlnbm9yZSBlbXB0eSBsaXN0c1xuICAgICAgICBpZiAobGlzdC5oZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUN1cnNvcnMoYmVmb3JlLnByZXYsIGxpc3QudGFpbCwgYmVmb3JlLCBsaXN0LmhlYWQpO1xuXG4gICAgICAgIC8vIGluc2VydCBpbiB0aGUgbWlkZGxlIG9mIGRpc3QgbGlzdFxuICAgICAgICBpZiAoYmVmb3JlLnByZXYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGJlZm9yZS5wcmV2IDwtPiBsaXN0LmhlYWRcbiAgICAgICAgICAgIGJlZm9yZS5wcmV2Lm5leHQgPSBsaXN0LmhlYWQ7XG4gICAgICAgICAgICBsaXN0LmhlYWQucHJldiA9IGJlZm9yZS5wcmV2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oZWFkID0gbGlzdC5oZWFkO1xuICAgICAgICB9XG5cbiAgICAgICAgYmVmb3JlLnByZXYgPSBsaXN0LnRhaWw7XG4gICAgICAgIGxpc3QudGFpbC5uZXh0ID0gYmVmb3JlO1xuXG4gICAgICAgIGxpc3QuaGVhZCA9IG51bGw7XG4gICAgICAgIGxpc3QudGFpbCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hcHBlbmRMaXN0KGxpc3QpO1xuICAgIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbihvbGRJdGVtLCBuZXdJdGVtT3JMaXN0KSB7XG4gICAgaWYgKCdoZWFkJyBpbiBuZXdJdGVtT3JMaXN0KSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0TGlzdChuZXdJdGVtT3JMaXN0LCBvbGRJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc2VydChuZXdJdGVtT3JMaXN0LCBvbGRJdGVtKTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmUob2xkSXRlbSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVDdXN0b21FcnJvciA9IHJlcXVpcmUoJy4uL3V0aWxzL2NyZWF0ZUN1c3RvbUVycm9yJyk7XG52YXIgTUFYX0xJTkVfTEVOR1RIID0gMTAwO1xudmFyIE9GRlNFVF9DT1JSRUNUSU9OID0gNjA7XG52YXIgVEFCX1JFUExBQ0VNRU5UID0gJyAgICAnO1xuXG5mdW5jdGlvbiBzb3VyY2VGcmFnbWVudChlcnJvciwgZXh0cmFMaW5lcykge1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NMaW5lcyhzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiBsaW5lcy5zbGljZShzdGFydCwgZW5kKS5tYXAoZnVuY3Rpb24obGluZSwgaWR4KSB7XG4gICAgICAgICAgICB2YXIgbnVtID0gU3RyaW5nKHN0YXJ0ICsgaWR4ICsgMSk7XG5cbiAgICAgICAgICAgIHdoaWxlIChudW0ubGVuZ3RoIDwgbWF4TnVtTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbnVtID0gJyAnICsgbnVtO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVtICsgJyB8JyArIGxpbmU7XG4gICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHZhciBsaW5lcyA9IGVycm9yLnNvdXJjZS5zcGxpdCgvXFxyXFxuP3xcXG58XFxmLyk7XG4gICAgdmFyIGxpbmUgPSBlcnJvci5saW5lO1xuICAgIHZhciBjb2x1bW4gPSBlcnJvci5jb2x1bW47XG4gICAgdmFyIHN0YXJ0TGluZSA9IE1hdGgubWF4KDEsIGxpbmUgLSBleHRyYUxpbmVzKSAtIDE7XG4gICAgdmFyIGVuZExpbmUgPSBNYXRoLm1pbihsaW5lICsgZXh0cmFMaW5lcywgbGluZXMubGVuZ3RoICsgMSk7XG4gICAgdmFyIG1heE51bUxlbmd0aCA9IE1hdGgubWF4KDQsIFN0cmluZyhlbmRMaW5lKS5sZW5ndGgpICsgMTtcbiAgICB2YXIgY3V0TGVmdCA9IDA7XG5cbiAgICAvLyBjb2x1bW4gY29ycmVjdGlvbiBhY2NvcmRpbmcgdG8gcmVwbGFjZWQgdGFiIGJlZm9yZSBjb2x1bW5cbiAgICBjb2x1bW4gKz0gKFRBQl9SRVBMQUNFTUVOVC5sZW5ndGggLSAxKSAqIChsaW5lc1tsaW5lIC0gMV0uc3Vic3RyKDAsIGNvbHVtbiAtIDEpLm1hdGNoKC9cXHQvZykgfHwgW10pLmxlbmd0aDtcblxuICAgIGlmIChjb2x1bW4gPiBNQVhfTElORV9MRU5HVEgpIHtcbiAgICAgICAgY3V0TGVmdCA9IGNvbHVtbiAtIE9GRlNFVF9DT1JSRUNUSU9OICsgMztcbiAgICAgICAgY29sdW1uID0gT0ZGU0VUX0NPUlJFQ1RJT04gLSAyO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSBzdGFydExpbmU7IGkgPD0gZW5kTGluZTsgaSsrKSB7XG4gICAgICAgIGlmIChpID49IDAgJiYgaSA8IGxpbmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKC9cXHQvZywgVEFCX1JFUExBQ0VNRU5UKTtcbiAgICAgICAgICAgIGxpbmVzW2ldID1cbiAgICAgICAgICAgICAgICAoY3V0TGVmdCA+IDAgJiYgbGluZXNbaV0ubGVuZ3RoID4gY3V0TGVmdCA/ICdcXHUyMDI2JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgbGluZXNbaV0uc3Vic3RyKGN1dExlZnQsIE1BWF9MSU5FX0xFTkdUSCAtIDIpICtcbiAgICAgICAgICAgICAgICAobGluZXNbaV0ubGVuZ3RoID4gY3V0TGVmdCArIE1BWF9MSU5FX0xFTkdUSCAtIDEgPyAnXFx1MjAyNicgOiAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBwcm9jZXNzTGluZXMoc3RhcnRMaW5lLCBsaW5lKSxcbiAgICAgICAgbmV3IEFycmF5KGNvbHVtbiArIG1heE51bUxlbmd0aCArIDIpLmpvaW4oJy0nKSArICdeJyxcbiAgICAgICAgcHJvY2Vzc0xpbmVzKGxpbmUsIGVuZExpbmUpXG4gICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG59XG5cbnZhciBDc3NTeW50YXhFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHNvdXJjZSwgb2Zmc2V0LCBsaW5lLCBjb2x1bW4pIHtcbiAgICB2YXIgZXJyb3IgPSBjcmVhdGVDdXN0b21FcnJvcignQ3NzU3ludGF4RXJyb3InLCBtZXNzYWdlKTtcblxuICAgIGVycm9yLnNvdXJjZSA9IHNvdXJjZTtcbiAgICBlcnJvci5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgZXJyb3IubGluZSA9IGxpbmU7XG4gICAgZXJyb3IuY29sdW1uID0gY29sdW1uO1xuXG4gICAgZXJyb3Iuc291cmNlRnJhZ21lbnQgPSBmdW5jdGlvbihleHRyYUxpbmVzKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2VGcmFnbWVudChlcnJvciwgaXNOYU4oZXh0cmFMaW5lcykgPyAwIDogZXh0cmFMaW5lcyk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdmb3JtYXR0ZWRNZXNzYWdlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAnUGFyc2UgZXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgIHNvdXJjZUZyYWdtZW50KGVycm9yLCAyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNhcGFiaWxpdHlcbiAgICBlcnJvci5wYXJzZUVycm9yID0ge1xuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgbGluZTogbGluZSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGVycm9yO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDc3NTeW50YXhFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3QnKTtcbnZhciBQVU5DVFVBVElPTiA9IGNvbnN0YW50cy5QVU5DVFVBVElPTjtcbnZhciBTVE9QX1VSTF9SQVcgPSBjb25zdGFudHMuU1RPUF9VUkxfUkFXO1xudmFyIFRZUEUgPSBjb25zdGFudHMuVFlQRTtcbnZhciBGVUxMU1RPUCA9IFRZUEUuRnVsbFN0b3A7XG52YXIgUExVU1NJR04gPSBUWVBFLlBsdXNTaWduO1xudmFyIEhZUEhFTk1JTlVTID0gVFlQRS5IeXBoZW5NaW51cztcbnZhciBQVU5DVFVBVE9SID0gVFlQRS5QdW5jdHVhdG9yO1xudmFyIFRBQiA9IDk7XG52YXIgTiA9IDEwO1xudmFyIEYgPSAxMjtcbnZhciBSID0gMTM7XG52YXIgU1BBQ0UgPSAzMjtcbnZhciBCQUNLX1NMQVNIID0gOTI7XG52YXIgRSA9IDEwMTsgLy8gJ2UnLmNoYXJDb2RlQXQoMClcblxuZnVuY3Rpb24gZmlyc3RDaGFyT2Zmc2V0KHNvdXJjZSkge1xuICAgIC8vIGRldGVjdCBCT00gKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0J5dGVfb3JkZXJfbWFyaylcbiAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRiB8fCAgLy8gVVRGLTE2QkVcbiAgICAgICAgc291cmNlLmNoYXJDb2RlQXQoMCkgPT09IDB4RkZGRSkgeyAgLy8gVVRGLTE2TEVcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGlzSGV4KGNvZGUpIHtcbiAgICByZXR1cm4gKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1NykgfHwgLy8gMCAuLiA5XG4gICAgICAgICAgIChjb2RlID49IDY1ICYmIGNvZGUgPD0gNzApIHx8IC8vIEEgLi4gRlxuICAgICAgICAgICAoY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEwMik7ICAvLyBhIC4uIGZcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoY29kZSkge1xuICAgIHJldHVybiBjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3bGluZShzb3VyY2UsIG9mZnNldCwgY29kZSkge1xuICAgIGlmIChjb2RlID09PSBOIHx8IGNvZGUgPT09IEYgfHwgY29kZSA9PT0gUikge1xuICAgICAgICBpZiAoY29kZSA9PT0gUiAmJiBvZmZzZXQgKyAxIDwgc291cmNlLmxlbmd0aCAmJiBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA9PT0gTikge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY21wQ2hhcih0ZXN0U3RyLCBvZmZzZXQsIHJlZmVyZW5jZUNvZGUpIHtcbiAgICB2YXIgY29kZSA9IHRlc3RTdHIuY2hhckNvZGVBdChvZmZzZXQpO1xuXG4gICAgLy8gY29kZS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA5MCkge1xuICAgICAgICBjb2RlID0gY29kZSB8IDMyO1xuICAgIH1cblxuICAgIHJldHVybiBjb2RlID09PSByZWZlcmVuY2VDb2RlO1xufVxuXG5mdW5jdGlvbiBjbXBTdHIodGVzdFN0ciwgc3RhcnQsIGVuZCwgcmVmZXJlbmNlU3RyKSB7XG4gICAgaWYgKGVuZCAtIHN0YXJ0ICE9PSByZWZlcmVuY2VTdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRlc3RTdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICB2YXIgdGVzdENvZGUgPSB0ZXN0U3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHZhciByZWZDb2RlID0gcmVmZXJlbmNlU3RyLmNoYXJDb2RlQXQoaSAtIHN0YXJ0KTtcblxuICAgICAgICAvLyB0ZXN0U3RyW2ldLnRvTG93ZXJDYXNlKClcbiAgICAgICAgaWYgKHRlc3RDb2RlID49IDY1ICYmIHRlc3RDb2RlIDw9IDkwKSB7XG4gICAgICAgICAgICB0ZXN0Q29kZSA9IHRlc3RDb2RlIHwgMzI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdENvZGUgIT09IHJlZkNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBlbmRzV2l0aCh0ZXN0U3RyLCByZWZlcmVuY2VTdHIpIHtcbiAgICByZXR1cm4gY21wU3RyKHRlc3RTdHIsIHRlc3RTdHIubGVuZ3RoIC0gcmVmZXJlbmNlU3RyLmxlbmd0aCwgdGVzdFN0ci5sZW5ndGgsIHJlZmVyZW5jZVN0cik7XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Tm9uU3BhY2VMb2NhdGlvbihzY2FubmVyKSB7XG4gICAgZm9yICh2YXIgaSA9IHNjYW5uZXIuc291cmNlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb2RlID0gc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdChpKTtcblxuICAgICAgICBpZiAoY29kZSAhPT0gU1BBQ0UgJiYgY29kZSAhPT0gVEFCICYmIGNvZGUgIT09IFIgJiYgY29kZSAhPT0gTiAmJiBjb2RlICE9PSBGKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzY2FubmVyLmdldExvY2F0aW9uKGkgKyAxKTtcbn1cblxuZnVuY3Rpb24gZmluZFdoaXRlU3BhY2VFbmQoc291cmNlLCBvZmZzZXQpIHtcbiAgICBmb3IgKDsgb2Zmc2V0IDwgc291cmNlLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQpO1xuXG4gICAgICAgIGlmIChjb2RlICE9PSBTUEFDRSAmJiBjb2RlICE9PSBUQUIgJiYgY29kZSAhPT0gUiAmJiBjb2RlICE9PSBOICYmIGNvZGUgIT09IEYpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldDtcbn1cblxuZnVuY3Rpb24gZmluZENvbW1lbnRFbmQoc291cmNlLCBvZmZzZXQpIHtcbiAgICB2YXIgY29tbWVudEVuZCA9IHNvdXJjZS5pbmRleE9mKCcqLycsIG9mZnNldCk7XG5cbiAgICBpZiAoY29tbWVudEVuZCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1lbnRFbmQgKyAyO1xufVxuXG5mdW5jdGlvbiBmaW5kU3RyaW5nRW5kKHNvdXJjZSwgb2Zmc2V0LCBxdW90ZSkge1xuICAgIGZvciAoOyBvZmZzZXQgPCBzb3VyY2UubGVuZ3RoOyBvZmZzZXQrKykge1xuICAgICAgICB2YXIgY29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCk7XG5cbiAgICAgICAgLy8gVE9ETzogYmFkIHN0cmluZ1xuICAgICAgICBpZiAoY29kZSA9PT0gQkFDS19TTEFTSCkge1xuICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gcXVvdGUpIHtcbiAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBmaW5kRGVjaW1hbE51bWJlckVuZChzb3VyY2UsIG9mZnNldCkge1xuICAgIGZvciAoOyBvZmZzZXQgPCBzb3VyY2UubGVuZ3RoOyBvZmZzZXQrKykge1xuICAgICAgICB2YXIgY29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCk7XG5cbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHsgIC8vIG5vdCBhIDAgLi4gOVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBmaW5kTnVtYmVyRW5kKHNvdXJjZSwgb2Zmc2V0LCBhbGxvd0ZyYWN0aW9uKSB7XG4gICAgdmFyIGNvZGU7XG5cbiAgICBvZmZzZXQgPSBmaW5kRGVjaW1hbE51bWJlckVuZChzb3VyY2UsIG9mZnNldCk7XG5cbiAgICAvLyBmcmFjdGlvbjogLlxcZCtcbiAgICBpZiAoYWxsb3dGcmFjdGlvbiAmJiBvZmZzZXQgKyAxIDwgc291cmNlLmxlbmd0aCAmJiBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQpID09PSBGVUxMU1RPUCkge1xuICAgICAgICBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSk7XG5cbiAgICAgICAgaWYgKGlzTnVtYmVyKGNvZGUpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBmaW5kRGVjaW1hbE51bWJlckVuZChzb3VyY2UsIG9mZnNldCArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXhwb25lbnQ6IGVbKy1dXFxkK1xuICAgIGlmIChvZmZzZXQgKyAxIDwgc291cmNlLmxlbmd0aCkge1xuICAgICAgICBpZiAoKHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCkgfCAzMikgPT09IEUpIHsgLy8gY2FzZSBpbnNlbnNpdGl2ZSBjaGVjayBmb3IgYGVgXG4gICAgICAgICAgICBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSk7XG5cbiAgICAgICAgICAgIGlmIChjb2RlID09PSBQTFVTU0lHTiB8fCBjb2RlID09PSBIWVBIRU5NSU5VUykge1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyIDwgc291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0ICsgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoY29kZSkpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBmaW5kRGVjaW1hbE51bWJlckVuZChzb3VyY2UsIG9mZnNldCArIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldDtcbn1cblxuLy8gc2tpcCBlc2NhcGVkIHVuaWNvZGUgc2VxdWVuY2UgdGhhdCBjYW4gZW5kcyB3aXRoIHNwYWNlXG4vLyBbMC05YS1mXXsxLDZ9KFxcclxcbnxbIFxcblxcclxcdFxcZl0pP1xuZnVuY3Rpb24gZmluZEVzY2FzZUVuZChzb3VyY2UsIG9mZnNldCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNyAmJiBvZmZzZXQgKyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0ICsgaSk7XG5cbiAgICAgICAgaWYgKGkgIT09IDYgJiYgaXNIZXgoY29kZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gaSAtIDEgKyBpc05ld2xpbmUoc291cmNlLCBvZmZzZXQgKyBpLCBjb2RlKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBTUEFDRSB8fCBjb2RlID09PSBUQUIpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJZGVudGlmaWVyRW5kKHNvdXJjZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7IG9mZnNldCA8IHNvdXJjZS5sZW5ndGg7IG9mZnNldCsrKSB7XG4gICAgICAgIHZhciBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KTtcblxuICAgICAgICBpZiAoY29kZSA9PT0gQkFDS19TTEFTSCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZmluZEVzY2FzZUVuZChzb3VyY2UsIG9mZnNldCArIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweDgwICYmIFBVTkNUVUFUSU9OW2NvZGVdID09PSBQVU5DVFVBVE9SKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRVcmxSYXdFbmQoc291cmNlLCBvZmZzZXQpIHtcbiAgICBmb3IgKDsgb2Zmc2V0IDwgc291cmNlLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQpO1xuXG4gICAgICAgIGlmIChjb2RlID09PSBCQUNLX1NMQVNIKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBmaW5kRXNjYXNlRW5kKHNvdXJjZSwgb2Zmc2V0ICsgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4ODAgJiYgU1RPUF9VUkxfUkFXW2NvZGVdID09PSAxKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZpcnN0Q2hhck9mZnNldDogZmlyc3RDaGFyT2Zmc2V0LFxuXG4gICAgaXNIZXg6IGlzSGV4LFxuICAgIGlzTnVtYmVyOiBpc051bWJlcixcbiAgICBpc05ld2xpbmU6IGlzTmV3bGluZSxcblxuICAgIGNtcENoYXI6IGNtcENoYXIsXG4gICAgY21wU3RyOiBjbXBTdHIsXG4gICAgZW5kc1dpdGg6IGVuZHNXaXRoLFxuXG4gICAgZmluZExhc3ROb25TcGFjZUxvY2F0aW9uOiBmaW5kTGFzdE5vblNwYWNlTG9jYXRpb24sXG4gICAgZmluZFdoaXRlU3BhY2VFbmQ6IGZpbmRXaGl0ZVNwYWNlRW5kLFxuICAgIGZpbmRDb21tZW50RW5kOiBmaW5kQ29tbWVudEVuZCxcbiAgICBmaW5kU3RyaW5nRW5kOiBmaW5kU3RyaW5nRW5kLFxuICAgIGZpbmREZWNpbWFsTnVtYmVyRW5kOiBmaW5kRGVjaW1hbE51bWJlckVuZCxcbiAgICBmaW5kTnVtYmVyRW5kOiBmaW5kTnVtYmVyRW5kLFxuICAgIGZpbmRFc2Nhc2VFbmQ6IGZpbmRFc2Nhc2VFbmQsXG4gICAgZmluZElkZW50aWZpZXJFbmQ6IGZpbmRJZGVudGlmaWVyRW5kLFxuICAgIGZpbmRVcmxSYXdFbmQ6IGZpbmRVcmxSYXdFbmRcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDc3NTeW50YXhFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKTtcblxudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3QnKTtcbnZhciBUWVBFID0gY29uc3RhbnRzLlRZUEU7XG52YXIgTkFNRSA9IGNvbnN0YW50cy5OQU1FO1xudmFyIFNZTUJPTF9UWVBFID0gY29uc3RhbnRzLlNZTUJPTF9UWVBFO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZmlyc3RDaGFyT2Zmc2V0ID0gdXRpbHMuZmlyc3RDaGFyT2Zmc2V0O1xudmFyIGNtcFN0ciA9IHV0aWxzLmNtcFN0cjtcbnZhciBpc051bWJlciA9IHV0aWxzLmlzTnVtYmVyO1xudmFyIGZpbmRMYXN0Tm9uU3BhY2VMb2NhdGlvbiA9IHV0aWxzLmZpbmRMYXN0Tm9uU3BhY2VMb2NhdGlvbjtcbnZhciBmaW5kV2hpdGVTcGFjZUVuZCA9IHV0aWxzLmZpbmRXaGl0ZVNwYWNlRW5kO1xudmFyIGZpbmRDb21tZW50RW5kID0gdXRpbHMuZmluZENvbW1lbnRFbmQ7XG52YXIgZmluZFN0cmluZ0VuZCA9IHV0aWxzLmZpbmRTdHJpbmdFbmQ7XG52YXIgZmluZE51bWJlckVuZCA9IHV0aWxzLmZpbmROdW1iZXJFbmQ7XG52YXIgZmluZElkZW50aWZpZXJFbmQgPSB1dGlscy5maW5kSWRlbnRpZmllckVuZDtcbnZhciBmaW5kVXJsUmF3RW5kID0gdXRpbHMuZmluZFVybFJhd0VuZDtcblxudmFyIE5VTEwgPSAwO1xudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBOVU1CRVIgPSBUWVBFLk51bWJlcjtcbnZhciBTVFJJTkcgPSBUWVBFLlN0cmluZztcbnZhciBDT01NRU5UID0gVFlQRS5Db21tZW50O1xudmFyIFBVTkNUVUFUT1IgPSBUWVBFLlB1bmN0dWF0b3I7XG52YXIgQ0RPID0gVFlQRS5DRE87XG52YXIgQ0RDID0gVFlQRS5DREM7XG52YXIgQVRSVUxFID0gVFlQRS5BdHJ1bGU7XG52YXIgRlVOQ1RJT04gPSBUWVBFLkZ1bmN0aW9uO1xudmFyIFVSTCA9IFRZUEUuVXJsO1xudmFyIFJBVyA9IFRZUEUuUmF3O1xuXG52YXIgTiA9IDEwO1xudmFyIEYgPSAxMjtcbnZhciBSID0gMTM7XG52YXIgU1RBUiA9IFRZUEUuQXN0ZXJpc2s7XG52YXIgU0xBU0ggPSBUWVBFLlNvbGlkdXM7XG52YXIgRlVMTFNUT1AgPSBUWVBFLkZ1bGxTdG9wO1xudmFyIFBMVVNTSUdOID0gVFlQRS5QbHVzU2lnbjtcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgR1JFQVRFUlRIQU5TSUdOID0gVFlQRS5HcmVhdGVyVGhhblNpZ247XG52YXIgTEVTU1RIQU5TSUdOID0gVFlQRS5MZXNzVGhhblNpZ247XG52YXIgRVhDTEFNQVRJT05NQVJLID0gVFlQRS5FeGNsYW1hdGlvbk1hcms7XG52YXIgQ09NTUVSQ0lBTEFUID0gVFlQRS5Db21tZXJjaWFsQXQ7XG52YXIgUVVPVEFUSU9OTUFSSyA9IFRZUEUuUXVvdGF0aW9uTWFyaztcbnZhciBBUE9TVFJPUEhFID0gVFlQRS5BcG9zdHJvcGhlO1xudmFyIExFRlRQQVJFTlRIRVNJUyA9IFRZUEUuTGVmdFBhcmVudGhlc2lzO1xudmFyIFJJR0hUUEFSRU5USEVTSVMgPSBUWVBFLlJpZ2h0UGFyZW50aGVzaXM7XG52YXIgTEVGVENVUkxZQlJBQ0tFVCA9IFRZUEUuTGVmdEN1cmx5QnJhY2tldDtcbnZhciBSSUdIVENVUkxZQlJBQ0tFVCA9IFRZUEUuUmlnaHRDdXJseUJyYWNrZXQ7XG52YXIgTEVGVFNRVUFSRUJSQUNLRVQgPSBUWVBFLkxlZnRTcXVhcmVCcmFja2V0O1xudmFyIFJJR0hUU1FVQVJFQlJBQ0tFVCA9IFRZUEUuUmlnaHRTcXVhcmVCcmFja2V0O1xuXG52YXIgTUlOX0JVRkZFUl9TSVpFID0gMTYgKiAxMDI0O1xudmFyIE9GRlNFVF9NQVNLID0gMHgwMEZGRkZGRjtcbnZhciBUWVBFX1NISUZUID0gMjQ7XG52YXIgU2FmZVVpbnQzMkFycmF5ID0gdHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQzMkFycmF5IDogQXJyYXk7IC8vIGZhbGxiYWNrIG9uIEFycmF5IHdoZW4gVHlwZWRBcnJheSBpcyBub3Qgc3VwcG9ydGVkXG5cbmZ1bmN0aW9uIGNvbXB1dGVMaW5lc0FuZENvbHVtbnModG9rZW5pemVyLCBzb3VyY2UpIHtcbiAgICB2YXIgc291cmNlTGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB2YXIgc3RhcnQgPSBmaXJzdENoYXJPZmZzZXQoc291cmNlKTtcbiAgICB2YXIgbGluZXMgPSB0b2tlbml6ZXIubGluZXM7XG4gICAgdmFyIGxpbmUgPSB0b2tlbml6ZXIuc3RhcnRMaW5lO1xuICAgIHZhciBjb2x1bW5zID0gdG9rZW5pemVyLmNvbHVtbnM7XG4gICAgdmFyIGNvbHVtbiA9IHRva2VuaXplci5zdGFydENvbHVtbjtcblxuICAgIGlmIChsaW5lcyA9PT0gbnVsbCB8fCBsaW5lcy5sZW5ndGggPCBzb3VyY2VMZW5ndGggKyAxKSB7XG4gICAgICAgIGxpbmVzID0gbmV3IFNhZmVVaW50MzJBcnJheShNYXRoLm1heChzb3VyY2VMZW5ndGggKyAxMDI0LCBNSU5fQlVGRkVSX1NJWkUpKTtcbiAgICAgICAgY29sdW1ucyA9IG5ldyBTYWZlVWludDMyQXJyYXkobGluZXMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBzb3VyY2VMZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGxpbmVzW2ldID0gbGluZTtcbiAgICAgICAgY29sdW1uc1tpXSA9IGNvbHVtbisrO1xuXG4gICAgICAgIGlmIChjb2RlID09PSBOIHx8IGNvZGUgPT09IFIgfHwgY29kZSA9PT0gRikge1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IFIgJiYgaSArIDEgPCBzb3VyY2VMZW5ndGggJiYgc291cmNlLmNoYXJDb2RlQXQoaSArIDEpID09PSBOKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zW2ldID0gY29sdW1uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lKys7XG4gICAgICAgICAgICBjb2x1bW4gPSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGluZXNbaV0gPSBsaW5lO1xuICAgIGNvbHVtbnNbaV0gPSBjb2x1bW47XG5cbiAgICB0b2tlbml6ZXIubGluZXNBbnNDb2x1bW5zQ29tcHV0ZWQgPSB0cnVlO1xuICAgIHRva2VuaXplci5saW5lcyA9IGxpbmVzO1xuICAgIHRva2VuaXplci5jb2x1bW5zID0gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gdG9rZW5MYXlvdXQodG9rZW5pemVyLCBzb3VyY2UsIHN0YXJ0UG9zKSB7XG4gICAgdmFyIHNvdXJjZUxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgdmFyIG9mZnNldEFuZFR5cGUgPSB0b2tlbml6ZXIub2Zmc2V0QW5kVHlwZTtcbiAgICB2YXIgYmFsYW5jZSA9IHRva2VuaXplci5iYWxhbmNlO1xuICAgIHZhciB0b2tlbkNvdW50ID0gMDtcbiAgICB2YXIgcHJldlR5cGUgPSAwO1xuICAgIHZhciBvZmZzZXQgPSBzdGFydFBvcztcbiAgICB2YXIgYW5jaG9yID0gMDtcbiAgICB2YXIgYmFsYW5jZUNsb3NlQ29kZSA9IDA7XG4gICAgdmFyIGJhbGFuY2VTdGFydCA9IDA7XG4gICAgdmFyIGJhbGFuY2VQcmV2ID0gMDtcblxuICAgIGlmIChvZmZzZXRBbmRUeXBlID09PSBudWxsIHx8IG9mZnNldEFuZFR5cGUubGVuZ3RoIDwgc291cmNlTGVuZ3RoICsgMSkge1xuICAgICAgICBvZmZzZXRBbmRUeXBlID0gbmV3IFNhZmVVaW50MzJBcnJheShzb3VyY2VMZW5ndGggKyAxMDI0KTtcbiAgICAgICAgYmFsYW5jZSA9IG5ldyBTYWZlVWludDMyQXJyYXkoc291cmNlTGVuZ3RoICsgMTAyNCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKG9mZnNldCA8IHNvdXJjZUxlbmd0aCkge1xuICAgICAgICB2YXIgY29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCk7XG4gICAgICAgIHZhciB0eXBlID0gY29kZSA8IDB4ODAgPyBTWU1CT0xfVFlQRVtjb2RlXSA6IElERU5USUZJRVI7XG5cbiAgICAgICAgYmFsYW5jZVt0b2tlbkNvdW50XSA9IHNvdXJjZUxlbmd0aDtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgV0hJVEVTUEFDRTpcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBmaW5kV2hpdGVTcGFjZUVuZChzb3VyY2UsIG9mZnNldCArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFBVTkNUVUFUT1I6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgYmFsYW5jZUNsb3NlQ29kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VQcmV2ID0gYmFsYW5jZVN0YXJ0ICYgT0ZGU0VUX01BU0s7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlU3RhcnQgPSBiYWxhbmNlW2JhbGFuY2VQcmV2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VDbG9zZUNvZGUgPSBiYWxhbmNlU3RhcnQgPj4gVFlQRV9TSElGVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VbdG9rZW5Db3VudF0gPSBiYWxhbmNlUHJldjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VbYmFsYW5jZVByZXYrK10gPSB0b2tlbkNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGJhbGFuY2VQcmV2IDwgdG9rZW5Db3VudDsgYmFsYW5jZVByZXYrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWxhbmNlW2JhbGFuY2VQcmV2XSA9PT0gc291cmNlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VbYmFsYW5jZVByZXZdID0gdG9rZW5Db3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlRTUVVBUkVCUkFDS0VUOlxuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVt0b2tlbkNvdW50XSA9IGJhbGFuY2VTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VDbG9zZUNvZGUgPSBSSUdIVFNRVUFSRUJSQUNLRVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlU3RhcnQgPSAoYmFsYW5jZUNsb3NlQ29kZSA8PCBUWVBFX1NISUZUKSB8IHRva2VuQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlRDVVJMWUJSQUNLRVQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlW3Rva2VuQ291bnRdID0gYmFsYW5jZVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZUNsb3NlQ29kZSA9IFJJR0hUQ1VSTFlCUkFDS0VUO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVN0YXJ0ID0gKGJhbGFuY2VDbG9zZUNvZGUgPDwgVFlQRV9TSElGVCkgfCB0b2tlbkNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUUEFSRU5USEVTSVM6XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlW3Rva2VuQ291bnRdID0gYmFsYW5jZVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZUNsb3NlQ29kZSA9IFJJR0hUUEFSRU5USEVTSVM7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlU3RhcnQgPSAoYmFsYW5jZUNsb3NlQ29kZSA8PCBUWVBFX1NISUZUKSB8IHRva2VuQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyAvKlxuICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBTVEFSICYmIHByZXZUeXBlID09PSBTTEFTSCkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ09NTUVOVDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZmluZENvbW1lbnRFbmQoc291cmNlLCBvZmZzZXQgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5Db3VudC0tOyAvLyByZXdyaXRlIHByZXYgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZWRnZSBjYXNlIGZvciAtLjEyMyBhbmQgKy4xMjNcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gRlVMTFNUT1AgJiYgKHByZXZUeXBlID09PSBQTFVTU0lHTiB8fCBwcmV2VHlwZSA9PT0gSFlQSEVOTUlOVVMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAxIDwgc291cmNlTGVuZ3RoICYmIGlzTnVtYmVyKHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCArIDEpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IE5VTUJFUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGZpbmROdW1iZXJFbmQoc291cmNlLCBvZmZzZXQgKyAyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkNvdW50LS07IC8vIHJld3JpdGUgcHJldiB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyA8IS0tXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IEVYQ0xBTUFUSU9OTUFSSyAmJiBwcmV2VHlwZSA9PT0gTEVTU1RIQU5TSUdOKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyIDwgc291cmNlTGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA9PT0gSFlQSEVOTUlOVVMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCArIDIpID09PSBIWVBIRU5NSU5VUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENETztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkNvdW50LS07IC8vIHJld3JpdGUgcHJldiB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyAtLT5cbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gSFlQSEVOTUlOVVMgJiYgcHJldlR5cGUgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAxIDwgc291cmNlTGVuZ3RoICYmIHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCArIDEpID09PSBHUkVBVEVSVEhBTlNJR04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDREM7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5Db3VudC0tOyAvLyByZXdyaXRlIHByZXYgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaWRlbnQoXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IExFRlRQQVJFTlRIRVNJUyAmJiBwcmV2VHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbkNvdW50LS07IC8vIHJld3JpdGUgcHJldiB0b2tlblxuICAgICAgICAgICAgICAgICAgICBiYWxhbmNlW3Rva2VuQ291bnRdID0gYmFsYW5jZVt0b2tlbkNvdW50ICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGJhbGFuY2VTdGFydC0tO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIDQgY2hhciBsZW5ndGggaWRlbnRpZmllciBhbmQgZXF1YWwgdG8gYHVybChgIChjYXNlIGluc2Vuc2l0aXZlKVxuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IC0gYW5jaG9yID09PSA0ICYmIGNtcFN0cihzb3VyY2UsIGFuY2hvciwgb2Zmc2V0LCAndXJsKCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVybCgpIGJlY2F1c2UgaXQgY2FuIGNvbnRhaW4gYW55IHN5bWJvbHMgc2VxdWVuY2Ugd2l0aCBmZXcgZXhjZXB0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gZmluZFdoaXRlU3BhY2VFbmQoc291cmNlLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KGFuY2hvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gTEVGVFBBUkVOVEhFU0lTICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPT0gUklHSFRQQVJFTlRIRVNJUyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT09IFFVT1RBVElPTk1BUksgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlICE9PSBBUE9TVFJPUEhFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldEFuZFR5cGVbdG9rZW5Db3VudCsrXSA9IChVUkwgPDwgVFlQRV9TSElGVCkgfCBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVt0b2tlbkNvdW50XSA9IHNvdXJjZUxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdzKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3IgIT09IG9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRBbmRUeXBlW3Rva2VuQ291bnQrK10gPSAoV0hJVEVTUEFDRSA8PCBUWVBFX1NISUZUKSB8IGFuY2hvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVt0b2tlbkNvdW50XSA9IHNvdXJjZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUkFXO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGZpbmRVcmxSYXdFbmQoc291cmNlLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gVVJMO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEZVTkNUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHR5cGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTlVNQkVSOlxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGZpbmROdW1iZXJFbmQoc291cmNlLCBvZmZzZXQgKyAxLCBwcmV2VHlwZSAhPT0gRlVMTFNUT1ApO1xuXG4gICAgICAgICAgICAgICAgLy8gbWVyZ2UgbnVtYmVyIHdpdGggYSBwcmVjZWRpbmcgZG90LCBkYXNoIG9yIHBsdXNcbiAgICAgICAgICAgICAgICBpZiAocHJldlR5cGUgPT09IEZVTExTVE9QIHx8XG4gICAgICAgICAgICAgICAgICAgIHByZXZUeXBlID09PSBIWVBIRU5NSU5VUyB8fFxuICAgICAgICAgICAgICAgICAgICBwcmV2VHlwZSA9PT0gUExVU1NJR04pIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5Db3VudC0tOyAvLyByZXdyaXRlIHByZXYgdG9rZW5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTVFJJTkc6XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gZmluZFN0cmluZ0VuZChzb3VyY2UsIG9mZnNldCArIDEsIGNvZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFuY2hvciA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBmaW5kSWRlbnRpZmllckVuZChzb3VyY2UsIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICAvLyBtZXJnZSBpZGVudGlmaWVyIHdpdGggYSBwcmVjZWRpbmcgZGFzaFxuICAgICAgICAgICAgICAgIGlmIChwcmV2VHlwZSA9PT0gSFlQSEVOTUlOVVMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV3cml0ZSBwcmV2IHRva2VuXG4gICAgICAgICAgICAgICAgICAgIHRva2VuQ291bnQtLTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwcmV2IHByZXYgdG9rZW4gdHlwZVxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY2FzZSBALXByZWZpeC1pZGVudFxuICAgICAgICAgICAgICAgICAgICBwcmV2VHlwZSA9IHRva2VuQ291bnQgPT09IDAgPyAwIDogb2Zmc2V0QW5kVHlwZVt0b2tlbkNvdW50IC0gMV0gPj4gVFlQRV9TSElGVDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJldlR5cGUgPT09IENPTU1FUkNJQUxBVCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZXdyaXRlIHByZXYgdG9rZW4gYW5kIGNoYW5nZSB0eXBlIHRvIDxhdC1rZXl3b3JkLXRva2VuPlxuICAgICAgICAgICAgICAgICAgICB0b2tlbkNvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBBVFJVTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0QW5kVHlwZVt0b2tlbkNvdW50KytdID0gKHR5cGUgPDwgVFlQRV9TSElGVCkgfCBvZmZzZXQ7XG4gICAgICAgIHByZXZUeXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBmaW5hbGl6ZSBhcnJheXNcbiAgICBvZmZzZXRBbmRUeXBlW3Rva2VuQ291bnRdID0gb2Zmc2V0O1xuICAgIGJhbGFuY2VbdG9rZW5Db3VudF0gPSBzb3VyY2VMZW5ndGg7XG4gICAgYmFsYW5jZVtzb3VyY2VMZW5ndGhdID0gc291cmNlTGVuZ3RoOyAvLyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZSBiYWxhbmNlIG1hdGNoIHdpdGggYW55IHRva2VuXG4gICAgd2hpbGUgKGJhbGFuY2VTdGFydCAhPT0gMCkge1xuICAgICAgICBiYWxhbmNlUHJldiA9IGJhbGFuY2VTdGFydCAmIE9GRlNFVF9NQVNLO1xuICAgICAgICBiYWxhbmNlU3RhcnQgPSBiYWxhbmNlW2JhbGFuY2VQcmV2XTtcbiAgICAgICAgYmFsYW5jZVtiYWxhbmNlUHJldl0gPSBzb3VyY2VMZW5ndGg7XG4gICAgfVxuXG4gICAgdG9rZW5pemVyLm9mZnNldEFuZFR5cGUgPSBvZmZzZXRBbmRUeXBlO1xuICAgIHRva2VuaXplci50b2tlbkNvdW50ID0gdG9rZW5Db3VudDtcbiAgICB0b2tlbml6ZXIuYmFsYW5jZSA9IGJhbGFuY2U7XG59XG5cbi8vXG4vLyB0b2tlbml6ZXJcbi8vXG5cbnZhciBUb2tlbml6ZXIgPSBmdW5jdGlvbihzb3VyY2UsIHN0YXJ0T2Zmc2V0LCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uKSB7XG4gICAgdGhpcy5vZmZzZXRBbmRUeXBlID0gbnVsbDtcbiAgICB0aGlzLmJhbGFuY2UgPSBudWxsO1xuICAgIHRoaXMubGluZXMgPSBudWxsO1xuICAgIHRoaXMuY29sdW1ucyA9IG51bGw7XG5cbiAgICB0aGlzLnNldFNvdXJjZShzb3VyY2UsIHN0YXJ0T2Zmc2V0LCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uKTtcbn07XG5cblRva2VuaXplci5wcm90b3R5cGUgPSB7XG4gICAgc2V0U291cmNlOiBmdW5jdGlvbihzb3VyY2UsIHN0YXJ0T2Zmc2V0LCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uKSB7XG4gICAgICAgIHZhciBzYWZlU291cmNlID0gU3RyaW5nKHNvdXJjZSB8fCAnJyk7XG4gICAgICAgIHZhciBzdGFydCA9IGZpcnN0Q2hhck9mZnNldChzYWZlU291cmNlKTtcblxuICAgICAgICB0aGlzLnNvdXJjZSA9IHNhZmVTb3VyY2U7XG4gICAgICAgIHRoaXMuZmlyc3RDaGFyT2Zmc2V0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuc3RhcnRPZmZzZXQgPSB0eXBlb2Ygc3RhcnRPZmZzZXQgPT09ICd1bmRlZmluZWQnID8gMCA6IHN0YXJ0T2Zmc2V0O1xuICAgICAgICB0aGlzLnN0YXJ0TGluZSA9IHR5cGVvZiBzdGFydExpbmUgPT09ICd1bmRlZmluZWQnID8gMSA6IHN0YXJ0TGluZTtcbiAgICAgICAgdGhpcy5zdGFydENvbHVtbiA9IHR5cGVvZiBzdGFydENvbHVtbiA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogc3RhcnRDb2x1bW47XG4gICAgICAgIHRoaXMubGluZXNBbnNDb2x1bW5zQ29tcHV0ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmVvZiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IC0xO1xuICAgICAgICB0aGlzLnRva2VuVHlwZSA9IDA7XG4gICAgICAgIHRoaXMudG9rZW5TdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLnRva2VuRW5kID0gc3RhcnQ7XG5cbiAgICAgICAgdG9rZW5MYXlvdXQodGhpcywgc2FmZVNvdXJjZSwgc3RhcnQpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9LFxuXG4gICAgbG9va3VwVHlwZTogZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCArPSB0aGlzLmN1cnJlbnRUb2tlbjtcblxuICAgICAgICBpZiAob2Zmc2V0IDwgdGhpcy50b2tlbkNvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXRBbmRUeXBlW29mZnNldF0gPj4gVFlQRV9TSElGVDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBOVUxMO1xuICAgIH0sXG4gICAgbG9va3VwTm9uV1NUeXBlOiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY3VycmVudFRva2VuO1xuXG4gICAgICAgIGZvciAodmFyIHR5cGU7IG9mZnNldCA8IHRoaXMudG9rZW5Db3VudDsgb2Zmc2V0KyspIHtcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLm9mZnNldEFuZFR5cGVbb2Zmc2V0XSA+PiBUWVBFX1NISUZUO1xuXG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gV0hJVEVTUEFDRSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE5VTEw7XG4gICAgfSxcbiAgICBsb29rdXBWYWx1ZTogZnVuY3Rpb24ob2Zmc2V0LCByZWZlcmVuY2VTdHIpIHtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY3VycmVudFRva2VuO1xuXG4gICAgICAgIGlmIChvZmZzZXQgPCB0aGlzLnRva2VuQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbXBTdHIoXG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRBbmRUeXBlW29mZnNldCAtIDFdICYgT0ZGU0VUX01BU0ssXG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRBbmRUeXBlW29mZnNldF0gJiBPRkZTRVRfTUFTSyxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VTdHJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBnZXRUb2tlblN0YXJ0OiBmdW5jdGlvbih0b2tlbk51bSkge1xuICAgICAgICBpZiAodG9rZW5OdW0gPT09IHRoaXMuY3VycmVudFRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlblN0YXJ0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuTnVtID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuTnVtIDwgdGhpcy50b2tlbkNvdW50XG4gICAgICAgICAgICAgICAgPyB0aGlzLm9mZnNldEFuZFR5cGVbdG9rZW5OdW0gLSAxXSAmIE9GRlNFVF9NQVNLXG4gICAgICAgICAgICAgICAgOiB0aGlzLm9mZnNldEFuZFR5cGVbdGhpcy50b2tlbkNvdW50XSAmIE9GRlNFVF9NQVNLO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFyT2Zmc2V0O1xuICAgIH0sXG4gICAgZ2V0T2Zmc2V0RXhjbHVkZVdTOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRva2VuID4gMCkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLm9mZnNldEFuZFR5cGVbdGhpcy5jdXJyZW50VG9rZW4gLSAxXSA+PiBUWVBFX1NISUZUKSA9PT0gV0hJVEVTUEFDRSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUb2tlbiA+IDFcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm9mZnNldEFuZFR5cGVbdGhpcy5jdXJyZW50VG9rZW4gLSAyXSAmIE9GRlNFVF9NQVNLXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5maXJzdENoYXJPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5TdGFydDtcbiAgICB9LFxuICAgIGdldFJhd0xlbmd0aDogZnVuY3Rpb24oc3RhcnRUb2tlbiwgZW5kVG9rZW5UeXBlMSwgZW5kVG9rZW5UeXBlMiwgaW5jbHVkZVRva2VuVHlwZTIpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IHN0YXJ0VG9rZW47XG4gICAgICAgIHZhciBiYWxhbmNlRW5kO1xuXG4gICAgICAgIGxvb3A6XG4gICAgICAgIGZvciAoOyBjdXJzb3IgPCB0aGlzLnRva2VuQ291bnQ7IGN1cnNvcisrKSB7XG4gICAgICAgICAgICBiYWxhbmNlRW5kID0gdGhpcy5iYWxhbmNlW2N1cnNvcl07XG5cbiAgICAgICAgICAgIC8vIGJlbGFuY2UgZW5kIHBvaW50cyB0byBvZmZzZXQgYmVmb3JlIHN0YXJ0XG4gICAgICAgICAgICBpZiAoYmFsYW5jZUVuZCA8IHN0YXJ0VG9rZW4pIHtcbiAgICAgICAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayB0b2tlbiBpcyBzdG9wIHR5cGVcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5vZmZzZXRBbmRUeXBlW2N1cnNvcl0gPj4gVFlQRV9TSElGVCkge1xuICAgICAgICAgICAgICAgIGNhc2UgZW5kVG9rZW5UeXBlMTpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcblxuICAgICAgICAgICAgICAgIGNhc2UgZW5kVG9rZW5UeXBlMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVUb2tlblR5cGUyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFzdCBmb3J3YXJkIHRvIHRoZSBlbmQgb2YgYmFsYW5jZWQgYmxvY2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFsYW5jZVtiYWxhbmNlRW5kXSA9PT0gY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgPSBiYWxhbmNlRW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJzb3IgLSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICB9LFxuXG4gICAgZ2V0VG9rZW5WYWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy50b2tlblN0YXJ0LCB0aGlzLnRva2VuRW5kKTtcbiAgICB9LFxuICAgIHN1YnN0clRvQ3Vyc29yOiBmdW5jdGlvbihzdGFydCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLnRva2VuU3RhcnQpO1xuICAgIH0sXG5cbiAgICBza2lwV1M6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5jdXJyZW50VG9rZW4sIHNraXBUb2tlbkNvdW50ID0gMDsgaSA8IHRoaXMudG9rZW5Db3VudDsgaSsrLCBza2lwVG9rZW5Db3VudCsrKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMub2Zmc2V0QW5kVHlwZVtpXSA+PiBUWVBFX1NISUZUKSAhPT0gV0hJVEVTUEFDRSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNraXBUb2tlbkNvdW50ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5za2lwKHNraXBUb2tlbkNvdW50KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc2tpcFNDOiBmdW5jdGlvbigpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMudG9rZW5UeXBlID09PSBXSElURVNQQUNFIHx8IHRoaXMudG9rZW5UeXBlID09PSBDT01NRU5UKSB7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc2tpcDogZnVuY3Rpb24odG9rZW5Db3VudCkge1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMuY3VycmVudFRva2VuICsgdG9rZW5Db3VudDtcblxuICAgICAgICBpZiAobmV4dCA8IHRoaXMudG9rZW5Db3VudCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSBuZXh0O1xuICAgICAgICAgICAgdGhpcy50b2tlblN0YXJ0ID0gdGhpcy5vZmZzZXRBbmRUeXBlW25leHQgLSAxXSAmIE9GRlNFVF9NQVNLO1xuICAgICAgICAgICAgbmV4dCA9IHRoaXMub2Zmc2V0QW5kVHlwZVtuZXh0XTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5UeXBlID0gbmV4dCA+PiBUWVBFX1NISUZUO1xuICAgICAgICAgICAgdGhpcy50b2tlbkVuZCA9IG5leHQgJiBPRkZTRVRfTUFTSztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gdGhpcy50b2tlbkNvdW50O1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMuY3VycmVudFRva2VuICsgMTtcblxuICAgICAgICBpZiAobmV4dCA8IHRoaXMudG9rZW5Db3VudCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSBuZXh0O1xuICAgICAgICAgICAgdGhpcy50b2tlblN0YXJ0ID0gdGhpcy50b2tlbkVuZDtcbiAgICAgICAgICAgIG5leHQgPSB0aGlzLm9mZnNldEFuZFR5cGVbbmV4dF07XG4gICAgICAgICAgICB0aGlzLnRva2VuVHlwZSA9IG5leHQgPj4gVFlQRV9TSElGVDtcbiAgICAgICAgICAgIHRoaXMudG9rZW5FbmQgPSBuZXh0ICYgT0ZGU0VUX01BU0s7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHRoaXMudG9rZW5Db3VudDtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5UeXBlID0gTlVMTDtcbiAgICAgICAgICAgIHRoaXMudG9rZW5TdGFydCA9IHRoaXMudG9rZW5FbmQgPSB0aGlzLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZWF0OiBmdW5jdGlvbih0b2tlblR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5UeXBlICE9PSB0b2tlblR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnRva2VuU3RhcnQ7XG4gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IE5BTUVbdG9rZW5UeXBlXSArICcgaXMgZXhwZWN0ZWQnO1xuXG4gICAgICAgICAgICAvLyB0d2VhayBtZXNzYWdlIGFuZCBvZmZzZXRcbiAgICAgICAgICAgIGlmICh0b2tlblR5cGUgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgICAgICAvLyB3aGVuIGlkZW50aWZpZXIgaXMgZXhwZWN0ZWQgYnV0IHRoZXJlIGlzIGEgZnVuY3Rpb24gb3IgdXJsXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG9rZW5UeXBlID09PSBGVU5DVElPTiB8fCB0aGlzLnRva2VuVHlwZSA9PT0gVVJMKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMudG9rZW5FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgYnV0IGZ1bmN0aW9uIGZvdW5kJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGVzdCB0eXBlIGlzIHBhcnQgb2YgYW5vdGhlciB0b2tlbiBzaG93IGVycm9yIGZvciBjdXJyZW50IHBvc2l0aW9uICsgMVxuICAgICAgICAgICAgICAgIC8vIGUuZy4gZWF0KEhZUEhFTk1JTlVTKSB3aWxsIGZhaWwgb24gXCItZm9vXCIsIGJ1dCBwb2ludGluZyBvbiBcIi1cIiBpcyBvZGRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnRva2VuU3RhcnQpID09PSB0b2tlblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgb2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH0sXG4gICAgZWF0Tm9uV1M6IGZ1bmN0aW9uKHRva2VuVHlwZSkge1xuICAgICAgICB0aGlzLnNraXBXUygpO1xuICAgICAgICB0aGlzLmVhdCh0b2tlblR5cGUpO1xuICAgIH0sXG5cbiAgICBjb25zdW1lOiBmdW5jdGlvbih0b2tlblR5cGUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRUb2tlblZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5lYXQodG9rZW5UeXBlKTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBjb25zdW1lRnVuY3Rpb25OYW1lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy50b2tlblN0YXJ0LCB0aGlzLnRva2VuRW5kIC0gMSk7XG5cbiAgICAgICAgdGhpcy5lYXQoRlVOQ1RJT04pO1xuXG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgY29uc3VtZU5vbldTOiBmdW5jdGlvbih0b2tlblR5cGUpIHtcbiAgICAgICAgdGhpcy5za2lwV1MoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdW1lKHRva2VuVHlwZSk7XG4gICAgfSxcblxuICAgIGV4cGVjdElkZW50aWZpZXI6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5UeXBlICE9PSBJREVOVElGSUVSIHx8IGNtcFN0cih0aGlzLnNvdXJjZSwgdGhpcy50b2tlblN0YXJ0LCB0aGlzLnRva2VuRW5kLCBuYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoJ0lkZW50aWZpZXIgYCcgKyBuYW1lICsgJ2AgaXMgZXhwZWN0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH0sXG5cbiAgICBnZXRMb2NhdGlvbjogZnVuY3Rpb24ob2Zmc2V0LCBmaWxlbmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMubGluZXNBbnNDb2x1bW5zQ29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGNvbXB1dGVMaW5lc0FuZENvbHVtbnModGhpcywgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZTogZmlsZW5hbWUsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMuc3RhcnRPZmZzZXQgKyBvZmZzZXQsXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVzW29mZnNldF0sXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uc1tvZmZzZXRdXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIGdldExvY2F0aW9uUmFuZ2U6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGZpbGVuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5saW5lc0Fuc0NvbHVtbnNDb21wdXRlZCkge1xuICAgICAgICAgICAgY29tcHV0ZUxpbmVzQW5kQ29sdW1ucyh0aGlzLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc291cmNlOiBmaWxlbmFtZSxcbiAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLnN0YXJ0T2Zmc2V0ICsgc3RhcnQsXG4gICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lc1tzdGFydF0sXG4gICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbnNbc3RhcnRdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLnN0YXJ0T2Zmc2V0ICsgZW5kLFxuICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZXNbZW5kXSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uc1tlbmRdXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIGVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uID0gdHlwZW9mIG9mZnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2Zmc2V0IDwgdGhpcy5zb3VyY2UubGVuZ3RoXG4gICAgICAgICAgICA/IHRoaXMuZ2V0TG9jYXRpb24ob2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLmVvZlxuICAgICAgICAgICAgICAgID8gZmluZExhc3ROb25TcGFjZUxvY2F0aW9uKHRoaXMpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmdldExvY2F0aW9uKHRoaXMudG9rZW5TdGFydCk7XG5cbiAgICAgICAgdGhyb3cgbmV3IENzc1N5bnRheEVycm9yKFxuICAgICAgICAgICAgbWVzc2FnZSB8fCAnVW5leHBlY3RlZCBpbnB1dCcsXG4gICAgICAgICAgICB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGxvY2F0aW9uLm9mZnNldCxcbiAgICAgICAgICAgIGxvY2F0aW9uLmxpbmUsXG4gICAgICAgICAgICBsb2NhdGlvbi5jb2x1bW5cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgZHVtcDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuXG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLm9mZnNldEFuZFR5cGUsIDAsIHRoaXMudG9rZW5Db3VudCkubWFwKGZ1bmN0aW9uKGl0ZW0sIGlkeCkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgdmFyIGVuZCA9IGl0ZW0gJiBPRkZTRVRfTUFTSztcblxuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkeDogaWR4LFxuICAgICAgICAgICAgICAgIHR5cGU6IE5BTUVbaXRlbSA+PiBUWVBFX1NISUZUXSxcbiAgICAgICAgICAgICAgICBjaHVuazogdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLFxuICAgICAgICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZVtpZHhdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB0aGlzKTtcbiAgICB9XG59O1xuXG4vLyBleHRlbmQgd2l0aCBlcnJvciBjbGFzc1xuVG9rZW5pemVyLkNzc1N5bnRheEVycm9yID0gQ3NzU3ludGF4RXJyb3I7XG5cbi8vIGV4dGVuZCB0b2tlbml6ZXIgd2l0aCBjb25zdGFudHNcbk9iamVjdC5rZXlzKGNvbnN0YW50cykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBUb2tlbml6ZXJba2V5XSA9IGNvbnN0YW50c1trZXldO1xufSk7XG5cbi8vIGV4dGVuZCB0b2tlbml6ZXIgd2l0aCBzdGF0aWMgbWV0aG9kcyBmcm9tIHV0aWxzXG5PYmplY3Qua2V5cyh1dGlscykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBUb2tlbml6ZXJba2V5XSA9IHV0aWxzW2tleV07XG59KTtcblxuLy8gd2FybSB1cCB0b2tlbml6ZXIgdG8gZWxpbWl0YXRlIGNvZGUgYnJhbmNoZXMgdGhhdCBuZXZlciBleGVjdXRlXG4vLyBmaXggc29mdCBkZW9wdGltaXphdGlvbnMgKGluc3VmZmljaWVudCB0eXBlIGZlZWRiYWNrKVxubmV3IFRva2VuaXplcignXFxuXFxyXFxyXFxuXFxmPCEtLS0tPi8vXCJcIlxcJ1xcJy8qXFxyXFxuXFxmKi8xYTsuXFxcXDMxXFx0XFwrMnt1cmwoYSk7ZnVuYygpOysxLjJlMyAtLjRlLTUgLjZlKzd9JykuZ2V0TG9jYXRpb24oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUb2tlbml6ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGlzTm9kZVR5cGUobm9kZSwgdHlwZSkge1xuICAgIHJldHVybiBub2RlICYmIG5vZGUudHlwZSA9PT0gdHlwZTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplTXVsdGlwbGllcihtdWx0aXBsaWVyKSB7XG4gICAgaWYgKG11bHRpcGxpZXIubWluID09PSAwICYmIG11bHRpcGxpZXIubWF4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnKic7XG4gICAgfVxuXG4gICAgaWYgKG11bHRpcGxpZXIubWluID09PSAwICYmIG11bHRpcGxpZXIubWF4ID09PSAxKSB7XG4gICAgICAgIHJldHVybiAnPyc7XG4gICAgfVxuXG4gICAgaWYgKG11bHRpcGxpZXIubWluID09PSAxICYmIG11bHRpcGxpZXIubWF4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBtdWx0aXBsaWVyLmNvbW1hID8gJyMnIDogJysnO1xuICAgIH1cblxuICAgIGlmIChtdWx0aXBsaWVyLm1pbiA9PT0gMSAmJiBtdWx0aXBsaWVyLm1heCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgKG11bHRpcGxpZXIuY29tbWEgPyAnIycgOiAnJykgK1xuICAgICAgICAneycgKyBtdWx0aXBsaWVyLm1pbiArIChtdWx0aXBsaWVyLm1pbiAhPT0gbXVsdGlwbGllci5tYXggPyAnLCcgKyAobXVsdGlwbGllci5tYXggIT09IDAgPyBtdWx0aXBsaWVyLm1heCA6ICcnKSA6ICcnKSArICd9J1xuICAgICk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVNlcXVlbmNlKG5vZGUsIGZvcmNlQnJhY2VzLCBkZWNvcmF0ZSkge1xuICAgIHZhciByZXN1bHQgPSAnJztcblxuICAgIGlmIChub2RlLmV4cGxpY2l0IHx8IGZvcmNlQnJhY2VzKSB7XG4gICAgICAgIHJlc3VsdCArPSAnWycgKyAoIWlzTm9kZVR5cGUobm9kZS50ZXJtc1swXSwgJ0NvbW1hJykgPyAnICcgOiAnJyk7XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9IG5vZGUudGVybXMubWFwKGZ1bmN0aW9uKHRlcm0pIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZSh0ZXJtLCBmb3JjZUJyYWNlcywgZGVjb3JhdGUpO1xuICAgIH0pLmpvaW4obm9kZS5jb21iaW5hdG9yID09PSAnICcgPyAnICcgOiAnICcgKyBub2RlLmNvbWJpbmF0b3IgKyAnICcpO1xuXG4gICAgaWYgKG5vZGUuZXhwbGljaXQgfHwgZm9yY2VCcmFjZXMpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgXSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlUGFyZW50aGVzZXMoZ3JvdXAsIGZvcmNlQnJhY2VzLCBkZWNvcmF0ZSkge1xuICAgIGlmICghZ3JvdXAudGVybXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAnKCknO1xuICAgIH1cblxuICAgIHJldHVybiAnKCAnICsgdHJhbnNsYXRlU2VxdWVuY2UoZ3JvdXAsIGZvcmNlQnJhY2VzLCBkZWNvcmF0ZSkgKyAnICknO1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGUobm9kZSwgZm9yY2VCcmFjZXMsIGRlY29yYXRlKSB7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0dyb3VwJzpcbiAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlU2VxdWVuY2Uobm9kZSwgZm9yY2VCcmFjZXMsIGRlY29yYXRlKSArXG4gICAgICAgICAgICAgICAgKG5vZGUuZGlzYWxsb3dFbXB0eSA/ICchJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplTXVsdGlwbGllcihub2RlLm11bHRpcGxpZXIpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICAgICAgICByZXN1bHQgPSBub2RlLm5hbWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICAgICAgICByZXN1bHQgPSBub2RlLm5hbWUgKyB0cmFuc2xhdGVQYXJlbnRoZXNlcyhub2RlLmNoaWxkcmVuLCBmb3JjZUJyYWNlcywgZGVjb3JhdGUpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnUGFyZW50aGVzZXMnOiAvLyByZXBsYWNlIGZvciBzZXEoJygnIHNlcSguLi5ub2RlLmNoaWxkcmVuKSAnKScpXG4gICAgICAgICAgICByZXN1bHQgPSB0cmFuc2xhdGVQYXJlbnRoZXNlcyhub2RlLmNoaWxkcmVuLCBmb3JjZUJyYWNlcywgZGVjb3JhdGUpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnVHlwZSc6XG4gICAgICAgICAgICByZXN1bHQgPSAnPCcgKyBub2RlLm5hbWUgKyAnPic7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdQcm9wZXJ0eSc6XG4gICAgICAgICAgICByZXN1bHQgPSAnPFxcJycgKyBub2RlLm5hbWUgKyAnXFwnPic7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdDb21iaW5hdG9yJzogLy8gcmVtb3ZlP1xuICAgICAgICBjYXNlICdTbGFzaCc6ICAgICAgLy8gcmVwbGFjZSBmb3IgU3RyaW5nPyAnLydcbiAgICAgICAgY2FzZSAnUGVyY2VudCc6ICAgIC8vIHJlcGxhY2UgZm9yIFN0cmluZz8gJyUnXG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgIGNhc2UgJ0NvbW1hJzpcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG5vZGUgdHlwZSBgJyArIG5vZGUudHlwZSArICdgJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZWNvcmF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXN1bHQgPSBkZWNvcmF0ZShyZXN1bHQsIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJhbnNsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3JlYXRlQ3VzdG9tRXJyb3IgPSByZXF1aXJlKCcuLi91dGlscy9jcmVhdGVDdXN0b21FcnJvcicpO1xudmFyIHRyYW5zbGF0ZUdyYW1tYXIgPSByZXF1aXJlKCcuL2dyYW1tYXIvdHJhbnNsYXRlJyk7XG5cbmZ1bmN0aW9uIGdldExvY2F0aW9uKG5vZGUsIHBvaW50KSB7XG4gICAgdmFyIGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MgJiYgbm9kZS5sb2NbcG9pbnRdO1xuXG4gICAgcmV0dXJuIGxvY1xuICAgICAgICA/IHsgb2Zmc2V0OiBsb2Mub2Zmc2V0LFxuICAgICAgICAgICAgbGluZTogbG9jLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGxvYy5jb2x1bW4gfVxuICAgICAgICA6IG51bGw7XG59XG5cbnZhciBTeW50YXhSZWZlcmVuY2VFcnJvciA9IGZ1bmN0aW9uKHR5cGUsIHJlZmVyZW5jZU5hbWUpIHtcbiAgICB2YXIgZXJyb3IgPSBjcmVhdGVDdXN0b21FcnJvcignU3ludGF4UmVmZXJlbmNlRXJyb3InLCB0eXBlICsgJyBgJyArIHJlZmVyZW5jZU5hbWUgKyAnYCcpO1xuXG4gICAgZXJyb3IucmVmZXJlbmNlID0gcmVmZXJlbmNlTmFtZTtcblxuICAgIHJldHVybiBlcnJvcjtcbn07XG5cbnZhciBNYXRjaEVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgbGV4ZXIsIHN5bnRheCwgdmFsdWUsIGJhZE5vZGUpIHtcbiAgICB2YXIgZXJyb3IgPSBjcmVhdGVDdXN0b21FcnJvcignU3ludGF4TWF0Y2hFcnJvcicsIG1lc3NhZ2UpO1xuICAgIHZhciBlcnJvck9mZnNldCA9IC0xO1xuICAgIHZhciBzdGFydCA9IGdldExvY2F0aW9uKGJhZE5vZGUsICdzdGFydCcpO1xuICAgIHZhciBlbmQgPSBnZXRMb2NhdGlvbihiYWROb2RlLCAnZW5kJyk7XG4gICAgdmFyIGNzcyA9IGxleGVyLnN5bnRheC50cmFuc2xhdGVNYXJrdXAodmFsdWUsIGZ1bmN0aW9uKG5vZGUsIGJ1ZmZlcikge1xuICAgICAgICBpZiAobm9kZSA9PT0gYmFkTm9kZSkge1xuICAgICAgICAgICAgZXJyb3JPZmZzZXQgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JPZmZzZXQgPT09IC0xKSB7XG4gICAgICAgIGVycm9yT2Zmc2V0ID0gY3NzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBlcnJvci5yYXdNZXNzYWdlID0gbWVzc2FnZTtcbiAgICBlcnJvci5zeW50YXggPSBzeW50YXggPyB0cmFuc2xhdGVHcmFtbWFyKHN5bnRheCkgOiAnPGdlbmVyaWM+JztcbiAgICBlcnJvci5jc3MgPSBjc3M7XG4gICAgZXJyb3IubWlzbWF0Y2hPZmZzZXQgPSBlcnJvck9mZnNldDtcbiAgICBlcnJvci5sb2MgPSB7XG4gICAgICAgIHNvdXJjZTogYmFkTm9kZSAmJiBiYWROb2RlLmxvYyAmJiBiYWROb2RlLmxvYy5zb3VyY2UgfHwgJzx1bmtub3duPicsXG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmRcbiAgICB9O1xuICAgIGVycm9yLmxpbmUgPSBzdGFydCA/IHN0YXJ0LmxpbmUgOiB1bmRlZmluZWQ7XG4gICAgZXJyb3IuY29sdW1uID0gc3RhcnQgPyBzdGFydC5jb2x1bW4gOiB1bmRlZmluZWQ7XG4gICAgZXJyb3Iub2Zmc2V0ID0gc3RhcnQgPyBzdGFydC5vZmZzZXQgOiB1bmRlZmluZWQ7XG4gICAgZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UgKyAnXFxuJyArXG4gICAgICAgICcgIHN5bnRheDogJyArIGVycm9yLnN5bnRheCArICdcXG4nICtcbiAgICAgICAgJyAgIHZhbHVlOiAnICsgKGVycm9yLmNzcyB8fCAnPGVtcHR5IHN0cmluZz4nKSArICdcXG4nICtcbiAgICAgICAgJyAgLS0tLS0tLS0nICsgbmV3IEFycmF5KGVycm9yLm1pc21hdGNoT2Zmc2V0ICsgMSkuam9pbignLScpICsgJ14nO1xuXG4gICAgcmV0dXJuIGVycm9yO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgU3ludGF4UmVmZXJlbmNlRXJyb3I6IFN5bnRheFJlZmVyZW5jZUVycm9yLFxuICAgIE1hdGNoRXJyb3I6IE1hdGNoRXJyb3Jcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIga2V5d29yZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xudmFyIHByb3BlcnRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xudmFyIEhZUEhFTk1JTlVTID0gNDU7IC8vICctJy5jaGFyQ29kZUF0KClcblxuZnVuY3Rpb24gaXNDdXN0b21Qcm9wZXJ0eShzdHIsIG9mZnNldCkge1xuICAgIHJldHVybiBzdHIubGVuZ3RoIC0gb2Zmc2V0ID49IDIgJiZcbiAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQob2Zmc2V0KSA9PT0gSFlQSEVOTUlOVVMgJiZcbiAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSkgPT09IEhZUEhFTk1JTlVTO1xufVxuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXgoc3RyLCBvZmZzZXQpIHtcbiAgICBpZiAoc3RyLmNoYXJDb2RlQXQob2Zmc2V0KSA9PT0gSFlQSEVOTUlOVVMpIHtcbiAgICAgICAgLy8gdmVuZG9yIHNob3VsZCBjb250YWluIGF0IGxlYXN0IG9uZSBsZXR0ZXJcbiAgICAgICAgdmFyIHNlY29uZERhc2hJbmRleCA9IHN0ci5pbmRleE9mKCctJywgb2Zmc2V0ICsgMik7XG5cbiAgICAgICAgaWYgKHNlY29uZERhc2hJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKG9mZnNldCwgc2Vjb25kRGFzaEluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldEtleXdvcmRJbmZvKGtleXdvcmQpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChrZXl3b3Jkcywga2V5d29yZCkpIHtcbiAgICAgICAgcmV0dXJuIGtleXdvcmRzW2tleXdvcmRdO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoa2V5d29yZHMsIG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBrZXl3b3Jkc1trZXl3b3JkXSA9IGtleXdvcmRzW25hbWVdO1xuICAgIH1cblxuICAgIHZhciB2ZW5kb3IgPSAhaXNDdXN0b21Qcm9wZXJ0eShuYW1lLCAwKSA/IGdldFZlbmRvclByZWZpeChuYW1lLCAwKSA6ICcnO1xuXG4gICAgcmV0dXJuIGtleXdvcmRzW2tleXdvcmRdID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIHZlbmRvcjogdmVuZG9yLFxuICAgICAgICBwcmVmaXg6IHZlbmRvcixcbiAgICAgICAgbmFtZTogbmFtZS5zdWJzdHIodmVuZG9yLmxlbmd0aClcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKHByb3BlcnR5KSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocHJvcGVydGllcywgcHJvcGVydHkpKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW3Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IHByb3BlcnR5O1xuICAgIHZhciBoYWNrID0gcHJvcGVydHlbMF07XG5cbiAgICBpZiAoaGFjayA9PT0gJy8nKSB7XG4gICAgICAgIGhhY2sgPSBwcm9wZXJ0eVsxXSA9PT0gJy8nID8gJy8vJyA6ICcvJztcbiAgICB9IGVsc2UgaWYgKGhhY2sgIT09ICdfJyAmJlxuICAgICAgICAgICAgICAgaGFjayAhPT0gJyonICYmXG4gICAgICAgICAgICAgICBoYWNrICE9PSAnJCcgJiZcbiAgICAgICAgICAgICAgIGhhY2sgIT09ICcjJyAmJlxuICAgICAgICAgICAgICAgaGFjayAhPT0gJysnKSB7XG4gICAgICAgIGhhY2sgPSAnJztcbiAgICB9XG5cbiAgICB2YXIgY3VzdG9tID0gaXNDdXN0b21Qcm9wZXJ0eShuYW1lLCBoYWNrLmxlbmd0aCk7XG5cbiAgICBpZiAoIWN1c3RvbSkge1xuICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChwcm9wZXJ0aWVzLCBuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNbcHJvcGVydHldID0gcHJvcGVydGllc1tuYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB2ZW5kb3IgPSAhY3VzdG9tID8gZ2V0VmVuZG9yUHJlZml4KG5hbWUsIGhhY2subGVuZ3RoKSA6ICcnO1xuXG4gICAgcmV0dXJuIHByb3BlcnRpZXNbcHJvcGVydHldID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGhhY2s6IGhhY2ssXG4gICAgICAgIHZlbmRvcjogdmVuZG9yLFxuICAgICAgICBwcmVmaXg6IGhhY2sgKyB2ZW5kb3IsXG4gICAgICAgIG5hbWU6IG5hbWUuc3Vic3RyKGhhY2subGVuZ3RoICsgdmVuZG9yLmxlbmd0aCksXG4gICAgICAgIGN1c3RvbTogY3VzdG9tXG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGtleXdvcmQ6IGdldEtleXdvcmRJbmZvLFxuICAgIHByb3BlcnR5OiBnZXRQcm9wZXJ0eUluZm9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBuYW1lcyA9IHJlcXVpcmUoJy4uL3V0aWxzL25hbWVzLmpzJyk7XG5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdmFsdWVzLTMvI2xlbmd0aHNcbnZhciBMRU5HVEggPSB7XG4gICAgLy8gYWJzb2x1dGUgbGVuZ3RoIHVuaXRzXG4gICAgJ3B4JzogdHJ1ZSxcbiAgICAnbW0nOiB0cnVlLFxuICAgICdjbSc6IHRydWUsXG4gICAgJ2luJzogdHJ1ZSxcbiAgICAncHQnOiB0cnVlLFxuICAgICdwYyc6IHRydWUsXG4gICAgJ3EnOiB0cnVlLFxuXG4gICAgLy8gcmVsYXRpdmUgbGVuZ3RoIHVuaXRzXG4gICAgJ2VtJzogdHJ1ZSxcbiAgICAnZXgnOiB0cnVlLFxuICAgICdjaCc6IHRydWUsXG4gICAgJ3JlbSc6IHRydWUsXG5cbiAgICAvLyB2aWV3cG9ydC1wZXJjZW50YWdlIGxlbmd0aHNcbiAgICAndmgnOiB0cnVlLFxuICAgICd2dyc6IHRydWUsXG4gICAgJ3ZtaW4nOiB0cnVlLFxuICAgICd2bWF4JzogdHJ1ZSxcbiAgICAndm0nOiB0cnVlXG59O1xuXG52YXIgQU5HTEUgPSB7XG4gICAgJ2RlZyc6IHRydWUsXG4gICAgJ2dyYWQnOiB0cnVlLFxuICAgICdyYWQnOiB0cnVlLFxuICAgICd0dXJuJzogdHJ1ZVxufTtcblxudmFyIFRJTUUgPSB7XG4gICAgJ3MnOiB0cnVlLFxuICAgICdtcyc6IHRydWVcbn07XG5cbnZhciBGUkVRVUVOQ1kgPSB7XG4gICAgJ2h6JzogdHJ1ZSxcbiAgICAna2h6JzogdHJ1ZVxufTtcblxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy12YWx1ZXMtMy8jcmVzb2x1dGlvbiAoaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMvI3Jlc29sdXRpb24pXG52YXIgUkVTT0xVVElPTiA9IHtcbiAgICAnZHBpJzogdHJ1ZSxcbiAgICAnZHBjbSc6IHRydWUsXG4gICAgJ2RwcHgnOiB0cnVlLFxuICAgICd4JzogdHJ1ZSAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvY3Nzd2ctZHJhZnRzL2lzc3Vlcy80NjFcbn07XG5cbi8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtZ3JpZC8jZnItdW5pdFxudmFyIEZMRVggPSB7XG4gICAgJ2ZyJzogdHJ1ZVxufTtcblxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2NzczMtc3BlZWNoLyNtaXhpbmctcHJvcHMtdm9pY2Utdm9sdW1lXG52YXIgREVDSUJFTCA9IHtcbiAgICAnZGInOiB0cnVlXG59O1xuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzMy1zcGVlY2gvI3ZvaWNlLXByb3BzLXZvaWNlLXBpdGNoXG52YXIgU0VNSVRPTkVTID0ge1xuICAgICdzdCc6IHRydWVcbn07XG5cbi8vIGNhbiBiZSB1c2VkIHdoZXJldmVyIDxsZW5ndGg+LCA8ZnJlcXVlbmN5PiwgPGFuZ2xlPiwgPHRpbWU+LCA8cGVyY2VudGFnZT4sIDxudW1iZXI+LCBvciA8aW50ZWdlcj4gdmFsdWVzIGFyZSBhbGxvd2VkXG4vLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy8jY2FsYy1ub3RhdGlvblxuZnVuY3Rpb24gaXNDYWxjKG5vZGUpIHtcbiAgICBpZiAobm9kZS5kYXRhLnR5cGUgIT09ICdGdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBrZXl3b3JkID0gbmFtZXMua2V5d29yZChub2RlLmRhdGEubmFtZSk7XG5cbiAgICBpZiAoa2V5d29yZC5uYW1lICE9PSAnY2FsYycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHRoZXJlIHdlcmUgc29tZSBwcmVmaXhlZCBpbXBsZW1lbnRhdGlvbnNcbiAgICByZXR1cm4ga2V5d29yZC52ZW5kb3IgPT09ICcnIHx8XG4gICAgICAgICAgIGtleXdvcmQudmVuZG9yID09PSAnLW1vei0nIHx8XG4gICAgICAgICAgIGtleXdvcmQudmVuZG9yID09PSAnLXdlYmtpdC0nO1xufVxuXG5mdW5jdGlvbiBhc3ROb2RlKHR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5kYXRhLnR5cGUgPT09IHR5cGU7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZGltZW5zaW9uKHR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gaXNDYWxjKG5vZGUpIHx8XG4gICAgICAgICAgICAgICAobm9kZS5kYXRhLnR5cGUgPT09ICdEaW1lbnNpb24nICYmIHR5cGUuaGFzT3duUHJvcGVydHkobm9kZS5kYXRhLnVuaXQudG9Mb3dlckNhc2UoKSkpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHplcm9Vbml0bGVzc0RpbWVuc2lvbih0eXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGlzQ2FsYyhub2RlKSB8fFxuICAgICAgICAgICAgICAgKG5vZGUuZGF0YS50eXBlID09PSAnRGltZW5zaW9uJyAmJiB0eXBlLmhhc093blByb3BlcnR5KG5vZGUuZGF0YS51bml0LnRvTG93ZXJDYXNlKCkpKSB8fFxuICAgICAgICAgICAgICAgKG5vZGUuZGF0YS50eXBlID09PSAnTnVtYmVyJyAmJiBOdW1iZXIobm9kZS5kYXRhLnZhbHVlKSA9PT0gMCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYXR0cihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZGF0YS50eXBlID09PSAnRnVuY3Rpb24nICYmIG5vZGUuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhdHRyJztcbn1cblxuZnVuY3Rpb24gbnVtYmVyKG5vZGUpIHtcbiAgICByZXR1cm4gaXNDYWxjKG5vZGUpIHx8IG5vZGUuZGF0YS50eXBlID09PSAnTnVtYmVyJztcbn1cblxuZnVuY3Rpb24gbnVtYmVyWmVyb09uZShub2RlKSB7XG4gICAgaWYgKGlzQ2FsYyhub2RlKSB8fCBub2RlLmRhdGEudHlwZSA9PT0gJ051bWJlcicpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gTnVtYmVyKG5vZGUuZGF0YS52YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG51bWJlck9uZU9yR3JlYXRlcihub2RlKSB7XG4gICAgaWYgKGlzQ2FsYyhub2RlKSB8fCBub2RlLmRhdGEudHlwZSA9PT0gJ051bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcihub2RlLmRhdGEudmFsdWUpID49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBUT0RPOiBmYWlsIG9uIDEwZS0yXG5mdW5jdGlvbiBpbnRlZ2VyKG5vZGUpIHtcbiAgICByZXR1cm4gaXNDYWxjKG5vZGUpIHx8XG4gICAgICAgICAgIChub2RlLmRhdGEudHlwZSA9PT0gJ051bWJlcicgJiYgbm9kZS5kYXRhLnZhbHVlLmluZGV4T2YoJy4nKSA9PT0gLTEpO1xufVxuXG4vLyBUT0RPOiBmYWlsIG9uIDEwZS0yXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVnZXIobm9kZSkge1xuICAgIHJldHVybiBpc0NhbGMobm9kZSkgfHxcbiAgICAgICAgICAgKG5vZGUuZGF0YS50eXBlID09PSAnTnVtYmVyJyAmJiBub2RlLmRhdGEudmFsdWUuaW5kZXhPZignLicpID09PSAtMSAmJiBub2RlLmRhdGEudmFsdWUuY2hhckF0KDApICE9PSAnLScpO1xufVxuXG5mdW5jdGlvbiBwZXJjZW50YWdlKG5vZGUpIHtcbiAgICByZXR1cm4gaXNDYWxjKG5vZGUpIHx8XG4gICAgICAgICAgIG5vZGUuZGF0YS50eXBlID09PSAnUGVyY2VudGFnZSc7XG59XG5cbmZ1bmN0aW9uIGhleENvbG9yKG5vZGUpIHtcbiAgICBpZiAobm9kZS5kYXRhLnR5cGUgIT09ICdIZXhDb2xvcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBoZXggPSBub2RlLmRhdGEudmFsdWU7XG5cbiAgICByZXR1cm4gL15bMC05YS1mQS1GXXszLDh9JC8udGVzdChoZXgpICYmXG4gICAgICAgICAgIChoZXgubGVuZ3RoID09PSAzIHx8IGhleC5sZW5ndGggPT09IDQgfHwgaGV4Lmxlbmd0aCA9PT0gNiB8fCBoZXgubGVuZ3RoID09PSA4KTtcbn1cblxuZnVuY3Rpb24gZXhwcmVzc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZGF0YS50eXBlID09PSAnRnVuY3Rpb24nICYmIG5vZGUuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdleHByZXNzaW9uJztcbn1cblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2N1c3RvbS1pZGVudFxuLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMtNC8jaWRlbnRpZmllci12YWx1ZVxuZnVuY3Rpb24gY3VzdG9tSWRlbnQobm9kZSkge1xuICAgIGlmIChub2RlLmRhdGEudHlwZSAhPT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IG5vZGUuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyDCpyAzLjIuIEF1dGhvci1kZWZpbmVkIElkZW50aWZpZXJzOiB0aGUgPGN1c3RvbS1pZGVudD4gdHlwZVxuICAgIC8vIFRoZSBDU1Mtd2lkZSBrZXl3b3JkcyBhcmUgbm90IHZhbGlkIDxjdXN0b20taWRlbnQ+c1xuICAgIGlmIChuYW1lID09PSAndW5zZXQnIHx8IG5hbWUgPT09ICdpbml0aWFsJyB8fCBuYW1lID09PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWZhdWx0IGtleXdvcmQgaXMgcmVzZXJ2ZWQgYW5kIGlzIGFsc28gbm90IGEgdmFsaWQgPGN1c3RvbS1pZGVudD5cbiAgICBpZiAobmFtZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBpZ25vcmUgcHJvcGVydHkgc3BlY2lmaWMga2V5d29yZHMgKGFzIGRlc2NyaWJlZCBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvY3VzdG9tLWlkZW50KVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdhbmdsZSc6IHplcm9Vbml0bGVzc0RpbWVuc2lvbihBTkdMRSksXG4gICAgJ2F0dHIoKSc6IGF0dHIsXG4gICAgJ2N1c3RvbS1pZGVudCc6IGN1c3RvbUlkZW50LFxuICAgICdkZWNpYmVsJzogZGltZW5zaW9uKERFQ0lCRUwpLFxuICAgICdkaW1lbnNpb24nOiBhc3ROb2RlKCdEaW1lbnNpb24nKSxcbiAgICAnZnJlcXVlbmN5JzogZGltZW5zaW9uKEZSRVFVRU5DWSksXG4gICAgJ2ZsZXgnOiBkaW1lbnNpb24oRkxFWCksXG4gICAgJ2hleC1jb2xvcic6IGhleENvbG9yLFxuICAgICdpZC1zZWxlY3Rvcic6IGFzdE5vZGUoJ0lkU2VsZWN0b3InKSwgLy8gZWxlbWVudCggPGlkLXNlbGVjdG9yPiApXG4gICAgJ2lkZW50JzogYXN0Tm9kZSgnSWRlbnRpZmllcicpLFxuICAgICdpbnRlZ2VyJzogaW50ZWdlcixcbiAgICAnbGVuZ3RoJzogemVyb1VuaXRsZXNzRGltZW5zaW9uKExFTkdUSCksXG4gICAgJ251bWJlcic6IG51bWJlcixcbiAgICAnbnVtYmVyLXplcm8tb25lJzogbnVtYmVyWmVyb09uZSxcbiAgICAnbnVtYmVyLW9uZS1vci1ncmVhdGVyJzogbnVtYmVyT25lT3JHcmVhdGVyLFxuICAgICdwZXJjZW50YWdlJzogcGVyY2VudGFnZSxcbiAgICAncG9zaXRpdmUtaW50ZWdlcic6IHBvc2l0aXZlSW50ZWdlcixcbiAgICAncmVzb2x1dGlvbic6IGRpbWVuc2lvbihSRVNPTFVUSU9OKSxcbiAgICAnc2VtaXRvbmVzJzogZGltZW5zaW9uKFNFTUlUT05FUyksXG4gICAgJ3N0cmluZyc6IGFzdE5vZGUoJ1N0cmluZycpLFxuICAgICd0aW1lJzogZGltZW5zaW9uKFRJTUUpLFxuICAgICd1bmljb2RlLXJhbmdlJzogYXN0Tm9kZSgnVW5pY29kZVJhbmdlJyksXG4gICAgJ3VybCc6IGFzdE5vZGUoJ1VybCcpLFxuXG4gICAgLy8gb2xkIElFIHN0dWZmXG4gICAgJ3Byb2dpZCc6IGFzdE5vZGUoJ1JhdycpLFxuICAgICdleHByZXNzaW9uJzogZXhwcmVzc2lvblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRheFBhcnNlRXJyb3IgPSByZXF1aXJlKCcuL2Vycm9yJykuU3ludGF4UGFyc2VFcnJvcjtcblxudmFyIFRBQiA9IDk7XG52YXIgTiA9IDEwO1xudmFyIEYgPSAxMjtcbnZhciBSID0gMTM7XG52YXIgU1BBQ0UgPSAzMjtcbnZhciBFWENMQU1BVElPTk1BUksgPSAzMzsgICAgLy8gIVxudmFyIE5VTUJFUlNJR04gPSAzNTsgICAgICAgICAvLyAjXG52YXIgUEVSQ0VOVFNJR04gPSAzNzsgICAgICAgIC8vICVcbnZhciBBTVBFUlNBTkQgPSAzODsgICAgICAgICAgLy8gJlxudmFyIEFQT1NUUk9QSEUgPSAzOTsgICAgICAgICAvLyAnXG52YXIgTEVGVFBBUkVOVEhFU0lTID0gNDA7ICAgIC8vIChcbnZhciBSSUdIVFBBUkVOVEhFU0lTID0gNDE7ICAgLy8gKVxudmFyIEFTVEVSSVNLID0gNDI7ICAgICAgICAgICAvLyAqXG52YXIgUExVU1NJR04gPSA0MzsgICAgICAgICAgIC8vICtcbnZhciBDT01NQSA9IDQ0OyAgICAgICAgICAgICAgLy8gLFxudmFyIFNPTElEVVMgPSA0NzsgICAgICAgICAgICAvLyAvXG52YXIgTEVTU1RIQU5TSUdOID0gNjA7ICAgICAgIC8vIDxcbnZhciBHUkVBVEVSVEhBTlNJR04gPSA2MjsgICAgLy8gPlxudmFyIFFVRVNUSU9OTUFSSyA9IDYzOyAgICAgICAvLyA/XG52YXIgTEVGVFNRVUFSRUJSQUNLRVQgPSA5MTsgIC8vIFtcbnZhciBSSUdIVFNRVUFSRUJSQUNLRVQgPSA5MzsgLy8gXVxudmFyIExFRlRDVVJMWUJSQUNLRVQgPSAxMjM7ICAvLyB7XG52YXIgVkVSVElDQUxMSU5FID0gMTI0OyAgICAgIC8vIHxcbnZhciBSSUdIVENVUkxZQlJBQ0tFVCA9IDEyNTsgLy8gfVxudmFyIENPTUJJTkFUT1JfUFJFQ0VERU5DRSA9IHtcbiAgICAnICc6IDEsXG4gICAgJyYmJzogMixcbiAgICAnfHwnOiAzLFxuICAgICd8JzogNFxufTtcbnZhciBNVUxUSVBMSUVSX0RFRkFVTFQgPSB7XG4gICAgY29tbWE6IGZhbHNlLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDFcbn07XG52YXIgTVVMVElQTElFUl9aRVJPX09SX01PUkUgPSB7XG4gICAgY29tbWE6IGZhbHNlLFxuICAgIG1pbjogMCxcbiAgICBtYXg6IDBcbn07XG52YXIgTVVMVElQTElFUl9PTkVfT1JfTU9SRSA9IHtcbiAgICBjb21tYTogZmFsc2UsXG4gICAgbWluOiAxLFxuICAgIG1heDogMFxufTtcbnZhciBNVUxUSVBMSUVSX09ORV9PUl9NT1JFX0NPTU1BX1NFUEFSQVRFRCA9IHtcbiAgICBjb21tYTogdHJ1ZSxcbiAgICBtaW46IDEsXG4gICAgbWF4OiAwXG59O1xudmFyIE1VTFRJUExJRVJfWkVST19PUl9PTkUgPSB7XG4gICAgY29tbWE6IGZhbHNlLFxuICAgIG1pbjogMCxcbiAgICBtYXg6IDFcbn07XG52YXIgTkFNRV9DSEFSID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcnJheSA9IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBVaW50MzJBcnJheSgxMjgpIDogbmV3IEFycmF5KDEyOCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjg7IGkrKykge1xuICAgICAgICBhcnJheVtpXSA9IC9bYS16QS1aMC05XFwtXS8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKSA/IDEgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59KSgpO1xuXG52YXIgVG9rZW5pemVyID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5wb3MgPSAwO1xufTtcblRva2VuaXplci5wcm90b3R5cGUgPSB7XG4gICAgY2hhckNvZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPCB0aGlzLnN0ci5sZW5ndGggPyB0aGlzLnN0ci5jaGFyQ29kZUF0KHRoaXMucG9zKSA6IDA7XG4gICAgfSxcbiAgICBuZXh0Q2hhckNvZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKyAxIDwgdGhpcy5zdHIubGVuZ3RoID8gdGhpcy5zdHIuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpIDogMDtcbiAgICB9LFxuICAgIHN1YnN0cmluZ1RvUG9zOiBmdW5jdGlvbihlbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyLnN1YnN0cmluZyh0aGlzLnBvcywgdGhpcy5wb3MgPSBlbmQpO1xuICAgIH0sXG4gICAgZWF0OiBmdW5jdGlvbihjb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJDb2RlKCkgIT09IGNvZGUpIHtcbiAgICAgICAgICAgIGVycm9yKHRoaXMsIHRoaXMucG9zLCAnRXhwZWN0IGAnICsgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSArICdgJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcysrO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHNjYW5TcGFjZXModG9rZW5pemVyKSB7XG4gICAgdmFyIGVuZCA9IHRva2VuaXplci5wb3MgKyAxO1xuXG4gICAgZm9yICg7IGVuZCA8IHRva2VuaXplci5zdHIubGVuZ3RoOyBlbmQrKykge1xuICAgICAgICB2YXIgY29kZSA9IHRva2VuaXplci5zdHIuY2hhckNvZGVBdChlbmQpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUiAmJiBjb2RlICE9PSBOICYmIGNvZGUgIT09IEYgJiYgY29kZSAhPT0gU1BBQ0UgJiYgY29kZSAhPT0gVEFCKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b2tlbml6ZXIuc3Vic3RyaW5nVG9Qb3MoZW5kKTtcbn1cblxuZnVuY3Rpb24gc2NhbldvcmQodG9rZW5pemVyKSB7XG4gICAgdmFyIGVuZCA9IHRva2VuaXplci5wb3M7XG5cbiAgICBmb3IgKDsgZW5kIDwgdG9rZW5pemVyLnN0ci5sZW5ndGg7IGVuZCsrKSB7XG4gICAgICAgIHZhciBjb2RlID0gdG9rZW5pemVyLnN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gICAgICAgIGlmIChjb2RlID49IDEyOCB8fCBOQU1FX0NIQVJbY29kZV0gPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRva2VuaXplci5wb3MgPT09IGVuZCkge1xuICAgICAgICBlcnJvcih0b2tlbml6ZXIsIHRva2VuaXplci5wb3MsICdFeHBlY3QgYSBrZXl3b3JkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuaXplci5zdWJzdHJpbmdUb1BvcyhlbmQpO1xufVxuXG5mdW5jdGlvbiBzY2FuTnVtYmVyKHRva2VuaXplcikge1xuICAgIHZhciBlbmQgPSB0b2tlbml6ZXIucG9zO1xuXG4gICAgZm9yICg7IGVuZCA8IHRva2VuaXplci5zdHIubGVuZ3RoOyBlbmQrKykge1xuICAgICAgICB2YXIgY29kZSA9IHRva2VuaXplci5zdHIuY2hhckNvZGVBdChlbmQpO1xuICAgICAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiA1Nykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodG9rZW5pemVyLnBvcyA9PT0gZW5kKSB7XG4gICAgICAgIGVycm9yKHRva2VuaXplciwgdG9rZW5pemVyLnBvcywgJ0V4cGVjdCBhIG51bWJlcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbml6ZXIuc3Vic3RyaW5nVG9Qb3MoZW5kKTtcbn1cblxuZnVuY3Rpb24gc2NhblN0cmluZyh0b2tlbml6ZXIpIHtcbiAgICB2YXIgZW5kID0gdG9rZW5pemVyLnN0ci5pbmRleE9mKCdcXCcnLCB0b2tlbml6ZXIucG9zICsgMSk7XG5cbiAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICBlcnJvcih0b2tlbml6ZXIsIHRva2VuaXplci5zdHIubGVuZ3RoLCAnRXhwZWN0IGEgcXVvdGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5pemVyLnN1YnN0cmluZ1RvUG9zKGVuZCArIDEpO1xufVxuXG5mdW5jdGlvbiByZWFkTXVsdGlwbGllclJhbmdlKHRva2VuaXplciwgY29tbWEpIHtcbiAgICB2YXIgbWluID0gbnVsbDtcbiAgICB2YXIgbWF4ID0gbnVsbDtcblxuICAgIHRva2VuaXplci5lYXQoTEVGVENVUkxZQlJBQ0tFVCk7XG5cbiAgICBtaW4gPSBzY2FuTnVtYmVyKHRva2VuaXplcik7XG5cbiAgICBpZiAodG9rZW5pemVyLmNoYXJDb2RlKCkgPT09IENPTU1BKSB7XG4gICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgaWYgKHRva2VuaXplci5jaGFyQ29kZSgpICE9PSBSSUdIVENVUkxZQlJBQ0tFVCkge1xuICAgICAgICAgICAgbWF4ID0gc2Nhbk51bWJlcih0b2tlbml6ZXIpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gbWluO1xuICAgIH1cblxuICAgIHRva2VuaXplci5lYXQoUklHSFRDVVJMWUJSQUNLRVQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWE6IGNvbW1hLFxuICAgICAgICBtaW46IE51bWJlcihtaW4pLFxuICAgICAgICBtYXg6IG1heCA/IE51bWJlcihtYXgpIDogMFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHJlYWRNdWx0aXBsaWVyKHRva2VuaXplcikge1xuICAgIHN3aXRjaCAodG9rZW5pemVyLmNoYXJDb2RlKCkpIHtcbiAgICAgICAgY2FzZSBBU1RFUklTSzpcbiAgICAgICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgICAgIHJldHVybiBNVUxUSVBMSUVSX1pFUk9fT1JfTU9SRTtcblxuICAgICAgICBjYXNlIFBMVVNTSUdOOlxuICAgICAgICAgICAgdG9rZW5pemVyLnBvcysrO1xuICAgICAgICAgICAgcmV0dXJuIE1VTFRJUExJRVJfT05FX09SX01PUkU7XG5cbiAgICAgICAgY2FzZSBRVUVTVElPTk1BUks6XG4gICAgICAgICAgICB0b2tlbml6ZXIucG9zKys7XG4gICAgICAgICAgICByZXR1cm4gTVVMVElQTElFUl9aRVJPX09SX09ORTtcblxuICAgICAgICBjYXNlIE5VTUJFUlNJR046XG4gICAgICAgICAgICB0b2tlbml6ZXIucG9zKys7XG5cbiAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuY2hhckNvZGUoKSAhPT0gTEVGVENVUkxZQlJBQ0tFVCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNVUxUSVBMSUVSX09ORV9PUl9NT1JFX0NPTU1BX1NFUEFSQVRFRDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlYWRNdWx0aXBsaWVyUmFuZ2UodG9rZW5pemVyLCB0cnVlKTtcblxuICAgICAgICBjYXNlIExFRlRDVVJMWUJSQUNLRVQ6XG4gICAgICAgICAgICByZXR1cm4gcmVhZE11bHRpcGxpZXJSYW5nZSh0b2tlbml6ZXIsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gTVVMVElQTElFUl9ERUZBVUxUO1xufVxuXG5mdW5jdGlvbiBtYXliZU11bHRpcGxpZWQodG9rZW5pemVyLCBub2RlKSB7XG4gICAgdmFyIG11bHRpcGxpZXIgPSByZWFkTXVsdGlwbGllcih0b2tlbml6ZXIpO1xuXG4gICAgaWYgKG11bHRpcGxpZXIgIT09IE1VTFRJUExJRVJfREVGQVVMVCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0dyb3VwJyxcbiAgICAgICAgICAgIHRlcm1zOiBbbm9kZV0sXG4gICAgICAgICAgICBjb21iaW5hdG9yOiAnfCcsICAvLyBgfGAgY29tYmluYXRvciBpcyBzaW1wbGVzdCBpbiBpbXBsZW1lbnRhdGlvbiAoYW5kIHRoZXJlZm9yZSBmYXN0ZXIpXG4gICAgICAgICAgICBkaXNhbGxvd0VtcHR5OiBmYWxzZSxcbiAgICAgICAgICAgIG11bHRpcGxpZXI6IG11bHRpcGxpZXIsXG4gICAgICAgICAgICBleHBsaWNpdDogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gcmVhZFByb3BlcnR5KHRva2VuaXplcikge1xuICAgIHZhciBuYW1lO1xuXG4gICAgdG9rZW5pemVyLmVhdChMRVNTVEhBTlNJR04pO1xuICAgIHRva2VuaXplci5lYXQoQVBPU1RST1BIRSk7XG5cbiAgICBuYW1lID0gc2NhbldvcmQodG9rZW5pemVyKTtcblxuICAgIHRva2VuaXplci5lYXQoQVBPU1RST1BIRSk7XG4gICAgdG9rZW5pemVyLmVhdChHUkVBVEVSVEhBTlNJR04pO1xuXG4gICAgcmV0dXJuIG1heWJlTXVsdGlwbGllZCh0b2tlbml6ZXIsIHtcbiAgICAgICAgdHlwZTogJ1Byb3BlcnR5JyxcbiAgICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkVHlwZSh0b2tlbml6ZXIpIHtcbiAgICB2YXIgbmFtZTtcblxuICAgIHRva2VuaXplci5lYXQoTEVTU1RIQU5TSUdOKTtcbiAgICBuYW1lID0gc2NhbldvcmQodG9rZW5pemVyKTtcblxuICAgIGlmICh0b2tlbml6ZXIuY2hhckNvZGUoKSA9PT0gTEVGVFBBUkVOVEhFU0lTICYmXG4gICAgICAgIHRva2VuaXplci5uZXh0Q2hhckNvZGUoKSA9PT0gUklHSFRQQVJFTlRIRVNJUykge1xuICAgICAgICB0b2tlbml6ZXIucG9zICs9IDI7XG4gICAgICAgIG5hbWUgKz0gJygpJztcbiAgICB9XG5cbiAgICB0b2tlbml6ZXIuZWF0KEdSRUFURVJUSEFOU0lHTik7XG5cbiAgICByZXR1cm4gbWF5YmVNdWx0aXBsaWVkKHRva2VuaXplciwge1xuICAgICAgICB0eXBlOiAnVHlwZScsXG4gICAgICAgIG5hbWU6IG5hbWVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZEtleXdvcmRPckZ1bmN0aW9uKHRva2VuaXplcikge1xuICAgIHZhciBjaGlsZHJlbiA9IG51bGw7XG4gICAgdmFyIG5hbWU7XG5cbiAgICBuYW1lID0gc2NhbldvcmQodG9rZW5pemVyKTtcblxuICAgIGlmICh0b2tlbml6ZXIuY2hhckNvZGUoKSA9PT0gTEVGVFBBUkVOVEhFU0lTKSB7XG4gICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgY2hpbGRyZW4gPSByZWFkSW1wbGljaXRHcm91cCh0b2tlbml6ZXIpO1xuICAgICAgICB0b2tlbml6ZXIuZWF0KFJJR0hUUEFSRU5USEVTSVMpO1xuXG4gICAgICAgIHJldHVybiBtYXliZU11bHRpcGxpZWQodG9rZW5pemVyLCB7XG4gICAgICAgICAgICB0eXBlOiAnRnVuY3Rpb24nLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVNdWx0aXBsaWVkKHRva2VuaXplciwge1xuICAgICAgICB0eXBlOiAnS2V5d29yZCcsXG4gICAgICAgIG5hbWU6IG5hbWVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcmVncm91cFRlcm1zKHRlcm1zLCBjb21iaW5hdG9ycykge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUdyb3VwKHRlcm1zLCBjb21iaW5hdG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnR3JvdXAnLFxuICAgICAgICAgICAgdGVybXM6IHRlcm1zLFxuICAgICAgICAgICAgY29tYmluYXRvcjogY29tYmluYXRvcixcbiAgICAgICAgICAgIGRpc2FsbG93RW1wdHk6IGZhbHNlLFxuICAgICAgICAgICAgbXVsdGlwbGllcjogTVVMVElQTElFUl9ERUZBVUxULFxuICAgICAgICAgICAgZXhwbGljaXQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29tYmluYXRvcnMgPSBPYmplY3Qua2V5cyhjb21iaW5hdG9ycykuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBDT01CSU5BVE9SX1BSRUNFREVOQ0VbYV0gLSBDT01CSU5BVE9SX1BSRUNFREVOQ0VbYl07XG4gICAgfSk7XG5cbiAgICB3aGlsZSAoY29tYmluYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgY29tYmluYXRvciA9IGNvbWJpbmF0b3JzLnNoaWZ0KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBzdWJncm91cFN0YXJ0ID0gMDsgaSA8IHRlcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGVybSA9IHRlcm1zW2ldO1xuICAgICAgICAgICAgaWYgKHRlcm0udHlwZSA9PT0gJ0NvbWJpbmF0b3InKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlcm0udmFsdWUgPT09IGNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Ymdyb3VwU3RhcnQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJncm91cFN0YXJ0ID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGVybXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Ymdyb3VwU3RhcnQgIT09IC0xICYmIGkgLSBzdWJncm91cFN0YXJ0ID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMuc3BsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ymdyb3VwU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAtIHN1Ymdyb3VwU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlR3JvdXAodGVybXMuc2xpY2Uoc3ViZ3JvdXBTdGFydCwgaSksIGNvbWJpbmF0b3IpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHN1Ymdyb3VwU3RhcnQgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1Ymdyb3VwU3RhcnQgPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViZ3JvdXBTdGFydCAhPT0gLTEgJiYgY29tYmluYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0ZXJtcy5zcGxpY2UoXG4gICAgICAgICAgICAgICAgc3ViZ3JvdXBTdGFydCxcbiAgICAgICAgICAgICAgICBpIC0gc3ViZ3JvdXBTdGFydCxcbiAgICAgICAgICAgICAgICBjcmVhdGVHcm91cCh0ZXJtcy5zbGljZShzdWJncm91cFN0YXJ0LCBpKSwgY29tYmluYXRvcilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tYmluYXRvcjtcbn1cblxuZnVuY3Rpb24gcmVhZEltcGxpY2l0R3JvdXAodG9rZW5pemVyKSB7XG4gICAgdmFyIHRlcm1zID0gW107XG4gICAgdmFyIGNvbWJpbmF0b3JzID0ge307XG4gICAgdmFyIHRva2VuO1xuICAgIHZhciBwcmV2VG9rZW4gPSBudWxsO1xuICAgIHZhciBwcmV2VG9rZW5Qb3MgPSB0b2tlbml6ZXIucG9zO1xuXG4gICAgd2hpbGUgKHRva2VuID0gcGVlayh0b2tlbml6ZXIpKSB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlICE9PSAnU3BhY2VzJykge1xuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdDb21iaW5hdG9yJykge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBjb21iaW5hdG9yIGluIGdyb3VwIGJlZ2lubmluZyBhbmQgZG91YmxlIGNvbWJpbmF0b3Igc2VxdWVuY2VcbiAgICAgICAgICAgICAgICBpZiAocHJldlRva2VuID09PSBudWxsIHx8IHByZXZUb2tlbi50eXBlID09PSAnQ29tYmluYXRvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IodG9rZW5pemVyLCBwcmV2VG9rZW5Qb3MsICdVbmV4cGVjdGVkIGNvbWJpbmF0b3InKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yc1t0b2tlbi52YWx1ZV0gPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2VG9rZW4gIT09IG51bGwgJiYgcHJldlRva2VuLnR5cGUgIT09ICdDb21iaW5hdG9yJykge1xuICAgICAgICAgICAgICAgIGNvbWJpbmF0b3JzWycgJ10gPSB0cnVlOyAgLy8gYSBiXG4gICAgICAgICAgICAgICAgdGVybXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDb21iaW5hdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcgJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0ZXJtcy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIHByZXZUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgcHJldlRva2VuUG9zID0gdG9rZW5pemVyLnBvcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBjb21iaW5hdG9yIGluIGdyb3VwIGVuZGluZ1xuICAgIGlmIChwcmV2VG9rZW4gIT09IG51bGwgJiYgcHJldlRva2VuLnR5cGUgPT09ICdDb21iaW5hdG9yJykge1xuICAgICAgICBlcnJvcih0b2tlbml6ZXIsIHRva2VuaXplci5wb3MgLSBwcmV2VG9rZW5Qb3MsICdVbmV4cGVjdGVkIGNvbWJpbmF0b3InKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnR3JvdXAnLFxuICAgICAgICB0ZXJtczogdGVybXMsXG4gICAgICAgIGNvbWJpbmF0b3I6IHJlZ3JvdXBUZXJtcyh0ZXJtcywgY29tYmluYXRvcnMpIHx8ICcgJyxcbiAgICAgICAgZGlzYWxsb3dFbXB0eTogZmFsc2UsXG4gICAgICAgIG11bHRpcGxpZXI6IE1VTFRJUExJRVJfREVGQVVMVCxcbiAgICAgICAgZXhwbGljaXQ6IGZhbHNlXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVhZEdyb3VwKHRva2VuaXplcikge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICB0b2tlbml6ZXIuZWF0KExFRlRTUVVBUkVCUkFDS0VUKTtcbiAgICByZXN1bHQgPSByZWFkSW1wbGljaXRHcm91cCh0b2tlbml6ZXIpO1xuICAgIHRva2VuaXplci5lYXQoUklHSFRTUVVBUkVCUkFDS0VUKTtcblxuICAgIHJlc3VsdC5leHBsaWNpdCA9IHRydWU7XG4gICAgcmVzdWx0Lm11bHRpcGxpZXIgPSByZWFkTXVsdGlwbGllcih0b2tlbml6ZXIpO1xuXG4gICAgaWYgKHRva2VuaXplci5jaGFyQ29kZSgpID09PSBFWENMQU1BVElPTk1BUkspIHtcbiAgICAgICAgdG9rZW5pemVyLnBvcysrO1xuICAgICAgICByZXN1bHQuZGlzYWxsb3dFbXB0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcGVlayh0b2tlbml6ZXIpIHtcbiAgICB2YXIgY29kZSA9IHRva2VuaXplci5jaGFyQ29kZSgpO1xuXG4gICAgaWYgKGNvZGUgPCAxMjggJiYgTkFNRV9DSEFSW2NvZGVdID09PSAxKSB7XG4gICAgICAgIHJldHVybiByZWFkS2V5d29yZE9yRnVuY3Rpb24odG9rZW5pemVyKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSBMRUZUU1FVQVJFQlJBQ0tFVDpcbiAgICAgICAgICAgIHJldHVybiByZWFkR3JvdXAodG9rZW5pemVyKTtcblxuICAgICAgICBjYXNlIExFU1NUSEFOU0lHTjpcbiAgICAgICAgICAgIGlmICh0b2tlbml6ZXIubmV4dENoYXJDb2RlKCkgPT09IEFQT1NUUk9QSEUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFByb3BlcnR5KHRva2VuaXplcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWFkVHlwZSh0b2tlbml6ZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgVkVSVElDQUxMSU5FOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQ29tYmluYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRva2VuaXplci5zdWJzdHJpbmdUb1Bvcyh0b2tlbml6ZXIubmV4dENoYXJDb2RlKCkgPT09IFZFUlRJQ0FMTElORSA/IHRva2VuaXplci5wb3MgKyAyIDogdG9rZW5pemVyLnBvcyArIDEpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgQU1QRVJTQU5EOlxuICAgICAgICAgICAgdG9rZW5pemVyLnBvcysrO1xuICAgICAgICAgICAgdG9rZW5pemVyLmVhdChBTVBFUlNBTkQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQ29tYmluYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcmJidcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSBDT01NQTpcbiAgICAgICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NvbW1hJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJywnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgU09MSURVUzpcbiAgICAgICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NsYXNoJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgUEVSQ0VOVFNJR046ICAvLyBsb29rcyBsaWtlIGV4Y2VwdGlvbiwgbmVlZHMgZm9yIGF0dHIoKSdzIDx0eXBlLW9yLXVuaXQ+XG4gICAgICAgICAgICB0b2tlbml6ZXIucG9zKys7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdQZXJjZW50JyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJyUnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgTEVGVFBBUkVOVEhFU0lTOlxuICAgICAgICAgICAgdG9rZW5pemVyLnBvcysrO1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gcmVhZEltcGxpY2l0R3JvdXAodG9rZW5pemVyKTtcbiAgICAgICAgICAgIHRva2VuaXplci5lYXQoUklHSFRQQVJFTlRIRVNJUyk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1BhcmVudGhlc2VzJyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSBBUE9TVFJPUEhFOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogc2NhblN0cmluZyh0b2tlbml6ZXIpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgU1BBQ0U6XG4gICAgICAgIGNhc2UgVEFCOlxuICAgICAgICBjYXNlIE46XG4gICAgICAgIGNhc2UgUjpcbiAgICAgICAgY2FzZSBGOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3BhY2VzJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogc2NhblNwYWNlcyh0b2tlbml6ZXIpXG4gICAgICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZXJyb3IodG9rZW5pemVyLCBwb3MsIG1zZykge1xuICAgIHRocm93IG5ldyBTeW50YXhQYXJzZUVycm9yKG1zZyB8fCAnVW5leHBlY3RlZCBpbnB1dCcsIHRva2VuaXplci5zdHIsIHBvcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHZhciB0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKHN0cik7XG4gICAgdmFyIHJlc3VsdCA9IHJlYWRJbXBsaWNpdEdyb3VwKHRva2VuaXplcik7XG5cbiAgICBpZiAodG9rZW5pemVyLnBvcyAhPT0gc3RyLmxlbmd0aCkge1xuICAgICAgICBlcnJvcih0b2tlbml6ZXIsIHRva2VuaXplci5wb3MpO1xuICAgIH1cblxuICAgIC8vIHJlZHVjZSByZWR1bmRhbnQgZ3JvdXBzIHdpdGggc2luZ2xlIGdyb3VwIHRlcm1cbiAgICBpZiAocmVzdWx0LnRlcm1zLmxlbmd0aCA9PT0gMSAmJiByZXN1bHQudGVybXNbMF0udHlwZSA9PT0gJ0dyb3VwJykge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGVybXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gd2FybSB1cCBwYXJzZSB0byBlbGltaXRhdGUgY29kZSBicmFuY2hlcyB0aGF0IG5ldmVyIGV4ZWN1dGVcbi8vIGZpeCBzb2Z0IGRlb3B0aW1pemF0aW9ucyAoaW5zdWZmaWNpZW50IHR5cGUgZmVlZGJhY2spXG5wYXJzZSgnW2EmJjxiPiN8PFxcJ2NcXCc+Knx8ZSgpezIsfSBmezJ9IC8sKCUgZyN7MSwyfSldIScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbmFtZXMgPSByZXF1aXJlKCcuLi91dGlscy9uYW1lcycpO1xudmFyIE1VTFRJUExJRVJfREVGQVVMVCA9IHtcbiAgICBjb21tYTogZmFsc2UsXG4gICAgbWluOiAxLFxuICAgIG1heDogMVxufTtcblxuZnVuY3Rpb24gc2tpcFNwYWNlcyhub2RlKSB7XG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwgJiYgKG5vZGUuZGF0YS50eXBlID09PSAnV2hpdGVTcGFjZScgfHwgbm9kZS5kYXRhLnR5cGUgPT09ICdDb21tZW50JykpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gcHV0UmVzdWx0KGJ1ZmZlciwgbWF0Y2gpIHtcbiAgICB2YXIgdHlwZSA9IG1hdGNoLnR5cGUgfHwgbWF0Y2guc3ludGF4LnR5cGU7XG5cbiAgICAvLyBpZ25vcmUgZ3JvdXBzXG4gICAgaWYgKHR5cGUgPT09ICdHcm91cCcpIHtcbiAgICAgICAgYnVmZmVyLnB1c2guYXBwbHkoYnVmZmVyLCBtYXRjaC5tYXRjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLnB1c2gobWF0Y2gpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hUb0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdGhpcy5zeW50YXgudHlwZSxcbiAgICAgICAgbmFtZTogdGhpcy5zeW50YXgubmFtZSxcbiAgICAgICAgbWF0Y2g6IHRoaXMubWF0Y2gsXG4gICAgICAgIG5vZGU6IHRoaXMubm9kZVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2hOb2RlKGJhZE5vZGUsIGxhc3ROb2RlLCBuZXh0LCBtYXRjaCkge1xuICAgIGlmIChiYWROb2RlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiYWROb2RlOiBiYWROb2RlLFxuICAgICAgICAgICAgbGFzdE5vZGU6IG51bGwsXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgbWF0Y2g6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBiYWROb2RlOiBudWxsLFxuICAgICAgICBsYXN0Tm9kZTogbGFzdE5vZGUsXG4gICAgICAgIG5leHQ6IG5leHQsXG4gICAgICAgIG1hdGNoOiBtYXRjaFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hdGNoR3JvdXAobGV4ZXIsIHN5bnRheE5vZGUsIG5vZGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGJ1ZmZlcjtcbiAgICB2YXIgbXVsdGlwbGllciA9IHN5bnRheE5vZGUubXVsdGlwbGllciB8fCBNVUxUSVBMSUVSX0RFRkFVTFQ7XG4gICAgdmFyIG1pbiA9IG11bHRpcGxpZXIubWluO1xuICAgIHZhciBtYXggPSBtdWx0aXBsaWVyLm1heCA9PT0gMCA/IEluZmluaXR5IDogbXVsdGlwbGllci5tYXg7XG4gICAgdmFyIGxhc3RDb21tYVRlcm1Db3VudDtcbiAgICB2YXIgbGFzdENvbW1hO1xuICAgIHZhciBtYXRjaENvdW50ID0gMDtcbiAgICB2YXIgbGFzdE5vZGUgPSBudWxsO1xuICAgIHZhciBiYWROb2RlID0gbnVsbDtcblxuICAgIG1pc21hdGNoOlxuICAgIHdoaWxlIChtYXRjaENvdW50IDwgbWF4KSB7XG4gICAgICAgIG5vZGUgPSBza2lwU3BhY2VzKG5vZGUpO1xuICAgICAgICBidWZmZXIgPSBbXTtcblxuICAgICAgICBzd2l0Y2ggKHN5bnRheE5vZGUuY29tYmluYXRvcikge1xuICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzeW50YXhOb2RlLnRlcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXJtID0gc3ludGF4Tm9kZS50ZXJtc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IG1hdGNoU3ludGF4KGxleGVyLCB0ZXJtLCBub2RlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLm1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRSZXN1bHQoYnVmZmVyLCByZXMubWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHJlcy5uZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBjb250aW51ZSBtYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5iYWROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWROb2RlID0gcmVzLmJhZE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBtaXNtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMubGFzdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gcmVzLmxhc3ROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7IC8vIG5vdGhpbmcgZm91bmQgLT4gc3RvcCBtYXRjaGluZ1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICB2YXIgYmVmb3JlTWF0Y2hOb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdE1hdGNoZWRUZXJtID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgaGFzVGFpbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIGNvbW1hTWlzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN5bnRheE5vZGUudGVybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlcm0gPSBzeW50YXhOb2RlLnRlcm1zW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gbWF0Y2hTeW50YXgobGV4ZXIsIHRlcm0sIG5vZGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMubWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtLnR5cGUgPT09ICdDb21tYScgJiYgaSAhPT0gMCAmJiAhaGFzVGFpbE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBjdXJzb3IgdG8gc3RhdGUgYmVmb3JlIGxhc3QgbWF0Y2ggYW5kIHN0b3AgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGUgJiYgbm9kZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmVNYXRjaE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1lbXB0eSBtYXRjaCAocmVzLm5leHQgd2lsbCByZWZlciB0byBhbm90aGVyIG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLm5leHQgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBzaG91bGQgYmUgcHJlY2VkZWQgYnkgYSBjb21tYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYU1pc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGUgJiYgbm9kZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlTWF0Y2hOb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBtaXNtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWlsTWF0Y2ggPSB0ZXJtLnR5cGUgIT09ICdDb21tYSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1hdGNoZWRUZXJtID0gdGVybTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0UmVzdWx0KGJ1ZmZlciwgcmVzLm1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBza2lwU3BhY2VzKHJlcy5uZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuYmFkTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFkTm9kZSA9IHJlcy5iYWROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmxhc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSByZXMubGFzdE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgd2hlbiBjb21tYSBkb2Vzbid0IG1hdGNoIHdoZW4gbm8gbWF0Y2hlcyB5ZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBvbmx5IGlmIGNvbW1hIGlzIG5vdCBmaXJzdCBvciBsYXN0IHRlcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtLnR5cGUgPT09ICdDb21tYScgJiYgaSAhPT0gMCAmJiBpICE9PSBzeW50YXhOb2RlLnRlcm1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGFpbE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hTWlzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgY3Vyc29yIHRvIHN0YXRlIGJlZm9yZSBsYXN0IG1hdGNoIGFuZCBzdG9wIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IHJlcy5sYXN0Tm9kZSB8fCAobm9kZSAmJiBub2RlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGJlZm9yZU1hdGNoTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pc21hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZW1wdHkgbWF0Y2ggd2hlbiBbIF0hXG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0TWF0Y2hlZFRlcm0gJiYgc3ludGF4Tm9kZS5kaXNhbGxvd0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IG1hdGNoIGJ1dCBzaG91bGRuJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBjdXJzb3IgdG8gc3RhdGUgYmVmb3JlIGxhc3QgbWF0Y2ggYW5kIHN0b3AgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlICYmIG5vZGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGJlZm9yZU1hdGNoTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgY29tbWEgYXQgdGhlIGVuZCBidXQgb25seSBpZiBsYXN0IHRlcm0gaXNuJ3QgYSBjb21tYVxuICAgICAgICAgICAgICAgIGlmIChsYXN0TWF0Y2hlZFRlcm0gJiYgbGFzdE1hdGNoZWRUZXJtLnR5cGUgPT09ICdDb21tYScgJiYgdGVybS50eXBlICE9PSAnQ29tbWEnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbm9kZSAmJiBub2RlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmVNYXRjaE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pc21hdGNoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICcmJic6XG4gICAgICAgICAgICAgICAgdmFyIGJlZm9yZU1hdGNoTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RNYXRjaGVkVGVybSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIHRlcm1zID0gc3ludGF4Tm9kZS50ZXJtcy5zbGljZSgpO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRlcm1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2FzTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVtcHR5TWF0Y2hlZCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXJtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlcm0gPSB0ZXJtc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBtYXRjaFN5bnRheChsZXhlciwgdGVybSwgbm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tZW1wdHkgbWF0Y2ggKHJlcy5uZXh0IHdpbGwgcmVmZXIgdG8gYW5vdGhlciBub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubmV4dCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TWF0Y2hlZFRlcm0gPSB0ZXJtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5TWF0Y2hlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0UmVzdWx0KGJ1ZmZlciwgcmVzLm1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gc2tpcFNwYWNlcyhyZXMubmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5iYWROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkTm9kZSA9IHJlcy5iYWROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pc21hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMubGFzdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IHJlcy5sYXN0Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghd2FzTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1zIGxlZnQsIGJ1dCB0aGV5IGFsbCBhcmUgb3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eU1hdGNoZWQgPT09IHRlcm1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgb2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbm9kZSAmJiBub2RlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlTWF0Y2hOb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RNYXRjaGVkVGVybSAmJiBzeW50YXhOb2RlLmRpc2FsbG93RW1wdHkpIHsgLy8gZG9uJ3QgYWxsb3cgZW1wdHkgbWF0Y2ggd2hlbiBbIF0hXG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IG1hdGNoIGJ1dCBzaG91bGRuJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBjdXJzb3IgdG8gc3RhdGUgYmVmb3JlIGxhc3QgbWF0Y2ggYW5kIHN0b3AgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlICYmIG5vZGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGJlZm9yZU1hdGNoTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3x8JzpcbiAgICAgICAgICAgICAgICB2YXIgYmVmb3JlTWF0Y2hOb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdE1hdGNoZWRUZXJtID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgdGVybXMgPSBzeW50YXhOb2RlLnRlcm1zLnNsaWNlKCk7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAodGVybXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3YXNNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW1wdHlNYXRjaGVkID0gMDtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVybSA9IHRlcm1zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IG1hdGNoU3ludGF4KGxleGVyLCB0ZXJtLCBub2RlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5tYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1lbXB0eSBtYXRjaCAocmVzLm5leHQgd2lsbCByZWZlciB0byBhbm90aGVyIG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5uZXh0ICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNYXRjaGVkVGVybSA9IHRlcm07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNYXRjaGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRSZXN1bHQoYnVmZmVyLCByZXMubWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBza2lwU3BhY2VzKHJlcy5uZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmJhZE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWROb2RlID0gcmVzLmJhZE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sYXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gcmVzLmxhc3ROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBlbXB0eSBtYXRjaFxuICAgICAgICAgICAgICAgIGlmICghbGFzdE1hdGNoZWRUZXJtICYmIChlbXB0eU1hdGNoZWQgIT09IHRlcm1zLmxlbmd0aCB8fCBzeW50YXhOb2RlLmRpc2FsbG93RW1wdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IG1hdGNoIGJ1dCBzaG91bGRuJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBjdXJzb3IgdG8gc3RhdGUgYmVmb3JlIGxhc3QgbWF0Y2ggYW5kIHN0b3AgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlICYmIG5vZGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGJlZm9yZU1hdGNoTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlzbWF0Y2g7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmbHVzaCBidWZmZXJcbiAgICAgICAgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBidWZmZXIpO1xuICAgICAgICBtYXRjaENvdW50Kys7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmNvbW1hKSB7XG4gICAgICAgICAgICBpZiAobGFzdENvbW1hICYmIGxhc3RDb21tYVRlcm1Db3VudCA9PT0gcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgbWF0Y2ggYWZ0ZXIgY29tbWFcbiAgICAgICAgICAgICAgICBicmVhayBtaXNtYXRjaDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbm9kZSA9IHNraXBTcGFjZXMobm9kZSk7XG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gbnVsbCAmJiBub2RlLmRhdGEudHlwZSA9PT0gJ09wZXJhdG9yJyAmJiBub2RlLmRhdGEudmFsdWUgPT09ICcsJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4OiBzeW50YXhOb2RlLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaDogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBU1ROb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuTWF0Y2g6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsYXN0Q29tbWFUZXJtQ291bnQgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxhc3RDb21tYSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlICE9PSBudWxsID8gbm9kZS5kYXRhIDogbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBtaXNtYXRjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKHN5bnRheE5vZGUudHlwZSwgYmFkTm9kZSwgbGFzdE5vZGUpO1xuXG4gICAgaWYgKGxhc3RDb21tYSAmJiBsYXN0Q29tbWFUZXJtQ291bnQgPT09IHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgLy8gbm90aGluZyBtYXRjaCBhZnRlciBjb21tYVxuICAgICAgICBub2RlID0gbGFzdENvbW1hO1xuICAgICAgICByZXN1bHQucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkTWF0Y2hOb2RlKGJhZE5vZGUsIGxhc3ROb2RlLCBub2RlLCBtYXRjaENvdW50IDwgbWluID8gbnVsbCA6IHtcbiAgICAgICAgc3ludGF4OiBzeW50YXhOb2RlLFxuICAgICAgICBtYXRjaDogcmVzdWx0LFxuICAgICAgICB0b0pTT046IG1hdGNoVG9KU09OXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoU3ludGF4KGxleGVyLCBzeW50YXhOb2RlLCBub2RlKSB7XG4gICAgdmFyIGJhZE5vZGUgPSBudWxsO1xuICAgIHZhciBsYXN0Tm9kZSA9IG51bGw7XG4gICAgdmFyIG1hdGNoID0gbnVsbDtcblxuICAgIHN3aXRjaCAoc3ludGF4Tm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0dyb3VwJzpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaEdyb3VwKGxleGVyLCBzeW50YXhOb2RlLCBub2RlKTtcblxuICAgICAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICAgICAgICAvLyBleHBlY3QgYSBmdW5jdGlvbiBub2RlXG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5kYXRhLnR5cGUgIT09ICdGdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGtleXdvcmQgPSBuYW1lcy5rZXl3b3JkKG5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICAgIHZhciBuYW1lID0gc3ludGF4Tm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGZ1bmN0aW9uIG5hbWUgd2l0aCB2ZW5kb3IgY29uc2lkZXJhdGlvblxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IGtleXdvcmQudmVuZG9yICsga2V5d29yZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXMgPSBtYXRjaFN5bnRheChsZXhlciwgc3ludGF4Tm9kZS5jaGlsZHJlbiwgbm9kZS5kYXRhLmNoaWxkcmVuLmhlYWQpO1xuICAgICAgICAgICAgaWYgKCFyZXMubWF0Y2ggfHwgcmVzLm5leHQpIHtcbiAgICAgICAgICAgICAgICBiYWROb2RlID0gcmVzLmJhZE5vZGUgfHwgcmVzLmxhc3ROb2RlIHx8IChyZXMubmV4dCA/IHJlcy5uZXh0LmRhdGEgOiBudWxsKSB8fCBub2RlLmRhdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hdGNoID0gW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnQVNUTm9kZScsXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZS5kYXRhLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuTWF0Y2g6IHJlcy5tYXRjaC5tYXRjaFxuICAgICAgICAgICAgfV07XG5cbiAgICAgICAgICAgIC8vIFVzZSBub2RlLm5leHQgaW5zdGVhZCBvZiByZXMubmV4dCBoZXJlIHNpbmNlIHN5bnRheCBpcyBtYXRjaGluZ1xuICAgICAgICAgICAgLy8gZm9yIGludGVybmFsIGxpc3QgYW5kIGl0IHNob3VsZCBiZSBjb21wbGV0ZWxseSBtYXRjaGVkIChyZXMubmV4dCBpcyBudWxsIGF0IHRoaXMgcG9pbnQpLlxuICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGZ1bmN0aW9uIGlzIG1hdGNoZWQgYW5kIHdlIGFyZSBnb2luZyB0byBuZXh0IG5vZGVcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdQYXJlbnRoZXNlcyc6XG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5kYXRhLnR5cGUgIT09ICdQYXJlbnRoZXNlcycpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlcyA9IG1hdGNoU3ludGF4KGxleGVyLCBzeW50YXhOb2RlLmNoaWxkcmVuLCBub2RlLmRhdGEuY2hpbGRyZW4uaGVhZCk7XG4gICAgICAgICAgICBpZiAoIXJlcy5tYXRjaCB8fCByZXMubmV4dCkge1xuICAgICAgICAgICAgICAgIGJhZE5vZGUgPSByZXMuYmFkTm9kZSB8fCByZXMubGFzdE5vZGUgfHwgKHJlcy5uZXh0ID8gcmVzLm5leHQuZGF0YSA6IG51bGwpIHx8IG5vZGUuZGF0YTsgIC8vIFRPRE86IGNhc2Ugd2hlbiByZXMubmV4dCA9PT0gbnVsbFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYXRjaCA9IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FTVE5vZGUnLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUuZGF0YSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1hdGNoOiByZXMubWF0Y2gubWF0Y2hcbiAgICAgICAgICAgIH1dO1xuXG4gICAgICAgICAgICBub2RlID0gcmVzLm5leHQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdUeXBlJzpcbiAgICAgICAgICAgIHZhciB0eXBlU3ludGF4ID0gbGV4ZXIuZ2V0VHlwZShzeW50YXhOb2RlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKCF0eXBlU3ludGF4KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHN5bnRheCB0eXBlIGAnICsgc3ludGF4Tm9kZS5uYW1lICsgJ2AnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlcyA9IHR5cGVTeW50YXgubWF0Y2gobm9kZSk7XG4gICAgICAgICAgICBpZiAoIXJlcy5tYXRjaCkge1xuICAgICAgICAgICAgICAgIGJhZE5vZGUgPSByZXMgJiYgcmVzLmJhZE5vZGU7IC8vIFRPRE86IGNhc2Ugd2hlbiByZXMubmV4dCA9PT0gbnVsbFxuICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gKHJlcyAmJiByZXMubGFzdE5vZGUpIHx8IChub2RlICYmIG5vZGUuZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vZGUgPSByZXMubmV4dDtcbiAgICAgICAgICAgIHB1dFJlc3VsdChtYXRjaCA9IFtdLCByZXMubWF0Y2gpO1xuICAgICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ1Byb3BlcnR5JzpcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eVN5bnRheCA9IGxleGVyLmdldFByb3BlcnR5KHN5bnRheE5vZGUubmFtZSk7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5U3ludGF4KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByb3BlcnR5IGAnICsgc3ludGF4Tm9kZS5uYW1lICsgJ2AnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlcyA9IHByb3BlcnR5U3ludGF4Lm1hdGNoKG5vZGUpO1xuICAgICAgICAgICAgaWYgKCFyZXMubWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBiYWROb2RlID0gcmVzICYmIHJlcy5iYWROb2RlOyAvLyBUT0RPOiBjYXNlIHdoZW4gcmVzLm5leHQgPT09IG51bGxcbiAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IChyZXMgJiYgcmVzLmxhc3ROb2RlKSB8fCAobm9kZSAmJiBub2RlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlID0gcmVzLm5leHQ7XG4gICAgICAgICAgICBwdXRSZXN1bHQobWF0Y2ggPSBbXSwgcmVzLm1hdGNoKTtcbiAgICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdLZXl3b3JkJzpcbiAgICAgICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhLnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICAgICAgICAgIHZhciBrZXl3b3JkID0gbmFtZXMua2V5d29yZChub2RlLmRhdGEubmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGtleXdvcmROYW1lID0ga2V5d29yZC5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gc3ludGF4Tm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBkcm9wIFxcMCBhbmQgXFw5IGhhY2sgZnJvbSBrZXl3b3JkIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoa2V5d29yZE5hbWUuaW5kZXhPZignXFxcXCcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBrZXl3b3JkTmFtZSA9IGtleXdvcmROYW1lLnJlcGxhY2UoL1xcXFxbMDldLiokLywgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuYW1lICE9PSBrZXl3b3JkLnZlbmRvciArIGtleXdvcmROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8ga2V5d29yZCBtYXkgdG8gYmUgYSBudW1iZXIgKGUuZy4gZm9udC13ZWlnaHQ6IDQwMCApXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YS50eXBlICE9PSAnTnVtYmVyJyB8fCBub2RlLmRhdGEudmFsdWUgIT09IHN5bnRheE5vZGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hdGNoID0gW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnQVNUTm9kZScsXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZS5kYXRhLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuTWF0Y2g6IG51bGxcbiAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ1NsYXNoJzpcbiAgICAgICAgY2FzZSAnQ29tbWEnOlxuICAgICAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUuZGF0YS50eXBlICE9PSAnT3BlcmF0b3InIHx8IG5vZGUuZGF0YS52YWx1ZSAhPT0gc3ludGF4Tm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYXRjaCA9IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FTVE5vZGUnLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUuZGF0YSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1hdGNoOiBudWxsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUuZGF0YS50eXBlICE9PSAnU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYXRjaCA9IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FTVE5vZGUnLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUuZGF0YSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1hdGNoOiBudWxsXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdBU1ROb2RlJzpcbiAgICAgICAgICAgIGlmIChub2RlICYmIHN5bnRheE5vZGUubWF0Y2gobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FTVE5vZGUnLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuTWF0Y2g6IG51bGxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNYXRjaE5vZGUoYmFkTm9kZSwgbGFzdE5vZGUsIG5vZGUsIG1hdGNoKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0IG5vZGUgdHlwZTogJyArIHN5bnRheE5vZGUudHlwZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkTWF0Y2hOb2RlKGJhZE5vZGUsIGxhc3ROb2RlLCBub2RlLCBtYXRjaCA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgICAgIHN5bnRheDogc3ludGF4Tm9kZSxcbiAgICAgICAgbWF0Y2g6IG1hdGNoLFxuICAgICAgICB0b0pTT046IG1hdGNoVG9KU09OXG4gICAgfSk7XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hTeW50YXg7XG4iLCJmdW5jdGlvbiBnZXRUcmFjZShub2RlKSB7XG4gICAgZnVuY3Rpb24gaGFzTWF0Y2gobWF0Y2hOb2RlKSB7XG4gICAgICAgIGlmIChtYXRjaE5vZGUudHlwZSA9PT0gJ0FTVE5vZGUnKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2hOb2RlLm5vZGUgPT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoTm9kZS5jaGlsZHJlbk1hdGNoKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIGZvci1sb29wIGZvciBiZXR0ZXIgcGVyZm9tYW5jZVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0Y2hOb2RlLmNoaWxkcmVuTWF0Y2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc01hdGNoKG1hdGNoTm9kZS5jaGlsZHJlbk1hdGNoW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2UgZm9yLWxvb3AgZm9yIGJldHRlciBwZXJmb21hbmNlXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoTm9kZS5tYXRjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChoYXNNYXRjaChtYXRjaE5vZGUubWF0Y2hbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaE5vZGUuc3ludGF4LnR5cGUgPT09ICdUeXBlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hOb2RlLnN5bnRheC50eXBlID09PSAnUHJvcGVydHknIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE5vZGUuc3ludGF4LnR5cGUgPT09ICdLZXl3b3JkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQobWF0Y2hOb2RlLnN5bnRheCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMubWF0Y2hlZCAhPT0gbnVsbCkge1xuICAgICAgICBoYXNNYXRjaCh0aGlzLm1hdGNoZWQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRlc3ROb2RlKG1hdGNoLCBub2RlLCBmbikge1xuICAgIHZhciB0cmFjZSA9IGdldFRyYWNlLmNhbGwobWF0Y2gsIG5vZGUpO1xuXG4gICAgaWYgKHRyYWNlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2Uuc29tZShmbik7XG59XG5cbmZ1bmN0aW9uIGlzVHlwZShub2RlLCB0eXBlKSB7XG4gICAgcmV0dXJuIHRlc3ROb2RlKHRoaXMsIG5vZGUsIGZ1bmN0aW9uKG1hdGNoTm9kZSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hOb2RlLnR5cGUgPT09ICdUeXBlJyAmJiBtYXRjaE5vZGUubmFtZSA9PT0gdHlwZTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaXNQcm9wZXJ0eShub2RlLCBwcm9wZXJ0eSkge1xuICAgIHJldHVybiB0ZXN0Tm9kZSh0aGlzLCBub2RlLCBmdW5jdGlvbihtYXRjaE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoTm9kZS50eXBlID09PSAnUHJvcGVydHknICYmIG1hdGNoTm9kZS5uYW1lID09PSBwcm9wZXJ0eTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaXNLZXl3b3JkKG5vZGUpIHtcbiAgICByZXR1cm4gdGVzdE5vZGUodGhpcywgbm9kZSwgZnVuY3Rpb24obWF0Y2hOb2RlKSB7XG4gICAgICAgIHJldHVybiBtYXRjaE5vZGUudHlwZSA9PT0gJ0tleXdvcmQnO1xuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBnZXRUcmFjZTogZ2V0VHJhY2UsXG4gICAgaXNUeXBlOiBpc1R5cGUsXG4gICAgaXNQcm9wZXJ0eTogaXNQcm9wZXJ0eSxcbiAgICBpc0tleXdvcmQ6IGlzS2V5d29yZFxufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvbGlzdCcpO1xuXG5mdW5jdGlvbiBnZXRGaXJzdE1hdGNoTm9kZShtYXRjaE5vZGUpIHtcbiAgICBpZiAobWF0Y2hOb2RlLnR5cGUgPT09ICdBU1ROb2RlJykge1xuICAgICAgICByZXR1cm4gbWF0Y2hOb2RlLm5vZGU7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoTm9kZS5tYXRjaC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGdldEZpcnN0TWF0Y2hOb2RlKG1hdGNoTm9kZS5tYXRjaFswXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RNYXRjaE5vZGUobWF0Y2hOb2RlKSB7XG4gICAgaWYgKG1hdGNoTm9kZS50eXBlID09PSAnQVNUTm9kZScpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoTm9kZS5ub2RlO1xuICAgIH1cblxuICAgIGlmIChtYXRjaE5vZGUubWF0Y2gubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBnZXRMYXN0TWF0Y2hOb2RlKG1hdGNoTm9kZS5tYXRjaFttYXRjaE5vZGUubWF0Y2gubGVuZ3RoIC0gMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtYXRjaEZyYWdtZW50cyhsZXhlciwgYXN0LCBtYXRjaCwgdHlwZSwgbmFtZSkge1xuICAgIGZ1bmN0aW9uIGZpbmRGcmFnbWVudHMobWF0Y2hOb2RlKSB7XG4gICAgICAgIGlmIChtYXRjaE5vZGUudHlwZSA9PT0gJ0FTVE5vZGUnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hOb2RlLnN5bnRheC50eXBlID09PSB0eXBlICYmXG4gICAgICAgICAgICBtYXRjaE5vZGUuc3ludGF4Lm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGdldEZpcnN0TWF0Y2hOb2RlKG1hdGNoTm9kZSk7XG4gICAgICAgICAgICB2YXIgZW5kID0gZ2V0TGFzdE1hdGNoTm9kZShtYXRjaE5vZGUpO1xuXG4gICAgICAgICAgICBsZXhlci5zeW50YXgud2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gbmV3IExpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYyA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kRGF0YShpdGVtLmRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5kYXRhID09PSBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0ubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaXRlbSAhPT0gbnVsbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0LmxvYyAhPT0gbnVsbCAmJiBlbmQubG9jICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBzdGFydC5sb2Muc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5sb2Muc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmQubG9jLmVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogbGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogbG9jLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXM6IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0Y2hOb2RlLm1hdGNoLmZvckVhY2goZmluZEZyYWdtZW50cyk7XG4gICAgfVxuXG4gICAgdmFyIGZyYWdtZW50cyA9IFtdO1xuXG4gICAgaWYgKG1hdGNoLm1hdGNoZWQgIT09IG51bGwpIHtcbiAgICAgICAgZmluZEZyYWdtZW50cyhtYXRjaC5tYXRjaGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhZ21lbnRzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYXRjaEZyYWdtZW50czogbWF0Y2hGcmFnbWVudHNcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2xpc3QnKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGlzVmFsaWROdW1iZXIodmFsdWUpIHtcbiAgICAvLyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwXG4gICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBpc0Zpbml0ZSh2YWx1ZSkgJiZcbiAgICAgICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlICYmXG4gICAgICAgIHZhbHVlID49IDBcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkTG9jYXRpb24obG9jKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgQm9vbGVhbihsb2MpICYmXG4gICAgICAgIGlzVmFsaWROdW1iZXIobG9jLm9mZnNldCkgJiZcbiAgICAgICAgaXNWYWxpZE51bWJlcihsb2MubGluZSkgJiZcbiAgICAgICAgaXNWYWxpZE51bWJlcihsb2MuY29sdW1uKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVTdHJ1Y3R1cmVDaGVja2VyKHR5cGUsIGZpZWxkcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBjaGVja05vZGUobm9kZSwgd2Fybikge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fybihub2RlLCAnVHlwZSBvZiBub2RlIHNob3VsZCBiZSBhbiBPYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBub2RlKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBrZXkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAndHlwZScpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlICE9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm4obm9kZSwgJ1dyb25nIG5vZGUgdHlwZSBgJyArIG5vZGUudHlwZSArICdgLCBleHBlY3RlZCBgJyArIHR5cGUgKyAnYCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbG9jJykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxvYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubG9jICYmIG5vZGUubG9jLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmxvYy5zb3VyY2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgKz0gJy5zb3VyY2UnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkTG9jYXRpb24obm9kZS5sb2Muc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgKz0gJy5zdGFydCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVmFsaWRMb2NhdGlvbihub2RlLmxvYy5lbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgKz0gJy5lbmQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB2YWxpZCA9IGZhbHNlOyAhdmFsaWQgJiYgaSA8IGZpZWxkc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBmaWVsZHNba2V5XVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0eXBlb2Ygbm9kZVtrZXldID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHlwZW9mIG5vZGVba2V5XSA9PT0gJ2Jvb2xlYW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG51bGw6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBub2RlW2tleV0gPT09IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gbm9kZVtrZXldICYmIG5vZGVba2V5XS50eXBlID09PSBmaWVsZFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBub2RlW2tleV0gaW5zdGFuY2VvZiBMaXN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2Fybihub2RlLCAnVW5rbm93biBmaWVsZCBgJyArIGtleSArICdgIGZvciAnICsgdHlwZSArICcgbm9kZSB0eXBlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICAgICAgICB3YXJuKG5vZGUsICdCYWQgdmFsdWUgZm9yIGAnICsgdHlwZSArICcuJyArIGtleSArICdgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkgJiZcbiAgICAgICAgICAgICAgICBoYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGtleSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgd2Fybihub2RlLCAnRmllbGQgYCcgKyB0eXBlICsgJy4nICsga2V5ICsgJ2AgaXMgbWlzc2VkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzU3RydWN0dXJlKG5hbWUsIG5vZGVUeXBlKSB7XG4gICAgdmFyIHN0cnVjdHVyZSA9IG5vZGVUeXBlLnN0cnVjdHVyZTtcbiAgICB2YXIgZmllbGRzID0ge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGxvYzogdHJ1ZVxuICAgIH07XG4gICAgdmFyIGRvY3MgPSB7XG4gICAgICAgIHR5cGU6ICdcIicgKyBuYW1lICsgJ1wiJ1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc3RydWN0dXJlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHN0cnVjdHVyZSwga2V5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvY3NUeXBlcyA9IFtdO1xuICAgICAgICB2YXIgZmllbGRUeXBlcyA9IGZpZWxkc1trZXldID0gQXJyYXkuaXNBcnJheShzdHJ1Y3R1cmVba2V5XSlcbiAgICAgICAgICAgID8gc3RydWN0dXJlW2tleV0uc2xpY2UoKVxuICAgICAgICAgICAgOiBbc3RydWN0dXJlW2tleV1dO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IGZpZWxkVHlwZXNbaV07XG4gICAgICAgICAgICBpZiAoZmllbGRUeXBlID09PSBTdHJpbmcgfHwgZmllbGRUeXBlID09PSBCb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgZG9jc1R5cGVzLnB1c2goZmllbGRUeXBlLm5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkb2NzVHlwZXMucHVzaCgnbnVsbCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGRvY3NUeXBlcy5wdXNoKCc8JyArIGZpZWxkVHlwZSArICc+Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRUeXBlKSkge1xuICAgICAgICAgICAgICAgIGRvY3NUeXBlcy5wdXNoKCdMaXN0Jyk7IC8vIFRPRE86IHVzZSB0eXBlIGVudW1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyB2YWx1ZSBgJyArIGZpZWxkVHlwZSArICdgIGluIGAnICsgbmFtZSArICcuJyArIGtleSArICdgIHN0cnVjdHVyZSBkZWZpbml0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkb2NzW2tleV0gPSBkb2NzVHlwZXMuam9pbignIHwgJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZG9jczogZG9jcyxcbiAgICAgICAgY2hlY2s6IGNyZWF0ZU5vZGVTdHJ1Y3R1cmVDaGVja2VyKG5hbWUsIGZpZWxkcylcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBnZXRTdHJ1Y3R1cmVGcm9tQ29uZmlnOiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgdmFyIHN0cnVjdHVyZSA9IHt9O1xuXG4gICAgICAgIGlmIChjb25maWcubm9kZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcubm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZy5ub2RlLCBuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZVR5cGUgPSBjb25maWcubm9kZVtuYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVR5cGUuc3RydWN0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVbbmFtZV0gPSBwcm9jZXNzU3RydWN0dXJlKG5hbWUsIG5vZGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2VkIGBzdHJ1Y3R1cmVgIGZpZWxkIGluIGAnICsgbmFtZSArICdgIG5vZGUgdHlwZSBkZWZpbml0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RydWN0dXJlO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBTeW50YXhSZWZlcmVuY2VFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKS5TeW50YXhSZWZlcmVuY2VFcnJvcjtcbnZhciBNYXRjaEVycm9yID0gcmVxdWlyZSgnLi9lcnJvcicpLk1hdGNoRXJyb3I7XG52YXIgbmFtZXMgPSByZXF1aXJlKCcuLi91dGlscy9uYW1lcycpO1xudmFyIGdlbmVyaWMgPSByZXF1aXJlKCcuL2dlbmVyaWMnKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vZ3JhbW1hci9wYXJzZScpO1xudmFyIHRyYW5zbGF0ZSA9IHJlcXVpcmUoJy4vZ3JhbW1hci90cmFuc2xhdGUnKTtcbnZhciB3YWxrID0gcmVxdWlyZSgnLi9ncmFtbWFyL3dhbGsnKTtcbnZhciBtYXRjaCA9IHJlcXVpcmUoJy4vbWF0Y2gnKTtcbnZhciB0cmFjZSA9IHJlcXVpcmUoJy4vdHJhY2UnKTtcbnZhciBzZWFyY2ggPSByZXF1aXJlKCcuL3NlYXJjaCcpO1xudmFyIGdldFN0cnVjdHVyZUZyb21Db25maWcgPSByZXF1aXJlKCcuL3N0cnVjdHVyZScpLmdldFN0cnVjdHVyZUZyb21Db25maWc7XG52YXIgY3NzV2lkZUtleXdvcmRzID0gcGFyc2UoJ2luaGVyaXQgfCBpbml0aWFsIHwgdW5zZXQnKTtcbnZhciBjc3NXaWRlS2V5d29yZHNXaXRoRXhwcmVzc2lvbiA9IHBhcnNlKCdpbmhlcml0IHwgaW5pdGlhbCB8IHVuc2V0IHwgPGV4cHJlc3Npb24+Jyk7XG5cbmZ1bmN0aW9uIGR1bXBNYXBTeW50YXgobWFwLCBzeW50YXhBc0FzdCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gbWFwKSB7XG4gICAgICAgIGlmIChtYXBbbmFtZV0uc3ludGF4KSB7XG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBzeW50YXhBc0FzdCA/IG1hcFtuYW1lXS5zeW50YXggOiB0cmFuc2xhdGUobWFwW25hbWVdLnN5bnRheCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB1bndyYXBOb2RlKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbSAmJiBpdGVtLmRhdGE7XG59XG5cbmZ1bmN0aW9uIHZhbHVlSGFzVmFyKHZhbHVlKSB7XG4gICAgdmFyIGhhc1ZhciA9IGZhbHNlO1xuXG4gICAgdGhpcy5zeW50YXgud2Fsayh2YWx1ZSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnRnVuY3Rpb24nICYmIG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSAndmFyJykge1xuICAgICAgICAgICAgaGFzVmFyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhc1Zhcjtcbn1cblxuLy8gY2hlY2sgbm9kZSBpcyBcXDAgb3IgXFw5IGhhY2tcbmZ1bmN0aW9uIGlzSGFjayhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIC9eXFxcXFswOV0vLnRlc3Qobm9kZS5uYW1lKTtcbn1cblxuLy8gd2hpdGUgc3BhY2VzLCBjb21tZW50cyBhbmQgc29tZSBoYWNrcyBjYW4gdG8gYmUgaWdub3JlZCBhdCB0aGUgZW5kIG9mIHZhbHVlXG5mdW5jdGlvbiBpc05leHRNYXlUb0JlSWdub3JlZChjdXJzb3IpIHtcbiAgICB3aGlsZSAoY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChjdXJzb3IuZGF0YS50eXBlICE9PSAnV2hpdGVTcGFjZScgJiZcbiAgICAgICAgICAgIGN1cnNvci5kYXRhLnR5cGUgIT09ICdDb21tZW50JyAmJlxuICAgICAgICAgICAgIWlzSGFjayhjdXJzb3IuZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZE1hdGNoUmVzdWx0KG1hdGNoLCBlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1hdGNoZWQ6IG1hdGNoLFxuICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgIGdldFRyYWNlOiB0cmFjZS5nZXRUcmFjZSxcbiAgICAgICAgaXNUeXBlOiB0cmFjZS5pc1R5cGUsXG4gICAgICAgIGlzUHJvcGVydHk6IHRyYWNlLmlzUHJvcGVydHksXG4gICAgICAgIGlzS2V5d29yZDogdHJhY2UuaXNLZXl3b3JkXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hTeW50YXgobGV4ZXIsIHN5bnRheCwgdmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS50eXBlICE9PSAnVmFsdWUnKSB7XG4gICAgICAgIHJldHVybiBidWlsZE1hdGNoUmVzdWx0KG51bGwsIG5ldyBFcnJvcignTm90IGEgVmFsdWUgbm9kZScpKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVIYXNWYXIuY2FsbChsZXhlciwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBidWlsZE1hdGNoUmVzdWx0KG51bGwsIG5ldyBFcnJvcignTWF0Y2hpbmcgZm9yIGEgdmFsdWUgd2l0aCB2YXIoKSBpcyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIHJlc3VsdCA9IG1hdGNoKGxleGVyLCBsZXhlci52YWx1ZUNvbW1vblN5bnRheCwgdmFsdWUuY2hpbGRyZW4uaGVhZCk7XG5cbiAgICBpZiAoIXJlc3VsdC5tYXRjaCkge1xuICAgICAgICByZXN1bHQgPSBzeW50YXgubWF0Y2godmFsdWUuY2hpbGRyZW4uaGVhZCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNYXRjaFJlc3VsdChudWxsLCBuZXcgTWF0Y2hFcnJvcignTWlzbWF0Y2gnLCBsZXhlciwgc3ludGF4LnN5bnRheCwgdmFsdWUsIHJlc3VsdC5iYWROb2RlIHx8IHVud3JhcE5vZGUocmVzdWx0Lm5leHQpIHx8IHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbmhhbmNlIHRvcC1sZXZlbCBtYXRjaCB3cmFwcGVyXG4gICAgaWYgKHJlc3VsdC5tYXRjaC50eXBlID09PSAnQVNUTm9kZScpIHtcbiAgICAgICAgcmVzdWx0Lm1hdGNoID0ge1xuICAgICAgICAgICAgc3ludGF4OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogc3ludGF4LnR5cGUsXG4gICAgICAgICAgICAgICAgbmFtZTogc3ludGF4Lm5hbWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXRjaDogW3Jlc3VsdC5tYXRjaF1cbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5tYXRjaC5zeW50YXgudHlwZSA9PT0gJ0dyb3VwJykge1xuICAgICAgICByZXN1bHQubWF0Y2guc3ludGF4ID0ge1xuICAgICAgICAgICAgdHlwZTogc3ludGF4LnR5cGUsXG4gICAgICAgICAgICBuYW1lOiBzeW50YXgubmFtZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQubmV4dCAmJiAhaXNOZXh0TWF5VG9CZUlnbm9yZWQocmVzdWx0Lm5leHQpKSB7XG4gICAgICAgIHJldHVybiBidWlsZE1hdGNoUmVzdWx0KG51bGwsIG5ldyBNYXRjaEVycm9yKCdVbmNvbXBsZXRlIG1hdGNoJywgbGV4ZXIsIHN5bnRheC5zeW50YXgsIHZhbHVlLCByZXN1bHQuYmFkTm9kZSB8fCB1bndyYXBOb2RlKHJlc3VsdC5uZXh0KSB8fCB2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZE1hdGNoUmVzdWx0KHJlc3VsdC5tYXRjaCwgbnVsbCk7XG59XG5cbnZhciBMZXhlciA9IGZ1bmN0aW9uKGNvbmZpZywgc3ludGF4LCBzdHJ1Y3R1cmUpIHtcbiAgICB0aGlzLnZhbHVlQ29tbW9uU3ludGF4ID0gY3NzV2lkZUtleXdvcmRzO1xuICAgIHRoaXMuc3ludGF4ID0gc3ludGF4O1xuICAgIHRoaXMuZ2VuZXJpYyA9IGZhbHNlO1xuICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMudHlwZXMgPSB7fTtcbiAgICB0aGlzLnN0cnVjdHVyZSA9IHN0cnVjdHVyZSB8fCBnZXRTdHJ1Y3R1cmVGcm9tQ29uZmlnKGNvbmZpZyk7XG5cbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuZ2VuZXJpYykge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmljID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gZ2VuZXJpYykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkVHlwZV8obmFtZSwgZ2VuZXJpY1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLnR5cGVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIGNvbmZpZy50eXBlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkVHlwZV8obmFtZSwgY29uZmlnLnR5cGVzW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcucHJvcGVydGllcykge1xuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHJvcGVydHlfKG5hbWUsIGNvbmZpZy5wcm9wZXJ0aWVzW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkxleGVyLnByb3RvdHlwZSA9IHtcbiAgICBzdHJ1Y3R1cmU6IHt9LFxuICAgIGNoZWNrU3RydWN0dXJlOiBmdW5jdGlvbihhc3QpIHtcbiAgICAgICAgZnVuY3Rpb24gY29sbGVjdFdhcm5pbmcobm9kZSwgbWVzc2FnZSkge1xuICAgICAgICAgICAgd2FybnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdHJ1Y3R1cmUgPSB0aGlzLnN0cnVjdHVyZTtcbiAgICAgICAgdmFyIHdhcm5zID0gW107XG5cbiAgICAgICAgdGhpcy5zeW50YXgud2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIHN0cnVjdHVyZVtub2RlLnR5cGVdLmNoZWNrKG5vZGUsIGNvbGxlY3RXYXJuaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sbGVjdFdhcm5pbmcobm9kZSwgJ1Vua25vd24gbm9kZSB0eXBlIGAnICsgbm9kZS50eXBlICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHdhcm5zLmxlbmd0aCA/IHdhcm5zIDogZmFsc2U7XG4gICAgfSxcblxuICAgIGNyZWF0ZURlc2NyaXB0b3I6IGZ1bmN0aW9uKHN5bnRheCwgdHlwZSwgbmFtZSkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBzeW50YXg6IG51bGwsXG4gICAgICAgICAgICBtYXRjaDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc3ludGF4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBjb252ZXJ0IHN5bnRheCB0byBwc2V1ZG8gc3ludGF4IG5vZGVcbiAgICAgICAgICAgIC8vIE5PVEU6IHRoYXQncyBub3QgYSBwYXJ0IG9mIG1hdGNoIHJlc3VsdCB0cmVlXG4gICAgICAgICAgICBzeW50YXggPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FTVE5vZGUnLFxuICAgICAgICAgICAgICAgIG1hdGNoOiBzeW50YXhcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGRlc2NyaXB0b3IubWF0Y2ggPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoKHNlbGYsIHN5bnRheCwgaXRlbSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzeW50YXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gbGF6eSBwYXJzaW5nIG9uIGZpcnN0IGFjY2Vzc1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZXNjcmlwdG9yLCAnc3ludGF4Jywge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc2NyaXB0b3IsICdzeW50YXgnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhcnNlKHN5bnRheClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5zeW50YXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5zeW50YXggPSBzeW50YXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc2NyaXB0b3IubWF0Y2ggPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoKHNlbGYsIGRlc2NyaXB0b3Iuc3ludGF4LCBpdGVtKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9LFxuICAgIGFkZFByb3BlcnR5XzogZnVuY3Rpb24obmFtZSwgc3ludGF4KSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllc1tuYW1lXSA9IHRoaXMuY3JlYXRlRGVzY3JpcHRvcihzeW50YXgsICdQcm9wZXJ0eScsIG5hbWUpO1xuICAgIH0sXG4gICAgYWRkVHlwZV86IGZ1bmN0aW9uKG5hbWUsIHN5bnRheCkge1xuICAgICAgICB0aGlzLnR5cGVzW25hbWVdID0gdGhpcy5jcmVhdGVEZXNjcmlwdG9yKHN5bnRheCwgJ1R5cGUnLCBuYW1lKTtcblxuICAgICAgICBpZiAoc3ludGF4ID09PSBnZW5lcmljLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDb21tb25TeW50YXggPSBjc3NXaWRlS2V5d29yZHNXaXRoRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBtYXRjaERlY2xhcmF0aW9uOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgIT09ICdEZWNsYXJhdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZE1hdGNoUmVzdWx0KG51bGwsIG5ldyBFcnJvcignTm90IGEgRGVjbGFyYXRpb24gbm9kZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoUHJvcGVydHkobm9kZS5wcm9wZXJ0eSwgbm9kZS52YWx1ZSk7XG4gICAgfSxcbiAgICBtYXRjaFByb3BlcnR5OiBmdW5jdGlvbihwcm9wZXJ0eU5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IG5hbWVzLnByb3BlcnR5KHByb3BlcnR5TmFtZSk7XG5cbiAgICAgICAgLy8gZG9uJ3QgbWF0Y2ggc3ludGF4IGZvciBhIGN1c3RvbSBwcm9wZXJ0eVxuICAgICAgICBpZiAocHJvcGVydHkuY3VzdG9tKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNYXRjaFJlc3VsdChudWxsLCBuZXcgRXJyb3IoJ0xleGVyIG1hdGNoaW5nIGRvZXNuXFwndCBhcHBsaWNhYmxlIGZvciBjdXN0b20gcHJvcGVydGllcycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcm9wZXJ0eVN5bnRheCA9IHByb3BlcnR5LnZlbmRvclxuICAgICAgICAgICAgPyB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5LnZlbmRvciArIHByb3BlcnR5Lm5hbWUpIHx8IHRoaXMuZ2V0UHJvcGVydHkocHJvcGVydHkubmFtZSlcbiAgICAgICAgICAgIDogdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lKTtcblxuICAgICAgICBpZiAoIXByb3BlcnR5U3ludGF4KSB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNYXRjaFJlc3VsdChudWxsLCBuZXcgU3ludGF4UmVmZXJlbmNlRXJyb3IoJ1Vua25vd24gcHJvcGVydHknLCBwcm9wZXJ0eU5hbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaFN5bnRheCh0aGlzLCBwcm9wZXJ0eVN5bnRheCwgdmFsdWUpO1xuICAgIH0sXG4gICAgbWF0Y2hUeXBlOiBmdW5jdGlvbih0eXBlTmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGVTeW50YXggPSB0aGlzLmdldFR5cGUodHlwZU5hbWUpO1xuXG4gICAgICAgIGlmICghdHlwZVN5bnRheCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTWF0Y2hSZXN1bHQobnVsbCwgbmV3IFN5bnRheFJlZmVyZW5jZUVycm9yKCdVbmtub3duIHR5cGUnLCB0eXBlTmFtZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoU3ludGF4KHRoaXMsIHR5cGVTeW50YXgsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgZmluZFZhbHVlRnJhZ21lbnRzOiBmdW5jdGlvbihwcm9wZXJ0eU5hbWUsIHZhbHVlLCB0eXBlLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBzZWFyY2gubWF0Y2hGcmFnbWVudHModGhpcywgdmFsdWUsIHRoaXMubWF0Y2hQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKSwgdHlwZSwgbmFtZSk7XG4gICAgfSxcbiAgICBmaW5kRGVjbGFyYXRpb25WYWx1ZUZyYWdtZW50czogZnVuY3Rpb24oZGVjbGFyYXRpb24sIHR5cGUsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHNlYXJjaC5tYXRjaEZyYWdtZW50cyh0aGlzLCBkZWNsYXJhdGlvbi52YWx1ZSwgdGhpcy5tYXRjaERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSwgdHlwZSwgbmFtZSk7XG4gICAgfSxcbiAgICBmaW5kQWxsRnJhZ21lbnRzOiBmdW5jdGlvbihhc3QsIHR5cGUsIG5hbWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIHRoaXMuc3ludGF4LndhbGtEZWNsYXJhdGlvbnMoYXN0LCBmdW5jdGlvbihkZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmZpbmREZWNsYXJhdGlvblZhbHVlRnJhZ21lbnRzKGRlY2xhcmF0aW9uLCB0eXBlLCBuYW1lKSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgZ2V0UHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHRoaXMucHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG4gICAgfSxcbiAgICBnZXRUeXBlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLmhhc093blByb3BlcnR5KG5hbWUpID8gdGhpcy50eXBlc1tuYW1lXSA6IG51bGw7XG4gICAgfSxcblxuICAgIHZhbGlkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGUoc3ludGF4LCBuYW1lLCBicm9rZW4sIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGlmIChicm9rZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnJva2VuW25hbWVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicm9rZW5bbmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnN5bnRheCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdhbGsoZGVzY3JpcHRvci5zeW50YXgsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ1R5cGUnICYmIG5vZGUudHlwZSAhPT0gJ1Byb3BlcnR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG5vZGUudHlwZSA9PT0gJ1R5cGUnID8gc3ludGF4LnR5cGVzIDogc3ludGF4LnByb3BlcnRpZXM7XG4gICAgICAgICAgICAgICAgICAgIHZhciBicm9rZW5NYXAgPSBub2RlLnR5cGUgPT09ICdUeXBlJyA/IGJyb2tlblR5cGVzIDogYnJva2VuUHJvcGVydGllcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5oYXNPd25Qcm9wZXJ0eShub2RlLm5hbWUpIHx8IHZhbGlkYXRlKHN5bnRheCwgbm9kZS5uYW1lLCBicm9rZW5NYXAsIG1hcFtub2RlLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJyb2tlblR5cGVzID0ge307XG4gICAgICAgIHZhciBicm9rZW5Qcm9wZXJ0aWVzID0ge307XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMudHlwZXMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlKHRoaXMsIGtleSwgYnJva2VuVHlwZXMsIHRoaXMudHlwZXNba2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZSh0aGlzLCBrZXksIGJyb2tlblByb3BlcnRpZXMsIHRoaXMucHJvcGVydGllc1trZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyb2tlblR5cGVzID0gT2JqZWN0LmtleXMoYnJva2VuVHlwZXMpLmZpbHRlcihmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJva2VuVHlwZXNbbmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICBicm9rZW5Qcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoYnJva2VuUHJvcGVydGllcykuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBicm9rZW5Qcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYnJva2VuVHlwZXMubGVuZ3RoIHx8IGJyb2tlblByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGVzOiBicm9rZW5UeXBlcyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBicm9rZW5Qcm9wZXJ0aWVzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBkdW1wOiBmdW5jdGlvbihzeW50YXhBc0FzdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2VuZXJpYzogdGhpcy5nZW5lcmljLFxuICAgICAgICAgICAgdHlwZXM6IGR1bXBNYXBTeW50YXgodGhpcy50eXBlcywgc3ludGF4QXNBc3QpLFxuICAgICAgICAgICAgcHJvcGVydGllczogZHVtcE1hcFN5bnRheCh0aGlzLnByb3BlcnRpZXMsIHN5bnRheEFzQXN0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5kdW1wKCkpO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTGV4ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCcuLi90b2tlbml6ZXInKTtcbnZhciBzZXF1ZW5jZSA9IHJlcXVpcmUoJy4vc2VxdWVuY2UnKTtcbnZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxuZnVuY3Rpb24gY3JlYXRlUGFyc2VDb250ZXh0KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW25hbWVdKCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NvbmZpZyhjb25maWcpIHtcbiAgICB2YXIgcGFyc2VyQ29uZmlnID0ge1xuICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgICAgc2NvcGU6IHt9LFxuICAgICAgICBhdHJ1bGU6IHt9LFxuICAgICAgICBwc2V1ZG86IHt9XG4gICAgfTtcblxuICAgIGlmIChjb25maWcucGFyc2VDb250ZXh0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gY29uZmlnLnBhcnNlQ29udGV4dCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgY29uZmlnLnBhcnNlQ29udGV4dFtuYW1lXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyQ29uZmlnLmNvbnRleHRbbmFtZV0gPSBjb25maWcucGFyc2VDb250ZXh0W25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlckNvbmZpZy5jb250ZXh0W25hbWVdID0gY3JlYXRlUGFyc2VDb250ZXh0KGNvbmZpZy5wYXJzZUNvbnRleHRbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuc2NvcGUpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcuc2NvcGUpIHtcbiAgICAgICAgICAgIHBhcnNlckNvbmZpZy5zY29wZVtuYW1lXSA9IGNvbmZpZy5zY29wZVtuYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXRydWxlKSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gY29uZmlnLmF0cnVsZSkge1xuICAgICAgICAgICAgdmFyIGF0cnVsZSA9IGNvbmZpZy5hdHJ1bGVbbmFtZV07XG5cbiAgICAgICAgICAgIGlmIChhdHJ1bGUucGFyc2UpIHtcbiAgICAgICAgICAgICAgICBwYXJzZXJDb25maWcuYXRydWxlW25hbWVdID0gYXRydWxlLnBhcnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5wc2V1ZG8pIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcucHNldWRvKSB7XG4gICAgICAgICAgICB2YXIgcHNldWRvID0gY29uZmlnLnBzZXVkb1tuYW1lXTtcblxuICAgICAgICAgICAgaWYgKHBzZXVkby5wYXJzZSkge1xuICAgICAgICAgICAgICAgIHBhcnNlckNvbmZpZy5wc2V1ZG9bbmFtZV0gPSBwc2V1ZG8ucGFyc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLm5vZGUpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcubm9kZSkge1xuICAgICAgICAgICAgcGFyc2VyQ29uZmlnW25hbWVdID0gY29uZmlnLm5vZGVbbmFtZV0ucGFyc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VyQ29uZmlnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZVBhcnNlcihjb25maWcpIHtcbiAgICB2YXIgcGFyc2VyID0ge1xuICAgICAgICBzY2FubmVyOiBuZXcgVG9rZW5pemVyKCksXG4gICAgICAgIGZpbGVuYW1lOiAnPHVua25vd24+JyxcbiAgICAgICAgbmVlZFBvc2l0aW9uczogZmFsc2UsXG4gICAgICAgIHRvbGVyYW50OiBmYWxzZSxcbiAgICAgICAgb25QYXJzZUVycm9yOiBub29wLFxuICAgICAgICBwYXJzZUF0cnVsZVByZWx1ZGU6IHRydWUsXG4gICAgICAgIHBhcnNlUnVsZVByZWx1ZGU6IHRydWUsXG4gICAgICAgIHBhcnNlVmFsdWU6IHRydWUsXG4gICAgICAgIHBhcnNlQ3VzdG9tUHJvcGVydHk6IGZhbHNlLFxuXG4gICAgICAgIHJlYWRTZXF1ZW5jZTogc2VxdWVuY2UsXG5cbiAgICAgICAgdG9sZXJhbnRQYXJzZTogZnVuY3Rpb24oY29uc3VtZXIsIGZhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50b2xlcmFudCkge1xuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW47XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3VtZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmYWxsYmFja05vZGUgPSBmYWxsYmFjay5jYWxsKHRoaXMsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblBhcnNlRXJyb3IoZSwgZmFsbGJhY2tOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldExvY2F0aW9uOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5nZXRMb2NhdGlvblJhbmdlKFxuICAgICAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGdldExvY2F0aW9uRnJvbUxpc3Q6IGZ1bmN0aW9uKGxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FubmVyLmdldExvY2F0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIGxpc3QuaGVhZCAhPT0gbnVsbCA/IGxpc3QuZmlyc3QoKS5sb2Muc3RhcnQub2Zmc2V0IC0gdGhpcy5zY2FubmVyLnN0YXJ0T2Zmc2V0IDogdGhpcy5zY2FubmVyLnRva2VuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGxpc3QuaGVhZCAhPT0gbnVsbCA/IGxpc3QubGFzdCgpLmxvYy5lbmQub2Zmc2V0IC0gdGhpcy5zY2FubmVyLnN0YXJ0T2Zmc2V0IDogdGhpcy5zY2FubmVyLnRva2VuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25maWcgPSBwcm9jZXNzQ29uZmlnKGNvbmZpZyB8fCB7fSk7XG4gICAgZm9yICh2YXIga2V5IGluIGNvbmZpZykge1xuICAgICAgICBwYXJzZXJba2V5XSA9IGNvbmZpZ1trZXldO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQgfHwgJ2RlZmF1bHQnO1xuICAgICAgICB2YXIgYXN0O1xuXG4gICAgICAgIHBhcnNlci5zY2FubmVyLnNldFNvdXJjZShzb3VyY2UsIG9wdGlvbnMub2Zmc2V0LCBvcHRpb25zLmxpbmUsIG9wdGlvbnMuY29sdW1uKTtcbiAgICAgICAgcGFyc2VyLmZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZSB8fCAnPHVua25vd24+JztcbiAgICAgICAgcGFyc2VyLm5lZWRQb3NpdGlvbnMgPSBCb29sZWFuKG9wdGlvbnMucG9zaXRpb25zKTtcbiAgICAgICAgcGFyc2VyLnRvbGVyYW50ID0gQm9vbGVhbihvcHRpb25zLnRvbGVyYW50KTtcbiAgICAgICAgcGFyc2VyLm9uUGFyc2VFcnJvciA9IHR5cGVvZiBvcHRpb25zLm9uUGFyc2VFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMub25QYXJzZUVycm9yIDogbm9vcDtcbiAgICAgICAgcGFyc2VyLnBhcnNlQXRydWxlUHJlbHVkZSA9ICdwYXJzZUF0cnVsZVByZWx1ZGUnIGluIG9wdGlvbnMgPyBCb29sZWFuKG9wdGlvbnMucGFyc2VBdHJ1bGVQcmVsdWRlKSA6IHRydWU7XG4gICAgICAgIHBhcnNlci5wYXJzZVJ1bGVQcmVsdWRlID0gJ3BhcnNlUnVsZVByZWx1ZGUnIGluIG9wdGlvbnMgPyBCb29sZWFuKG9wdGlvbnMucGFyc2VSdWxlUHJlbHVkZSkgOiB0cnVlO1xuICAgICAgICBwYXJzZXIucGFyc2VWYWx1ZSA9ICdwYXJzZVZhbHVlJyBpbiBvcHRpb25zID8gQm9vbGVhbihvcHRpb25zLnBhcnNlVmFsdWUpIDogdHJ1ZTtcbiAgICAgICAgcGFyc2VyLnBhcnNlQ3VzdG9tUHJvcGVydHkgPSAncGFyc2VDdXN0b21Qcm9wZXJ0eScgaW4gb3B0aW9ucyA/IEJvb2xlYW4ob3B0aW9ucy5wYXJzZUN1c3RvbVByb3BlcnR5KSA6IGZhbHNlO1xuXG4gICAgICAgIGlmICghcGFyc2VyLmNvbnRleHQuaGFzT3duUHJvcGVydHkoY29udGV4dCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjb250ZXh0IGAnICsgY29udGV4dCArICdgJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3QgPSBwYXJzZXIuY29udGV4dFtjb250ZXh0XS5jYWxsKHBhcnNlciwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCFwYXJzZXIuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgICAgIHBhcnNlci5zY2FubmVyLmVycm9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhc3QsIG51bGwsIDQpKTtcbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9O1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbi8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4vLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbi8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbi8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuLy9cbi8vICAgQ29udGludWF0aW9uXG4vLyAgIHwgICAgU2lnblxuLy8gICB8ICAgIHxcbi8vICAgViAgICBWXG4vLyAgIDEwMTAxMVxuXG52YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuLy8gYmluYXJ5OiAwMTExMTFcbnZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAqL1xuZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHJldHVybiBhVmFsdWUgPCAwXG4gICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAqL1xuZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlXG4gICAgPyAtc2hpZnRlZFxuICAgIDogc2hpZnRlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgdmFyIGRpZ2l0O1xuXG4gIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gIGRvIHtcbiAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgaWYgKHZscSA+IDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgfVxuICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIHZhciBzaGlmdCA9IDA7XG4gIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gIGRvIHtcbiAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgIH1cblxuICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICBpZiAoZGlnaXQgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhc2U2NCBkaWdpdDogXCIgKyBhU3RyLmNoYXJBdChhSW5kZXggLSAxKSk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgYU91dFBhcmFtLnJlc3QgPSBhSW5kZXg7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBtYXBwaW5nQiBpcyBhZnRlciBtYXBwaW5nQSB3aXRoIHJlc3BlY3QgdG8gZ2VuZXJhdGVkXG4gKiBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVkUG9zaXRpb25BZnRlcihtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgLy8gT3B0aW1pemVkIGZvciBtb3N0IGNvbW1vbiBjYXNlXG4gIHZhciBsaW5lQSA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmU7XG4gIHZhciBsaW5lQiA9IG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIHZhciBjb2x1bW5BID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uO1xuICB2YXIgY29sdW1uQiA9IG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgcmV0dXJuIGxpbmVCID4gbGluZUEgfHwgbGluZUIgPT0gbGluZUEgJiYgY29sdW1uQiA+PSBjb2x1bW5BIHx8XG4gICAgICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikgPD0gMDtcbn1cblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHRvIHByb3ZpZGUgYSBzb3J0ZWQgdmlldyBvZiBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiBhXG4gKiBwZXJmb3JtYW5jZSBjb25zY2lvdXMgbWFubmVyLiBJdCB0cmFkZXMgYSBuZWdsaWJhYmxlIG92ZXJoZWFkIGluIGdlbmVyYWxcbiAqIGNhc2UgZm9yIGEgbGFyZ2Ugc3BlZWR1cCBpbiBjYXNlIG9mIG1hcHBpbmdzIGJlaW5nIGFkZGVkIGluIG9yZGVyLlxuICovXG5mdW5jdGlvbiBNYXBwaW5nTGlzdCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgLy8gU2VydmVzIGFzIGluZmltdW1cbiAgdGhpcy5fbGFzdCA9IHtnZW5lcmF0ZWRMaW5lOiAtMSwgZ2VuZXJhdGVkQ29sdW1uOiAwfTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIHRocm91Z2ggaW50ZXJuYWwgaXRlbXMuIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyB0aGF0XG4gKiBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIHRha2VzLlxuICpcbiAqIE5PVEU6IFRoZSBvcmRlciBvZiB0aGUgbWFwcGluZ3MgaXMgTk9UIGd1YXJhbnRlZWQuXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS51bnNvcnRlZEZvckVhY2ggPVxuICBmdW5jdGlvbiBNYXBwaW5nTGlzdF9mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpIHtcbiAgICB0aGlzLl9hcnJheS5mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpO1xuICB9O1xuXG4vKipcbiAqIEFkZCB0aGUgZ2l2ZW4gc291cmNlIG1hcHBpbmcuXG4gKlxuICogQHBhcmFtIE9iamVjdCBhTWFwcGluZ1xuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfYWRkKGFNYXBwaW5nKSB7XG4gIGlmIChnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKHRoaXMuX2xhc3QsIGFNYXBwaW5nKSkge1xuICAgIHRoaXMuX2xhc3QgPSBhTWFwcGluZztcbiAgICB0aGlzLl9hcnJheS5wdXNoKGFNYXBwaW5nKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zb3J0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9hcnJheS5wdXNoKGFNYXBwaW5nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmbGF0LCBzb3J0ZWQgYXJyYXkgb2YgbWFwcGluZ3MuIFRoZSBtYXBwaW5ncyBhcmUgc29ydGVkIGJ5XG4gKiBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKlxuICogV0FSTklORzogVGhpcyBtZXRob2QgcmV0dXJucyBpbnRlcm5hbCBkYXRhIHdpdGhvdXQgY29weWluZywgZm9yXG4gKiBwZXJmb3JtYW5jZS4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IE5PVCBiZSBtdXRhdGVkLCBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXNcbiAqIGFuIGltbXV0YWJsZSBib3Jyb3cuIElmIHlvdSB3YW50IHRvIHRha2Ugb3duZXJzaGlwLCB5b3UgbXVzdCBtYWtlIHlvdXIgb3duXG4gKiBjb3B5LlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X3RvQXJyYXkoKSB7XG4gIGlmICghdGhpcy5fc29ydGVkKSB7XG4gICAgdGhpcy5fYXJyYXkuc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKTtcbiAgICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiB0aGlzLl9hcnJheTtcbn07XG5cbmV4cG9ydHMuTWFwcGluZ0xpc3QgPSBNYXBwaW5nTGlzdDtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXApIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSBKU09OLnBhcnNlKGFTb3VyY2VNYXAucmVwbGFjZSgvXlxcKVxcXVxcfScvLCAnJykpO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MpIHtcbiAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19vcmlnaW5hbE1hcHBpbmdzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4oc291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IoYUFyZ3MpIHtcbiAgICB2YXIgbGluZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpO1xuXG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nXG4gICAgLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgbWFwcGluZyBsZXNzIHRoYW4gdGhlIG5lZWRsZS4gQnlcbiAgICAvLyBzZXR0aW5nIG5lZWRsZS5vcmlnaW5hbENvbHVtbiB0byAwLCB3ZSB0aHVzIGZpbmQgdGhlIGxhc3QgbWFwcGluZyBmb3JcbiAgICAvLyB0aGUgZ2l2ZW4gbGluZSwgcHJvdmlkZWQgc3VjaCBhIG1hcHBpbmcgZXhpc3RzLlxuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICBvcmlnaW5hbExpbmU6IGxpbmUsXG4gICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nLCAwKVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIG5lZWRsZS5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgbmVlZGxlLnNvdXJjZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc291cmNlcy5oYXMobmVlZGxlLnNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihuZWVkbGUuc291cmNlKTtcblxuICAgIHZhciBtYXBwaW5ncyA9IFtdO1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAoYUFyZ3MuY29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2UgZm91bmQuIFNpbmNlXG4gICAgICAgIC8vIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgZm91bmQuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBvcmlnaW5hbExpbmUpIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2Ugd2VyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICAvLyBTaW5jZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IGxpbmUgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gb3JpZ2luYWxDb2x1bW4pIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdzO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaCB3ZSBjYW5cbiAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICogcG9zaXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKlxuICogVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgc291cmNlcyA9IHNvdXJjZXNcbiAgICAubWFwKFN0cmluZylcbiAgICAvLyBTb21lIHNvdXJjZSBtYXBzIHByb2R1Y2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGxpa2UgXCIuL2Zvby5qc1wiIGluc3RlYWQgb2ZcbiAgICAvLyBcImZvby5qc1wiLiAgTm9ybWFsaXplIHRoZXNlIGZpcnN0IHNvIHRoYXQgZnV0dXJlIGNvbXBhcmlzb25zIHdpbGwgc3VjY2VlZC5cbiAgICAvLyBTZWUgYnVnemlsLmxhLzEwOTA3NjguXG4gICAgLm1hcCh1dGlsLm5vcm1hbGl6ZSlcbiAgICAvLyBBbHdheXMgZW5zdXJlIHRoYXQgYWJzb2x1dGUgc291cmNlcyBhcmUgaW50ZXJuYWxseSBzdG9yZWQgcmVsYXRpdmUgdG9cbiAgICAvLyB0aGUgc291cmNlIHJvb3QsIGlmIHRoZSBzb3VyY2Ugcm9vdCBpcyBhYnNvbHV0ZS4gTm90IGRvaW5nIHRoaXMgd291bGRcbiAgICAvLyBiZSBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgd2hlbiB0aGUgc291cmNlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlXG4gICAgLy8gc291cmNlICh2YWxpZCwgYnV0IHdoeT8/KS4gU2VlIGdpdGh1YiBpc3N1ZSAjMTk5IGFuZCBidWd6aWwubGEvMTE4ODk4Mi5cbiAgICAubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2VSb290ICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2VSb290KSAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlKVxuICAgICAgICA/IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlKVxuICAgICAgICA6IHNvdXJjZTtcbiAgICB9KTtcblxuICAvLyBQYXNzIGB0cnVlYCBiZWxvdyB0byBhbGxvdyBkdXBsaWNhdGUgbmFtZXMgYW5kIHNvdXJjZXMuIFdoaWxlIHNvdXJjZSBtYXBzXG4gIC8vIGFyZSBpbnRlbmRlZCB0byBiZSBjb21wcmVzc2VkIGFuZCBkZWR1cGxpY2F0ZWQsIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyXG4gIC8vIHNvbWV0aW1lcyBnZW5lcmF0ZXMgc291cmNlIG1hcHMgd2l0aCBkdXBsaWNhdGVzIGluIHRoZW0uIFNlZSBHaXRodWIgaXNzdWVcbiAgLy8gIzcyIGFuZCBidWd6aWwubGEvODg5NDkyLlxuICB0aGlzLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShuYW1lcy5tYXAoU3RyaW5nKSwgdHJ1ZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7XG5cbiAgdGhpcy5zb3VyY2VSb290ID0gc291cmNlUm9vdDtcbiAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICB0aGlzLl9tYXBwaW5ncyA9IG1hcHBpbmdzO1xuICB0aGlzLmZpbGUgPSBmaWxlO1xufVxuXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlUm9vdCAhPSBudWxsID8gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgcykgOiBzO1xuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gYmlhczogRWl0aGVyICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSB1dGlsLmpvaW4odGhpcy5zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICduYW1lJywgbnVsbCk7XG4gICAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmF0KG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbmFtZTogbnVsbFxuICAgIH07XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMgPVxuICBmdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudC5sZW5ndGggPj0gdGhpcy5fc291cmNlcy5zaXplKCkgJiZcbiAgICAgICF0aGlzLnNvdXJjZXNDb250ZW50LnNvbWUoZnVuY3Rpb24gKHNjKSB7IHJldHVybiBzYyA9PSBudWxsOyB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBhU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIGFTb3VyY2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhhU291cmNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGFTb3VyY2UpXTtcbiAgICB9XG5cbiAgICB2YXIgdXJsO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbFxuICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgLy8gWFhYOiBmaWxlOi8vIFVSSXMgYW5kIGFic29sdXRlIHBhdGhzIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBmb3JcbiAgICAgIC8vIG1hbnkgdXNlcnMuIFdlIGNhbiBoZWxwIHRoZW0gb3V0IHdoZW4gdGhleSBleHBlY3QgZmlsZTovLyBVUklzIHRvXG4gICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4NTU5Ny5cbiAgICAgIHZhciBmaWxlVXJpQWJzUGF0aCA9IGFTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIGFTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIGFTb3VyY2UpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgcmVjdXJzaXZlbHkgZnJvbVxuICAgIC8vIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvci4gSW4gdGhhdCBjYXNlLCB3ZVxuICAgIC8vIGRvbid0IHdhbnQgdG8gdGhyb3cgaWYgd2UgY2FuJ3QgZmluZCB0aGUgc291cmNlIC0gd2UganVzdCB3YW50IHRvXG4gICAgLy8gcmV0dXJuIG51bGwsIHNvIHdlIHByb3ZpZGUgYSBmbGFnIHRvIGV4aXQgZ3JhY2VmdWxseS5cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBvbmx5IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQjaGVhZGluZz1oLjUzNWVzM3hlcHJndFxuICovXG5mdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IEpTT04ucGFyc2UoYVNvdXJjZU1hcC5yZXBsYWNlKC9eXFwpXFxdXFx9Jy8sICcnKSk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSlcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcblxuICAgICAgLy8gT25seSBjb25zaWRlciB0aGlzIHNlY3Rpb24gaWYgdGhlIHJlcXVlc3RlZCBzb3VyY2UgaXMgaW4gdGhlIGxpc3Qgb2ZcbiAgICAgIC8vIHNvdXJjZXMgb2YgdGhlIGNvbnN1bWVyLlxuICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlcy5pbmRleE9mKHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbihzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKHNvdXJjZSk7XG5cbiAgICAgICAgdmFyIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8vIE1hdGNoZXMgYSBXaW5kb3dzLXN0eWxlIGBcXHJcXG5gIG5ld2xpbmUgb3IgYSBgXFxuYCBuZXdsaW5lIHVzZWQgYnkgYWxsIG90aGVyXG4vLyBvcGVyYXRpbmcgc3lzdGVtcyB0aGVzZSBkYXlzIChjYXB0dXJpbmcgdGhlIHJlc3VsdCkuXG52YXIgUkVHRVhfTkVXTElORSA9IC8oXFxyP1xcbikvO1xuXG4vLyBOZXdsaW5lIGNoYXJhY3RlciBjb2RlIGZvciBjaGFyQ29kZUF0KCkgY29tcGFyaXNvbnNcbnZhciBORVdMSU5FX0NPREUgPSAxMDtcblxuLy8gUHJpdmF0ZSBzeW1ib2wgZm9yIGlkZW50aWZ5aW5nIGBTb3VyY2VOb2RlYHMgd2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZlxuLy8gdGhlIHNvdXJjZS1tYXAgbGlicmFyeSBhcmUgbG9hZGVkLiBUaGlzIE1VU1QgTk9UIENIQU5HRSBhY3Jvc3Ncbi8vIHZlcnNpb25zIVxudmFyIGlzU291cmNlTm9kZSA9IFwiJCQkaXNTb3VyY2VOb2RlJCQkXCI7XG5cbi8qKlxuICogU291cmNlTm9kZXMgcHJvdmlkZSBhIHdheSB0byBhYnN0cmFjdCBvdmVyIGludGVycG9sYXRpbmcvY29uY2F0ZW5hdGluZ1xuICogc25pcHBldHMgb2YgZ2VuZXJhdGVkIEphdmFTY3JpcHQgc291cmNlIGNvZGUgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGxpbmUgYW5kXG4gKiBjb2x1bW4gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcGFyYW0gYUxpbmUgVGhlIG9yaWdpbmFsIGxpbmUgbnVtYmVyLlxuICogQHBhcmFtIGFDb2x1bW4gVGhlIG9yaWdpbmFsIGNvbHVtbiBudW1iZXIuXG4gKiBAcGFyYW0gYVNvdXJjZSBUaGUgb3JpZ2luYWwgc291cmNlJ3MgZmlsZW5hbWUuXG4gKiBAcGFyYW0gYUNodW5rcyBPcHRpb25hbC4gQW4gYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCBhcmUgc25pcHBldHMgb2ZcbiAqICAgICAgICBnZW5lcmF0ZWQgSlMsIG9yIG90aGVyIFNvdXJjZU5vZGVzLlxuICogQHBhcmFtIGFOYW1lIFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLlxuICovXG5mdW5jdGlvbiBTb3VyY2VOb2RlKGFMaW5lLCBhQ29sdW1uLCBhU291cmNlLCBhQ2h1bmtzLCBhTmFtZSkge1xuICB0aGlzLmNoaWxkcmVuID0gW107XG4gIHRoaXMuc291cmNlQ29udGVudHMgPSB7fTtcbiAgdGhpcy5saW5lID0gYUxpbmUgPT0gbnVsbCA/IG51bGwgOiBhTGluZTtcbiAgdGhpcy5jb2x1bW4gPSBhQ29sdW1uID09IG51bGwgPyBudWxsIDogYUNvbHVtbjtcbiAgdGhpcy5zb3VyY2UgPSBhU291cmNlID09IG51bGwgPyBudWxsIDogYVNvdXJjZTtcbiAgdGhpcy5uYW1lID0gYU5hbWUgPT0gbnVsbCA/IG51bGwgOiBhTmFtZTtcbiAgdGhpc1tpc1NvdXJjZU5vZGVdID0gdHJ1ZTtcbiAgaWYgKGFDaHVua3MgIT0gbnVsbCkgdGhpcy5hZGQoYUNodW5rcyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFNvdXJjZU5vZGUgZnJvbSBnZW5lcmF0ZWQgY29kZSBhbmQgYSBTb3VyY2VNYXBDb25zdW1lci5cbiAqXG4gKiBAcGFyYW0gYUdlbmVyYXRlZENvZGUgVGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZVxuICogQHBhcmFtIGFSZWxhdGl2ZVBhdGggT3B0aW9uYWwuIFRoZSBwYXRoIHRoYXQgcmVsYXRpdmUgc291cmNlcyBpbiB0aGVcbiAqICAgICAgICBTb3VyY2VNYXBDb25zdW1lciBzaG91bGQgYmUgcmVsYXRpdmUgdG8uXG4gKi9cblNvdXJjZU5vZGUuZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX2Zyb21TdHJpbmdXaXRoU291cmNlTWFwKGFHZW5lcmF0ZWRDb2RlLCBhU291cmNlTWFwQ29uc3VtZXIsIGFSZWxhdGl2ZVBhdGgpIHtcbiAgICAvLyBUaGUgU291cmNlTm9kZSB3ZSB3YW50IHRvIGZpbGwgd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAgICAvLyBhbmQgdGhlIFNvdXJjZU1hcFxuICAgIHZhciBub2RlID0gbmV3IFNvdXJjZU5vZGUoKTtcblxuICAgIC8vIEFsbCBldmVuIGluZGljZXMgb2YgdGhpcyBhcnJheSBhcmUgb25lIGxpbmUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLFxuICAgIC8vIHdoaWxlIGFsbCBvZGQgaW5kaWNlcyBhcmUgdGhlIG5ld2xpbmVzIGJldHdlZW4gdHdvIGFkamFjZW50IGxpbmVzXG4gICAgLy8gKHNpbmNlIGBSRUdFWF9ORVdMSU5FYCBjYXB0dXJlcyBpdHMgbWF0Y2gpLlxuICAgIC8vIFByb2Nlc3NlZCBmcmFnbWVudHMgYXJlIGFjY2Vzc2VkIGJ5IGNhbGxpbmcgYHNoaWZ0TmV4dExpbmVgLlxuICAgIHZhciByZW1haW5pbmdMaW5lcyA9IGFHZW5lcmF0ZWRDb2RlLnNwbGl0KFJFR0VYX05FV0xJTkUpO1xuICAgIHZhciByZW1haW5pbmdMaW5lc0luZGV4ID0gMDtcbiAgICB2YXIgc2hpZnROZXh0TGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxpbmVDb250ZW50cyA9IGdldE5leHRMaW5lKCk7XG4gICAgICAvLyBUaGUgbGFzdCBsaW5lIG9mIGEgZmlsZSBtaWdodCBub3QgaGF2ZSBhIG5ld2xpbmUuXG4gICAgICB2YXIgbmV3TGluZSA9IGdldE5leHRMaW5lKCkgfHwgXCJcIjtcbiAgICAgIHJldHVybiBsaW5lQ29udGVudHMgKyBuZXdMaW5lO1xuXG4gICAgICBmdW5jdGlvbiBnZXROZXh0TGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHJlbWFpbmluZ0xpbmVzSW5kZXggPCByZW1haW5pbmdMaW5lcy5sZW5ndGggP1xuICAgICAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleCsrXSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gV2UgbmVlZCB0byByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgXCJyZW1haW5pbmdMaW5lc1wiXG4gICAgdmFyIGxhc3RHZW5lcmF0ZWRMaW5lID0gMSwgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG5cbiAgICAvLyBUaGUgZ2VuZXJhdGUgU291cmNlTm9kZXMgd2UgbmVlZCBhIGNvZGUgcmFuZ2UuXG4gICAgLy8gVG8gZXh0cmFjdCBpdCBjdXJyZW50IGFuZCBsYXN0IG1hcHBpbmcgaXMgdXNlZC5cbiAgICAvLyBIZXJlIHdlIHN0b3JlIHRoZSBsYXN0IG1hcHBpbmcuXG4gICAgdmFyIGxhc3RNYXBwaW5nID0gbnVsbDtcblxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgaWYgKGxhc3RNYXBwaW5nICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGFkZCB0aGUgY29kZSBmcm9tIFwibGFzdE1hcHBpbmdcIiB0byBcIm1hcHBpbmdcIjpcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSBuZXcgbGluZSBpbiBiZXR3ZWVuLlxuICAgICAgICBpZiAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICAvLyBBc3NvY2lhdGUgZmlyc3QgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgY29kZSBpcyBhZGRlZCB3aXRob3V0IG1hcHBpbmdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZXcgbGluZSBpbiBiZXR3ZWVuLlxuICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgY29kZSBiZXR3ZWVuIFwibGFzdEdlbmVyYXRlZENvbHVtblwiIGFuZFxuICAgICAgICAgIC8vIFwibWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cIiB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdO1xuICAgICAgICAgIHZhciBjb2RlID0gbmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgY29kZSk7XG4gICAgICAgICAgLy8gTm8gbW9yZSByZW1haW5pbmcgY29kZSwgY29udGludWVcbiAgICAgICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBXZSBhZGQgdGhlIGdlbmVyYXRlZCBjb2RlIHVudGlsIHRoZSBmaXJzdCBtYXBwaW5nXG4gICAgICAvLyB0byB0aGUgU291cmNlTm9kZSB3aXRob3V0IGFueSBtYXBwaW5nLlxuICAgICAgLy8gRWFjaCBsaW5lIGlzIGFkZGVkIGFzIHNlcGFyYXRlIHN0cmluZy5cbiAgICAgIHdoaWxlIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICBub2RlLmFkZChzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRDb2x1bW4gPCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbikge1xuICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XTtcbiAgICAgICAgbm9kZS5hZGQobmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSk7XG4gICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgfVxuICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgIH0sIHRoaXMpO1xuICAgIC8vIFdlIGhhdmUgcHJvY2Vzc2VkIGFsbCBtYXBwaW5ncy5cbiAgICBpZiAocmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCkge1xuICAgICAgaWYgKGxhc3RNYXBwaW5nKSB7XG4gICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgcmVtYWluaW5nIGNvZGUgaW4gdGhlIGN1cnJlbnQgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICB9XG4gICAgICAvLyBhbmQgYWRkIHRoZSByZW1haW5pbmcgbGluZXMgd2l0aG91dCBhbnkgbWFwcGluZ1xuICAgICAgbm9kZS5hZGQocmVtYWluaW5nTGluZXMuc3BsaWNlKHJlbWFpbmluZ0xpbmVzSW5kZXgpLmpvaW4oXCJcIikpO1xuICAgIH1cblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnQgaW50byBTb3VyY2VOb2RlXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGFSZWxhdGl2ZVBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5vZGU7XG5cbiAgICBmdW5jdGlvbiBhZGRNYXBwaW5nV2l0aENvZGUobWFwcGluZywgY29kZSkge1xuICAgICAgaWYgKG1hcHBpbmcgPT09IG51bGwgfHwgbWFwcGluZy5zb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub2RlLmFkZChjb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhUmVsYXRpdmVQYXRoXG4gICAgICAgICAgPyB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgbWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgOiBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgbm9kZS5hZGQobmV3IFNvdXJjZU5vZGUobWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFkZCBhIGNodW5rIG9mIGdlbmVyYXRlZCBKUyB0byB0aGlzIHNvdXJjZSBub2RlLlxuICpcbiAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfYWRkKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgYUNodW5rLmZvckVhY2goZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICB0aGlzLmFkZChjaHVuayk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbiAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChhQ2h1bmspIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChhQ2h1bmspO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZCBhIGNodW5rIG9mIGdlbmVyYXRlZCBKUyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcHJlcGVuZChhQ2h1bmspIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgIGZvciAodmFyIGkgPSBhQ2h1bmsubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLnByZXBlbmQoYUNodW5rW2ldKTtcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRoaXMuY2hpbGRyZW4udW5zaGlmdChhQ2h1bmspO1xuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIEpTIHNuaXBwZXRzIGluIHRoaXMgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLiBUaGVcbiAqIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc25pcHBldCBvZiBKUyBhbmQgaXMgcGFzc2VkIHRoYXRcbiAqIHNuaXBwZXQgYW5kIHRoZSBpdHMgb3JpZ2luYWwgYXNzb2NpYXRlZCBzb3VyY2UncyBsaW5lL2NvbHVtbiBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGsoYUZuKSB7XG4gIHZhciBjaHVuaztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaHVuayA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgaWYgKGNodW5rW2lzU291cmNlTm9kZV0pIHtcbiAgICAgIGNodW5rLndhbGsoYUZuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoY2h1bmsgIT09ICcnKSB7XG4gICAgICAgIGFGbihjaHVuaywgeyBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTGlrZSBgU3RyaW5nLnByb3RvdHlwZS5qb2luYCBleGNlcHQgZm9yIFNvdXJjZU5vZGVzLiBJbnNlcnRzIGBhU3RyYCBiZXR3ZWVuXG4gKiBlYWNoIG9mIGB0aGlzLmNoaWxkcmVuYC5cbiAqXG4gKiBAcGFyYW0gYVNlcCBUaGUgc2VwYXJhdG9yLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gU291cmNlTm9kZV9qb2luKGFTZXApIHtcbiAgdmFyIG5ld0NoaWxkcmVuO1xuICB2YXIgaTtcbiAgdmFyIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICBpZiAobGVuID4gMCkge1xuICAgIG5ld0NoaWxkcmVuID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbi0xOyBpKyspIHtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKGFTZXApO1xuICAgIH1cbiAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2FsbCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Ugb24gdGhlIHZlcnkgcmlnaHQtbW9zdCBzb3VyY2Ugc25pcHBldC4gVXNlZnVsXG4gKiBmb3IgdHJpbW1pbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBlbmQgb2YgYSBzb3VyY2Ugbm9kZSwgZXRjLlxuICpcbiAqIEBwYXJhbSBhUGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICogQHBhcmFtIGFSZXBsYWNlbWVudCBUaGUgdGhpbmcgdG8gcmVwbGFjZSB0aGUgcGF0dGVybiB3aXRoLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5yZXBsYWNlUmlnaHQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3JlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KSB7XG4gIHZhciBsYXN0Q2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gIGlmIChsYXN0Q2hpbGRbaXNTb3VyY2VOb2RlXSkge1xuICAgIGxhc3RDaGlsZC5yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIGxhc3RDaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV0gPSBsYXN0Q2hpbGQucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goJycucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuIFRoaXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgU291cmNlTWFwR2VuZXJhdG9yXG4gKiBpbiB0aGUgc291cmNlc0NvbnRlbnQgZmllbGQuXG4gKlxuICogQHBhcmFtIGFTb3VyY2VGaWxlIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGVcbiAqIEBwYXJhbSBhU291cmNlQ29udGVudCBUaGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGVcbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfc2V0U291cmNlQ29udGVudChhU291cmNlRmlsZSwgYVNvdXJjZUNvbnRlbnQpIHtcbiAgICB0aGlzLnNvdXJjZUNvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoYVNvdXJjZUZpbGUpXSA9IGFTb3VyY2VDb250ZW50O1xuICB9O1xuXG4vKipcbiAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBTb3VyY2VOb2Rlcy4gVGhlIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoXG4gKiBzb3VyY2UgZmlsZSBjb250ZW50IGFuZCBpcyBwYXNzZWQgdGhlIGZpbGVuYW1lIGFuZCBzb3VyY2UgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLndhbGtTb3VyY2VDb250ZW50cyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2Fsa1NvdXJjZUNvbnRlbnRzKGFGbikge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbltpXVtpc1NvdXJjZU5vZGVdKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5baV0ud2Fsa1NvdXJjZUNvbnRlbnRzKGFGbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUNvbnRlbnRzKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc291cmNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgYUZuKHV0aWwuZnJvbVNldFN0cmluZyhzb3VyY2VzW2ldKSwgdGhpcy5zb3VyY2VDb250ZW50c1tzb3VyY2VzW2ldXSk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUuIFdhbGtzIG92ZXIgdGhlIHRyZWVcbiAqIGFuZCBjb25jYXRlbmF0ZXMgYWxsIHRoZSB2YXJpb3VzIHNuaXBwZXRzIHRvZ2V0aGVyIHRvIG9uZSBzdHJpbmcuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZygpIHtcbiAgdmFyIHN0ciA9IFwiXCI7XG4gIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBzdHIgKz0gY2h1bms7XG4gIH0pO1xuICByZXR1cm4gc3RyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZSBhbG9uZyB3aXRoIGEgc291cmNlXG4gKiBtYXAuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nV2l0aFNvdXJjZU1hcCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmdXaXRoU291cmNlTWFwKGFBcmdzKSB7XG4gIHZhciBnZW5lcmF0ZWQgPSB7XG4gICAgY29kZTogXCJcIixcbiAgICBsaW5lOiAxLFxuICAgIGNvbHVtbjogMFxuICB9O1xuICB2YXIgbWFwID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncyk7XG4gIHZhciBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gIHZhciBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICB2YXIgbGFzdE9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB2YXIgbGFzdE9yaWdpbmFsTmFtZSA9IG51bGw7XG4gIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmssIG9yaWdpbmFsKSB7XG4gICAgZ2VuZXJhdGVkLmNvZGUgKz0gY2h1bms7XG4gICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPT0gbnVsbFxuICAgICAgICAmJiBvcmlnaW5hbC5saW5lICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmNvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgaWYobGFzdE9yaWdpbmFsU291cmNlICE9PSBvcmlnaW5hbC5zb3VyY2VcbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbExpbmUgIT09IG9yaWdpbmFsLmxpbmVcbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbENvbHVtbiAhPT0gb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxOYW1lICE9PSBvcmlnaW5hbC5uYW1lKSB7XG4gICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gb3JpZ2luYWwuc291cmNlO1xuICAgICAgbGFzdE9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICBsYXN0T3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICBsYXN0T3JpZ2luYWxOYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW5ndGggPSBjaHVuay5sZW5ndGg7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGlmIChjaHVuay5jaGFyQ29kZUF0KGlkeCkgPT09IE5FV0xJTkVfQ09ERSkge1xuICAgICAgICBnZW5lcmF0ZWQubGluZSsrO1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uID0gMDtcbiAgICAgICAgLy8gTWFwcGluZ3MgZW5kIGF0IGVvbFxuICAgICAgICBpZiAoaWR4ICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbisrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHRoaXMud2Fsa1NvdXJjZUNvbnRlbnRzKGZ1bmN0aW9uIChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KSB7XG4gICAgbWFwLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgc291cmNlQ29udGVudCk7XG4gIH0pO1xuXG4gIHJldHVybiB7IGNvZGU6IGdlbmVyYXRlZC5jb2RlLCBtYXA6IG1hcCB9O1xufTtcblxuZXhwb3J0cy5Tb3VyY2VOb2RlID0gU291cmNlTm9kZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vc291cmNlTWFwJyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuXG5mdW5jdGlvbiBlYWNoKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgIHZhciBsaXN0ID0gbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgY3Vyc29yID0gbGlzdC5oZWFkO1xuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlKHByb2Nlc3NDaHVuaywgY3Vyc29yLmRhdGEsIGN1cnNvciwgbGlzdCk7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZWFjaENvbW1hKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgIHZhciBsaXN0ID0gbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgY3Vyc29yID0gbGlzdC5oZWFkO1xuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoY3Vyc29yLnByZXYpIHtcbiAgICAgICAgICAgIHByb2Nlc3NDaHVuaygnLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZW5lcmF0ZShwcm9jZXNzQ2h1bmssIGN1cnNvci5kYXRhLCBjdXJzb3IsIGxpc3QpO1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3IubmV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRvcih0eXBlcykge1xuICAgIHZhciBjb250ZXh0ID0ge1xuICAgICAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlcywgbm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIHR5cGVzW25vZGUudHlwZV0uY2FsbCh0aGlzLCBwcm9jZXNzQ2h1bmssIG5vZGUsIGl0ZW0sIGxpc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlOiAnICsgbm9kZS50eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZWFjaDogZWFjaCxcbiAgICAgICAgZWFjaENvbW1hOiBlYWNoQ29tbWFcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUsIGZuKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgZ2VuZXJhdG9yIGNvbmNhdHMgYWxsIGNodW5rcyBpbiBhIHNpbmdsZSBzdHJpbmdcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgIGNvbnRleHQuZ2VuZXJhdGUoZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgICAgICAgICBidWZmZXIucHVzaChjaHVuayk7XG4gICAgICAgICAgICB9LCBub2RlKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXIuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5nZW5lcmF0ZShmbiwgbm9kZSk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFya3VwR2VuZXJhdG9yKHR5cGVzKSB7XG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGVzLCBub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVCdWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICB0eXBlc1tub2RlLnR5cGVdLmNhbGwodGhpcywgZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICB9LCBub2RlLCBpdGVtLCBsaXN0KTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ2h1bmsoe1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbm9kZUJ1ZmZlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlOiAnICsgbm9kZS50eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZWFjaDogZWFjaCxcbiAgICAgICAgZWFjaENvbW1hOiBlYWNoQ29tbWFcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUsIGVudGVyLCBsZWF2ZSkge1xuICAgICAgICBmdW5jdGlvbiB1cGRhdGVQb3Moc3RyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA9PT0gMTApIHsgLy8gXFxuXG4gICAgICAgICAgICAgICAgICAgIGxpbmUrKztcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB3YWxrKG5vZGUsIGJ1ZmZlcikge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gbm9kZS52YWx1ZTtcblxuICAgICAgICAgICAgZW50ZXIobm9kZS5ub2RlLCBidWZmZXIsIGxpbmUsIGNvbHVtbik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyICs9IHVwZGF0ZVBvcyh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSB1cGRhdGVQb3ModmFsdWVbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gd2Fsayh2YWx1ZVtpXSwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGVhdmUobm9kZS5ub2RlLCBidWZmZXIsIGxpbmUsIGNvbHVtbik7XG5cbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGVudGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBlbnRlciA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZWF2ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGVhdmUgPSBub29wO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJ1ZmZlciA9IFtdO1xuICAgICAgICB2YXIgbGluZSA9IDE7XG4gICAgICAgIHZhciBjb2x1bW4gPSAwO1xuXG4gICAgICAgIGNvbnRleHQuZ2VuZXJhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBidWZmZXIucHVzaC5hcHBseShidWZmZXIsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIG5vZGUpO1xuXG4gICAgICAgIHJldHVybiB3YWxrKGJ1ZmZlclswXSwgJycpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVzRnJvbUNvbmZpZyhjb25maWcpIHtcbiAgICB2YXIgdHlwZXMgPSB7fTtcblxuICAgIGlmIChjb25maWcubm9kZSkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIGNvbmZpZy5ub2RlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZVR5cGUgPSBjb25maWcubm9kZVtuYW1lXTtcblxuICAgICAgICAgICAgdHlwZXNbbmFtZV0gPSBub2RlVHlwZS5nZW5lcmF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb25maWcpIHtcbiAgICB2YXIgdHlwZXMgPSBnZXRUeXBlc0Zyb21Db25maWcoY29uZmlnKTtcbiAgICB2YXIgbWFya3VwR2VuZXJhdG9yID0gY3JlYXRlTWFya3VwR2VuZXJhdG9yKHR5cGVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zbGF0ZTogY3JlYXRlR2VuZXJhdG9yKHR5cGVzKSxcbiAgICAgICAgdHJhbnNsYXRlV2l0aFNvdXJjZU1hcDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZU1hcEdlbmVyYXRvcihtYXJrdXBHZW5lcmF0b3IsIG5vZGUpO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGVNYXJrdXA6IG1hcmt1cEdlbmVyYXRvclxuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVHZW5lcmF0b3IgPSBjcmVhdGVHZW5lcmF0b3I7XG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVNYXJrdXBHZW5lcmF0b3IgPSBjcmVhdGVNYXJrdXBHZW5lcmF0b3I7XG5tb2R1bGUuZXhwb3J0cy5zb3VyY2VNYXAgPSByZXF1aXJlKCcuL3NvdXJjZU1hcCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiB3YWxrUnVsZXMobm9kZSwgaXRlbSwgbGlzdCkge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1N0eWxlU2hlZXQnOlxuICAgICAgICAgICAgdmFyIG9sZFN0eWxlc2hlZXQgPSB0aGlzLnN0eWxlc2hlZXQ7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBub2RlO1xuXG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLmVhY2god2Fsa1J1bGVzLCB0aGlzKTtcblxuICAgICAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gb2xkU3R5bGVzaGVldDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0F0cnVsZSc6XG4gICAgICAgICAgICBpZiAobm9kZS5ibG9jayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBvbGRBdHJ1bGUgPSB0aGlzLmF0cnVsZTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0cnVsZSA9IG5vZGU7XG5cbiAgICAgICAgICAgICAgICB3YWxrUnVsZXMuY2FsbCh0aGlzLCBub2RlLmJsb2NrKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXRydWxlID0gb2xkQXRydWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZuKG5vZGUsIGl0ZW0sIGxpc3QpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnUnVsZSc6XG4gICAgICAgICAgICB0aGlzLmZuKG5vZGUsIGl0ZW0sIGxpc3QpO1xuXG4gICAgICAgICAgICB2YXIgb2xkUnVsZSA9IHRoaXMucnVsZTtcbiAgICAgICAgICAgIHRoaXMucnVsZSA9IG5vZGU7XG5cbiAgICAgICAgICAgIHdhbGtSdWxlcy5jYWxsKHRoaXMsIG5vZGUuYmxvY2spO1xuXG4gICAgICAgICAgICB0aGlzLnJ1bGUgPSBvbGRSdWxlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQmxvY2snOlxuICAgICAgICAgICAgdmFyIG9sZEJsb2NrID0gdGhpcy5ibG9jaztcbiAgICAgICAgICAgIHRoaXMuYmxvY2sgPSBub2RlO1xuXG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLmVhY2god2Fsa1J1bGVzLCB0aGlzKTtcblxuICAgICAgICAgICAgdGhpcy5ibG9jayA9IG9sZEJsb2NrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3YWxrUnVsZXNSaWdodChub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU3R5bGVTaGVldCc6XG4gICAgICAgICAgICB2YXIgb2xkU3R5bGVzaGVldCA9IHRoaXMuc3R5bGVzaGVldDtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IG5vZGU7XG5cbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZWFjaFJpZ2h0KHdhbGtSdWxlc1JpZ2h0LCB0aGlzKTtcblxuICAgICAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gb2xkU3R5bGVzaGVldDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0F0cnVsZSc6XG4gICAgICAgICAgICBpZiAobm9kZS5ibG9jayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBvbGRBdHJ1bGUgPSB0aGlzLmF0cnVsZTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0cnVsZSA9IG5vZGU7XG5cbiAgICAgICAgICAgICAgICB3YWxrUnVsZXNSaWdodC5jYWxsKHRoaXMsIG5vZGUuYmxvY2spO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hdHJ1bGUgPSBvbGRBdHJ1bGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZm4obm9kZSwgaXRlbSwgbGlzdCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdSdWxlJzpcbiAgICAgICAgICAgIHZhciBvbGRSdWxlID0gdGhpcy5ydWxlO1xuICAgICAgICAgICAgdGhpcy5ydWxlID0gbm9kZTtcblxuICAgICAgICAgICAgd2Fsa1J1bGVzUmlnaHQuY2FsbCh0aGlzLCBub2RlLmJsb2NrKTtcblxuICAgICAgICAgICAgdGhpcy5ydWxlID0gb2xkUnVsZTtcblxuICAgICAgICAgICAgdGhpcy5mbihub2RlLCBpdGVtLCBsaXN0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0Jsb2NrJzpcbiAgICAgICAgICAgIHZhciBvbGRCbG9jayA9IHRoaXMuYmxvY2s7XG4gICAgICAgICAgICB0aGlzLmJsb2NrID0gbm9kZTtcblxuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5lYWNoUmlnaHQod2Fsa1J1bGVzUmlnaHQsIHRoaXMpO1xuXG4gICAgICAgICAgICB0aGlzLmJsb2NrID0gb2xkQmxvY2s7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHdhbGtEZWNsYXJhdGlvbnMobm9kZSkge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1N0eWxlU2hlZXQnOlxuICAgICAgICAgICAgdmFyIG9sZFN0eWxlc2hlZXQgPSB0aGlzLnN0eWxlc2hlZXQ7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBub2RlO1xuXG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLmVhY2god2Fsa0RlY2xhcmF0aW9ucywgdGhpcyk7XG5cbiAgICAgICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IG9sZFN0eWxlc2hlZXQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdBdHJ1bGUnOlxuICAgICAgICAgICAgaWYgKG5vZGUuYmxvY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2xkQXRydWxlID0gdGhpcy5hdHJ1bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHJ1bGUgPSBub2RlO1xuXG4gICAgICAgICAgICAgICAgd2Fsa0RlY2xhcmF0aW9ucy5jYWxsKHRoaXMsIG5vZGUuYmxvY2spO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hdHJ1bGUgPSBvbGRBdHJ1bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdSdWxlJzpcbiAgICAgICAgICAgIHZhciBvbGRSdWxlID0gdGhpcy5ydWxlO1xuICAgICAgICAgICAgdGhpcy5ydWxlID0gbm9kZTtcblxuICAgICAgICAgICAgaWYgKG5vZGUuYmxvY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3YWxrRGVjbGFyYXRpb25zLmNhbGwodGhpcywgbm9kZS5ibG9jayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucnVsZSA9IG9sZFJ1bGU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdCbG9jayc6XG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24obm9kZSwgaXRlbSwgbGlzdCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdEZWNsYXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbihub2RlLCBpdGVtLCBsaXN0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrRGVjbGFyYXRpb25zLmNhbGwodGhpcywgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFdhbGtlcnNGcm9tU3RydWN0dXJlKG5hbWUsIG5vZGVUeXBlKSB7XG4gICAgdmFyIHN0cnVjdHVyZSA9IG5vZGVUeXBlLnN0cnVjdHVyZTtcbiAgICB2YXIgd2Fsa2VycyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHN0cnVjdHVyZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzdHJ1Y3R1cmUsIGtleSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmaWVsZFR5cGVzID0gc3RydWN0dXJlW2tleV07XG4gICAgICAgIHZhciB3YWxrZXIgPSB7XG4gICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICB0eXBlOiBmYWxzZSxcbiAgICAgICAgICAgIG51bGxhYmxlOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHJ1Y3R1cmVba2V5XSkpIHtcbiAgICAgICAgICAgIGZpZWxkVHlwZXMgPSBbc3RydWN0dXJlW2tleV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGRUeXBlID0gZmllbGRUeXBlc1tpXTtcbiAgICAgICAgICAgIGlmIChmaWVsZFR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3YWxrZXIubnVsbGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHdhbGtlci50eXBlID0gJ25vZGUnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVHlwZSkpIHtcbiAgICAgICAgICAgICAgICB3YWxrZXIudHlwZSA9ICdsaXN0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3YWxrZXIudHlwZSkge1xuICAgICAgICAgICAgd2Fsa2Vycy5wdXNoKHdhbGtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2Fsa2Vycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRleHQ6IG5vZGVUeXBlLndhbGtDb250ZXh0LFxuICAgICAgICAgICAgZmllbGRzOiB3YWxrZXJzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVzRnJvbUNvbmZpZyhjb25maWcpIHtcbiAgICB2YXIgdHlwZXMgPSB7fTtcblxuICAgIGlmIChjb25maWcubm9kZSkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIGNvbmZpZy5ub2RlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcubm9kZSwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZVR5cGUgPSBjb25maWcubm9kZVtuYW1lXTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlVHlwZS5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdhbGtlcnMgPSBnZXRXYWxrZXJzRnJvbVN0cnVjdHVyZShuYW1lLCBub2RlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWxrZXJzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlc1tuYW1lXSA9IHdhbGtlcnM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NlZCBgc3RydWN0dXJlYCBmaWVsZCBpbiBgJyArIG5hbWUgKyAnYCBub2RlIHR5cGUgZGVmaW5pdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChyb290LCBmbikge1xuICAgIHZhciBjb250ZXh0ID0ge1xuICAgICAgICBmbjogZm4sXG4gICAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICAgIHN0eWxlc2hlZXQ6IG51bGwsXG4gICAgICAgIGF0cnVsZTogbnVsbCxcbiAgICAgICAgYXRydWxlUHJlbHVkZTogbnVsbCxcbiAgICAgICAgcnVsZTogbnVsbCxcbiAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgIGJsb2NrOiBudWxsLFxuICAgICAgICBkZWNsYXJhdGlvbjogbnVsbCxcbiAgICAgICAgZnVuY3Rpb246IG51bGxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlV2Fsa2VyKGNvbmZpZykge1xuICAgIHZhciB0eXBlcyA9IGdldFR5cGVzRnJvbUNvbmZpZyhjb25maWcpO1xuICAgIHZhciB3YWxrZXJzID0ge307XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHR5cGVzKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGVzLCBuYW1lKSkge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHR5cGVzW25hbWVdO1xuICAgICAgICAgICAgd2Fsa2Vyc1tuYW1lXSA9IEZ1bmN0aW9uKCdub2RlJywgJ2NvbnRleHQnLCAnd2FsaycsXG4gICAgICAgICAgICAgICAgKGNvbmZpZy5jb250ZXh0ID8gJ3ZhciBvbGQgPSBjb250ZXh0LicgKyBjb25maWcuY29udGV4dCArICc7XFxuY29udGV4dC4nICsgY29uZmlnLmNvbnRleHQgKyAnID0gbm9kZTtcXG4nIDogJycpICtcbiAgICAgICAgICAgICAgICBjb25maWcuZmllbGRzLm1hcChmdW5jdGlvbihmaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluZSA9IGZpZWxkLnR5cGUgPT09ICdsaXN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbm9kZS4nICsgZmllbGQubmFtZSArICcuZWFjaCh3YWxrKTsnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICd3YWxrKG5vZGUuJyArIGZpZWxkLm5hbWUgKyAnKTsnO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5udWxsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICdpZiAobm9kZS4nICsgZmllbGQubmFtZSArICcpIHtcXG4gICAgJyArIGxpbmUgKyAnfSc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCdcXG4nKSArXG4gICAgICAgICAgICAgICAgKGNvbmZpZy5jb250ZXh0ID8gJ1xcbmNvbnRleHQuJyArIGNvbmZpZy5jb250ZXh0ICsgJyA9IG9sZDsnIDogJycpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2FsazogZnVuY3Rpb24ocm9vdCwgZm4pIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHdhbGsobm9kZSwgaXRlbSwgbGlzdCkge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29udGV4dCwgbm9kZSwgaXRlbSwgbGlzdCk7XG4gICAgICAgICAgICAgICAgaWYgKHdhbGtlcnMuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB3YWxrZXJzW25vZGUudHlwZV0obm9kZSwgY29udGV4dCwgd2Fsayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQocm9vdCwgZm4pO1xuXG4gICAgICAgICAgICB3YWxrKHJvb3QpO1xuICAgICAgICB9LFxuICAgICAgICB3YWxrVXA6IGZ1bmN0aW9uKHJvb3QsIGZuKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiB3YWxrKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAod2Fsa2Vycy5oYXNPd25Qcm9wZXJ0eShub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtlcnNbbm9kZS50eXBlXShub2RlLCBjb250ZXh0LCB3YWxrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm4uY2FsbChjb250ZXh0LCBub2RlLCBpdGVtLCBsaXN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHJvb3QsIGZuKTtcblxuICAgICAgICAgICAgd2Fsayhyb290KTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Fsa1J1bGVzOiBmdW5jdGlvbihyb290LCBmbikge1xuICAgICAgICAgICAgd2Fsa1J1bGVzLmNhbGwoY3JlYXRlQ29udGV4dChyb290LCBmbiksIHJvb3QpO1xuICAgICAgICB9LFxuICAgICAgICB3YWxrUnVsZXNSaWdodDogZnVuY3Rpb24ocm9vdCwgZm4pIHtcbiAgICAgICAgICAgIHdhbGtSdWxlc1JpZ2h0LmNhbGwoY3JlYXRlQ29udGV4dChyb290LCBmbiksIHJvb3QpO1xuICAgICAgICB9LFxuICAgICAgICB3YWxrRGVjbGFyYXRpb25zOiBmdW5jdGlvbihyb290LCBmbikge1xuICAgICAgICAgICAgd2Fsa0RlY2xhcmF0aW9ucy5jYWxsKGNyZWF0ZUNvbnRleHQocm9vdCwgZm4pLCByb290KTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwidmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBzaGFwZSA9IHtcbiAgICBnZW5lcmljOiB0cnVlLFxuICAgIHR5cGVzOiB7fSxcbiAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICBwYXJzZUNvbnRleHQ6IHt9LFxuICAgIHNjb3BlOiB7fSxcbiAgICBhdHJ1bGU6IFsncGFyc2UnXSxcbiAgICBwc2V1ZG86IFsncGFyc2UnXSxcbiAgICBub2RlOiBbJ25hbWUnLCAnc3RydWN0dXJlJywgJ3BhcnNlJywgJ2dlbmVyYXRlJywgJ3dhbGtDb250ZXh0J11cbn07XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGNvcHkodmFsdWUpIHtcbiAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhciByZXMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc1trZXldID0gdmFsdWVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNyYywga2V5KSkge1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGRlc3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBleHRlbmQoZGVzdFtrZXldLCBjb3B5KHNyY1trZXldKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IGNvcHkoc3JjW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtaXgoZGVzdCwgc3JjLCBzaGFwZSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzaGFwZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzaGFwZSwga2V5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNoYXBlW2tleV0gPT09IHRydWUpIHtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gc3JjKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc3JjLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IGNvcHkoc3JjW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZVtrZXldKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3Qoc2hhcGVba2V5XSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0ge307XG4gICAgICAgICAgICAgICAgZXh0ZW5kKHJlcywgZGVzdFtrZXldKTtcbiAgICAgICAgICAgICAgICBleHRlbmQocmVzLCBzcmNba2V5XSk7XG4gICAgICAgICAgICAgICAgZGVzdFtrZXldID0gcmVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNoYXBlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IHt9O1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclNoYXBlID0gc2hhcGVba2V5XS5yZWR1Y2UoZnVuY3Rpb24ocywgaykge1xuICAgICAgICAgICAgICAgICAgICBzW2tdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gZGVzdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3Rba2V5XSwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tuYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3Rba2V5XSAmJiBkZXN0W2tleV1bbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgocmVzW25hbWVdLCBkZXN0W2tleV1bbmFtZV0sIGlubmVyU2hhcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3JjW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc3JjW2tleV0sIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tuYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1trZXldICYmIHNyY1trZXldW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4KHJlc1tuYW1lXSwgc3JjW2tleV1bbmFtZV0sIGlubmVyU2hhcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkZXN0LCBzcmMpIHtcbiAgICByZXR1cm4gbWl4KGRlc3QsIHNyYywgc2hhcGUpO1xufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvbGlzdCcpO1xudmFyIFRva2VuaXplciA9IHJlcXVpcmUoJy4uL3Rva2VuaXplcicpO1xudmFyIExleGVyID0gcmVxdWlyZSgnLi4vbGV4ZXIvTGV4ZXInKTtcbnZhciBncmFtbWFyID0gcmVxdWlyZSgnLi4vbGV4ZXIvZ3JhbW1hcicpO1xudmFyIGNyZWF0ZVBhcnNlciA9IHJlcXVpcmUoJy4uL3BhcnNlci9jcmVhdGUnKTtcbnZhciBjcmVhdGVHZW5lcmF0b3IgPSByZXF1aXJlKCcuLi9nZW5lcmF0b3IvY3JlYXRlJyk7XG52YXIgY3JlYXRlQ29udmVydG9yID0gcmVxdWlyZSgnLi4vY29udmVydG9yL2NyZWF0ZScpO1xudmFyIGNyZWF0ZVdhbGtlciA9IHJlcXVpcmUoJy4uL3dhbGtlci9jcmVhdGUnKTtcbnZhciBjbG9uZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2Nsb25lJyk7XG52YXIgbmFtZXMgPSByZXF1aXJlKCcuLi91dGlscy9uYW1lcycpO1xudmFyIG1peCA9IHJlcXVpcmUoJy4vY29uZmlnL21peCcpO1xuXG5mdW5jdGlvbiBhc3NpZ24oZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgICBkZXN0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ludGF4KGNvbmZpZykge1xuICAgIHZhciBwYXJzZSA9IGNyZWF0ZVBhcnNlcihjb25maWcpO1xuICAgIHZhciB3YWxrZXIgPSBjcmVhdGVXYWxrZXIoY29uZmlnKTtcbiAgICB2YXIgZ2VuZXJhdG9yID0gY3JlYXRlR2VuZXJhdG9yKGNvbmZpZyk7XG4gICAgdmFyIGNvbnZlcnRvciA9IGNyZWF0ZUNvbnZlcnRvcih3YWxrZXIpO1xuXG4gICAgdmFyIHN5bnRheCA9IHtcbiAgICAgICAgTGlzdDogTGlzdCxcbiAgICAgICAgVG9rZW5pemVyOiBUb2tlbml6ZXIsXG4gICAgICAgIExleGVyOiBMZXhlcixcblxuICAgICAgICBwcm9wZXJ0eTogbmFtZXMucHJvcGVydHksXG4gICAgICAgIGtleXdvcmQ6IG5hbWVzLmtleXdvcmQsXG5cbiAgICAgICAgZ3JhbW1hcjogZ3JhbW1hcixcbiAgICAgICAgbGV4ZXI6IG51bGwsXG4gICAgICAgIGNyZWF0ZUxleGVyOiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGV4ZXIoY29uZmlnLCBzeW50YXgsIHN5bnRheC5sZXhlci5zdHJ1Y3R1cmUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHBhcnNlOiBwYXJzZSxcblxuICAgICAgICB3YWxrOiB3YWxrZXIud2FsayxcbiAgICAgICAgd2Fsa1VwOiB3YWxrZXIud2Fsa1VwLFxuICAgICAgICB3YWxrUnVsZXM6IHdhbGtlci53YWxrUnVsZXMsXG4gICAgICAgIHdhbGtSdWxlc1JpZ2h0OiB3YWxrZXIud2Fsa1J1bGVzUmlnaHQsXG4gICAgICAgIHdhbGtEZWNsYXJhdGlvbnM6IHdhbGtlci53YWxrRGVjbGFyYXRpb25zLFxuXG4gICAgICAgIHRyYW5zbGF0ZTogZ2VuZXJhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgdHJhbnNsYXRlV2l0aFNvdXJjZU1hcDogZ2VuZXJhdG9yLnRyYW5zbGF0ZVdpdGhTb3VyY2VNYXAsXG4gICAgICAgIHRyYW5zbGF0ZU1hcmt1cDogZ2VuZXJhdG9yLnRyYW5zbGF0ZU1hcmt1cCxcblxuICAgICAgICBjbG9uZTogY2xvbmUsXG4gICAgICAgIGZyb21QbGFpbk9iamVjdDogY29udmVydG9yLmZyb21QbGFpbk9iamVjdCxcbiAgICAgICAgdG9QbGFpbk9iamVjdDogY29udmVydG9yLnRvUGxhaW5PYmplY3QsXG5cbiAgICAgICAgY3JlYXRlU3ludGF4OiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXgobWl4KHt9LCBjb25maWcpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZm9yazogZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICB2YXIgYmFzZSA9IG1peCh7fSwgY29uZmlnKTsgLy8gY29weSBvZiBjb25maWdcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXgoXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV4dGVuc2lvbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IGV4dGVuc2lvbihiYXNlLCBhc3NpZ24pXG4gICAgICAgICAgICAgICAgICAgIDogbWl4KGJhc2UsIGV4dGVuc2lvbilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc3ludGF4LmxleGVyID0gbmV3IExleGVyKHtcbiAgICAgICAgZ2VuZXJpYzogdHJ1ZSxcbiAgICAgICAgdHlwZXM6IGNvbmZpZy50eXBlcyxcbiAgICAgICAgcHJvcGVydGllczogY29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgIG5vZGU6IGNvbmZpZy5ub2RlXG4gICAgfSwgc3ludGF4KTtcblxuICAgIHJldHVybiBzeW50YXg7XG59O1xuXG5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgIHJldHVybiBjcmVhdGVTeW50YXgobWl4KHt9LCBjb25maWcpKTtcbn07XG4iLCJ2YXIgbWRuUHJvcGVydGllcyA9IHJlcXVpcmUoJ21kbi1kYXRhL2Nzcy9wcm9wZXJ0aWVzLmpzb24nKTtcbnZhciBtZG5TeW50YXhlcyA9IHJlcXVpcmUoJ21kbi1kYXRhL2Nzcy9zeW50YXhlcy5qc29uJyk7XG52YXIgcGF0Y2ggPSByZXF1aXJlKCcuL3BhdGNoLmpzb24nKTtcbnZhciBkYXRhID0ge1xuICAgIHByb3BlcnRpZXM6IHt9LFxuICAgIHR5cGVzOiB7fVxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplU3ludGF4KHN5bnRheCkge1xuICAgIHJldHVybiBzeW50YXhcbiAgICAgICAgLnJlcGxhY2UoLyZsdDsvZywgJzwnKVxuICAgICAgICAucmVwbGFjZSgvJmd0Oy9nLCAnPicpXG4gICAgICAgIC5yZXBsYWNlKC8mbmJzcDsvZywgJyAnKVxuICAgICAgICAucmVwbGFjZSgvJmFtcDsvZywgJyYnKTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hEaWN0KGRpY3QsIHBhdGNoRGljdCkge1xuICAgIGZvciAodmFyIGtleSBpbiBwYXRjaERpY3QpIHtcbiAgICAgICAgaWYgKGtleSBpbiBkaWN0KSB7XG4gICAgICAgICAgICBpZiAocGF0Y2hEaWN0W2tleV0uc3ludGF4KSB7XG4gICAgICAgICAgICAgICAgZGljdFtrZXldLnN5bnRheCA9IHBhdGNoRGljdFtrZXldLnN5bnRheDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRpY3Rba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwYXRjaERpY3Rba2V5XS5zeW50YXgpIHtcbiAgICAgICAgICAgICAgICBkaWN0W2tleV0gPSBwYXRjaERpY3Rba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gYXBwbHkgcGF0Y2hcbnBhdGNoRGljdChtZG5Qcm9wZXJ0aWVzLCBwYXRjaC5wcm9wZXJ0aWVzKTtcbnBhdGNoRGljdChtZG5TeW50YXhlcywgcGF0Y2guc3ludGF4ZXMpO1xuXG4vLyBub3JtYWxpemUgc291cmNlIG1kblByb3BlcnRpZXMgc3ludGF4ZXMsIHNpbmNlIGl0IHVzZXMgaHRtbCB0b2tlblxuZm9yICh2YXIga2V5IGluIG1kblByb3BlcnRpZXMpIHtcbiAgICBkYXRhLnByb3BlcnRpZXNba2V5XSA9IG5vcm1hbGl6ZVN5bnRheChtZG5Qcm9wZXJ0aWVzW2tleV0uc3ludGF4KTtcbn1cblxuZm9yICh2YXIga2V5IGluIG1kblN5bnRheGVzKSB7XG4gICAgZGF0YS50eXBlc1trZXldID0gbm9ybWFsaXplU3ludGF4KG1kblN5bnRheGVzW2tleV0uc3ludGF4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkYXRhO1xuIiwidmFyIGNtcENoYXIgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5jbXBDaGFyO1xudmFyIGlzTnVtYmVyID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuaXNOdW1iZXI7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIE5VTUJFUiA9IFRZUEUuTnVtYmVyO1xudmFyIFBMVVNTSUdOID0gVFlQRS5QbHVzU2lnbjtcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgTiA9IDExMDsgLy8gJ24nLmNoYXJDb2RlQXQoMClcbnZhciBESVNBTExPV19TSUdOID0gdHJ1ZTtcbnZhciBBTExPV19TSUdOID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNoZWNrVG9rZW5Jc0ludGVnZXIoc2Nhbm5lciwgZGlzYWxsb3dTaWduKSB7XG4gICAgdmFyIHBvcyA9IHNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgIGlmIChzY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHBvcykgPT09IFBMVVNTSUdOIHx8XG4gICAgICAgIHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQocG9zKSA9PT0gSFlQSEVOTUlOVVMpIHtcbiAgICAgICAgaWYgKGRpc2FsbG93U2lnbikge1xuICAgICAgICAgICAgc2Nhbm5lci5lcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHBvcysrO1xuICAgIH1cblxuICAgIGZvciAoOyBwb3MgPCBzY2FubmVyLnRva2VuRW5kOyBwb3MrKykge1xuICAgICAgICBpZiAoIWlzTnVtYmVyKHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQocG9zKSkpIHtcbiAgICAgICAgICAgIHNjYW5uZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgaW5wdXQnLCBwb3MpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBBbitCIG1pY3Jvc3ludGF4IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2FuYlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ0FuUGx1c0InLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBhOiBbU3RyaW5nLCBudWxsXSxcbiAgICAgICAgYjogW1N0cmluZywgbnVsbF1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBlbmQgPSBzdGFydDtcbiAgICAgICAgdmFyIHByZWZpeCA9ICcnO1xuICAgICAgICB2YXIgYSA9IG51bGw7XG4gICAgICAgIHZhciBiID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gTlVNQkVSIHx8XG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBQTFVTU0lHTikge1xuICAgICAgICAgICAgY2hlY2tUb2tlbklzSW50ZWdlcih0aGlzLnNjYW5uZXIsIEFMTE9XX1NJR04pO1xuICAgICAgICAgICAgcHJlZml4ID0gdGhpcy5zY2FubmVyLmdldFRva2VuVmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBJREVOVElGSUVSKSB7XG4gICAgICAgICAgICB2YXIgYlN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgICAgIGlmIChjbXBDaGFyKHRoaXMuc2Nhbm5lci5zb3VyY2UsIGJTdGFydCwgSFlQSEVOTUlOVVMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJy0nO1xuICAgICAgICAgICAgICAgICAgICBiU3RhcnQrKztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgaHlwaGVuIG1pbnVzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNtcENoYXIodGhpcy5zY2FubmVyLnNvdXJjZSwgYlN0YXJ0LCBOKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhID0gcHJlZml4ID09PSAnJyAgPyAnMScgIDpcbiAgICAgICAgICAgICAgICBwcmVmaXggPT09ICcrJyA/ICcrMScgOlxuICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gJy0nID8gJy0xJyA6XG4gICAgICAgICAgICAgICAgcHJlZml4O1xuXG4gICAgICAgICAgICB2YXIgbGVuID0gdGhpcy5zY2FubmVyLnRva2VuRW5kIC0gYlN0YXJ0O1xuICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyAuLm4tLi5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KGJTdGFydCArIDEpICE9PSBIWVBIRU5NSU5VUykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgaW5wdXQnLCBiU3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMikge1xuICAgICAgICAgICAgICAgICAgICAvLyAuLm4te251bWJlcn0uLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCA9IGJTdGFydCArIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gLi5uLSB7bnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2hlY2tUb2tlbklzSW50ZWdlcih0aGlzLnNjYW5uZXIsIERJU0FMTE9XX1NJR04pO1xuICAgICAgICAgICAgICAgIGIgPSAnLScgKyB0aGlzLnNjYW5uZXIuZ2V0VG9rZW5WYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgZW5kID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgZW5kID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IEhZUEhFTk1JTlVTIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFBMVVNTSUdOKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMuc2Nhbm5lci5nZXRUb2tlblZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gTlVNQkVSKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVG9rZW5Jc0ludGVnZXIodGhpcy5zY2FubmVyLCBwcmVmaXggIT09ICcnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnNjYW5uZXIudG9rZW5TdGFydCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJBdCh0aGlzLnNjYW5uZXIudG9rZW5TdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhbiBvcGVyYXRvciBiZWZvcmUgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVmaXggPT09ICcrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGx1cyBpcyB1c2luZyBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGIgPSBwcmVmaXggKyB0aGlzLnNjYW5uZXIuZ2V0VG9rZW5WYWx1ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoTlVNQkVSKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnIHx8IHByZWZpeCA9PT0gJysnKSB7IC8vIG5vIG51bWJlclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ051bWJlciBvciBpZGVudGlmaWVyIGlzIGV4cGVjdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQgKyAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBQTFVTU0lHTiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gSFlQSEVOTUlOVVNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGIgPSBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0FuUGx1c0InLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCBlbmQpLFxuICAgICAgICAgICAgYTogYSxcbiAgICAgICAgICAgIGI6IGJcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgdmFyIGEgPSBub2RlLmEgIT09IG51bGwgJiYgbm9kZS5hICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBiID0gbm9kZS5iICE9PSBudWxsICYmIG5vZGUuYiAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICBwcm9jZXNzQ2h1bmsoXG4gICAgICAgICAgICAgICAgbm9kZS5hID09PSAnKzEnID8gJytuJyA6XG4gICAgICAgICAgICAgICAgbm9kZS5hID09PSAgJzEnID8gICduJyA6XG4gICAgICAgICAgICAgICAgbm9kZS5hID09PSAnLTEnID8gJy1uJyA6XG4gICAgICAgICAgICAgICAgbm9kZS5hICsgJ24nXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoYikge1xuICAgICAgICAgICAgICAgIGIgPSBTdHJpbmcobm9kZS5iKTtcbiAgICAgICAgICAgICAgICBpZiAoYi5jaGFyQXQoMCkgPT09ICctJyB8fCBiLmNoYXJBdCgwKSA9PT0gJysnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDaHVuayhiLmNoYXJBdCgwKSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDaHVuayhiLnN1YnN0cigxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NodW5rKCcrJyk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDaHVuayhiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzQ2h1bmsoU3RyaW5nKG5vZGUuYikpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIEFUUlVMRSA9IFRZUEUuQXRydWxlO1xudmFyIFNFTUlDT0xPTiA9IFRZUEUuU2VtaWNvbG9uO1xudmFyIExFRlRDVVJMWUJSQUNLRVQgPSBUWVBFLkxlZnRDdXJseUJyYWNrZXQ7XG52YXIgUklHSFRDVVJMWUJSQUNLRVQgPSBUWVBFLlJpZ2h0Q3VybHlCcmFja2V0O1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KHN0YXJ0VG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5SYXcoc3RhcnRUb2tlbiwgU0VNSUNPTE9OLCBMRUZUQ1VSTFlCUkFDS0VULCBmYWxzZSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25CbG9ja0F0cnVsZSgpIHtcbiAgICBmb3IgKHZhciBvZmZzZXQgPSAxLCB0eXBlOyB0eXBlID0gdGhpcy5zY2FubmVyLmxvb2t1cFR5cGUob2Zmc2V0KTsgb2Zmc2V0KyspIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IFJJR0hUQ1VSTFlCUkFDS0VUKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlID09PSBMRUZUQ1VSTFlCUkFDS0VUIHx8XG4gICAgICAgICAgICB0eXBlID09PSBBVFJVTEUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRvbGVyYW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNjYW5uZXIuc2tpcChvZmZzZXQpO1xuICAgIHRoaXMuc2Nhbm5lci5lYXQoUklHSFRDVVJMWUJSQUNLRVQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQXRydWxlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nLFxuICAgICAgICBwcmVsdWRlOiBbJ0F0cnVsZVByZWx1ZGUnLCAnUmF3JywgbnVsbF0sXG4gICAgICAgIGJsb2NrOiBbJ0Jsb2NrJywgbnVsbF1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICB2YXIgbmFtZUxvd2VyQ2FzZTtcbiAgICAgICAgdmFyIHByZWx1ZGUgPSBudWxsO1xuICAgICAgICB2YXIgYmxvY2sgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoQVRSVUxFKTtcblxuICAgICAgICBuYW1lID0gdGhpcy5zY2FubmVyLnN1YnN0clRvQ3Vyc29yKHN0YXJ0ICsgMSk7XG4gICAgICAgIG5hbWVMb3dlckNhc2UgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICAvLyBwYXJzZSBwcmVsdWRlXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIuZW9mID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gTEVGVENVUkxZQlJBQ0tFVCAmJlxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gU0VNSUNPTE9OKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZUF0cnVsZVByZWx1ZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJlbHVkZVN0YXJ0VG9rZW4gPSB0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuO1xuICAgICAgICAgICAgICAgIHByZWx1ZGUgPSB0aGlzLnRvbGVyYW50UGFyc2UodGhpcy5BdHJ1bGVQcmVsdWRlLmJpbmQodGhpcywgbmFtZSksIGNvbnN1bWVSYXcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG9sZXJhbnQgJiYgIXRoaXMuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWx1ZGUudHlwZSAhPT0gJ1JhdycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IExFRlRDVVJMWUJSQUNLRVQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IFNFTUlDT0xPTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlbHVkZSA9IGNvbnN1bWVSYXcuY2FsbCh0aGlzLCBwcmVsdWRlU3RhcnRUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB0dXJuIGVtcHR5IEF0cnVsZVByZWx1ZGUgaW50byBudWxsXG4gICAgICAgICAgICAgICAgaWYgKHByZWx1ZGUudHlwZSA9PT0gJ0F0cnVsZVByZWx1ZGUnICYmIHByZWx1ZGUuY2hpbGRyZW4uaGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmVsdWRlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZWx1ZGUgPSBjb25zdW1lUmF3LmNhbGwodGhpcywgdGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmF0cnVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lTG93ZXJDYXNlKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0cnVsZVtuYW1lTG93ZXJDYXNlXS5ibG9jayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBMRUZUQ1VSTFlCUkFDS0VUKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBtYWtlIHRvbGVyYW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignQ3VybHkgYnJhY2tldCBpcyBleHBlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJsb2NrID0gdGhpcy5hdHJ1bGVbbmFtZUxvd2VyQ2FzZV0uYmxvY2suY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvbGVyYW50IHx8ICF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoU0VNSUNPTE9OKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFNFTUlDT0xPTjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIExFRlRDVVJMWUJSQUNLRVQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjb25zdW1lIGJsb2NrIGNvbnRlbnQgYXMgUmF3P1xuICAgICAgICAgICAgICAgICAgICBibG9jayA9IHRoaXMuQmxvY2soaXNEZWNsYXJhdGlvbkJsb2NrQXRydWxlLmNhbGwodGhpcykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50b2xlcmFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdTZW1pY29sb24gb3IgYmxvY2sgaXMgZXhwZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdBdHJ1bGUnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgcHJlbHVkZTogcHJlbHVkZSxcbiAgICAgICAgICAgIGJsb2NrOiBibG9ja1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJ0AnKTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUubmFtZSk7XG5cbiAgICAgICAgaWYgKG5vZGUucHJlbHVkZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHJvY2Vzc0NodW5rKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlKHByb2Nlc3NDaHVuaywgbm9kZS5wcmVsdWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmJsb2NrKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlKHByb2Nlc3NDaHVuaywgbm9kZS5ibG9jayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzQ2h1bmsoJzsnKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgd2Fsa0NvbnRleHQ6ICdhdHJ1bGUnXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBTVFJJTkcgPSBUWVBFLlN0cmluZztcbnZhciBET0xMQVJTSUdOID0gVFlQRS5Eb2xsYXJTaWduO1xudmFyIEFTVEVSSVNLID0gVFlQRS5Bc3RlcmlzaztcbnZhciBDT0xPTiA9IFRZUEUuQ29sb247XG52YXIgRVFVQUxTU0lHTiA9IFRZUEUuRXF1YWxzU2lnbjtcbnZhciBMRUZUU1FVQVJFQlJBQ0tFVCA9IFRZUEUuTGVmdFNxdWFyZUJyYWNrZXQ7XG52YXIgUklHSFRTUVVBUkVCUkFDS0VUID0gVFlQRS5SaWdodFNxdWFyZUJyYWNrZXQ7XG52YXIgQ0lSQ1VNRkxFWEFDQ0VOVCA9IFRZUEUuQ2lyY3VtZmxleEFjY2VudDtcbnZhciBWRVJUSUNBTExJTkUgPSBUWVBFLlZlcnRpY2FsTGluZTtcbnZhciBUSUxERSA9IFRZUEUuVGlsZGU7XG5cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZU5hbWUoKSB7XG4gICAgaWYgKHRoaXMuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xuICAgIH1cblxuICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgIHZhciBleHBlY3RJZGVudGlmaWVyID0gZmFsc2U7XG4gICAgdmFyIGNoZWNrQ29sb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgIGV4cGVjdElkZW50aWZpZXIgPSB0cnVlO1xuICAgICAgICBjaGVja0NvbG9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBWRVJUSUNBTExJTkUpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChJREVOVElGSUVSKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gVkVSVElDQUxMSU5FKSB7XG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIubG9va3VwVHlwZSgxKSAhPT0gRVFVQUxTU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoSURFTlRJRklFUik7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0SWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdJZGVudGlmaWVyIGlzIGV4cGVjdGVkJywgdGhpcy5zY2FubmVyLnRva2VuRW5kKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwZWN0SWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ1ZlcnRpY2FsIGxpbmUgaXMgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tDb2xvbiAmJiB0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBDT0xPTikge1xuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KElERU5USUZJRVIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgIG5hbWU6IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRPcGVyYXRvcigpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICB2YXIgdG9rZW5UeXBlID0gdGhpcy5zY2FubmVyLnRva2VuVHlwZTtcblxuICAgIGlmICh0b2tlblR5cGUgIT09IEVRVUFMU1NJR04gJiYgICAgICAgIC8vID1cbiAgICAgICAgdG9rZW5UeXBlICE9PSBUSUxERSAmJiAgICAgICAgICAgICAvLyB+PVxuICAgICAgICB0b2tlblR5cGUgIT09IENJUkNVTUZMRVhBQ0NFTlQgJiYgIC8vIF49XG4gICAgICAgIHRva2VuVHlwZSAhPT0gRE9MTEFSU0lHTiAmJiAgICAgICAgLy8gJD1cbiAgICAgICAgdG9rZW5UeXBlICE9PSBBU1RFUklTSyAmJiAgICAgICAgICAvLyAqPVxuICAgICAgICB0b2tlblR5cGUgIT09IFZFUlRJQ0FMTElORSAgICAgICAgIC8vIHw9XG4gICAgKSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignQXR0cmlidXRlIHNlbGVjdG9yICg9LCB+PSwgXj0sICQ9LCAqPSwgfD0pIGlzIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gRVFVQUxTU0lHTikge1xuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoRVFVQUxTU0lHTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydCk7XG59XG5cbi8vICdbJyBTKiBhdHRyaWJfbmFtZSAnXSdcbi8vICdbJyBTKiBhdHRyaWJfbmFtZSBTKiBhdHRyaWJfbWF0Y2hlciBTKiBbIElERU5UIHwgU1RSSU5HIF0gUyogYXR0cmliX2ZsYWdzPyBTKiAnXSdcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdBdHRyaWJ1dGVTZWxlY3RvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgbWF0Y2hlcjogW1N0cmluZywgbnVsbF0sXG4gICAgICAgIHZhbHVlOiBbJ1N0cmluZycsICdJZGVudGlmaWVyJywgbnVsbF0sXG4gICAgICAgIGZsYWdzOiBbU3RyaW5nLCBudWxsXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIG5hbWU7XG4gICAgICAgIHZhciBtYXRjaGVyID0gbnVsbDtcbiAgICAgICAgdmFyIHZhbHVlID0gbnVsbDtcbiAgICAgICAgdmFyIGZsYWdzID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KExFRlRTUVVBUkVCUkFDS0VUKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIG5hbWUgPSBnZXRBdHRyaWJ1dGVOYW1lLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gUklHSFRTUVVBUkVCUkFDS0VUKSB7XG4gICAgICAgICAgICAvLyBhdm9pZCBjYXNlIGBbbmFtZSBpXWBcbiAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBJREVOVElGSUVSKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlciA9IGdldE9wZXJhdG9yLmNhbGwodGhpcyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFNUUklOR1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLklkZW50aWZpZXIoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYXR0cmlidXRlIGZsYWdzXG4gICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgICAgIGZsYWdzID0gdGhpcy5zY2FubmVyLmdldFRva2VuVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChSSUdIVFNRVUFSRUJSQUNLRVQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQXR0cmlidXRlU2VsZWN0b3InLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgbWF0Y2hlcjogbWF0Y2hlcixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGZsYWdzOiBmbGFnc1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICB2YXIgZmxhZ3NQcmVmaXggPSAnICc7XG5cbiAgICAgICAgcHJvY2Vzc0NodW5rKCdbJyk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGUocHJvY2Vzc0NodW5rLCBub2RlLm5hbWUpO1xuXG4gICAgICAgIGlmIChub2RlLm1hdGNoZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHByb2Nlc3NDaHVuayhub2RlLm1hdGNoZXIpO1xuXG4gICAgICAgICAgICBpZiAobm9kZS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGUocHJvY2Vzc0NodW5rLCBub2RlLnZhbHVlKTtcblxuICAgICAgICAgICAgICAgIC8vIHNwYWNlIGJldHdlZW4gc3RyaW5nIGFuZCBmbGFncyBpcyBub3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICBpZiAobm9kZS52YWx1ZS50eXBlID09PSAnU3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBmbGFnc1ByZWZpeCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmZsYWdzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9jZXNzQ2h1bmsoZmxhZ3NQcmVmaXgpO1xuICAgICAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUuZmxhZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzc0NodW5rKCddJyk7XG4gICAgfVxufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbGlzdCcpO1xudmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgV0hJVEVTUEFDRSA9IFRZUEUuV2hpdGVTcGFjZTtcbnZhciBDT01NRU5UID0gVFlQRS5Db21tZW50O1xudmFyIFNFTUlDT0xPTiA9IFRZUEUuU2VtaWNvbG9uO1xudmFyIEFUUlVMRSA9IFRZUEUuQXRydWxlO1xudmFyIExFRlRDVVJMWUJSQUNLRVQgPSBUWVBFLkxlZnRDdXJseUJyYWNrZXQ7XG52YXIgUklHSFRDVVJMWUJSQUNLRVQgPSBUWVBFLlJpZ2h0Q3VybHlCcmFja2V0O1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KHN0YXJ0VG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5SYXcoc3RhcnRUb2tlbiwgMCwgMCwgZmFsc2UsIHRydWUpO1xufVxuZnVuY3Rpb24gY29uc3VtZVJ1bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9sZXJhbnRQYXJzZSh0aGlzLlJ1bGUsIGNvbnN1bWVSYXcpO1xufVxuZnVuY3Rpb24gY29uc3VtZVJhd0RlY2xhcmF0aW9uKHN0YXJ0VG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5SYXcoc3RhcnRUb2tlbiwgMCwgU0VNSUNPTE9OLCB0cnVlLCB0cnVlKTtcbn1cbmZ1bmN0aW9uIGNvbnN1bWVEZWNsYXJhdGlvbigpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMudG9sZXJhbnRQYXJzZSh0aGlzLkRlY2xhcmF0aW9uLCBjb25zdW1lUmF3RGVjbGFyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFNFTUlDT0xPTikge1xuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQmxvY2snLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1snQXRydWxlJywgJ1J1bGUnLCAnRGVjbGFyYXRpb24nXV1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbihpc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgIHZhciBjb25zdW1lciA9IGlzRGVjbGFyYXRpb24gPyBjb25zdW1lRGVjbGFyYXRpb24gOiBjb25zdW1lUnVsZTtcblxuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbmV3IExpc3QoKTtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KExFRlRDVVJMWUJSQUNLRVQpO1xuXG4gICAgICAgIHNjYW46XG4gICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBSSUdIVENVUkxZQlJBQ0tFVDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcblxuICAgICAgICAgICAgICAgIGNhc2UgV0hJVEVTUEFDRTpcbiAgICAgICAgICAgICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBBVFJVTEU6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZERhdGEodGhpcy50b2xlcmFudFBhcnNlKHRoaXMuQXRydWxlLCBjb25zdW1lUmF3KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YShjb25zdW1lci5jYWxsKHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50b2xlcmFudCB8fCAhdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVhdChSSUdIVENVUkxZQlJBQ0tFVCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0Jsb2NrJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHByb2Nlc3NDaHVuaygneycpO1xuICAgICAgICB0aGlzLmVhY2gocHJvY2Vzc0NodW5rLCBub2RlKTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCd9Jyk7XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ2Jsb2NrJ1xufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgQ09MT04gPSBUWVBFLkNvbG9uO1xudmFyIEVYQ0xBTUFUSU9OTUFSSyA9IFRZUEUuRXhjbGFtYXRpb25NYXJrO1xudmFyIFNPTElEVVMgPSBUWVBFLlNvbGlkdXM7XG52YXIgQVNURVJJU0sgPSBUWVBFLkFzdGVyaXNrO1xudmFyIERPTExBUlNJR04gPSBUWVBFLkRvbGxhclNpZ247XG52YXIgSFlQSEVOTUlOVVMgPSBUWVBFLkh5cGhlbk1pbnVzO1xudmFyIFNFTUlDT0xPTiA9IFRZUEUuU2VtaWNvbG9uO1xudmFyIFJJR0hUQ1VSTFlCUkFDS0VUID0gVFlQRS5SaWdodEN1cmx5QnJhY2tldDtcbnZhciBSSUdIVFBBUkVOVEhFU0lTID0gVFlQRS5SaWdodFBhcmVudGhlc2lzO1xudmFyIFBMVVNTSUdOID0gVFlQRS5QbHVzU2lnbjtcbnZhciBOVU1CRVJTSUdOID0gVFlQRS5OdW1iZXJTaWduO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnRGVjbGFyYXRpb24nLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBpbXBvcnRhbnQ6IFtCb29sZWFuLCBTdHJpbmddLFxuICAgICAgICBwcm9wZXJ0eTogU3RyaW5nLFxuICAgICAgICB2YWx1ZTogWydWYWx1ZScsICdSYXcnXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIHByb3BlcnR5ID0gcmVhZFByb3BlcnR5LmNhbGwodGhpcyk7XG4gICAgICAgIHZhciBpbXBvcnRhbnQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDT0xPTik7XG5cbiAgICAgICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkocHJvcGVydHkpID8gdGhpcy5wYXJzZUN1c3RvbVByb3BlcnR5IDogdGhpcy5wYXJzZVZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuVmFsdWUocHJvcGVydHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLlJhdyh0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuLCBFWENMQU1BVElPTk1BUkssIFNFTUlDT0xPTiwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBFWENMQU1BVElPTk1BUkspIHtcbiAgICAgICAgICAgIGltcG9ydGFudCA9IGdldEltcG9ydGFudCh0aGlzLnNjYW5uZXIpO1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogaW5jbHVkZSBvciBub3QgdG8gaW5jbHVkZSBzZW1pY29sb24gdG8gcmFuZ2U/XG4gICAgICAgIC8vIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBTRU1JQ09MT04pIHtcbiAgICAgICAgLy8gICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2Nhbm5lci5lb2YgJiZcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IFNFTUlDT0xPTiAmJlxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gUklHSFRQQVJFTlRIRVNJUyAmJlxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gUklHSFRDVVJMWUJSQUNLRVQpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWNsYXJhdGlvbicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIGltcG9ydGFudDogaW1wb3J0YW50LFxuICAgICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlLCBpdGVtKSB7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLnByb3BlcnR5KTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCc6Jyk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGUocHJvY2Vzc0NodW5rLCBub2RlLnZhbHVlKTtcblxuICAgICAgICBpZiAobm9kZS5pbXBvcnRhbnQpIHtcbiAgICAgICAgICAgIHByb2Nlc3NDaHVuayhub2RlLmltcG9ydGFudCA9PT0gdHJ1ZSA/ICchaW1wb3J0YW50JyA6ICchJyArIG5vZGUuaW1wb3J0YW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0ubmV4dCkge1xuICAgICAgICAgICAgcHJvY2Vzc0NodW5rKCc7Jyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHdhbGtDb250ZXh0OiAnZGVjbGFyYXRpb24nXG59O1xuXG5mdW5jdGlvbiBpc0N1c3RvbVByb3BlcnR5KG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS5sZW5ndGggPj0gMiAmJlxuICAgICAgICAgICBuYW1lLmNoYXJDb2RlQXQoMCkgPT09IEhZUEhFTk1JTlVTICYmXG4gICAgICAgICAgIG5hbWUuY2hhckNvZGVBdCgxKSA9PT0gSFlQSEVOTUlOVVM7XG59XG5cbmZ1bmN0aW9uIHJlYWRQcm9wZXJ0eSgpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICB2YXIgcHJlZml4ID0gMDtcblxuICAgIC8vIGhhY2tzXG4gICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgIGNhc2UgQVNURVJJU0s6XG4gICAgICAgIGNhc2UgRE9MTEFSU0lHTjpcbiAgICAgICAgY2FzZSBQTFVTU0lHTjpcbiAgICAgICAgY2FzZSBOVU1CRVJTSUdOOlxuICAgICAgICAgICAgcHJlZml4ID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIFRPRE86IG5vdCBzdXJlIHdlIHNob3VsZCBzdXBwb3J0IHRoaXMgaGFja1xuICAgICAgICBjYXNlIFNPTElEVVM6XG4gICAgICAgICAgICBwcmVmaXggPSB0aGlzLnNjYW5uZXIubG9va3VwVHlwZSgxKSA9PT0gU09MSURVUyA/IDIgOiAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Nhbm5lci5sb29rdXBUeXBlKHByZWZpeCkgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgIHByZWZpeCsrO1xuICAgIH1cblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXAocHJlZml4KTtcbiAgICB9XG5cbiAgICB0aGlzLnNjYW5uZXIuZWF0KElERU5USUZJRVIpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydCk7XG59XG5cbi8vICEgd3MqIGltcG9ydGFudFxuZnVuY3Rpb24gZ2V0SW1wb3J0YW50KHNjYW5uZXIpIHtcbiAgICBzY2FubmVyLmVhdChFWENMQU1BVElPTk1BUkspO1xuICAgIHNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICB2YXIgaW1wb3J0YW50ID0gc2Nhbm5lci5jb25zdW1lKElERU5USUZJRVIpO1xuXG4gICAgLy8gc3RvcmUgb3JpZ2luYWwgdmFsdWUgaW4gY2FzZSBpdCBkaWZmZXIgZnJvbSBgaW1wb3J0YW50YFxuICAgIC8vIGZvciBiZXR0ZXIgb3JpZ2luYWwgc291cmNlIHJlc3RvcmluZyBhbmQgaGFja3MgbGlrZSBgIWllYCBzdXBwb3J0XG4gICAgcmV0dXJuIGltcG9ydGFudCA9PT0gJ2ltcG9ydGFudCcgPyB0cnVlIDogaW1wb3J0YW50O1xufVxuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBXSElURVNQQUNFID0gVFlQRS5XaGl0ZVNwYWNlO1xudmFyIENPTU1FTlQgPSBUWVBFLkNvbW1lbnQ7XG52YXIgU0VNSUNPTE9OID0gVFlQRS5TZW1pY29sb247XG5cbmZ1bmN0aW9uIGNvbnN1bWVSYXcoc3RhcnRUb2tlbikge1xuICAgIHJldHVybiB0aGlzLlJhdyhzdGFydFRva2VuLCAwLCBTRU1JQ09MT04sIHRydWUsIHRydWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnRGVjbGFyYXRpb25MaXN0JyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgY2hpbGRyZW46IFtbJ0RlY2xhcmF0aW9uJ11dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5ldyBMaXN0KCk7XG5cbiAgICAgICAgc2NhbjpcbiAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFdISVRFU1BBQ0U6XG4gICAgICAgICAgICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICAgICAgICAgIGNhc2UgU0VNSUNPTE9OOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZERhdGEodGhpcy50b2xlcmFudFBhcnNlKHRoaXMuRGVjbGFyYXRpb24sIGNvbnN1bWVSYXcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnRGVjbGFyYXRpb25MaXN0JyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbkZyb21MaXN0KGNoaWxkcmVuKSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICB0aGlzLmVhY2gocHJvY2Vzc0NodW5rLCBub2RlKTtcbiAgICB9XG59O1xuIiwidmFyIE5VTUJFUiA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuTnVtYmVyO1xuXG4vLyBzcGVjaWFsIHJlYWRlciBmb3IgdW5pdHMgdG8gYXZvaWQgYWRqb2luZWQgSUUgaGFja3MgKGkuZS4gJzFweFxcOScpXG5mdW5jdGlvbiByZWFkVW5pdChzY2FubmVyKSB7XG4gICAgdmFyIHVuaXQgPSBzY2FubmVyLmdldFRva2VuVmFsdWUoKTtcbiAgICB2YXIgYmFja1NsYXNoUG9zID0gdW5pdC5pbmRleE9mKCdcXFxcJyk7XG5cbiAgICBpZiAoYmFja1NsYXNoUG9zID4gMCkge1xuICAgICAgICAvLyBwYXRjaCB0b2tlbiBvZmZzZXRcbiAgICAgICAgc2Nhbm5lci50b2tlblN0YXJ0ICs9IGJhY2tTbGFzaFBvcztcblxuICAgICAgICAvLyByZXR1cm4gcGFydCBiZWZvcmUgYmFja3NsYXNoXG4gICAgICAgIHJldHVybiB1bml0LnN1YnN0cmluZygwLCBiYWNrU2xhc2hQb3MpO1xuICAgIH1cblxuICAgIC8vIG5vIGJhY2tzbGFzaCBpbiB1bml0IG5hbWVcbiAgICBzY2FubmVyLm5leHQoKTtcblxuICAgIHJldHVybiB1bml0O1xufVxuXG4vLyBudW1iZXIgaWRlbnRcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdEaW1lbnNpb24nLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICB2YWx1ZTogU3RyaW5nLFxuICAgICAgICB1bml0OiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc2Nhbm5lci5jb25zdW1lKE5VTUJFUik7XG4gICAgICAgIHZhciB1bml0ID0gcmVhZFVuaXQodGhpcy5zY2FubmVyKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0RpbWVuc2lvbicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHVuaXQ6IHVuaXRcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUudmFsdWUpO1xuICAgICAgICBwcm9jZXNzQ2h1bmsobm9kZS51bml0KTtcbiAgICB9XG59O1xuIiwidmFyIGlzSGV4ID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuaXNIZXg7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIE5VTUJFUiA9IFRZUEUuTnVtYmVyO1xudmFyIE5VTUJFUlNJR04gPSBUWVBFLk51bWJlclNpZ247XG5cbmZ1bmN0aW9uIGNvbnN1bWVIZXhTZXF1ZW5jZShzY2FubmVyLCByZXF1aXJlZCkge1xuICAgIGlmICghaXNIZXgoc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdChzY2FubmVyLnRva2VuU3RhcnQpKSkge1xuICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHNjYW5uZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgaW5wdXQnLCBzY2FubmVyLnRva2VuU3RhcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcG9zID0gc2Nhbm5lci50b2tlblN0YXJ0ICsgMTsgcG9zIDwgc2Nhbm5lci50b2tlbkVuZDsgcG9zKyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgICAgICAgLy8gYnJlYWsgb24gbm9uLWhleCBjaGFyXG4gICAgICAgIGlmICghaXNIZXgoY29kZSkpIHtcbiAgICAgICAgICAgIC8vIGJyZWFrIHRva2VuLCBleGNsdWRlIHN5bWJvbFxuICAgICAgICAgICAgc2Nhbm5lci50b2tlblN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdG9rZW4gaXMgZnVsbCBoZXggc2VxdWVuY2UsIGdvIHRvIG5leHQgdG9rZW5cbiAgICBzY2FubmVyLm5leHQoKTtcbn1cblxuLy8gIyBpZGVudFxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ0hleENvbG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KE5VTUJFUlNJR04pO1xuXG4gICAgICAgIHNjYW46XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBOVU1CRVI6XG4gICAgICAgICAgICAgICAgY29uc3VtZUhleFNlcXVlbmNlKHRoaXMuc2Nhbm5lciwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB0b2tlbiBpcyBpZGVudGlmaWVyIHRoZW4gbnVtYmVyIGNvbnNpc3RzIG9mIGhleCBvbmx5LFxuICAgICAgICAgICAgICAgIC8vIHRyeSB0byBhZGQgaWRlbnRpZmllciB0byByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdW1lSGV4U2VxdWVuY2UodGhpcy5zY2FubmVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSURFTlRJRklFUjpcbiAgICAgICAgICAgICAgICBjb25zdW1lSGV4U2VxdWVuY2UodGhpcy5zY2FubmVyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ051bWJlciBvciBpZGVudGlmaWVyIGlzIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0hleENvbG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydCArIDEpIC8vIHNraXAgI1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJyMnKTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUudmFsdWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgaXNOdW1iZXIgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5pc051bWJlcjtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcbnZhciBOVU1CRVIgPSBUWVBFLk51bWJlcjtcbnZhciBTT0xJRFVTID0gVFlQRS5Tb2xpZHVzO1xudmFyIEZVTExTVE9QID0gVFlQRS5GdWxsU3RvcDtcblxuLy8gVGVybXMgb2YgPHJhdGlvPiBzaG91bGQgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXIgKG5vdCB6ZXJvIG9yIG5lZ2F0aXZlKVxuLy8gKHNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvbWVkaWFxdWVyaWVzLTMvI3ZhbHVlcylcbi8vIEhvd2V2ZXIsIC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW8gdGFrZXMgZnJhY3Rpb25hbCB2YWx1ZXMgYXMgYSByYXRpbydzIHRlcm1cbi8vIGFuZCB0aGlzIGlzIHVzaW5nIGJ5IHZhcmlvdXMgc2l0ZXMuIFRoZXJlZm9yZSB3ZSByZWxheCBjaGVja2luZyBvbiBwYXJzZVxuLy8gdG8gdGVzdCBhIHRlcm0gaXMgdW5zaWduZWQgbnVtYmVyIHdpdGhvdXQgZXhwb25lbnQgcGFydC5cbi8vIEFkZGl0aW9uYWwgY2hlY2tzIG1heSB0byBiZSBhcHBsaWVkIG9uIGxleGVyIHZhbGlkYXRpb24uXG5mdW5jdGlvbiBjb25zdW1lTnVtYmVyKHNjYW5uZXIpIHtcbiAgICB2YXIgdmFsdWUgPSBzY2FubmVyLmNvbnN1bWVOb25XUyhOVU1CRVIpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29kZSA9IHZhbHVlLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmICghaXNOdW1iZXIoY29kZSkgJiYgY29kZSAhPT0gRlVMTFNUT1ApIHtcbiAgICAgICAgICAgIHNjYW5uZXIuZXJyb3IoJ1Vuc2lnbmVkIG51bWJlciBpcyBleHBlY3RlZCcsIHNjYW5uZXIudG9rZW5TdGFydCAtIHZhbHVlLmxlbmd0aCArIGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE51bWJlcih2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgc2Nhbm5lci5lcnJvcignWmVybyBudW1iZXIgaXMgbm90IGFsbG93ZWQnLCBzY2FubmVyLnRva2VuU3RhcnQgLSB2YWx1ZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gPHBvc2l0aXZlLWludGVnZXI+IFMqICcvJyBTKiA8cG9zaXRpdmUtaW50ZWdlcj5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdSYXRpbycsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGxlZnQ6IFN0cmluZyxcbiAgICAgICAgcmlnaHQ6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGxlZnQgPSBjb25zdW1lTnVtYmVyKHRoaXMuc2Nhbm5lcik7XG4gICAgICAgIHZhciByaWdodDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0Tm9uV1MoU09MSURVUyk7XG4gICAgICAgIHJpZ2h0ID0gY29uc3VtZU51bWJlcih0aGlzLnNjYW5uZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnUmF0aW8nLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLmxlZnQpO1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJy8nKTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUucmlnaHQpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBMRUZUQ1VSTFlCUkFDS0VUID0gVFlQRS5MZWZ0Q3VybHlCcmFja2V0O1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KHN0YXJ0VG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5SYXcoc3RhcnRUb2tlbiwgTEVGVENVUkxZQlJBQ0tFVCwgMCwgZmFsc2UsIHRydWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnUnVsZScsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHByZWx1ZGU6IFsnU2VsZWN0b3JMaXN0JywgJ1JhdyddLFxuICAgICAgICBibG9jazogWydCbG9jayddXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBwcmVsdWRlO1xuICAgICAgICB2YXIgYmxvY2s7XG5cbiAgICAgICAgaWYgKHRoaXMucGFyc2VSdWxlUHJlbHVkZSkge1xuICAgICAgICAgICAgcHJlbHVkZSA9IHRoaXMudG9sZXJhbnRQYXJzZSh0aGlzLlNlbGVjdG9yTGlzdCwgY29uc3VtZVJhdyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnRvbGVyYW50ICYmICF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZWx1ZGUudHlwZSAhPT0gJ1JhdycgJiYgdGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gTEVGVENVUkxZQlJBQ0tFVCkge1xuICAgICAgICAgICAgICAgICAgICBwcmVsdWRlID0gY29uc3VtZVJhdy5jYWxsKHRoaXMsIHN0YXJ0VG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZWx1ZGUgPSBjb25zdW1lUmF3LmNhbGwodGhpcywgc3RhcnRUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICBibG9jayA9IHRoaXMuQmxvY2sodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdSdWxlJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydE9mZnNldCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgcHJlbHVkZTogcHJlbHVkZSxcbiAgICAgICAgICAgIGJsb2NrOiBibG9ja1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlKHByb2Nlc3NDaHVuaywgbm9kZS5wcmVsdWRlKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShwcm9jZXNzQ2h1bmssIG5vZGUuYmxvY2spO1xuICAgIH0sXG4gICAgd2Fsa0NvbnRleHQ6ICdydWxlJ1xufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbGlzdCcpO1xudmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgV0hJVEVTUEFDRSA9IFRZUEUuV2hpdGVTcGFjZTtcbnZhciBDT01NRU5UID0gVFlQRS5Db21tZW50O1xudmFyIEVYQ0xBTUFUSU9OTUFSSyA9IFRZUEUuRXhjbGFtYXRpb25NYXJrO1xudmFyIEFUUlVMRSA9IFRZUEUuQXRydWxlO1xudmFyIENETyA9IFRZUEUuQ0RPO1xudmFyIENEQyA9IFRZUEUuQ0RDO1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KHN0YXJ0VG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5SYXcoc3RhcnRUb2tlbiwgMCwgMCwgZmFsc2UsIGZhbHNlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1N0eWxlU2hlZXQnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1snQ29tbWVudCcsICdBdHJ1bGUnLCAnUnVsZScsICdSYXcnXV1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5ldyBMaXN0KCk7XG4gICAgICAgIHZhciBjaGlsZDtcblxuICAgICAgICBzY2FuOlxuICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgV0hJVEVTUEFDRTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjb21tZW50cyBleGNlcHQgZXhjbGFtYXRpb24gY29tbWVudHMgKGkuZS4gLyohIC4uICovKSBvbiB0b3AgbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnNjYW5uZXIudG9rZW5TdGFydCArIDIpICE9PSBFWENMQU1BVElPTk1BUkspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5Db21tZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBDRE86IC8vIDwhLS1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLkNETygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgQ0RDOiAvLyAtLT5cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLkNEQygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIENTUyBTeW50YXggTW9kdWxlIExldmVsIDNcbiAgICAgICAgICAgICAgICAvLyDCpzIuMiBFcnJvciBoYW5kbGluZ1xuICAgICAgICAgICAgICAgIC8vIEF0IHRoZSBcInRvcCBsZXZlbFwiIG9mIGEgc3R5bGVzaGVldCwgYW4gPGF0LWtleXdvcmQtdG9rZW4+IHN0YXJ0cyBhbiBhdC1ydWxlLlxuICAgICAgICAgICAgICAgIGNhc2UgQVRSVUxFOlxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuQXRydWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gQW55dGhpbmcgZWxzZSBzdGFydHMgYSBxdWFsaWZpZWQgcnVsZSAuLi5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMudG9sZXJhbnRQYXJzZSh0aGlzLlJ1bGUsIGNvbnN1bWVSYXcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmREYXRhKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnU3R5bGVTaGVldCcsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICB0aGlzLmVhY2gocHJvY2Vzc0NodW5rLCBub2RlKTtcbiAgICB9LFxuICAgIHdhbGtDb250ZXh0OiAnc3R5bGVzaGVldCdcbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIEFTVEVSSVNLID0gVFlQRS5Bc3RlcmlzaztcbnZhciBWRVJUSUNBTExJTkUgPSBUWVBFLlZlcnRpY2FsTGluZTtcblxuZnVuY3Rpb24gZWF0SWRlbnRpZmllck9yQXN0ZXJpc2soKSB7XG4gICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IElERU5USUZJRVIgJiZcbiAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gQVNURVJJU0spIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdJZGVudGlmaWVyIG9yIGFzdGVyaXNrIGlzIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbn1cblxuLy8gaWRlbnRcbi8vIGlkZW50fGlkZW50XG4vLyBpZGVudHwqXG4vLyAqXG4vLyAqfGlkZW50XG4vLyAqfCpcbi8vIHxpZGVudFxuLy8gfCpcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdUeXBlU2VsZWN0b3InLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBuYW1lOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFZFUlRJQ0FMTElORSkge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgIGVhdElkZW50aWZpZXJPckFzdGVyaXNrLmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlYXRJZGVudGlmaWVyT3JBc3Rlcmlzay5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gVkVSVElDQUxMSU5FKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBlYXRJZGVudGlmaWVyT3JBc3Rlcmlzay5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdUeXBlU2VsZWN0b3InLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnNjYW5uZXIuc3Vic3RyVG9DdXJzb3Ioc3RhcnQpXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLm5hbWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgaXNIZXggPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5pc0hleDtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgUExVU1NJR04gPSBUWVBFLlBsdXNTaWduO1xudmFyIEhZUEhFTk1JTlVTID0gVFlQRS5IeXBoZW5NaW51cztcbnZhciBGVUxMU1RPUCA9IFRZUEUuRnVsbFN0b3A7XG52YXIgUVVFU1RJT05NQVJLID0gVFlQRS5RdWVzdGlvbk1hcms7XG5cbmZ1bmN0aW9uIHNjYW5Vbmljb2RlTnVtYmVyKHNjYW5uZXIpIHtcbiAgICBmb3IgKHZhciBwb3MgPSBzY2FubmVyLnRva2VuU3RhcnQgKyAxOyBwb3MgPCBzY2FubmVyLnRva2VuRW5kOyBwb3MrKykge1xuICAgICAgICB2YXIgY29kZSA9IHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQocG9zKTtcblxuICAgICAgICAvLyBicmVhayBvbiBmdWxsc3RvcCBvciBoeXBlcm1pbnVzL3BsdXNzaWduIGFmdGVyIGV4cG9uZW50XG4gICAgICAgIGlmIChjb2RlID09PSBGVUxMU1RPUCB8fCBjb2RlID09PSBQTFVTU0lHTikge1xuICAgICAgICAgICAgLy8gYnJlYWsgdG9rZW4sIGV4Y2x1ZGUgc3ltYm9sXG4gICAgICAgICAgICBzY2FubmVyLnRva2VuU3RhcnQgPSBwb3M7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1zeW50YXgtMy8jdXJhbmdlXG5mdW5jdGlvbiBzY2FuVW5pY29kZVJhbmdlKHNjYW5uZXIpIHtcbiAgICB2YXIgaGV4U3RhcnQgPSBzY2FubmVyLnRva2VuU3RhcnQgKyAxOyAvLyBza2lwICtcbiAgICB2YXIgaGV4TGVuZ3RoID0gMDtcblxuICAgIHNjYW46IHtcbiAgICAgICAgaWYgKHNjYW5uZXIudG9rZW5UeXBlID09PSBOVU1CRVIpIHtcbiAgICAgICAgICAgIGlmIChzY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHNjYW5uZXIudG9rZW5TdGFydCkgIT09IEZVTExTVE9QICYmIHNjYW5Vbmljb2RlTnVtYmVyKHNjYW5uZXIpKSB7XG4gICAgICAgICAgICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQoc2Nhbm5lci50b2tlblN0YXJ0KSAhPT0gSFlQSEVOTUlOVVMpIHtcbiAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2Nhbm5lci5uZXh0KCk7IC8vIFBMVVNTSUdOXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nhbm5lci50b2tlblR5cGUgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2FubmVyLnRva2VuVHlwZSA9PT0gTlVNQkVSKSB7XG4gICAgICAgICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2FubmVyLnRva2VuVHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nhbm5lci50b2tlblN0YXJ0ID09PSBoZXhTdGFydCkge1xuICAgICAgICAgICAgc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIGhleFN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGZvciBVK3h7MSw2fSBvciBVK3h7MSw2fS14ezEsNn1cbiAgICAvLyB3aGVyZSB4IGlzIFswLTlhLWZBLUZdXG4gICAgZm9yICh2YXIgaSA9IGhleFN0YXJ0LCB3YXNIeXBoZW5NaW51cyA9IGZhbHNlOyBpIDwgc2Nhbm5lci50b2tlblN0YXJ0OyBpKyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChpc0hleChjb2RlKSA9PT0gZmFsc2UgJiYgKGNvZGUgIT09IEhZUEhFTk1JTlVTIHx8IHdhc0h5cGhlbk1pbnVzKSkge1xuICAgICAgICAgICAgc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICAvLyBoZXggc2VxdWVuY2Ugc2hvdWxkbid0IGJlIGFuIGVtcHR5XG4gICAgICAgICAgICBpZiAoaGV4TGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3YXNIeXBoZW5NaW51cyA9IHRydWU7XG4gICAgICAgICAgICBoZXhMZW5ndGggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGV4TGVuZ3RoKys7XG5cbiAgICAgICAgICAgIC8vIHRvbyBsb25nIGhleCBzZXF1ZW5jZVxuICAgICAgICAgICAgaWYgKGhleExlbmd0aCA+IDYpIHtcbiAgICAgICAgICAgICAgICBzY2FubmVyLmVycm9yKCdUb28gbG9uZyBoZXggc2VxdWVuY2UnLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgd2UgaGF2ZSBhIG5vbi16ZXJvIHNlcXVlbmNlXG4gICAgaWYgKGhleExlbmd0aCA9PT0gMCkge1xuICAgICAgICBzY2FubmVyLmVycm9yKCdVbmV4cGVjdGVkIGlucHV0JywgaSAtIDEpO1xuICAgIH1cblxuICAgIC8vIFUrYWJjPz8/XG4gICAgaWYgKCF3YXNIeXBoZW5NaW51cykge1xuICAgICAgICAvLyBjb25zdW1lIGFzIG1hbnkgVSswMDNGIFFVRVNUSU9OIE1BUksgKD8pIGNvZGUgcG9pbnRzIGFzIHBvc3NpYmxlXG4gICAgICAgIGZvciAoOyBoZXhMZW5ndGggPCA2ICYmICFzY2FubmVyLmVvZjsgc2Nhbm5lci5uZXh0KCkpIHtcbiAgICAgICAgICAgIGlmIChzY2FubmVyLnRva2VuVHlwZSAhPT0gUVVFU1RJT05NQVJLKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhleExlbmd0aCsrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnVW5pY29kZVJhbmdlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpOyAvLyBVIG9yIHVcbiAgICAgICAgc2NhblVuaWNvZGVSYW5nZSh0aGlzLnNjYW5uZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnVW5pY29kZVJhbmdlJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUudmFsdWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgZW5kc1dpdGggPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5lbmRzV2l0aDtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgQ09NTUVOVCA9IFRZUEUuQ29tbWVudDtcbnZhciBGVU5DVElPTiA9IFRZUEUuRnVuY3Rpb247XG52YXIgQ09MT04gPSBUWVBFLkNvbG9uO1xudmFyIFNFTUlDT0xPTiA9IFRZUEUuU2VtaWNvbG9uO1xudmFyIEVYQ0xBTUFUSU9OTUFSSyA9IFRZUEUuRXhjbGFtYXRpb25NYXJrO1xuXG4vLyAncHJvZ2lkOicgd3MqICdEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC4nIGlkZW50IHdzKiAnKCcgLiogJyknXG5mdW5jdGlvbiBjaGVja1Byb2dpZChzY2FubmVyKSB7XG4gICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICBmb3IgKHZhciB0eXBlOyB0eXBlID0gc2Nhbm5lci5sb29rdXBUeXBlKG9mZnNldCk7IG9mZnNldCsrKSB7XG4gICAgICAgIGlmICh0eXBlICE9PSBXSElURVNQQUNFICYmIHR5cGUgIT09IENPTU1FTlQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjYW5uZXIubG9va3VwVmFsdWUob2Zmc2V0LCAnYWxwaGEoJykgfHxcbiAgICAgICAgc2Nhbm5lci5sb29rdXBWYWx1ZShvZmZzZXQsICdjaHJvbWEoJykgfHxcbiAgICAgICAgc2Nhbm5lci5sb29rdXBWYWx1ZShvZmZzZXQsICdkcm9wc2hhZG93KCcpKSB7XG4gICAgICAgIGlmIChzY2FubmVyLmxvb2t1cFR5cGUob2Zmc2V0KSAhPT0gRlVOQ1RJT04pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY2FubmVyLmxvb2t1cFZhbHVlKG9mZnNldCwgJ3Byb2dpZCcpID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgc2Nhbm5lci5sb29rdXBUeXBlKG9mZnNldCArIDEpICE9PSBDT0xPTikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdWYWx1ZScsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGNoaWxkcmVuOiBbW11dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgLy8gc3BlY2lhbCBwYXJzZXIgZm9yIGZpbHRlciBwcm9wZXJ0eSBzaW5jZSBpdCBjYW4gY29udGFpbnMgbm9uLXN0YW5kYXJ0IHN5bnRheCBmb3Igb2xkIElFXG4gICAgICAgIGlmIChwcm9wZXJ0eSAhPT0gbnVsbCAmJiBlbmRzV2l0aChwcm9wZXJ0eSwgJ2ZpbHRlcicpICYmIGNoZWNrUHJvZ2lkKHRoaXMuc2Nhbm5lcikpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlJhdyh0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuLCBFWENMQU1BVElPTk1BUkssIFNFTUlDT0xPTiwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnJlYWRTZXF1ZW5jZSh0aGlzLnNjb3BlLlZhbHVlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ1ZhbHVlJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHRoaXMuZWFjaChwcm9jZXNzQ2h1bmssIG5vZGUpO1xuICAgIH1cbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2xpc3QnKTtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgQ09NTUVOVCA9IFRZUEUuQ29tbWVudDtcbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIEZVTkNUSU9OID0gVFlQRS5GdW5jdGlvbjtcbnZhciBMRUZUUEFSRU5USEVTSVMgPSBUWVBFLkxlZnRQYXJlbnRoZXNpcztcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgQ09MT04gPSBUWVBFLkNvbG9uO1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KCkge1xuICAgIHJldHVybiBuZXcgTGlzdCgpLmFwcGVuZERhdGEoXG4gICAgICAgIHRoaXMuUmF3KHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW4sIDAsIDAsIGZhbHNlLCBmYWxzZSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBwYXJlbnRoZXNlcygpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuXG4gICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgLy8gVE9ETzogbWFrZSBpdCBzaW1wbGllclxuICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBJREVOVElGSUVSKSB7XG4gICAgICAgIGluZGV4ID0gMTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IEhZUEhFTk1JTlVTICYmXG4gICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubG9va3VwVHlwZSgxKSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICBpbmRleCA9IDI7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ICE9PSAwICYmIHRoaXMuc2Nhbm5lci5sb29rdXBOb25XU1R5cGUoaW5kZXgpID09PSBDT0xPTikge1xuICAgICAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgdGhpcy5EZWNsYXJhdGlvbigpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlYWRTZXF1ZW5jZS5jYWxsKHRoaXMpO1xufVxuXG5mdW5jdGlvbiByZWFkU2VxdWVuY2UoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbmV3IExpc3QoKTtcbiAgICB2YXIgc3BhY2UgPSBudWxsO1xuICAgIHZhciBjaGlsZDtcblxuICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgIHNjYW46XG4gICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXSElURVNQQUNFOlxuICAgICAgICAgICAgICAgIHNwYWNlID0gdGhpcy5XaGl0ZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjYXNlIEZVTkNUSU9OOlxuICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5GdW5jdGlvbihjb25zdW1lUmF3LCB0aGlzLnNjb3BlLkF0cnVsZVByZWx1ZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIElERU5USUZJRVI6XG4gICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLklkZW50aWZpZXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMRUZUUEFSRU5USEVTSVM6XG4gICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLlBhcmVudGhlc2VzKHBhcmVudGhlc2VzLCB0aGlzLnNjb3BlLkF0cnVsZVByZWx1ZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3BhY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZERhdGEoc3BhY2UpO1xuICAgICAgICAgICAgc3BhY2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YShjaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZToge1xuICAgICAgICBwcmVsdWRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHJlYWRTZXF1ZW5jZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4uaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdDb25kaXRpb24gaXMgZXhwZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICB9LFxuICAgICAgICBibG9jazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5CbG9jayhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3NzdHJlZSAgICAgPSByZXF1aXJlKCdjc3MtdHJlZScpLFxuICAgIExpc3QgICAgICAgID0gY3NzdHJlZS5MaXN0LFxuICAgIHN0YWJsZSAgICAgID0gcmVxdWlyZSgnc3RhYmxlJyksXG4gICAgc3BlY2lmaWNpdHkgPSByZXF1aXJlKCdjc3NvL2xpYi9yZXN0cnVjdHVyZS9wcmVwYXJlL3NwZWNpZmljaXR5Jyk7XG5cblxuLyoqXG4gKiBGbGF0dGVuIGEgQ1NTIEFTVCB0byBhIHNlbGVjdG9ycyBsaXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjc3NBc3QgY3NzLXRyZWUgQVNUIHRvIGZsYXR0ZW5cbiAqIEByZXR1cm4ge0FycmF5fSBzZWxlY3RvcnNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlblRvU2VsZWN0b3JzKGNzc0FzdCkge1xuICAgIHZhciBzZWxlY3RvcnMgPSBbXTtcblxuICAgIGNzc3RyZWUud2Fsa1J1bGVzKGNzc0FzdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS50eXBlICE9PSAnUnVsZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhdHJ1bGUgPSB0aGlzLmF0cnVsZTtcbiAgICAgICAgdmFyIHJ1bGUgPSBub2RlO1xuXG4gICAgICAgIG5vZGUucHJlbHVkZS5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKHNlbGVjdG9yTm9kZSwgc2VsZWN0b3JJdGVtKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgaXRlbTogc2VsZWN0b3JJdGVtLFxuICAgICAgICAgICAgICAgIGF0cnVsZTogYXRydWxlLFxuICAgICAgICAgICAgICAgIHJ1bGU6IHJ1bGUsXG4gICAgICAgICAgICAgICAgcHNldWRvczogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNlbGVjdG9yTm9kZS5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKHNlbGVjdG9yQ2hpbGROb2RlLCBzZWxlY3RvckNoaWxkSXRlbSwgc2VsZWN0b3JDaGlsZExpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JDaGlsZE5vZGUudHlwZSA9PT0gJ1BzZXVkb0NsYXNzU2VsZWN0b3InIHx8XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQ2hpbGROb2RlLnR5cGUgPT09ICdQc2V1ZG9FbGVtZW50U2VsZWN0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnBzZXVkb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBzZWxlY3RvckNoaWxkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q6IHNlbGVjdG9yQ2hpbGRMaXN0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlbGVjdG9ycztcbn1cblxuLyoqXG4gKiBGaWx0ZXIgc2VsZWN0b3JzIGJ5IE1lZGlhIFF1ZXJ5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdG9ycyB0byBmaWx0ZXJcbiAqIEBwYXJhbSB7QXJyYXl9IHVzZU1xcyBBcnJheSB3aXRoIHN0cmluZ3Mgb2YgbWVkaWEgcXVlcmllcyB0aGF0IHNob3VsZCBwYXNzICg8bmFtZT4gPGV4cHJlc3Npb24+KVxuICogQHJldHVybiB7QXJyYXl9IEZpbHRlcmVkIHNlbGVjdG9ycyB0aGF0IG1hdGNoIHRoZSBwYXNzZWQgbWVkaWEgcXVlcmllc1xuICovXG5mdW5jdGlvbiBmaWx0ZXJCeU1xcyhzZWxlY3RvcnMsIHVzZU1xcykge1xuICAgIHJldHVybiBzZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgIGlmIChzZWxlY3Rvci5hdHJ1bGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB+dXNlTXFzLmluZGV4T2YoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1xTmFtZSA9IHNlbGVjdG9yLmF0cnVsZS5uYW1lO1xuICAgICAgICB2YXIgbXFTdHIgPSBtcU5hbWU7XG4gICAgICAgIGlmIChzZWxlY3Rvci5hdHJ1bGUuZXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgc2VsZWN0b3IuYXRydWxlLmV4cHJlc3Npb24uY2hpbGRyZW4uZmlyc3QoKS50eXBlID09PSAnTWVkaWFRdWVyeUxpc3QnKSB7XG4gICAgICAgICAgICB2YXIgbXFFeHByID0gY3NzdHJlZS50cmFuc2xhdGUoc2VsZWN0b3IuYXRydWxlLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgbXFTdHIgPSBbbXFOYW1lLCBtcUV4cHJdLmpvaW4oJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB+dXNlTXFzLmluZGV4T2YobXFTdHIpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEZpbHRlciBzZWxlY3RvcnMgYnkgdGhlIHBzZXVkby1lbGVtZW50cyBhbmQvb3IgLWNsYXNzZXMgdGhleSBjb250YWluLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdG9ycyB0byBmaWx0ZXJcbiAqIEBwYXJhbSB7QXJyYXl9IHVzZVBzZXVkb3MgQXJyYXkgd2l0aCBzdHJpbmdzIG9mIHNpbmdsZSBvciBzZXF1ZW5jZSBvZiBwc2V1ZG8tZWxlbWVudHMgYW5kL29yIC1jbGFzc2VzIHRoYXQgc2hvdWxkIHBhc3NcbiAqIEByZXR1cm4ge0FycmF5fSBGaWx0ZXJlZCBzZWxlY3RvcnMgdGhhdCBtYXRjaCB0aGUgcGFzc2VkIHBzZXVkby1lbGVtZW50cyBhbmQvb3IgLWNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gZmlsdGVyQnlQc2V1ZG9zKHNlbGVjdG9ycywgdXNlUHNldWRvcykge1xuICAgIHJldHVybiBzZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBwc2V1ZG9TZWxlY3RvcnNTdHIgPSBjc3N0cmVlLnRyYW5zbGF0ZSh7XG4gICAgICAgICAgICB0eXBlOiAnU2VsZWN0b3InLFxuICAgICAgICAgICAgY2hpbGRyZW46IG5ldyBMaXN0KCkuZnJvbUFycmF5KHNlbGVjdG9yLnBzZXVkb3MubWFwKGZ1bmN0aW9uKHBzZXVkbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwc2V1ZG8uaXRlbS5kYXRhO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gfnVzZVBzZXVkb3MuaW5kZXhPZihwc2V1ZG9TZWxlY3RvcnNTdHIpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFJlbW92ZSBwc2V1ZG8tZWxlbWVudHMgYW5kL29yIC1jbGFzc2VzIGZyb20gdGhlIHNlbGVjdG9ycyBmb3IgcHJvcGVyIG1hdGNoaW5nLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdG9ycyB0byBjbGVhblxuICogQHJldHVybiB7QXJyYXl9IFNlbGVjdG9ycyB3aXRob3V0IHBzZXVkby1lbGVtZW50cyBhbmQvb3IgLWNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gY2xlYW5Qc2V1ZG9zKHNlbGVjdG9ycykge1xuICAgIHNlbGVjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgIHNlbGVjdG9yLnBzZXVkb3MuZm9yRWFjaChmdW5jdGlvbihwc2V1ZG8pIHtcbiAgICAgICAgICAgIHBzZXVkby5saXN0LnJlbW92ZShwc2V1ZG8uaXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHNlbGVjdG9yIHNwZWNpZmljaXRpZXMuXG4gKiBleHRyYWN0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20va2VlZ2Fuc3RyZWV0L3NwZWNpZmljaXR5L2Jsb2IvbWFzdGVyL3NwZWNpZmljaXR5LmpzI0wyMTFcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhU3BlY2lmaWNpdHkgU3BlY2lmaWNpdHkgb2Ygc2VsZWN0b3IgQVxuICogQHBhcmFtIHtBcnJheX0gYlNwZWNpZmljaXR5IFNwZWNpZmljaXR5IG9mIHNlbGVjdG9yIEJcbiAqIEByZXR1cm4ge051bWJlcn0gU2NvcmUgb2Ygc2VsZWN0b3Igc3BlY2lmaWNpdHkgQSBjb21wYXJlZCB0byBzZWxlY3RvciBzcGVjaWZpY2l0eSBCXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVTcGVjaWZpY2l0eShhU3BlY2lmaWNpdHksIGJTcGVjaWZpY2l0eSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChhU3BlY2lmaWNpdHlbaV0gPCBiU3BlY2lmaWNpdHlbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChhU3BlY2lmaWNpdHlbaV0gPiBiU3BlY2lmaWNpdHlbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG5cblxuLyoqXG4gKiBDb21wYXJlIHR3byBzaW1wbGUgc2VsZWN0b3JzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhU2ltcGxlU2VsZWN0b3JOb2RlIFNpbXBsZSBzZWxlY3RvciBBXG4gKiBAcGFyYW0ge09iamVjdH0gYlNpbXBsZVNlbGVjdG9yTm9kZSBTaW1wbGUgc2VsZWN0b3IgQlxuICogQHJldHVybiB7TnVtYmVyfSBTY29yZSBvZiBzZWxlY3RvciBBIGNvbXBhcmVkIHRvIHNlbGVjdG9yIEJcbiAqL1xuZnVuY3Rpb24gY29tcGFyZVNpbXBsZVNlbGVjdG9yTm9kZShhU2ltcGxlU2VsZWN0b3JOb2RlLCBiU2ltcGxlU2VsZWN0b3JOb2RlKSB7XG4gICAgdmFyIGFTcGVjaWZpY2l0eSA9IHNwZWNpZmljaXR5KGFTaW1wbGVTZWxlY3Rvck5vZGUpLFxuICAgICAgICBiU3BlY2lmaWNpdHkgPSBzcGVjaWZpY2l0eShiU2ltcGxlU2VsZWN0b3JOb2RlKTtcbiAgICByZXR1cm4gY29tcGFyZVNwZWNpZmljaXR5KGFTcGVjaWZpY2l0eSwgYlNwZWNpZmljaXR5KTtcbn1cblxuZnVuY3Rpb24gX2J5U2VsZWN0b3JTcGVjaWZpY2l0eShzZWxlY3RvckEsIHNlbGVjdG9yQikge1xuICAgIHJldHVybiBjb21wYXJlU2ltcGxlU2VsZWN0b3JOb2RlKHNlbGVjdG9yQS5pdGVtLmRhdGEsIHNlbGVjdG9yQi5pdGVtLmRhdGEpO1xufVxuXG5cbi8qKlxuICogU29ydCBzZWxlY3RvcnMgc3RhYmx5IGJ5IHRoZWlyIHNwZWNpZmljaXR5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdG9ycyB0byBiZSBzb3J0ZWRcbiAqIEByZXR1cm4ge0FycmF5fSBTdGFibGUgc29ydGVkIHNlbGVjdG9yc1xuICovXG5mdW5jdGlvbiBzb3J0U2VsZWN0b3JzKHNlbGVjdG9ycykge1xuICAgIHJldHVybiBzdGFibGUoc2VsZWN0b3JzLCBfYnlTZWxlY3RvclNwZWNpZmljaXR5KTtcbn1cblxuXG4vKipcbiAqIENvbnZlcnQgYSBjc3MtdHJlZSBBU1Qgc3R5bGUgZGVjbGFyYXRpb24gdG8gQ1NTU3R5bGVEZWNsYXJhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVjbGFyYXRpb24gY3NzLXRyZWUgc3R5bGUgZGVjbGFyYXRpb25cbiAqIEByZXR1cm4ge09iamVjdH0gQ1NTU3R5bGVEZWNsYXJhdGlvbiBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBjc3N0cmVlVG9TdHlsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IGRlY2xhcmF0aW9uLnByb3BlcnR5LFxuICAgICAgICBwcm9wZXJ0eVZhbHVlID0gY3NzdHJlZS50cmFuc2xhdGUoZGVjbGFyYXRpb24udmFsdWUpLFxuICAgICAgICBwcm9wZXJ0eVByaW9yaXR5ID0gKGRlY2xhcmF0aW9uLmltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgdmFsdWU6IHByb3BlcnR5VmFsdWUsXG4gICAgICAgIHByaW9yaXR5OiBwcm9wZXJ0eVByaW9yaXR5XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIEdldHMgdGhlIENTUyBzdHJpbmcgb2YgYSBzdHlsZSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgc3R5bGUgZWxlbWVudFxuICogQHJldHVybiB7U3RyaW5nfEFycmF5fSBDU1Mgc3RyaW5nIG9yIGVtcHR5IGFycmF5IGlmIG5vIHN0eWxlcyBhcmUgc2V0XG4gKi9cbmZ1bmN0aW9uIGdldENzc1N0cihlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY29udGVudFswXS50ZXh0IHx8IGVsZW0uY29udGVudFswXS5jZGF0YSB8fCBbXTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBDU1Mgc3RyaW5nIG9mIGEgc3R5bGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IHN0eWxlIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBDU1Mgc3RyaW5nIHRvIGJlIHNldFxuICogQHJldHVybiB7T2JqZWN0fSByZWZlcmVuY2UgdG8gZmllbGQgd2l0aCBDU1NcbiAqL1xuZnVuY3Rpb24gc2V0Q3NzU3RyKGVsZW0sIGNzcykge1xuICAgIC8vIGluIGNhc2Ugb2YgY2RhdGEgZmllbGRcbiAgICBpZihlbGVtLmNvbnRlbnRbMF0uY2RhdGEpIHtcbiAgICAgICAgZWxlbS5jb250ZW50WzBdLmNkYXRhID0gY3NzO1xuICAgICAgICByZXR1cm4gZWxlbS5jb250ZW50WzBdLmNkYXRhO1xuICAgIH1cblxuICAgIC8vIGluIGNhc2Ugb2YgdGV4dCBmaWVsZCArIGlmIG5vdGhpbmcgd2FzIHNldCB5ZXRcbiAgICBlbGVtLmNvbnRlbnRbMF0udGV4dCAgPSBjc3M7XG4gICAgcmV0dXJuIGVsZW0uY29udGVudFswXS50ZXh0O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmZsYXR0ZW5Ub1NlbGVjdG9ycyA9IGZsYXR0ZW5Ub1NlbGVjdG9ycztcblxubW9kdWxlLmV4cG9ydHMuZmlsdGVyQnlNcXMgPSBmaWx0ZXJCeU1xcztcbm1vZHVsZS5leHBvcnRzLmZpbHRlckJ5UHNldWRvcyA9IGZpbHRlckJ5UHNldWRvcztcbm1vZHVsZS5leHBvcnRzLmNsZWFuUHNldWRvcyA9IGNsZWFuUHNldWRvcztcblxubW9kdWxlLmV4cG9ydHMuY29tcGFyZVNwZWNpZmljaXR5ID0gY29tcGFyZVNwZWNpZmljaXR5O1xubW9kdWxlLmV4cG9ydHMuY29tcGFyZVNpbXBsZVNlbGVjdG9yTm9kZSA9IGNvbXBhcmVTaW1wbGVTZWxlY3Rvck5vZGU7XG5cbm1vZHVsZS5leHBvcnRzLnNvcnRTZWxlY3RvcnMgPSBzb3J0U2VsZWN0b3JzO1xuXG5tb2R1bGUuZXhwb3J0cy5jc3N0cmVlVG9TdHlsZURlY2xhcmF0aW9uID0gY3NzdHJlZVRvU3R5bGVEZWNsYXJhdGlvbjtcblxubW9kdWxlLmV4cG9ydHMuZ2V0Q3NzU3RyID0gZ2V0Q3NzU3RyO1xubW9kdWxlLmV4cG9ydHMuc2V0Q3NzU3RyID0gc2V0Q3NzU3RyO1xuIiwiLypcblRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG5Db3B5cmlnaHQgKGMpIDIwMTYgQ29kZXJQdXBweVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuU09GVFdBUkUuXG5cbiovXG52YXIgX2VuZGlhbm5lc3M7XG5leHBvcnQgZnVuY3Rpb24gZW5kaWFubmVzcygpIHtcbiAgaWYgKHR5cGVvZiBfZW5kaWFubmVzcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgYSA9IG5ldyBBcnJheUJ1ZmZlcigyKTtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGEpO1xuICAgIHZhciBjID0gbmV3IFVpbnQxNkFycmF5KGEpO1xuICAgIGJbMF0gPSAxO1xuICAgIGJbMV0gPSAyO1xuICAgIGlmIChjWzBdID09PSAyNTgpIHtcbiAgICAgIF9lbmRpYW5uZXNzID0gJ0JFJztcbiAgICB9IGVsc2UgaWYgKGNbMF0gPT09IDUxMyl7XG4gICAgICBfZW5kaWFubmVzcyA9ICdMRSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGZpZ3VyZSBvdXQgZW5kaWFuZXNzJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBfZW5kaWFubmVzcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhvc3RuYW1lKCkge1xuICBpZiAodHlwZW9mIGdsb2JhbC5sb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsLmxvY2F0aW9uLmhvc3RuYW1lXG4gIH0gZWxzZSByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkYXZnKCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJlZW1lbSgpIHtcbiAgcmV0dXJuIE51bWJlci5NQVhfVkFMVUU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3RhbG1lbSgpIHtcbiAgcmV0dXJuIE51bWJlci5NQVhfVkFMVUU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcHVzKCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlKCkge1xuICByZXR1cm4gJ0Jyb3dzZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsZWFzZSAoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsLm5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsLm5hdmlnYXRvci5hcHBWZXJzaW9uO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ldHdvcmtJbnRlcmZhY2VzKCl7fVxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ldHdvcmtJbnRlcmZhY2VzKCl7fVxuXG5leHBvcnQgZnVuY3Rpb24gYXJjaCgpIHtcbiAgcmV0dXJuICdqYXZhc2NyaXB0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBsYXRmb3JtKCkge1xuICByZXR1cm4gJ2Jyb3dzZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG1wRGlyKCkge1xuICByZXR1cm4gJy90bXAnO1xufVxuZXhwb3J0IHZhciB0bXBkaXIgPSB0bXBEaXI7XG5cbmV4cG9ydCB2YXIgRU9MID0gJ1xcbic7XG5leHBvcnQgZGVmYXVsdCB7XG4gIEVPTDogRU9MLFxuICB0bXBkaXI6IHRtcGRpcixcbiAgdG1wRGlyOiB0bXBEaXIsXG4gIG5ldHdvcmtJbnRlcmZhY2VzOm5ldHdvcmtJbnRlcmZhY2VzLFxuICBnZXROZXR3b3JrSW50ZXJmYWNlczogZ2V0TmV0d29ya0ludGVyZmFjZXMsXG4gIHJlbGVhc2U6IHJlbGVhc2UsXG4gIHR5cGU6IHR5cGUsXG4gIGNwdXM6IGNwdXMsXG4gIHRvdGFsbWVtOiB0b3RhbG1lbSxcbiAgZnJlZW1lbTogZnJlZW1lbSxcbiAgdXB0aW1lOiB1cHRpbWUsXG4gIGxvYWRhdmc6IGxvYWRhdmcsXG4gIGhvc3RuYW1lOiBob3N0bmFtZSxcbiAgZW5kaWFubmVzczogZW5kaWFubmVzcyxcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEVPTCA9IHJlcXVpcmUoJ29zJykuRU9MLFxuICAgIHRleHRFbGVtID0gcmVxdWlyZSgnLi4vLi4vcGx1Z2lucy9fY29sbGVjdGlvbnMuanMnKS5lbGVtc0dyb3Vwcy50ZXh0Q29udGVudC5jb25jYXQoJ3RpdGxlJyk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBkb2N0eXBlU3RhcnQ6ICc8IURPQ1RZUEUnLFxuICAgIGRvY3R5cGVFbmQ6ICc+JyxcbiAgICBwcm9jSW5zdFN0YXJ0OiAnPD8nLFxuICAgIHByb2NJbnN0RW5kOiAnPz4nLFxuICAgIHRhZ09wZW5TdGFydDogJzwnLFxuICAgIHRhZ09wZW5FbmQ6ICc+JyxcbiAgICB0YWdDbG9zZVN0YXJ0OiAnPC8nLFxuICAgIHRhZ0Nsb3NlRW5kOiAnPicsXG4gICAgdGFnU2hvcnRTdGFydDogJzwnLFxuICAgIHRhZ1Nob3J0RW5kOiAnLz4nLFxuICAgIGF0dHJTdGFydDogJz1cIicsXG4gICAgYXR0ckVuZDogJ1wiJyxcbiAgICBjb21tZW50U3RhcnQ6ICc8IS0tJyxcbiAgICBjb21tZW50RW5kOiAnLS0+JyxcbiAgICBjZGF0YVN0YXJ0OiAnPCFbQ0RBVEFbJyxcbiAgICBjZGF0YUVuZDogJ11dPicsXG4gICAgdGV4dFN0YXJ0OiAnJyxcbiAgICB0ZXh0RW5kOiAnJyxcbiAgICBpbmRlbnQ6IDQsXG4gICAgcmVnRW50aXRpZXM6IC9bJidcIjw+XS9nLFxuICAgIHJlZ1ZhbEVudGl0aWVzOiAvWyZcIjw+XS9nLFxuICAgIGVuY29kZUVudGl0eTogZW5jb2RlRW50aXR5LFxuICAgIHByZXR0eTogZmFsc2UsXG4gICAgdXNlU2hvcnRUYWdzOiB0cnVlXG59O1xuXG52YXIgZW50aXRpZXMgPSB7XG4gICAgICAnJic6ICcmYW1wOycsXG4gICAgICAnXFwnJzogJyZhcG9zOycsXG4gICAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICAgICc+JzogJyZndDsnLFxuICAgICAgJzwnOiAnJmx0OycsXG4gICAgfTtcblxuLyoqXG4gKiBDb252ZXJ0IFNWRy1hcy1KUyBvYmplY3QgdG8gU1ZHIChYTUwpIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBpbnB1dCBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIGNvbmZpZ1xuICpcbiAqIEByZXR1cm4ge09iamVjdH0gb3V0cHV0IGRhdGFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBjb25maWcpIHtcblxuICAgIHJldHVybiBuZXcgSlMyU1ZHKGNvbmZpZykuY29udmVydChkYXRhKTtcblxufTtcblxuZnVuY3Rpb24gSlMyU1ZHKGNvbmZpZykge1xuXG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBjb25maWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgdmFyIGluZGVudCA9IHRoaXMuY29uZmlnLmluZGVudDtcbiAgICBpZiAodHlwZW9mIGluZGVudCA9PSAnbnVtYmVyJyAmJiAhaXNOYU4oaW5kZW50KSkge1xuICAgICAgICB0aGlzLmNvbmZpZy5pbmRlbnQgPSAoaW5kZW50IDwgMCkgPyAnXFx0JyA6ICcgJy5yZXBlYXQoaW5kZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbmRlbnQgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jb25maWcuaW5kZW50ID0gJyAgICAnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5wcmV0dHkpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZG9jdHlwZUVuZCArPSBFT0w7XG4gICAgICAgIHRoaXMuY29uZmlnLnByb2NJbnN0RW5kICs9IEVPTDtcbiAgICAgICAgdGhpcy5jb25maWcuY29tbWVudEVuZCArPSBFT0w7XG4gICAgICAgIHRoaXMuY29uZmlnLmNkYXRhRW5kICs9IEVPTDtcbiAgICAgICAgdGhpcy5jb25maWcudGFnU2hvcnRFbmQgKz0gRU9MO1xuICAgICAgICB0aGlzLmNvbmZpZy50YWdPcGVuRW5kICs9IEVPTDtcbiAgICAgICAgdGhpcy5jb25maWcudGFnQ2xvc2VFbmQgKz0gRU9MO1xuICAgICAgICB0aGlzLmNvbmZpZy50ZXh0RW5kICs9IEVPTDtcbiAgICB9XG5cbiAgICB0aGlzLmluZGVudExldmVsID0gMDtcbiAgICB0aGlzLnRleHRDb250ZXh0ID0gbnVsbDtcblxufVxuXG5mdW5jdGlvbiBlbmNvZGVFbnRpdHkoY2hhcikge1xuICAgIHJldHVybiBlbnRpdGllc1tjaGFyXTtcbn1cblxuLyoqXG4gKiBTdGFydCBjb252ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGlucHV0IGRhdGFcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbkpTMlNWRy5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uKGRhdGEpIHtcblxuICAgIHZhciBzdmcgPSAnJztcblxuICAgIGlmIChkYXRhLmNvbnRlbnQpIHtcblxuICAgICAgICB0aGlzLmluZGVudExldmVsKys7XG5cbiAgICAgICAgZGF0YS5jb250ZW50LmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgICAgICAgICBpZiAoaXRlbS5lbGVtKSB7XG4gICAgICAgICAgICAgICBzdmcgKz0gdGhpcy5jcmVhdGVFbGVtKGl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnRleHQpIHtcbiAgICAgICAgICAgICAgIHN2ZyArPSB0aGlzLmNyZWF0ZVRleHQoaXRlbS50ZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5kb2N0eXBlKSB7XG4gICAgICAgICAgICAgICAgc3ZnICs9IHRoaXMuY3JlYXRlRG9jdHlwZShpdGVtLmRvY3R5cGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnByb2Nlc3NpbmdpbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgICAgIHN2ZyArPSB0aGlzLmNyZWF0ZVByb2NJbnN0KGl0ZW0ucHJvY2Vzc2luZ2luc3RydWN0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgc3ZnICs9IHRoaXMuY3JlYXRlQ29tbWVudChpdGVtLmNvbW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmNkYXRhKSB7XG4gICAgICAgICAgICAgICAgc3ZnICs9IHRoaXMuY3JlYXRlQ0RBVEEoaXRlbS5jZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmluZGVudExldmVsLS07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBzdmcsXG4gICAgICAgIGluZm86IHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodFxuICAgICAgICB9XG4gICAgfTtcblxufTtcblxuLyoqXG4gKiBDcmVhdGUgaW5kZW50IHN0cmluZyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGN1cnJlbnQgbm9kZSBsZXZlbC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbkpTMlNWRy5wcm90b3R5cGUuY3JlYXRlSW5kZW50ID0gZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIgaW5kZW50ID0gJyc7XG5cbiAgICBpZiAodGhpcy5jb25maWcucHJldHR5ICYmICF0aGlzLnRleHRDb250ZXh0KSB7XG4gICAgICAgIGluZGVudCA9IHRoaXMuY29uZmlnLmluZGVudC5yZXBlYXQodGhpcy5pbmRlbnRMZXZlbCAtIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRlbnQ7XG5cbn07XG5cbi8qKlxuICogQ3JlYXRlIGRvY3R5cGUgdGFnLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb2N0eXBlIGRvY3R5cGUgYm9keSBzdHJpbmdcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbkpTMlNWRy5wcm90b3R5cGUuY3JlYXRlRG9jdHlwZSA9IGZ1bmN0aW9uKGRvY3R5cGUpIHtcblxuICAgIHJldHVybiAgdGhpcy5jb25maWcuZG9jdHlwZVN0YXJ0ICtcbiAgICAgICAgICAgIGRvY3R5cGUgK1xuICAgICAgICAgICAgdGhpcy5jb25maWcuZG9jdHlwZUVuZDtcblxufTtcblxuLyoqXG4gKiBDcmVhdGUgWE1MIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gdGFnLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0cnVjdGlvbiBpbnN0cnVjdGlvbiBvYmplY3RcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbkpTMlNWRy5wcm90b3R5cGUuY3JlYXRlUHJvY0luc3QgPSBmdW5jdGlvbihpbnN0cnVjdGlvbikge1xuXG4gICAgcmV0dXJuICB0aGlzLmNvbmZpZy5wcm9jSW5zdFN0YXJ0ICtcbiAgICAgICAgICAgIGluc3RydWN0aW9uLm5hbWUgK1xuICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgIGluc3RydWN0aW9uLmJvZHkgK1xuICAgICAgICAgICAgdGhpcy5jb25maWcucHJvY0luc3RFbmQ7XG5cbn07XG5cbi8qKlxuICogQ3JlYXRlIGNvbW1lbnQgdGFnLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb21tZW50IGNvbW1lbnQgYm9keVxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuSlMyU1ZHLnByb3RvdHlwZS5jcmVhdGVDb21tZW50ID0gZnVuY3Rpb24oY29tbWVudCkge1xuXG4gICAgcmV0dXJuICB0aGlzLmNvbmZpZy5jb21tZW50U3RhcnQgK1xuICAgICAgICAgICAgY29tbWVudCArXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5jb21tZW50RW5kO1xuXG59O1xuXG4vKipcbiAqIENyZWF0ZSBDREFUQSBzZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjZGF0YSBDREFUQSBib2R5XG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5KUzJTVkcucHJvdG90eXBlLmNyZWF0ZUNEQVRBID0gZnVuY3Rpb24oY2RhdGEpIHtcblxuICAgIHJldHVybiAgdGhpcy5jcmVhdGVJbmRlbnQoKSArXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5jZGF0YVN0YXJ0ICtcbiAgICAgICAgICAgIGNkYXRhICtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmNkYXRhRW5kO1xuXG59O1xuXG4vKipcbiAqIENyZWF0ZSBlbGVtZW50IHRhZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBlbGVtZW50IG9iamVjdFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuSlMyU1ZHLnByb3RvdHlwZS5jcmVhdGVFbGVtID0gZnVuY3Rpb24oZGF0YSkge1xuXG4gICAgLy8gYmVhdXRpZnVsIGluamVjdGlvbiBmb3Igb2J0YWluaW5nIFNWRyBpbmZvcm1hdGlvbiA6KVxuICAgIGlmIChcbiAgICAgICAgZGF0YS5pc0VsZW0oJ3N2ZycpICYmXG4gICAgICAgIGRhdGEuaGFzQXR0cignd2lkdGgnKSAmJlxuICAgICAgICBkYXRhLmhhc0F0dHIoJ2hlaWdodCcpXG4gICAgKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSBkYXRhLmF0dHIoJ3dpZHRoJykudmFsdWU7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZGF0YS5hdHRyKCdoZWlnaHQnKS52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBlbXB0eSBlbGVtZW50IGFuZCBzaG9ydCB0YWdcbiAgICBpZiAoZGF0YS5pc0VtcHR5KCkpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnVzZVNob3J0VGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlSW5kZW50KCkgK1xuICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnRhZ1Nob3J0U3RhcnQgK1xuICAgICAgICAgICAgICAgICAgIGRhdGEuZWxlbSArXG4gICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBdHRycyhkYXRhKSArXG4gICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcudGFnU2hvcnRFbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRlbnQoKSArXG4gICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcudGFnU2hvcnRTdGFydCArXG4gICAgICAgICAgICAgICAgICAgZGF0YS5lbGVtICtcbiAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUF0dHJzKGRhdGEpICtcbiAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy50YWdPcGVuRW5kICtcbiAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy50YWdDbG9zZVN0YXJ0ICtcbiAgICAgICAgICAgICAgICAgICBkYXRhLmVsZW0gK1xuICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnRhZ0Nsb3NlRW5kO1xuICAgICAgICB9XG4gICAgLy8gbm9uLWVtcHR5IGVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGFnT3BlblN0YXJ0ID0gdGhpcy5jb25maWcudGFnT3BlblN0YXJ0LFxuICAgICAgICAgICAgdGFnT3BlbkVuZCA9IHRoaXMuY29uZmlnLnRhZ09wZW5FbmQsXG4gICAgICAgICAgICB0YWdDbG9zZVN0YXJ0ID0gdGhpcy5jb25maWcudGFnQ2xvc2VTdGFydCxcbiAgICAgICAgICAgIHRhZ0Nsb3NlRW5kID0gdGhpcy5jb25maWcudGFnQ2xvc2VFbmQsXG4gICAgICAgICAgICBvcGVuSW5kZW50ID0gdGhpcy5jcmVhdGVJbmRlbnQoKSxcbiAgICAgICAgICAgIHRleHRJbmRlbnQgPSAnJyxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGEgPSAnJyxcbiAgICAgICAgICAgIGRhdGFFbmQgPSAnJztcblxuICAgICAgICBpZiAodGhpcy50ZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgdGFnT3BlblN0YXJ0ID0gZGVmYXVsdHMudGFnT3BlblN0YXJ0O1xuICAgICAgICAgICAgdGFnT3BlbkVuZCA9IGRlZmF1bHRzLnRhZ09wZW5FbmQ7XG4gICAgICAgICAgICB0YWdDbG9zZVN0YXJ0ID0gZGVmYXVsdHMudGFnQ2xvc2VTdGFydDtcbiAgICAgICAgICAgIHRhZ0Nsb3NlRW5kID0gZGVmYXVsdHMudGFnQ2xvc2VFbmQ7XG4gICAgICAgICAgICBvcGVuSW5kZW50ID0gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5pc0VsZW0odGV4dEVsZW0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcucHJldHR5KSB7XG4gICAgICAgICAgICAgICAgdGV4dEluZGVudCArPSBvcGVuSW5kZW50ICsgdGhpcy5jb25maWcuaW5kZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50ZXh0Q29udGV4dCA9IGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzZWREYXRhICs9IHRoaXMuY29udmVydChkYXRhKS5kYXRhO1xuXG4gICAgICAgIGlmICh0aGlzLnRleHRDb250ZXh0ID09IGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dENvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnByZXR0eSkgZGF0YUVuZCA9IEVPTDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAgb3BlbkluZGVudCArXG4gICAgICAgICAgICAgICAgdGFnT3BlblN0YXJ0ICtcbiAgICAgICAgICAgICAgICBkYXRhLmVsZW0gK1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQXR0cnMoZGF0YSkgK1xuICAgICAgICAgICAgICAgIHRhZ09wZW5FbmQgK1xuICAgICAgICAgICAgICAgIHRleHRJbmRlbnQgK1xuICAgICAgICAgICAgICAgIHByb2Nlc3NlZERhdGEgK1xuICAgICAgICAgICAgICAgIGRhdGFFbmQgK1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5kZW50KCkgK1xuICAgICAgICAgICAgICAgIHRhZ0Nsb3NlU3RhcnQgK1xuICAgICAgICAgICAgICAgIGRhdGEuZWxlbSArXG4gICAgICAgICAgICAgICAgdGFnQ2xvc2VFbmQ7XG5cbiAgICB9XG5cbn07XG5cbi8qKlxuICogQ3JlYXRlIGVsZW1lbnQgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZWxlbSBhdHRyaWJ1dGVzIG9iamVjdFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuSlMyU1ZHLnByb3RvdHlwZS5jcmVhdGVBdHRycyA9IGZ1bmN0aW9uKGVsZW0pIHtcblxuICAgIHZhciBhdHRycyA9ICcnO1xuXG4gICAgZWxlbS5lYWNoQXR0cihmdW5jdGlvbihhdHRyKSB7XG5cbiAgICAgICAgaWYgKGF0dHIudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXR0cnMgKz0gICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5hdHRyU3RhcnQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKGF0dHIudmFsdWUpLnJlcGxhY2UodGhpcy5jb25maWcucmVnVmFsRW50aXRpZXMsIHRoaXMuY29uZmlnLmVuY29kZUVudGl0eSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYXR0ckVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF0dHJzICs9ICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLm5hbWU7XG4gICAgICAgIH1cblxuXG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gYXR0cnM7XG5cbn07XG5cbi8qKlxuICogQ3JlYXRlIHRleHQgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdGV4dCB0ZXh0XG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5KUzJTVkcucHJvdG90eXBlLmNyZWF0ZVRleHQgPSBmdW5jdGlvbih0ZXh0KSB7XG5cbiAgICByZXR1cm4gIHRoaXMuY3JlYXRlSW5kZW50KCkgK1xuICAgICAgICAgICAgdGhpcy5jb25maWcudGV4dFN0YXJ0ICtcbiAgICAgICAgICAgIHRleHQucmVwbGFjZSh0aGlzLmNvbmZpZy5yZWdFbnRpdGllcywgdGhpcy5jb25maWcuZW5jb2RlRW50aXR5KSArXG4gICAgICAgICAgICAodGhpcy50ZXh0Q29udGV4dCA/ICcnIDogdGhpcy5jb25maWcudGV4dEVuZCk7XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUGx1Z2lucyBlbmdpbmUuXG4gKlxuICogQG1vZHVsZSBwbHVnaW5zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgaW5wdXQgZGF0YVxuICogQHBhcmFtIHtPYmplY3R9IGluZm8gZXh0cmEgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBwbHVnaW5zIHBsdWdpbnMgb2JqZWN0IGZyb20gY29uZmlnXG4gKiBAcmV0dXJuIHtPYmplY3R9IG91dHB1dCBkYXRhXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGF0YSwgaW5mbywgcGx1Z2lucykge1xuXG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uKGdyb3VwKSB7XG5cbiAgICAgICAgc3dpdGNoKGdyb3VwWzBdLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3Blckl0ZW0nOlxuICAgICAgICAgICAgICAgIGRhdGEgPSBwZXJJdGVtKGRhdGEsIGluZm8sIGdyb3VwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Blckl0ZW1SZXZlcnNlJzpcbiAgICAgICAgICAgICAgICBkYXRhID0gcGVySXRlbShkYXRhLCBpbmZvLCBncm91cCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmdWxsJzpcbiAgICAgICAgICAgICAgICBkYXRhID0gZnVsbChkYXRhLCBpbmZvLCBncm91cCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRhdGE7XG5cbn07XG5cbi8qKlxuICogRGlyZWN0IG9yIHJldmVyc2UgcGVyLWl0ZW0gbG9vcC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBpbnB1dCBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gaW5mbyBleHRyYSBpbmZvcm1hdGlvblxuICogQHBhcmFtIHtBcnJheX0gcGx1Z2lucyBwbHVnaW5zIGxpc3QgdG8gcHJvY2Vzc1xuICogQHBhcmFtIHtCb29sZWFufSBbcmV2ZXJzZV0gcmV2ZXJzZSBwYXNzP1xuICogQHJldHVybiB7T2JqZWN0fSBvdXRwdXQgZGF0YVxuICovXG5mdW5jdGlvbiBwZXJJdGVtKGRhdGEsIGluZm8sIHBsdWdpbnMsIHJldmVyc2UpIHtcblxuICAgIGZ1bmN0aW9uIG1vbmtleXMoaXRlbXMpIHtcblxuICAgICAgICBpdGVtcy5jb250ZW50ID0gaXRlbXMuY29udGVudC5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgICAgICAgICAvLyByZXZlcnNlIHBhc3NcbiAgICAgICAgICAgIGlmIChyZXZlcnNlICYmIGl0ZW0uY29udGVudCkge1xuICAgICAgICAgICAgICAgIG1vbmtleXMoaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1haW4gZmlsdGVyXG4gICAgICAgICAgICB2YXIgZmlsdGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGZpbHRlciAmJiBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwbHVnaW4gPSBwbHVnaW5zW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5hY3RpdmUgJiYgcGx1Z2luLmZuKGl0ZW0sIHBsdWdpbi5wYXJhbXMsIGluZm8pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGRpcmVjdCBwYXNzXG4gICAgICAgICAgICBpZiAoIXJldmVyc2UgJiYgaXRlbS5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgbW9ua2V5cyhpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjtcblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXRlbXM7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gbW9ua2V5cyhkYXRhKTtcblxufVxuXG4vKipcbiAqIFwiRnVsbFwiIHBsdWdpbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgaW5wdXQgZGF0YVxuICogQHBhcmFtIHtPYmplY3R9IGluZm8gZXh0cmEgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB7QXJyYXl9IHBsdWdpbnMgcGx1Z2lucyBsaXN0IHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge09iamVjdH0gb3V0cHV0IGRhdGFcbiAqL1xuZnVuY3Rpb24gZnVsbChkYXRhLCBpbmZvLCBwbHVnaW5zKSB7XG5cbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICAgIGlmIChwbHVnaW4uYWN0aXZlKSB7XG4gICAgICAgICAgICBkYXRhID0gcGx1Z2luLmZuKGRhdGEsIHBsdWdpbi5wYXJhbXMsIGluZm8pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGF0YTtcblxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vL1xuLy8gICAgICAgICAgICBpdGVtICAgICAgICBpdGVtICAgICAgICBpdGVtICAgICAgICBpdGVtXG4vLyAgICAgICAgICAvLS0tLS0tXFwgICAgLy0tLS0tLVxcICAgIC8tLS0tLS1cXCAgICAvLS0tLS0tXFxcbi8vICAgICAgICAgIHwgZGF0YSB8ICAgIHwgZGF0YSB8ICAgIHwgZGF0YSB8ICAgIHwgZGF0YSB8XG4vLyAgbnVsbCA8LS0rLXByZXYgfDwtLS0rLXByZXYgfDwtLS0rLXByZXYgfDwtLS0rLXByZXYgfFxuLy8gICAgICAgICAgfCBuZXh0LSstLS0+fCBuZXh0LSstLS0+fCBuZXh0LSstLS0+fCBuZXh0LSstLT4gbnVsbFxuLy8gICAgICAgICAgXFwtLS0tLS0vICAgIFxcLS0tLS0tLyAgICBcXC0tLS0tLS8gICAgXFwtLS0tLS0vXG4vLyAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuLy8gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBsaXN0ICAgICAgICAgICAgICAgIHxcbi8vICAgICAgICAgICAgIHwgICAgICAgICAgICAgIC8tLS0tLS1cXCAgICAgICAgICAgICAgfFxuLy8gICAgICAgICAgICAgXFwtLS0tLS0tLS0tLS0tLSstaGVhZCB8ICAgICAgICAgICAgICB8XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRhaWwtKy0tLS0tLS0tLS0tLS0tL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwtLS0tLS0vXG4vL1xuXG5mdW5jdGlvbiBjcmVhdGVJdGVtKGRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcmV2OiBudWxsLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICBkYXRhOiBkYXRhXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYWxsb2NhdGVDdXJzb3Iobm9kZSwgcHJldiwgbmV4dCkge1xuICAgIHZhciBjdXJzb3I7XG5cbiAgICBpZiAoY3Vyc29ycyAhPT0gbnVsbCkge1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3JzO1xuICAgICAgICBjdXJzb3JzID0gY3Vyc29ycy5jdXJzb3I7XG4gICAgICAgIGN1cnNvci5wcmV2ID0gcHJldjtcbiAgICAgICAgY3Vyc29yLm5leHQgPSBuZXh0O1xuICAgICAgICBjdXJzb3IuY3Vyc29yID0gbm9kZS5jdXJzb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0ge1xuICAgICAgICAgICAgcHJldjogcHJldixcbiAgICAgICAgICAgIG5leHQ6IG5leHQsXG4gICAgICAgICAgICBjdXJzb3I6IG5vZGUuY3Vyc29yXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgbm9kZS5jdXJzb3IgPSBjdXJzb3I7XG5cbiAgICByZXR1cm4gY3Vyc29yO1xufVxuXG5mdW5jdGlvbiByZWxlYXNlQ3Vyc29yKG5vZGUpIHtcbiAgICB2YXIgY3Vyc29yID0gbm9kZS5jdXJzb3I7XG5cbiAgICBub2RlLmN1cnNvciA9IGN1cnNvci5jdXJzb3I7XG4gICAgY3Vyc29yLnByZXYgPSBudWxsO1xuICAgIGN1cnNvci5uZXh0ID0gbnVsbDtcbiAgICBjdXJzb3IuY3Vyc29yID0gY3Vyc29ycztcbiAgICBjdXJzb3JzID0gY3Vyc29yO1xufVxuXG52YXIgY3Vyc29ycyA9IG51bGw7XG52YXIgTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG59O1xuXG5MaXN0LmNyZWF0ZUl0ZW0gPSBjcmVhdGVJdGVtO1xuTGlzdC5wcm90b3R5cGUuY3JlYXRlSXRlbSA9IGNyZWF0ZUl0ZW07XG5cbkxpc3QucHJvdG90eXBlLnVwZGF0ZUN1cnNvcnMgPSBmdW5jdGlvbihwcmV2T2xkLCBwcmV2TmV3LCBuZXh0T2xkLCBuZXh0TmV3KSB7XG4gICAgdmFyIGN1cnNvciA9IHRoaXMuY3Vyc29yO1xuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoY3Vyc29yLnByZXYgPT09IHByZXZPbGQpIHtcbiAgICAgICAgICAgIGN1cnNvci5wcmV2ID0gcHJldk5ldztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJzb3IubmV4dCA9PT0gbmV4dE9sZCkge1xuICAgICAgICAgICAgY3Vyc29yLm5leHQgPSBuZXh0TmV3O1xuICAgICAgICB9XG5cbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLmN1cnNvcjtcbiAgICB9XG59O1xuXG5MaXN0LnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNpemUgPSAwO1xuICAgIHZhciBjdXJzb3IgPSB0aGlzLmhlYWQ7XG5cbiAgICB3aGlsZSAoY3Vyc29yKSB7XG4gICAgICAgIHNpemUrKztcbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemU7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5mcm9tQXJyYXkgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciBjdXJzb3IgPSBudWxsO1xuXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBjcmVhdGVJdGVtKGFycmF5W2ldKTtcblxuICAgICAgICBpZiAoY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjdXJzb3IubmV4dCA9IGl0ZW07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5wcmV2ID0gY3Vyc29yO1xuICAgICAgICBjdXJzb3IgPSBpdGVtO1xuICAgIH1cblxuICAgIHRoaXMudGFpbCA9IGN1cnNvcjtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjdXJzb3IgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKGN1cnNvcikge1xuICAgICAgICByZXN1bHQucHVzaChjdXJzb3IuZGF0YSk7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5MaXN0LnByb3RvdHlwZS50b0pTT04gPSBMaXN0LnByb3RvdHlwZS50b0FycmF5O1xuXG5MaXN0LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZCA9PT0gbnVsbDtcbn07XG5cbkxpc3QucHJvdG90eXBlLmZpcnN0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZCAmJiB0aGlzLmhlYWQuZGF0YTtcbn07XG5cbkxpc3QucHJvdG90eXBlLmxhc3QgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50YWlsICYmIHRoaXMudGFpbC5kYXRhO1xufTtcblxuTGlzdC5wcm90b3R5cGUuZWFjaCA9IGZ1bmN0aW9uKGZuLCBjb250ZXh0KSB7XG4gICAgdmFyIGl0ZW07XG5cbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIH1cblxuICAgIC8vIHB1c2ggY3Vyc29yXG4gICAgdmFyIGN1cnNvciA9IGFsbG9jYXRlQ3Vyc29yKHRoaXMsIG51bGwsIHRoaXMuaGVhZCk7XG5cbiAgICB3aGlsZSAoY3Vyc29yLm5leHQgIT09IG51bGwpIHtcbiAgICAgICAgaXRlbSA9IGN1cnNvci5uZXh0O1xuICAgICAgICBjdXJzb3IubmV4dCA9IGl0ZW0ubmV4dDtcblxuICAgICAgICBmbi5jYWxsKGNvbnRleHQsIGl0ZW0uZGF0YSwgaXRlbSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gcG9wIGN1cnNvclxuICAgIHJlbGVhc2VDdXJzb3IodGhpcyk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5mb3JFYWNoID0gTGlzdC5wcm90b3R5cGUuZWFjaDtcblxuTGlzdC5wcm90b3R5cGUuZWFjaFJpZ2h0ID0gZnVuY3Rpb24oZm4sIGNvbnRleHQpIHtcbiAgICB2YXIgaXRlbTtcblxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgfVxuXG4gICAgLy8gcHVzaCBjdXJzb3JcbiAgICB2YXIgY3Vyc29yID0gYWxsb2NhdGVDdXJzb3IodGhpcywgdGhpcy50YWlsLCBudWxsKTtcblxuICAgIHdoaWxlIChjdXJzb3IucHJldiAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtID0gY3Vyc29yLnByZXY7XG4gICAgICAgIGN1cnNvci5wcmV2ID0gaXRlbS5wcmV2O1xuXG4gICAgICAgIGZuLmNhbGwoY29udGV4dCwgaXRlbS5kYXRhLCBpdGVtLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBwb3AgY3Vyc29yXG4gICAgcmVsZWFzZUN1cnNvcih0aGlzKTtcbn07XG5cbkxpc3QucHJvdG90eXBlLmZvckVhY2hSaWdodCA9IExpc3QucHJvdG90eXBlLmVhY2hSaWdodDtcblxuTGlzdC5wcm90b3R5cGUubmV4dFVudGlsID0gZnVuY3Rpb24oc3RhcnQsIGZuLCBjb250ZXh0KSB7XG4gICAgaWYgKHN0YXJ0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbTtcblxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgfVxuXG4gICAgLy8gcHVzaCBjdXJzb3JcbiAgICB2YXIgY3Vyc29yID0gYWxsb2NhdGVDdXJzb3IodGhpcywgbnVsbCwgc3RhcnQpO1xuXG4gICAgd2hpbGUgKGN1cnNvci5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0gPSBjdXJzb3IubmV4dDtcbiAgICAgICAgY3Vyc29yLm5leHQgPSBpdGVtLm5leHQ7XG5cbiAgICAgICAgaWYgKGZuLmNhbGwoY29udGV4dCwgaXRlbS5kYXRhLCBpdGVtLCB0aGlzKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwb3AgY3Vyc29yXG4gICAgcmVsZWFzZUN1cnNvcih0aGlzKTtcbn07XG5cbkxpc3QucHJvdG90eXBlLnByZXZVbnRpbCA9IGZ1bmN0aW9uKHN0YXJ0LCBmbiwgY29udGV4dCkge1xuICAgIGlmIChzdGFydCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGl0ZW07XG5cbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIH1cblxuICAgIC8vIHB1c2ggY3Vyc29yXG4gICAgdmFyIGN1cnNvciA9IGFsbG9jYXRlQ3Vyc29yKHRoaXMsIHN0YXJ0LCBudWxsKTtcblxuICAgIHdoaWxlIChjdXJzb3IucHJldiAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtID0gY3Vyc29yLnByZXY7XG4gICAgICAgIGN1cnNvci5wcmV2ID0gaXRlbS5wcmV2O1xuXG4gICAgICAgIGlmIChmbi5jYWxsKGNvbnRleHQsIGl0ZW0uZGF0YSwgaXRlbSwgdGhpcykpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcG9wIGN1cnNvclxuICAgIHJlbGVhc2VDdXJzb3IodGhpcyk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24oZm4sIGNvbnRleHQpIHtcbiAgICB2YXIgY3Vyc29yID0gdGhpcy5oZWFkO1xuXG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZXh0ID0gdGhpcztcbiAgICB9XG5cbiAgICB3aGlsZSAoY3Vyc29yICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChmbi5jYWxsKGNvbnRleHQsIGN1cnNvci5kYXRhLCBjdXJzb3IsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbkxpc3QucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKGZuLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0KCk7XG4gICAgdmFyIGN1cnNvciA9IHRoaXMuaGVhZDtcblxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQuYXBwZW5kRGF0YShmbi5jYWxsKGNvbnRleHQsIGN1cnNvci5kYXRhLCBjdXJzb3IsIHRoaXMpKTtcbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkxpc3QucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uKGZuLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0KCk7XG4gICAgdmFyIGN1cnNvciA9IHRoaXMuaGVhZDtcblxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoZm4uY2FsbChjb250ZXh0LCBjdXJzb3IuZGF0YSwgY3Vyc29yLCB0aGlzKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZERhdGEoY3Vyc29yLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbn07XG5cbkxpc3QucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IExpc3QoKTtcbiAgICB2YXIgY3Vyc29yID0gdGhpcy5oZWFkO1xuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQuaW5zZXJ0KGNyZWF0ZUl0ZW0oY3Vyc29yLmRhdGEpKTtcbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkxpc3QucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgLy8gICAgICBoZWFkXG4gICAgLy8gICAgXlxuICAgIC8vIGl0ZW1cbiAgICB0aGlzLnVwZGF0ZUN1cnNvcnMobnVsbCwgaXRlbSwgdGhpcy5oZWFkLCBpdGVtKTtcblxuICAgIC8vIGluc2VydCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG4gICAgaWYgKHRoaXMuaGVhZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBuZXcgaXRlbSA8LSBmaXJzdCBpdGVtXG4gICAgICAgIHRoaXMuaGVhZC5wcmV2ID0gaXRlbTtcblxuICAgICAgICAvLyBuZXcgaXRlbSAtPiBmaXJzdCBpdGVtXG4gICAgICAgIGl0ZW0ubmV4dCA9IHRoaXMuaGVhZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBsaXN0IGhhcyBubyBoZWFkLCB0aGVuIGl0IGFsc28gaGFzIG5vIHRhaWxcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRhaWwgcG9pbnRzIHRvIHRoZSBuZXcgaXRlbVxuICAgICAgICB0aGlzLnRhaWwgPSBpdGVtO1xuICAgIH1cblxuICAgIC8vIGhlYWQgYWx3YXlzIHBvaW50cyB0byBuZXcgaXRlbVxuICAgIHRoaXMuaGVhZCA9IGl0ZW07XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbkxpc3QucHJvdG90eXBlLnByZXBlbmREYXRhID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnByZXBlbmQoY3JlYXRlSXRlbShkYXRhKSk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGl0ZW0pO1xufTtcblxuTGlzdC5wcm90b3R5cGUuYXBwZW5kRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQoY3JlYXRlSXRlbShkYXRhKSk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihpdGVtLCBiZWZvcmUpIHtcbiAgICBpZiAoYmVmb3JlICE9PSB1bmRlZmluZWQgJiYgYmVmb3JlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIHByZXYgICBiZWZvcmVcbiAgICAgICAgLy8gICAgICBeXG4gICAgICAgIC8vICAgICBpdGVtXG4gICAgICAgIHRoaXMudXBkYXRlQ3Vyc29ycyhiZWZvcmUucHJldiwgaXRlbSwgYmVmb3JlLCBpdGVtKTtcblxuICAgICAgICBpZiAoYmVmb3JlLnByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGluc2VydCB0byB0aGUgYmVnaW5uaW5nIG9mIGxpc3RcbiAgICAgICAgICAgIGlmICh0aGlzLmhlYWQgIT09IGJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmVmb3JlIGRvZXNuXFwndCBiZWxvbmcgdG8gbGlzdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzaW5jZSBoZWFkIHBvaW50cyB0byBiZWZvcmUgdGhlcmVmb3JlIGxpc3QgZG9lc24ndCBlbXB0eVxuICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBjaGVjayB0YWlsXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBpdGVtO1xuICAgICAgICAgICAgYmVmb3JlLnByZXYgPSBpdGVtO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gYmVmb3JlO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnNvcnMobnVsbCwgaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIC8vIGluc2VydCBiZXR3ZWVuIHR3byBpdGVtc1xuICAgICAgICAgICAgYmVmb3JlLnByZXYubmV4dCA9IGl0ZW07XG4gICAgICAgICAgICBpdGVtLnByZXYgPSBiZWZvcmUucHJldjtcblxuICAgICAgICAgICAgYmVmb3JlLnByZXYgPSBpdGVtO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gYmVmb3JlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGFpbFxuICAgICAgICAvLyAgICAgIF5cbiAgICAgICAgLy8gICAgICBpdGVtXG4gICAgICAgIHRoaXMudXBkYXRlQ3Vyc29ycyh0aGlzLnRhaWwsIGl0ZW0sIG51bGwsIGl0ZW0pO1xuXG4gICAgICAgIC8vIGluc2VydCB0byB0aGUgZW5kaW5nIG9mIHRoZSBsaXN0XG4gICAgICAgIGlmICh0aGlzLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGxhc3QgaXRlbSAtPiBuZXcgaXRlbVxuICAgICAgICAgICAgdGhpcy50YWlsLm5leHQgPSBpdGVtO1xuXG4gICAgICAgICAgICAvLyBsYXN0IGl0ZW0gPC0gbmV3IGl0ZW1cbiAgICAgICAgICAgIGl0ZW0ucHJldiA9IHRoaXMudGFpbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIGxpc3QgaGFzIG5vIHRhaWwsIHRoZW4gaXQgYWxzbyBoYXMgbm8gaGVhZFxuICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIGhlYWQgcG9pbnRzIHRvIG5ldyBpdGVtXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFpbCBhbHdheXMgcG9pbnRzIHRvIG5ldyBpdGVtXG4gICAgICAgIHRoaXMudGFpbCA9IGl0ZW07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5pbnNlcnREYXRhID0gZnVuY3Rpb24oZGF0YSwgYmVmb3JlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGNyZWF0ZUl0ZW0oZGF0YSksIGJlZm9yZSk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgLy8gICAgICBpdGVtXG4gICAgLy8gICAgICAgXlxuICAgIC8vIHByZXYgICAgIG5leHRcbiAgICB0aGlzLnVwZGF0ZUN1cnNvcnMoaXRlbSwgaXRlbS5wcmV2LCBpdGVtLCBpdGVtLm5leHQpO1xuXG4gICAgaWYgKGl0ZW0ucHJldiAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtLnByZXYubmV4dCA9IGl0ZW0ubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5oZWFkICE9PSBpdGVtKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2l0ZW0gZG9lc25cXCd0IGJlbG9uZyB0byBsaXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlYWQgPSBpdGVtLm5leHQ7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0ubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtLm5leHQucHJldiA9IGl0ZW0ucHJldjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy50YWlsICE9PSBpdGVtKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2l0ZW0gZG9lc25cXCd0IGJlbG9uZyB0byBsaXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRhaWwgPSBpdGVtLnByZXY7XG4gICAgfVxuXG4gICAgaXRlbS5wcmV2ID0gbnVsbDtcbiAgICBpdGVtLm5leHQgPSBudWxsO1xuXG4gICAgcmV0dXJuIGl0ZW07XG59O1xuXG5MaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHRoaXMuaW5zZXJ0KGNyZWF0ZUl0ZW0oZGF0YSkpO1xufTtcblxuTGlzdC5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUodGhpcy50YWlsKTtcbiAgICB9XG59O1xuXG5MaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHRoaXMucHJlcGVuZChjcmVhdGVJdGVtKGRhdGEpKTtcbn07XG5cbkxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaGVhZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUodGhpcy5oZWFkKTtcbiAgICB9XG59O1xuXG5MaXN0LnByb3RvdHlwZS5wcmVwZW5kTGlzdCA9IGZ1bmN0aW9uKGxpc3QpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRMaXN0KGxpc3QsIHRoaXMuaGVhZCk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5hcHBlbmRMaXN0ID0gZnVuY3Rpb24obGlzdCkge1xuICAgIHJldHVybiB0aGlzLmluc2VydExpc3QobGlzdCk7XG59O1xuXG5MaXN0LnByb3RvdHlwZS5pbnNlcnRMaXN0ID0gZnVuY3Rpb24obGlzdCwgYmVmb3JlKSB7XG4gICAgLy8gaWdub3JlIGVtcHR5IGxpc3RzXG4gICAgaWYgKGxpc3QuaGVhZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoYmVmb3JlICE9PSB1bmRlZmluZWQgJiYgYmVmb3JlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3Vyc29ycyhiZWZvcmUucHJldiwgbGlzdC50YWlsLCBiZWZvcmUsIGxpc3QuaGVhZCk7XG5cbiAgICAgICAgLy8gaW5zZXJ0IGluIHRoZSBtaWRkbGUgb2YgZGlzdCBsaXN0XG4gICAgICAgIGlmIChiZWZvcmUucHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gYmVmb3JlLnByZXYgPC0+IGxpc3QuaGVhZFxuICAgICAgICAgICAgYmVmb3JlLnByZXYubmV4dCA9IGxpc3QuaGVhZDtcbiAgICAgICAgICAgIGxpc3QuaGVhZC5wcmV2ID0gYmVmb3JlLnByZXY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBsaXN0LmhlYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBiZWZvcmUucHJldiA9IGxpc3QudGFpbDtcbiAgICAgICAgbGlzdC50YWlsLm5leHQgPSBiZWZvcmU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJzb3JzKHRoaXMudGFpbCwgbGlzdC50YWlsLCBudWxsLCBsaXN0LmhlYWQpO1xuXG4gICAgICAgIC8vIGluc2VydCB0byBlbmQgb2YgdGhlIGxpc3RcbiAgICAgICAgaWYgKHRoaXMudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaWYgZGVzdGluYXRpb24gbGlzdCBoYXMgYSB0YWlsLCB0aGVuIGl0IGFsc28gaGFzIGEgaGVhZCxcbiAgICAgICAgICAgIC8vIGJ1dCBoZWFkIGRvZXNuJ3QgY2hhbmdlXG5cbiAgICAgICAgICAgIC8vIGRlc3QgdGFpbCAtPiBzb3VyY2UgaGVhZFxuICAgICAgICAgICAgdGhpcy50YWlsLm5leHQgPSBsaXN0LmhlYWQ7XG5cbiAgICAgICAgICAgIC8vIGRlc3QgdGFpbCA8LSBzb3VyY2UgaGVhZFxuICAgICAgICAgICAgbGlzdC5oZWFkLnByZXYgPSB0aGlzLnRhaWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBsaXN0IGhhcyBubyBhIHRhaWwsIHRoZW4gaXQgYWxzbyBoYXMgbm8gYSBoZWFkXG4gICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UgcG9pbnRzIGhlYWQgdG8gbmV3IGl0ZW1cbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IGxpc3QuaGVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRhaWwgYWx3YXlzIHN0YXJ0IHBvaW50IHRvIG5ldyBpdGVtXG4gICAgICAgIHRoaXMudGFpbCA9IGxpc3QudGFpbDtcbiAgICB9XG5cbiAgICBsaXN0LmhlYWQgPSBudWxsO1xuICAgIGxpc3QudGFpbCA9IG51bGw7XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbkxpc3QucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbihvbGRJdGVtLCBuZXdJdGVtT3JMaXN0KSB7XG4gICAgaWYgKCdoZWFkJyBpbiBuZXdJdGVtT3JMaXN0KSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0TGlzdChuZXdJdGVtT3JMaXN0LCBvbGRJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc2VydChuZXdJdGVtT3JMaXN0LCBvbGRJdGVtKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZShvbGRJdGVtKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNyZWF0ZUN1c3RvbUVycm9yID0gcmVxdWlyZSgnLi4vdXRpbHMvY3JlYXRlQ3VzdG9tRXJyb3InKTtcbnZhciBNQVhfTElORV9MRU5HVEggPSAxMDA7XG52YXIgT0ZGU0VUX0NPUlJFQ1RJT04gPSA2MDtcbnZhciBUQUJfUkVQTEFDRU1FTlQgPSAnICAgICc7XG5cbmZ1bmN0aW9uIHNvdXJjZUZyYWdtZW50KGVycm9yLCBleHRyYUxpbmVzKSB7XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0xpbmVzKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIGxpbmVzLnNsaWNlKHN0YXJ0LCBlbmQpLm1hcChmdW5jdGlvbihsaW5lLCBpZHgpIHtcbiAgICAgICAgICAgIHZhciBudW0gPSBTdHJpbmcoc3RhcnQgKyBpZHggKyAxKTtcblxuICAgICAgICAgICAgd2hpbGUgKG51bS5sZW5ndGggPCBtYXhOdW1MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBudW0gPSAnICcgKyBudW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW0gKyAnIHwnICsgbGluZTtcbiAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgdmFyIGxpbmVzID0gZXJyb3Iuc291cmNlLnNwbGl0KC9cXHJcXG4/fFxcbnxcXGYvKTtcbiAgICB2YXIgbGluZSA9IGVycm9yLmxpbmU7XG4gICAgdmFyIGNvbHVtbiA9IGVycm9yLmNvbHVtbjtcbiAgICB2YXIgc3RhcnRMaW5lID0gTWF0aC5tYXgoMSwgbGluZSAtIGV4dHJhTGluZXMpIC0gMTtcbiAgICB2YXIgZW5kTGluZSA9IE1hdGgubWluKGxpbmUgKyBleHRyYUxpbmVzLCBsaW5lcy5sZW5ndGggKyAxKTtcbiAgICB2YXIgbWF4TnVtTGVuZ3RoID0gTWF0aC5tYXgoNCwgU3RyaW5nKGVuZExpbmUpLmxlbmd0aCkgKyAxO1xuICAgIHZhciBjdXRMZWZ0ID0gMDtcblxuICAgIC8vIGNvbHVtbiBjb3JyZWN0aW9uIGFjY29yZGluZyB0byByZXBsYWNlZCB0YWIgYmVmb3JlIGNvbHVtblxuICAgIGNvbHVtbiArPSAoVEFCX1JFUExBQ0VNRU5ULmxlbmd0aCAtIDEpICogKGxpbmVzW2xpbmUgLSAxXS5zdWJzdHIoMCwgY29sdW1uIC0gMSkubWF0Y2goL1xcdC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgaWYgKGNvbHVtbiA+IE1BWF9MSU5FX0xFTkdUSCkge1xuICAgICAgICBjdXRMZWZ0ID0gY29sdW1uIC0gT0ZGU0VUX0NPUlJFQ1RJT04gKyAzO1xuICAgICAgICBjb2x1bW4gPSBPRkZTRVRfQ09SUkVDVElPTiAtIDI7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDwgbGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmVzW2ldLnJlcGxhY2UoL1xcdC9nLCBUQUJfUkVQTEFDRU1FTlQpO1xuICAgICAgICAgICAgbGluZXNbaV0gPVxuICAgICAgICAgICAgICAgIChjdXRMZWZ0ID4gMCAmJiBsaW5lc1tpXS5sZW5ndGggPiBjdXRMZWZ0ID8gJ1xcdTIwMjYnIDogJycpICtcbiAgICAgICAgICAgICAgICBsaW5lc1tpXS5zdWJzdHIoY3V0TGVmdCwgTUFYX0xJTkVfTEVOR1RIIC0gMikgK1xuICAgICAgICAgICAgICAgIChsaW5lc1tpXS5sZW5ndGggPiBjdXRMZWZ0ICsgTUFYX0xJTkVfTEVOR1RIIC0gMSA/ICdcXHUyMDI2JyA6ICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAgIHByb2Nlc3NMaW5lcyhzdGFydExpbmUsIGxpbmUpLFxuICAgICAgICBuZXcgQXJyYXkoY29sdW1uICsgbWF4TnVtTGVuZ3RoICsgMikuam9pbignLScpICsgJ14nLFxuICAgICAgICBwcm9jZXNzTGluZXMobGluZSwgZW5kTGluZSlcbiAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcbn1cblxudmFyIENzc1N5bnRheEVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgc291cmNlLCBvZmZzZXQsIGxpbmUsIGNvbHVtbikge1xuICAgIHZhciBlcnJvciA9IGNyZWF0ZUN1c3RvbUVycm9yKCdDc3NTeW50YXhFcnJvcicsIG1lc3NhZ2UpO1xuXG4gICAgZXJyb3Iuc291cmNlID0gc291cmNlO1xuICAgIGVycm9yLm9mZnNldCA9IG9mZnNldDtcbiAgICBlcnJvci5saW5lID0gbGluZTtcbiAgICBlcnJvci5jb2x1bW4gPSBjb2x1bW47XG5cbiAgICBlcnJvci5zb3VyY2VGcmFnbWVudCA9IGZ1bmN0aW9uKGV4dHJhTGluZXMpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUZyYWdtZW50KGVycm9yLCBpc05hTihleHRyYUxpbmVzKSA/IDAgOiBleHRyYUxpbmVzKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2Zvcm1hdHRlZE1lc3NhZ2UnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICdQYXJzZSBlcnJvcjogJyArIGVycm9yLm1lc3NhZ2UgKyAnXFxuJyArXG4gICAgICAgICAgICAgICAgc291cmNlRnJhZ21lbnQoZXJyb3IsIDIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmb3IgYmFja3dhcmQgY2FwYWJpbGl0eVxuICAgIGVycm9yLnBhcnNlRXJyb3IgPSB7XG4gICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICBsaW5lOiBsaW5lLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgIH07XG5cbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENzc1N5bnRheEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdCcpO1xudmFyIFBVTkNUVUFUSU9OID0gY29uc3RhbnRzLlBVTkNUVUFUSU9OO1xudmFyIFNUT1BfVVJMX1JBVyA9IGNvbnN0YW50cy5TVE9QX1VSTF9SQVc7XG52YXIgVFlQRSA9IGNvbnN0YW50cy5UWVBFO1xudmFyIEZVTExTVE9QID0gVFlQRS5GdWxsU3RvcDtcbnZhciBQTFVTU0lHTiA9IFRZUEUuUGx1c1NpZ247XG52YXIgSFlQSEVOTUlOVVMgPSBUWVBFLkh5cGhlbk1pbnVzO1xudmFyIFBVTkNUVUFUT1IgPSBUWVBFLlB1bmN0dWF0b3I7XG52YXIgVEFCID0gOTtcbnZhciBOID0gMTA7XG52YXIgRiA9IDEyO1xudmFyIFIgPSAxMztcbnZhciBTUEFDRSA9IDMyO1xudmFyIEJBQ0tfU0xBU0ggPSA5MjtcbnZhciBFID0gMTAxOyAvLyAnZScuY2hhckNvZGVBdCgwKVxuXG5mdW5jdGlvbiBmaXJzdENoYXJPZmZzZXQoc291cmNlKSB7XG4gICAgLy8gZGV0ZWN0IEJPTSAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnl0ZV9vcmRlcl9tYXJrKVxuICAgIGlmIChzb3VyY2UuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGIHx8ICAvLyBVVEYtMTZCRVxuICAgICAgICBzb3VyY2UuY2hhckNvZGVBdCgwKSA9PT0gMHhGRkZFKSB7ICAvLyBVVEYtMTZMRVxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gaXNIZXgoY29kZSkge1xuICAgIHJldHVybiAoY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3KSB8fCAvLyAwIC4uIDlcbiAgICAgICAgICAgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA3MCkgfHwgLy8gQSAuLiBGXG4gICAgICAgICAgIChjb2RlID49IDk3ICYmIGNvZGUgPD0gMTAyKTsgIC8vIGEgLi4gZlxufVxuXG5mdW5jdGlvbiBpc051bWJlcihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nztcbn1cblxuZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PT0gU1BBQ0UgfHwgY29kZSA9PT0gVEFCIHx8IGlzTmV3bGluZShjb2RlKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdsaW5lKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PT0gUiB8fCBjb2RlID09PSBOIHx8IGNvZGUgPT09IEY7XG59XG5cbmZ1bmN0aW9uIGdldE5ld2xpbmVMZW5ndGgoc291cmNlLCBvZmZzZXQsIGNvZGUpIHtcbiAgICBpZiAoaXNOZXdsaW5lKGNvZGUpKSB7XG4gICAgICAgIGlmIChjb2RlID09PSBSICYmIG9mZnNldCArIDEgPCBzb3VyY2UubGVuZ3RoICYmIHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCArIDEpID09PSBOKSB7XG4gICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBjbXBDaGFyKHRlc3RTdHIsIG9mZnNldCwgcmVmZXJlbmNlQ29kZSkge1xuICAgIHZhciBjb2RlID0gdGVzdFN0ci5jaGFyQ29kZUF0KG9mZnNldCk7XG5cbiAgICAvLyBjb2RlLnRvTG93ZXJDYXNlKCkgZm9yIEEuLlpcbiAgICBpZiAoY29kZSA+PSA2NSAmJiBjb2RlIDw9IDkwKSB7XG4gICAgICAgIGNvZGUgPSBjb2RlIHwgMzI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZGUgPT09IHJlZmVyZW5jZUNvZGU7XG59XG5cbmZ1bmN0aW9uIGNtcFN0cih0ZXN0U3RyLCBzdGFydCwgZW5kLCByZWZlcmVuY2VTdHIpIHtcbiAgICBpZiAoZW5kIC0gc3RhcnQgIT09IHJlZmVyZW5jZVN0ci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGVzdFN0ci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIHZhciB0ZXN0Q29kZSA9IHRlc3RTdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgdmFyIHJlZkNvZGUgPSByZWZlcmVuY2VTdHIuY2hhckNvZGVBdChpIC0gc3RhcnQpO1xuXG4gICAgICAgIC8vIHRlc3RDb2RlLnRvTG93ZXJDYXNlKCkgZm9yIEEuLlpcbiAgICAgICAgaWYgKHRlc3RDb2RlID49IDY1ICYmIHRlc3RDb2RlIDw9IDkwKSB7XG4gICAgICAgICAgICB0ZXN0Q29kZSA9IHRlc3RDb2RlIHwgMzI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdENvZGUgIT09IHJlZkNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmaW5kV2hpdGVTcGFjZVN0YXJ0KHNvdXJjZSwgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKG9mZnNldCA+PSAwICYmIGlzV2hpdGVTcGFjZShzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQpKSkge1xuICAgICAgICBvZmZzZXQtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgMTtcbn1cblxuZnVuY3Rpb24gZmluZFdoaXRlU3BhY2VFbmQoc291cmNlLCBvZmZzZXQpIHtcbiAgICB3aGlsZSAob2Zmc2V0IDwgc291cmNlLmxlbmd0aCAmJiBpc1doaXRlU3BhY2Uoc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KSkpIHtcbiAgICAgICAgb2Zmc2V0Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldDtcbn1cblxuZnVuY3Rpb24gZmluZENvbW1lbnRFbmQoc291cmNlLCBvZmZzZXQpIHtcbiAgICB2YXIgY29tbWVudEVuZCA9IHNvdXJjZS5pbmRleE9mKCcqLycsIG9mZnNldCk7XG5cbiAgICBpZiAoY29tbWVudEVuZCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1lbnRFbmQgKyAyO1xufVxuXG5mdW5jdGlvbiBmaW5kU3RyaW5nRW5kKHNvdXJjZSwgb2Zmc2V0LCBxdW90ZSkge1xuICAgIGZvciAoOyBvZmZzZXQgPCBzb3VyY2UubGVuZ3RoOyBvZmZzZXQrKykge1xuICAgICAgICB2YXIgY29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCk7XG5cbiAgICAgICAgLy8gVE9ETzogYmFkIHN0cmluZ1xuICAgICAgICBpZiAoY29kZSA9PT0gQkFDS19TTEFTSCkge1xuICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gcXVvdGUpIHtcbiAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBmaW5kRGVjaW1hbE51bWJlckVuZChzb3VyY2UsIG9mZnNldCkge1xuICAgIHdoaWxlIChvZmZzZXQgPCBzb3VyY2UubGVuZ3RoICYmIGlzTnVtYmVyKHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCkpKSB7XG4gICAgICAgIG9mZnNldCsrO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmROdW1iZXJFbmQoc291cmNlLCBvZmZzZXQsIGFsbG93RnJhY3Rpb24pIHtcbiAgICB2YXIgY29kZTtcblxuICAgIG9mZnNldCA9IGZpbmREZWNpbWFsTnVtYmVyRW5kKHNvdXJjZSwgb2Zmc2V0KTtcblxuICAgIC8vIGZyYWN0aW9uOiAuXFxkK1xuICAgIGlmIChhbGxvd0ZyYWN0aW9uICYmIG9mZnNldCArIDEgPCBzb3VyY2UubGVuZ3RoICYmIHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCkgPT09IEZVTExTVE9QKSB7XG4gICAgICAgIGNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQgKyAxKTtcblxuICAgICAgICBpZiAoaXNOdW1iZXIoY29kZSkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IGZpbmREZWNpbWFsTnVtYmVyRW5kKHNvdXJjZSwgb2Zmc2V0ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBvbmVudDogZVsrLV1cXGQrXG4gICAgaWYgKG9mZnNldCArIDEgPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgIGlmICgoc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KSB8IDMyKSA9PT0gRSkgeyAvLyBjYXNlIGluc2Vuc2l0aXZlIGNoZWNrIGZvciBgZWBcbiAgICAgICAgICAgIGNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQgKyAxKTtcblxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IFBMVVNTSUdOIHx8IGNvZGUgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDIgPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihjb2RlKSkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGZpbmREZWNpbWFsTnVtYmVyRW5kKHNvdXJjZSwgb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG4vLyBza2lwIGVzY2FwZWQgdW5pY29kZSBzZXF1ZW5jZSB0aGF0IGNhbiBlbmRzIHdpdGggc3BhY2Vcbi8vIFswLTlhLWZdezEsNn0oXFxyXFxufFsgXFxuXFxyXFx0XFxmXSk/XG5mdW5jdGlvbiBmaW5kRXNjYXBlRW5kKHNvdXJjZSwgb2Zmc2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA3ICYmIG9mZnNldCArIGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQgKyBpKTtcblxuICAgICAgICBpZiAoaSAhPT0gNiAmJiBpc0hleChjb2RlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIG9mZnNldCArPSBpIC0gMSArIGdldE5ld2xpbmVMZW5ndGgoc291cmNlLCBvZmZzZXQgKyBpLCBjb2RlKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBTUEFDRSB8fCBjb2RlID09PSBUQUIpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJZGVudGlmaWVyRW5kKHNvdXJjZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7IG9mZnNldCA8IHNvdXJjZS5sZW5ndGg7IG9mZnNldCsrKSB7XG4gICAgICAgIHZhciBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KTtcblxuICAgICAgICBpZiAoY29kZSA9PT0gQkFDS19TTEFTSCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZmluZEVzY2FwZUVuZChzb3VyY2UsIG9mZnNldCArIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweDgwICYmIFBVTkNUVUFUSU9OW2NvZGVdID09PSBQVU5DVFVBVE9SKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRVcmxSYXdFbmQoc291cmNlLCBvZmZzZXQpIHtcbiAgICBmb3IgKDsgb2Zmc2V0IDwgc291cmNlLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChvZmZzZXQpO1xuXG4gICAgICAgIGlmIChjb2RlID09PSBCQUNLX1NMQVNIKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBmaW5kRXNjYXBlRW5kKHNvdXJjZSwgb2Zmc2V0ICsgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4ODAgJiYgU1RPUF9VUkxfUkFXW2NvZGVdID09PSAxKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZpcnN0Q2hhck9mZnNldDogZmlyc3RDaGFyT2Zmc2V0LFxuXG4gICAgaXNIZXg6IGlzSGV4LFxuICAgIGlzTnVtYmVyOiBpc051bWJlcixcbiAgICBpc1doaXRlU3BhY2U6IGlzV2hpdGVTcGFjZSxcbiAgICBpc05ld2xpbmU6IGlzTmV3bGluZSxcbiAgICBnZXROZXdsaW5lTGVuZ3RoOiBnZXROZXdsaW5lTGVuZ3RoLFxuXG4gICAgY21wQ2hhcjogY21wQ2hhcixcbiAgICBjbXBTdHI6IGNtcFN0cixcblxuICAgIGZpbmRXaGl0ZVNwYWNlU3RhcnQ6IGZpbmRXaGl0ZVNwYWNlU3RhcnQsXG4gICAgZmluZFdoaXRlU3BhY2VFbmQ6IGZpbmRXaGl0ZVNwYWNlRW5kLFxuICAgIGZpbmRDb21tZW50RW5kOiBmaW5kQ29tbWVudEVuZCxcbiAgICBmaW5kU3RyaW5nRW5kOiBmaW5kU3RyaW5nRW5kLFxuICAgIGZpbmREZWNpbWFsTnVtYmVyRW5kOiBmaW5kRGVjaW1hbE51bWJlckVuZCxcbiAgICBmaW5kTnVtYmVyRW5kOiBmaW5kTnVtYmVyRW5kLFxuICAgIGZpbmRFc2NhcGVFbmQ6IGZpbmRFc2NhcGVFbmQsXG4gICAgZmluZElkZW50aWZpZXJFbmQ6IGZpbmRJZGVudGlmaWVyRW5kLFxuICAgIGZpbmRVcmxSYXdFbmQ6IGZpbmRVcmxSYXdFbmRcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDc3NTeW50YXhFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKTtcblxudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3QnKTtcbnZhciBUWVBFID0gY29uc3RhbnRzLlRZUEU7XG52YXIgTkFNRSA9IGNvbnN0YW50cy5OQU1FO1xudmFyIFNZTUJPTF9UWVBFID0gY29uc3RhbnRzLlNZTUJPTF9UWVBFO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZmlyc3RDaGFyT2Zmc2V0ID0gdXRpbHMuZmlyc3RDaGFyT2Zmc2V0O1xudmFyIGNtcFN0ciA9IHV0aWxzLmNtcFN0cjtcbnZhciBpc051bWJlciA9IHV0aWxzLmlzTnVtYmVyO1xudmFyIGZpbmRXaGl0ZVNwYWNlU3RhcnQgPSB1dGlscy5maW5kV2hpdGVTcGFjZVN0YXJ0O1xudmFyIGZpbmRXaGl0ZVNwYWNlRW5kID0gdXRpbHMuZmluZFdoaXRlU3BhY2VFbmQ7XG52YXIgZmluZENvbW1lbnRFbmQgPSB1dGlscy5maW5kQ29tbWVudEVuZDtcbnZhciBmaW5kU3RyaW5nRW5kID0gdXRpbHMuZmluZFN0cmluZ0VuZDtcbnZhciBmaW5kTnVtYmVyRW5kID0gdXRpbHMuZmluZE51bWJlckVuZDtcbnZhciBmaW5kSWRlbnRpZmllckVuZCA9IHV0aWxzLmZpbmRJZGVudGlmaWVyRW5kO1xudmFyIGZpbmRVcmxSYXdFbmQgPSB1dGlscy5maW5kVXJsUmF3RW5kO1xuXG52YXIgTlVMTCA9IDA7XG52YXIgV0hJVEVTUEFDRSA9IFRZUEUuV2hpdGVTcGFjZTtcbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIE5VTUJFUiA9IFRZUEUuTnVtYmVyO1xudmFyIFNUUklORyA9IFRZUEUuU3RyaW5nO1xudmFyIENPTU1FTlQgPSBUWVBFLkNvbW1lbnQ7XG52YXIgUFVOQ1RVQVRPUiA9IFRZUEUuUHVuY3R1YXRvcjtcbnZhciBDRE8gPSBUWVBFLkNETztcbnZhciBDREMgPSBUWVBFLkNEQztcbnZhciBBVEtFWVdPUkQgPSBUWVBFLkF0S2V5d29yZDtcbnZhciBGVU5DVElPTiA9IFRZUEUuRnVuY3Rpb247XG52YXIgVVJMID0gVFlQRS5Vcmw7XG52YXIgUkFXID0gVFlQRS5SYXc7XG5cbnZhciBOID0gMTA7XG52YXIgRiA9IDEyO1xudmFyIFIgPSAxMztcbnZhciBTVEFSID0gVFlQRS5Bc3RlcmlzaztcbnZhciBTTEFTSCA9IFRZUEUuU29saWR1cztcbnZhciBGVUxMU1RPUCA9IFRZUEUuRnVsbFN0b3A7XG52YXIgUExVU1NJR04gPSBUWVBFLlBsdXNTaWduO1xudmFyIEhZUEhFTk1JTlVTID0gVFlQRS5IeXBoZW5NaW51cztcbnZhciBHUkVBVEVSVEhBTlNJR04gPSBUWVBFLkdyZWF0ZXJUaGFuU2lnbjtcbnZhciBMRVNTVEhBTlNJR04gPSBUWVBFLkxlc3NUaGFuU2lnbjtcbnZhciBFWENMQU1BVElPTk1BUksgPSBUWVBFLkV4Y2xhbWF0aW9uTWFyaztcbnZhciBDT01NRVJDSUFMQVQgPSBUWVBFLkNvbW1lcmNpYWxBdDtcbnZhciBRVU9UQVRJT05NQVJLID0gVFlQRS5RdW90YXRpb25NYXJrO1xudmFyIEFQT1NUUk9QSEUgPSBUWVBFLkFwb3N0cm9waGU7XG52YXIgTEVGVFBBUkVOVEhFU0lTID0gVFlQRS5MZWZ0UGFyZW50aGVzaXM7XG52YXIgUklHSFRQQVJFTlRIRVNJUyA9IFRZUEUuUmlnaHRQYXJlbnRoZXNpcztcbnZhciBMRUZUQ1VSTFlCUkFDS0VUID0gVFlQRS5MZWZ0Q3VybHlCcmFja2V0O1xudmFyIFJJR0hUQ1VSTFlCUkFDS0VUID0gVFlQRS5SaWdodEN1cmx5QnJhY2tldDtcbnZhciBMRUZUU1FVQVJFQlJBQ0tFVCA9IFRZUEUuTGVmdFNxdWFyZUJyYWNrZXQ7XG52YXIgUklHSFRTUVVBUkVCUkFDS0VUID0gVFlQRS5SaWdodFNxdWFyZUJyYWNrZXQ7XG5cbnZhciBNSU5fQlVGRkVSX1NJWkUgPSAxNiAqIDEwMjQ7XG52YXIgT0ZGU0VUX01BU0sgPSAweDAwRkZGRkZGO1xudmFyIFRZUEVfU0hJRlQgPSAyNDtcbnZhciBTYWZlVWludDMyQXJyYXkgPSB0eXBlb2YgVWludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDMyQXJyYXkgOiBBcnJheTsgLy8gZmFsbGJhY2sgb24gQXJyYXkgd2hlbiBUeXBlZEFycmF5IGlzIG5vdCBzdXBwb3J0ZWRcblxuZnVuY3Rpb24gY29tcHV0ZUxpbmVzQW5kQ29sdW1ucyh0b2tlbml6ZXIsIHNvdXJjZSkge1xuICAgIHZhciBzb3VyY2VMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgIHZhciBzdGFydCA9IGZpcnN0Q2hhck9mZnNldChzb3VyY2UpO1xuICAgIHZhciBsaW5lcyA9IHRva2VuaXplci5saW5lcztcbiAgICB2YXIgbGluZSA9IHRva2VuaXplci5zdGFydExpbmU7XG4gICAgdmFyIGNvbHVtbnMgPSB0b2tlbml6ZXIuY29sdW1ucztcbiAgICB2YXIgY29sdW1uID0gdG9rZW5pemVyLnN0YXJ0Q29sdW1uO1xuXG4gICAgaWYgKGxpbmVzID09PSBudWxsIHx8IGxpbmVzLmxlbmd0aCA8IHNvdXJjZUxlbmd0aCArIDEpIHtcbiAgICAgICAgbGluZXMgPSBuZXcgU2FmZVVpbnQzMkFycmF5KE1hdGgubWF4KHNvdXJjZUxlbmd0aCArIDEwMjQsIE1JTl9CVUZGRVJfU0laRSkpO1xuICAgICAgICBjb2x1bW5zID0gbmV3IFNhZmVVaW50MzJBcnJheShsaW5lcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IHNvdXJjZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgbGluZXNbaV0gPSBsaW5lO1xuICAgICAgICBjb2x1bW5zW2ldID0gY29sdW1uKys7XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IE4gfHwgY29kZSA9PT0gUiB8fCBjb2RlID09PSBGKSB7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gUiAmJiBpICsgMSA8IHNvdXJjZUxlbmd0aCAmJiBzb3VyY2UuY2hhckNvZGVBdChpICsgMSkgPT09IE4pIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lO1xuICAgICAgICAgICAgICAgIGNvbHVtbnNbaV0gPSBjb2x1bW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUrKztcbiAgICAgICAgICAgIGNvbHVtbiA9IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsaW5lc1tpXSA9IGxpbmU7XG4gICAgY29sdW1uc1tpXSA9IGNvbHVtbjtcblxuICAgIHRva2VuaXplci5saW5lc0Fuc0NvbHVtbnNDb21wdXRlZCA9IHRydWU7XG4gICAgdG9rZW5pemVyLmxpbmVzID0gbGluZXM7XG4gICAgdG9rZW5pemVyLmNvbHVtbnMgPSBjb2x1bW5zO1xufVxuXG5mdW5jdGlvbiB0b2tlbkxheW91dCh0b2tlbml6ZXIsIHNvdXJjZSwgc3RhcnRQb3MpIHtcbiAgICB2YXIgc291cmNlTGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB2YXIgb2Zmc2V0QW5kVHlwZSA9IHRva2VuaXplci5vZmZzZXRBbmRUeXBlO1xuICAgIHZhciBiYWxhbmNlID0gdG9rZW5pemVyLmJhbGFuY2U7XG4gICAgdmFyIHRva2VuQ291bnQgPSAwO1xuICAgIHZhciBwcmV2VHlwZSA9IDA7XG4gICAgdmFyIG9mZnNldCA9IHN0YXJ0UG9zO1xuICAgIHZhciBhbmNob3IgPSAwO1xuICAgIHZhciBiYWxhbmNlQ2xvc2VDb2RlID0gMDtcbiAgICB2YXIgYmFsYW5jZVN0YXJ0ID0gMDtcbiAgICB2YXIgYmFsYW5jZVByZXYgPSAwO1xuXG4gICAgaWYgKG9mZnNldEFuZFR5cGUgPT09IG51bGwgfHwgb2Zmc2V0QW5kVHlwZS5sZW5ndGggPCBzb3VyY2VMZW5ndGggKyAxKSB7XG4gICAgICAgIG9mZnNldEFuZFR5cGUgPSBuZXcgU2FmZVVpbnQzMkFycmF5KHNvdXJjZUxlbmd0aCArIDEwMjQpO1xuICAgICAgICBiYWxhbmNlID0gbmV3IFNhZmVVaW50MzJBcnJheShzb3VyY2VMZW5ndGggKyAxMDI0KTtcbiAgICB9XG5cbiAgICB3aGlsZSAob2Zmc2V0IDwgc291cmNlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KTtcbiAgICAgICAgdmFyIHR5cGUgPSBjb2RlIDwgMHg4MCA/IFNZTUJPTF9UWVBFW2NvZGVdIDogSURFTlRJRklFUjtcblxuICAgICAgICBiYWxhbmNlW3Rva2VuQ291bnRdID0gc291cmNlTGVuZ3RoO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXSElURVNQQUNFOlxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGZpbmRXaGl0ZVNwYWNlRW5kKHNvdXJjZSwgb2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUFVOQ1RVQVRPUjpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBiYWxhbmNlQ2xvc2VDb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVByZXYgPSBiYWxhbmNlU3RhcnQgJiBPRkZTRVRfTUFTSztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VTdGFydCA9IGJhbGFuY2VbYmFsYW5jZVByZXZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZUNsb3NlQ29kZSA9IGJhbGFuY2VTdGFydCA+PiBUWVBFX1NISUZUO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVt0b2tlbkNvdW50XSA9IGJhbGFuY2VQcmV2O1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVtiYWxhbmNlUHJldisrXSA9IHRva2VuQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgYmFsYW5jZVByZXYgPCB0b2tlbkNvdW50OyBiYWxhbmNlUHJldisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhbGFuY2VbYmFsYW5jZVByZXZdID09PSBzb3VyY2VMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVtiYWxhbmNlUHJldl0gPSB0b2tlbkNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVFNRVUFSRUJSQUNLRVQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlW3Rva2VuQ291bnRdID0gYmFsYW5jZVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZUNsb3NlQ29kZSA9IFJJR0hUU1FVQVJFQlJBQ0tFVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VTdGFydCA9IChiYWxhbmNlQ2xvc2VDb2RlIDw8IFRZUEVfU0hJRlQpIHwgdG9rZW5Db3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVENVUkxZQlJBQ0tFVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VbdG9rZW5Db3VudF0gPSBiYWxhbmNlU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlQ2xvc2VDb2RlID0gUklHSFRDVVJMWUJSQUNLRVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlU3RhcnQgPSAoYmFsYW5jZUNsb3NlQ29kZSA8PCBUWVBFX1NISUZUKSB8IHRva2VuQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlRQQVJFTlRIRVNJUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VbdG9rZW5Db3VudF0gPSBiYWxhbmNlU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlQ2xvc2VDb2RlID0gUklHSFRQQVJFTlRIRVNJUztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VTdGFydCA9IChiYWxhbmNlQ2xvc2VDb2RlIDw8IFRZUEVfU0hJRlQpIHwgdG9rZW5Db3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIC8qXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IFNUQVIgJiYgcHJldlR5cGUgPT09IFNMQVNIKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDT01NRU5UO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBmaW5kQ29tbWVudEVuZChzb3VyY2UsIG9mZnNldCArIDEpO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbkNvdW50LS07IC8vIHJld3JpdGUgcHJldiB0b2tlblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBlZGdlIGNhc2UgZm9yIC0uMTIzIGFuZCArLjEyM1xuICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBGVUxMU1RPUCAmJiAocHJldlR5cGUgPT09IFBMVVNTSUdOIHx8IHByZXZUeXBlID09PSBIWVBIRU5NSU5VUykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDEgPCBzb3VyY2VMZW5ndGggJiYgaXNOdW1iZXIoc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gTlVNQkVSO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZmluZE51bWJlckVuZChzb3VyY2UsIG9mZnNldCArIDIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuQ291bnQtLTsgLy8gcmV3cml0ZSBwcmV2IHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIDwhLS1cbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gRVhDTEFNQVRJT05NQVJLICYmIHByZXZUeXBlID09PSBMRVNTVEhBTlNJR04pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDIgPCBzb3VyY2VMZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCArIDEpID09PSBIWVBIRU5NSU5VUyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0ICsgMikgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0RPO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuQ291bnQtLTsgLy8gcmV3cml0ZSBwcmV2IHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIC0tPlxuICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBIWVBIRU5NSU5VUyAmJiBwcmV2VHlwZSA9PT0gSFlQSEVOTUlOVVMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDEgPCBzb3VyY2VMZW5ndGggJiYgc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSkgPT09IEdSRUFURVJUSEFOU0lHTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENEQztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkNvdW50LS07IC8vIHJld3JpdGUgcHJldiB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZGVudChcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gTEVGVFBBUkVOVEhFU0lTICYmIHByZXZUeXBlID09PSBJREVOVElGSUVSKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuQ291bnQtLTsgLy8gcmV3cml0ZSBwcmV2IHRva2VuXG4gICAgICAgICAgICAgICAgICAgIGJhbGFuY2VbdG9rZW5Db3VudF0gPSBiYWxhbmNlW3Rva2VuQ291bnQgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgYmFsYW5jZVN0YXJ0LS07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gNCBjaGFyIGxlbmd0aCBpZGVudGlmaWVyIGFuZCBlcXVhbCB0byBgdXJsKGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgLSBhbmNob3IgPT09IDQgJiYgY21wU3RyKHNvdXJjZSwgYW5jaG9yLCBvZmZzZXQsICd1cmwoJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdXJsKCkgYmVjYXVzZSBpdCBjYW4gY29udGFpbiBhbnkgc3ltYm9scyBzZXF1ZW5jZSB3aXRoIGZldyBleGNlcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBmaW5kV2hpdGVTcGFjZUVuZChzb3VyY2UsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gc291cmNlLmNoYXJDb2RlQXQoYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9PSBMRUZUUEFSRU5USEVTSVMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlICE9PSBSSUdIVFBBUkVOVEhFU0lTICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPT0gUVVPVEFUSU9OTUFSSyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT09IEFQT1NUUk9QSEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cmwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0QW5kVHlwZVt0b2tlbkNvdW50KytdID0gKFVSTCA8PCBUWVBFX1NISUZUKSB8IG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlW3Rva2VuQ291bnRdID0gc291cmNlTGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3MqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvciAhPT0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldEFuZFR5cGVbdG9rZW5Db3VudCsrXSA9IChXSElURVNQQUNFIDw8IFRZUEVfU0hJRlQpIHwgYW5jaG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlW3Rva2VuQ291bnRdID0gc291cmNlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBSQVc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZmluZFVybFJhd0VuZChzb3VyY2UsIGFuY2hvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBVUkw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRlVOQ1RJT047XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHlwZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBOVU1CRVI6XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gZmluZE51bWJlckVuZChzb3VyY2UsIG9mZnNldCArIDEsIHByZXZUeXBlICE9PSBGVUxMU1RPUCk7XG5cbiAgICAgICAgICAgICAgICAvLyBtZXJnZSBudW1iZXIgd2l0aCBhIHByZWNlZGluZyBkb3QsIGRhc2ggb3IgcGx1c1xuICAgICAgICAgICAgICAgIGlmIChwcmV2VHlwZSA9PT0gRlVMTFNUT1AgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJldlR5cGUgPT09IEhZUEhFTk1JTlVTIHx8XG4gICAgICAgICAgICAgICAgICAgIHByZXZUeXBlID09PSBQTFVTU0lHTikge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbkNvdW50LS07IC8vIHJld3JpdGUgcHJldiB0b2tlblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFNUUklORzpcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBmaW5kU3RyaW5nRW5kKHNvdXJjZSwgb2Zmc2V0ICsgMSwgY29kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGZpbmRJZGVudGlmaWVyRW5kKHNvdXJjZSwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgIC8vIG1lcmdlIGlkZW50aWZpZXIgd2l0aCBhIHByZWNlZGluZyBkYXNoXG4gICAgICAgICAgICAgICAgaWYgKHByZXZUeXBlID09PSBIWVBIRU5NSU5VUykge1xuICAgICAgICAgICAgICAgICAgICAvLyByZXdyaXRlIHByZXYgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgdG9rZW5Db3VudC0tO1xuICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIHByZXYgcHJldiB0b2tlbiB0eXBlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjYXNlIEAtcHJlZml4LWlkZW50XG4gICAgICAgICAgICAgICAgICAgIHByZXZUeXBlID0gdG9rZW5Db3VudCA9PT0gMCA/IDAgOiBvZmZzZXRBbmRUeXBlW3Rva2VuQ291bnQgLSAxXSA+PiBUWVBFX1NISUZUO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwcmV2VHlwZSA9PT0gQ09NTUVSQ0lBTEFUKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJld3JpdGUgcHJldiB0b2tlbiBhbmQgY2hhbmdlIHR5cGUgdG8gPGF0LWtleXdvcmQtdG9rZW4+XG4gICAgICAgICAgICAgICAgICAgIHRva2VuQ291bnQtLTtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEFUS0VZV09SRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvZmZzZXRBbmRUeXBlW3Rva2VuQ291bnQrK10gPSAodHlwZSA8PCBUWVBFX1NISUZUKSB8IG9mZnNldDtcbiAgICAgICAgcHJldlR5cGUgPSB0eXBlO1xuICAgIH1cblxuICAgIC8vIGZpbmFsaXplIGFycmF5c1xuICAgIG9mZnNldEFuZFR5cGVbdG9rZW5Db3VudF0gPSBvZmZzZXQ7XG4gICAgYmFsYW5jZVt0b2tlbkNvdW50XSA9IHNvdXJjZUxlbmd0aDtcbiAgICBiYWxhbmNlW3NvdXJjZUxlbmd0aF0gPSBzb3VyY2VMZW5ndGg7IC8vIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlIGJhbGFuY2UgbWF0Y2ggd2l0aCBhbnkgdG9rZW5cbiAgICB3aGlsZSAoYmFsYW5jZVN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIGJhbGFuY2VQcmV2ID0gYmFsYW5jZVN0YXJ0ICYgT0ZGU0VUX01BU0s7XG4gICAgICAgIGJhbGFuY2VTdGFydCA9IGJhbGFuY2VbYmFsYW5jZVByZXZdO1xuICAgICAgICBiYWxhbmNlW2JhbGFuY2VQcmV2XSA9IHNvdXJjZUxlbmd0aDtcbiAgICB9XG5cbiAgICB0b2tlbml6ZXIub2Zmc2V0QW5kVHlwZSA9IG9mZnNldEFuZFR5cGU7XG4gICAgdG9rZW5pemVyLnRva2VuQ291bnQgPSB0b2tlbkNvdW50O1xuICAgIHRva2VuaXplci5iYWxhbmNlID0gYmFsYW5jZTtcbn1cblxuLy9cbi8vIHRva2VuaXplclxuLy9cblxudmFyIFRva2VuaXplciA9IGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRPZmZzZXQsIHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4pIHtcbiAgICB0aGlzLm9mZnNldEFuZFR5cGUgPSBudWxsO1xuICAgIHRoaXMuYmFsYW5jZSA9IG51bGw7XG4gICAgdGhpcy5saW5lcyA9IG51bGw7XG4gICAgdGhpcy5jb2x1bW5zID0gbnVsbDtcblxuICAgIHRoaXMuc2V0U291cmNlKHNvdXJjZSwgc3RhcnRPZmZzZXQsIHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4pO1xufTtcblxuVG9rZW5pemVyLnByb3RvdHlwZSA9IHtcbiAgICBzZXRTb3VyY2U6IGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRPZmZzZXQsIHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4pIHtcbiAgICAgICAgdmFyIHNhZmVTb3VyY2UgPSBTdHJpbmcoc291cmNlIHx8ICcnKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gZmlyc3RDaGFyT2Zmc2V0KHNhZmVTb3VyY2UpO1xuXG4gICAgICAgIHRoaXMuc291cmNlID0gc2FmZVNvdXJjZTtcbiAgICAgICAgdGhpcy5maXJzdENoYXJPZmZzZXQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5zdGFydE9mZnNldCA9IHR5cGVvZiBzdGFydE9mZnNldCA9PT0gJ3VuZGVmaW5lZCcgPyAwIDogc3RhcnRPZmZzZXQ7XG4gICAgICAgIHRoaXMuc3RhcnRMaW5lID0gdHlwZW9mIHN0YXJ0TGluZSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogc3RhcnRMaW5lO1xuICAgICAgICB0aGlzLnN0YXJ0Q29sdW1uID0gdHlwZW9mIHN0YXJ0Q29sdW1uID09PSAndW5kZWZpbmVkJyA/IDEgOiBzdGFydENvbHVtbjtcbiAgICAgICAgdGhpcy5saW5lc0Fuc0NvbHVtbnNDb21wdXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuZW9mID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gLTE7XG4gICAgICAgIHRoaXMudG9rZW5UeXBlID0gMDtcbiAgICAgICAgdGhpcy50b2tlblN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMudG9rZW5FbmQgPSBzdGFydDtcblxuICAgICAgICB0b2tlbkxheW91dCh0aGlzLCBzYWZlU291cmNlLCBzdGFydCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH0sXG5cbiAgICBsb29rdXBUeXBlOiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY3VycmVudFRva2VuO1xuXG4gICAgICAgIGlmIChvZmZzZXQgPCB0aGlzLnRva2VuQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9mZnNldEFuZFR5cGVbb2Zmc2V0XSA+PiBUWVBFX1NISUZUO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE5VTEw7XG4gICAgfSxcbiAgICBsb29rdXBOb25XU1R5cGU6IGZ1bmN0aW9uKG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5jdXJyZW50VG9rZW47XG5cbiAgICAgICAgZm9yICh2YXIgdHlwZTsgb2Zmc2V0IDwgdGhpcy50b2tlbkNvdW50OyBvZmZzZXQrKykge1xuICAgICAgICAgICAgdHlwZSA9IHRoaXMub2Zmc2V0QW5kVHlwZVtvZmZzZXRdID4+IFRZUEVfU0hJRlQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlICE9PSBXSElURVNQQUNFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTlVMTDtcbiAgICB9LFxuICAgIGxvb2t1cFZhbHVlOiBmdW5jdGlvbihvZmZzZXQsIHJlZmVyZW5jZVN0cikge1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5jdXJyZW50VG9rZW47XG5cbiAgICAgICAgaWYgKG9mZnNldCA8IHRoaXMudG9rZW5Db3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNtcFN0cihcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldEFuZFR5cGVbb2Zmc2V0IC0gMV0gJiBPRkZTRVRfTUFTSyxcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldEFuZFR5cGVbb2Zmc2V0XSAmIE9GRlNFVF9NQVNLLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZVN0clxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGdldFRva2VuU3RhcnQ6IGZ1bmN0aW9uKHRva2VuTnVtKSB7XG4gICAgICAgIGlmICh0b2tlbk51bSA9PT0gdGhpcy5jdXJyZW50VG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuU3RhcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW5OdW0gPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW5OdW0gPCB0aGlzLnRva2VuQ291bnRcbiAgICAgICAgICAgICAgICA/IHRoaXMub2Zmc2V0QW5kVHlwZVt0b2tlbk51bSAtIDFdICYgT0ZGU0VUX01BU0tcbiAgICAgICAgICAgICAgICA6IHRoaXMub2Zmc2V0QW5kVHlwZVt0aGlzLnRva2VuQ291bnRdICYgT0ZGU0VUX01BU0s7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5maXJzdENoYXJPZmZzZXQ7XG4gICAgfSxcbiAgICBnZXRPZmZzZXRFeGNsdWRlV1M6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VG9rZW4gPiAwKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMub2Zmc2V0QW5kVHlwZVt0aGlzLmN1cnJlbnRUb2tlbiAtIDFdID4+IFRZUEVfU0hJRlQpID09PSBXSElURVNQQUNFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRva2VuID4gMVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMub2Zmc2V0QW5kVHlwZVt0aGlzLmN1cnJlbnRUb2tlbiAtIDJdICYgT0ZGU0VUX01BU0tcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpcnN0Q2hhck9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50b2tlblN0YXJ0O1xuICAgIH0sXG4gICAgZ2V0UmF3TGVuZ3RoOiBmdW5jdGlvbihzdGFydFRva2VuLCBlbmRUb2tlblR5cGUxLCBlbmRUb2tlblR5cGUyLCBpbmNsdWRlVG9rZW5UeXBlMikge1xuICAgICAgICB2YXIgY3Vyc29yID0gc3RhcnRUb2tlbjtcbiAgICAgICAgdmFyIGJhbGFuY2VFbmQ7XG5cbiAgICAgICAgbG9vcDpcbiAgICAgICAgZm9yICg7IGN1cnNvciA8IHRoaXMudG9rZW5Db3VudDsgY3Vyc29yKyspIHtcbiAgICAgICAgICAgIGJhbGFuY2VFbmQgPSB0aGlzLmJhbGFuY2VbY3Vyc29yXTtcblxuICAgICAgICAgICAgLy8gYmVsYW5jZSBlbmQgcG9pbnRzIHRvIG9mZnNldCBiZWZvcmUgc3RhcnRcbiAgICAgICAgICAgIGlmIChiYWxhbmNlRW5kIDwgc3RhcnRUb2tlbikge1xuICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHRva2VuIGlzIHN0b3AgdHlwZVxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLm9mZnNldEFuZFR5cGVbY3Vyc29yXSA+PiBUWVBFX1NISUZUKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBlbmRUb2tlblR5cGUxOlxuICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBlbmRUb2tlblR5cGUyOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZVRva2VuVHlwZTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBmYXN0IGZvcndhcmQgdG8gdGhlIGVuZCBvZiBiYWxhbmNlZCBibG9ja1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5iYWxhbmNlW2JhbGFuY2VFbmRdID09PSBjdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciA9IGJhbGFuY2VFbmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnNvciAtIHRoaXMuY3VycmVudFRva2VuO1xuICAgIH0sXG4gICAgaXNCYWxhbmNlRWRnZTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHZhciBiYWxhbmNlU3RhcnQgPSB0aGlzLmJhbGFuY2VbdGhpcy5jdXJyZW50VG9rZW5dO1xuICAgICAgICByZXR1cm4gYmFsYW5jZVN0YXJ0IDwgcG9zO1xuICAgIH0sXG5cbiAgICBnZXRUb2tlblZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnRva2VuU3RhcnQsIHRoaXMudG9rZW5FbmQpO1xuICAgIH0sXG4gICAgc3Vic3RyVG9DdXJzb3I6IGZ1bmN0aW9uKHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIHRoaXMudG9rZW5TdGFydCk7XG4gICAgfSxcblxuICAgIHNraXBXUzogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmN1cnJlbnRUb2tlbiwgc2tpcFRva2VuQ291bnQgPSAwOyBpIDwgdGhpcy50b2tlbkNvdW50OyBpKyssIHNraXBUb2tlbkNvdW50KyspIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5vZmZzZXRBbmRUeXBlW2ldID4+IFRZUEVfU0hJRlQpICE9PSBXSElURVNQQUNFKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2tpcFRva2VuQ291bnQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNraXAoc2tpcFRva2VuQ291bnQpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBza2lwU0M6IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aGlsZSAodGhpcy50b2tlblR5cGUgPT09IFdISVRFU1BBQ0UgfHwgdGhpcy50b2tlblR5cGUgPT09IENPTU1FTlQpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBza2lwOiBmdW5jdGlvbih0b2tlbkNvdW50KSB7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5jdXJyZW50VG9rZW4gKyB0b2tlbkNvdW50O1xuXG4gICAgICAgIGlmIChuZXh0IDwgdGhpcy50b2tlbkNvdW50KSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IG5leHQ7XG4gICAgICAgICAgICB0aGlzLnRva2VuU3RhcnQgPSB0aGlzLm9mZnNldEFuZFR5cGVbbmV4dCAtIDFdICYgT0ZGU0VUX01BU0s7XG4gICAgICAgICAgICBuZXh0ID0gdGhpcy5vZmZzZXRBbmRUeXBlW25leHRdO1xuICAgICAgICAgICAgdGhpcy50b2tlblR5cGUgPSBuZXh0ID4+IFRZUEVfU0hJRlQ7XG4gICAgICAgICAgICB0aGlzLnRva2VuRW5kID0gbmV4dCAmIE9GRlNFVF9NQVNLO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSB0aGlzLnRva2VuQ291bnQ7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5jdXJyZW50VG9rZW4gKyAxO1xuXG4gICAgICAgIGlmIChuZXh0IDwgdGhpcy50b2tlbkNvdW50KSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IG5leHQ7XG4gICAgICAgICAgICB0aGlzLnRva2VuU3RhcnQgPSB0aGlzLnRva2VuRW5kO1xuICAgICAgICAgICAgbmV4dCA9IHRoaXMub2Zmc2V0QW5kVHlwZVtuZXh0XTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5UeXBlID0gbmV4dCA+PiBUWVBFX1NISUZUO1xuICAgICAgICAgICAgdGhpcy50b2tlbkVuZCA9IG5leHQgJiBPRkZTRVRfTUFTSztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gdGhpcy50b2tlbkNvdW50O1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50b2tlblR5cGUgPSBOVUxMO1xuICAgICAgICAgICAgdGhpcy50b2tlblN0YXJ0ID0gdGhpcy50b2tlbkVuZCA9IHRoaXMuc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBlYXQ6IGZ1bmN0aW9uKHRva2VuVHlwZSkge1xuICAgICAgICBpZiAodGhpcy50b2tlblR5cGUgIT09IHRva2VuVHlwZSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudG9rZW5TdGFydDtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gTkFNRVt0b2tlblR5cGVdICsgJyBpcyBleHBlY3RlZCc7XG5cbiAgICAgICAgICAgIC8vIHR3ZWFrIG1lc3NhZ2UgYW5kIG9mZnNldFxuICAgICAgICAgICAgaWYgKHRva2VuVHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gaWRlbnRpZmllciBpcyBleHBlY3RlZCBidXQgdGhlcmUgaXMgYSBmdW5jdGlvbiBvciB1cmxcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b2tlblR5cGUgPT09IEZVTkNUSU9OIHx8IHRoaXMudG9rZW5UeXBlID09PSBVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy50b2tlbkVuZCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBidXQgZnVuY3Rpb24gZm91bmQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0ZXN0IHR5cGUgaXMgcGFydCBvZiBhbm90aGVyIHRva2VuIHNob3cgZXJyb3IgZm9yIGN1cnJlbnQgcG9zaXRpb24gKyAxXG4gICAgICAgICAgICAgICAgLy8gZS5nLiBlYXQoSFlQSEVOTUlOVVMpIHdpbGwgZmFpbCBvbiBcIi1mb29cIiwgYnV0IHBvaW50aW5nIG9uIFwiLVwiIGlzIG9kZFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMudG9rZW5TdGFydCkgPT09IHRva2VuVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lcnJvcihtZXNzYWdlLCBvZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfSxcbiAgICBlYXROb25XUzogZnVuY3Rpb24odG9rZW5UeXBlKSB7XG4gICAgICAgIHRoaXMuc2tpcFdTKCk7XG4gICAgICAgIHRoaXMuZWF0KHRva2VuVHlwZSk7XG4gICAgfSxcblxuICAgIGNvbnN1bWU6IGZ1bmN0aW9uKHRva2VuVHlwZSkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFRva2VuVmFsdWUoKTtcblxuICAgICAgICB0aGlzLmVhdCh0b2tlblR5cGUpO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIGNvbnN1bWVGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnRva2VuU3RhcnQsIHRoaXMudG9rZW5FbmQgLSAxKTtcblxuICAgICAgICB0aGlzLmVhdChGVU5DVElPTik7XG5cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICBjb25zdW1lTm9uV1M6IGZ1bmN0aW9uKHRva2VuVHlwZSkge1xuICAgICAgICB0aGlzLnNraXBXUygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN1bWUodG9rZW5UeXBlKTtcbiAgICB9LFxuXG4gICAgZXhwZWN0SWRlbnRpZmllcjogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICBpZiAodGhpcy50b2tlblR5cGUgIT09IElERU5USUZJRVIgfHwgY21wU3RyKHRoaXMuc291cmNlLCB0aGlzLnRva2VuU3RhcnQsIHRoaXMudG9rZW5FbmQsIG5hbWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcignSWRlbnRpZmllciBgJyArIG5hbWUgKyAnYCBpcyBleHBlY3RlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfSxcblxuICAgIGdldExvY2F0aW9uOiBmdW5jdGlvbihvZmZzZXQsIGZpbGVuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5saW5lc0Fuc0NvbHVtbnNDb21wdXRlZCkge1xuICAgICAgICAgICAgY29tcHV0ZUxpbmVzQW5kQ29sdW1ucyh0aGlzLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc291cmNlOiBmaWxlbmFtZSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5zdGFydE9mZnNldCArIG9mZnNldCxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZXNbb2Zmc2V0XSxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5zW29mZnNldF1cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgZ2V0TG9jYXRpb25SYW5nZTogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZmlsZW5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVzQW5zQ29sdW1uc0NvbXB1dGVkKSB7XG4gICAgICAgICAgICBjb21wdXRlTGluZXNBbmRDb2x1bW5zKHRoaXMsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2U6IGZpbGVuYW1lLFxuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMuc3RhcnRPZmZzZXQgKyBzdGFydCxcbiAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVzW3N0YXJ0XSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uc1tzdGFydF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMuc3RhcnRPZmZzZXQgKyBlbmQsXG4gICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lc1tlbmRdLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5zW2VuZF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIG9mZnNldCkge1xuICAgICAgICB2YXIgbG9jYXRpb24gPSB0eXBlb2Ygb2Zmc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvZmZzZXQgPCB0aGlzLnNvdXJjZS5sZW5ndGhcbiAgICAgICAgICAgID8gdGhpcy5nZXRMb2NhdGlvbihvZmZzZXQpXG4gICAgICAgICAgICA6IHRoaXMuZW9mXG4gICAgICAgICAgICAgICAgPyB0aGlzLmdldExvY2F0aW9uKGZpbmRXaGl0ZVNwYWNlU3RhcnQodGhpcy5zb3VyY2UsIHRoaXMuc291cmNlLmxlbmd0aCAtIDEpKVxuICAgICAgICAgICAgICAgIDogdGhpcy5nZXRMb2NhdGlvbih0aGlzLnRva2VuU3RhcnQpO1xuXG4gICAgICAgIHRocm93IG5ldyBDc3NTeW50YXhFcnJvcihcbiAgICAgICAgICAgIG1lc3NhZ2UgfHwgJ1VuZXhwZWN0ZWQgaW5wdXQnLFxuICAgICAgICAgICAgdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBsb2NhdGlvbi5vZmZzZXQsXG4gICAgICAgICAgICBsb2NhdGlvbi5saW5lLFxuICAgICAgICAgICAgbG9jYXRpb24uY29sdW1uXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGR1bXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcblxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5vZmZzZXRBbmRUeXBlLCAwLCB0aGlzLnRva2VuQ291bnQpLm1hcChmdW5jdGlvbihpdGVtLCBpZHgpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IG9mZnNldDtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpdGVtICYgT0ZGU0VUX01BU0s7XG5cbiAgICAgICAgICAgIG9mZnNldCA9IGVuZDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZHg6IGlkeCxcbiAgICAgICAgICAgICAgICB0eXBlOiBOQU1FW2l0ZW0gPj4gVFlQRV9TSElGVF0sXG4gICAgICAgICAgICAgICAgY2h1bms6IHRoaXMuc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kKSxcbiAgICAgICAgICAgICAgICBiYWxhbmNlOiB0aGlzLmJhbGFuY2VbaWR4XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufTtcblxuLy8gZXh0ZW5kIHdpdGggZXJyb3IgY2xhc3NcblRva2VuaXplci5Dc3NTeW50YXhFcnJvciA9IENzc1N5bnRheEVycm9yO1xuXG4vLyBleHRlbmQgdG9rZW5pemVyIHdpdGggY29uc3RhbnRzXG5PYmplY3Qua2V5cyhjb25zdGFudHMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgVG9rZW5pemVyW2tleV0gPSBjb25zdGFudHNba2V5XTtcbn0pO1xuXG4vLyBleHRlbmQgdG9rZW5pemVyIHdpdGggc3RhdGljIG1ldGhvZHMgZnJvbSB1dGlsc1xuT2JqZWN0LmtleXModXRpbHMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgVG9rZW5pemVyW2tleV0gPSB1dGlsc1trZXldO1xufSk7XG5cbi8vIHdhcm0gdXAgdG9rZW5pemVyIHRvIGVsaW1pdGF0ZSBjb2RlIGJyYW5jaGVzIHRoYXQgbmV2ZXIgZXhlY3V0ZVxuLy8gZml4IHNvZnQgZGVvcHRpbWl6YXRpb25zIChpbnN1ZmZpY2llbnQgdHlwZSBmZWVkYmFjaylcbm5ldyBUb2tlbml6ZXIoJ1xcblxcclxcclxcblxcZjwhLS0tLT4vL1wiXCJcXCdcXCcvKlxcclxcblxcZiovMWE7LlxcXFwzMVxcdFxcKzJ7dXJsKGEpO2Z1bmMoKTsrMS4yZTMgLS40ZS01IC42ZSs3fScpLmdldExvY2F0aW9uKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gVG9rZW5pemVyO1xuIiwiZnVuY3Rpb24gbm9vcCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNdWx0aXBsaWVyKG11bHRpcGxpZXIpIHtcbiAgICBpZiAobXVsdGlwbGllci5taW4gPT09IDAgJiYgbXVsdGlwbGllci5tYXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICcqJztcbiAgICB9XG5cbiAgICBpZiAobXVsdGlwbGllci5taW4gPT09IDAgJiYgbXVsdGlwbGllci5tYXggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuICc/JztcbiAgICB9XG5cbiAgICBpZiAobXVsdGlwbGllci5taW4gPT09IDEgJiYgbXVsdGlwbGllci5tYXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG11bHRpcGxpZXIuY29tbWEgPyAnIycgOiAnKyc7XG4gICAgfVxuXG4gICAgaWYgKG11bHRpcGxpZXIubWluID09PSAxICYmIG11bHRpcGxpZXIubWF4ID09PSAxKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICAobXVsdGlwbGllci5jb21tYSA/ICcjJyA6ICcnKSArXG4gICAgICAgIChtdWx0aXBsaWVyLm1pbiA9PT0gbXVsdGlwbGllci5tYXhcbiAgICAgICAgICAgID8gJ3snICsgbXVsdGlwbGllci5taW4gKyAnfSdcbiAgICAgICAgICAgIDogJ3snICsgbXVsdGlwbGllci5taW4gKyAnLCcgKyAobXVsdGlwbGllci5tYXggIT09IDAgPyBtdWx0aXBsaWVyLm1heCA6ICcnKSArICd9J1xuICAgICAgICApXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTZXF1ZW5jZShub2RlLCBmb3JjZUJyYWNlcywgZGVjb3JhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gbm9kZS50ZXJtcy5tYXAoZnVuY3Rpb24odGVybSkge1xuICAgICAgICByZXR1cm4gZ2VuZXJhdGUodGVybSwgZm9yY2VCcmFjZXMsIGRlY29yYXRlKTtcbiAgICB9KS5qb2luKG5vZGUuY29tYmluYXRvciA9PT0gJyAnID8gJyAnIDogJyAnICsgbm9kZS5jb21iaW5hdG9yICsgJyAnKTtcblxuICAgIGlmIChub2RlLmV4cGxpY2l0IHx8IGZvcmNlQnJhY2VzKSB7XG4gICAgICAgIHJlc3VsdCA9IChyZXN1bHRbMF0gIT09ICcsJyA/ICdbICcgOiAnWycpICsgcmVzdWx0ICsgJyBdJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZShub2RlLCBmb3JjZUJyYWNlcywgZGVjb3JhdGUpIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnR3JvdXAnOlxuICAgICAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVNlcXVlbmNlKG5vZGUsIGZvcmNlQnJhY2VzLCBkZWNvcmF0ZSkgK1xuICAgICAgICAgICAgICAgIChub2RlLmRpc2FsbG93RW1wdHkgPyAnIScgOiAnJyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdNdWx0aXBsaWVyJzpcbiAgICAgICAgICAgIC8vIHJldHVybiBzaW5jZSBub2RlIGlzIGEgY29tcG9zaXRpb25cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGUobm9kZS50ZXJtLCBmb3JjZUJyYWNlcywgZGVjb3JhdGUpICtcbiAgICAgICAgICAgICAgICBkZWNvcmF0ZShnZW5lcmF0ZU11bHRpcGxpZXIobm9kZSksIG5vZGUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNhc2UgJ1R5cGUnOlxuICAgICAgICAgICAgcmVzdWx0ID0gJzwnICsgbm9kZS5uYW1lICsgJz4nO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnUHJvcGVydHknOlxuICAgICAgICAgICAgcmVzdWx0ID0gJzxcXCcnICsgbm9kZS5uYW1lICsgJ1xcJz4nO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICAgICAgICByZXN1bHQgPSBub2RlLm5hbWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdBdEtleXdvcmQnOlxuICAgICAgICAgICAgcmVzdWx0ID0gJ0AnICsgbm9kZS5uYW1lO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnRnVuY3Rpb24nOlxuICAgICAgICAgICAgcmVzdWx0ID0gbm9kZS5uYW1lICsgJygnO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgY2FzZSAnVG9rZW4nOlxuICAgICAgICAgICAgcmVzdWx0ID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0NvbW1hJzpcbiAgICAgICAgICAgIHJlc3VsdCA9ICcsJztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlIGAnICsgbm9kZS50eXBlICsgJ2AnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGUocmVzdWx0LCBub2RlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zKSB7XG4gICAgdmFyIGRlY29yYXRlID0gbm9vcDtcbiAgICB2YXIgZm9yY2VCcmFjZXMgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkZWNvcmF0ZSA9IG9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGZvcmNlQnJhY2VzID0gQm9vbGVhbihvcHRpb25zLmZvcmNlQnJhY2VzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlY29yYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkZWNvcmF0ZSA9IG9wdGlvbnMuZGVjb3JhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2VuZXJhdGUobm9kZSwgZm9yY2VCcmFjZXMsIGRlY29yYXRlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVDdXN0b21FcnJvciA9IHJlcXVpcmUoJy4uL3V0aWxzL2NyZWF0ZUN1c3RvbUVycm9yJyk7XG52YXIgZ2VuZXJhdGVHcmFtbWFyID0gcmVxdWlyZSgnLi9ncmFtbWFyL2dlbmVyYXRlJyk7XG5cbmZ1bmN0aW9uIGZyb21NYXRjaFJlc3VsdChtYXRjaFJlc3VsdCkge1xuICAgIHZhciB0b2tlbnMgPSBtYXRjaFJlc3VsdC50b2tlbnM7XG4gICAgdmFyIGxvbmdlc3RNYXRjaCA9IG1hdGNoUmVzdWx0Lmxvbmdlc3RNYXRjaDtcbiAgICB2YXIgbm9kZSA9IGxvbmdlc3RNYXRjaCA8IHRva2Vucy5sZW5ndGggPyB0b2tlbnNbbG9uZ2VzdE1hdGNoXS5ub2RlIDogbnVsbDtcbiAgICB2YXIgbWlzbWF0Y2hPZmZzZXQgPSAwO1xuICAgIHZhciBlbnRyaWVzID0gMDtcbiAgICB2YXIgY3NzID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA9PT0gbG9uZ2VzdE1hdGNoKSB7XG4gICAgICAgICAgICBtaXNtYXRjaE9mZnNldCA9IGNzcy5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0b2tlbnNbaV0ubm9kZSA9PT0gbm9kZSkge1xuICAgICAgICAgICAgaWYgKGkgPD0gbG9uZ2VzdE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgZW50cmllcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNzcyArPSB0b2tlbnNbaV0udmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgbWlzbWF0Y2hPZmZzZXQgPSBjc3MubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgIGNzczogY3NzLFxuICAgICAgICBtaXNtYXRjaE9mZnNldDogbWlzbWF0Y2hPZmZzZXQsXG4gICAgICAgIGxhc3Q6IG5vZGUgPT09IG51bGwgfHwgZW50cmllcyA+IDFcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRMb2NhdGlvbihub2RlLCBwb2ludCkge1xuICAgIHZhciBsb2MgPSBub2RlICYmIG5vZGUubG9jICYmIG5vZGUubG9jW3BvaW50XTtcblxuICAgIGlmIChsb2MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9mZnNldDogbG9jLm9mZnNldCxcbiAgICAgICAgICAgIGxpbmU6IGxvYy5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBsb2MuY29sdW1uXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBTeW50YXhSZWZlcmVuY2VFcnJvciA9IGZ1bmN0aW9uKHR5cGUsIHJlZmVyZW5jZU5hbWUpIHtcbiAgICB2YXIgZXJyb3IgPSBjcmVhdGVDdXN0b21FcnJvcihcbiAgICAgICAgJ1N5bnRheFJlZmVyZW5jZUVycm9yJyxcbiAgICAgICAgdHlwZSArIChyZWZlcmVuY2VOYW1lID8gJyBgJyArIHJlZmVyZW5jZU5hbWUgKyAnYCcgOiAnJylcbiAgICApO1xuXG4gICAgZXJyb3IucmVmZXJlbmNlID0gcmVmZXJlbmNlTmFtZTtcblxuICAgIHJldHVybiBlcnJvcjtcbn07XG5cbnZhciBNYXRjaEVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgbGV4ZXIsIHN5bnRheCwgbm9kZSwgbWF0Y2hSZXN1bHQpIHtcbiAgICB2YXIgZXJyb3IgPSBjcmVhdGVDdXN0b21FcnJvcignU3ludGF4TWF0Y2hFcnJvcicsIG1lc3NhZ2UpO1xuICAgIHZhciBkZXRhaWxzID0gZnJvbU1hdGNoUmVzdWx0KG1hdGNoUmVzdWx0KTtcbiAgICB2YXIgbWlzbWF0Y2hPZmZzZXQgPSBkZXRhaWxzLm1pc21hdGNoT2Zmc2V0IHx8IDA7XG4gICAgdmFyIGJhZE5vZGUgPSBkZXRhaWxzLm5vZGUgfHwgbm9kZTtcbiAgICB2YXIgZW5kID0gZ2V0TG9jYXRpb24oYmFkTm9kZSwgJ2VuZCcpO1xuICAgIHZhciBzdGFydCA9IGRldGFpbHMubGFzdCA/IGVuZCA6IGdldExvY2F0aW9uKGJhZE5vZGUsICdzdGFydCcpO1xuICAgIHZhciBjc3MgPSBkZXRhaWxzLmNzcztcblxuICAgIGVycm9yLnJhd01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIGVycm9yLnN5bnRheCA9IHN5bnRheCA/IGdlbmVyYXRlR3JhbW1hcihzeW50YXgpIDogJzxnZW5lcmljPic7XG4gICAgZXJyb3IuY3NzID0gY3NzO1xuICAgIGVycm9yLm1pc21hdGNoT2Zmc2V0ID0gbWlzbWF0Y2hPZmZzZXQ7XG4gICAgZXJyb3IubG9jID0ge1xuICAgICAgICBzb3VyY2U6IChiYWROb2RlICYmIGJhZE5vZGUubG9jICYmIGJhZE5vZGUubG9jLnNvdXJjZSkgfHwgJzx1bmtub3duPicsXG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmRcbiAgICB9O1xuICAgIGVycm9yLmxpbmUgPSBzdGFydCA/IHN0YXJ0LmxpbmUgOiB1bmRlZmluZWQ7XG4gICAgZXJyb3IuY29sdW1uID0gc3RhcnQgPyBzdGFydC5jb2x1bW4gOiB1bmRlZmluZWQ7XG4gICAgZXJyb3Iub2Zmc2V0ID0gc3RhcnQgPyBzdGFydC5vZmZzZXQgOiB1bmRlZmluZWQ7XG4gICAgZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UgKyAnXFxuJyArXG4gICAgICAgICcgIHN5bnRheDogJyArIGVycm9yLnN5bnRheCArICdcXG4nICtcbiAgICAgICAgJyAgIHZhbHVlOiAnICsgKGVycm9yLmNzcyB8fCAnPGVtcHR5IHN0cmluZz4nKSArICdcXG4nICtcbiAgICAgICAgJyAgLS0tLS0tLS0nICsgbmV3IEFycmF5KGVycm9yLm1pc21hdGNoT2Zmc2V0ICsgMSkuam9pbignLScpICsgJ14nO1xuXG4gICAgcmV0dXJuIGVycm9yO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgU3ludGF4UmVmZXJlbmNlRXJyb3I6IFN5bnRheFJlZmVyZW5jZUVycm9yLFxuICAgIE1hdGNoRXJyb3I6IE1hdGNoRXJyb3Jcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIga2V5d29yZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xudmFyIHByb3BlcnRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xudmFyIEhZUEhFTk1JTlVTID0gNDU7IC8vICctJy5jaGFyQ29kZUF0KClcblxuZnVuY3Rpb24gaXNDdXN0b21Qcm9wZXJ0eShzdHIsIG9mZnNldCkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgcmV0dXJuIHN0ci5sZW5ndGggLSBvZmZzZXQgPj0gMiAmJlxuICAgICAgICAgICBzdHIuY2hhckNvZGVBdChvZmZzZXQpID09PSBIWVBIRU5NSU5VUyAmJlxuICAgICAgICAgICBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA9PT0gSFlQSEVOTUlOVVM7XG59XG5cbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeChzdHIsIG9mZnNldCkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgLy8gdmVyZG9yIHByZWZpeCBzaG91bGQgYmUgYXQgbGVhc3QgMyBjaGFycyBsZW5ndGhcbiAgICBpZiAoc3RyLmxlbmd0aCAtIG9mZnNldCA+PSAzKSB7XG4gICAgICAgIC8vIHZlbmRvciBwcmVmaXggc3RhcnRzIHdpdGggaHlwZXIgbWludXMgZm9sbG93aW5nIG5vbi1oeXBlciBtaW51c1xuICAgICAgICBpZiAoc3RyLmNoYXJDb2RlQXQob2Zmc2V0KSA9PT0gSFlQSEVOTUlOVVMgJiZcbiAgICAgICAgICAgIHN0ci5jaGFyQ29kZUF0KG9mZnNldCArIDEpICE9PSBIWVBIRU5NSU5VUykge1xuICAgICAgICAgICAgLy8gdmVuZG9yIHByZWZpeCBzaG91bGQgY29udGFpbiBhIGh5cGVyIG1pbnVzIGF0IHRoZSBlbmRpbmdcbiAgICAgICAgICAgIHZhciBzZWNvbmREYXNoSW5kZXggPSBzdHIuaW5kZXhPZignLScsIG9mZnNldCArIDIpO1xuXG4gICAgICAgICAgICBpZiAoc2Vjb25kRGFzaEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKG9mZnNldCwgc2Vjb25kRGFzaEluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldEtleXdvcmREZXNjcmlwdG9yKGtleXdvcmQpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChrZXl3b3Jkcywga2V5d29yZCkpIHtcbiAgICAgICAgcmV0dXJuIGtleXdvcmRzW2tleXdvcmRdO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoa2V5d29yZHMsIG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBrZXl3b3Jkc1trZXl3b3JkXSA9IGtleXdvcmRzW25hbWVdO1xuICAgIH1cblxuICAgIHZhciBjdXN0b20gPSBpc0N1c3RvbVByb3BlcnR5KG5hbWUsIDApO1xuICAgIHZhciB2ZW5kb3IgPSAhY3VzdG9tID8gZ2V0VmVuZG9yUHJlZml4KG5hbWUsIDApIDogJyc7XG5cbiAgICByZXR1cm4ga2V5d29yZHNba2V5d29yZF0gPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYmFzZW5hbWU6IG5hbWUuc3Vic3RyKHZlbmRvci5sZW5ndGgpLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICB2ZW5kb3I6IHZlbmRvcixcbiAgICAgICAgcHJlZml4OiB2ZW5kb3IsXG4gICAgICAgIGN1c3RvbTogY3VzdG9tXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BlcnRpZXMsIHByb3BlcnR5KSkge1xuICAgICAgICByZXR1cm4gcHJvcGVydGllc1twcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBwcm9wZXJ0eTtcbiAgICB2YXIgaGFjayA9IHByb3BlcnR5WzBdO1xuXG4gICAgaWYgKGhhY2sgPT09ICcvJykge1xuICAgICAgICBoYWNrID0gcHJvcGVydHlbMV0gPT09ICcvJyA/ICcvLycgOiAnLyc7XG4gICAgfSBlbHNlIGlmIChoYWNrICE9PSAnXycgJiZcbiAgICAgICAgICAgICAgIGhhY2sgIT09ICcqJyAmJlxuICAgICAgICAgICAgICAgaGFjayAhPT0gJyQnICYmXG4gICAgICAgICAgICAgICBoYWNrICE9PSAnIycgJiZcbiAgICAgICAgICAgICAgIGhhY2sgIT09ICcrJykge1xuICAgICAgICBoYWNrID0gJyc7XG4gICAgfVxuXG4gICAgdmFyIGN1c3RvbSA9IGlzQ3VzdG9tUHJvcGVydHkobmFtZSwgaGFjay5sZW5ndGgpO1xuXG4gICAgLy8gcmUtdXNlIHJlc3VsdCB3aGVuIHBvc3NpYmxlICh0aGUgc2FtZSBhcyBmb3IgbG93ZXIgY2FzZSlcbiAgICBpZiAoIWN1c3RvbSkge1xuICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChwcm9wZXJ0aWVzLCBuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNbcHJvcGVydHldID0gcHJvcGVydGllc1tuYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB2ZW5kb3IgPSAhY3VzdG9tID8gZ2V0VmVuZG9yUHJlZml4KG5hbWUsIGhhY2subGVuZ3RoKSA6ICcnO1xuICAgIHZhciBwcmVmaXggPSBuYW1lLnN1YnN0cigwLCBoYWNrLmxlbmd0aCArIHZlbmRvci5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHByb3BlcnRpZXNbcHJvcGVydHldID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGJhc2VuYW1lOiBuYW1lLnN1YnN0cihwcmVmaXgubGVuZ3RoKSxcbiAgICAgICAgbmFtZTogbmFtZS5zdWJzdHIoaGFjay5sZW5ndGgpLFxuICAgICAgICBoYWNrOiBoYWNrLFxuICAgICAgICB2ZW5kb3I6IHZlbmRvcixcbiAgICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICAgIGN1c3RvbTogY3VzdG9tXG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGtleXdvcmQ6IGdldEtleXdvcmREZXNjcmlwdG9yLFxuICAgIHByb3BlcnR5OiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IsXG4gICAgaXNDdXN0b21Qcm9wZXJ0eTogaXNDdXN0b21Qcm9wZXJ0eSxcbiAgICB2ZW5kb3JQcmVmaXg6IGdldFZlbmRvclByZWZpeFxufTtcbiIsInZhciB0b2tlbml6ZXJVdGlscyA9IHJlcXVpcmUoJy4uL3Rva2VuaXplci91dGlscycpO1xudmFyIGZpbmRJZGVudGlmaWVyRW5kID0gdG9rZW5pemVyVXRpbHMuZmluZElkZW50aWZpZXJFbmQ7XG52YXIgZmluZE51bWJlckVuZCA9IHRva2VuaXplclV0aWxzLmZpbmROdW1iZXJFbmQ7XG52YXIgZmluZERlY2ltYWxOdW1iZXJFbmQgPSB0b2tlbml6ZXJVdGlscy5maW5kRGVjaW1hbE51bWJlckVuZDtcbnZhciBpc0hleCA9IHRva2VuaXplclV0aWxzLmlzSGV4O1xudmFyIHRva2VuaXplckNvbnN0ID0gcmVxdWlyZSgnLi4vdG9rZW5pemVyL2NvbnN0Jyk7XG52YXIgU1lNQk9MX1RZUEUgPSB0b2tlbml6ZXJDb25zdC5TWU1CT0xfVFlQRTtcbnZhciBJREVOVElGSUVSID0gdG9rZW5pemVyQ29uc3QuVFlQRS5JZGVudGlmaWVyO1xudmFyIFBMVVNTSUdOID0gdG9rZW5pemVyQ29uc3QuVFlQRS5QbHVzU2lnbjtcbnZhciBIWVBIRU5NSU5VUyA9IHRva2VuaXplckNvbnN0LlRZUEUuSHlwaGVuTWludXM7XG52YXIgTlVNQkVSU0lHTiA9IHRva2VuaXplckNvbnN0LlRZUEUuTnVtYmVyU2lnbjtcblxudmFyIFBFUkNFTlRBR0UgPSB7XG4gICAgJyUnOiB0cnVlXG59O1xuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXZhbHVlcy0zLyNsZW5ndGhzXG52YXIgTEVOR1RIID0ge1xuICAgIC8vIGFic29sdXRlIGxlbmd0aCB1bml0c1xuICAgICdweCc6IHRydWUsXG4gICAgJ21tJzogdHJ1ZSxcbiAgICAnY20nOiB0cnVlLFxuICAgICdpbic6IHRydWUsXG4gICAgJ3B0JzogdHJ1ZSxcbiAgICAncGMnOiB0cnVlLFxuICAgICdxJzogdHJ1ZSxcblxuICAgIC8vIHJlbGF0aXZlIGxlbmd0aCB1bml0c1xuICAgICdlbSc6IHRydWUsXG4gICAgJ2V4JzogdHJ1ZSxcbiAgICAnY2gnOiB0cnVlLFxuICAgICdyZW0nOiB0cnVlLFxuXG4gICAgLy8gdmlld3BvcnQtcGVyY2VudGFnZSBsZW5ndGhzXG4gICAgJ3ZoJzogdHJ1ZSxcbiAgICAndncnOiB0cnVlLFxuICAgICd2bWluJzogdHJ1ZSxcbiAgICAndm1heCc6IHRydWUsXG4gICAgJ3ZtJzogdHJ1ZVxufTtcblxudmFyIEFOR0xFID0ge1xuICAgICdkZWcnOiB0cnVlLFxuICAgICdncmFkJzogdHJ1ZSxcbiAgICAncmFkJzogdHJ1ZSxcbiAgICAndHVybic6IHRydWVcbn07XG5cbnZhciBUSU1FID0ge1xuICAgICdzJzogdHJ1ZSxcbiAgICAnbXMnOiB0cnVlXG59O1xuXG52YXIgRlJFUVVFTkNZID0ge1xuICAgICdoeic6IHRydWUsXG4gICAgJ2toeic6IHRydWVcbn07XG5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdmFsdWVzLTMvI3Jlc29sdXRpb24gKGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLyNyZXNvbHV0aW9uKVxudmFyIFJFU09MVVRJT04gPSB7XG4gICAgJ2RwaSc6IHRydWUsXG4gICAgJ2RwY20nOiB0cnVlLFxuICAgICdkcHB4JzogdHJ1ZSxcbiAgICAneCc6IHRydWUgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL2Nzc3dnLWRyYWZ0cy9pc3N1ZXMvNDYxXG59O1xuXG4vLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLWdyaWQvI2ZyLXVuaXRcbnZhciBGTEVYID0ge1xuICAgICdmcic6IHRydWVcbn07XG5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNwZWVjaC8jbWl4aW5nLXByb3BzLXZvaWNlLXZvbHVtZVxudmFyIERFQ0lCRUwgPSB7XG4gICAgJ2RiJzogdHJ1ZVxufTtcblxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2NzczMtc3BlZWNoLyN2b2ljZS1wcm9wcy12b2ljZS1waXRjaFxudmFyIFNFTUlUT05FUyA9IHtcbiAgICAnc3QnOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBjb25zdW1lRnVuY3Rpb24odG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSB7XG4gICAgdmFyIGxlbmd0aCA9IDE7XG4gICAgdmFyIGN1cnNvcjtcblxuICAgIGRvIHtcbiAgICAgICAgY3Vyc29yID0gZ2V0TmV4dFRva2VuKGxlbmd0aCsrKTtcbiAgICB9IHdoaWxlIChjdXJzb3IgIT09IG51bGwgJiYgY3Vyc29yLm5vZGUgIT09IHRva2VuLm5vZGUpO1xuXG4gICAgaWYgKGN1cnNvciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8gY29uc3VtZSB0b2tlbnMgdW50aWwgY3Vyc29yXG4gICAgICAgIGlmIChhZGRUb2tlblRvTWF0Y2goKSA9PT0gY3Vyc29yKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBUT0RPOiBpbXBsZW1lbnRcbi8vIGNhbiBiZSB1c2VkIHdoZXJldmVyIDxsZW5ndGg+LCA8ZnJlcXVlbmN5PiwgPGFuZ2xlPiwgPHRpbWU+LCA8cGVyY2VudGFnZT4sIDxudW1iZXI+LCBvciA8aW50ZWdlcj4gdmFsdWVzIGFyZSBhbGxvd2VkXG4vLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy8jY2FsYy1ub3RhdGlvblxuZnVuY3Rpb24gY2FsYyh0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pIHtcbiAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0gdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobmFtZSAhPT0gJ2NhbGMoJyAmJlxuICAgICAgICBuYW1lICE9PSAnLW1vei1jYWxjKCcgJiZcbiAgICAgICAgbmFtZSAhPT0gJy13ZWJraXQtY2FsYygnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc3VtZUZ1bmN0aW9uKHRva2VuLCBhZGRUb2tlblRvTWF0Y2gsIGdldE5leHRUb2tlbik7XG59XG5cbmZ1bmN0aW9uIGF0dHIodG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSB7XG4gICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkgIT09ICdhdHRyKCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zdW1lRnVuY3Rpb24odG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKTtcbn1cblxuZnVuY3Rpb24gZXhwcmVzc2lvbih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pIHtcbiAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKSAhPT0gJ2V4cHJlc3Npb24oJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnN1bWVGdW5jdGlvbih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pO1xufVxuXG5mdW5jdGlvbiB1cmwodG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSB7XG4gICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkgIT09ICd1cmwoJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnN1bWVGdW5jdGlvbih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pO1xufVxuXG5mdW5jdGlvbiBpZFNlbGVjdG9yKHRva2VuLCBhZGRUb2tlblRvTWF0Y2gpIHtcbiAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0b2tlbi52YWx1ZS5jaGFyQ29kZUF0KDApICE9PSBOVU1CRVJTSUdOKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoY29uc3VtZUlkZW50aWZpZXIodG9rZW4udmFsdWUsIDEpICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihzdHIpIHtcbiAgICByZXR1cm4gL15bLStdPyhcXGQrfFxcZCpcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8kLy50ZXN0KHN0cik7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVOdW1iZXIoc3RyLCBhbGxvd0ZyYWN0aW9uKSB7XG4gICAgdmFyIGNvZGUgPSBzdHIuY2hhckNvZGVBdCgwKTtcblxuICAgIHJldHVybiBmaW5kTnVtYmVyRW5kKHN0ciwgY29kZSA9PT0gUExVU1NJR04gfHwgY29kZSA9PT0gSFlQSEVOTUlOVVMgPyAxIDogMCwgYWxsb3dGcmFjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVJZGVudGlmaWVyKHN0ciwgb2Zmc2V0KSB7XG4gICAgdmFyIGNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQpO1xuXG4gICAgaWYgKGNvZGUgPCAweDgwICYmIFNZTUJPTF9UWVBFW2NvZGVdICE9PSBJREVOVElGSUVSICYmIGNvZGUgIT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbmRJZGVudGlmaWVyRW5kKHN0ciwgb2Zmc2V0ICsgMSk7XG59XG5cbmZ1bmN0aW9uIGFzdE5vZGUodHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoKSB7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbi5ub2RlLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBkaW1lbnNpb24odHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pIHtcbiAgICAgICAgaWYgKGNhbGModG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBudW1iZXJFbmQgPSBjb25zdW1lTnVtYmVyKHRva2VuLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKG51bWJlckVuZCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIGlmICghdHlwZS5oYXNPd25Qcm9wZXJ0eSh0b2tlbi52YWx1ZS5zdWJzdHIobnVtYmVyRW5kKS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB1bml0RW5kID0gY29uc3VtZUlkZW50aWZpZXIodG9rZW4udmFsdWUsIG51bWJlckVuZCk7XG4gICAgICAgICAgICBpZiAodW5pdEVuZCA9PT0gbnVtYmVyRW5kIHx8IHVuaXRFbmQgIT09IHRva2VuLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiB6ZXJvVW5pdGxlc3NEaW1lbnNpb24odHlwZSkge1xuICAgIHZhciBpc0RpbWVuc2lvbiA9IGRpbWVuc2lvbih0eXBlKTtcblxuICAgIHJldHVybiBmdW5jdGlvbih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pIHtcbiAgICAgICAgaWYgKGlzRGltZW5zaW9uKHRva2VuLCBhZGRUb2tlblRvTWF0Y2gsIGdldE5leHRUb2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSBudWxsIHx8IE51bWJlcih0b2tlbi52YWx1ZSkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBudW1iZXIodG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSB7XG4gICAgaWYgKGNhbGModG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBudW1iZXJFbmQgPSBjb25zdW1lTnVtYmVyKHRva2VuLnZhbHVlLCB0cnVlKTtcbiAgICBpZiAobnVtYmVyRW5kICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBudW1iZXJaZXJvT25lKHRva2VuLCBhZGRUb2tlblRvTWF0Y2gsIGdldE5leHRUb2tlbikge1xuICAgIGlmIChjYWxjKHRva2VuLCBhZGRUb2tlblRvTWF0Y2gsIGdldE5leHRUb2tlbikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuID09PSBudWxsIHx8ICFpc051bWJlcih0b2tlbi52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IE51bWJlcih0b2tlbi52YWx1ZSk7XG4gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBudW1iZXJPbmVPckdyZWF0ZXIodG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSB7XG4gICAgaWYgKGNhbGModG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgIWlzTnVtYmVyKHRva2VuLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gTnVtYmVyKHRva2VuLnZhbHVlKTtcbiAgICBpZiAodmFsdWUgPCAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhZGRUb2tlblRvTWF0Y2goKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gVE9ETzogZmFpbCBvbiAxMGUtMlxuZnVuY3Rpb24gaW50ZWdlcih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pIHtcbiAgICBpZiAoY2FsYyh0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0b2tlbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIG51bWJlckVuZCA9IGNvbnN1bWVOdW1iZXIodG9rZW4udmFsdWUsIGZhbHNlKTtcbiAgICBpZiAobnVtYmVyRW5kICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBUT0RPOiBmYWlsIG9uIDEwZS0yXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVnZXIodG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSB7XG4gICAgaWYgKGNhbGModG9rZW4sIGFkZFRva2VuVG9NYXRjaCwgZ2V0TmV4dFRva2VuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBudW1iZXJFbmQgPSBmaW5kRGVjaW1hbE51bWJlckVuZCh0b2tlbi52YWx1ZSwgMCk7XG4gICAgaWYgKG51bWJlckVuZCAhPT0gdG9rZW4udmFsdWUubGVuZ3RoIHx8IHRva2VuLnZhbHVlLmNoYXJDb2RlQXQoMCkgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhZGRUb2tlblRvTWF0Y2goKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGV4Q29sb3IodG9rZW4sIGFkZFRva2VuVG9NYXRjaCkge1xuICAgIGlmICh0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbi52YWx1ZS5jaGFyQ29kZUF0KDApICE9PSBOVU1CRVJTSUdOKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGVuZ3RoID0gdG9rZW4udmFsdWUubGVuZ3RoIC0gMTtcblxuICAgIC8vIHZhbGlkIGxlbmd0aCBpcyAzLCA0LCA2IGFuZCA4ICgrMSBmb3IgIylcbiAgICBpZiAobGVuZ3RoICE9PSAzICYmIGxlbmd0aCAhPT0gNCAmJiBsZW5ndGggIT09IDYgJiYgbGVuZ3RoICE9PSA4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaXNIZXgodG9rZW4udmFsdWUuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFRva2VuVG9NYXRjaCgpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvY3VzdG9tLWlkZW50XG4vLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy00LyNpZGVudGlmaWVyLXZhbHVlXG5mdW5jdGlvbiBjdXN0b21JZGVudCh0b2tlbiwgYWRkVG9rZW5Ub01hdGNoKSB7XG4gICAgaWYgKHRva2VuID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgaWRlbnRFbmQgPSBjb25zdW1lSWRlbnRpZmllcih0b2tlbi52YWx1ZSwgMCk7XG4gICAgaWYgKGlkZW50RW5kICE9PSB0b2tlbi52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0gdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIMKnIDMuMi4gQXV0aG9yLWRlZmluZWQgSWRlbnRpZmllcnM6IHRoZSA8Y3VzdG9tLWlkZW50PiB0eXBlXG4gICAgLy8gVGhlIENTUy13aWRlIGtleXdvcmRzIGFyZSBub3QgdmFsaWQgPGN1c3RvbS1pZGVudD5zXG4gICAgaWYgKG5hbWUgPT09ICd1bnNldCcgfHwgbmFtZSA9PT0gJ2luaXRpYWwnIHx8IG5hbWUgPT09ICdpbmhlcml0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlZmF1bHQga2V5d29yZCBpcyByZXNlcnZlZCBhbmQgaXMgYWxzbyBub3QgYSB2YWxpZCA8Y3VzdG9tLWlkZW50PlxuICAgIGlmIChuYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGlnbm9yZSBwcm9wZXJ0eSBzcGVjaWZpYyBrZXl3b3JkcyAoYXMgZGVzY3JpYmVkIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9jdXN0b20taWRlbnQpXG5cbiAgICBhZGRUb2tlblRvTWF0Y2goKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2FuZ2xlJzogemVyb1VuaXRsZXNzRGltZW5zaW9uKEFOR0xFKSxcbiAgICAnYXR0cigpJzogYXR0cixcbiAgICAnY3VzdG9tLWlkZW50JzogY3VzdG9tSWRlbnQsXG4gICAgJ2RlY2liZWwnOiBkaW1lbnNpb24oREVDSUJFTCksXG4gICAgJ2RpbWVuc2lvbic6IGRpbWVuc2lvbigpLFxuICAgICdmcmVxdWVuY3knOiBkaW1lbnNpb24oRlJFUVVFTkNZKSxcbiAgICAnZmxleCc6IGRpbWVuc2lvbihGTEVYKSxcbiAgICAnaGV4LWNvbG9yJzogaGV4Q29sb3IsXG4gICAgJ2lkLXNlbGVjdG9yJzogaWRTZWxlY3RvciwgLy8gZWxlbWVudCggPGlkLXNlbGVjdG9yPiApXG4gICAgJ2lkZW50JzogYXN0Tm9kZSgnSWRlbnRpZmllcicpLFxuICAgICdpbnRlZ2VyJzogaW50ZWdlcixcbiAgICAnbGVuZ3RoJzogemVyb1VuaXRsZXNzRGltZW5zaW9uKExFTkdUSCksXG4gICAgJ251bWJlcic6IG51bWJlcixcbiAgICAnbnVtYmVyLXplcm8tb25lJzogbnVtYmVyWmVyb09uZSxcbiAgICAnbnVtYmVyLW9uZS1vci1ncmVhdGVyJzogbnVtYmVyT25lT3JHcmVhdGVyLFxuICAgICdwZXJjZW50YWdlJzogZGltZW5zaW9uKFBFUkNFTlRBR0UpLFxuICAgICdwb3NpdGl2ZS1pbnRlZ2VyJzogcG9zaXRpdmVJbnRlZ2VyLFxuICAgICdyZXNvbHV0aW9uJzogZGltZW5zaW9uKFJFU09MVVRJT04pLFxuICAgICdzZW1pdG9uZXMnOiBkaW1lbnNpb24oU0VNSVRPTkVTKSxcbiAgICAnc3RyaW5nJzogYXN0Tm9kZSgnU3RyaW5nJyksXG4gICAgJ3RpbWUnOiBkaW1lbnNpb24oVElNRSksXG4gICAgJ3VuaWNvZGUtcmFuZ2UnOiBhc3ROb2RlKCdVbmljb2RlUmFuZ2UnKSxcbiAgICAndXJsJzogdXJsLFxuXG4gICAgLy8gb2xkIElFIHN0dWZmXG4gICAgJ3Byb2dpZCc6IGFzdE5vZGUoJ1JhdycpLFxuICAgICdleHByZXNzaW9uJzogZXhwcmVzc2lvblxufTtcbiIsInZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCcuL3Rva2VuaXplcicpO1xudmFyIFRBQiA9IDk7XG52YXIgTiA9IDEwO1xudmFyIEYgPSAxMjtcbnZhciBSID0gMTM7XG52YXIgU1BBQ0UgPSAzMjtcbnZhciBFWENMQU1BVElPTk1BUksgPSAzMzsgICAgLy8gIVxudmFyIE5VTUJFUlNJR04gPSAzNTsgICAgICAgICAvLyAjXG52YXIgQU1QRVJTQU5EID0gMzg7ICAgICAgICAgIC8vICZcbnZhciBBUE9TVFJPUEhFID0gMzk7ICAgICAgICAgLy8gJ1xudmFyIExFRlRQQVJFTlRIRVNJUyA9IDQwOyAgICAvLyAoXG52YXIgUklHSFRQQVJFTlRIRVNJUyA9IDQxOyAgIC8vIClcbnZhciBBU1RFUklTSyA9IDQyOyAgICAgICAgICAgLy8gKlxudmFyIFBMVVNTSUdOID0gNDM7ICAgICAgICAgICAvLyArXG52YXIgQ09NTUEgPSA0NDsgICAgICAgICAgICAgIC8vICxcbnZhciBMRVNTVEhBTlNJR04gPSA2MDsgICAgICAgLy8gPFxudmFyIEdSRUFURVJUSEFOU0lHTiA9IDYyOyAgICAvLyA+XG52YXIgUVVFU1RJT05NQVJLID0gNjM7ICAgICAgIC8vID9cbnZhciBDT01NRVJDSUFMQVQgPSA2NDsgICAgICAgLy8gQFxudmFyIExFRlRTUVVBUkVCUkFDS0VUID0gOTE7ICAvLyBbXG52YXIgUklHSFRTUVVBUkVCUkFDS0VUID0gOTM7IC8vIF1cbnZhciBMRUZUQ1VSTFlCUkFDS0VUID0gMTIzOyAgLy8ge1xudmFyIFZFUlRJQ0FMTElORSA9IDEyNDsgICAgICAvLyB8XG52YXIgUklHSFRDVVJMWUJSQUNLRVQgPSAxMjU7IC8vIH1cbnZhciBOQU1FX0NIQVIgPSBjcmVhdGVDaGFyTWFwKGZ1bmN0aW9uKGNoKSB7XG4gICAgcmV0dXJuIC9bYS16QS1aMC05XFwtXS8udGVzdChjaCk7XG59KTtcbnZhciBDT01CSU5BVE9SX1BSRUNFREVOQ0UgPSB7XG4gICAgJyAnOiAxLFxuICAgICcmJic6IDIsXG4gICAgJ3x8JzogMyxcbiAgICAnfCc6IDRcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoYXJNYXAoZm4pIHtcbiAgICB2YXIgYXJyYXkgPSB0eXBlb2YgVWludDMyQXJyYXkgPT09ICdmdW5jdGlvbicgPyBuZXcgVWludDMyQXJyYXkoMTI4KSA6IG5ldyBBcnJheSgxMjgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI4OyBpKyspIHtcbiAgICAgICAgYXJyYXlbaV0gPSBmbihTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKSA/IDEgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIHNjYW5TcGFjZXModG9rZW5pemVyKSB7XG4gICAgcmV0dXJuIHRva2VuaXplci5zdWJzdHJpbmdUb1BvcyhcbiAgICAgICAgdG9rZW5pemVyLmZpbmRXc0VuZCh0b2tlbml6ZXIucG9zICsgMSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBzY2FuV29yZCh0b2tlbml6ZXIpIHtcbiAgICB2YXIgZW5kID0gdG9rZW5pemVyLnBvcztcblxuICAgIGZvciAoOyBlbmQgPCB0b2tlbml6ZXIuc3RyLmxlbmd0aDsgZW5kKyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSB0b2tlbml6ZXIuc3RyLmNoYXJDb2RlQXQoZW5kKTtcbiAgICAgICAgaWYgKGNvZGUgPj0gMTI4IHx8IE5BTUVfQ0hBUltjb2RlXSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodG9rZW5pemVyLnBvcyA9PT0gZW5kKSB7XG4gICAgICAgIHRva2VuaXplci5lcnJvcignRXhwZWN0IGEga2V5d29yZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbml6ZXIuc3Vic3RyaW5nVG9Qb3MoZW5kKTtcbn1cblxuZnVuY3Rpb24gc2Nhbk51bWJlcih0b2tlbml6ZXIpIHtcbiAgICB2YXIgZW5kID0gdG9rZW5pemVyLnBvcztcblxuICAgIGZvciAoOyBlbmQgPCB0b2tlbml6ZXIuc3RyLmxlbmd0aDsgZW5kKyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSB0b2tlbml6ZXIuc3RyLmNoYXJDb2RlQXQoZW5kKTtcbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRva2VuaXplci5wb3MgPT09IGVuZCkge1xuICAgICAgICB0b2tlbml6ZXIuZXJyb3IoJ0V4cGVjdCBhIG51bWJlcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbml6ZXIuc3Vic3RyaW5nVG9Qb3MoZW5kKTtcbn1cblxuZnVuY3Rpb24gc2NhblN0cmluZyh0b2tlbml6ZXIpIHtcbiAgICB2YXIgZW5kID0gdG9rZW5pemVyLnN0ci5pbmRleE9mKCdcXCcnLCB0b2tlbml6ZXIucG9zICsgMSk7XG5cbiAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICB0b2tlbml6ZXIucG9zID0gdG9rZW5pemVyLnN0ci5sZW5ndGg7XG4gICAgICAgIHRva2VuaXplci5lcnJvcignRXhwZWN0IGFuIGFwb3N0cm9waGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5pemVyLnN1YnN0cmluZ1RvUG9zKGVuZCArIDEpO1xufVxuXG5mdW5jdGlvbiByZWFkTXVsdGlwbGllclJhbmdlKHRva2VuaXplcikge1xuICAgIHZhciBtaW4gPSBudWxsO1xuICAgIHZhciBtYXggPSBudWxsO1xuXG4gICAgdG9rZW5pemVyLmVhdChMRUZUQ1VSTFlCUkFDS0VUKTtcblxuICAgIG1pbiA9IHNjYW5OdW1iZXIodG9rZW5pemVyKTtcblxuICAgIGlmICh0b2tlbml6ZXIuY2hhckNvZGUoKSA9PT0gQ09NTUEpIHtcbiAgICAgICAgdG9rZW5pemVyLnBvcysrO1xuICAgICAgICBpZiAodG9rZW5pemVyLmNoYXJDb2RlKCkgIT09IFJJR0hUQ1VSTFlCUkFDS0VUKSB7XG4gICAgICAgICAgICBtYXggPSBzY2FuTnVtYmVyKHRva2VuaXplcik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBtYXggPSBtaW47XG4gICAgfVxuXG4gICAgdG9rZW5pemVyLmVhdChSSUdIVENVUkxZQlJBQ0tFVCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IE51bWJlcihtaW4pLFxuICAgICAgICBtYXg6IG1heCA/IE51bWJlcihtYXgpIDogMFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHJlYWRNdWx0aXBsaWVyKHRva2VuaXplcikge1xuICAgIHZhciByYW5nZSA9IG51bGw7XG4gICAgdmFyIGNvbW1hID0gZmFsc2U7XG5cbiAgICBzd2l0Y2ggKHRva2VuaXplci5jaGFyQ29kZSgpKSB7XG4gICAgICAgIGNhc2UgQVNURVJJU0s6XG4gICAgICAgICAgICB0b2tlbml6ZXIucG9zKys7XG5cbiAgICAgICAgICAgIHJhbmdlID0ge1xuICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICBtYXg6IDBcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUExVU1NJR046XG4gICAgICAgICAgICB0b2tlbml6ZXIucG9zKys7XG5cbiAgICAgICAgICAgIHJhbmdlID0ge1xuICAgICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgICBtYXg6IDBcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUVVFU1RJT05NQVJLOlxuICAgICAgICAgICAgdG9rZW5pemVyLnBvcysrO1xuXG4gICAgICAgICAgICByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgICAgbWF4OiAxXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE5VTUJFUlNJR046XG4gICAgICAgICAgICB0b2tlbml6ZXIucG9zKys7XG5cbiAgICAgICAgICAgIGNvbW1hID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRva2VuaXplci5jaGFyQ29kZSgpID09PSBMRUZUQ1VSTFlCUkFDS0VUKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSByZWFkTXVsdGlwbGllclJhbmdlKHRva2VuaXplcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJhbmdlID0ge1xuICAgICAgICAgICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgTEVGVENVUkxZQlJBQ0tFVDpcbiAgICAgICAgICAgIHJhbmdlID0gcmVhZE11bHRpcGxpZXJSYW5nZSh0b2tlbml6ZXIpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdNdWx0aXBsaWVyJyxcbiAgICAgICAgY29tbWE6IGNvbW1hLFxuICAgICAgICBtaW46IHJhbmdlLm1pbixcbiAgICAgICAgbWF4OiByYW5nZS5tYXgsXG4gICAgICAgIHRlcm06IG51bGxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXliZU11bHRpcGxpZWQodG9rZW5pemVyLCBub2RlKSB7XG4gICAgdmFyIG11bHRpcGxpZXIgPSByZWFkTXVsdGlwbGllcih0b2tlbml6ZXIpO1xuXG4gICAgaWYgKG11bHRpcGxpZXIgIT09IG51bGwpIHtcbiAgICAgICAgbXVsdGlwbGllci50ZXJtID0gbm9kZTtcbiAgICAgICAgcmV0dXJuIG11bHRpcGxpZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIG1heWJlVG9rZW4odG9rZW5pemVyKSB7XG4gICAgdmFyIGNoID0gdG9rZW5pemVyLnBlZWsoKTtcblxuICAgIGlmIChjaCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ1Rva2VuJyxcbiAgICAgICAgdmFsdWU6IGNoXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVhZFByb3BlcnR5KHRva2VuaXplcikge1xuICAgIHZhciBuYW1lO1xuXG4gICAgdG9rZW5pemVyLmVhdChMRVNTVEhBTlNJR04pO1xuICAgIHRva2VuaXplci5lYXQoQVBPU1RST1BIRSk7XG5cbiAgICBuYW1lID0gc2NhbldvcmQodG9rZW5pemVyKTtcblxuICAgIHRva2VuaXplci5lYXQoQVBPU1RST1BIRSk7XG4gICAgdG9rZW5pemVyLmVhdChHUkVBVEVSVEhBTlNJR04pO1xuXG4gICAgcmV0dXJuIG1heWJlTXVsdGlwbGllZCh0b2tlbml6ZXIsIHtcbiAgICAgICAgdHlwZTogJ1Byb3BlcnR5JyxcbiAgICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkVHlwZSh0b2tlbml6ZXIpIHtcbiAgICB2YXIgbmFtZTtcblxuICAgIHRva2VuaXplci5lYXQoTEVTU1RIQU5TSUdOKTtcbiAgICBuYW1lID0gc2NhbldvcmQodG9rZW5pemVyKTtcblxuICAgIGlmICh0b2tlbml6ZXIuY2hhckNvZGUoKSA9PT0gTEVGVFBBUkVOVEhFU0lTICYmXG4gICAgICAgIHRva2VuaXplci5uZXh0Q2hhckNvZGUoKSA9PT0gUklHSFRQQVJFTlRIRVNJUykge1xuICAgICAgICB0b2tlbml6ZXIucG9zICs9IDI7XG4gICAgICAgIG5hbWUgKz0gJygpJztcbiAgICB9XG5cbiAgICB0b2tlbml6ZXIuZWF0KEdSRUFURVJUSEFOU0lHTik7XG5cbiAgICByZXR1cm4gbWF5YmVNdWx0aXBsaWVkKHRva2VuaXplciwge1xuICAgICAgICB0eXBlOiAnVHlwZScsXG4gICAgICAgIG5hbWU6IG5hbWVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZEtleXdvcmRPckZ1bmN0aW9uKHRva2VuaXplcikge1xuICAgIHZhciBuYW1lO1xuXG4gICAgbmFtZSA9IHNjYW5Xb3JkKHRva2VuaXplcik7XG5cbiAgICBpZiAodG9rZW5pemVyLmNoYXJDb2RlKCkgPT09IExFRlRQQVJFTlRIRVNJUykge1xuICAgICAgICB0b2tlbml6ZXIucG9zKys7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdGdW5jdGlvbicsXG4gICAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heWJlTXVsdGlwbGllZCh0b2tlbml6ZXIsIHtcbiAgICAgICAgdHlwZTogJ0tleXdvcmQnLFxuICAgICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ3JvdXBUZXJtcyh0ZXJtcywgY29tYmluYXRvcnMpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGVHcm91cCh0ZXJtcywgY29tYmluYXRvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0dyb3VwJyxcbiAgICAgICAgICAgIHRlcm1zOiB0ZXJtcyxcbiAgICAgICAgICAgIGNvbWJpbmF0b3I6IGNvbWJpbmF0b3IsXG4gICAgICAgICAgICBkaXNhbGxvd0VtcHR5OiBmYWxzZSxcbiAgICAgICAgICAgIGV4cGxpY2l0OiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbWJpbmF0b3JzID0gT2JqZWN0LmtleXMoY29tYmluYXRvcnMpLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gQ09NQklOQVRPUl9QUkVDRURFTkNFW2FdIC0gQ09NQklOQVRPUl9QUkVDRURFTkNFW2JdO1xuICAgIH0pO1xuXG4gICAgd2hpbGUgKGNvbWJpbmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjb21iaW5hdG9ycy5zaGlmdCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgc3ViZ3JvdXBTdGFydCA9IDA7IGkgPCB0ZXJtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRlcm0gPSB0ZXJtc1tpXTtcbiAgICAgICAgICAgIGlmICh0ZXJtLnR5cGUgPT09ICdDb21iaW5hdG9yJykge1xuICAgICAgICAgICAgICAgIGlmICh0ZXJtLnZhbHVlID09PSBjb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJncm91cFN0YXJ0ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ3JvdXBTdGFydCA9IGkgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRlcm1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJncm91cFN0YXJ0ICE9PSAtMSAmJiBpIC0gc3ViZ3JvdXBTdGFydCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zLnNwbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJncm91cFN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSBzdWJncm91cFN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUdyb3VwKHRlcm1zLnNsaWNlKHN1Ymdyb3VwU3RhcnQsIGkpLCBjb21iaW5hdG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzdWJncm91cFN0YXJ0ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdWJncm91cFN0YXJ0ID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1Ymdyb3VwU3RhcnQgIT09IC0xICYmIGNvbWJpbmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGVybXMuc3BsaWNlKFxuICAgICAgICAgICAgICAgIHN1Ymdyb3VwU3RhcnQsXG4gICAgICAgICAgICAgICAgaSAtIHN1Ymdyb3VwU3RhcnQsXG4gICAgICAgICAgICAgICAgY3JlYXRlR3JvdXAodGVybXMuc2xpY2Uoc3ViZ3JvdXBTdGFydCwgaSksIGNvbWJpbmF0b3IpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbWJpbmF0b3I7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbXBsaWNpdEdyb3VwKHRva2VuaXplcikge1xuICAgIHZhciB0ZXJtcyA9IFtdO1xuICAgIHZhciBjb21iaW5hdG9ycyA9IHt9O1xuICAgIHZhciB0b2tlbjtcbiAgICB2YXIgcHJldlRva2VuID0gbnVsbDtcbiAgICB2YXIgcHJldlRva2VuUG9zID0gdG9rZW5pemVyLnBvcztcblxuICAgIHdoaWxlICh0b2tlbiA9IHBlZWsodG9rZW5pemVyKSkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ1NwYWNlcycpIHtcbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnQ29tYmluYXRvcicpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgY29tYmluYXRvciBpbiBncm91cCBiZWdpbm5pbmcgYW5kIGRvdWJsZSBjb21iaW5hdG9yIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgaWYgKHByZXZUb2tlbiA9PT0gbnVsbCB8fCBwcmV2VG9rZW4udHlwZSA9PT0gJ0NvbWJpbmF0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuaXplci5wb3MgPSBwcmV2VG9rZW5Qb3M7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuaXplci5lcnJvcignVW5leHBlY3RlZCBjb21iaW5hdG9yJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29tYmluYXRvcnNbdG9rZW4udmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldlRva2VuICE9PSBudWxsICYmIHByZXZUb2tlbi50eXBlICE9PSAnQ29tYmluYXRvcicpIHtcbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yc1snICddID0gdHJ1ZTsgIC8vIGEgYlxuICAgICAgICAgICAgICAgIHRlcm1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQ29tYmluYXRvcicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnICdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGVybXMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICBwcmV2VG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgIHByZXZUb2tlblBvcyA9IHRva2VuaXplci5wb3M7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjaGVjayBmb3IgY29tYmluYXRvciBpbiBncm91cCBlbmRpbmdcbiAgICBpZiAocHJldlRva2VuICE9PSBudWxsICYmIHByZXZUb2tlbi50eXBlID09PSAnQ29tYmluYXRvcicpIHtcbiAgICAgICAgdG9rZW5pemVyLnBvcyAtPSBwcmV2VG9rZW5Qb3M7XG4gICAgICAgIHRva2VuaXplci5lcnJvcignVW5leHBlY3RlZCBjb21iaW5hdG9yJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ0dyb3VwJyxcbiAgICAgICAgdGVybXM6IHRlcm1zLFxuICAgICAgICBjb21iaW5hdG9yOiByZWdyb3VwVGVybXModGVybXMsIGNvbWJpbmF0b3JzKSB8fCAnICcsXG4gICAgICAgIGRpc2FsbG93RW1wdHk6IGZhbHNlLFxuICAgICAgICBleHBsaWNpdDogZmFsc2VcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWFkR3JvdXAodG9rZW5pemVyKSB7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRva2VuaXplci5lYXQoTEVGVFNRVUFSRUJSQUNLRVQpO1xuICAgIHJlc3VsdCA9IHJlYWRJbXBsaWNpdEdyb3VwKHRva2VuaXplcik7XG4gICAgdG9rZW5pemVyLmVhdChSSUdIVFNRVUFSRUJSQUNLRVQpO1xuXG4gICAgcmVzdWx0LmV4cGxpY2l0ID0gdHJ1ZTtcblxuICAgIGlmICh0b2tlbml6ZXIuY2hhckNvZGUoKSA9PT0gRVhDTEFNQVRJT05NQVJLKSB7XG4gICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgcmVzdWx0LmRpc2FsbG93RW1wdHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBlZWsodG9rZW5pemVyKSB7XG4gICAgdmFyIGNvZGUgPSB0b2tlbml6ZXIuY2hhckNvZGUoKTtcblxuICAgIGlmIChjb2RlIDwgMTI4ICYmIE5BTUVfQ0hBUltjb2RlXSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcmVhZEtleXdvcmRPckZ1bmN0aW9uKHRva2VuaXplcik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgUklHSFRTUVVBUkVCUkFDS0VUOlxuICAgICAgICAgICAgLy8gZG9uJ3QgZWF0LCBzdG9wIHNjYW4gYSBncm91cFxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBMRUZUU1FVQVJFQlJBQ0tFVDpcbiAgICAgICAgICAgIHJldHVybiBtYXliZU11bHRpcGxpZWQodG9rZW5pemVyLCByZWFkR3JvdXAodG9rZW5pemVyKSk7XG5cbiAgICAgICAgY2FzZSBMRVNTVEhBTlNJR046XG4gICAgICAgICAgICByZXR1cm4gdG9rZW5pemVyLm5leHRDaGFyQ29kZSgpID09PSBBUE9TVFJPUEhFXG4gICAgICAgICAgICAgICAgPyByZWFkUHJvcGVydHkodG9rZW5pemVyKVxuICAgICAgICAgICAgICAgIDogcmVhZFR5cGUodG9rZW5pemVyKTtcblxuICAgICAgICBjYXNlIFZFUlRJQ0FMTElORTpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NvbWJpbmF0b3InLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b2tlbml6ZXIuc3Vic3RyaW5nVG9Qb3MoXG4gICAgICAgICAgICAgICAgICAgIHRva2VuaXplci5uZXh0Q2hhckNvZGUoKSA9PT0gVkVSVElDQUxMSU5FXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRva2VuaXplci5wb3MgKyAyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRva2VuaXplci5wb3MgKyAxXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICBjYXNlIEFNUEVSU0FORDpcbiAgICAgICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgICAgIHRva2VuaXplci5lYXQoQU1QRVJTQU5EKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQ29tYmluYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcmJidcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSBDT01NQTpcbiAgICAgICAgICAgIHRva2VuaXplci5wb3MrKztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NvbW1hJ1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBjYXNlIEFQT1NUUk9QSEU6XG4gICAgICAgICAgICByZXR1cm4gbWF5YmVNdWx0aXBsaWVkKHRva2VuaXplciwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzY2FuU3RyaW5nKHRva2VuaXplcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgU1BBQ0U6XG4gICAgICAgIGNhc2UgVEFCOlxuICAgICAgICBjYXNlIE46XG4gICAgICAgIGNhc2UgUjpcbiAgICAgICAgY2FzZSBGOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3BhY2VzJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogc2NhblNwYWNlcyh0b2tlbml6ZXIpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgQ09NTUVSQ0lBTEFUOlxuICAgICAgICAgICAgY29kZSA9IHRva2VuaXplci5uZXh0Q2hhckNvZGUoKTtcblxuICAgICAgICAgICAgaWYgKGNvZGUgPCAxMjggJiYgTkFNRV9DSEFSW2NvZGVdID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5pemVyLnBvcysrO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBdEtleXdvcmQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBzY2FuV29yZCh0b2tlbml6ZXIpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1heWJlVG9rZW4odG9rZW5pemVyKTtcblxuICAgICAgICBjYXNlIEFTVEVSSVNLOlxuICAgICAgICBjYXNlIFBMVVNTSUdOOlxuICAgICAgICBjYXNlIFFVRVNUSU9OTUFSSzpcbiAgICAgICAgY2FzZSBOVU1CRVJTSUdOOlxuICAgICAgICBjYXNlIEVYQ0xBTUFUSU9OTUFSSzpcbiAgICAgICAgICAgIC8vIHByb2hpYml0ZWQgdG9rZW5zICh1c2VkIGFzIGEgbXVsdGlwbGllciBzdGFydClcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgTEVGVENVUkxZQlJBQ0tFVDpcbiAgICAgICAgICAgIC8vIExFRlRDVVJMWUJSQUNLRVQgaXMgYWxsb3dlZCBzaW5jZSBtZG4vZGF0YSB1c2VzIGl0IHcvbyBxdW90aW5nXG4gICAgICAgICAgICAvLyBjaGVjayBuZXh0IGNoYXIgaXNuJ3QgYSBudW1iZXIsIGJlY2F1c2UgaXQncyBsaWtlbHkgYSBkaXNqb2luZWQgbXVsdGlwbGllclxuICAgICAgICAgICAgY29kZSA9IHRva2VuaXplci5uZXh0Q2hhckNvZGUoKTtcblxuICAgICAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF5YmVUb2tlbih0b2tlbml6ZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG1heWJlVG9rZW4odG9rZW5pemVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHZhciB0b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKHN0cik7XG4gICAgdmFyIHJlc3VsdCA9IHJlYWRJbXBsaWNpdEdyb3VwKHRva2VuaXplcik7XG5cbiAgICBpZiAodG9rZW5pemVyLnBvcyAhPT0gc3RyLmxlbmd0aCkge1xuICAgICAgICB0b2tlbml6ZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgaW5wdXQnKTtcbiAgICB9XG5cbiAgICAvLyByZWR1Y2UgcmVkdW5kYW50IGdyb3VwcyB3aXRoIHNpbmdsZSBncm91cCB0ZXJtXG4gICAgaWYgKHJlc3VsdC50ZXJtcy5sZW5ndGggPT09IDEgJiYgcmVzdWx0LnRlcm1zWzBdLnR5cGUgPT09ICdHcm91cCcpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRlcm1zWzBdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHdhcm0gdXAgcGFyc2UgdG8gZWxpbWl0YXRlIGNvZGUgYnJhbmNoZXMgdGhhdCBuZXZlciBleGVjdXRlXG4vLyBmaXggc29mdCBkZW9wdGltaXphdGlvbnMgKGluc3VmZmljaWVudCB0eXBlIGZlZWRiYWNrKVxucGFyc2UoJ1thJiY8Yj4jfDxcXCdjXFwnPip8fGUoKSBmezJ9IC8sKCUgZyN7MSwyfSBoezIsfSldIScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbmZ1bmN0aW9uIGVuc3VyZUZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogbm9vcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgZnVuY3Rpb24gd2Fsayhub2RlKSB7XG4gICAgICAgIGVudGVyLmNhbGwoY29udGV4dCwgbm9kZSk7XG5cbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0dyb3VwJzpcbiAgICAgICAgICAgICAgICBub2RlLnRlcm1zLmZvckVhY2god2Fsayk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ011bHRpcGxpZXInOlxuICAgICAgICAgICAgICAgIHdhbGsobm9kZS50ZXJtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnVHlwZSc6XG4gICAgICAgICAgICBjYXNlICdQcm9wZXJ0eSc6XG4gICAgICAgICAgICBjYXNlICdLZXl3b3JkJzpcbiAgICAgICAgICAgIGNhc2UgJ0F0S2V5d29yZCc6XG4gICAgICAgICAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgICAgY2FzZSAnVG9rZW4nOlxuICAgICAgICAgICAgY2FzZSAnQ29tbWEnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB0eXBlOiAnICsgbm9kZS50eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxlYXZlLmNhbGwoY29udGV4dCwgbm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIGVudGVyID0gbm9vcDtcbiAgICB2YXIgbGVhdmUgPSBub29wO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVudGVyID0gb3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgZW50ZXIgPSBlbnN1cmVGdW5jdGlvbihvcHRpb25zLmVudGVyKTtcbiAgICAgICAgbGVhdmUgPSBlbnN1cmVGdW5jdGlvbihvcHRpb25zLmxlYXZlKTtcbiAgICB9XG5cbiAgICBpZiAoZW50ZXIgPT09IG5vb3AgJiYgbGVhdmUgPT09IG5vb3ApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWl0aGVyIGBlbnRlcmAgbm9yIGBsZWF2ZWAgd2Fsa2VyIGhhbmRsZXIgaXMgc2V0IG9yIGJvdGggYXJlblxcJ3QgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHdhbGsobm9kZSwgY29udGV4dCk7XG59O1xuIiwidmFyIHBhcnNlID0gcmVxdWlyZSgnLi9ncmFtbWFyL3BhcnNlJyk7XG5cbnZhciBNQVRDSCA9IHsgdHlwZTogJ01hdGNoJyB9O1xudmFyIE1JU01BVENIID0geyB0eXBlOiAnTWlzbWF0Y2gnIH07XG52YXIgRElTQUxMT1dfRU1QVFkgPSB7IHR5cGU6ICdEaXNhbGxvd0VtcHR5JyB9O1xudmFyIExFRlRQQVJFTlRIRVNJUyA9IDQwOyAgLy8gKFxudmFyIFJJR0hUUEFSRU5USEVTSVMgPSA0MTsgLy8gKVxuXG5mdW5jdGlvbiBjcmVhdGVDb25kaXRpb24obWF0Y2gsIHRoZW5CcmFuY2gsIGVsc2VCcmFuY2gpIHtcbiAgICAvLyByZWR1Y2Ugbm9kZSBjb3VudFxuICAgIGlmICh0aGVuQnJhbmNoID09PSBNQVRDSCAmJiBlbHNlQnJhbmNoID09PSBNSVNNQVRDSCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoID09PSBNQVRDSCAmJiB0aGVuQnJhbmNoID09PSBNQVRDSCAmJiBlbHNlQnJhbmNoID09PSBNQVRDSCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoLnR5cGUgPT09ICdJZicgJiYgbWF0Y2guZWxzZSA9PT0gTUlTTUFUQ0ggJiYgdGhlbkJyYW5jaCA9PT0gTUFUQ0gpIHtcbiAgICAgICAgdGhlbkJyYW5jaCA9IG1hdGNoLnRoZW47XG4gICAgICAgIG1hdGNoID0gbWF0Y2gubWF0Y2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ0lmJyxcbiAgICAgICAgbWF0Y2g6IG1hdGNoLFxuICAgICAgICB0aGVuOiB0aGVuQnJhbmNoLFxuICAgICAgICBlbHNlOiBlbHNlQnJhbmNoXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvblR5cGUobmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIG5hbWUubGVuZ3RoID4gMiAmJlxuICAgICAgICBuYW1lLmNoYXJDb2RlQXQobmFtZS5sZW5ndGggLSAyKSA9PT0gTEVGVFBBUkVOVEhFU0lTICYmXG4gICAgICAgIG5hbWUuY2hhckNvZGVBdChuYW1lLmxlbmd0aCAtIDEpID09PSBSSUdIVFBBUkVOVEhFU0lTXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNFbnVtQ2FwYXRpYmxlKHRlcm0pIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0ZXJtLnR5cGUgPT09ICdLZXl3b3JkJyB8fFxuICAgICAgICB0ZXJtLnR5cGUgPT09ICdBdEtleXdvcmQnIHx8XG4gICAgICAgIHRlcm0udHlwZSA9PT0gJ0Z1bmN0aW9uJyB8fFxuICAgICAgICB0ZXJtLnR5cGUgPT09ICdUeXBlJyAmJiBpc0Z1bmN0aW9uVHlwZSh0ZXJtLm5hbWUpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRHcm91cE1hdGNoR3JhcGgoY29tYmluYXRvciwgdGVybXMsIGF0TGVhc3RPbmVUZXJtTWF0Y2hlZCkge1xuICAgIHN3aXRjaCAoY29tYmluYXRvcikge1xuICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgIC8vIEp1eHRhcG9zaW5nIGNvbXBvbmVudHMgbWVhbnMgdGhhdCBhbGwgb2YgdGhlbSBtdXN0IG9jY3VyLCBpbiB0aGUgZ2l2ZW4gb3JkZXIuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYSBiIGNcbiAgICAgICAgICAgIC8vID1cbiAgICAgICAgICAgIC8vIG1hdGNoIGFcbiAgICAgICAgICAgIC8vICAgdGhlbiBtYXRjaCBiXG4gICAgICAgICAgICAvLyAgICAgdGhlbiBtYXRjaCBjXG4gICAgICAgICAgICAvLyAgICAgICB0aGVuIE1BVENIXG4gICAgICAgICAgICAvLyAgICAgICBlbHNlIE1JU01BVENIXG4gICAgICAgICAgICAvLyAgICAgZWxzZSBNSVNNQVRDSFxuICAgICAgICAgICAgLy8gICBlbHNlIE1JU01BVENIXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gTUFUQ0g7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0ZXJtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHZhciB0ZXJtID0gdGVybXNbaV07XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVDb25kaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRlcm0sXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgTUlTTUFUQ0hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICAgIC8vIEEgYmFyICh8KSBzZXBhcmF0ZXMgdHdvIG9yIG1vcmUgYWx0ZXJuYXRpdmVzOiBleGFjdGx5IG9uZSBvZiB0aGVtIG11c3Qgb2NjdXIuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYSB8IGIgfCBjXG4gICAgICAgICAgICAvLyA9XG4gICAgICAgICAgICAvLyBtYXRjaCBhXG4gICAgICAgICAgICAvLyAgIHRoZW4gTUFUQ0hcbiAgICAgICAgICAgIC8vICAgZWxzZSBtYXRjaCBiXG4gICAgICAgICAgICAvLyAgICAgdGhlbiBNQVRDSFxuICAgICAgICAgICAgLy8gICAgIGVsc2UgbWF0Y2ggY1xuICAgICAgICAgICAgLy8gICAgICAgdGhlbiBNQVRDSFxuICAgICAgICAgICAgLy8gICAgICAgZWxzZSBNSVNNQVRDSFxuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gTUlTTUFUQ0g7XG4gICAgICAgICAgICB2YXIgbWFwID0gbnVsbDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRlcm1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRlcm0gPSB0ZXJtc1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIHJlZHVjZSBzZXF1ZW5jZSBvZiBrZXl3b3JkcyBpbnRvIGEgRW51bVxuICAgICAgICAgICAgICAgIGlmIChpc0VudW1DYXBhdGlibGUodGVybSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9PT0gbnVsbCAmJiBpID4gMCAmJiBpc0VudW1DYXBhdGlibGUodGVybXNbaSAtIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdFbnVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVENILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAoaXNGdW5jdGlvblR5cGUodGVybS5uYW1lKSA/IHRlcm0ubmFtZS5zbGljZSgwLCAtMSkgOiB0ZXJtLm5hbWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1hcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHRlcm07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtYXAgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbmRpdG9uYWwgbm9kZVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgdGVybSxcbiAgICAgICAgICAgICAgICAgICAgTUFUQ0gsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIGNhc2UgJyYmJzpcbiAgICAgICAgICAgIC8vIEEgZG91YmxlIGFtcGVyc2FuZCAoJiYpIHNlcGFyYXRlcyB0d28gb3IgbW9yZSBjb21wb25lbnRzLFxuICAgICAgICAgICAgLy8gYWxsIG9mIHdoaWNoIG11c3Qgb2NjdXIsIGluIGFueSBvcmRlci5cblxuICAgICAgICAgICAgLy8gVXNlIE1hdGNoT25jZSBmb3IgZ3JvdXBzIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgdGVybXMsXG4gICAgICAgICAgICAvLyBzaW5jZSAmJi1ncm91cHMgcHJvZHVjZXMgYXQgbGVhc3QgTiEtbm9kZSB0cmVlc1xuICAgICAgICAgICAgaWYgKHRlcm1zLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTWF0Y2hPbmNlJyxcbiAgICAgICAgICAgICAgICAgICAgdGVybXM6IHRlcm1zLFxuICAgICAgICAgICAgICAgICAgICBhbGw6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVc2UgYSBjb21iaW5hdGlvbiB0cmVlIGZvciBncm91cHMgd2l0aCBzbWFsbCBudW1iZXIgb2YgdGVybXNcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhICYmIGIgJiYgY1xuICAgICAgICAgICAgLy8gPVxuICAgICAgICAgICAgLy8gbWF0Y2ggYVxuICAgICAgICAgICAgLy8gICB0aGVuIFtiICYmIGNdXG4gICAgICAgICAgICAvLyAgIGVsc2UgbWF0Y2ggYlxuICAgICAgICAgICAgLy8gICAgIHRoZW4gW2EgJiYgY11cbiAgICAgICAgICAgIC8vICAgICBlbHNlIG1hdGNoIGNcbiAgICAgICAgICAgIC8vICAgICAgIHRoZW4gW2EgJiYgYl1cbiAgICAgICAgICAgIC8vICAgICAgIGVsc2UgTUlTTUFUQ0hcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhICYmIGJcbiAgICAgICAgICAgIC8vID1cbiAgICAgICAgICAgIC8vIG1hdGNoIGFcbiAgICAgICAgICAgIC8vICAgdGhlbiBtYXRjaCBiXG4gICAgICAgICAgICAvLyAgICAgdGhlbiBNQVRDSFxuICAgICAgICAgICAgLy8gICAgIGVsc2UgTUlTTUFUQ0hcbiAgICAgICAgICAgIC8vICAgZWxzZSBtYXRjaCBiXG4gICAgICAgICAgICAvLyAgICAgdGhlbiBtYXRjaCBhXG4gICAgICAgICAgICAvLyAgICAgICB0aGVuIE1BVENIXG4gICAgICAgICAgICAvLyAgICAgICBlbHNlIE1JU01BVENIXG4gICAgICAgICAgICAvLyAgICAgZWxzZSBNSVNNQVRDSFxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE1JU01BVENIO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGVybXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB2YXIgdGVybSA9IHRlcm1zW2ldO1xuICAgICAgICAgICAgICAgIHZhciB0aGVuQ2xhdXNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRlcm1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhlbkNsYXVzZSA9IGJ1aWxkR3JvdXBNYXRjaEdyYXBoKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zLmZpbHRlcihmdW5jdGlvbihuZXdHcm91cFRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3R3JvdXBUZXJtICE9PSB0ZXJtO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoZW5DbGF1c2UgPSBNQVRDSDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVDb25kaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRlcm0sXG4gICAgICAgICAgICAgICAgICAgIHRoZW5DbGF1c2UsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIGNhc2UgJ3x8JzpcbiAgICAgICAgICAgIC8vIEEgZG91YmxlIGJhciAofHwpIHNlcGFyYXRlcyB0d28gb3IgbW9yZSBvcHRpb25zOlxuICAgICAgICAgICAgLy8gb25lIG9yIG1vcmUgb2YgdGhlbSBtdXN0IG9jY3VyLCBpbiBhbnkgb3JkZXIuXG5cbiAgICAgICAgICAgIC8vIFVzZSBNYXRjaE9uY2UgZm9yIGdyb3VwcyB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIHRlcm1zLFxuICAgICAgICAgICAgLy8gc2luY2UgfHwtZ3JvdXBzIHByb2R1Y2VzIGF0IGxlYXN0IE4hLW5vZGUgdHJlZXNcbiAgICAgICAgICAgIGlmICh0ZXJtcy5sZW5ndGggPiA1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01hdGNoT25jZScsXG4gICAgICAgICAgICAgICAgICAgIHRlcm1zOiB0ZXJtcyxcbiAgICAgICAgICAgICAgICAgICAgYWxsOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVc2UgYSBjb21iaW5hdGlvbiB0cmVlIGZvciBncm91cHMgd2l0aCBzbWFsbCBudW1iZXIgb2YgdGVybXNcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhIHx8IGIgfHwgY1xuICAgICAgICAgICAgLy8gPVxuICAgICAgICAgICAgLy8gbWF0Y2ggYVxuICAgICAgICAgICAgLy8gICB0aGVuIFtiIHx8IGNdXG4gICAgICAgICAgICAvLyAgIGVsc2UgbWF0Y2ggYlxuICAgICAgICAgICAgLy8gICAgIHRoZW4gW2EgfHwgY11cbiAgICAgICAgICAgIC8vICAgICBlbHNlIG1hdGNoIGNcbiAgICAgICAgICAgIC8vICAgICAgIHRoZW4gW2EgfHwgYl1cbiAgICAgICAgICAgIC8vICAgICAgIGVsc2UgTUlTTUFUQ0hcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhIHx8IGJcbiAgICAgICAgICAgIC8vID1cbiAgICAgICAgICAgIC8vIG1hdGNoIGFcbiAgICAgICAgICAgIC8vICAgdGhlbiBtYXRjaCBiXG4gICAgICAgICAgICAvLyAgICAgdGhlbiBNQVRDSFxuICAgICAgICAgICAgLy8gICAgIGVsc2UgTUFUQ0hcbiAgICAgICAgICAgIC8vICAgZWxzZSBtYXRjaCBiXG4gICAgICAgICAgICAvLyAgICAgdGhlbiBtYXRjaCBhXG4gICAgICAgICAgICAvLyAgICAgICB0aGVuIE1BVENIXG4gICAgICAgICAgICAvLyAgICAgICBlbHNlIE1BVENIXG4gICAgICAgICAgICAvLyAgICAgZWxzZSBNSVNNQVRDSFxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF0TGVhc3RPbmVUZXJtTWF0Y2hlZCA/IE1BVENIIDogTUlTTUFUQ0g7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0ZXJtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHZhciB0ZXJtID0gdGVybXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHRoZW5DbGF1c2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGVybXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGVuQ2xhdXNlID0gYnVpbGRHcm91cE1hdGNoR3JhcGgoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMuZmlsdGVyKGZ1bmN0aW9uKG5ld0dyb3VwVGVybSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdHcm91cFRlcm0gIT09IHRlcm07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGVuQ2xhdXNlID0gTUFUQ0g7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICB0ZXJtLFxuICAgICAgICAgICAgICAgICAgICB0aGVuQ2xhdXNlLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTXVsdGlwbGllck1hdGNoR3JhcGgobm9kZSkge1xuICAgIHZhciByZXN1bHQgPSBNQVRDSDtcbiAgICB2YXIgbWF0Y2hUZXJtID0gYnVpbGRNYXRjaEdyYXBoKG5vZGUudGVybSk7XG5cbiAgICBpZiAobm9kZS5tYXggPT09IDApIHtcbiAgICAgICAgLy8gZGlzYWJsZSByZXBlYXRpbmcgb2YgZW1wdHkgbWF0Y2ggdG8gcHJldmVudCBpbmZpbml0ZSBsb29wXG4gICAgICAgIG1hdGNoVGVybSA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgIG1hdGNoVGVybSxcbiAgICAgICAgICAgIERJU0FMTE9XX0VNUFRZLFxuICAgICAgICAgICAgTUlTTUFUQ0hcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBhbiBvY2N1cnJlbmNlIGNvdW50IGlzIG5vdCBsaW1pdGVkLCBtYWtlIGEgY3ljbGU7XG4gICAgICAgIC8vIHRvIGNvbGxlY3QgbW9yZSB0ZXJtcyBvbiBlYWNoIGZvbGxvd2luZyBtYXRjaGluZyBtaXNtYXRjaFxuICAgICAgICByZXN1bHQgPSBjcmVhdGVDb25kaXRpb24oXG4gICAgICAgICAgICBtYXRjaFRlcm0sXG4gICAgICAgICAgICBudWxsLCAvLyB3aWxsIGJlIGEgbG9vcFxuICAgICAgICAgICAgTUlTTUFUQ0hcbiAgICAgICAgKTtcblxuICAgICAgICByZXN1bHQudGhlbiA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgIE1BVENILFxuICAgICAgICAgICAgTUFUQ0gsXG4gICAgICAgICAgICByZXN1bHQgLy8gbWFrZSBhIGxvb3BcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobm9kZS5jb21tYSkge1xuICAgICAgICAgICAgcmVzdWx0LnRoZW4uZWxzZSA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdDb21tYScsIHN5bnRheDogbm9kZSB9LFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBNSVNNQVRDSFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNyZWF0ZSBhIG1hdGNoIG5vZGUgY2hhaW4gZm9yIFttaW4gLi4gbWF4XSBpbnRlcnZhbCB3aXRoIG9wdGlvbmFsIG1hdGNoZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGUubWluIHx8IDE7IGkgPD0gbm9kZS5tYXg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29tbWEgJiYgcmVzdWx0ICE9PSBNQVRDSCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnQ29tbWEnLCBzeW50YXg6IG5vZGUgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBNSVNNQVRDSFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICBtYXRjaFRlcm0sXG4gICAgICAgICAgICAgICAgY3JlYXRlQ29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICBNQVRDSCxcbiAgICAgICAgICAgICAgICAgICAgTUFUQ0gsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgTUlTTUFUQ0hcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5taW4gPT09IDApIHtcbiAgICAgICAgLy8gYWxsb3cgemVybyBtYXRjaFxuICAgICAgICByZXN1bHQgPSBjcmVhdGVDb25kaXRpb24oXG4gICAgICAgICAgICBNQVRDSCxcbiAgICAgICAgICAgIE1BVENILFxuICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY3JlYXRlIGEgbWF0Y2ggbm9kZSBjaGFpbiB0byBjb2xsZWN0IFswIC4uLiBtaW4gLSAxXSByZXF1aXJlZCBtYXRjaGVzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5taW4gLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbW1hICYmIHJlc3VsdCAhPT0gTUFUQ0gpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVDb25kaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ0NvbW1hJywgc3ludGF4OiBub2RlIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgTUlTTUFUQ0hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVDb25kaXRpb24oXG4gICAgICAgICAgICAgICAgbWF0Y2hUZXJtLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBNSVNNQVRDSFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2hHcmFwaChub2RlKSB7XG4gICAgaWYgKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnR2VuZXJpYycsXG4gICAgICAgICAgICBmbjogbm9kZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0dyb3VwJzpcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBidWlsZEdyb3VwTWF0Y2hHcmFwaChcbiAgICAgICAgICAgICAgICBub2RlLmNvbWJpbmF0b3IsXG4gICAgICAgICAgICAgICAgbm9kZS50ZXJtcy5tYXAoYnVpbGRNYXRjaEdyYXBoKSxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKG5vZGUuZGlzYWxsb3dFbXB0eSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBESVNBTExPV19FTVBUWSxcbiAgICAgICAgICAgICAgICAgICAgTUlTTUFUQ0hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIGNhc2UgJ011bHRpcGxpZXInOlxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTXVsdGlwbGllck1hdGNoR3JhcGgobm9kZSk7XG5cbiAgICAgICAgY2FzZSAnVHlwZSc6XG4gICAgICAgIGNhc2UgJ1Byb3BlcnR5JzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUubmFtZSxcbiAgICAgICAgICAgICAgICBzeW50YXg6IG5vZGVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBzeW50YXg6IG5vZGVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnQXRLZXl3b3JkJzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdAJyArIG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgIHN5bnRheDogbm9kZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUudG9Mb3dlckNhc2UoKSArICcoJyxcbiAgICAgICAgICAgICAgICBzeW50YXg6IG5vZGVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgYSBvbmUgY2hhciBsZW5ndGggU3RyaW5nIHRvIGEgVG9rZW5cbiAgICAgICAgICAgIGlmIChub2RlLnZhbHVlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUb2tlbicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBub2RlLnZhbHVlLmNoYXJBdCgxKSxcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4OiBub2RlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSBpdCBhcyBpc1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUsXG4gICAgICAgICAgICAgICAgc3ludGF4OiBub2RlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1Rva2VuJzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBub2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN5bnRheDogbm9kZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdDb21tYSc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAgICAgICBzeW50YXg6IG5vZGVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGU6Jywgbm9kZS50eXBlKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIE1BVENIOiBNQVRDSCxcbiAgICBNSVNNQVRDSDogTUlTTUFUQ0gsXG4gICAgRElTQUxMT1dfRU1QVFk6IERJU0FMTE9XX0VNUFRZLFxuICAgIGJ1aWxkTWF0Y2hHcmFwaDogZnVuY3Rpb24oc3ludGF4VHJlZSwgcmVmKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ludGF4VHJlZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN5bnRheFRyZWUgPSBwYXJzZShzeW50YXhUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnTWF0Y2hHcmFwaCcsXG4gICAgICAgICAgICBtYXRjaDogYnVpbGRNYXRjaEdyYXBoKHN5bnRheFRyZWUpLFxuICAgICAgICAgICAgc3ludGF4OiByZWYgfHwgbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZTogc3ludGF4VHJlZVxuICAgICAgICB9O1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgbWF0Y2hHcmFwaCA9IHJlcXVpcmUoJy4vbWF0Y2gtZ3JhcGgnKTtcbnZhciBNQVRDSCA9IG1hdGNoR3JhcGguTUFUQ0g7XG52YXIgTUlTTUFUQ0ggPSBtYXRjaEdyYXBoLk1JU01BVENIO1xudmFyIERJU0FMTE9XX0VNUFRZID0gbWF0Y2hHcmFwaC5ESVNBTExPV19FTVBUWTtcblxudmFyIFRPS0VOID0gMTtcbnZhciBPUEVOX1NZTlRBWCA9IDI7XG52YXIgQ0xPU0VfU1lOVEFYID0gMztcblxudmFyIEVYSVRfUkVBU09OX01BVENIID0gJ01hdGNoJztcbnZhciBFWElUX1JFQVNPTl9NSVNNQVRDSCA9ICdNaXNtYXRjaCc7XG52YXIgRVhJVF9SRUFTT05fSVRFUkFUSU9OX0xJTUlUID0gJ01heGltdW0gaXRlcmF0aW9uIG51bWJlciBleGNlZWRlZCAocGxlYXNlIGZpbGwgYW4gaXNzdWUgb24gaHR0cHM6Ly9naXRodWIuY29tL2Nzc3RyZWUvY3NzdHJlZS9pc3N1ZXMpJztcblxudmFyIElURVJBVElPTl9MSU1JVCA9IDEwMDAwO1xudmFyIHRvdGFsSXRlcmF0aW9uQ291bnQgPSAwO1xuXG5mdW5jdGlvbiBtYXBMaXN0KGxpc3QsIGZuKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKGxpc3QpIHtcbiAgICAgICAgcmVzdWx0LnVuc2hpZnQoZm4obGlzdCkpO1xuICAgICAgICBsaXN0ID0gbGlzdC5wcmV2O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzQ29tbWFDb250ZXh0U3RhcnQodG9rZW4pIHtcbiAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdG9rZW4gPSB0b2tlbi52YWx1ZS5jaGFyQXQodG9rZW4udmFsdWUubGVuZ3RoIC0gMSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICB0b2tlbiA9PT0gJywnIHx8XG4gICAgICAgIHRva2VuID09PSAnKCcgfHxcbiAgICAgICAgdG9rZW4gPT09ICdbJyB8fFxuICAgICAgICB0b2tlbiA9PT0gJy8nXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNDb21tYUNvbnRleHRFbmQodG9rZW4pIHtcbiAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdG9rZW4gPSB0b2tlbi52YWx1ZS5jaGFyQXQoMCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICB0b2tlbiA9PT0gJyknIHx8XG4gICAgICAgIHRva2VuID09PSAnXScgfHxcbiAgICAgICAgdG9rZW4gPT09ICcvJ1xuICAgICk7XG59XG5cbmZ1bmN0aW9uIGludGVybmFsTWF0Y2godG9rZW5zLCBzeW50YXgsIHN5bnRheGVzKSB7XG4gICAgZnVuY3Rpb24gbW92ZVRvTmV4dFRva2VuKCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICB0b2tlbkN1cnNvcisrO1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbkN1cnNvciA8IHRva2Vucy5sZW5ndGggPyB0b2tlbnNbdG9rZW5DdXJzb3JdIDogbnVsbDtcbiAgICAgICAgfSB3aGlsZSAodG9rZW4gIT09IG51bGwgJiYgIS9cXFMvLnRlc3QodG9rZW4udmFsdWUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXROZXh0VG9rZW4ob2Zmc2V0KSB7XG4gICAgICAgIHZhciBuZXh0SW5kZXggPSB0b2tlbkN1cnNvciArIG9mZnNldDtcblxuICAgICAgICByZXR1cm4gbmV4dEluZGV4IDwgdG9rZW5zLmxlbmd0aCA/IHRva2Vuc1tuZXh0SW5kZXhdIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwdXNoVGhlblN0YWNrKG5leHRTeW50YXgpIHtcbiAgICAgICAgdGhlblN0YWNrID0ge1xuICAgICAgICAgICAgbmV4dFN5bnRheDogbmV4dFN5bnRheCxcbiAgICAgICAgICAgIG1hdGNoU3RhY2s6IG1hdGNoU3RhY2ssXG4gICAgICAgICAgICBzeW50YXhTdGFjazogc3ludGF4U3RhY2ssXG4gICAgICAgICAgICBwcmV2OiB0aGVuU3RhY2tcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwdXNoRWxzZVN0YWNrKG5leHRTeW50YXgpIHtcbiAgICAgICAgZWxzZVN0YWNrID0ge1xuICAgICAgICAgICAgbmV4dFN5bnRheDogbmV4dFN5bnRheCxcbiAgICAgICAgICAgIG1hdGNoU3RhY2s6IG1hdGNoU3RhY2ssXG4gICAgICAgICAgICBzeW50YXhTdGFjazogc3ludGF4U3RhY2ssXG4gICAgICAgICAgICB0aGVuU3RhY2s6IHRoZW5TdGFjayxcbiAgICAgICAgICAgIHRva2VuQ3Vyc29yOiB0b2tlbkN1cnNvcixcbiAgICAgICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgICAgIHByZXY6IGVsc2VTdGFja1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRva2VuVG9NYXRjaCgpIHtcbiAgICAgICAgbWF0Y2hTdGFjayA9IHtcbiAgICAgICAgICAgIHR5cGU6IFRPS0VOLFxuICAgICAgICAgICAgc3ludGF4OiBzeW50YXguc3ludGF4LFxuICAgICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgcHJldjogbWF0Y2hTdGFja1xuICAgICAgICB9O1xuXG4gICAgICAgIG1vdmVUb05leHRUb2tlbigpO1xuXG4gICAgICAgIGlmICh0b2tlbkN1cnNvciA+IGxvbmdlc3RNYXRjaCkge1xuICAgICAgICAgICAgbG9uZ2VzdE1hdGNoID0gdG9rZW5DdXJzb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0Y2hTdGFjay50b2tlbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvcGVuU3ludGF4KCkge1xuICAgICAgICBzeW50YXhTdGFjayA9IHtcbiAgICAgICAgICAgIHN5bnRheDogc3ludGF4LFxuICAgICAgICAgICAgcHJldjogc3ludGF4U3RhY2tcbiAgICAgICAgfTtcblxuICAgICAgICBtYXRjaFN0YWNrID0ge1xuICAgICAgICAgICAgdHlwZTogT1BFTl9TWU5UQVgsXG4gICAgICAgICAgICBzeW50YXg6IHN5bnRheC5zeW50YXgsXG4gICAgICAgICAgICB0b2tlbjogbWF0Y2hTdGFjay50b2tlbixcbiAgICAgICAgICAgIHByZXY6IG1hdGNoU3RhY2tcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9zZVN5bnRheCgpIHtcbiAgICAgICAgaWYgKG1hdGNoU3RhY2sudHlwZSA9PT0gT1BFTl9TWU5UQVgpIHtcbiAgICAgICAgICAgIG1hdGNoU3RhY2sgPSBtYXRjaFN0YWNrLnByZXY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXRjaFN0YWNrID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IENMT1NFX1NZTlRBWCxcbiAgICAgICAgICAgICAgICBzeW50YXg6IHN5bnRheFN0YWNrLnN5bnRheCxcbiAgICAgICAgICAgICAgICB0b2tlbjogbWF0Y2hTdGFjay50b2tlbixcbiAgICAgICAgICAgICAgICBwcmV2OiBtYXRjaFN0YWNrXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgc3ludGF4U3RhY2sgPSBzeW50YXhTdGFjay5wcmV2O1xuICAgIH1cblxuICAgIHZhciBzeW50YXhTdGFjayA9IG51bGw7XG4gICAgdmFyIHRoZW5TdGFjayA9IG51bGw7XG4gICAgdmFyIGVsc2VTdGFjayA9IG51bGw7XG5cbiAgICB2YXIgaXRlcmF0aW9uQ291bnQgPSAwO1xuICAgIHZhciBleGl0UmVhc29uID0gRVhJVF9SRUFTT05fTUFUQ0g7XG5cbiAgICB2YXIgbWF0Y2hTdGFjayA9IHsgdHlwZTogJ1N0dWInLCBzeW50YXg6IG51bGwsIHRva2VuOiBudWxsLCB0b2tlbkN1cnNvcjogLTEsIHByZXY6IG51bGwgfTtcbiAgICB2YXIgbG9uZ2VzdE1hdGNoID0gMDtcbiAgICB2YXIgdG9rZW5DdXJzb3IgPSAtMTtcbiAgICB2YXIgdG9rZW4gPSBudWxsO1xuXG4gICAgbW92ZVRvTmV4dFRva2VuKCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnLS1cXG4nLFxuICAgICAgICAvLyAgICAgJyMnICsgaXRlcmF0aW9uQ291bnQsXG4gICAgICAgIC8vICAgICByZXF1aXJlKCd1dGlsJykuaW5zcGVjdCh7XG4gICAgICAgIC8vICAgICAgICAgbWF0Y2g6IG1hcExpc3QobWF0Y2hTdGFjaywgeCA9PiB4LnR5cGUgPT09IFRPS0VOID8geC50b2tlbiAmJiB4LnRva2VuLnZhbHVlIDogeC5zeW50YXggPyB4LnR5cGUgKyAnIScgKyB4LnN5bnRheC5uYW1lIDogbnVsbCksXG4gICAgICAgIC8vICAgICAgICAgZWxzZVN0YWNrOiBtYXBMaXN0KGVsc2VTdGFjaywgeCA9PiB4LmlkKSxcbiAgICAgICAgLy8gICAgICAgICB0aGVuU3RhY2s6IG1hcExpc3QodGhlblN0YWNrLCB4ID0+IHguaWQpLFxuICAgICAgICAvLyAgICAgICAgIHRva2VuOiB0b2tlbiAmJiB0b2tlbi52YWx1ZSxcbiAgICAgICAgLy8gICAgICAgICB0b2tlbkN1cnNvcixcbiAgICAgICAgLy8gICAgICAgICBzeW50YXhcbiAgICAgICAgLy8gICAgIH0sIHsgZGVwdGg6IG51bGwgfSlcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBwcmV2ZW50IGluZmluaXRlIGxvb3BcbiAgICAgICAgaWYgKCsraXRlcmF0aW9uQ291bnQgPT09IElURVJBVElPTl9MSU1JVCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbY3NzdHJlZS1tYXRjaF0gQlJFQUsgYWZ0ZXIgJyArIElURVJBVElPTl9MSU1JVCArICcgaXRlcmF0aW9ucycpO1xuICAgICAgICAgICAgZXhpdFJlYXNvbiA9IEVYSVRfUkVBU09OX0lURVJBVElPTl9MSU1JVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN5bnRheCA9PT0gTUFUQ0gpIHtcbiAgICAgICAgICAgIGlmICh0aGVuU3RhY2sgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyB0dXJuIHRvIE1JU01BVENIIHdoZW4gc29tZSB0b2tlbnMgbGVmdCB1bm1hdGNoZWRcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtaXNtYXRjaCBpZiBqdXN0IG9uZSB0b2tlbiBsZWZ0IGFuZCBpdCdzIGFuIElFIGhhY2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuQ3Vyc29yICE9PSB0b2tlbnMubGVuZ3RoIC0gMSB8fCAodG9rZW4udmFsdWUgIT09ICdcXFxcMCcgJiYgdG9rZW4udmFsdWUgIT09ICdcXFxcOScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW50YXggPSBNSVNNQVRDSDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gYnJlYWsgdGhlIG1haW4gbG9vcCwgcmV0dXJuIGEgcmVzdWx0IC0gTUFUQ0hcbiAgICAgICAgICAgICAgICBleGl0UmVhc29uID0gRVhJVF9SRUFTT05fTUFUQ0g7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGdvIHRvIG5leHQgc3ludGF4IChgdGhlbmAgYnJhbmNoKVxuICAgICAgICAgICAgc3ludGF4ID0gdGhlblN0YWNrLm5leHRTeW50YXg7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIG1hdGNoIGlzIG5vdCBlbXB0eVxuICAgICAgICAgICAgaWYgKHN5bnRheCA9PT0gRElTQUxMT1dfRU1QVFkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhlblN0YWNrLm1hdGNoU3RhY2sudG9rZW4gPT09IG1hdGNoU3RhY2sudG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gTUlTTUFUQ0g7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN5bnRheCA9IE1BVENIO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2xvc2Ugc3ludGF4IGlmIG5lZWRlZFxuICAgICAgICAgICAgd2hpbGUgKHN5bnRheFN0YWNrICE9PSBudWxsICYmIHRoZW5TdGFjay5zeW50YXhTdGFjayAhPT0gc3ludGF4U3RhY2spIHtcbiAgICAgICAgICAgICAgICBjbG9zZVN5bnRheCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwb3Agc3RhY2tcbiAgICAgICAgICAgIHRoZW5TdGFjayA9IHRoZW5TdGFjay5wcmV2O1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ludGF4ID09PSBNSVNNQVRDSCkge1xuICAgICAgICAgICAgaWYgKGVsc2VTdGFjayA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGJyZWFrIHRoZSBtYWluIGxvb3AsIHJldHVybiBhIHJlc3VsdCAtIE1JU01BVENIXG4gICAgICAgICAgICAgICAgZXhpdFJlYXNvbiA9IEVYSVRfUkVBU09OX01JU01BVENIO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBnbyB0byBuZXh0IHN5bnRheCAoYGVsc2VgIGJyYW5jaClcbiAgICAgICAgICAgIHN5bnRheCA9IGVsc2VTdGFjay5uZXh0U3ludGF4O1xuXG4gICAgICAgICAgICAvLyByZXN0b3JlIGFsbCB0aGUgcmVzdCBzdGFjayBzdGF0ZXNcbiAgICAgICAgICAgIHRoZW5TdGFjayA9IGVsc2VTdGFjay50aGVuU3RhY2s7XG4gICAgICAgICAgICBzeW50YXhTdGFjayA9IGVsc2VTdGFjay5zeW50YXhTdGFjaztcbiAgICAgICAgICAgIG1hdGNoU3RhY2sgPSBlbHNlU3RhY2subWF0Y2hTdGFjaztcbiAgICAgICAgICAgIHRva2VuQ3Vyc29yID0gZWxzZVN0YWNrLnRva2VuQ3Vyc29yO1xuICAgICAgICAgICAgdG9rZW4gPSBlbHNlU3RhY2sudG9rZW47XG5cbiAgICAgICAgICAgIC8vIHBvcCBzdGFja1xuICAgICAgICAgICAgZWxzZVN0YWNrID0gZWxzZVN0YWNrLnByZXY7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc3ludGF4LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ01hdGNoR3JhcGgnOlxuICAgICAgICAgICAgICAgIHN5bnRheCA9IHN5bnRheC5tYXRjaDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnSWYnOlxuICAgICAgICAgICAgICAgIC8vIElNUE9SVEFOVDogZWxzZSBzdGFjayBwdXNoIG11c3QgZ28gZmlyc3QsXG4gICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGVuU3RhY2sgYmVmb3JlIGNoYW5nZXNcbiAgICAgICAgICAgICAgICBpZiAoc3ludGF4LmVsc2UgIT09IE1JU01BVENIKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hFbHNlU3RhY2soc3ludGF4LmVsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzeW50YXgudGhlbiAhPT0gTUFUQ0gpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaFRoZW5TdGFjayhzeW50YXgudGhlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3ludGF4ID0gc3ludGF4Lm1hdGNoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdNYXRjaE9uY2UnOlxuICAgICAgICAgICAgICAgIHN5bnRheCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01hdGNoT25jZUJ1ZmZlcicsXG4gICAgICAgICAgICAgICAgICAgIHRlcm1zOiBzeW50YXgudGVybXMsXG4gICAgICAgICAgICAgICAgICAgIGFsbDogc3ludGF4LmFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFjazogbWF0Y2hTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgIG1hc2s6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdNYXRjaE9uY2VCdWZmZXInOlxuICAgICAgICAgICAgICAgIGlmIChzeW50YXguaW5kZXggPT09IHN5bnRheC50ZXJtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gbWF0Y2hlcyBkdXJpbmcgYSBjeWNsZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3ludGF4Lm1hdGNoU3RhY2sgPT09IG1hdGNoU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG1hdGNoZXMgYXQgYWxsIG9yIGl0J3MgcmVxdWlyZWQgYWxsIHRlcm1zIHRvIGJlIG1hdGNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeW50YXgubWFzayA9PT0gMCB8fCBzeW50YXguYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gTUlTTUFUQ0g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcGFydGlhbCBtYXRjaCBpcyBva1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gTUFUQ0g7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHRyeWluZyB0byBtYXRjaCBmcm9tIHRoZSBzdGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4LmluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheC5tYXRjaFN0YWNrID0gbWF0Y2hTdGFjaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoOyBzeW50YXguaW5kZXggPCBzeW50YXgudGVybXMubGVuZ3RoOyBzeW50YXguaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHN5bnRheC5tYXNrICYgKDEgPDwgc3ludGF4LmluZGV4KSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElNUE9SVEFOVDogZWxzZSBzdGFjayBwdXNoIG11c3QgZ28gZmlyc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZW5TdGFjayBiZWZvcmUgY2hhbmdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEVsc2VTdGFjayhzeW50YXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaFRoZW5TdGFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FkZE1hdGNoT25jZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiBzeW50YXhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gc3ludGF4LnRlcm1zW3N5bnRheC5pbmRleCsrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdBZGRNYXRjaE9uY2UnOlxuICAgICAgICAgICAgICAgIHN5bnRheCA9IHN5bnRheC5idWZmZXI7XG5cbiAgICAgICAgICAgICAgICB2YXIgbmV3TWFzayA9IHN5bnRheC5tYXNrIHwgKDEgPDwgKHN5bnRheC5pbmRleCAtIDEpKTtcblxuICAgICAgICAgICAgICAgIC8vIGFsbCB0ZXJtcyBhcmUgbWF0Y2hlZFxuICAgICAgICAgICAgICAgIGlmIChuZXdNYXNrID09PSAoMSA8PCBzeW50YXgudGVybXMubGVuZ3RoKSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gTUFUQ0g7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN5bnRheCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01hdGNoT25jZUJ1ZmZlcicsXG4gICAgICAgICAgICAgICAgICAgIHRlcm1zOiBzeW50YXgudGVybXMsXG4gICAgICAgICAgICAgICAgICAgIGFsbDogc3ludGF4LmFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFjazogc3ludGF4Lm1hdGNoU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBzeW50YXguaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIG1hc2s6IG5ld01hc2tcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0VudW0nOlxuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gdG9rZW4gIT09IG51bGwgPyB0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpIDogJyc7XG5cbiAgICAgICAgICAgICAgICAvLyBkcm9wIFxcMCBhbmQgXFw5IGhhY2sgZnJvbSBrZXl3b3JkIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCdcXFxcJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1xcXFxbMDldLiokLywgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHN5bnRheC5tYXAsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN5bnRheCA9IHN5bnRheC5tYXBbbmFtZV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gTUlTTUFUQ0g7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0dlbmVyaWMnOlxuICAgICAgICAgICAgICAgIHN5bnRheCA9IHN5bnRheC5mbih0b2tlbiwgYWRkVG9rZW5Ub01hdGNoLCBnZXROZXh0VG9rZW4pID8gTUFUQ0ggOiBNSVNNQVRDSDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnVHlwZSc6XG4gICAgICAgICAgICBjYXNlICdQcm9wZXJ0eSc6XG4gICAgICAgICAgICAgICAgb3BlblN5bnRheCgpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHN5bnRheERpY3QgPSBzeW50YXgudHlwZSA9PT0gJ1R5cGUnID8gJ3R5cGVzJyA6ICdwcm9wZXJ0aWVzJztcblxuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHN5bnRheGVzLCBzeW50YXhEaWN0KSAmJiBzeW50YXhlc1tzeW50YXhEaWN0XVtzeW50YXgubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gc3ludGF4ZXNbc3ludGF4RGljdF1bc3ludGF4Lm5hbWVdLm1hdGNoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN5bnRheCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN5bnRheCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnQmFkIHN5bnRheCByZWZlcmVuY2U6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHN5bnRheFN0YWNrLnN5bnRheC50eXBlID09PSAnVHlwZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc8JyArIHN5bnRheFN0YWNrLnN5bnRheC5uYW1lICsgJz4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnPFxcJycgKyBzeW50YXhTdGFjay5zeW50YXgubmFtZSArICdcXCc+JylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBzeW50YXgubmFtZTtcblxuICAgICAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5d29yZE5hbWUgPSB0b2tlbi52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIFxcMCBhbmQgXFw5IGhhY2sgZnJvbSBrZXl3b3JkIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXdvcmROYW1lLmluZGV4T2YoJ1xcXFwnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmROYW1lID0ga2V5d29yZE5hbWUucmVwbGFjZSgvXFxcXFswOV0uKiQvLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9rZW5Ub01hdGNoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCA9IE1BVENIO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzeW50YXggPSBNSVNNQVRDSDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnQXRLZXl3b3JkJzpcbiAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gIT09IG51bGwgJiYgdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gc3ludGF4Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkVG9rZW5Ub01hdGNoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gTUFUQ0g7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN5bnRheCA9IE1JU01BVENIO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdUb2tlbic6XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuICE9PSBudWxsICYmIHRva2VuLnZhbHVlID09PSBzeW50YXgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkVG9rZW5Ub01hdGNoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gTUFUQ0g7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN5bnRheCA9IE1JU01BVENIO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdDb21tYSc6XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuICE9PSBudWxsICYmIHRva2VuLnZhbHVlID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tbWFDb250ZXh0U3RhcnQobWF0Y2hTdGFjay50b2tlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCA9IE1JU01BVENIO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9rZW5Ub01hdGNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW50YXggPSBpc0NvbW1hQ29udGV4dEVuZCh0b2tlbikgPyBNSVNNQVRDSCA6IE1BVENIO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4ID0gaXNDb21tYUNvbnRleHRTdGFydChtYXRjaFN0YWNrLnRva2VuKSB8fCBpc0NvbW1hQ29udGV4dEVuZCh0b2tlbikgPyBNQVRDSCA6IE1JU01BVENIO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAvLyBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgICAgLy8gVE9ETzogc3RyaW5ncyB3aXRoIGxlbmd0aCBvdGhlciB0aGFuIDEgY2hhclxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGU6ICcgKyBzeW50YXgudHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3RhbEl0ZXJhdGlvbkNvdW50ICs9IGl0ZXJhdGlvbkNvdW50O1xuXG4gICAgaWYgKGV4aXRSZWFzb24gPT09IEVYSVRfUkVBU09OX01BVENIKSB7XG4gICAgICAgIHdoaWxlIChzeW50YXhTdGFjayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2xvc2VTeW50YXgoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoU3RhY2sgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgICByZWFzb246IGV4aXRSZWFzb24sXG4gICAgICAgIGl0ZXJhdGlvbnM6IGl0ZXJhdGlvbkNvdW50LFxuICAgICAgICBtYXRjaDogbWF0Y2hTdGFjayxcbiAgICAgICAgbG9uZ2VzdE1hdGNoOiBsb25nZXN0TWF0Y2hcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXRjaEFzTGlzdCh0b2tlbnMsIG1hdGNoR3JhcGgsIHN5bnRheGVzKSB7XG4gICAgdmFyIG1hdGNoUmVzdWx0ID0gaW50ZXJuYWxNYXRjaCh0b2tlbnMsIG1hdGNoR3JhcGgsIHN5bnRheGVzIHx8IHt9KTtcblxuICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICBtYXRjaFJlc3VsdC5tYXRjaCA9IG1hcExpc3QobWF0Y2hSZXN1bHQubWF0Y2gsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IE9QRU5fU1lOVEFYIHx8IGl0ZW0udHlwZSA9PT0gQ0xPU0VfU1lOVEFYKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogaXRlbS50eXBlLCBzeW50YXg6IGl0ZW0uc3ludGF4IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3ludGF4OiBpdGVtLnN5bnRheCxcbiAgICAgICAgICAgICAgICB0b2tlbjogaXRlbS50b2tlbiAmJiBpdGVtLnRva2VuLnZhbHVlLFxuICAgICAgICAgICAgICAgIG5vZGU6IGl0ZW0udG9rZW4gJiYgaXRlbS50b2tlbi5ub2RlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KS5zbGljZSgxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hSZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1hdGNoQXNUcmVlKHRva2VucywgbWF0Y2hHcmFwaCwgc3ludGF4ZXMpIHtcbiAgICB2YXIgbWF0Y2hSZXN1bHQgPSBpbnRlcm5hbE1hdGNoKHRva2VucywgbWF0Y2hHcmFwaCwgc3ludGF4ZXMgfHwge30pO1xuXG4gICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgY3Vyc29yID0gbWF0Y2hSZXN1bHQubWF0Y2g7XG4gICAgdmFyIGhvc3QgPSBtYXRjaFJlc3VsdC5tYXRjaCA9IHtcbiAgICAgICAgc3ludGF4OiBtYXRjaEdyYXBoLnN5bnRheCB8fCBudWxsLFxuICAgICAgICBtYXRjaDogW11cbiAgICB9O1xuICAgIHZhciBzdGFjayA9IFtob3N0XTtcblxuICAgIC8vIHJldmVydCBhIGxpc3RcbiAgICB2YXIgcHJldiA9IG51bGw7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuICAgIHdoaWxlIChjdXJzb3IgIT09IG51bGwpIHtcbiAgICAgICAgbmV4dCA9IGN1cnNvci5wcmV2O1xuICAgICAgICBjdXJzb3IucHJldiA9IHByZXY7XG4gICAgICAgIHByZXYgPSBjdXJzb3I7XG4gICAgICAgIGN1cnNvciA9IG5leHQ7XG4gICAgfVxuXG4gICAgLy8gaW5pdCB0aGUgY3Vyc29yIHRvIHN0YXJ0IHdpdGggMm5kIGl0ZW0gc2luY2UgMXN0IGlzIGEgc3R1YiBpdGVtXG4gICAgY3Vyc29yID0gcHJldi5wcmV2O1xuXG4gICAgLy8gYnVpbGQgYSB0cmVlXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCAmJiBjdXJzb3Iuc3ludGF4ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGN1cnNvcjtcblxuICAgICAgICBzd2l0Y2ggKGVudHJ5LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgT1BFTl9TWU5UQVg6XG4gICAgICAgICAgICAgICAgaG9zdC5tYXRjaC5wdXNoKGhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIHN5bnRheDogZW50cnkuc3ludGF4LFxuICAgICAgICAgICAgICAgICAgICBtYXRjaDogW11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGhvc3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIENMT1NFX1NZTlRBWDpcbiAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICBob3N0ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaG9zdC5tYXRjaC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3ludGF4OiBlbnRyeS5zeW50YXggfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW46IGVudHJ5LnRva2VuLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBlbnRyeS50b2tlbi5ub2RlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3IgPSBjdXJzb3IucHJldjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hSZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1hdGNoQXNMaXN0OiBtYXRjaEFzTGlzdCxcbiAgICBtYXRjaEFzVHJlZTogbWF0Y2hBc1RyZWUsXG4gICAgZ2V0VG90YWxJdGVyYXRpb25Db3VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0b3RhbEl0ZXJhdGlvbkNvdW50O1xuICAgIH1cbn07XG4iLCJmdW5jdGlvbiBnZXRUcmFjZShub2RlKSB7XG4gICAgZnVuY3Rpb24gc2hvdWxkUHV0VG9UcmFjZShzeW50YXgpIHtcbiAgICAgICAgaWYgKHN5bnRheCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHN5bnRheC50eXBlID09PSAnVHlwZScgfHxcbiAgICAgICAgICAgIHN5bnRheC50eXBlID09PSAnUHJvcGVydHknIHx8XG4gICAgICAgICAgICBzeW50YXgudHlwZSA9PT0gJ0tleXdvcmQnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzTWF0Y2gobWF0Y2hOb2RlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdGNoTm9kZS5tYXRjaCkpIHtcbiAgICAgICAgICAgIC8vIHVzZSBmb3ItbG9vcCBmb3IgYmV0dGVyIHBlcmZvbWFuY2VcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0Y2hOb2RlLm1hdGNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc01hdGNoKG1hdGNoTm9kZS5tYXRjaFtpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFB1dFRvVHJhY2UobWF0Y2hOb2RlLnN5bnRheCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KG1hdGNoTm9kZS5zeW50YXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoTm9kZS5ub2RlID09PSBub2RlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzaG91bGRQdXRUb1RyYWNlKG1hdGNoTm9kZS5zeW50YXgpXG4gICAgICAgICAgICAgICAgPyBbbWF0Y2hOb2RlLnN5bnRheF1cbiAgICAgICAgICAgICAgICA6IFtdO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcblxuICAgIGlmICh0aGlzLm1hdGNoZWQgIT09IG51bGwpIHtcbiAgICAgICAgaGFzTWF0Y2godGhpcy5tYXRjaGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0ZXN0Tm9kZShtYXRjaCwgbm9kZSwgZm4pIHtcbiAgICB2YXIgdHJhY2UgPSBnZXRUcmFjZS5jYWxsKG1hdGNoLCBub2RlKTtcblxuICAgIGlmICh0cmFjZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNlLnNvbWUoZm4pO1xufVxuXG5mdW5jdGlvbiBpc1R5cGUobm9kZSwgdHlwZSkge1xuICAgIHJldHVybiB0ZXN0Tm9kZSh0aGlzLCBub2RlLCBmdW5jdGlvbihtYXRjaE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoTm9kZS50eXBlID09PSAnVHlwZScgJiYgbWF0Y2hOb2RlLm5hbWUgPT09IHR5cGU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvcGVydHkobm9kZSwgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGVzdE5vZGUodGhpcywgbm9kZSwgZnVuY3Rpb24obWF0Y2hOb2RlKSB7XG4gICAgICAgIHJldHVybiBtYXRjaE5vZGUudHlwZSA9PT0gJ1Byb3BlcnR5JyAmJiBtYXRjaE5vZGUubmFtZSA9PT0gcHJvcGVydHk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzS2V5d29yZChub2RlKSB7XG4gICAgcmV0dXJuIHRlc3ROb2RlKHRoaXMsIG5vZGUsIGZ1bmN0aW9uKG1hdGNoTm9kZSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hOb2RlLnR5cGUgPT09ICdLZXl3b3JkJztcbiAgICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0VHJhY2U6IGdldFRyYWNlLFxuICAgIGlzVHlwZTogaXNUeXBlLFxuICAgIGlzUHJvcGVydHk6IGlzUHJvcGVydHksXG4gICAgaXNLZXl3b3JkOiBpc0tleXdvcmRcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2xpc3QnKTtcblxuZnVuY3Rpb24gZ2V0Rmlyc3RNYXRjaE5vZGUobWF0Y2hOb2RlKSB7XG4gICAgaWYgKCdub2RlJyBpbiBtYXRjaE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoTm9kZS5ub2RlO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRGaXJzdE1hdGNoTm9kZShtYXRjaE5vZGUubWF0Y2hbMF0pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0TWF0Y2hOb2RlKG1hdGNoTm9kZSkge1xuICAgIGlmICgnbm9kZScgaW4gbWF0Y2hOb2RlKSB7XG4gICAgICAgIHJldHVybiBtYXRjaE5vZGUubm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0TGFzdE1hdGNoTm9kZShtYXRjaE5vZGUubWF0Y2hbbWF0Y2hOb2RlLm1hdGNoLmxlbmd0aCAtIDFdKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hGcmFnbWVudHMobGV4ZXIsIGFzdCwgbWF0Y2gsIHR5cGUsIG5hbWUpIHtcbiAgICBmdW5jdGlvbiBmaW5kRnJhZ21lbnRzKG1hdGNoTm9kZSkge1xuICAgICAgICBpZiAobWF0Y2hOb2RlLnN5bnRheCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgbWF0Y2hOb2RlLnN5bnRheC50eXBlID09PSB0eXBlICYmXG4gICAgICAgICAgICBtYXRjaE5vZGUuc3ludGF4Lm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGdldEZpcnN0TWF0Y2hOb2RlKG1hdGNoTm9kZSk7XG4gICAgICAgICAgICB2YXIgZW5kID0gZ2V0TGFzdE1hdGNoTm9kZShtYXRjaE5vZGUpO1xuXG4gICAgICAgICAgICBsZXhlci5zeW50YXgud2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gbmV3IExpc3QoKTtcblxuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5hcHBlbmREYXRhKGl0ZW0uZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmRhdGEgPT09IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChpdGVtICE9PSBudWxsKTtcblxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGxpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlczogbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRjaE5vZGUubWF0Y2gpKSB7XG4gICAgICAgICAgICBtYXRjaE5vZGUubWF0Y2guZm9yRWFjaChmaW5kRnJhZ21lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBmcmFnbWVudHMgPSBbXTtcblxuICAgIGlmIChtYXRjaC5tYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRGcmFnbWVudHMobWF0Y2gubWF0Y2hlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyYWdtZW50cztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbWF0Y2hGcmFnbWVudHM6IG1hdGNoRnJhZ21lbnRzXG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi91dGlscy9saXN0Jyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBpc1ZhbGlkTnVtYmVyKHZhbHVlKSB7XG4gICAgLy8gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMFxuICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSAmJlxuICAgICAgICB2YWx1ZSA+PSAwXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZExvY2F0aW9uKGxvYykge1xuICAgIHJldHVybiAoXG4gICAgICAgIEJvb2xlYW4obG9jKSAmJlxuICAgICAgICBpc1ZhbGlkTnVtYmVyKGxvYy5vZmZzZXQpICYmXG4gICAgICAgIGlzVmFsaWROdW1iZXIobG9jLmxpbmUpICYmXG4gICAgICAgIGlzVmFsaWROdW1iZXIobG9jLmNvbHVtbilcbiAgICApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlU3RydWN0dXJlQ2hlY2tlcih0eXBlLCBmaWVsZHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2hlY2tOb2RlKG5vZGUsIHdhcm4pIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUuY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHdhcm4obm9kZSwgJ1R5cGUgb2Ygbm9kZSBzaG91bGQgYmUgYW4gT2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbm9kZSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwobm9kZSwga2V5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKG5vZGUsICdXcm9uZyBub2RlIHR5cGUgYCcgKyBub2RlLnR5cGUgKyAnYCwgZXhwZWN0ZWQgYCcgKyB0eXBlICsgJ2AnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2xvYycpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sb2MgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxvYyAmJiBub2RlLmxvYy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS5sb2Muc291cmNlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ICs9ICcuc291cmNlJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNWYWxpZExvY2F0aW9uKG5vZGUubG9jLnN0YXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ICs9ICcuc3RhcnQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkTG9jYXRpb24obm9kZS5sb2MuZW5kKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ICs9ICcuZW5kJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdmFsaWQgPSBmYWxzZTsgIXZhbGlkICYmIGkgPCBmaWVsZHNba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRUeXBlID0gZmllbGRzW2tleV1baV07XG5cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHlwZW9mIG5vZGVba2V5XSA9PT0gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHR5cGVvZiBub2RlW2tleV0gPT09ICdib29sZWFuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBudWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gbm9kZVtrZXldID09PSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IG5vZGVba2V5XSAmJiBub2RlW2tleV0udHlwZSA9PT0gZmllbGRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gbm9kZVtrZXldIGluc3RhbmNlb2YgTGlzdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm4obm9kZSwgJ1Vua25vd24gZmllbGQgYCcgKyBrZXkgKyAnYCBmb3IgJyArIHR5cGUgKyAnIG5vZGUgdHlwZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgICAgd2Fybihub2RlLCAnQmFkIHZhbHVlIGZvciBgJyArIHR5cGUgKyAnLicgKyBrZXkgKyAnYCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoZmllbGRzLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBrZXkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHdhcm4obm9kZSwgJ0ZpZWxkIGAnICsgdHlwZSArICcuJyArIGtleSArICdgIGlzIG1pc3NlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1N0cnVjdHVyZShuYW1lLCBub2RlVHlwZSkge1xuICAgIHZhciBzdHJ1Y3R1cmUgPSBub2RlVHlwZS5zdHJ1Y3R1cmU7XG4gICAgdmFyIGZpZWxkcyA9IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBsb2M6IHRydWVcbiAgICB9O1xuICAgIHZhciBkb2NzID0ge1xuICAgICAgICB0eXBlOiAnXCInICsgbmFtZSArICdcIidcbiAgICB9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIHN0cnVjdHVyZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzdHJ1Y3R1cmUsIGtleSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkb2NzVHlwZXMgPSBbXTtcbiAgICAgICAgdmFyIGZpZWxkVHlwZXMgPSBmaWVsZHNba2V5XSA9IEFycmF5LmlzQXJyYXkoc3RydWN0dXJlW2tleV0pXG4gICAgICAgICAgICA/IHN0cnVjdHVyZVtrZXldLnNsaWNlKClcbiAgICAgICAgICAgIDogW3N0cnVjdHVyZVtrZXldXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBmaWVsZFR5cGUgPSBmaWVsZFR5cGVzW2ldO1xuICAgICAgICAgICAgaWYgKGZpZWxkVHlwZSA9PT0gU3RyaW5nIHx8IGZpZWxkVHlwZSA9PT0gQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIGRvY3NUeXBlcy5wdXNoKGZpZWxkVHlwZS5uYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZG9jc1R5cGVzLnB1c2goJ251bGwnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBkb2NzVHlwZXMucHVzaCgnPCcgKyBmaWVsZFR5cGUgKyAnPicpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVHlwZSkpIHtcbiAgICAgICAgICAgICAgICBkb2NzVHlwZXMucHVzaCgnTGlzdCcpOyAvLyBUT0RPOiB1c2UgdHlwZSBlbnVtXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV3JvbmcgdmFsdWUgYCcgKyBmaWVsZFR5cGUgKyAnYCBpbiBgJyArIG5hbWUgKyAnLicgKyBrZXkgKyAnYCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZG9jc1trZXldID0gZG9jc1R5cGVzLmpvaW4oJyB8ICcpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGRvY3M6IGRvY3MsXG4gICAgICAgIGNoZWNrOiBjcmVhdGVOb2RlU3RydWN0dXJlQ2hlY2tlcihuYW1lLCBmaWVsZHMpXG4gICAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0U3RydWN0dXJlRnJvbUNvbmZpZzogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgIHZhciBzdHJ1Y3R1cmUgPSB7fTtcblxuICAgICAgICBpZiAoY29uZmlnLm5vZGUpIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gY29uZmlnLm5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcubm9kZSwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVUeXBlID0gY29uZmlnLm5vZGVbbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVUeXBlLnN0cnVjdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlW25hbWVdID0gcHJvY2Vzc1N0cnVjdHVyZShuYW1lLCBub2RlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NlZCBgc3RydWN0dXJlYCBmaWVsZCBpbiBgJyArIG5hbWUgKyAnYCBub2RlIHR5cGUgZGVmaW5pdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGF4UmVmZXJlbmNlRXJyb3IgPSByZXF1aXJlKCcuL2Vycm9yJykuU3ludGF4UmVmZXJlbmNlRXJyb3I7XG52YXIgTWF0Y2hFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKS5NYXRjaEVycm9yO1xudmFyIG5hbWVzID0gcmVxdWlyZSgnLi4vdXRpbHMvbmFtZXMnKTtcbnZhciBnZW5lcmljID0gcmVxdWlyZSgnLi9nZW5lcmljJyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL2dyYW1tYXIvcGFyc2UnKTtcbnZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoJy4vZ3JhbW1hci9nZW5lcmF0ZScpO1xudmFyIHdhbGsgPSByZXF1aXJlKCcuL2dyYW1tYXIvd2FsaycpO1xudmFyIGFzdFRvVG9rZW5zID0gcmVxdWlyZSgnLi9hc3QtdG8tdG9rZW5zJyk7XG52YXIgYnVpbGRNYXRjaEdyYXBoID0gcmVxdWlyZSgnLi9tYXRjaC1ncmFwaCcpLmJ1aWxkTWF0Y2hHcmFwaDtcbnZhciBtYXRjaEFzVHJlZSA9IHJlcXVpcmUoJy4vbWF0Y2gnKS5tYXRjaEFzVHJlZTtcbnZhciB0cmFjZSA9IHJlcXVpcmUoJy4vdHJhY2UnKTtcbnZhciBzZWFyY2ggPSByZXF1aXJlKCcuL3NlYXJjaCcpO1xudmFyIGdldFN0cnVjdHVyZUZyb21Db25maWcgPSByZXF1aXJlKCcuL3N0cnVjdHVyZScpLmdldFN0cnVjdHVyZUZyb21Db25maWc7XG52YXIgY3NzV2lkZUtleXdvcmRzID0gYnVpbGRNYXRjaEdyYXBoKHBhcnNlKCdpbmhlcml0IHwgaW5pdGlhbCB8IHVuc2V0JykpO1xudmFyIGNzc1dpZGVLZXl3b3Jkc1dpdGhFeHByZXNzaW9uID0gYnVpbGRNYXRjaEdyYXBoKHBhcnNlKCdpbmhlcml0IHwgaW5pdGlhbCB8IHVuc2V0IHwgPGV4cHJlc3Npb24+JykpO1xuXG5mdW5jdGlvbiBkdW1wTWFwU3ludGF4KG1hcCwgc3ludGF4QXNBc3QpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIG1hcCkge1xuICAgICAgICBpZiAobWFwW25hbWVdLnN5bnRheCkge1xuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gc3ludGF4QXNBc3QgPyBtYXBbbmFtZV0uc3ludGF4IDogZ2VuZXJhdGUobWFwW25hbWVdLnN5bnRheCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB2YWx1ZUhhc1Zhcih2YWx1ZSkge1xuICAgIHZhciBoYXNWYXIgPSBmYWxzZTtcblxuICAgIHRoaXMuc3ludGF4LndhbGsodmFsdWUsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uJyAmJiBub2RlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3ZhcicpIHtcbiAgICAgICAgICAgIGhhc1ZhciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBoYXNWYXI7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2hSZXN1bHQobWF0Y2gsIGVycm9yLCBpdGVyYXRpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWF0Y2hlZDogbWF0Y2gsXG4gICAgICAgIGl0ZXJhdGlvbnM6IGl0ZXJhdGlvbnMsXG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgZ2V0VHJhY2U6IHRyYWNlLmdldFRyYWNlLFxuICAgICAgICBpc1R5cGU6IHRyYWNlLmlzVHlwZSxcbiAgICAgICAgaXNQcm9wZXJ0eTogdHJhY2UuaXNQcm9wZXJ0eSxcbiAgICAgICAgaXNLZXl3b3JkOiB0cmFjZS5pc0tleXdvcmRcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXRjaFN5bnRheChsZXhlciwgc3ludGF4LCBub2RlLCB1c2VDb21tb24pIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkTWF0Y2hSZXN1bHQobnVsbCwgbmV3IEVycm9yKCdOb2RlIGlzIHVuZGVmaW5lZCcpKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVIYXNWYXIuY2FsbChsZXhlciwgbm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkTWF0Y2hSZXN1bHQobnVsbCwgbmV3IEVycm9yKCdNYXRjaGluZyBmb3IgYSB0cmVlIHdpdGggdmFyKCkgaXMgbm90IHN1cHBvcnRlZCcpKTtcbiAgICB9XG5cbiAgICB2YXIgdG9rZW5zID0gbGV4ZXIuc3ludGF4LmdlbmVyYXRlKG5vZGUsIGFzdFRvVG9rZW5zKTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaWYgKHVzZUNvbW1vbikge1xuICAgICAgICByZXN1bHQgPSBtYXRjaEFzVHJlZSh0b2tlbnMsIGxleGVyLnZhbHVlQ29tbW9uU3ludGF4LCBsZXhlcik7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VDb21tb24gfHwgIXJlc3VsdC5tYXRjaCkge1xuICAgICAgICByZXN1bHQgPSBtYXRjaEFzVHJlZSh0b2tlbnMsIHN5bnRheC5tYXRjaCwgbGV4ZXIpO1xuICAgICAgICBpZiAoIXJlc3VsdC5tYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTWF0Y2hSZXN1bHQoXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBuZXcgTWF0Y2hFcnJvcihyZXN1bHQucmVhc29uLCBsZXhlciwgc3ludGF4LnN5bnRheCwgbm9kZSwgcmVzdWx0KSxcbiAgICAgICAgICAgICAgICByZXN1bHQuaXRlcmF0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBidWlsZE1hdGNoUmVzdWx0KHJlc3VsdC5tYXRjaCwgbnVsbCwgcmVzdWx0Lml0ZXJhdGlvbnMpO1xufVxuXG52YXIgTGV4ZXIgPSBmdW5jdGlvbihjb25maWcsIHN5bnRheCwgc3RydWN0dXJlKSB7XG4gICAgdGhpcy52YWx1ZUNvbW1vblN5bnRheCA9IGNzc1dpZGVLZXl3b3JkcztcbiAgICB0aGlzLnN5bnRheCA9IHN5bnRheDtcbiAgICB0aGlzLmdlbmVyaWMgPSBmYWxzZTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLnR5cGVzID0ge307XG4gICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmUgfHwgZ2V0U3RydWN0dXJlRnJvbUNvbmZpZyhjb25maWcpO1xuXG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLmdlbmVyaWMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJpYyA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIGdlbmVyaWMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFR5cGVfKG5hbWUsIGdlbmVyaWNbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy50eXBlcykge1xuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcudHlwZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFR5cGVfKG5hbWUsIGNvbmZpZy50eXBlc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gY29uZmlnLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFByb3BlcnR5XyhuYW1lLCBjb25maWcucHJvcGVydGllc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5MZXhlci5wcm90b3R5cGUgPSB7XG4gICAgc3RydWN0dXJlOiB7fSxcbiAgICBjaGVja1N0cnVjdHVyZTogZnVuY3Rpb24oYXN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGNvbGxlY3RXYXJuaW5nKG5vZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHdhcm5zLnB1c2goe1xuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RydWN0dXJlID0gdGhpcy5zdHJ1Y3R1cmU7XG4gICAgICAgIHZhciB3YXJucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuc3ludGF4LndhbGsoYXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAoc3RydWN0dXJlLmhhc093blByb3BlcnR5KG5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVbbm9kZS50eXBlXS5jaGVjayhub2RlLCBjb2xsZWN0V2FybmluZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbGxlY3RXYXJuaW5nKG5vZGUsICdVbmtub3duIG5vZGUgdHlwZSBgJyArIG5vZGUudHlwZSArICdgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB3YXJucy5sZW5ndGggPyB3YXJucyA6IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjcmVhdGVEZXNjcmlwdG9yOiBmdW5jdGlvbihzeW50YXgsIHR5cGUsIG5hbWUpIHtcbiAgICAgICAgdmFyIHJlZiA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBzeW50YXg6IG51bGwsXG4gICAgICAgICAgICBtYXRjaDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc3ludGF4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLm1hdGNoID0gYnVpbGRNYXRjaEdyYXBoKHN5bnRheCwgcmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3ludGF4ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIGxhenkgcGFyc2luZyBvbiBmaXJzdCBhY2Nlc3NcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzY3JpcHRvciwgJ3N5bnRheCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZXNjcmlwdG9yLCAnc3ludGF4Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJzZShzeW50YXgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3Iuc3ludGF4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc3ludGF4ID0gc3ludGF4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzY3JpcHRvciwgJ21hdGNoJywge1xuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZXNjcmlwdG9yLCAnbWF0Y2gnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYnVpbGRNYXRjaEdyYXBoKGRlc2NyaXB0b3Iuc3ludGF4LCByZWYpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLm1hdGNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfSxcbiAgICBhZGRQcm9wZXJ0eV86IGZ1bmN0aW9uKG5hbWUsIHN5bnRheCkge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXNbbmFtZV0gPSB0aGlzLmNyZWF0ZURlc2NyaXB0b3Ioc3ludGF4LCAnUHJvcGVydHknLCBuYW1lKTtcbiAgICB9LFxuICAgIGFkZFR5cGVfOiBmdW5jdGlvbihuYW1lLCBzeW50YXgpIHtcbiAgICAgICAgdGhpcy50eXBlc1tuYW1lXSA9IHRoaXMuY3JlYXRlRGVzY3JpcHRvcihzeW50YXgsICdUeXBlJywgbmFtZSk7XG5cbiAgICAgICAgaWYgKHN5bnRheCA9PT0gZ2VuZXJpYy5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlQ29tbW9uU3ludGF4ID0gY3NzV2lkZUtleXdvcmRzV2l0aEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbWF0Y2hEZWNsYXJhdGlvbjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS50eXBlICE9PSAnRGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNYXRjaFJlc3VsdChudWxsLCBuZXcgRXJyb3IoJ05vdCBhIERlY2xhcmF0aW9uIG5vZGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFByb3BlcnR5KG5vZGUucHJvcGVydHksIG5vZGUudmFsdWUpO1xuICAgIH0sXG4gICAgbWF0Y2hQcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSBuYW1lcy5wcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAgIC8vIGRvbid0IG1hdGNoIHN5bnRheCBmb3IgYSBjdXN0b20gcHJvcGVydHlcbiAgICAgICAgaWYgKHByb3BlcnR5LmN1c3RvbSkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTWF0Y2hSZXN1bHQobnVsbCwgbmV3IEVycm9yKCdMZXhlciBtYXRjaGluZyBkb2VzblxcJ3QgYXBwbGljYWJsZSBmb3IgY3VzdG9tIHByb3BlcnRpZXMnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHJvcGVydHlTeW50YXggPSBwcm9wZXJ0eS52ZW5kb3JcbiAgICAgICAgICAgID8gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lKSB8fCB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5LmJhc2VuYW1lKVxuICAgICAgICAgICAgOiB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5Lm5hbWUpO1xuXG4gICAgICAgIGlmICghcHJvcGVydHlTeW50YXgpIHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZE1hdGNoUmVzdWx0KG51bGwsIG5ldyBTeW50YXhSZWZlcmVuY2VFcnJvcignVW5rbm93biBwcm9wZXJ0eScsIHByb3BlcnR5TmFtZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoU3ludGF4KHRoaXMsIHByb3BlcnR5U3ludGF4LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBtYXRjaFR5cGU6IGZ1bmN0aW9uKHR5cGVOYW1lLCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZVN5bnRheCA9IHRoaXMuZ2V0VHlwZSh0eXBlTmFtZSk7XG5cbiAgICAgICAgaWYgKCF0eXBlU3ludGF4KSB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNYXRjaFJlc3VsdChudWxsLCBuZXcgU3ludGF4UmVmZXJlbmNlRXJyb3IoJ1Vua25vd24gdHlwZScsIHR5cGVOYW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0Y2hTeW50YXgodGhpcywgdHlwZVN5bnRheCwgdmFsdWUsIGZhbHNlKTtcbiAgICB9LFxuICAgIG1hdGNoOiBmdW5jdGlvbihzeW50YXgsIHZhbHVlKSB7XG4gICAgICAgIGlmICghc3ludGF4IHx8ICFzeW50YXgudHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTWF0Y2hSZXN1bHQobnVsbCwgbmV3IFN5bnRheFJlZmVyZW5jZUVycm9yKCdCYWQgc3ludGF4JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzeW50YXgubWF0Y2gpIHtcbiAgICAgICAgICAgIHN5bnRheCA9IHRoaXMuY3JlYXRlRGVzY3JpcHRvcihzeW50YXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoU3ludGF4KHRoaXMsIHN5bnRheCwgdmFsdWUsIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgZmluZFZhbHVlRnJhZ21lbnRzOiBmdW5jdGlvbihwcm9wZXJ0eU5hbWUsIHZhbHVlLCB0eXBlLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBzZWFyY2gubWF0Y2hGcmFnbWVudHModGhpcywgdmFsdWUsIHRoaXMubWF0Y2hQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKSwgdHlwZSwgbmFtZSk7XG4gICAgfSxcbiAgICBmaW5kRGVjbGFyYXRpb25WYWx1ZUZyYWdtZW50czogZnVuY3Rpb24oZGVjbGFyYXRpb24sIHR5cGUsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHNlYXJjaC5tYXRjaEZyYWdtZW50cyh0aGlzLCBkZWNsYXJhdGlvbi52YWx1ZSwgdGhpcy5tYXRjaERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSwgdHlwZSwgbmFtZSk7XG4gICAgfSxcbiAgICBmaW5kQWxsRnJhZ21lbnRzOiBmdW5jdGlvbihhc3QsIHR5cGUsIG5hbWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIHRoaXMuc3ludGF4LndhbGsoYXN0LCB7XG4gICAgICAgICAgICB2aXNpdDogJ0RlY2xhcmF0aW9uJyxcbiAgICAgICAgICAgIGVudGVyOiBmdW5jdGlvbihkZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCwgdGhpcy5maW5kRGVjbGFyYXRpb25WYWx1ZUZyYWdtZW50cyhkZWNsYXJhdGlvbiwgdHlwZSwgbmFtZSkpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGdldFByb3BlcnR5OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyB0aGlzLnByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xuICAgIH0sXG4gICAgZ2V0VHlwZTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHRoaXMudHlwZXNbbmFtZV0gOiBudWxsO1xuICAgIH0sXG5cbiAgICB2YWxpZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHN5bnRheCwgbmFtZSwgYnJva2VuLCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBpZiAoYnJva2VuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJyb2tlbltuYW1lXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJva2VuW25hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5zeW50YXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3YWxrKGRlc2NyaXB0b3Iuc3ludGF4LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgIT09ICdUeXBlJyAmJiBub2RlLnR5cGUgIT09ICdQcm9wZXJ0eScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBub2RlLnR5cGUgPT09ICdUeXBlJyA/IHN5bnRheC50eXBlcyA6IHN5bnRheC5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnJva2VuTWFwID0gbm9kZS50eXBlID09PSAnVHlwZScgPyBicm9rZW5UeXBlcyA6IGJyb2tlblByb3BlcnRpZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXAuaGFzT3duUHJvcGVydHkobm9kZS5uYW1lKSB8fCB2YWxpZGF0ZShzeW50YXgsIG5vZGUubmFtZSwgYnJva2VuTWFwLCBtYXBbbm9kZS5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb2tlbltuYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBicm9rZW5UeXBlcyA9IHt9O1xuICAgICAgICB2YXIgYnJva2VuUHJvcGVydGllcyA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnR5cGVzKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZSh0aGlzLCBrZXksIGJyb2tlblR5cGVzLCB0aGlzLnR5cGVzW2tleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMucHJvcGVydGllcykge1xuICAgICAgICAgICAgdmFsaWRhdGUodGhpcywga2V5LCBicm9rZW5Qcm9wZXJ0aWVzLCB0aGlzLnByb3BlcnRpZXNba2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICBicm9rZW5UeXBlcyA9IE9iamVjdC5rZXlzKGJyb2tlblR5cGVzKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGJyb2tlblR5cGVzW25hbWVdO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJva2VuUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGJyb2tlblByb3BlcnRpZXMpLmZpbHRlcihmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJva2VuUHJvcGVydGllc1tuYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGJyb2tlblR5cGVzLmxlbmd0aCB8fCBicm9rZW5Qcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlczogYnJva2VuVHlwZXMsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogYnJva2VuUHJvcGVydGllc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZHVtcDogZnVuY3Rpb24oc3ludGF4QXNBc3QpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdlbmVyaWM6IHRoaXMuZ2VuZXJpYyxcbiAgICAgICAgICAgIHR5cGVzOiBkdW1wTWFwU3ludGF4KHRoaXMudHlwZXMsIHN5bnRheEFzQXN0KSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGR1bXBNYXBTeW50YXgodGhpcy5wcm9wZXJ0aWVzLCBzeW50YXhBc0FzdClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZHVtcCgpKTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExleGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVG9rZW5pemVyID0gcmVxdWlyZSgnLi4vdG9rZW5pemVyJyk7XG52YXIgTGlzdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2xpc3QnKTtcbnZhciBzZXF1ZW5jZSA9IHJlcXVpcmUoJy4vc2VxdWVuY2UnKTtcbnZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxuZnVuY3Rpb24gY3JlYXRlUGFyc2VDb250ZXh0KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW25hbWVdKCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NvbmZpZyhjb25maWcpIHtcbiAgICB2YXIgcGFyc2VyQ29uZmlnID0ge1xuICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgICAgc2NvcGU6IHt9LFxuICAgICAgICBhdHJ1bGU6IHt9LFxuICAgICAgICBwc2V1ZG86IHt9XG4gICAgfTtcblxuICAgIGlmIChjb25maWcucGFyc2VDb250ZXh0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gY29uZmlnLnBhcnNlQ29udGV4dCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgY29uZmlnLnBhcnNlQ29udGV4dFtuYW1lXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VyQ29uZmlnLmNvbnRleHRbbmFtZV0gPSBjb25maWcucGFyc2VDb250ZXh0W25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlckNvbmZpZy5jb250ZXh0W25hbWVdID0gY3JlYXRlUGFyc2VDb250ZXh0KGNvbmZpZy5wYXJzZUNvbnRleHRbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuc2NvcGUpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcuc2NvcGUpIHtcbiAgICAgICAgICAgIHBhcnNlckNvbmZpZy5zY29wZVtuYW1lXSA9IGNvbmZpZy5zY29wZVtuYW1lXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXRydWxlKSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gY29uZmlnLmF0cnVsZSkge1xuICAgICAgICAgICAgdmFyIGF0cnVsZSA9IGNvbmZpZy5hdHJ1bGVbbmFtZV07XG5cbiAgICAgICAgICAgIGlmIChhdHJ1bGUucGFyc2UpIHtcbiAgICAgICAgICAgICAgICBwYXJzZXJDb25maWcuYXRydWxlW25hbWVdID0gYXRydWxlLnBhcnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5wc2V1ZG8pIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcucHNldWRvKSB7XG4gICAgICAgICAgICB2YXIgcHNldWRvID0gY29uZmlnLnBzZXVkb1tuYW1lXTtcblxuICAgICAgICAgICAgaWYgKHBzZXVkby5wYXJzZSkge1xuICAgICAgICAgICAgICAgIHBhcnNlckNvbmZpZy5wc2V1ZG9bbmFtZV0gPSBwc2V1ZG8ucGFyc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLm5vZGUpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjb25maWcubm9kZSkge1xuICAgICAgICAgICAgcGFyc2VyQ29uZmlnW25hbWVdID0gY29uZmlnLm5vZGVbbmFtZV0ucGFyc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VyQ29uZmlnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZVBhcnNlcihjb25maWcpIHtcbiAgICB2YXIgcGFyc2VyID0ge1xuICAgICAgICBzY2FubmVyOiBuZXcgVG9rZW5pemVyKCksXG4gICAgICAgIGZpbGVuYW1lOiAnPHVua25vd24+JyxcbiAgICAgICAgbmVlZFBvc2l0aW9uczogZmFsc2UsXG4gICAgICAgIG9uUGFyc2VFcnJvcjogbm9vcCxcbiAgICAgICAgb25QYXJzZUVycm9yVGhyb3c6IGZhbHNlLFxuICAgICAgICBwYXJzZUF0cnVsZVByZWx1ZGU6IHRydWUsXG4gICAgICAgIHBhcnNlUnVsZVByZWx1ZGU6IHRydWUsXG4gICAgICAgIHBhcnNlVmFsdWU6IHRydWUsXG4gICAgICAgIHBhcnNlQ3VzdG9tUHJvcGVydHk6IGZhbHNlLFxuXG4gICAgICAgIHJlYWRTZXF1ZW5jZTogc2VxdWVuY2UsXG5cbiAgICAgICAgY3JlYXRlTGlzdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlU2luZ2xlTm9kZUxpc3Q6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdCgpLmFwcGVuZERhdGEobm9kZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEZpcnN0TGlzdE5vZGU6IGZ1bmN0aW9uKGxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0ICYmIGxpc3QuZmlyc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TGFzdExpc3ROb2RlOiBmdW5jdGlvbihsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdC5sYXN0KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VXaXRoRmFsbGJhY2s6IGZ1bmN0aW9uKGNvbnN1bWVyLCBmYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uUGFyc2VFcnJvclRocm93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGZhbGxiYWNrTm9kZSA9IGZhbGxiYWNrLmNhbGwodGhpcywgc3RhcnRUb2tlbik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uUGFyc2VFcnJvclRocm93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUGFyc2VFcnJvcihlLCBmYWxsYmFja05vZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25QYXJzZUVycm9yVGhyb3cgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFja05vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0TG9jYXRpb246IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FubmVyLmdldExvY2F0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TG9jYXRpb25Gcm9tTGlzdDogZnVuY3Rpb24obGlzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmVlZFBvc2l0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciBoZWFkID0gdGhpcy5nZXRGaXJzdExpc3ROb2RlKGxpc3QpO1xuICAgICAgICAgICAgICAgIHZhciB0YWlsID0gdGhpcy5nZXRMYXN0TGlzdE5vZGUobGlzdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5nZXRMb2NhdGlvblJhbmdlKFxuICAgICAgICAgICAgICAgICAgICBoZWFkICE9PSBudWxsID8gaGVhZC5sb2Muc3RhcnQub2Zmc2V0IC0gdGhpcy5zY2FubmVyLnN0YXJ0T2Zmc2V0IDogdGhpcy5zY2FubmVyLnRva2VuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRhaWwgIT09IG51bGwgPyB0YWlsLmxvYy5lbmQub2Zmc2V0IC0gdGhpcy5zY2FubmVyLnN0YXJ0T2Zmc2V0IDogdGhpcy5zY2FubmVyLnRva2VuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25maWcgPSBwcm9jZXNzQ29uZmlnKGNvbmZpZyB8fCB7fSk7XG4gICAgZm9yICh2YXIga2V5IGluIGNvbmZpZykge1xuICAgICAgICBwYXJzZXJba2V5XSA9IGNvbmZpZ1trZXldO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQgfHwgJ2RlZmF1bHQnO1xuICAgICAgICB2YXIgYXN0O1xuXG4gICAgICAgIHBhcnNlci5zY2FubmVyLnNldFNvdXJjZShzb3VyY2UsIG9wdGlvbnMub2Zmc2V0LCBvcHRpb25zLmxpbmUsIG9wdGlvbnMuY29sdW1uKTtcbiAgICAgICAgcGFyc2VyLmZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZSB8fCAnPHVua25vd24+JztcbiAgICAgICAgcGFyc2VyLm5lZWRQb3NpdGlvbnMgPSBCb29sZWFuKG9wdGlvbnMucG9zaXRpb25zKTtcbiAgICAgICAgcGFyc2VyLm9uUGFyc2VFcnJvciA9IHR5cGVvZiBvcHRpb25zLm9uUGFyc2VFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMub25QYXJzZUVycm9yIDogbm9vcDtcbiAgICAgICAgcGFyc2VyLm9uUGFyc2VFcnJvclRocm93ID0gZmFsc2U7XG4gICAgICAgIHBhcnNlci5wYXJzZUF0cnVsZVByZWx1ZGUgPSAncGFyc2VBdHJ1bGVQcmVsdWRlJyBpbiBvcHRpb25zID8gQm9vbGVhbihvcHRpb25zLnBhcnNlQXRydWxlUHJlbHVkZSkgOiB0cnVlO1xuICAgICAgICBwYXJzZXIucGFyc2VSdWxlUHJlbHVkZSA9ICdwYXJzZVJ1bGVQcmVsdWRlJyBpbiBvcHRpb25zID8gQm9vbGVhbihvcHRpb25zLnBhcnNlUnVsZVByZWx1ZGUpIDogdHJ1ZTtcbiAgICAgICAgcGFyc2VyLnBhcnNlVmFsdWUgPSAncGFyc2VWYWx1ZScgaW4gb3B0aW9ucyA/IEJvb2xlYW4ob3B0aW9ucy5wYXJzZVZhbHVlKSA6IHRydWU7XG4gICAgICAgIHBhcnNlci5wYXJzZUN1c3RvbVByb3BlcnR5ID0gJ3BhcnNlQ3VzdG9tUHJvcGVydHknIGluIG9wdGlvbnMgPyBCb29sZWFuKG9wdGlvbnMucGFyc2VDdXN0b21Qcm9wZXJ0eSkgOiBmYWxzZTtcblxuICAgICAgICBpZiAoIXBhcnNlci5jb250ZXh0Lmhhc093blByb3BlcnR5KGNvbnRleHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gY29udGV4dCBgJyArIGNvbnRleHQgKyAnYCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXN0ID0gcGFyc2VyLmNvbnRleHRbY29udGV4dF0uY2FsbChwYXJzZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICghcGFyc2VyLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICBwYXJzZXIuc2Nhbm5lci5lcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNvdXJjZU1hcCA9IHJlcXVpcmUoJy4vc291cmNlTWFwJyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4obm9kZSwgZGVsaW1ldGVyKSB7XG4gICAgdmFyIGxpc3QgPSBub2RlLmNoaWxkcmVuO1xuICAgIHZhciBwcmV2ID0gbnVsbDtcblxuICAgIGlmICh0eXBlb2YgZGVsaW1ldGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxpc3QuZm9yRWFjaCh0aGlzLm5vZGUsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAocHJldiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlbGltZXRlci5jYWxsKHRoaXMsIHByZXYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm5vZGUobm9kZSk7XG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRvcihjb25maWcpIHtcbiAgICBmdW5jdGlvbiBwcm9jZXNzTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGVzLCBub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICB0eXBlc1tub2RlLnR5cGVdLmNhbGwodGhpcywgbm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlOiAnICsgbm9kZS50eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0eXBlcyA9IHt9O1xuXG4gICAgaWYgKGNvbmZpZy5ub2RlKSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gY29uZmlnLm5vZGUpIHtcbiAgICAgICAgICAgIHR5cGVzW25hbWVdID0gY29uZmlnLm5vZGVbbmFtZV0uZ2VuZXJhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24obm9kZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgYnVmZmVyID0gJyc7XG4gICAgICAgIHZhciBoYW5kbGVycyA9IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBwcm9jZXNzQ2hpbGRyZW4sXG4gICAgICAgICAgICBub2RlOiBwcm9jZXNzTm9kZSxcbiAgICAgICAgICAgIGNodW5rOiBmdW5jdGlvbihjaHVuaykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjaHVuaztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXN1bHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZWNvcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IG9wdGlvbnMuZGVjb3JhdG9yKGhhbmRsZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlTWFwKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBzb3VyY2VNYXAoaGFuZGxlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlcnMubm9kZShub2RlKTtcblxuICAgICAgICByZXR1cm4gaGFuZGxlcnMucmVzdWx0KCk7XG4gICAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbmZ1bmN0aW9uIGVuc3VyZUZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogbm9vcDtcbn1cblxuZnVuY3Rpb24gaW52b2tlRm9yVHlwZShmbiwgdHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgbm9kZSwgaXRlbSwgbGlzdCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRXYWxrZXJzRnJvbVN0cnVjdHVyZShuYW1lLCBub2RlVHlwZSkge1xuICAgIHZhciBzdHJ1Y3R1cmUgPSBub2RlVHlwZS5zdHJ1Y3R1cmU7XG4gICAgdmFyIHdhbGtlcnMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzdHJ1Y3R1cmUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc3RydWN0dXJlLCBrZXkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmllbGRUeXBlcyA9IHN0cnVjdHVyZVtrZXldO1xuICAgICAgICB2YXIgd2Fsa2VyID0ge1xuICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgdHlwZTogZmFsc2UsXG4gICAgICAgICAgICBudWxsYWJsZTogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RydWN0dXJlW2tleV0pKSB7XG4gICAgICAgICAgICBmaWVsZFR5cGVzID0gW3N0cnVjdHVyZVtrZXldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IGZpZWxkVHlwZXNbaV07XG4gICAgICAgICAgICBpZiAoZmllbGRUeXBlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd2Fsa2VyLm51bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB3YWxrZXIudHlwZSA9ICdub2RlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgd2Fsa2VyLnR5cGUgPSAnbGlzdCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2Fsa2VyLnR5cGUpIHtcbiAgICAgICAgICAgIHdhbGtlcnMucHVzaCh3YWxrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdhbGtlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZXh0OiBub2RlVHlwZS53YWxrQ29udGV4dCxcbiAgICAgICAgICAgIGZpZWxkczogd2Fsa2Vyc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlc0Zyb21Db25maWcoY29uZmlnKSB7XG4gICAgdmFyIHR5cGVzID0ge307XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIGNvbmZpZy5ub2RlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZy5ub2RlLCBuYW1lKSkge1xuICAgICAgICAgICAgdmFyIG5vZGVUeXBlID0gY29uZmlnLm5vZGVbbmFtZV07XG5cbiAgICAgICAgICAgIGlmICghbm9kZVR5cGUuc3RydWN0dXJlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzZWQgYHN0cnVjdHVyZWAgZmllbGQgaW4gYCcgKyBuYW1lICsgJ2Agbm9kZSB0eXBlIGRlZmluaXRpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHlwZXNbbmFtZV0gPSBnZXRXYWxrZXJzRnJvbVN0cnVjdHVyZShuYW1lLCBub2RlVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR5cGVJdGVyYXRvcihjb25maWcsIHJldmVyc2UpIHtcbiAgICB2YXIgZmllbGRzID0gcmV2ZXJzZSA/IGNvbmZpZy5maWVsZHMuc2xpY2UoKS5yZXZlcnNlKCkgOiBjb25maWcuZmllbGRzO1xuICAgIHZhciBib2R5ID0gZmllbGRzLm1hcChmdW5jdGlvbihmaWVsZCkge1xuICAgICAgICB2YXIgcmVmID0gJ25vZGUuJyArIGZpZWxkLm5hbWU7XG4gICAgICAgIHZhciBsaW5lO1xuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAgIGxpbmUgPSByZXZlcnNlXG4gICAgICAgICAgICAgICAgPyByZWYgKyAnLmZvckVhY2hSaWdodCh3YWxrKTsnXG4gICAgICAgICAgICAgICAgOiByZWYgKyAnLmZvckVhY2god2Fsayk7JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmUgPSAnd2FsaygnICsgcmVmICsgJyk7JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC5udWxsYWJsZSkge1xuICAgICAgICAgICAgbGluZSA9ICdpZiAoJyArIHJlZiArICcpIHtcXG4gICAgJyArIGxpbmUgKyAnfSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9KTtcblxuICAgIGlmIChjb25maWcuY29udGV4dCkge1xuICAgICAgICBib2R5ID0gW10uY29uY2F0KFxuICAgICAgICAgICAgJ3ZhciBvbGQgPSBjb250ZXh0LicgKyBjb25maWcuY29udGV4dCArICc7JyxcbiAgICAgICAgICAgICdjb250ZXh0LicgKyBjb25maWcuY29udGV4dCArICcgPSBub2RlOycsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgJ2NvbnRleHQuJyArIGNvbmZpZy5jb250ZXh0ICsgJyA9IG9sZDsnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbignbm9kZScsICdjb250ZXh0JywgJ3dhbGsnLCBib2R5LmpvaW4oJ1xcbicpKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmFzdFRyYXZlcmFsTWFwKGl0ZXJhdG9ycykge1xuICAgIHJldHVybiB7XG4gICAgICAgIEF0cnVsZToge1xuICAgICAgICAgICAgU3R5bGVTaGVldDogaXRlcmF0b3JzLlN0eWxlU2hlZXQsXG4gICAgICAgICAgICBBdHJ1bGU6IGl0ZXJhdG9ycy5BdHJ1bGUsXG4gICAgICAgICAgICBSdWxlOiBpdGVyYXRvcnMuUnVsZSxcbiAgICAgICAgICAgIEJsb2NrOiBpdGVyYXRvcnMuQmxvY2tcbiAgICAgICAgfSxcbiAgICAgICAgUnVsZToge1xuICAgICAgICAgICAgU3R5bGVTaGVldDogaXRlcmF0b3JzLlN0eWxlU2hlZXQsXG4gICAgICAgICAgICBBdHJ1bGU6IGl0ZXJhdG9ycy5BdHJ1bGUsXG4gICAgICAgICAgICBSdWxlOiBpdGVyYXRvcnMuUnVsZSxcbiAgICAgICAgICAgIEJsb2NrOiBpdGVyYXRvcnMuQmxvY2tcbiAgICAgICAgfSxcbiAgICAgICAgRGVjbGFyYXRpb246IHtcbiAgICAgICAgICAgIFN0eWxlU2hlZXQ6IGl0ZXJhdG9ycy5TdHlsZVNoZWV0LFxuICAgICAgICAgICAgQXRydWxlOiBpdGVyYXRvcnMuQXRydWxlLFxuICAgICAgICAgICAgUnVsZTogaXRlcmF0b3JzLlJ1bGUsXG4gICAgICAgICAgICBCbG9jazogaXRlcmF0b3JzLkJsb2NrXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZVdhbGtlcihjb25maWcpIHtcbiAgICB2YXIgdHlwZXMgPSBnZXRUeXBlc0Zyb21Db25maWcoY29uZmlnKTtcbiAgICB2YXIgaXRlcmF0b3JzTmF0dXJhbCA9IHt9O1xuICAgIHZhciBpdGVyYXRvcnNSZXZlcnNlID0ge307XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHR5cGVzKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGVzLCBuYW1lKSAmJiB0eXBlc1tuYW1lXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaXRlcmF0b3JzTmF0dXJhbFtuYW1lXSA9IGNyZWF0ZVR5cGVJdGVyYXRvcih0eXBlc1tuYW1lXSwgZmFsc2UpO1xuICAgICAgICAgICAgaXRlcmF0b3JzUmV2ZXJzZVtuYW1lXSA9IGNyZWF0ZVR5cGVJdGVyYXRvcih0eXBlc1tuYW1lXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZmFzdFRyYXZlcnNhbEl0ZXJhdG9yc05hdHVyYWwgPSBjcmVhdGVGYXN0VHJhdmVyYWxNYXAoaXRlcmF0b3JzTmF0dXJhbCk7XG4gICAgdmFyIGZhc3RUcmF2ZXJzYWxJdGVyYXRvcnNSZXZlcnNlID0gY3JlYXRlRmFzdFRyYXZlcmFsTWFwKGl0ZXJhdG9yc1JldmVyc2UpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHdhbGsocm9vdCwgb3B0aW9ucykge1xuICAgICAgICBmdW5jdGlvbiB3YWxrTm9kZShub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgICAgICAgICBlbnRlci5jYWxsKGNvbnRleHQsIG5vZGUsIGl0ZW0sIGxpc3QpO1xuXG4gICAgICAgICAgICBpZiAoaXRlcmF0b3JzLmhhc093blByb3BlcnR5KG5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcnNbbm9kZS50eXBlXShub2RlLCBjb250ZXh0LCB3YWxrTm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxlYXZlLmNhbGwoY29udGV4dCwgbm9kZSwgaXRlbSwgbGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW50ZXIgPSBub29wO1xuICAgICAgICB2YXIgbGVhdmUgPSBub29wO1xuICAgICAgICB2YXIgaXRlcmF0b3JzID0gaXRlcmF0b3JzTmF0dXJhbDtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgICAgICByb290OiByb290LFxuICAgICAgICAgICAgc3R5bGVzaGVldDogbnVsbCxcbiAgICAgICAgICAgIGF0cnVsZTogbnVsbCxcbiAgICAgICAgICAgIGF0cnVsZVByZWx1ZGU6IG51bGwsXG4gICAgICAgICAgICBydWxlOiBudWxsLFxuICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICBibG9jazogbnVsbCxcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uOiBudWxsLFxuICAgICAgICAgICAgZnVuY3Rpb246IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGVudGVyID0gb3B0aW9ucztcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBlbnRlciA9IGVuc3VyZUZ1bmN0aW9uKG9wdGlvbnMuZW50ZXIpO1xuICAgICAgICAgICAgbGVhdmUgPSBlbnN1cmVGdW5jdGlvbihvcHRpb25zLmxlYXZlKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmV2ZXJzZSkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9ycyA9IGl0ZXJhdG9yc1JldmVyc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnZpc2l0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGZhc3RUcmF2ZXJzYWxJdGVyYXRvcnNOYXR1cmFsLmhhc093blByb3BlcnR5KG9wdGlvbnMudmlzaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9ycyA9IG9wdGlvbnMucmV2ZXJzZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBmYXN0VHJhdmVyc2FsSXRlcmF0b3JzUmV2ZXJzZVtvcHRpb25zLnZpc2l0XVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmYXN0VHJhdmVyc2FsSXRlcmF0b3JzTmF0dXJhbFtvcHRpb25zLnZpc2l0XTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0eXBlcy5oYXNPd25Qcm9wZXJ0eShvcHRpb25zLnZpc2l0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCB2YWx1ZSBgJyArIG9wdGlvbnMudmlzaXQgKyAnYCBmb3IgYHZpc2l0YCBvcHRpb24gKHNob3VsZCBiZTogJyArIE9iamVjdC5rZXlzKHR5cGVzKS5qb2luKCcsICcpICsgJyknKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbnRlciA9IGludm9rZUZvclR5cGUoZW50ZXIsIG9wdGlvbnMudmlzaXQpO1xuICAgICAgICAgICAgICAgIGxlYXZlID0gaW52b2tlRm9yVHlwZShsZWF2ZSwgb3B0aW9ucy52aXNpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50ZXIgPT09IG5vb3AgJiYgbGVhdmUgPT09IG5vb3ApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciBgZW50ZXJgIG5vciBgbGVhdmVgIHdhbGtlciBoYW5kbGVyIGlzIHNldCBvciBib3RoIGFyZW5cXCd0IGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN3YXAgaGFuZGxlcnMgaW4gcmV2ZXJzZSBtb2RlIHRvIGludmVydCB2aXNpdCBvcmRlclxuICAgICAgICBpZiAob3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gZW50ZXI7XG4gICAgICAgICAgICBlbnRlciA9IGxlYXZlO1xuICAgICAgICAgICAgbGVhdmUgPSB0bXA7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrTm9kZShyb290KTtcbiAgICB9O1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgc2hhcGUgPSB7XG4gICAgZ2VuZXJpYzogdHJ1ZSxcbiAgICB0eXBlczoge30sXG4gICAgcHJvcGVydGllczoge30sXG4gICAgcGFyc2VDb250ZXh0OiB7fSxcbiAgICBzY29wZToge30sXG4gICAgYXRydWxlOiBbJ3BhcnNlJ10sXG4gICAgcHNldWRvOiBbJ3BhcnNlJ10sXG4gICAgbm9kZTogWyduYW1lJywgJ3N0cnVjdHVyZScsICdwYXJzZScsICdnZW5lcmF0ZScsICd3YWxrQ29udGV4dCddXG59O1xuXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBjb3B5KHZhbHVlKSB7XG4gICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgcmVzID0ge307XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXNba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzcmMsIGtleSkpIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChkZXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5kKGRlc3Rba2V5XSwgY29weShzcmNba2V5XSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSBjb3B5KHNyY1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbWl4KGRlc3QsIHNyYywgc2hhcGUpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2hhcGUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc2hhcGUsIGtleSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaGFwZVtrZXldID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoa2V5IGluIHNyYykge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNyYywga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSBjb3B5KHNyY1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVba2V5XSkge1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHNoYXBlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IHt9O1xuICAgICAgICAgICAgICAgIGV4dGVuZChyZXMsIGRlc3Rba2V5XSk7XG4gICAgICAgICAgICAgICAgZXh0ZW5kKHJlcywgc3JjW2tleV0pO1xuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IHJlcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzaGFwZVtrZXldKSkge1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSB7fTtcbiAgICAgICAgICAgICAgICB2YXIgaW5uZXJTaGFwZSA9IHNoYXBlW2tleV0ucmVkdWNlKGZ1bmN0aW9uKHMsIGspIHtcbiAgICAgICAgICAgICAgICAgICAgc1trXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIGRlc3Rba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChkZXN0W2tleV0sIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0W2tleV0gJiYgZGVzdFtrZXldW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4KHJlc1tuYW1lXSwgZGVzdFtrZXldW25hbWVdLCBpbm5lclNoYXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHNyY1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNyY1trZXldLCBuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNba2V5XSAmJiBzcmNba2V5XVtuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peChyZXNbbmFtZV0sIHNyY1trZXldW25hbWVdLCBpbm5lclNoYXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGVzdCwgc3JjKSB7XG4gICAgcmV0dXJuIG1peChkZXN0LCBzcmMsIHNoYXBlKTtcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2xpc3QnKTtcbnZhciBUb2tlbml6ZXIgPSByZXF1aXJlKCcuLi90b2tlbml6ZXInKTtcbnZhciBMZXhlciA9IHJlcXVpcmUoJy4uL2xleGVyL0xleGVyJyk7XG52YXIgZ3JhbW1hciA9IHJlcXVpcmUoJy4uL2xleGVyL2dyYW1tYXInKTtcbnZhciBjcmVhdGVQYXJzZXIgPSByZXF1aXJlKCcuLi9wYXJzZXIvY3JlYXRlJyk7XG52YXIgY3JlYXRlR2VuZXJhdG9yID0gcmVxdWlyZSgnLi4vZ2VuZXJhdG9yL2NyZWF0ZScpO1xudmFyIGNyZWF0ZUNvbnZlcnRvciA9IHJlcXVpcmUoJy4uL2NvbnZlcnRvci9jcmVhdGUnKTtcbnZhciBjcmVhdGVXYWxrZXIgPSByZXF1aXJlKCcuLi93YWxrZXIvY3JlYXRlJyk7XG52YXIgY2xvbmUgPSByZXF1aXJlKCcuLi91dGlscy9jbG9uZScpO1xudmFyIG5hbWVzID0gcmVxdWlyZSgnLi4vdXRpbHMvbmFtZXMnKTtcbnZhciBtaXggPSByZXF1aXJlKCcuL2NvbmZpZy9taXgnKTtcblxuZnVuY3Rpb24gYXNzaWduKGRlc3QsIHNyYykge1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bnRheChjb25maWcpIHtcbiAgICB2YXIgcGFyc2UgPSBjcmVhdGVQYXJzZXIoY29uZmlnKTtcbiAgICB2YXIgd2FsayA9IGNyZWF0ZVdhbGtlcihjb25maWcpO1xuICAgIHZhciBnZW5lcmF0ZSA9IGNyZWF0ZUdlbmVyYXRvcihjb25maWcpO1xuICAgIHZhciBjb252ZXJ0ID0gY3JlYXRlQ29udmVydG9yKHdhbGspO1xuXG4gICAgdmFyIHN5bnRheCA9IHtcbiAgICAgICAgTGlzdDogTGlzdCxcbiAgICAgICAgVG9rZW5pemVyOiBUb2tlbml6ZXIsXG4gICAgICAgIExleGVyOiBMZXhlcixcblxuICAgICAgICB2ZW5kb3JQcmVmaXg6IG5hbWVzLnZlbmRvclByZWZpeCxcbiAgICAgICAga2V5d29yZDogbmFtZXMua2V5d29yZCxcbiAgICAgICAgcHJvcGVydHk6IG5hbWVzLnByb3BlcnR5LFxuICAgICAgICBpc0N1c3RvbVByb3BlcnR5OiBuYW1lcy5pc0N1c3RvbVByb3BlcnR5LFxuXG4gICAgICAgIGdyYW1tYXI6IGdyYW1tYXIsXG4gICAgICAgIGxleGVyOiBudWxsLFxuICAgICAgICBjcmVhdGVMZXhlcjogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExleGVyKGNvbmZpZywgc3ludGF4LCBzeW50YXgubGV4ZXIuc3RydWN0dXJlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwYXJzZTogcGFyc2UsXG4gICAgICAgIHdhbGs6IHdhbGssXG4gICAgICAgIGdlbmVyYXRlOiBnZW5lcmF0ZSxcblxuICAgICAgICBjbG9uZTogY2xvbmUsXG4gICAgICAgIGZyb21QbGFpbk9iamVjdDogY29udmVydC5mcm9tUGxhaW5PYmplY3QsXG4gICAgICAgIHRvUGxhaW5PYmplY3Q6IGNvbnZlcnQudG9QbGFpbk9iamVjdCxcblxuICAgICAgICBjcmVhdGVTeW50YXg6IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheChtaXgoe30sIGNvbmZpZykpO1xuICAgICAgICB9LFxuICAgICAgICBmb3JrOiBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgICAgIHZhciBiYXNlID0gbWl4KHt9LCBjb25maWcpOyAvLyBjb3B5IG9mIGNvbmZpZ1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheChcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXh0ZW5zaW9uID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgID8gZXh0ZW5zaW9uKGJhc2UsIGFzc2lnbilcbiAgICAgICAgICAgICAgICAgICAgOiBtaXgoYmFzZSwgZXh0ZW5zaW9uKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzeW50YXgubGV4ZXIgPSBuZXcgTGV4ZXIoe1xuICAgICAgICBnZW5lcmljOiB0cnVlLFxuICAgICAgICB0eXBlczogY29uZmlnLnR5cGVzLFxuICAgICAgICBwcm9wZXJ0aWVzOiBjb25maWcucHJvcGVydGllcyxcbiAgICAgICAgbm9kZTogY29uZmlnLm5vZGVcbiAgICB9LCBzeW50YXgpO1xuXG4gICAgcmV0dXJuIHN5bnRheDtcbn07XG5cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVN5bnRheChtaXgoe30sIGNvbmZpZykpO1xufTtcbiIsInZhciBtZG5Qcm9wZXJ0aWVzID0gcmVxdWlyZSgnbWRuLWRhdGEvY3NzL3Byb3BlcnRpZXMuanNvbicpO1xudmFyIG1kblN5bnRheGVzID0gcmVxdWlyZSgnbWRuLWRhdGEvY3NzL3N5bnRheGVzLmpzb24nKTtcbnZhciBwYXRjaCA9IHJlcXVpcmUoJy4vcGF0Y2guanNvbicpO1xuXG5mdW5jdGlvbiBidWlsZERpY3Rpb25hcnkoZGljdCwgcGF0Y2hEaWN0KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgLy8gY29weSBhbGwgc3ludGF4ZXMgZm9yIGFuIG9yaWdpbmFsIGRpY3RcbiAgICBmb3IgKHZhciBrZXkgaW4gZGljdCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IGRpY3Rba2V5XS5zeW50YXg7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgYSBwYXRjaFxuICAgIGZvciAodmFyIGtleSBpbiBwYXRjaERpY3QpIHtcbiAgICAgICAgaWYgKGtleSBpbiBkaWN0KSB7XG4gICAgICAgICAgICBpZiAocGF0Y2hEaWN0W2tleV0uc3ludGF4KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwYXRjaERpY3Rba2V5XS5zeW50YXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwYXRjaERpY3Rba2V5XS5zeW50YXgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhdGNoRGljdFtrZXldLnN5bnRheDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHByb3BlcnRpZXM6IGJ1aWxkRGljdGlvbmFyeShtZG5Qcm9wZXJ0aWVzLCBwYXRjaC5wcm9wZXJ0aWVzKSxcbiAgICB0eXBlczogYnVpbGREaWN0aW9uYXJ5KG1kblN5bnRheGVzLCBwYXRjaC5zeW50YXhlcylcbn07XG4iLCJ2YXIgY21wQ2hhciA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLmNtcENoYXI7XG52YXIgaXNOdW1iZXIgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5pc051bWJlcjtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgUExVU1NJR04gPSBUWVBFLlBsdXNTaWduO1xudmFyIEhZUEhFTk1JTlVTID0gVFlQRS5IeXBoZW5NaW51cztcbnZhciBOID0gMTEwOyAvLyAnbicuY2hhckNvZGVBdCgwKVxudmFyIERJU0FMTE9XX1NJR04gPSB0cnVlO1xudmFyIEFMTE9XX1NJR04gPSBmYWxzZTtcblxuZnVuY3Rpb24gY2hlY2tUb2tlbklzSW50ZWdlcihzY2FubmVyLCBkaXNhbGxvd1NpZ24pIHtcbiAgICB2YXIgcG9zID0gc2Nhbm5lci50b2tlblN0YXJ0O1xuXG4gICAgaWYgKHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQocG9zKSA9PT0gUExVU1NJR04gfHxcbiAgICAgICAgc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdChwb3MpID09PSBIWVBIRU5NSU5VUykge1xuICAgICAgICBpZiAoZGlzYWxsb3dTaWduKSB7XG4gICAgICAgICAgICBzY2FubmVyLmVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zKys7XG4gICAgfVxuXG4gICAgZm9yICg7IHBvcyA8IHNjYW5uZXIudG9rZW5FbmQ7IHBvcysrKSB7XG4gICAgICAgIGlmICghaXNOdW1iZXIoc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdChwb3MpKSkge1xuICAgICAgICAgICAgc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIHBvcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEFuK0IgbWljcm9zeW50YXggaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jYW5iXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQW5QbHVzQicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGE6IFtTdHJpbmcsIG51bGxdLFxuICAgICAgICBiOiBbU3RyaW5nLCBudWxsXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGVuZCA9IHN0YXJ0O1xuICAgICAgICB2YXIgcHJlZml4ID0gJyc7XG4gICAgICAgIHZhciBhID0gbnVsbDtcbiAgICAgICAgdmFyIGIgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBOVU1CRVIgfHxcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFBMVVNTSUdOKSB7XG4gICAgICAgICAgICBjaGVja1Rva2VuSXNJbnRlZ2VyKHRoaXMuc2Nhbm5lciwgQUxMT1dfU0lHTik7XG4gICAgICAgICAgICBwcmVmaXggPSB0aGlzLnNjYW5uZXIuZ2V0VG9rZW5WYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgIHZhciBiU3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgICAgICAgICAgaWYgKGNtcENoYXIodGhpcy5zY2FubmVyLnNvdXJjZSwgYlN0YXJ0LCBIWVBIRU5NSU5VUykpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnLSc7XG4gICAgICAgICAgICAgICAgICAgIGJTdGFydCsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBoeXBoZW4gbWludXMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY21wQ2hhcih0aGlzLnNjYW5uZXIuc291cmNlLCBiU3RhcnQsIE4pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGEgPSBwcmVmaXggPT09ICcnICA/ICcxJyAgOlxuICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gJysnID8gJysxJyA6XG4gICAgICAgICAgICAgICAgcHJlZml4ID09PSAnLScgPyAnLTEnIDpcbiAgICAgICAgICAgICAgICBwcmVmaXg7XG5cbiAgICAgICAgICAgIHZhciBsZW4gPSB0aGlzLnNjYW5uZXIudG9rZW5FbmQgLSBiU3RhcnQ7XG4gICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIC4ubi0uLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQoYlN0YXJ0ICsgMSkgIT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIGJTdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIC4ubi17bnVtYmVyfS4uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0ID0gYlN0YXJ0ICsgMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyAuLm4tIHtudW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjaGVja1Rva2VuSXNJbnRlZ2VyKHRoaXMuc2Nhbm5lciwgRElTQUxMT1dfU0lHTik7XG4gICAgICAgICAgICAgICAgYiA9ICctJyArIHRoaXMuc2Nhbm5lci5nZXRUb2tlblZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gSFlQSEVOTUlOVVMgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gUExVU1NJR04pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gdGhpcy5zY2FubmVyLmdldFRva2VuVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBOVU1CRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tUb2tlbklzSW50ZWdlcih0aGlzLnNjYW5uZXIsIHByZWZpeCAhPT0gJycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOdW1iZXIodGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckF0KHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFuIG9wZXJhdG9yIGJlZm9yZSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJysnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwbHVzIGlzIHVzaW5nIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYiA9IHByZWZpeCArIHRoaXMuc2Nhbm5lci5nZXRUb2tlblZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVhdChOVU1CRVIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gJycgfHwgcHJlZml4ID09PSAnKycpIHsgLy8gbm8gbnVtYmVyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAnTnVtYmVyIG9yIGlkZW50aWZpZXIgaXMgZXhwZWN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCArIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFBMVVNTSUdOIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBIWVBIRU5NSU5VU1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYiA9IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQW5QbHVzQicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIGVuZCksXG4gICAgICAgICAgICBhOiBhLFxuICAgICAgICAgICAgYjogYlxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdmFyIGEgPSBub2RlLmEgIT09IG51bGwgJiYgbm9kZS5hICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBiID0gbm9kZS5iICE9PSBudWxsICYmIG5vZGUuYiAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rKFxuICAgICAgICAgICAgICAgIG5vZGUuYSA9PT0gJysxJyA/ICcrbicgOlxuICAgICAgICAgICAgICAgIG5vZGUuYSA9PT0gICcxJyA/ICAnbicgOlxuICAgICAgICAgICAgICAgIG5vZGUuYSA9PT0gJy0xJyA/ICctbicgOlxuICAgICAgICAgICAgICAgIG5vZGUuYSArICduJ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGIpIHtcbiAgICAgICAgICAgICAgICBiID0gU3RyaW5nKG5vZGUuYik7XG4gICAgICAgICAgICAgICAgaWYgKGIuY2hhckF0KDApID09PSAnLScgfHwgYi5jaGFyQXQoMCkgPT09ICcrJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNodW5rKGIuY2hhckF0KDApKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaHVuayhiLnN1YnN0cigxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaHVuaygnKycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNodW5rKGIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoU3RyaW5nKG5vZGUuYikpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIEFUS0VZV09SRCA9IFRZUEUuQXRLZXl3b3JkO1xudmFyIFNFTUlDT0xPTiA9IFRZUEUuU2VtaWNvbG9uO1xudmFyIExFRlRDVVJMWUJSQUNLRVQgPSBUWVBFLkxlZnRDdXJseUJyYWNrZXQ7XG52YXIgUklHSFRDVVJMWUJSQUNLRVQgPSBUWVBFLlJpZ2h0Q3VybHlCcmFja2V0O1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KHN0YXJ0VG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5SYXcoc3RhcnRUb2tlbiwgU0VNSUNPTE9OLCBMRUZUQ1VSTFlCUkFDS0VULCBmYWxzZSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25CbG9ja0F0cnVsZSgpIHtcbiAgICBmb3IgKHZhciBvZmZzZXQgPSAxLCB0eXBlOyB0eXBlID0gdGhpcy5zY2FubmVyLmxvb2t1cFR5cGUob2Zmc2V0KTsgb2Zmc2V0KyspIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IFJJR0hUQ1VSTFlCUkFDS0VUKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlID09PSBMRUZUQ1VSTFlCUkFDS0VUIHx8XG4gICAgICAgICAgICB0eXBlID09PSBBVEtFWVdPUkQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ0F0cnVsZScsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6IFN0cmluZyxcbiAgICAgICAgcHJlbHVkZTogWydBdHJ1bGVQcmVsdWRlJywgJ1JhdycsIG51bGxdLFxuICAgICAgICBibG9jazogWydCbG9jaycsIG51bGxdXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgbmFtZTtcbiAgICAgICAgdmFyIG5hbWVMb3dlckNhc2U7XG4gICAgICAgIHZhciBwcmVsdWRlID0gbnVsbDtcbiAgICAgICAgdmFyIGJsb2NrID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KEFUS0VZV09SRCk7XG5cbiAgICAgICAgbmFtZSA9IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydCArIDEpO1xuICAgICAgICBuYW1lTG93ZXJDYXNlID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgLy8gcGFyc2UgcHJlbHVkZVxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLmVvZiA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IExFRlRDVVJMWUJSQUNLRVQgJiZcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IFNFTUlDT0xPTikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyc2VBdHJ1bGVQcmVsdWRlKSB7XG4gICAgICAgICAgICAgICAgcHJlbHVkZSA9IHRoaXMucGFyc2VXaXRoRmFsbGJhY2sodGhpcy5BdHJ1bGVQcmVsdWRlLmJpbmQodGhpcywgbmFtZSksIGNvbnN1bWVSYXcpO1xuXG4gICAgICAgICAgICAgICAgLy8gdHVybiBlbXB0eSBBdHJ1bGVQcmVsdWRlIGludG8gbnVsbFxuICAgICAgICAgICAgICAgIGlmIChwcmVsdWRlLnR5cGUgPT09ICdBdHJ1bGVQcmVsdWRlJyAmJiBwcmVsdWRlLmNoaWxkcmVuLmhlYWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlbHVkZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVsdWRlID0gY29uc3VtZVJhdy5jYWxsKHRoaXMsIHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU0VNSUNPTE9OOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTEVGVENVUkxZQlJBQ0tFVDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdHJ1bGUuaGFzT3duUHJvcGVydHkobmFtZUxvd2VyQ2FzZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuYXRydWxlW25hbWVMb3dlckNhc2VdLmJsb2NrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gdGhpcy5hdHJ1bGVbbmFtZUxvd2VyQ2FzZV0uYmxvY2suY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgY29uc3VtZSBibG9jayBjb250ZW50IGFzIFJhdz9cbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB0aGlzLkJsb2NrKGlzRGVjbGFyYXRpb25CbG9ja0F0cnVsZS5jYWxsKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQXRydWxlJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIHByZWx1ZGU6IHByZWx1ZGUsXG4gICAgICAgICAgICBibG9jazogYmxvY2tcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsoJ0AnKTtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLm5hbWUpO1xuXG4gICAgICAgIGlmIChub2RlLnByZWx1ZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoJyAnKTtcbiAgICAgICAgICAgIHRoaXMubm9kZShub2RlLnByZWx1ZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUuYmxvY2spIHtcbiAgICAgICAgICAgIHRoaXMubm9kZShub2RlLmJsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoJzsnKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgd2Fsa0NvbnRleHQ6ICdhdHJ1bGUnXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBTVFJJTkcgPSBUWVBFLlN0cmluZztcbnZhciBET0xMQVJTSUdOID0gVFlQRS5Eb2xsYXJTaWduO1xudmFyIEFTVEVSSVNLID0gVFlQRS5Bc3RlcmlzaztcbnZhciBDT0xPTiA9IFRZUEUuQ29sb247XG52YXIgRVFVQUxTU0lHTiA9IFRZUEUuRXF1YWxzU2lnbjtcbnZhciBMRUZUU1FVQVJFQlJBQ0tFVCA9IFRZUEUuTGVmdFNxdWFyZUJyYWNrZXQ7XG52YXIgUklHSFRTUVVBUkVCUkFDS0VUID0gVFlQRS5SaWdodFNxdWFyZUJyYWNrZXQ7XG52YXIgQ0lSQ1VNRkxFWEFDQ0VOVCA9IFRZUEUuQ2lyY3VtZmxleEFjY2VudDtcbnZhciBWRVJUSUNBTExJTkUgPSBUWVBFLlZlcnRpY2FsTGluZTtcbnZhciBUSUxERSA9IFRZUEUuVGlsZGU7XG5cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZU5hbWUoKSB7XG4gICAgaWYgKHRoaXMuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xuICAgIH1cblxuICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgIHZhciBleHBlY3RJZGVudGlmaWVyID0gZmFsc2U7XG4gICAgdmFyIGNoZWNrQ29sb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgIGV4cGVjdElkZW50aWZpZXIgPSB0cnVlO1xuICAgICAgICBjaGVja0NvbG9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBWRVJUSUNBTExJTkUpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChJREVOVElGSUVSKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gVkVSVElDQUxMSU5FKSB7XG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIubG9va3VwVHlwZSgxKSAhPT0gRVFVQUxTU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoSURFTlRJRklFUik7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0SWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdJZGVudGlmaWVyIGlzIGV4cGVjdGVkJywgdGhpcy5zY2FubmVyLnRva2VuRW5kKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwZWN0SWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ1ZlcnRpY2FsIGxpbmUgaXMgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tDb2xvbiAmJiB0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBDT0xPTikge1xuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KElERU5USUZJRVIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgIG5hbWU6IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRPcGVyYXRvcigpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICB2YXIgdG9rZW5UeXBlID0gdGhpcy5zY2FubmVyLnRva2VuVHlwZTtcblxuICAgIGlmICh0b2tlblR5cGUgIT09IEVRVUFMU1NJR04gJiYgICAgICAgIC8vID1cbiAgICAgICAgdG9rZW5UeXBlICE9PSBUSUxERSAmJiAgICAgICAgICAgICAvLyB+PVxuICAgICAgICB0b2tlblR5cGUgIT09IENJUkNVTUZMRVhBQ0NFTlQgJiYgIC8vIF49XG4gICAgICAgIHRva2VuVHlwZSAhPT0gRE9MTEFSU0lHTiAmJiAgICAgICAgLy8gJD1cbiAgICAgICAgdG9rZW5UeXBlICE9PSBBU1RFUklTSyAmJiAgICAgICAgICAvLyAqPVxuICAgICAgICB0b2tlblR5cGUgIT09IFZFUlRJQ0FMTElORSAgICAgICAgIC8vIHw9XG4gICAgKSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignQXR0cmlidXRlIHNlbGVjdG9yICg9LCB+PSwgXj0sICQ9LCAqPSwgfD0pIGlzIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gRVFVQUxTU0lHTikge1xuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoRVFVQUxTU0lHTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydCk7XG59XG5cbi8vICdbJyBTKiBhdHRyaWJfbmFtZSAnXSdcbi8vICdbJyBTKiBhdHRyaWJfbmFtZSBTKiBhdHRyaWJfbWF0Y2hlciBTKiBbIElERU5UIHwgU1RSSU5HIF0gUyogYXR0cmliX2ZsYWdzPyBTKiAnXSdcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdBdHRyaWJ1dGVTZWxlY3RvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgbWF0Y2hlcjogW1N0cmluZywgbnVsbF0sXG4gICAgICAgIHZhbHVlOiBbJ1N0cmluZycsICdJZGVudGlmaWVyJywgbnVsbF0sXG4gICAgICAgIGZsYWdzOiBbU3RyaW5nLCBudWxsXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIG5hbWU7XG4gICAgICAgIHZhciBtYXRjaGVyID0gbnVsbDtcbiAgICAgICAgdmFyIHZhbHVlID0gbnVsbDtcbiAgICAgICAgdmFyIGZsYWdzID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KExFRlRTUVVBUkVCUkFDS0VUKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIG5hbWUgPSBnZXRBdHRyaWJ1dGVOYW1lLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gUklHSFRTUVVBUkVCUkFDS0VUKSB7XG4gICAgICAgICAgICAvLyBhdm9pZCBjYXNlIGBbbmFtZSBpXWBcbiAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBJREVOVElGSUVSKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlciA9IGdldE9wZXJhdG9yLmNhbGwodGhpcyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFNUUklOR1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLklkZW50aWZpZXIoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYXR0cmlidXRlIGZsYWdzXG4gICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgICAgIGZsYWdzID0gdGhpcy5zY2FubmVyLmdldFRva2VuVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChSSUdIVFNRVUFSRUJSQUNLRVQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQXR0cmlidXRlU2VsZWN0b3InLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgbWF0Y2hlcjogbWF0Y2hlcixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGZsYWdzOiBmbGFnc1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdmFyIGZsYWdzUHJlZml4ID0gJyAnO1xuXG4gICAgICAgIHRoaXMuY2h1bmsoJ1snKTtcbiAgICAgICAgdGhpcy5ub2RlKG5vZGUubmFtZSk7XG5cbiAgICAgICAgaWYgKG5vZGUubWF0Y2hlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jaHVuayhub2RlLm1hdGNoZXIpO1xuXG4gICAgICAgICAgICBpZiAobm9kZS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZShub2RlLnZhbHVlKTtcblxuICAgICAgICAgICAgICAgIC8vIHNwYWNlIGJldHdlZW4gc3RyaW5nIGFuZCBmbGFncyBpcyBub3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICBpZiAobm9kZS52YWx1ZS50eXBlID09PSAnU3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBmbGFnc1ByZWZpeCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmZsYWdzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rKGZsYWdzUHJlZml4KTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsobm9kZS5mbGFncyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNodW5rKCddJyk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgQ09NTUVOVCA9IFRZUEUuQ29tbWVudDtcbnZhciBTRU1JQ09MT04gPSBUWVBFLlNlbWljb2xvbjtcbnZhciBBVEtFWVdPUkQgPSBUWVBFLkF0S2V5d29yZDtcbnZhciBMRUZUQ1VSTFlCUkFDS0VUID0gVFlQRS5MZWZ0Q3VybHlCcmFja2V0O1xudmFyIFJJR0hUQ1VSTFlCUkFDS0VUID0gVFlQRS5SaWdodEN1cmx5QnJhY2tldDtcblxuZnVuY3Rpb24gY29uc3VtZVJhdyhzdGFydFRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuUmF3KHN0YXJ0VG9rZW4sIDAsIDAsIGZhbHNlLCB0cnVlKTtcbn1cbmZ1bmN0aW9uIGNvbnN1bWVSdWxlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlV2l0aEZhbGxiYWNrKHRoaXMuUnVsZSwgY29uc3VtZVJhdyk7XG59XG5mdW5jdGlvbiBjb25zdW1lUmF3RGVjbGFyYXRpb24oc3RhcnRUb2tlbikge1xuICAgIHJldHVybiB0aGlzLlJhdyhzdGFydFRva2VuLCAwLCBTRU1JQ09MT04sIHRydWUsIHRydWUpO1xufVxuZnVuY3Rpb24gY29uc3VtZURlY2xhcmF0aW9uKCkge1xuICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBTRU1JQ09MT04pIHtcbiAgICAgICAgcmV0dXJuIGNvbnN1bWVSYXdEZWNsYXJhdGlvbi5jYWxsKHRoaXMsIHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW4pO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gdGhpcy5wYXJzZVdpdGhGYWxsYmFjayh0aGlzLkRlY2xhcmF0aW9uLCBjb25zdW1lUmF3RGVjbGFyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFNFTUlDT0xPTikge1xuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQmxvY2snLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1tcbiAgICAgICAgICAgICdBdHJ1bGUnLFxuICAgICAgICAgICAgJ1J1bGUnLFxuICAgICAgICAgICAgJ0RlY2xhcmF0aW9uJ1xuICAgICAgICBdXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKGlzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgdmFyIGNvbnN1bWVyID0gaXNEZWNsYXJhdGlvbiA/IGNvbnN1bWVEZWNsYXJhdGlvbiA6IGNvbnN1bWVSdWxlO1xuXG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNyZWF0ZUxpc3QoKTtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KExFRlRDVVJMWUJSQUNLRVQpO1xuXG4gICAgICAgIHNjYW46XG4gICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBSSUdIVENVUkxZQlJBQ0tFVDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcblxuICAgICAgICAgICAgICAgIGNhc2UgV0hJVEVTUEFDRTpcbiAgICAgICAgICAgICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBBVEtFWVdPUkQ6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5wYXJzZVdpdGhGYWxsYmFjayh0aGlzLkF0cnVsZSwgY29uc3VtZVJhdykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY29uc3VtZXIuY2FsbCh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoUklHSFRDVVJMWUJSQUNLRVQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdCbG9jaycsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuaygneycpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuKG5vZGUsIGZ1bmN0aW9uKHByZXYpIHtcbiAgICAgICAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdEZWNsYXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNodW5rKCc7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNodW5rKCd9Jyk7XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ2Jsb2NrJ1xufTtcbiIsInZhciBpc0N1c3RvbVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbmFtZXMnKS5pc0N1c3RvbVByb3BlcnR5O1xudmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBDT0xPTiA9IFRZUEUuQ29sb247XG52YXIgRVhDTEFNQVRJT05NQVJLID0gVFlQRS5FeGNsYW1hdGlvbk1hcms7XG52YXIgU09MSURVUyA9IFRZUEUuU29saWR1cztcbnZhciBBU1RFUklTSyA9IFRZUEUuQXN0ZXJpc2s7XG52YXIgRE9MTEFSU0lHTiA9IFRZUEUuRG9sbGFyU2lnbjtcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgU0VNSUNPTE9OID0gVFlQRS5TZW1pY29sb247XG52YXIgUExVU1NJR04gPSBUWVBFLlBsdXNTaWduO1xudmFyIE5VTUJFUlNJR04gPSBUWVBFLk51bWJlclNpZ247XG5cbmZ1bmN0aW9uIGNvbnN1bWVWYWx1ZVJhdyhzdGFydFRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuUmF3KHN0YXJ0VG9rZW4sIEVYQ0xBTUFUSU9OTUFSSywgU0VNSUNPTE9OLCBmYWxzZSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVDdXN0b21Qcm9wZXJ0eVJhdyhzdGFydFRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuUmF3KHN0YXJ0VG9rZW4sIEVYQ0xBTUFUSU9OTUFSSywgU0VNSUNPTE9OLCBmYWxzZSwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBjb25zdW1lVmFsdWUoKSB7XG4gICAgdmFyIHN0YXJ0VmFsdWVUb2tlbiA9IHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW47XG4gICAgdmFyIHZhbHVlID0gdGhpcy5WYWx1ZSgpO1xuXG4gICAgaWYgKHZhbHVlLnR5cGUgIT09ICdSYXcnICYmXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lb2YgPT09IGZhbHNlICYmXG4gICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IFNFTUlDT0xPTiAmJlxuICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBFWENMQU1BVElPTk1BUksgJiZcbiAgICAgICAgdGhpcy5zY2FubmVyLmlzQmFsYW5jZUVkZ2Uoc3RhcnRWYWx1ZVRva2VuKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnRGVjbGFyYXRpb24nLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBpbXBvcnRhbnQ6IFtCb29sZWFuLCBTdHJpbmddLFxuICAgICAgICBwcm9wZXJ0eTogU3RyaW5nLFxuICAgICAgICB2YWx1ZTogWydWYWx1ZScsICdSYXcnXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuO1xuICAgICAgICB2YXIgcHJvcGVydHkgPSByZWFkUHJvcGVydHkuY2FsbCh0aGlzKTtcbiAgICAgICAgdmFyIGN1c3RvbVByb3BlcnR5ID0gaXNDdXN0b21Qcm9wZXJ0eShwcm9wZXJ0eSk7XG4gICAgICAgIHZhciBwYXJzZVZhbHVlID0gY3VzdG9tUHJvcGVydHkgPyB0aGlzLnBhcnNlQ3VzdG9tUHJvcGVydHkgOiB0aGlzLnBhcnNlVmFsdWU7XG4gICAgICAgIHZhciBjb25zdW1lUmF3ID0gY3VzdG9tUHJvcGVydHkgPyBjb25zdW1lQ3VzdG9tUHJvcGVydHlSYXcgOiBjb25zdW1lVmFsdWVSYXc7XG4gICAgICAgIHZhciBpbXBvcnRhbnQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDT0xPTik7XG5cbiAgICAgICAgaWYgKCFjdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlVmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZVdpdGhGYWxsYmFjayhjb25zdW1lVmFsdWUsIGNvbnN1bWVSYXcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBjb25zdW1lUmF3LmNhbGwodGhpcywgdGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gRVhDTEFNQVRJT05NQVJLKSB7XG4gICAgICAgICAgICBpbXBvcnRhbnQgPSBnZXRJbXBvcnRhbnQodGhpcy5zY2FubmVyKTtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvIG5vdCBpbmNsdWRlIHNlbWljb2xvbiB0byByYW5nZSBwZXIgc3BlY1xuICAgICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC8jZGVjbGFyYXRpb24tZGlhZ3JhbVxuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIuZW9mID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gU0VNSUNPTE9OICYmXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuaXNCYWxhbmNlRWRnZShzdGFydFRva2VuKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWNsYXJhdGlvbicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIGltcG9ydGFudDogaW1wb3J0YW50LFxuICAgICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmNodW5rKG5vZGUucHJvcGVydHkpO1xuICAgICAgICB0aGlzLmNodW5rKCc6Jyk7XG4gICAgICAgIHRoaXMubm9kZShub2RlLnZhbHVlKTtcblxuICAgICAgICBpZiAobm9kZS5pbXBvcnRhbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsobm9kZS5pbXBvcnRhbnQgPT09IHRydWUgPyAnIWltcG9ydGFudCcgOiAnIScgKyBub2RlLmltcG9ydGFudCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHdhbGtDb250ZXh0OiAnZGVjbGFyYXRpb24nXG59O1xuXG5mdW5jdGlvbiByZWFkUHJvcGVydHkoKSB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgdmFyIHByZWZpeCA9IDA7XG5cbiAgICAvLyBoYWNrc1xuICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICBjYXNlIEFTVEVSSVNLOlxuICAgICAgICBjYXNlIERPTExBUlNJR046XG4gICAgICAgIGNhc2UgUExVU1NJR046XG4gICAgICAgIGNhc2UgTlVNQkVSU0lHTjpcbiAgICAgICAgICAgIHByZWZpeCA9IDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAvLyBUT0RPOiBub3Qgc3VyZSB3ZSBzaG91bGQgc3VwcG9ydCB0aGlzIGhhY2tcbiAgICAgICAgY2FzZSBTT0xJRFVTOlxuICAgICAgICAgICAgcHJlZml4ID0gdGhpcy5zY2FubmVyLmxvb2t1cFR5cGUoMSkgPT09IFNPTElEVVMgPyAyIDogMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjYW5uZXIubG9va3VwVHlwZShwcmVmaXgpID09PSBIWVBIRU5NSU5VUykge1xuICAgICAgICBwcmVmaXgrKztcbiAgICB9XG5cbiAgICBpZiAocHJlZml4KSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwKHByZWZpeCk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2FubmVyLmVhdChJREVOVElGSUVSKTtcblxuICAgIHJldHVybiB0aGlzLnNjYW5uZXIuc3Vic3RyVG9DdXJzb3Ioc3RhcnQpO1xufVxuXG4vLyAhIHdzKiBpbXBvcnRhbnRcbmZ1bmN0aW9uIGdldEltcG9ydGFudChzY2FubmVyKSB7XG4gICAgc2Nhbm5lci5lYXQoRVhDTEFNQVRJT05NQVJLKTtcbiAgICBzY2FubmVyLnNraXBTQygpO1xuXG4gICAgdmFyIGltcG9ydGFudCA9IHNjYW5uZXIuY29uc3VtZShJREVOVElGSUVSKTtcblxuICAgIC8vIHN0b3JlIG9yaWdpbmFsIHZhbHVlIGluIGNhc2UgaXQgZGlmZmVyIGZyb20gYGltcG9ydGFudGBcbiAgICAvLyBmb3IgYmV0dGVyIG9yaWdpbmFsIHNvdXJjZSByZXN0b3JpbmcgYW5kIGhhY2tzIGxpa2UgYCFpZWAgc3VwcG9ydFxuICAgIHJldHVybiBpbXBvcnRhbnQgPT09ICdpbXBvcnRhbnQnID8gdHJ1ZSA6IGltcG9ydGFudDtcbn1cbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgQ09NTUVOVCA9IFRZUEUuQ29tbWVudDtcbnZhciBTRU1JQ09MT04gPSBUWVBFLlNlbWljb2xvbjtcblxuZnVuY3Rpb24gY29uc3VtZVJhdyhzdGFydFRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuUmF3KHN0YXJ0VG9rZW4sIDAsIFNFTUlDT0xPTiwgdHJ1ZSwgdHJ1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdEZWNsYXJhdGlvbkxpc3QnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1tcbiAgICAgICAgICAgICdEZWNsYXJhdGlvbidcbiAgICAgICAgXV1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jcmVhdGVMaXN0KCk7XG5cbiAgICAgICAgc2NhbjpcbiAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFdISVRFU1BBQ0U6XG4gICAgICAgICAgICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICAgICAgICAgIGNhc2UgU0VNSUNPTE9OOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5wYXJzZVdpdGhGYWxsYmFjayh0aGlzLkRlY2xhcmF0aW9uLCBjb25zdW1lUmF3KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0RlY2xhcmF0aW9uTGlzdCcsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb25Gcm9tTGlzdChjaGlsZHJlbiksXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4obm9kZSwgZnVuY3Rpb24ocHJldikge1xuICAgICAgICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ0RlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmsoJzsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsInZhciBOVU1CRVIgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFLk51bWJlcjtcblxuLy8gc3BlY2lhbCByZWFkZXIgZm9yIHVuaXRzIHRvIGF2b2lkIGFkam9pbmVkIElFIGhhY2tzIChpLmUuICcxcHhcXDknKVxuZnVuY3Rpb24gcmVhZFVuaXQoc2Nhbm5lcikge1xuICAgIHZhciB1bml0ID0gc2Nhbm5lci5nZXRUb2tlblZhbHVlKCk7XG4gICAgdmFyIGJhY2tTbGFzaFBvcyA9IHVuaXQuaW5kZXhPZignXFxcXCcpO1xuXG4gICAgaWYgKGJhY2tTbGFzaFBvcyA+IDApIHtcbiAgICAgICAgLy8gcGF0Y2ggdG9rZW4gb2Zmc2V0XG4gICAgICAgIHNjYW5uZXIudG9rZW5TdGFydCArPSBiYWNrU2xhc2hQb3M7XG5cbiAgICAgICAgLy8gcmV0dXJuIHBhcnQgYmVmb3JlIGJhY2tzbGFzaFxuICAgICAgICByZXR1cm4gdW5pdC5zdWJzdHJpbmcoMCwgYmFja1NsYXNoUG9zKTtcbiAgICB9XG5cbiAgICAvLyBubyBiYWNrc2xhc2ggaW4gdW5pdCBuYW1lXG4gICAgc2Nhbm5lci5uZXh0KCk7XG5cbiAgICByZXR1cm4gdW5pdDtcbn1cblxuLy8gbnVtYmVyIGlkZW50XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnRGltZW5zaW9uJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZyxcbiAgICAgICAgdW5pdDogU3RyaW5nXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnNjYW5uZXIuY29uc3VtZShOVU1CRVIpO1xuICAgICAgICB2YXIgdW5pdCA9IHJlYWRVbml0KHRoaXMuc2Nhbm5lcik7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdEaW1lbnNpb24nLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICB1bml0OiB1bml0XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmNodW5rKG5vZGUudmFsdWUpO1xuICAgICAgICB0aGlzLmNodW5rKG5vZGUudW5pdCk7XG4gICAgfVxufTtcbiIsInZhciBpc0hleCA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLmlzSGV4O1xudmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBOVU1CRVIgPSBUWVBFLk51bWJlcjtcbnZhciBOVU1CRVJTSUdOID0gVFlQRS5OdW1iZXJTaWduO1xuXG5mdW5jdGlvbiBjb25zdW1lSGV4U2VxdWVuY2Uoc2Nhbm5lciwgcmVxdWlyZWQpIHtcbiAgICBpZiAoIWlzSGV4KHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQoc2Nhbm5lci50b2tlblN0YXJ0KSkpIHtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICBzY2FubmVyLmVycm9yKCdVbmV4cGVjdGVkIGlucHV0Jywgc2Nhbm5lci50b2tlblN0YXJ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIHBvcyA9IHNjYW5uZXIudG9rZW5TdGFydCArIDE7IHBvcyA8IHNjYW5uZXIudG9rZW5FbmQ7IHBvcysrKSB7XG4gICAgICAgIHZhciBjb2RlID0gc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgIC8vIGJyZWFrIG9uIG5vbi1oZXggY2hhclxuICAgICAgICBpZiAoIWlzSGV4KGNvZGUpKSB7XG4gICAgICAgICAgICAvLyBicmVhayB0b2tlbiwgZXhjbHVkZSBzeW1ib2xcbiAgICAgICAgICAgIHNjYW5uZXIudG9rZW5TdGFydCA9IHBvcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRva2VuIGlzIGZ1bGwgaGV4IHNlcXVlbmNlLCBnbyB0byBuZXh0IHRva2VuXG4gICAgc2Nhbm5lci5uZXh0KCk7XG59XG5cbi8vICMgaWRlbnRcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdIZXhDb2xvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChOVU1CRVJTSUdOKTtcblxuICAgICAgICBzY2FuOlxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTlVNQkVSOlxuICAgICAgICAgICAgICAgIGNvbnN1bWVIZXhTZXF1ZW5jZSh0aGlzLnNjYW5uZXIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdG9rZW4gaXMgaWRlbnRpZmllciB0aGVuIG51bWJlciBjb25zaXN0cyBvZiBoZXggb25seSxcbiAgICAgICAgICAgICAgICAvLyB0cnkgdG8gYWRkIGlkZW50aWZpZXIgdG8gcmVzdWx0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUhleFNlcXVlbmNlKHRoaXMuc2Nhbm5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIElERU5USUZJRVI6XG4gICAgICAgICAgICAgICAgY29uc3VtZUhleFNlcXVlbmNlKHRoaXMuc2Nhbm5lciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdOdW1iZXIgb3IgaWRlbnRpZmllciBpcyBleHBlY3RlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdIZXhDb2xvcicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNjYW5uZXIuc3Vic3RyVG9DdXJzb3Ioc3RhcnQgKyAxKSAvLyBza2lwICNcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsoJyMnKTtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLnZhbHVlKTtcbiAgICB9XG59O1xuIiwidmFyIGlzTnVtYmVyID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuaXNOdW1iZXI7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgU09MSURVUyA9IFRZUEUuU29saWR1cztcbnZhciBGVUxMU1RPUCA9IFRZUEUuRnVsbFN0b3A7XG5cbi8vIFRlcm1zIG9mIDxyYXRpbz4gc2hvdWxkIHRvIGJlIGEgcG9zaXRpdmUgbnVtYmVyIChub3QgemVybyBvciBuZWdhdGl2ZSlcbi8vIChzZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL21lZGlhcXVlcmllcy0zLyN2YWx1ZXMpXG4vLyBIb3dldmVyLCAtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvIHRha2VzIGZyYWN0aW9uYWwgdmFsdWVzIGFzIGEgcmF0aW8ncyB0ZXJtXG4vLyBhbmQgdGhpcyBpcyB1c2luZyBieSB2YXJpb3VzIHNpdGVzLiBUaGVyZWZvcmUgd2UgcmVsYXggY2hlY2tpbmcgb24gcGFyc2Vcbi8vIHRvIHRlc3QgYSB0ZXJtIGlzIHVuc2lnbmVkIG51bWJlciB3aXRob3V0IGV4cG9uZW50IHBhcnQuXG4vLyBBZGRpdGlvbmFsIGNoZWNrcyBtYXkgdG8gYmUgYXBwbGllZCBvbiBsZXhlciB2YWxpZGF0aW9uLlxuZnVuY3Rpb24gY29uc3VtZU51bWJlcihzY2FubmVyKSB7XG4gICAgdmFyIHZhbHVlID0gc2Nhbm5lci5jb25zdW1lTm9uV1MoTlVNQkVSKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoIWlzTnVtYmVyKGNvZGUpICYmIGNvZGUgIT09IEZVTExTVE9QKSB7XG4gICAgICAgICAgICBzY2FubmVyLmVycm9yKCdVbnNpZ25lZCBudW1iZXIgaXMgZXhwZWN0ZWQnLCBzY2FubmVyLnRva2VuU3RhcnQgLSB2YWx1ZS5sZW5ndGggKyBpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChOdW1iZXIodmFsdWUpID09PSAwKSB7XG4gICAgICAgIHNjYW5uZXIuZXJyb3IoJ1plcm8gbnVtYmVyIGlzIG5vdCBhbGxvd2VkJywgc2Nhbm5lci50b2tlblN0YXJ0IC0gdmFsdWUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIDxwb3NpdGl2ZS1pbnRlZ2VyPiBTKiAnLycgUyogPHBvc2l0aXZlLWludGVnZXI+XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnUmF0aW8nLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBsZWZ0OiBTdHJpbmcsXG4gICAgICAgIHJpZ2h0OiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBsZWZ0ID0gY29uc3VtZU51bWJlcih0aGlzLnNjYW5uZXIpO1xuICAgICAgICB2YXIgcmlnaHQ7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdE5vbldTKFNPTElEVVMpO1xuICAgICAgICByaWdodCA9IGNvbnN1bWVOdW1iZXIodGhpcy5zY2FubmVyKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ1JhdGlvJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiByaWdodFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLmxlZnQpO1xuICAgICAgICB0aGlzLmNodW5rKCcvJyk7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS5yaWdodCk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIExFRlRDVVJMWUJSQUNLRVQgPSBUWVBFLkxlZnRDdXJseUJyYWNrZXQ7XG5cbmZ1bmN0aW9uIGNvbnN1bWVSYXcoc3RhcnRUb2tlbikge1xuICAgIHJldHVybiB0aGlzLlJhdyhzdGFydFRva2VuLCBMRUZUQ1VSTFlCUkFDS0VULCAwLCBmYWxzZSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVQcmVsdWRlKCkge1xuICAgIHZhciBwcmVsdWRlID0gdGhpcy5TZWxlY3Rvckxpc3QoKTtcblxuICAgIGlmIChwcmVsdWRlLnR5cGUgIT09ICdSYXcnICYmXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lb2YgPT09IGZhbHNlICYmXG4gICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IExFRlRDVVJMWUJSQUNLRVQpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZWx1ZGU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdSdWxlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgcHJlbHVkZTogWydTZWxlY3Rvckxpc3QnLCAnUmF3J10sXG4gICAgICAgIGJsb2NrOiBbJ0Jsb2NrJ11cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuO1xuICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIHByZWx1ZGU7XG4gICAgICAgIHZhciBibG9jaztcblxuICAgICAgICBpZiAodGhpcy5wYXJzZVJ1bGVQcmVsdWRlKSB7XG4gICAgICAgICAgICBwcmVsdWRlID0gdGhpcy5wYXJzZVdpdGhGYWxsYmFjayhjb25zdW1lUHJlbHVkZSwgY29uc3VtZVJhdyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmVsdWRlID0gY29uc3VtZVJhdy5jYWxsKHRoaXMsIHN0YXJ0VG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYmxvY2sgPSB0aGlzLkJsb2NrKHRydWUpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnUnVsZScsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnRPZmZzZXQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIHByZWx1ZGU6IHByZWx1ZGUsXG4gICAgICAgICAgICBibG9jazogYmxvY2tcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMubm9kZShub2RlLnByZWx1ZGUpO1xuICAgICAgICB0aGlzLm5vZGUobm9kZS5ibG9jayk7XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ3J1bGUnXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgV0hJVEVTUEFDRSA9IFRZUEUuV2hpdGVTcGFjZTtcbnZhciBDT01NRU5UID0gVFlQRS5Db21tZW50O1xudmFyIEVYQ0xBTUFUSU9OTUFSSyA9IFRZUEUuRXhjbGFtYXRpb25NYXJrO1xudmFyIEFUS0VZV09SRCA9IFRZUEUuQXRLZXl3b3JkO1xudmFyIENETyA9IFRZUEUuQ0RPO1xudmFyIENEQyA9IFRZUEUuQ0RDO1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KHN0YXJ0VG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5SYXcoc3RhcnRUb2tlbiwgMCwgMCwgZmFsc2UsIGZhbHNlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1N0eWxlU2hlZXQnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1tcbiAgICAgICAgICAgICdDb21tZW50JyxcbiAgICAgICAgICAgICdDRE8nLFxuICAgICAgICAgICAgJ0NEQycsXG4gICAgICAgICAgICAnQXRydWxlJyxcbiAgICAgICAgICAgICdSdWxlJyxcbiAgICAgICAgICAgICdSYXcnXG4gICAgICAgIF1dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNyZWF0ZUxpc3QoKTtcbiAgICAgICAgdmFyIGNoaWxkO1xuXG4gICAgICAgIHNjYW46XG4gICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBXSElURVNQQUNFOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNvbW1lbnRzIGV4Y2VwdCBleGNsYW1hdGlvbiBjb21tZW50cyAoaS5lLiAvKiEgLi4gKi8pIG9uIHRvcCBsZXZlbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0ICsgMikgIT09IEVYQ0xBTUFUSU9OTUFSSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLkNvbW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENETzogLy8gPCEtLVxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuQ0RPKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBDREM6IC8vIC0tPlxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuQ0RDKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gQ1NTIFN5bnRheCBNb2R1bGUgTGV2ZWwgM1xuICAgICAgICAgICAgICAgIC8vIMKnMi4yIEVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgLy8gQXQgdGhlIFwidG9wIGxldmVsXCIgb2YgYSBzdHlsZXNoZWV0LCBhbiA8YXQta2V5d29yZC10b2tlbj4gc3RhcnRzIGFuIGF0LXJ1bGUuXG4gICAgICAgICAgICAgICAgY2FzZSBBVEtFWVdPUkQ6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5wYXJzZVdpdGhGYWxsYmFjayh0aGlzLkF0cnVsZSwgY29uc3VtZVJhdyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gQW55dGhpbmcgZWxzZSBzdGFydHMgYSBxdWFsaWZpZWQgcnVsZSAuLi5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMucGFyc2VXaXRoRmFsbGJhY2sodGhpcy5SdWxlLCBjb25zdW1lUmF3KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ1N0eWxlU2hlZXQnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4obm9kZSk7XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ3N0eWxlc2hlZXQnXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBBU1RFUklTSyA9IFRZUEUuQXN0ZXJpc2s7XG52YXIgVkVSVElDQUxMSU5FID0gVFlQRS5WZXJ0aWNhbExpbmU7XG5cbmZ1bmN0aW9uIGVhdElkZW50aWZpZXJPckFzdGVyaXNrKCkge1xuICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBJREVOVElGSUVSICYmXG4gICAgICAgIHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IEFTVEVSSVNLKSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignSWRlbnRpZmllciBvciBhc3RlcmlzayBpcyBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG59XG5cbi8vIGlkZW50XG4vLyBpZGVudHxpZGVudFxuLy8gaWRlbnR8KlxuLy8gKlxuLy8gKnxpZGVudFxuLy8gKnwqXG4vLyB8aWRlbnRcbi8vIHwqXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnVHlwZVNlbGVjdG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBWRVJUSUNBTExJTkUpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICBlYXRJZGVudGlmaWVyT3JBc3Rlcmlzay5jYWxsKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWF0SWRlbnRpZmllck9yQXN0ZXJpc2suY2FsbCh0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IFZFUlRJQ0FMTElORSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgZWF0SWRlbnRpZmllck9yQXN0ZXJpc2suY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnVHlwZVNlbGVjdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5zY2FubmVyLnN1YnN0clRvQ3Vyc29yKHN0YXJ0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLm5hbWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgaXNIZXggPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5pc0hleDtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgUExVU1NJR04gPSBUWVBFLlBsdXNTaWduO1xudmFyIEhZUEhFTk1JTlVTID0gVFlQRS5IeXBoZW5NaW51cztcbnZhciBGVUxMU1RPUCA9IFRZUEUuRnVsbFN0b3A7XG52YXIgUVVFU1RJT05NQVJLID0gVFlQRS5RdWVzdGlvbk1hcms7XG5cbmZ1bmN0aW9uIHNjYW5Vbmljb2RlTnVtYmVyKHNjYW5uZXIpIHtcbiAgICBmb3IgKHZhciBwb3MgPSBzY2FubmVyLnRva2VuU3RhcnQgKyAxOyBwb3MgPCBzY2FubmVyLnRva2VuRW5kOyBwb3MrKykge1xuICAgICAgICB2YXIgY29kZSA9IHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQocG9zKTtcblxuICAgICAgICAvLyBicmVhayBvbiBmdWxsc3RvcCBvciBoeXBlcm1pbnVzL3BsdXNzaWduIGFmdGVyIGV4cG9uZW50XG4gICAgICAgIGlmIChjb2RlID09PSBGVUxMU1RPUCB8fCBjb2RlID09PSBQTFVTU0lHTikge1xuICAgICAgICAgICAgLy8gYnJlYWsgdG9rZW4sIGV4Y2x1ZGUgc3ltYm9sXG4gICAgICAgICAgICBzY2FubmVyLnRva2VuU3RhcnQgPSBwb3M7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1zeW50YXgtMy8jdXJhbmdlXG5mdW5jdGlvbiBzY2FuVW5pY29kZVJhbmdlKHNjYW5uZXIpIHtcbiAgICB2YXIgaGV4U3RhcnQgPSBzY2FubmVyLnRva2VuU3RhcnQgKyAxOyAvLyBza2lwICtcbiAgICB2YXIgaGV4TGVuZ3RoID0gMDtcblxuICAgIHNjYW46IHtcbiAgICAgICAgaWYgKHNjYW5uZXIudG9rZW5UeXBlID09PSBOVU1CRVIpIHtcbiAgICAgICAgICAgIGlmIChzY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHNjYW5uZXIudG9rZW5TdGFydCkgIT09IEZVTExTVE9QICYmIHNjYW5Vbmljb2RlTnVtYmVyKHNjYW5uZXIpKSB7XG4gICAgICAgICAgICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQoc2Nhbm5lci50b2tlblN0YXJ0KSAhPT0gSFlQSEVOTUlOVVMpIHtcbiAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2Nhbm5lci5uZXh0KCk7IC8vIFBMVVNTSUdOXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nhbm5lci50b2tlblR5cGUgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2FubmVyLnRva2VuVHlwZSA9PT0gTlVNQkVSKSB7XG4gICAgICAgICAgICBzY2FubmVyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2FubmVyLnRva2VuVHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nhbm5lci50b2tlblN0YXJ0ID09PSBoZXhTdGFydCkge1xuICAgICAgICAgICAgc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIGhleFN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGZvciBVK3h7MSw2fSBvciBVK3h7MSw2fS14ezEsNn1cbiAgICAvLyB3aGVyZSB4IGlzIFswLTlhLWZBLUZdXG4gICAgZm9yICh2YXIgaSA9IGhleFN0YXJ0LCB3YXNIeXBoZW5NaW51cyA9IGZhbHNlOyBpIDwgc2Nhbm5lci50b2tlblN0YXJ0OyBpKyspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChpc0hleChjb2RlKSA9PT0gZmFsc2UgJiYgKGNvZGUgIT09IEhZUEhFTk1JTlVTIHx8IHdhc0h5cGhlbk1pbnVzKSkge1xuICAgICAgICAgICAgc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IEhZUEhFTk1JTlVTKSB7XG4gICAgICAgICAgICAvLyBoZXggc2VxdWVuY2Ugc2hvdWxkbid0IGJlIGFuIGVtcHR5XG4gICAgICAgICAgICBpZiAoaGV4TGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2Nhbm5lci5lcnJvcignVW5leHBlY3RlZCBpbnB1dCcsIGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3YXNIeXBoZW5NaW51cyA9IHRydWU7XG4gICAgICAgICAgICBoZXhMZW5ndGggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGV4TGVuZ3RoKys7XG5cbiAgICAgICAgICAgIC8vIHRvbyBsb25nIGhleCBzZXF1ZW5jZVxuICAgICAgICAgICAgaWYgKGhleExlbmd0aCA+IDYpIHtcbiAgICAgICAgICAgICAgICBzY2FubmVyLmVycm9yKCdUb28gbG9uZyBoZXggc2VxdWVuY2UnLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgd2UgaGF2ZSBhIG5vbi16ZXJvIHNlcXVlbmNlXG4gICAgaWYgKGhleExlbmd0aCA9PT0gMCkge1xuICAgICAgICBzY2FubmVyLmVycm9yKCdVbmV4cGVjdGVkIGlucHV0JywgaSAtIDEpO1xuICAgIH1cblxuICAgIC8vIFUrYWJjPz8/XG4gICAgaWYgKCF3YXNIeXBoZW5NaW51cykge1xuICAgICAgICAvLyBjb25zdW1lIGFzIG1hbnkgVSswMDNGIFFVRVNUSU9OIE1BUksgKD8pIGNvZGUgcG9pbnRzIGFzIHBvc3NpYmxlXG4gICAgICAgIGZvciAoOyBoZXhMZW5ndGggPCA2ICYmICFzY2FubmVyLmVvZjsgc2Nhbm5lci5uZXh0KCkpIHtcbiAgICAgICAgICAgIGlmIChzY2FubmVyLnRva2VuVHlwZSAhPT0gUVVFU1RJT05NQVJLKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhleExlbmd0aCsrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnVW5pY29kZVJhbmdlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpOyAvLyBVIG9yIHVcbiAgICAgICAgc2NhblVuaWNvZGVSYW5nZSh0aGlzLnNjYW5uZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnVW5pY29kZVJhbmdlJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS52YWx1ZSk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgQ09NTUVOVCA9IFRZUEUuQ29tbWVudDtcbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIEZVTkNUSU9OID0gVFlQRS5GdW5jdGlvbjtcbnZhciBMRUZUUEFSRU5USEVTSVMgPSBUWVBFLkxlZnRQYXJlbnRoZXNpcztcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgQ09MT04gPSBUWVBFLkNvbG9uO1xuXG5mdW5jdGlvbiBjb25zdW1lUmF3KCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZU5vZGVMaXN0KFxuICAgICAgICB0aGlzLlJhdyh0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuLCAwLCAwLCBmYWxzZSwgZmFsc2UpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gcGFyZW50aGVzZXMoKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcblxuICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgIC8vIFRPRE86IG1ha2UgaXQgc2ltcGxpZXJcbiAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICBpbmRleCA9IDE7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBIWVBIRU5NSU5VUyAmJlxuICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmxvb2t1cFR5cGUoMSkgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgaW5kZXggPSAyO1xuICAgIH1cblxuICAgIGlmIChpbmRleCAhPT0gMCAmJiB0aGlzLnNjYW5uZXIubG9va3VwTm9uV1NUeXBlKGluZGV4KSA9PT0gQ09MT04pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2luZ2xlTm9kZUxpc3QoXG4gICAgICAgICAgICB0aGlzLkRlY2xhcmF0aW9uKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVhZFNlcXVlbmNlLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTZXF1ZW5jZSgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNyZWF0ZUxpc3QoKTtcbiAgICB2YXIgc3BhY2UgPSBudWxsO1xuICAgIHZhciBjaGlsZDtcblxuICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgIHNjYW46XG4gICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXSElURVNQQUNFOlxuICAgICAgICAgICAgICAgIHNwYWNlID0gdGhpcy5XaGl0ZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjYXNlIEZVTkNUSU9OOlxuICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5GdW5jdGlvbihjb25zdW1lUmF3LCB0aGlzLnNjb3BlLkF0cnVsZVByZWx1ZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIElERU5USUZJRVI6XG4gICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLklkZW50aWZpZXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMRUZUUEFSRU5USEVTSVM6XG4gICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLlBhcmVudGhlc2VzKHBhcmVudGhlc2VzLCB0aGlzLnNjb3BlLkF0cnVsZVByZWx1ZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3BhY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgc3BhY2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZToge1xuICAgICAgICBwcmVsdWRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHJlYWRTZXF1ZW5jZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRGaXJzdExpc3ROb2RlKGNoaWxkcmVuKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignQ29uZGl0aW9uIGlzIGV4cGVjdGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgfSxcbiAgICAgICAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQmxvY2soZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGJ1aWxkTWFwKGxpc3QsIGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmFtZSA9IGxpc3RbaV07XG5cbiAgICAgICAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcFtuYW1lXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gYnVpbGRMaXN0KGRhdGEpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHRhZ3MgPSBidWlsZE1hcChkYXRhLnRhZ3MsIHRydWUpO1xuICAgIHZhciBpZHMgPSBidWlsZE1hcChkYXRhLmlkcyk7XG4gICAgdmFyIGNsYXNzZXMgPSBidWlsZE1hcChkYXRhLmNsYXNzZXMpO1xuXG4gICAgaWYgKHRhZ3MgPT09IG51bGwgJiZcbiAgICAgICAgaWRzID09PSBudWxsICYmXG4gICAgICAgIGNsYXNzZXMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFnczogdGFncyxcbiAgICAgICAgaWRzOiBpZHMsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEluZGV4KGRhdGEpIHtcbiAgICB2YXIgc2NvcGVzID0gZmFsc2U7XG5cbiAgICBpZiAoZGF0YS5zY29wZXMgJiYgQXJyYXkuaXNBcnJheShkYXRhLnNjb3BlcykpIHtcbiAgICAgICAgc2NvcGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuc2NvcGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbGlzdCA9IGRhdGEuc2NvcGVzW2ldO1xuXG4gICAgICAgICAgICBpZiAoIWxpc3QgfHwgIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIHVzYWdlIGZvcm1hdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGxpc3Rbal07XG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzY29wZXMsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2xhc3MgY2FuXFwndCBiZSB1c2VkIGZvciBzZXZlcmFsIHNjb3BlczogJyArIG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjb3Blc1tuYW1lXSA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2hpdGVsaXN0OiBidWlsZExpc3QoZGF0YSksXG4gICAgICAgIGJsYWNrbGlzdDogYnVpbGRMaXN0KGRhdGEuYmxhY2tsaXN0KSxcbiAgICAgICAgc2NvcGVzOiBzY29wZXNcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBidWlsZEluZGV4OiBidWlsZEluZGV4XG59O1xuIiwidmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciB3YWxrID0gcmVxdWlyZSgnY3NzLXRyZWUnKS53YWxrO1xuXG5mdW5jdGlvbiBjbGVhblVudXNlZChzZWxlY3Rvckxpc3QsIHVzYWdlRGF0YSkge1xuICAgIHNlbGVjdG9yTGlzdC5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKHNlbGVjdG9yLCBpdGVtLCBsaXN0KSB7XG4gICAgICAgIHZhciBzaG91bGRSZW1vdmUgPSBmYWxzZTtcblxuICAgICAgICB3YWxrKHNlbGVjdG9yLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbm9kZXMgaW4gbmVzdGVkIHNlbGVjdG9yc1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0b3IgPT09IG51bGwgfHwgdGhpcy5zZWxlY3RvciA9PT0gc2VsZWN0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU2VsZWN0b3JMaXN0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0b0xvd2VyQ2FzZSB3aGVuIHBzZXVkbyBzZWxlY3RvcnMgd2lsbCBiZSBub3JtYWxpemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgc2VsZWN0b3JzIGluc2lkZSA6bm90KClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzWydmdW5jdGlvbiddID09PSBudWxsIHx8IHRoaXNbJ2Z1bmN0aW9uJ10ubmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnbm90Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhblVudXNlZChub2RlLCB1c2FnZURhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ2xhc3NTZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNhZ2VEYXRhLndoaXRlbGlzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlRGF0YS53aGl0ZWxpc3QuY2xhc3NlcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wZXJ0eS5jYWxsKHVzYWdlRGF0YS53aGl0ZWxpc3QuY2xhc3Nlcywgbm9kZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNhZ2VEYXRhLmJsYWNrbGlzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlRGF0YS5ibGFja2xpc3QuY2xhc3NlcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc093blByb3BlcnR5LmNhbGwodXNhZ2VEYXRhLmJsYWNrbGlzdC5jbGFzc2VzLCBub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0lkU2VsZWN0b3InOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzYWdlRGF0YS53aGl0ZWxpc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZURhdGEud2hpdGVsaXN0LmlkcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wZXJ0eS5jYWxsKHVzYWdlRGF0YS53aGl0ZWxpc3QuaWRzLCBub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2FnZURhdGEuYmxhY2tsaXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VEYXRhLmJsYWNrbGlzdC5pZHMgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPd25Qcm9wZXJ0eS5jYWxsKHVzYWdlRGF0YS5ibGFja2xpc3QuaWRzLCBub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1R5cGVTZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdG9Mb3dlckNhc2Ugd2hlbiB0eXBlIHNlbGVjdG9ycyB3aWxsIGJlIG5vcm1hbGl6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB1bml2ZXJzYWwgc2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5uYW1lLmNoYXJBdChub2RlLm5hbWUubGVuZ3RoIC0gMSkgIT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2FnZURhdGEud2hpdGVsaXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlRGF0YS53aGl0ZWxpc3QudGFncyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzT3duUHJvcGVydHkuY2FsbCh1c2FnZURhdGEud2hpdGVsaXN0LnRhZ3MsIG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNhZ2VEYXRhLmJsYWNrbGlzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZURhdGEuYmxhY2tsaXN0LnRhZ3MgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbCh1c2FnZURhdGEuYmxhY2tsaXN0LnRhZ3MsIG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZSkge1xuICAgICAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzZWxlY3Rvckxpc3QuY2hpbGRyZW4uaXNFbXB0eSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNsZWFuUnVsZXNldChub2RlLCBpdGVtLCBsaXN0LCBvcHRpb25zKSB7XG4gICAgdmFyIHVzYWdlRGF0YSA9IG9wdGlvbnMudXNhZ2U7XG5cbiAgICBpZiAodXNhZ2VEYXRhICYmICh1c2FnZURhdGEud2hpdGVsaXN0ICE9PSBudWxsIHx8IHVzYWdlRGF0YS5ibGFja2xpc3QgIT09IG51bGwpKSB7XG4gICAgICAgIGNsZWFuVW51c2VkKG5vZGUucHJlbHVkZSwgdXNhZ2VEYXRhKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5wcmVsdWRlLmNoaWxkcmVuLmlzRW1wdHkoKSB8fFxuICAgICAgICBub2RlLmJsb2NrLmNoaWxkcmVuLmlzRW1wdHkoKSkge1xuICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICB9XG59O1xuIiwiLy8gQ2FuIHVucXVvdGUgYXR0cmlidXRlIGRldGVjdGlvblxuLy8gQWRvcHRlZCBpbXBsZW1lbnRhdGlvbiBvZiBNYXRoaWFzIEJ5bmVuc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvbW90aGVyZWZmLmluL2Jsb2IvbWFzdGVyL3VucXVvdGVkLWF0dHJpYnV0ZXMvZWZmLmpzXG52YXIgZXNjYXBlc1J4ID0gL1xcXFwoWzAtOUEtRmEtZl17MSw2fSkoXFxyXFxufFsgXFx0XFxuXFxmXFxyXSk/fFxcXFwuL2c7XG52YXIgYmxvY2tVbnF1b3RlUnggPSAvXigtP1xcZHwtLSl8W1xcdTAwMDAtXFx1MDAyY1xcdTAwMmVcXHUwMDJmXFx1MDAzQS1cXHUwMDQwXFx1MDA1Qi1cXHUwMDVFXFx1MDA2MFxcdTAwN0ItXFx1MDA5Zl0vO1xuXG5mdW5jdGlvbiBjYW5VbnF1b3RlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJy0nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFc2NhcGVzIGFyZSB2YWxpZCwgc28gcmVwbGFjZSB0aGVtIHdpdGggYSB2YWxpZCBub24tZW1wdHkgc3RyaW5nXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKGVzY2FwZXNSeCwgJ2EnKTtcblxuICAgIHJldHVybiAhYmxvY2tVbnF1b3RlUngudGVzdCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHZhciBhdHRyVmFsdWUgPSBub2RlLnZhbHVlO1xuXG4gICAgaWYgKCFhdHRyVmFsdWUgfHwgYXR0clZhbHVlLnR5cGUgIT09ICdTdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdW5xdW90ZWRWYWx1ZSA9IGF0dHJWYWx1ZS52YWx1ZS5yZXBsYWNlKC9eKC4pKC4qKVxcMSQvLCAnJDInKTtcbiAgICBpZiAoY2FuVW5xdW90ZSh1bnF1b3RlZFZhbHVlKSkge1xuICAgICAgICBub2RlLnZhbHVlID0ge1xuICAgICAgICAgICAgdHlwZTogJ0lkZW50aWZpZXInLFxuICAgICAgICAgICAgbG9jOiBhdHRyVmFsdWUubG9jLFxuICAgICAgICAgICAgbmFtZTogdW5xdW90ZWRWYWx1ZVxuICAgICAgICB9O1xuICAgIH1cbn07XG4iLCJmdW5jdGlvbiByZW1vdmVJdGVtQW5kUmVkdW5kYW50V2hpdGVTcGFjZShsaXN0LCBpdGVtKSB7XG4gICAgdmFyIHByZXYgPSBpdGVtLnByZXY7XG4gICAgdmFyIG5leHQgPSBpdGVtLm5leHQ7XG5cbiAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dC5kYXRhLnR5cGUgPT09ICdXaGl0ZVNwYWNlJyAmJiAocHJldiA9PT0gbnVsbCB8fCBwcmV2LmRhdGEudHlwZSA9PT0gJ1doaXRlU3BhY2UnKSkge1xuICAgICAgICAgICAgbGlzdC5yZW1vdmUobmV4dCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXYgIT09IG51bGwgJiYgcHJldi5kYXRhLnR5cGUgPT09ICdXaGl0ZVNwYWNlJykge1xuICAgICAgICBsaXN0LnJlbW92ZShwcmV2KTtcbiAgICB9XG5cbiAgICBsaXN0LnJlbW92ZShpdGVtKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wcmVzc0JvcmRlcihub2RlKSB7XG4gICAgbm9kZS5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGlmIChsaXN0LmhlYWQgPT09IGxpc3QudGFpbCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYG5vbmVgIGZvciB6ZXJvIHdoZW4gYG5vbmVgIGlzIGEgc2luZ2xlIHRlcm1cbiAgICAgICAgICAgICAgICBpdGVtLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzAnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbUFuZFJlZHVuZGFudFdoaXRlU3BhY2UobGlzdCwgaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJ2YXIgT01JVF9QTFVTU0lHTiA9IC9eKD86XFwrfCgtKSk/MCooXFxkKikoPzpcXC4wKnwoXFwuXFxkKj8pMCopPyQvO1xudmFyIEtFRVBfUExVU1NJR04gPSAvXihbXFwrXFwtXSk/MCooXFxkKikoPzpcXC4wKnwoXFwuXFxkKj8pMCopPyQvO1xudmFyIHVuc2FmZVRvUmVtb3ZlUGx1c1NpZ25BZnRlciA9IHtcbiAgICBEaW1lbnNpb246IHRydWUsXG4gICAgSGV4Q29sb3I6IHRydWUsXG4gICAgSWRlbnRpZmllcjogdHJ1ZSxcbiAgICBOdW1iZXI6IHRydWUsXG4gICAgUmF3OiB0cnVlLFxuICAgIFVuaWNvZGVSYW5nZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gcGFja051bWJlcih2YWx1ZSwgaXRlbSkge1xuICAgIC8vIG9taXQgcGx1cyBzaWduIG9ubHkgaWYgbm8gcHJldiBvciBwcmV2IGlzIHNhZmUgdHlwZVxuICAgIHZhciByZWdleHAgPSBpdGVtICYmIGl0ZW0ucHJldiAhPT0gbnVsbCAmJiB1bnNhZmVUb1JlbW92ZVBsdXNTaWduQWZ0ZXIuaGFzT3duUHJvcGVydHkoaXRlbS5wcmV2LmRhdGEudHlwZSlcbiAgICAgICAgPyBLRUVQX1BMVVNTSUdOXG4gICAgICAgIDogT01JVF9QTFVTU0lHTjtcblxuICAgIC8vIDEwMCAtPiAnMTAwJ1xuICAgIC8vIDAwMTAwIC0+ICcxMDAnXG4gICAgLy8gKzEwMCAtPiAnMTAwJyAob25seSB3aGVuIHNhZmUsIGUuZy4gb21pdHRpbmcgcGx1cyBzaWduIGZvciAxcHgrMXB4IGxlYWRzIHRvIHNpbmdsZSBkaW1lbnNpb24gaW5zdGVhZCBvZiB0d28pXG4gICAgLy8gLTEwMCAtPiAnLTEwMCdcbiAgICAvLyAwLjEyMyAtPiAnLjEyMydcbiAgICAvLyAwLjEyMzAwIC0+ICcuMTIzJ1xuICAgIC8vIDAuMCAtPiAnJ1xuICAgIC8vIDAgLT4gJydcbiAgICAvLyAtMCAtPiAnLSdcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSkucmVwbGFjZShyZWdleHAsICckMSQyJDMnKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICctJykge1xuICAgICAgICB2YWx1ZSA9ICcwJztcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obm9kZSwgaXRlbSkge1xuICAgIG5vZGUudmFsdWUgPSBwYWNrTnVtYmVyKG5vZGUudmFsdWUsIGl0ZW0pO1xufTtcbm1vZHVsZS5leHBvcnRzLnBhY2sgPSBwYWNrTnVtYmVyO1xuIiwidmFyIGxleGVyID0gcmVxdWlyZSgnY3NzLXRyZWUnKS5sZXhlcjtcbnZhciBwYWNrTnVtYmVyID0gcmVxdWlyZSgnLi9OdW1iZXInKS5wYWNrO1xuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3JcbnZhciBOQU1FX1RPX0hFWCA9IHtcbiAgICAnYWxpY2VibHVlJzogJ2YwZjhmZicsXG4gICAgJ2FudGlxdWV3aGl0ZSc6ICdmYWViZDcnLFxuICAgICdhcXVhJzogJzBmZicsXG4gICAgJ2FxdWFtYXJpbmUnOiAnN2ZmZmQ0JyxcbiAgICAnYXp1cmUnOiAnZjBmZmZmJyxcbiAgICAnYmVpZ2UnOiAnZjVmNWRjJyxcbiAgICAnYmlzcXVlJzogJ2ZmZTRjNCcsXG4gICAgJ2JsYWNrJzogJzAwMCcsXG4gICAgJ2JsYW5jaGVkYWxtb25kJzogJ2ZmZWJjZCcsXG4gICAgJ2JsdWUnOiAnMDBmJyxcbiAgICAnYmx1ZXZpb2xldCc6ICc4YTJiZTInLFxuICAgICdicm93bic6ICdhNTJhMmEnLFxuICAgICdidXJseXdvb2QnOiAnZGViODg3JyxcbiAgICAnY2FkZXRibHVlJzogJzVmOWVhMCcsXG4gICAgJ2NoYXJ0cmV1c2UnOiAnN2ZmZjAwJyxcbiAgICAnY2hvY29sYXRlJzogJ2QyNjkxZScsXG4gICAgJ2NvcmFsJzogJ2ZmN2Y1MCcsXG4gICAgJ2Nvcm5mbG93ZXJibHVlJzogJzY0OTVlZCcsXG4gICAgJ2Nvcm5zaWxrJzogJ2ZmZjhkYycsXG4gICAgJ2NyaW1zb24nOiAnZGMxNDNjJyxcbiAgICAnY3lhbic6ICcwZmYnLFxuICAgICdkYXJrYmx1ZSc6ICcwMDAwOGInLFxuICAgICdkYXJrY3lhbic6ICcwMDhiOGInLFxuICAgICdkYXJrZ29sZGVucm9kJzogJ2I4ODYwYicsXG4gICAgJ2RhcmtncmF5JzogJ2E5YTlhOScsXG4gICAgJ2RhcmtncmV5JzogJ2E5YTlhOScsXG4gICAgJ2RhcmtncmVlbic6ICcwMDY0MDAnLFxuICAgICdkYXJra2hha2knOiAnYmRiNzZiJyxcbiAgICAnZGFya21hZ2VudGEnOiAnOGIwMDhiJyxcbiAgICAnZGFya29saXZlZ3JlZW4nOiAnNTU2YjJmJyxcbiAgICAnZGFya29yYW5nZSc6ICdmZjhjMDAnLFxuICAgICdkYXJrb3JjaGlkJzogJzk5MzJjYycsXG4gICAgJ2RhcmtyZWQnOiAnOGIwMDAwJyxcbiAgICAnZGFya3NhbG1vbic6ICdlOTk2N2EnLFxuICAgICdkYXJrc2VhZ3JlZW4nOiAnOGZiYzhmJyxcbiAgICAnZGFya3NsYXRlYmx1ZSc6ICc0ODNkOGInLFxuICAgICdkYXJrc2xhdGVncmF5JzogJzJmNGY0ZicsXG4gICAgJ2RhcmtzbGF0ZWdyZXknOiAnMmY0ZjRmJyxcbiAgICAnZGFya3R1cnF1b2lzZSc6ICcwMGNlZDEnLFxuICAgICdkYXJrdmlvbGV0JzogJzk0MDBkMycsXG4gICAgJ2RlZXBwaW5rJzogJ2ZmMTQ5MycsXG4gICAgJ2RlZXBza3libHVlJzogJzAwYmZmZicsXG4gICAgJ2RpbWdyYXknOiAnNjk2OTY5JyxcbiAgICAnZGltZ3JleSc6ICc2OTY5NjknLFxuICAgICdkb2RnZXJibHVlJzogJzFlOTBmZicsXG4gICAgJ2ZpcmVicmljayc6ICdiMjIyMjInLFxuICAgICdmbG9yYWx3aGl0ZSc6ICdmZmZhZjAnLFxuICAgICdmb3Jlc3RncmVlbic6ICcyMjhiMjInLFxuICAgICdmdWNoc2lhJzogJ2YwZicsXG4gICAgJ2dhaW5zYm9ybyc6ICdkY2RjZGMnLFxuICAgICdnaG9zdHdoaXRlJzogJ2Y4ZjhmZicsXG4gICAgJ2dvbGQnOiAnZmZkNzAwJyxcbiAgICAnZ29sZGVucm9kJzogJ2RhYTUyMCcsXG4gICAgJ2dyYXknOiAnODA4MDgwJyxcbiAgICAnZ3JleSc6ICc4MDgwODAnLFxuICAgICdncmVlbic6ICcwMDgwMDAnLFxuICAgICdncmVlbnllbGxvdyc6ICdhZGZmMmYnLFxuICAgICdob25leWRldyc6ICdmMGZmZjAnLFxuICAgICdob3RwaW5rJzogJ2ZmNjliNCcsXG4gICAgJ2luZGlhbnJlZCc6ICdjZDVjNWMnLFxuICAgICdpbmRpZ28nOiAnNGIwMDgyJyxcbiAgICAnaXZvcnknOiAnZmZmZmYwJyxcbiAgICAna2hha2knOiAnZjBlNjhjJyxcbiAgICAnbGF2ZW5kZXInOiAnZTZlNmZhJyxcbiAgICAnbGF2ZW5kZXJibHVzaCc6ICdmZmYwZjUnLFxuICAgICdsYXduZ3JlZW4nOiAnN2NmYzAwJyxcbiAgICAnbGVtb25jaGlmZm9uJzogJ2ZmZmFjZCcsXG4gICAgJ2xpZ2h0Ymx1ZSc6ICdhZGQ4ZTYnLFxuICAgICdsaWdodGNvcmFsJzogJ2YwODA4MCcsXG4gICAgJ2xpZ2h0Y3lhbic6ICdlMGZmZmYnLFxuICAgICdsaWdodGdvbGRlbnJvZHllbGxvdyc6ICdmYWZhZDInLFxuICAgICdsaWdodGdyYXknOiAnZDNkM2QzJyxcbiAgICAnbGlnaHRncmV5JzogJ2QzZDNkMycsXG4gICAgJ2xpZ2h0Z3JlZW4nOiAnOTBlZTkwJyxcbiAgICAnbGlnaHRwaW5rJzogJ2ZmYjZjMScsXG4gICAgJ2xpZ2h0c2FsbW9uJzogJ2ZmYTA3YScsXG4gICAgJ2xpZ2h0c2VhZ3JlZW4nOiAnMjBiMmFhJyxcbiAgICAnbGlnaHRza3libHVlJzogJzg3Y2VmYScsXG4gICAgJ2xpZ2h0c2xhdGVncmF5JzogJzc4OScsXG4gICAgJ2xpZ2h0c2xhdGVncmV5JzogJzc4OScsXG4gICAgJ2xpZ2h0c3RlZWxibHVlJzogJ2IwYzRkZScsXG4gICAgJ2xpZ2h0eWVsbG93JzogJ2ZmZmZlMCcsXG4gICAgJ2xpbWUnOiAnMGYwJyxcbiAgICAnbGltZWdyZWVuJzogJzMyY2QzMicsXG4gICAgJ2xpbmVuJzogJ2ZhZjBlNicsXG4gICAgJ21hZ2VudGEnOiAnZjBmJyxcbiAgICAnbWFyb29uJzogJzgwMDAwMCcsXG4gICAgJ21lZGl1bWFxdWFtYXJpbmUnOiAnNjZjZGFhJyxcbiAgICAnbWVkaXVtYmx1ZSc6ICcwMDAwY2QnLFxuICAgICdtZWRpdW1vcmNoaWQnOiAnYmE1NWQzJyxcbiAgICAnbWVkaXVtcHVycGxlJzogJzkzNzBkYicsXG4gICAgJ21lZGl1bXNlYWdyZWVuJzogJzNjYjM3MScsXG4gICAgJ21lZGl1bXNsYXRlYmx1ZSc6ICc3YjY4ZWUnLFxuICAgICdtZWRpdW1zcHJpbmdncmVlbic6ICcwMGZhOWEnLFxuICAgICdtZWRpdW10dXJxdW9pc2UnOiAnNDhkMWNjJyxcbiAgICAnbWVkaXVtdmlvbGV0cmVkJzogJ2M3MTU4NScsXG4gICAgJ21pZG5pZ2h0Ymx1ZSc6ICcxOTE5NzAnLFxuICAgICdtaW50Y3JlYW0nOiAnZjVmZmZhJyxcbiAgICAnbWlzdHlyb3NlJzogJ2ZmZTRlMScsXG4gICAgJ21vY2Nhc2luJzogJ2ZmZTRiNScsXG4gICAgJ25hdmFqb3doaXRlJzogJ2ZmZGVhZCcsXG4gICAgJ25hdnknOiAnMDAwMDgwJyxcbiAgICAnb2xkbGFjZSc6ICdmZGY1ZTYnLFxuICAgICdvbGl2ZSc6ICc4MDgwMDAnLFxuICAgICdvbGl2ZWRyYWInOiAnNmI4ZTIzJyxcbiAgICAnb3JhbmdlJzogJ2ZmYTUwMCcsXG4gICAgJ29yYW5nZXJlZCc6ICdmZjQ1MDAnLFxuICAgICdvcmNoaWQnOiAnZGE3MGQ2JyxcbiAgICAncGFsZWdvbGRlbnJvZCc6ICdlZWU4YWEnLFxuICAgICdwYWxlZ3JlZW4nOiAnOThmYjk4JyxcbiAgICAncGFsZXR1cnF1b2lzZSc6ICdhZmVlZWUnLFxuICAgICdwYWxldmlvbGV0cmVkJzogJ2RiNzA5MycsXG4gICAgJ3BhcGF5YXdoaXAnOiAnZmZlZmQ1JyxcbiAgICAncGVhY2hwdWZmJzogJ2ZmZGFiOScsXG4gICAgJ3BlcnUnOiAnY2Q4NTNmJyxcbiAgICAncGluayc6ICdmZmMwY2InLFxuICAgICdwbHVtJzogJ2RkYTBkZCcsXG4gICAgJ3Bvd2RlcmJsdWUnOiAnYjBlMGU2JyxcbiAgICAncHVycGxlJzogJzgwMDA4MCcsXG4gICAgJ3JlYmVjY2FwdXJwbGUnOiAnNjM5JyxcbiAgICAncmVkJzogJ2YwMCcsXG4gICAgJ3Jvc3licm93bic6ICdiYzhmOGYnLFxuICAgICdyb3lhbGJsdWUnOiAnNDE2OWUxJyxcbiAgICAnc2FkZGxlYnJvd24nOiAnOGI0NTEzJyxcbiAgICAnc2FsbW9uJzogJ2ZhODA3MicsXG4gICAgJ3NhbmR5YnJvd24nOiAnZjRhNDYwJyxcbiAgICAnc2VhZ3JlZW4nOiAnMmU4YjU3JyxcbiAgICAnc2Vhc2hlbGwnOiAnZmZmNWVlJyxcbiAgICAnc2llbm5hJzogJ2EwNTIyZCcsXG4gICAgJ3NpbHZlcic6ICdjMGMwYzAnLFxuICAgICdza3libHVlJzogJzg3Y2VlYicsXG4gICAgJ3NsYXRlYmx1ZSc6ICc2YTVhY2QnLFxuICAgICdzbGF0ZWdyYXknOiAnNzA4MDkwJyxcbiAgICAnc2xhdGVncmV5JzogJzcwODA5MCcsXG4gICAgJ3Nub3cnOiAnZmZmYWZhJyxcbiAgICAnc3ByaW5nZ3JlZW4nOiAnMDBmZjdmJyxcbiAgICAnc3RlZWxibHVlJzogJzQ2ODJiNCcsXG4gICAgJ3Rhbic6ICdkMmI0OGMnLFxuICAgICd0ZWFsJzogJzAwODA4MCcsXG4gICAgJ3RoaXN0bGUnOiAnZDhiZmQ4JyxcbiAgICAndG9tYXRvJzogJ2ZmNjM0NycsXG4gICAgJ3R1cnF1b2lzZSc6ICc0MGUwZDAnLFxuICAgICd2aW9sZXQnOiAnZWU4MmVlJyxcbiAgICAnd2hlYXQnOiAnZjVkZWIzJyxcbiAgICAnd2hpdGUnOiAnZmZmJyxcbiAgICAnd2hpdGVzbW9rZSc6ICdmNWY1ZjUnLFxuICAgICd5ZWxsb3cnOiAnZmYwJyxcbiAgICAneWVsbG93Z3JlZW4nOiAnOWFjZDMyJ1xufTtcblxudmFyIEhFWF9UT19OQU1FID0ge1xuICAgICc4MDAwMDAnOiAnbWFyb29uJyxcbiAgICAnODAwMDgwJzogJ3B1cnBsZScsXG4gICAgJzgwODAwMCc6ICdvbGl2ZScsXG4gICAgJzgwODA4MCc6ICdncmF5JyxcbiAgICAnMDBmZmZmJzogJ2N5YW4nLFxuICAgICdmMGZmZmYnOiAnYXp1cmUnLFxuICAgICdmNWY1ZGMnOiAnYmVpZ2UnLFxuICAgICdmZmU0YzQnOiAnYmlzcXVlJyxcbiAgICAnMDAwMDAwJzogJ2JsYWNrJyxcbiAgICAnMDAwMGZmJzogJ2JsdWUnLFxuICAgICdhNTJhMmEnOiAnYnJvd24nLFxuICAgICdmZjdmNTAnOiAnY29yYWwnLFxuICAgICdmZmQ3MDAnOiAnZ29sZCcsXG4gICAgJzAwODAwMCc6ICdncmVlbicsXG4gICAgJzRiMDA4Mic6ICdpbmRpZ28nLFxuICAgICdmZmZmZjAnOiAnaXZvcnknLFxuICAgICdmMGU2OGMnOiAna2hha2knLFxuICAgICcwMGZmMDAnOiAnbGltZScsXG4gICAgJ2ZhZjBlNic6ICdsaW5lbicsXG4gICAgJzAwMDA4MCc6ICduYXZ5JyxcbiAgICAnZmZhNTAwJzogJ29yYW5nZScsXG4gICAgJ2RhNzBkNic6ICdvcmNoaWQnLFxuICAgICdjZDg1M2YnOiAncGVydScsXG4gICAgJ2ZmYzBjYic6ICdwaW5rJyxcbiAgICAnZGRhMGRkJzogJ3BsdW0nLFxuICAgICdmMDAnOiAncmVkJyxcbiAgICAnZmYwMDAwJzogJ3JlZCcsXG4gICAgJ2ZhODA3Mic6ICdzYWxtb24nLFxuICAgICdhMDUyMmQnOiAnc2llbm5hJyxcbiAgICAnYzBjMGMwJzogJ3NpbHZlcicsXG4gICAgJ2ZmZmFmYSc6ICdzbm93JyxcbiAgICAnZDJiNDhjJzogJ3RhbicsXG4gICAgJzAwODA4MCc6ICd0ZWFsJyxcbiAgICAnZmY2MzQ3JzogJ3RvbWF0bycsXG4gICAgJ2VlODJlZSc6ICd2aW9sZXQnLFxuICAgICdmNWRlYjMnOiAnd2hlYXQnLFxuICAgICdmZmZmZmYnOiAnd2hpdGUnLFxuICAgICdmZmZmMDAnOiAneWVsbG93J1xufTtcblxuZnVuY3Rpb24gaHVlVG9SZ2IocCwgcSwgdCkge1xuICAgIGlmICh0IDwgMCkge1xuICAgICAgICB0ICs9IDE7XG4gICAgfVxuICAgIGlmICh0ID4gMSkge1xuICAgICAgICB0IC09IDE7XG4gICAgfVxuICAgIGlmICh0IDwgMSAvIDYpIHtcbiAgICAgICAgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7XG4gICAgfVxuICAgIGlmICh0IDwgMSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgfVxuICAgIGlmICh0IDwgMiAvIDMpIHtcbiAgICAgICAgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gaHNsVG9SZ2IoaCwgcywgbCwgYSkge1xuICAgIHZhciByO1xuICAgIHZhciBnO1xuICAgIHZhciBiO1xuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpY1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIHAgPSAyICogbCAtIHE7XG5cbiAgICAgICAgciA9IGh1ZVRvUmdiKHAsIHEsIGggKyAxIC8gMyk7XG4gICAgICAgIGcgPSBodWVUb1JnYihwLCBxLCBoKTtcbiAgICAgICAgYiA9IGh1ZVRvUmdiKHAsIHEsIGggLSAxIC8gMyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgTWF0aC5yb3VuZChyICogMjU1KSxcbiAgICAgICAgTWF0aC5yb3VuZChnICogMjU1KSxcbiAgICAgICAgTWF0aC5yb3VuZChiICogMjU1KSxcbiAgICAgICAgYVxuICAgIF07XG59XG5cbmZ1bmN0aW9uIHRvSGV4KHZhbHVlKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMSA/ICcwJyArIHZhbHVlIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnVuY3Rpb25BcmdzKGZ1bmN0aW9uQXJncywgY291bnQsIHJnYikge1xuICAgIHZhciBjdXJzb3IgPSBmdW5jdGlvbkFyZ3MuaGVhZDtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciB3YXNWYWx1ZSA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGN1cnNvciAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbm9kZSA9IGN1cnNvci5kYXRhO1xuICAgICAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ051bWJlcic6XG4gICAgICAgICAgICBjYXNlICdQZXJjZW50YWdlJzpcbiAgICAgICAgICAgICAgICBpZiAod2FzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHdhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhcmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTnVtYmVyKG5vZGUudmFsdWUpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ09wZXJhdG9yJzpcbiAgICAgICAgICAgICAgICBpZiAobm9kZS52YWx1ZSA9PT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2FzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2FzVmFsdWUgfHwgbm9kZS52YWx1ZSAhPT0gJysnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIHdlIGNvdWxkbid0IHVuZGVyc3RhbmRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3IgPSBjdXJzb3IubmV4dDtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IGNvdW50KSB7XG4gICAgICAgIC8vIGludmFsaWQgYXJndW1lbnRzIGNvdW50XG4gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aG9zZSB0b2tlbnNcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICBpZiAoYXJnc1szXS50eXBlICE9PSAnTnVtYmVyJykge1xuICAgICAgICAgICAgLy8gNHRoIGFyZ3VtZW50IHNob3VsZCBiZSBhIG51bWJlclxuICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRob3NlIHRva2Vuc1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJnc1szXS50eXBlID0gJ0FscGhhJztcbiAgICB9XG5cbiAgICBpZiAocmdiKSB7XG4gICAgICAgIGlmIChhcmdzWzBdLnR5cGUgIT09IGFyZ3NbMV0udHlwZSB8fCBhcmdzWzBdLnR5cGUgIT09IGFyZ3NbMl0udHlwZSkge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb2xvciwgbnVtYmVycyBhbmQgcGVyY2VudGFnZSBzaG91bGRuJ3QgYmUgbWl4ZWRcbiAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aG9zZSB0b2tlbnNcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhcmdzWzBdLnR5cGUgIT09ICdOdW1iZXInIHx8XG4gICAgICAgICAgICBhcmdzWzFdLnR5cGUgIT09ICdQZXJjZW50YWdlJyB8fFxuICAgICAgICAgICAgYXJnc1syXS50eXBlICE9PSAnUGVyY2VudGFnZScpIHtcbiAgICAgICAgICAgIC8vIGludmFsaWQgY29sb3IsIGZvciBoc2wgdmFsdWVzIHNob3VsZCBiZTogbnVtYmVyLCBwZXJjZW50YWdlLCBwZXJjZW50YWdlXG4gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhvc2UgdG9rZW5zXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzWzBdLnR5cGUgPSAnQW5nbGUnO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoMCwgYXJnLnZhbHVlKTtcblxuICAgICAgICBzd2l0Y2ggKGFyZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICAgICAgICAgIC8vIGZpdCB2YWx1ZSB0byBbMC4uMjU1XSByYW5nZVxuICAgICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5taW4odmFsdWUsIDI1NSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ1BlcmNlbnRhZ2UnOlxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgMC4uMTAwJSB0byB2YWx1ZSBpbiBbMC4uMjU1XSByYW5nZVxuICAgICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5taW4odmFsdWUsIDEwMCkgLyAxMDA7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXJnYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUgPSAyNTUgKiB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnQW5nbGUnOlxuICAgICAgICAgICAgICAgIC8vIGZpdCB2YWx1ZSB0byAoLTM2MC4uMzYwKSByYW5nZVxuICAgICAgICAgICAgICAgIHJldHVybiAoKCh2YWx1ZSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDtcblxuICAgICAgICAgICAgY2FzZSAnQWxwaGEnOlxuICAgICAgICAgICAgICAgIC8vIGZpdCB2YWx1ZSB0byBbMC4uMV0gcmFuZ2VcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odmFsdWUsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wcmVzc0Z1bmN0aW9uKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICB2YXIgZnVuY3Rpb25OYW1lID0gbm9kZS5uYW1lO1xuICAgIHZhciBhcmdzO1xuXG4gICAgaWYgKGZ1bmN0aW9uTmFtZSA9PT0gJ3JnYmEnIHx8IGZ1bmN0aW9uTmFtZSA9PT0gJ2hzbGEnKSB7XG4gICAgICAgIGFyZ3MgPSBwYXJzZUZ1bmN0aW9uQXJncyhub2RlLmNoaWxkcmVuLCA0LCBmdW5jdGlvbk5hbWUgPT09ICdyZ2JhJyk7XG5cbiAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZSA9PT0gJ2hzbGEnKSB7XG4gICAgICAgICAgICBhcmdzID0gaHNsVG9SZ2IuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgICAgICBub2RlLm5hbWUgPSAncmdiYSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJnc1szXSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gdHJ5IHRvIHJlcGxhY2UgYHJnYmEoeCwgeCwgeCwgMClgIHRvIGB0cmFuc3BhcmVudGBcbiAgICAgICAgICAgIC8vIGFsd2F5cyByZXBsYWNlIGByZ2JhKDAsIDAsIDAsIDApYCB0byBgdHJhbnNwYXJlbnRgXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgYXZvaWQgcmVwbGFjZW1lbnQgaW4gZ3JhZGllbnRzIHNpbmNlIGl0IG1heSBicmVhayBjb2xvciB0cmFuc2l0aW9uXG4gICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExODI5NDEwL2NzczMtZ3JhZGllbnQtcmVuZGVyaW5nLWlzc3Vlcy1mcm9tLXRyYW5zcGFyZW50LXRvLXdoaXRlXG4gICAgICAgICAgICB2YXIgc2NvcGVGdW5jdGlvbk5hbWUgPSB0aGlzWydmdW5jdGlvbiddICYmIHRoaXNbJ2Z1bmN0aW9uJ10ubmFtZTtcbiAgICAgICAgICAgIGlmICgoYXJnc1swXSA9PT0gMCAmJiBhcmdzWzFdID09PSAwICYmIGFyZ3NbMl0gPT09IDApIHx8XG4gICAgICAgICAgICAgICAgIS9eKD86dG98ZnJvbXxjb2xvci1zdG9wKSR8Z3JhZGllbnQkL2kudGVzdChzY29wZUZ1bmN0aW9uTmFtZSkpIHtcblxuICAgICAgICAgICAgICAgIGl0ZW0uZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0lkZW50aWZpZXInLFxuICAgICAgICAgICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzWzNdICE9PSAxKSB7XG4gICAgICAgICAgICAvLyByZXBsYWNlIGFyZ3VtZW50IHZhbHVlcyBmb3Igbm9ybWFsaXplZC9pbnRlcnBvbGF0ZWRcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ09wZXJhdG9yJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS52YWx1ZSAhPT0gJywnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaXRlbS5kYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhY2tOdW1iZXIoYXJncy5zaGlmdCgpLCBudWxsKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGNvbnZlcnQgdG8gcmdiLCBpLmUuIHJnYmEoMjU1LCAwLCAwLCAxKSAtPiByZ2IoMjU1LCAwLCAwKVxuICAgICAgICBmdW5jdGlvbk5hbWUgPSAncmdiJztcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lID09PSAnaHNsJykge1xuICAgICAgICBhcmdzID0gYXJncyB8fCBwYXJzZUZ1bmN0aW9uQXJncyhub2RlLmNoaWxkcmVuLCAzLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udmVydCB0byByZ2JcbiAgICAgICAgYXJncyA9IGhzbFRvUmdiLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICBmdW5jdGlvbk5hbWUgPSAncmdiJztcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lID09PSAncmdiJykge1xuICAgICAgICBhcmdzID0gYXJncyB8fCBwYXJzZUZ1bmN0aW9uQXJncyhub2RlLmNoaWxkcmVuLCAzLCB0cnVlKTtcblxuICAgICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBjb2xvciBpcyBub3QgYXQgdGhlIGVuZCBhbmQgbm90IGZvbGxvd2VkIGJ5IHNwYWNlXG4gICAgICAgIHZhciBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICBpZiAobmV4dCAmJiBuZXh0LmRhdGEudHlwZSAhPT0gJ1doaXRlU3BhY2UnKSB7XG4gICAgICAgICAgICBsaXN0Lmluc2VydChsaXN0LmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdXaGl0ZVNwYWNlJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJyAnXG4gICAgICAgICAgICB9KSwgbmV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmRhdGEgPSB7XG4gICAgICAgICAgICB0eXBlOiAnSGV4Q29sb3InLFxuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIHZhbHVlOiB0b0hleChhcmdzWzBdKSArIHRvSGV4KGFyZ3NbMV0pICsgdG9IZXgoYXJnc1syXSlcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wcmVzc0hleChpdGVtLmRhdGEsIGl0ZW0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29tcHJlc3NJZGVudChub2RlLCBpdGVtKSB7XG4gICAgaWYgKHRoaXMuZGVjbGFyYXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjb2xvciA9IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKE5BTUVfVE9fSEVYLmhhc093blByb3BlcnR5KGNvbG9yKSAmJlxuICAgICAgICBsZXhlci5tYXRjaERlY2xhcmF0aW9uKHRoaXMuZGVjbGFyYXRpb24pLmlzVHlwZShub2RlLCAnY29sb3InKSkge1xuICAgICAgICB2YXIgaGV4ID0gTkFNRV9UT19IRVhbY29sb3JdO1xuXG4gICAgICAgIGlmIChoZXgubGVuZ3RoICsgMSA8PSBjb2xvci5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHJlcGxhY2UgZm9yIHNob3J0ZXIgaGV4IHZhbHVlXG4gICAgICAgICAgICBpdGVtLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0hleENvbG9yJyxcbiAgICAgICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBoZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGNvbnNpc3RlbnQgY29sb3JzXG4gICAgICAgICAgICBpZiAoY29sb3IgPT09ICdncmV5Jykge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gJ2dyYXknO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBqdXN0IHJlcGxhY2UgdmFsdWUgZm9yIGxvd2VyIGNhc2VkIG5hbWVcbiAgICAgICAgICAgIG5vZGUubmFtZSA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wcmVzc0hleChub2RlLCBpdGVtKSB7XG4gICAgdmFyIGNvbG9yID0gbm9kZS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gIzExMjIzMyAtPiAjMTIzXG4gICAgaWYgKGNvbG9yLmxlbmd0aCA9PT0gNiAmJlxuICAgICAgICBjb2xvclswXSA9PT0gY29sb3JbMV0gJiZcbiAgICAgICAgY29sb3JbMl0gPT09IGNvbG9yWzNdICYmXG4gICAgICAgIGNvbG9yWzRdID09PSBjb2xvcls1XSkge1xuICAgICAgICBjb2xvciA9IGNvbG9yWzBdICsgY29sb3JbMl0gKyBjb2xvcls0XTtcbiAgICB9XG5cbiAgICBpZiAoSEVYX1RPX05BTUVbY29sb3JdKSB7XG4gICAgICAgIGl0ZW0uZGF0YSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBuYW1lOiBIRVhfVE9fTkFNRVtjb2xvcl1cbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnZhbHVlID0gY29sb3I7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjb21wcmVzc0Z1bmN0aW9uOiBjb21wcmVzc0Z1bmN0aW9uLFxuICAgIGNvbXByZXNzSWRlbnQ6IGNvbXByZXNzSWRlbnQsXG4gICAgY29tcHJlc3NIZXg6IGNvbXByZXNzSGV4XG59O1xuIiwidmFyIGdlbmVyYXRlID0gcmVxdWlyZSgnY3NzLXRyZWUnKS5nZW5lcmF0ZTtcblxuZnVuY3Rpb24gSW5kZXgoKSB7XG4gICAgdGhpcy5zZWVkID0gMDtcbiAgICB0aGlzLm1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbkluZGV4LnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5tYXBbc3RyXTtcblxuICAgIGlmICghaW5kZXgpIHtcbiAgICAgICAgaW5kZXggPSArK3RoaXMuc2VlZDtcbiAgICAgICAgdGhpcy5tYXBbc3RyXSA9IGluZGV4O1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRGVjbGFyYXRpb25JbmRleGVyKCkge1xuICAgIHZhciBpZHMgPSBuZXcgSW5kZXgoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBtYXJrRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICB2YXIgaWQgPSBnZW5lcmF0ZShub2RlKTtcblxuICAgICAgICBub2RlLmlkID0gaWRzLnJlc29sdmUoaWQpO1xuICAgICAgICBub2RlLmxlbmd0aCA9IGlkLmxlbmd0aDtcbiAgICAgICAgbm9kZS5maW5nZXJwcmludCA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTtcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJ2Nzcy10cmVlJykuTGlzdDtcbnZhciByZXNvbHZlS2V5d29yZCA9IHJlcXVpcmUoJ2Nzcy10cmVlJykua2V5d29yZDtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgd2FsayA9IHJlcXVpcmUoJ2Nzcy10cmVlJykud2FsaztcblxuZnVuY3Rpb24gYWRkUnVsZVRvTWFwKG1hcCwgaXRlbSwgbGlzdCwgc2luZ2xlKSB7XG4gICAgdmFyIG5vZGUgPSBpdGVtLmRhdGE7XG4gICAgdmFyIG5hbWUgPSByZXNvbHZlS2V5d29yZChub2RlLm5hbWUpLmJhc2VuYW1lO1xuICAgIHZhciBpZCA9IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpICsgJy8nICsgKG5vZGUucHJlbHVkZSA/IG5vZGUucHJlbHVkZS5pZCA6IG51bGwpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwgbmFtZSkpIHtcbiAgICAgICAgbWFwW25hbWVdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoc2luZ2xlKSB7XG4gICAgICAgIGRlbGV0ZSBtYXBbbmFtZV1baWRdO1xuICAgIH1cblxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChtYXBbbmFtZV0sIGlkKSkge1xuICAgICAgICBtYXBbbmFtZV1baWRdID0gbmV3IExpc3QoKTtcbiAgICB9XG5cbiAgICBtYXBbbmFtZV1baWRdLmFwcGVuZChsaXN0LnJlbW92ZShpdGVtKSk7XG59XG5cbmZ1bmN0aW9uIHJlbG9jYXRlQXRydWxlcyhhc3QsIG9wdGlvbnMpIHtcbiAgICB2YXIgY29sbGVjdGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIgdG9wSW5qZWN0UG9pbnQgPSBudWxsO1xuXG4gICAgYXN0LmNoaWxkcmVuLmVhY2goZnVuY3Rpb24obm9kZSwgaXRlbSwgbGlzdCkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQXRydWxlJykge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSByZXNvbHZlS2V5d29yZChub2RlLm5hbWUpLmJhc2VuYW1lO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdrZXlmcmFtZXMnOlxuICAgICAgICAgICAgICAgICAgICBhZGRSdWxlVG9NYXAoY29sbGVjdGVkLCBpdGVtLCBsaXN0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWEnOlxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JjZU1lZGlhTWVyZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJ1bGVUb01hcChjb2xsZWN0ZWQsIGl0ZW0sIGxpc3QsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRvcEluamVjdFBvaW50ID09PSBudWxsICYmXG4gICAgICAgICAgICAgICAgbmFtZSAhPT0gJ2NoYXJzZXQnICYmXG4gICAgICAgICAgICAgICAgbmFtZSAhPT0gJ2ltcG9ydCcpIHtcbiAgICAgICAgICAgICAgICB0b3BJbmplY3RQb2ludCA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodG9wSW5qZWN0UG9pbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0b3BJbmplY3RQb2ludCA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAodmFyIGF0cnVsZSBpbiBjb2xsZWN0ZWQpIHtcbiAgICAgICAgZm9yICh2YXIgaWQgaW4gY29sbGVjdGVkW2F0cnVsZV0pIHtcbiAgICAgICAgICAgIGFzdC5jaGlsZHJlbi5pbnNlcnRMaXN0KFxuICAgICAgICAgICAgICAgIGNvbGxlY3RlZFthdHJ1bGVdW2lkXSxcbiAgICAgICAgICAgICAgICBhdHJ1bGUgPT09ICdtZWRpYScgPyBudWxsIDogdG9wSW5qZWN0UG9pbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBpc01lZGlhUnVsZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0F0cnVsZScgJiYgbm9kZS5uYW1lID09PSAnbWVkaWEnO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQXRydWxlKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICBpZiAoIWlzTWVkaWFSdWxlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJldiA9IGl0ZW0ucHJldiAmJiBpdGVtLnByZXYuZGF0YTtcblxuICAgIGlmICghcHJldiB8fCAhaXNNZWRpYVJ1bGUocHJldikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG1lcmdlIEBtZWRpYSB3aXRoIHNhbWUgcXVlcnlcbiAgICBpZiAobm9kZS5wcmVsdWRlICYmXG4gICAgICAgIHByZXYucHJlbHVkZSAmJlxuICAgICAgICBub2RlLnByZWx1ZGUuaWQgPT09IHByZXYucHJlbHVkZS5pZCkge1xuICAgICAgICBwcmV2LmJsb2NrLmNoaWxkcmVuLmFwcGVuZExpc3Qobm9kZS5ibG9jay5jaGlsZHJlbik7XG4gICAgICAgIGxpc3QucmVtb3ZlKGl0ZW0pO1xuXG4gICAgICAgIC8vIFRPRE86IHVzZSBpdCB3aGVuIHdlIGNhbiByZWZlciB0byBzZXZlcmFsIHBvaW50cyBpbiBzb3VyY2VcbiAgICAgICAgLy8gcHJldi5sb2MgPSB7XG4gICAgICAgIC8vICAgICBwcmltYXJ5OiBwcmV2LmxvYyxcbiAgICAgICAgLy8gICAgIG1lcmdlZDogbm9kZS5sb2NcbiAgICAgICAgLy8gfTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVqb2luQXRydWxlKGFzdCwgb3B0aW9ucykge1xuICAgIHJlbG9jYXRlQXRydWxlcyhhc3QsIG9wdGlvbnMpO1xuXG4gICAgd2Fsayhhc3QsIHtcbiAgICAgICAgdmlzaXQ6ICdBdHJ1bGUnLFxuICAgICAgICByZXZlcnNlOiB0cnVlLFxuICAgICAgICBlbnRlcjogcHJvY2Vzc0F0cnVsZVxuICAgIH0pO1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGlzRXF1YWxTZWxlY3RvcnMoYSwgYikge1xuICAgIHZhciBjdXJzb3IxID0gYS5oZWFkO1xuICAgIHZhciBjdXJzb3IyID0gYi5oZWFkO1xuXG4gICAgd2hpbGUgKGN1cnNvcjEgIT09IG51bGwgJiYgY3Vyc29yMiAhPT0gbnVsbCAmJiBjdXJzb3IxLmRhdGEuaWQgPT09IGN1cnNvcjIuZGF0YS5pZCkge1xuICAgICAgICBjdXJzb3IxID0gY3Vyc29yMS5uZXh0O1xuICAgICAgICBjdXJzb3IyID0gY3Vyc29yMi5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjdXJzb3IxID09PSBudWxsICYmIGN1cnNvcjIgPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzRXF1YWxEZWNsYXJhdGlvbnMoYSwgYikge1xuICAgIHZhciBjdXJzb3IxID0gYS5oZWFkO1xuICAgIHZhciBjdXJzb3IyID0gYi5oZWFkO1xuXG4gICAgd2hpbGUgKGN1cnNvcjEgIT09IG51bGwgJiYgY3Vyc29yMiAhPT0gbnVsbCAmJiBjdXJzb3IxLmRhdGEuaWQgPT09IGN1cnNvcjIuZGF0YS5pZCkge1xuICAgICAgICBjdXJzb3IxID0gY3Vyc29yMS5uZXh0O1xuICAgICAgICBjdXJzb3IyID0gY3Vyc29yMi5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjdXJzb3IxID09PSBudWxsICYmIGN1cnNvcjIgPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVEZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zMSwgZGVjbGFyYXRpb25zMikge1xuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIGVxOiBbXSxcbiAgICAgICAgbmUxOiBbXSxcbiAgICAgICAgbmUyOiBbXSxcbiAgICAgICAgbmUyb3ZlcnJpZGVkOiBbXVxuICAgIH07XG5cbiAgICB2YXIgZmluZ2VycHJpbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIgZGVjbGFyYXRpb25zMmhhc2ggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgZm9yICh2YXIgY3Vyc29yID0gZGVjbGFyYXRpb25zMi5oZWFkOyBjdXJzb3I7IGN1cnNvciA9IGN1cnNvci5uZXh0KSAge1xuICAgICAgICBkZWNsYXJhdGlvbnMyaGFzaFtjdXJzb3IuZGF0YS5pZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGN1cnNvciA9IGRlY2xhcmF0aW9uczEuaGVhZDsgY3Vyc29yOyBjdXJzb3IgPSBjdXJzb3IubmV4dCkgIHtcbiAgICAgICAgdmFyIGRhdGEgPSBjdXJzb3IuZGF0YTtcblxuICAgICAgICBpZiAoZGF0YS5maW5nZXJwcmludCkge1xuICAgICAgICAgICAgZmluZ2VycHJpbnRzW2RhdGEuZmluZ2VycHJpbnRdID0gZGF0YS5pbXBvcnRhbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVjbGFyYXRpb25zMmhhc2hbZGF0YS5pZF0pIHtcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uczJoYXNoW2RhdGEuaWRdID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQuZXEucHVzaChkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5uZTEucHVzaChkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGN1cnNvciA9IGRlY2xhcmF0aW9uczIuaGVhZDsgY3Vyc29yOyBjdXJzb3IgPSBjdXJzb3IubmV4dCkgIHtcbiAgICAgICAgdmFyIGRhdGEgPSBjdXJzb3IuZGF0YTtcblxuICAgICAgICBpZiAoZGVjbGFyYXRpb25zMmhhc2hbZGF0YS5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIGRlY2xhcmF0aW9uczEgaGFzIG92ZXJyaWRpbmcgZGVjbGFyYXRpb24sIHRoaXMgaXMgbm90IGEgZGlmZmVyZW5jZVxuICAgICAgICAgICAgLy8gYnV0IHRha2UgaW4gYWNjb3VudCAhaW1wb3J0YW50IC0gcHJldiBzaG91bGQgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGZvbGxvd1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoZmluZ2VycHJpbnRzLCBkYXRhLmZpbmdlcnByaW50KSAmJlxuICAgICAgICAgICAgICAgIE51bWJlcihmaW5nZXJwcmludHNbZGF0YS5maW5nZXJwcmludF0pID49IE51bWJlcihkYXRhLmltcG9ydGFudCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQubmUyb3ZlcnJpZGVkLnB1c2goZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5uZTIucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFkZFNlbGVjdG9ycyhkZXN0LCBzb3VyY2UpIHtcbiAgICBzb3VyY2UuZWFjaChmdW5jdGlvbihzb3VyY2VEYXRhKSB7XG4gICAgICAgIHZhciBuZXdTdHIgPSBzb3VyY2VEYXRhLmlkO1xuICAgICAgICB2YXIgY3Vyc29yID0gZGVzdC5oZWFkO1xuXG4gICAgICAgIHdoaWxlIChjdXJzb3IpIHtcbiAgICAgICAgICAgIHZhciBuZXh0U3RyID0gY3Vyc29yLmRhdGEuaWQ7XG5cbiAgICAgICAgICAgIGlmIChuZXh0U3RyID09PSBuZXdTdHIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXh0U3RyID4gbmV3U3RyKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzdC5pbnNlcnQoZGVzdC5jcmVhdGVJdGVtKHNvdXJjZURhdGEpLCBjdXJzb3IpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbi8vIGNoZWNrIGlmIHNpbXBsZXNlbGVjdG9ycyBoYXMgbm8gZXF1YWwgc3BlY2lmaWNpdHkgYW5kIGVsZW1lbnQgc2VsZWN0b3JcbmZ1bmN0aW9uIGhhc1NpbWlsYXJTZWxlY3RvcnMoc2VsZWN0b3JzMSwgc2VsZWN0b3JzMikge1xuICAgIHZhciBjdXJzb3IxID0gc2VsZWN0b3JzMS5oZWFkO1xuXG4gICAgd2hpbGUgKGN1cnNvcjEgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGN1cnNvcjIgPSBzZWxlY3RvcnMyLmhlYWQ7XG5cbiAgICAgICAgd2hpbGUgKGN1cnNvcjIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdXJzb3IxLmRhdGEuY29tcGFyZU1hcmtlciA9PT0gY3Vyc29yMi5kYXRhLmNvbXBhcmVNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3Vyc29yMiA9IGN1cnNvcjIubmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvcjEgPSBjdXJzb3IxLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyB0ZXN0IG5vZGUgY2FuJ3QgdG8gYmUgc2tpcHBlZFxuZnVuY3Rpb24gdW5zYWZlVG9Ta2lwTm9kZShub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnUnVsZSc6XG4gICAgICAgICAgICAvLyB1bnNhZmUgc2tpcCBydWxlc2V0IHdpdGggc2VsZWN0b3Igc2ltaWxhcml0aWVzXG4gICAgICAgICAgICByZXR1cm4gaGFzU2ltaWxhclNlbGVjdG9ycyhub2RlLnByZWx1ZGUuY2hpbGRyZW4sIHRoaXMpO1xuXG4gICAgICAgIGNhc2UgJ0F0cnVsZSc6XG4gICAgICAgICAgICAvLyBjYW4gc2tpcCBhdC1ydWxlcyB3aXRoIGJsb2Nrc1xuICAgICAgICAgICAgaWYgKG5vZGUuYmxvY2spIHtcbiAgICAgICAgICAgICAgICAvLyB1bnNhZmUgc2tpcCBhdC1ydWxlIGlmIGJsb2NrIGNvbnRhaW5zIHNvbWV0aGluZyB1bnNhZmUgdG8gc2tpcFxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmJsb2NrLmNoaWxkcmVuLnNvbWUodW5zYWZlVG9Ta2lwTm9kZSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdEZWNsYXJhdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gdW5zYWZlIGJ5IGRlZmF1bHRcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaXNFcXVhbFNlbGVjdG9yczogaXNFcXVhbFNlbGVjdG9ycyxcbiAgICBpc0VxdWFsRGVjbGFyYXRpb25zOiBpc0VxdWFsRGVjbGFyYXRpb25zLFxuICAgIGNvbXBhcmVEZWNsYXJhdGlvbnM6IGNvbXBhcmVEZWNsYXJhdGlvbnMsXG4gICAgYWRkU2VsZWN0b3JzOiBhZGRTZWxlY3RvcnMsXG4gICAgaGFzU2ltaWxhclNlbGVjdG9yczogaGFzU2ltaWxhclNlbGVjdG9ycyxcbiAgICB1bnNhZmVUb1NraXBOb2RlOiB1bnNhZmVUb1NraXBOb2RlXG59O1xuIiwidmFyIHdhbGsgPSByZXF1aXJlKCdjc3MtdHJlZScpLndhbGs7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIHByb2Nlc3NSdWxlKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gbm9kZS5wcmVsdWRlLmNoaWxkcmVuO1xuICAgIHZhciBkZWNsYXJhdGlvbnMgPSBub2RlLmJsb2NrLmNoaWxkcmVuO1xuXG4gICAgbGlzdC5wcmV2VW50aWwoaXRlbS5wcmV2LCBmdW5jdGlvbihwcmV2KSB7XG4gICAgICAgIC8vIHNraXAgbm9uLXJ1bGVzZXQgbm9kZSBpZiBzYWZlXG4gICAgICAgIGlmIChwcmV2LnR5cGUgIT09ICdSdWxlJykge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnVuc2FmZVRvU2tpcE5vZGUuY2FsbChzZWxlY3RvcnMsIHByZXYpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByZXZTZWxlY3RvcnMgPSBwcmV2LnByZWx1ZGUuY2hpbGRyZW47XG4gICAgICAgIHZhciBwcmV2RGVjbGFyYXRpb25zID0gcHJldi5ibG9jay5jaGlsZHJlbjtcblxuICAgICAgICAvLyB0cnkgdG8gam9pbiBydWxlc2V0cyB3aXRoIGVxdWFsIHBzZXVkbyBzaWduYXR1cmVcbiAgICAgICAgaWYgKG5vZGUucHNldWRvU2lnbmF0dXJlID09PSBwcmV2LnBzZXVkb1NpZ25hdHVyZSkge1xuICAgICAgICAgICAgLy8gdHJ5IHRvIGpvaW4gYnkgc2VsZWN0b3JzXG4gICAgICAgICAgICBpZiAodXRpbHMuaXNFcXVhbFNlbGVjdG9ycyhwcmV2U2VsZWN0b3JzLCBzZWxlY3RvcnMpKSB7XG4gICAgICAgICAgICAgICAgcHJldkRlY2xhcmF0aW9ucy5hcHBlbmRMaXN0KGRlY2xhcmF0aW9ucyk7XG4gICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRyeSB0byBqb2luIGJ5IGRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgaWYgKHV0aWxzLmlzRXF1YWxEZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBwcmV2RGVjbGFyYXRpb25zKSkge1xuICAgICAgICAgICAgICAgIHV0aWxzLmFkZFNlbGVjdG9ycyhwcmV2U2VsZWN0b3JzLCBzZWxlY3RvcnMpO1xuICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGl0ZW0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ28gdG8gcHJldiBydWxlc2V0IGlmIGhhcyBubyBzZWxlY3RvciBzaW1pbGFyaXRpZXNcbiAgICAgICAgcmV0dXJuIHV0aWxzLmhhc1NpbWlsYXJTZWxlY3RvcnMoc2VsZWN0b3JzLCBwcmV2U2VsZWN0b3JzKTtcbiAgICB9KTtcbn1cblxuLy8gTk9URTogZGlyZWN0aW9uIHNob3VsZCBiZSBsZWZ0IHRvIHJpZ2h0LCBzaW5jZSBydWxlc2V0cyBtZXJnZSB0byBsZWZ0XG4vLyBydWxlc2V0LiBXaGVuIGRpcmVjdGlvbiByaWdodCB0byBsZWZ0IHVubWVyZ2VkIHJ1bGVzZXRzIG1heSBwcmV2ZW50IGxvb2t1cFxuLy8gVE9ETzogcmVtb3ZlIGluaXRpYWwgbWVyZ2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5pdGlhbE1lcmdlUnVsZShhc3QpIHtcbiAgICB3YWxrKGFzdCwge1xuICAgICAgICB2aXNpdDogJ1J1bGUnLFxuICAgICAgICBlbnRlcjogcHJvY2Vzc1J1bGVcbiAgICB9KTtcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJ2Nzcy10cmVlJykuTGlzdDtcbnZhciB3YWxrID0gcmVxdWlyZSgnY3NzLXRyZWUnKS53YWxrO1xuXG5mdW5jdGlvbiBwcm9jZXNzUnVsZShub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IG5vZGUucHJlbHVkZS5jaGlsZHJlbjtcblxuICAgIC8vIGdlbmVyYXRlIG5ldyBydWxlIHNldHM6XG4gICAgLy8gLmEsIC5iIHsgY29sb3I6IHJlZDsgfVxuICAgIC8vIC0+XG4gICAgLy8gLmEgeyBjb2xvcjogcmVkOyB9XG4gICAgLy8gLmIgeyBjb2xvcjogcmVkOyB9XG5cbiAgICAvLyB3aGlsZSB0aGVyZSBhcmUgbW9yZSB0aGFuIDEgc2ltcGxlIHNlbGVjdG9yIHNwbGl0IGZvciBydWxlc2V0c1xuICAgIHdoaWxlIChzZWxlY3RvcnMuaGVhZCAhPT0gc2VsZWN0b3JzLnRhaWwpIHtcbiAgICAgICAgdmFyIG5ld1NlbGVjdG9ycyA9IG5ldyBMaXN0KCk7XG4gICAgICAgIG5ld1NlbGVjdG9ycy5pbnNlcnQoc2VsZWN0b3JzLnJlbW92ZShzZWxlY3RvcnMuaGVhZCkpO1xuXG4gICAgICAgIGxpc3QuaW5zZXJ0KGxpc3QuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICB0eXBlOiAnUnVsZScsXG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgcHJlbHVkZToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTZWxlY3Rvckxpc3QnLFxuICAgICAgICAgICAgICAgIGxvYzogbm9kZS5wcmVsdWRlLmxvYyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogbmV3U2VsZWN0b3JzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQmxvY2snLFxuICAgICAgICAgICAgICAgIGxvYzogbm9kZS5ibG9jay5sb2MsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IG5vZGUuYmxvY2suY2hpbGRyZW4uY29weSgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHNldWRvU2lnbmF0dXJlOiBub2RlLnBzZXVkb1NpZ25hdHVyZVxuICAgICAgICB9KSwgaXRlbSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpc2pvaW5SdWxlKGFzdCkge1xuICAgIHdhbGsoYXN0LCB7XG4gICAgICAgIHZpc2l0OiAnUnVsZScsXG4gICAgICAgIHJldmVyc2U6IHRydWUsXG4gICAgICAgIGVudGVyOiBwcm9jZXNzUnVsZVxuICAgIH0pO1xufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnY3NzLXRyZWUnKS5MaXN0O1xudmFyIGdlbmVyYXRlID0gcmVxdWlyZSgnY3NzLXRyZWUnKS5nZW5lcmF0ZTtcbnZhciB3YWxrID0gcmVxdWlyZSgnY3NzLXRyZWUnKS53YWxrO1xuXG52YXIgUkVQTEFDRSA9IDE7XG52YXIgUkVNT1ZFID0gMjtcbnZhciBUT1AgPSAwO1xudmFyIFJJR0hUID0gMTtcbnZhciBCT1RUT00gPSAyO1xudmFyIExFRlQgPSAzO1xudmFyIFNJREVTID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcbnZhciBTSURFID0ge1xuICAgICdtYXJnaW4tdG9wJzogJ3RvcCcsXG4gICAgJ21hcmdpbi1yaWdodCc6ICdyaWdodCcsXG4gICAgJ21hcmdpbi1ib3R0b20nOiAnYm90dG9tJyxcbiAgICAnbWFyZ2luLWxlZnQnOiAnbGVmdCcsXG5cbiAgICAncGFkZGluZy10b3AnOiAndG9wJyxcbiAgICAncGFkZGluZy1yaWdodCc6ICdyaWdodCcsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogJ2JvdHRvbScsXG4gICAgJ3BhZGRpbmctbGVmdCc6ICdsZWZ0JyxcblxuICAgICdib3JkZXItdG9wLWNvbG9yJzogJ3RvcCcsXG4gICAgJ2JvcmRlci1yaWdodC1jb2xvcic6ICdyaWdodCcsXG4gICAgJ2JvcmRlci1ib3R0b20tY29sb3InOiAnYm90dG9tJyxcbiAgICAnYm9yZGVyLWxlZnQtY29sb3InOiAnbGVmdCcsXG4gICAgJ2JvcmRlci10b3Atd2lkdGgnOiAndG9wJyxcbiAgICAnYm9yZGVyLXJpZ2h0LXdpZHRoJzogJ3JpZ2h0JyxcbiAgICAnYm9yZGVyLWJvdHRvbS13aWR0aCc6ICdib3R0b20nLFxuICAgICdib3JkZXItbGVmdC13aWR0aCc6ICdsZWZ0JyxcbiAgICAnYm9yZGVyLXRvcC1zdHlsZSc6ICd0b3AnLFxuICAgICdib3JkZXItcmlnaHQtc3R5bGUnOiAncmlnaHQnLFxuICAgICdib3JkZXItYm90dG9tLXN0eWxlJzogJ2JvdHRvbScsXG4gICAgJ2JvcmRlci1sZWZ0LXN0eWxlJzogJ2xlZnQnXG59O1xudmFyIE1BSU5fUFJPUEVSVFkgPSB7XG4gICAgJ21hcmdpbic6ICdtYXJnaW4nLFxuICAgICdtYXJnaW4tdG9wJzogJ21hcmdpbicsXG4gICAgJ21hcmdpbi1yaWdodCc6ICdtYXJnaW4nLFxuICAgICdtYXJnaW4tYm90dG9tJzogJ21hcmdpbicsXG4gICAgJ21hcmdpbi1sZWZ0JzogJ21hcmdpbicsXG5cbiAgICAncGFkZGluZyc6ICdwYWRkaW5nJyxcbiAgICAncGFkZGluZy10b3AnOiAncGFkZGluZycsXG4gICAgJ3BhZGRpbmctcmlnaHQnOiAncGFkZGluZycsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogJ3BhZGRpbmcnLFxuICAgICdwYWRkaW5nLWxlZnQnOiAncGFkZGluZycsXG5cbiAgICAnYm9yZGVyLWNvbG9yJzogJ2JvcmRlci1jb2xvcicsXG4gICAgJ2JvcmRlci10b3AtY29sb3InOiAnYm9yZGVyLWNvbG9yJyxcbiAgICAnYm9yZGVyLXJpZ2h0LWNvbG9yJzogJ2JvcmRlci1jb2xvcicsXG4gICAgJ2JvcmRlci1ib3R0b20tY29sb3InOiAnYm9yZGVyLWNvbG9yJyxcbiAgICAnYm9yZGVyLWxlZnQtY29sb3InOiAnYm9yZGVyLWNvbG9yJyxcbiAgICAnYm9yZGVyLXdpZHRoJzogJ2JvcmRlci13aWR0aCcsXG4gICAgJ2JvcmRlci10b3Atd2lkdGgnOiAnYm9yZGVyLXdpZHRoJyxcbiAgICAnYm9yZGVyLXJpZ2h0LXdpZHRoJzogJ2JvcmRlci13aWR0aCcsXG4gICAgJ2JvcmRlci1ib3R0b20td2lkdGgnOiAnYm9yZGVyLXdpZHRoJyxcbiAgICAnYm9yZGVyLWxlZnQtd2lkdGgnOiAnYm9yZGVyLXdpZHRoJyxcbiAgICAnYm9yZGVyLXN0eWxlJzogJ2JvcmRlci1zdHlsZScsXG4gICAgJ2JvcmRlci10b3Atc3R5bGUnOiAnYm9yZGVyLXN0eWxlJyxcbiAgICAnYm9yZGVyLXJpZ2h0LXN0eWxlJzogJ2JvcmRlci1zdHlsZScsXG4gICAgJ2JvcmRlci1ib3R0b20tc3R5bGUnOiAnYm9yZGVyLXN0eWxlJyxcbiAgICAnYm9yZGVyLWxlZnQtc3R5bGUnOiAnYm9yZGVyLXN0eWxlJ1xufTtcblxuZnVuY3Rpb24gVFJCTChuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmxvYyA9IG51bGw7XG4gICAgdGhpcy5pZWhhY2sgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zaWRlcyA9IHtcbiAgICAgICAgJ3RvcCc6IG51bGwsXG4gICAgICAgICdyaWdodCc6IG51bGwsXG4gICAgICAgICdib3R0b20nOiBudWxsLFxuICAgICAgICAnbGVmdCc6IG51bGxcbiAgICB9O1xufVxuXG5UUkJMLnByb3RvdHlwZS5nZXRWYWx1ZVNlcXVlbmNlID0gZnVuY3Rpb24oZGVjbGFyYXRpb24sIGNvdW50KSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBpZWhhY2sgPSAnJztcbiAgICB2YXIgaGFzQmFkVmFsdWVzID0gZGVjbGFyYXRpb24udmFsdWUuY2hpbGRyZW4uc29tZShmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICB2YXIgc3BlY2lhbCA9IGZhbHNlO1xuXG4gICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFwwJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFxcXDknOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWVoYWNrID0gY2hpbGQubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdpbmhlcml0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdGlhbCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vuc2V0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmV2ZXJ0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSBjaGlsZC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdEaW1lbnNpb24nOlxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc3VwcG9ydGVkIHVudGlsIElFMTFcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVtJzpcblxuICAgICAgICAgICAgICAgICAgICAvLyB2KiB1bml0cyBpcyB0b28gYnVnZ3kgYWNyb3NzIGJyb3dzZXJzIGFuZCBiZXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgbWVyZ2UgdmFsdWVzIHdpdGggdGhvc2UgdW5pdHNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndncnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd2aCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZtaW4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd2bWF4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndm0nOiAvLyBJRTkgc3VwcG9ydGluZyBcInZtXCIgaW5zdGVhZCBvZiBcInZtaW5cIi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSBjaGlsZC51bml0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdIZXhDb2xvcic6IC8vIGNvbG9yXG4gICAgICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICAgICAgY2FzZSAnUGVyY2VudGFnZSc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICBzcGVjaWFsID0gY2hpbGQubmFtZTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnV2hpdGVTcGFjZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBpZ25vcmUgc3BhY2VcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIGJhZCB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWVzLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgICBzcGVjaWFsOiBzcGVjaWFsLFxuICAgICAgICAgICAgaW1wb3J0YW50OiBkZWNsYXJhdGlvbi5pbXBvcnRhbnRcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoaGFzQmFkVmFsdWVzIHx8IHZhbHVlcy5sZW5ndGggPiBjb3VudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmllaGFjayA9PT0gJ3N0cmluZycgJiYgdGhpcy5pZWhhY2sgIT09IGllaGFjaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pZWhhY2sgPSBpZWhhY2s7IC8vIG1vdmUgb3V0c2lkZVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cblRSQkwucHJvdG90eXBlLmNhbk92ZXJyaWRlID0gZnVuY3Rpb24oc2lkZSwgdmFsdWUpIHtcbiAgICB2YXIgY3VycmVudFZhbHVlID0gdGhpcy5zaWRlc1tzaWRlXTtcblxuICAgIHJldHVybiAhY3VycmVudFZhbHVlIHx8ICh2YWx1ZS5pbXBvcnRhbnQgJiYgIWN1cnJlbnRWYWx1ZS5pbXBvcnRhbnQpO1xufTtcblxuVFJCTC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24obmFtZSwgZGVjbGFyYXRpb24pIHtcbiAgICBmdW5jdGlvbiBhdHRlbXB0VG9BZGQoKSB7XG4gICAgICAgIHZhciBzaWRlcyA9IHRoaXMuc2lkZXM7XG4gICAgICAgIHZhciBzaWRlID0gU0lERVtuYW1lXTtcblxuICAgICAgICBpZiAoc2lkZSkge1xuICAgICAgICAgICAgaWYgKHNpZGUgaW4gc2lkZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZVNlcXVlbmNlKGRlY2xhcmF0aW9uLCAxKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZXMgfHwgIXZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbiBtaXggb25seSBpZiBzcGVjaWFscyBhcmUgZXF1YWxcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzaWRlcykge1xuICAgICAgICAgICAgICAgIGlmIChzaWRlc1trZXldICE9PSBudWxsICYmIHNpZGVzW2tleV0uc3BlY2lhbCAhPT0gdmFsdWVzWzBdLnNwZWNpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhbk92ZXJyaWRlKHNpZGUsIHZhbHVlc1swXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2lkZXNbc2lkZV0gPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFZhbHVlU2VxdWVuY2UoZGVjbGFyYXRpb24sIDQpO1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlcyB8fCAhdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbUklHSFRdID0gdmFsdWVzW1RPUF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tCT1RUT01dID0gdmFsdWVzW1RPUF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tMRUZUXSA9IHZhbHVlc1tUT1BdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW0JPVFRPTV0gPSB2YWx1ZXNbVE9QXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW0xFRlRdID0gdmFsdWVzW1JJR0hUXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tMRUZUXSA9IHZhbHVlc1tSSUdIVF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYW4gbWl4IG9ubHkgaWYgc3BlY2lhbHMgYXJlIGVxdWFsXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzaWRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZXNba2V5XSAhPT0gbnVsbCAmJiBzaWRlc1trZXldLnNwZWNpYWwgIT09IHZhbHVlc1tpXS5zcGVjaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuT3ZlcnJpZGUoU0lERVNbaV0sIHZhbHVlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2lkZXNbU0lERVNbaV1dID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF0dGVtcHRUb0FkZC5jYWxsKHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiB1c2UgaXQgd2hlbiB3ZSBjYW4gcmVmZXIgdG8gc2V2ZXJhbCBwb2ludHMgaW4gc291cmNlXG4gICAgLy8gaWYgKHRoaXMubG9jKSB7XG4gICAgLy8gICAgIHRoaXMubG9jID0ge1xuICAgIC8vICAgICAgICAgcHJpbWFyeTogdGhpcy5sb2MsXG4gICAgLy8gICAgICAgICBtZXJnZWQ6IGRlY2xhcmF0aW9uLmxvY1xuICAgIC8vICAgICB9O1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICAgIHRoaXMubG9jID0gZGVjbGFyYXRpb24ubG9jO1xuICAgIC8vIH1cbiAgICBpZiAoIXRoaXMubG9jKSB7XG4gICAgICAgIHRoaXMubG9jID0gZGVjbGFyYXRpb24ubG9jO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufTtcblxuVFJCTC5wcm90b3R5cGUuaXNPa1RvTWluaW1pemUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9wID0gdGhpcy5zaWRlcy50b3A7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5zaWRlcy5yaWdodDtcbiAgICB2YXIgYm90dG9tID0gdGhpcy5zaWRlcy5ib3R0b207XG4gICAgdmFyIGxlZnQgPSB0aGlzLnNpZGVzLmxlZnQ7XG5cbiAgICBpZiAodG9wICYmIHJpZ2h0ICYmIGJvdHRvbSAmJiBsZWZ0KSB7XG4gICAgICAgIHZhciBpbXBvcnRhbnQgPVxuICAgICAgICAgICAgdG9wLmltcG9ydGFudCArXG4gICAgICAgICAgICByaWdodC5pbXBvcnRhbnQgK1xuICAgICAgICAgICAgYm90dG9tLmltcG9ydGFudCArXG4gICAgICAgICAgICBsZWZ0LmltcG9ydGFudDtcblxuICAgICAgICByZXR1cm4gaW1wb3J0YW50ID09PSAwIHx8IGltcG9ydGFudCA9PT0gNDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5UUkJMLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSBuZXcgTGlzdCgpO1xuICAgIHZhciBzaWRlcyA9IHRoaXMuc2lkZXM7XG4gICAgdmFyIHZhbHVlcyA9IFtcbiAgICAgICAgc2lkZXMudG9wLFxuICAgICAgICBzaWRlcy5yaWdodCxcbiAgICAgICAgc2lkZXMuYm90dG9tLFxuICAgICAgICBzaWRlcy5sZWZ0XG4gICAgXTtcbiAgICB2YXIgc3RyaW5nVmFsdWVzID0gW1xuICAgICAgICBnZW5lcmF0ZShzaWRlcy50b3Aubm9kZSksXG4gICAgICAgIGdlbmVyYXRlKHNpZGVzLnJpZ2h0Lm5vZGUpLFxuICAgICAgICBnZW5lcmF0ZShzaWRlcy5ib3R0b20ubm9kZSksXG4gICAgICAgIGdlbmVyYXRlKHNpZGVzLmxlZnQubm9kZSlcbiAgICBdO1xuXG4gICAgaWYgKHN0cmluZ1ZhbHVlc1tMRUZUXSA9PT0gc3RyaW5nVmFsdWVzW1JJR0hUXSkge1xuICAgICAgICB2YWx1ZXMucG9wKCk7XG4gICAgICAgIGlmIChzdHJpbmdWYWx1ZXNbQk9UVE9NXSA9PT0gc3RyaW5nVmFsdWVzW1RPUF0pIHtcbiAgICAgICAgICAgIHZhbHVlcy5wb3AoKTtcbiAgICAgICAgICAgIGlmIChzdHJpbmdWYWx1ZXNbUklHSFRdID09PSBzdHJpbmdWYWx1ZXNbVE9QXSkge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICByZXN1bHQuYXBwZW5kRGF0YSh7IHR5cGU6ICdXaGl0ZVNwYWNlJywgdmFsdWU6ICcgJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5hcHBlbmREYXRhKHZhbHVlc1tpXS5ub2RlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pZWhhY2spIHtcbiAgICAgICAgcmVzdWx0LmFwcGVuZERhdGEoeyB0eXBlOiAnV2hpdGVTcGFjZScsIHZhbHVlOiAnICcgfSk7XG4gICAgICAgIHJlc3VsdC5hcHBlbmREYXRhKHtcbiAgICAgICAgICAgIHR5cGU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuaWVoYWNrXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdWYWx1ZScsXG4gICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgY2hpbGRyZW46IHJlc3VsdFxuICAgIH07XG59O1xuXG5UUkJMLnByb3RvdHlwZS5nZXREZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdEZWNsYXJhdGlvbicsXG4gICAgICAgIGxvYzogdGhpcy5sb2MsXG4gICAgICAgIGltcG9ydGFudDogdGhpcy5zaWRlcy50b3AuaW1wb3J0YW50LFxuICAgICAgICBwcm9wZXJ0eTogdGhpcy5uYW1lLFxuICAgICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZSgpXG4gICAgfTtcbn07XG5cbmZ1bmN0aW9uIHByb2Nlc3NSdWxlKHJ1bGUsIHNob3J0cywgc2hvcnREZWNsYXJhdGlvbnMsIGxhc3RTaG9ydFNlbGVjdG9yKSB7XG4gICAgdmFyIGRlY2xhcmF0aW9ucyA9IHJ1bGUuYmxvY2suY2hpbGRyZW47XG4gICAgdmFyIHNlbGVjdG9yID0gcnVsZS5wcmVsdWRlLmNoaWxkcmVuLmZpcnN0KCkuaWQ7XG5cbiAgICBydWxlLmJsb2NrLmNoaWxkcmVuLmVhY2hSaWdodChmdW5jdGlvbihkZWNsYXJhdGlvbiwgaXRlbSkge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSBkZWNsYXJhdGlvbi5wcm9wZXJ0eTtcblxuICAgICAgICBpZiAoIU1BSU5fUFJPUEVSVFkuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIga2V5ID0gTUFJTl9QUk9QRVJUWVtwcm9wZXJ0eV07XG4gICAgICAgIHZhciBzaG9ydGhhbmQ7XG4gICAgICAgIHZhciBvcGVyYXRpb247XG5cbiAgICAgICAgaWYgKCFsYXN0U2hvcnRTZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gbGFzdFNob3J0U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gc2hvcnRzKSB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gUkVNT1ZFO1xuICAgICAgICAgICAgICAgIHNob3J0aGFuZCA9IHNob3J0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaG9ydGhhbmQgfHwgIXNob3J0aGFuZC5hZGQocHJvcGVydHksIGRlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUkVQTEFDRTtcbiAgICAgICAgICAgIHNob3J0aGFuZCA9IG5ldyBUUkJMKGtleSk7XG5cbiAgICAgICAgICAgIC8vIGlmIGNhbid0IHBhcnNlIHZhbHVlIGlnbm9yZSBpdCBhbmQgYnJlYWsgc2hvcnRoYW5kIGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAoIXNob3J0aGFuZC5hZGQocHJvcGVydHksIGRlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIGxhc3RTaG9ydFNlbGVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzaG9ydHNba2V5XSA9IHNob3J0aGFuZDtcbiAgICAgICAgc2hvcnREZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAgIGJsb2NrOiBkZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgICAgc2hvcnRoYW5kOiBzaG9ydGhhbmRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGFzdFNob3J0U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9KTtcblxuICAgIHJldHVybiBsYXN0U2hvcnRTZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nob3J0aGFuZHMoc2hvcnREZWNsYXJhdGlvbnMsIG1hcmtEZWNsYXJhdGlvbikge1xuICAgIHNob3J0RGVjbGFyYXRpb25zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2YXIgc2hvcnRoYW5kID0gaXRlbS5zaG9ydGhhbmQ7XG5cbiAgICAgICAgaWYgKCFzaG9ydGhhbmQuaXNPa1RvTWluaW1pemUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0ub3BlcmF0aW9uID09PSBSRVBMQUNFKSB7XG4gICAgICAgICAgICBpdGVtLml0ZW0uZGF0YSA9IG1hcmtEZWNsYXJhdGlvbihzaG9ydGhhbmQuZ2V0RGVjbGFyYXRpb24oKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtLmJsb2NrLnJlbW92ZShpdGVtLml0ZW0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVzdHJ1Y3RCbG9jayhhc3QsIGluZGV4ZXIpIHtcbiAgICB2YXIgc3R5bGVzaGVldE1hcCA9IHt9O1xuICAgIHZhciBzaG9ydERlY2xhcmF0aW9ucyA9IFtdO1xuXG4gICAgd2Fsayhhc3QsIHtcbiAgICAgICAgdmlzaXQ6ICdSdWxlJyxcbiAgICAgICAgcmV2ZXJzZTogdHJ1ZSxcbiAgICAgICAgZW50ZXI6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBzdHlsZXNoZWV0ID0gdGhpcy5ibG9jayB8fCB0aGlzLnN0eWxlc2hlZXQ7XG4gICAgICAgICAgICB2YXIgcnVsZUlkID0gKG5vZGUucHNldWRvU2lnbmF0dXJlIHx8ICcnKSArICd8JyArIG5vZGUucHJlbHVkZS5jaGlsZHJlbi5maXJzdCgpLmlkO1xuICAgICAgICAgICAgdmFyIHJ1bGVNYXA7XG4gICAgICAgICAgICB2YXIgc2hvcnRzO1xuXG4gICAgICAgICAgICBpZiAoIXN0eWxlc2hlZXRNYXAuaGFzT3duUHJvcGVydHkoc3R5bGVzaGVldC5pZCkpIHtcbiAgICAgICAgICAgICAgICBydWxlTWFwID0ge1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2hvcnRTZWxlY3RvcjogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldE1hcFtzdHlsZXNoZWV0LmlkXSA9IHJ1bGVNYXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJ1bGVNYXAgPSBzdHlsZXNoZWV0TWFwW3N0eWxlc2hlZXQuaWRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocnVsZU1hcC5oYXNPd25Qcm9wZXJ0eShydWxlSWQpKSB7XG4gICAgICAgICAgICAgICAgc2hvcnRzID0gcnVsZU1hcFtydWxlSWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaG9ydHMgPSB7fTtcbiAgICAgICAgICAgICAgICBydWxlTWFwW3J1bGVJZF0gPSBzaG9ydHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJ1bGVNYXAubGFzdFNob3J0U2VsZWN0b3IgPSBwcm9jZXNzUnVsZS5jYWxsKHRoaXMsIG5vZGUsIHNob3J0cywgc2hvcnREZWNsYXJhdGlvbnMsIHJ1bGVNYXAubGFzdFNob3J0U2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwcm9jZXNzU2hvcnRoYW5kcyhzaG9ydERlY2xhcmF0aW9ucywgaW5kZXhlci5kZWNsYXJhdGlvbik7XG59O1xuIiwidmFyIHJlc29sdmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2Nzcy10cmVlJykucHJvcGVydHk7XG52YXIgcmVzb2x2ZUtleXdvcmQgPSByZXF1aXJlKCdjc3MtdHJlZScpLmtleXdvcmQ7XG52YXIgd2FsayA9IHJlcXVpcmUoJ2Nzcy10cmVlJykud2FsaztcbnZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoJ2Nzcy10cmVlJykuZ2VuZXJhdGU7XG52YXIgZmluZ2VycHJpbnRJZCA9IDE7XG52YXIgZG9udFJlc3RydWN0dXJlID0ge1xuICAgICdzcmMnOiAxIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hZmVsaXgvY3Nzby9pc3N1ZXMvNTBcbn07XG5cbnZhciBET05UX01JWF9WQUxVRSA9IHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZGlzcGxheSNCcm93c2VyX2NvbXBhdGliaWxpdHlcbiAgICAnZGlzcGxheSc6IC90YWJsZXxydWJ5fGZsZXh8LShmbGV4KT9ib3gkfGdyaWR8Y29udGVudHN8cnVuLWluL2ksXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQ1NTL3RleHQtYWxpZ25cbiAgICAndGV4dC1hbGlnbic6IC9eKHN0YXJ0fGVuZHxtYXRjaC1wYXJlbnR8anVzdGlmeS1hbGwpJC9pXG59O1xuXG52YXIgQ1VSU09SX1NBRkVfVkFMVUUgPSBbXG4gICAgJ2F1dG8nLCAnY3Jvc3NoYWlyJywgJ2RlZmF1bHQnLCAnbW92ZScsICd0ZXh0JywgJ3dhaXQnLCAnaGVscCcsXG4gICAgJ24tcmVzaXplJywgJ2UtcmVzaXplJywgJ3MtcmVzaXplJywgJ3ctcmVzaXplJyxcbiAgICAnbmUtcmVzaXplJywgJ253LXJlc2l6ZScsICdzZS1yZXNpemUnLCAnc3ctcmVzaXplJyxcbiAgICAncG9pbnRlcicsICdwcm9ncmVzcycsICdub3QtYWxsb3dlZCcsICduby1kcm9wJywgJ3ZlcnRpY2FsLXRleHQnLCAnYWxsLXNjcm9sbCcsXG4gICAgJ2NvbC1yZXNpemUnLCAncm93LXJlc2l6ZSdcbl07XG5cbnZhciBQT1NJVElPTl9TQUZFX1ZBTFVFID0gW1xuICAgICdzdGF0aWMnLCAncmVsYXRpdmUnLCAnYWJzb2x1dGUnLCAnZml4ZWQnXG5dO1xuXG52YXIgTkVFRExFU1NfVEFCTEUgPSB7XG4gICAgJ2JvcmRlci13aWR0aCc6IFsnYm9yZGVyJ10sXG4gICAgJ2JvcmRlci1zdHlsZSc6IFsnYm9yZGVyJ10sXG4gICAgJ2JvcmRlci1jb2xvcic6IFsnYm9yZGVyJ10sXG4gICAgJ2JvcmRlci10b3AnOiBbJ2JvcmRlciddLFxuICAgICdib3JkZXItcmlnaHQnOiBbJ2JvcmRlciddLFxuICAgICdib3JkZXItYm90dG9tJzogWydib3JkZXInXSxcbiAgICAnYm9yZGVyLWxlZnQnOiBbJ2JvcmRlciddLFxuICAgICdib3JkZXItdG9wLXdpZHRoJzogWydib3JkZXItdG9wJywgJ2JvcmRlci13aWR0aCcsICdib3JkZXInXSxcbiAgICAnYm9yZGVyLXJpZ2h0LXdpZHRoJzogWydib3JkZXItcmlnaHQnLCAnYm9yZGVyLXdpZHRoJywgJ2JvcmRlciddLFxuICAgICdib3JkZXItYm90dG9tLXdpZHRoJzogWydib3JkZXItYm90dG9tJywgJ2JvcmRlci13aWR0aCcsICdib3JkZXInXSxcbiAgICAnYm9yZGVyLWxlZnQtd2lkdGgnOiBbJ2JvcmRlci1sZWZ0JywgJ2JvcmRlci13aWR0aCcsICdib3JkZXInXSxcbiAgICAnYm9yZGVyLXRvcC1zdHlsZSc6IFsnYm9yZGVyLXRvcCcsICdib3JkZXItc3R5bGUnLCAnYm9yZGVyJ10sXG4gICAgJ2JvcmRlci1yaWdodC1zdHlsZSc6IFsnYm9yZGVyLXJpZ2h0JywgJ2JvcmRlci1zdHlsZScsICdib3JkZXInXSxcbiAgICAnYm9yZGVyLWJvdHRvbS1zdHlsZSc6IFsnYm9yZGVyLWJvdHRvbScsICdib3JkZXItc3R5bGUnLCAnYm9yZGVyJ10sXG4gICAgJ2JvcmRlci1sZWZ0LXN0eWxlJzogWydib3JkZXItbGVmdCcsICdib3JkZXItc3R5bGUnLCAnYm9yZGVyJ10sXG4gICAgJ2JvcmRlci10b3AtY29sb3InOiBbJ2JvcmRlci10b3AnLCAnYm9yZGVyLWNvbG9yJywgJ2JvcmRlciddLFxuICAgICdib3JkZXItcmlnaHQtY29sb3InOiBbJ2JvcmRlci1yaWdodCcsICdib3JkZXItY29sb3InLCAnYm9yZGVyJ10sXG4gICAgJ2JvcmRlci1ib3R0b20tY29sb3InOiBbJ2JvcmRlci1ib3R0b20nLCAnYm9yZGVyLWNvbG9yJywgJ2JvcmRlciddLFxuICAgICdib3JkZXItbGVmdC1jb2xvcic6IFsnYm9yZGVyLWxlZnQnLCAnYm9yZGVyLWNvbG9yJywgJ2JvcmRlciddLFxuICAgICdtYXJnaW4tdG9wJzogWydtYXJnaW4nXSxcbiAgICAnbWFyZ2luLXJpZ2h0JzogWydtYXJnaW4nXSxcbiAgICAnbWFyZ2luLWJvdHRvbSc6IFsnbWFyZ2luJ10sXG4gICAgJ21hcmdpbi1sZWZ0JzogWydtYXJnaW4nXSxcbiAgICAncGFkZGluZy10b3AnOiBbJ3BhZGRpbmcnXSxcbiAgICAncGFkZGluZy1yaWdodCc6IFsncGFkZGluZyddLFxuICAgICdwYWRkaW5nLWJvdHRvbSc6IFsncGFkZGluZyddLFxuICAgICdwYWRkaW5nLWxlZnQnOiBbJ3BhZGRpbmcnXSxcbiAgICAnZm9udC1zdHlsZSc6IFsnZm9udCddLFxuICAgICdmb250LXZhcmlhbnQnOiBbJ2ZvbnQnXSxcbiAgICAnZm9udC13ZWlnaHQnOiBbJ2ZvbnQnXSxcbiAgICAnZm9udC1zaXplJzogWydmb250J10sXG4gICAgJ2ZvbnQtZmFtaWx5JzogWydmb250J10sXG4gICAgJ2xpc3Qtc3R5bGUtdHlwZSc6IFsnbGlzdC1zdHlsZSddLFxuICAgICdsaXN0LXN0eWxlLXBvc2l0aW9uJzogWydsaXN0LXN0eWxlJ10sXG4gICAgJ2xpc3Qtc3R5bGUtaW1hZ2UnOiBbJ2xpc3Qtc3R5bGUnXVxufTtcblxuZnVuY3Rpb24gZ2V0UHJvcGVydHlGaW5nZXJwcmludChwcm9wZXJ0eU5hbWUsIGRlY2xhcmF0aW9uLCBmaW5nZXJwcmludHMpIHtcbiAgICB2YXIgcmVhbE5hbWUgPSByZXNvbHZlUHJvcGVydHkocHJvcGVydHlOYW1lKS5iYXNlbmFtZTtcblxuICAgIGlmIChyZWFsTmFtZSA9PT0gJ2JhY2tncm91bmQnKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUgKyAnOicgKyBnZW5lcmF0ZShkZWNsYXJhdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGRlY2xhcmF0aW9uSWQgPSBkZWNsYXJhdGlvbi5pZDtcbiAgICB2YXIgZmluZ2VycHJpbnQgPSBmaW5nZXJwcmludHNbZGVjbGFyYXRpb25JZF07XG5cbiAgICBpZiAoIWZpbmdlcnByaW50KSB7XG4gICAgICAgIHN3aXRjaCAoZGVjbGFyYXRpb24udmFsdWUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnVmFsdWUnOlxuICAgICAgICAgICAgICAgIHZhciB2ZW5kb3JJZCA9ICcnO1xuICAgICAgICAgICAgICAgIHZhciBpZWhhY2sgPSAnJztcbiAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbCA9IHt9O1xuICAgICAgICAgICAgICAgIHZhciByYXcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnZhbHVlLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24gd2Fsayhub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdWYWx1ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCcmFja2V0cyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQYXJlbnRoZXNlcyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5lYWNoKHdhbGspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSYXcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0lkZW50aWZpZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbm9kZS5uYW1lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZW5kb3JJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZCA9IHJlc29sdmVLZXl3b3JkKG5hbWUpLnZlbmRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1xcXFxbMDldLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllaGFjayA9IFJlZ0V4cC5sYXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWxOYW1lID09PSAnY3Vyc29yJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1VSU09SX1NBRkVfVkFMVUUuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWFsTmFtZSA9PT0gJ3Bvc2l0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUE9TSVRJT05fU0FGRV9WQUxVRS5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFtuYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERPTlRfTUlYX1ZBTFVFLmhhc093blByb3BlcnR5KHJlYWxOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRE9OVF9NSVhfVkFMVUVbcmVhbE5hbWVdLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IG5vZGUubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmVuZG9ySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9ySWQgPSByZXNvbHZlS2V5d29yZChuYW1lKS52ZW5kb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdyZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgMiBmb3JtcyBvZiByZWN0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlY3QoPHRvcD4sIDxyaWdodD4sIDxib3R0b20+LCA8bGVmdD4pIC0gc3RhbmRhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByZWN0KDx0b3A+IDxyaWdodD4gPGJvdHRvbT4gPGxlZnQ+KSDigJMgYmFja3dhcmRzIGNvbXBhdGlibGUgc3ludGF4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdGhlIHNhbWUgZm9ybSB2YWx1ZXMgY2FuIGJlIG1lcmdlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFzQ29tbWEgPSBub2RlLmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ09wZXJhdG9yJyAmJiBub2RlLnZhbHVlID09PSAnLCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ3JlY3QtYmFja3dhcmQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFtuYW1lICsgJygpJ10gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgbmVzdGVkIHRva2VucyB0b29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLmVhY2god2Fsayk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRGltZW5zaW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5pdCA9IG5vZGUudW5pdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc3VwcG9ydGVkIHVudGlsIElFMTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVtJzpcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2KiB1bml0cyBpcyB0b28gYnVnZ3kgYWNyb3NzIGJyb3dzZXJzIGFuZCBiZXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgbWVyZ2UgdmFsdWVzIHdpdGggdGhvc2UgdW5pdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndncnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2aCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZtaW4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2bWF4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndm0nOiAvLyBJRTkgc3VwcG9ydGluZyBcInZtXCIgaW5zdGVhZCBvZiBcInZtaW5cIi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxbdW5pdF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmaW5nZXJwcmludCA9IHJhd1xuICAgICAgICAgICAgICAgICAgICA/ICchJyArIGZpbmdlcnByaW50SWQrK1xuICAgICAgICAgICAgICAgICAgICA6ICchJyArIE9iamVjdC5rZXlzKHNwZWNpYWwpLnNvcnQoKSArICd8JyArIGllaGFjayArIHZlbmRvcklkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdSYXcnOlxuICAgICAgICAgICAgICAgIGZpbmdlcnByaW50ID0gJyEnICsgZGVjbGFyYXRpb24udmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZmluZ2VycHJpbnQgPSBnZW5lcmF0ZShkZWNsYXJhdGlvbi52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmaW5nZXJwcmludHNbZGVjbGFyYXRpb25JZF0gPSBmaW5nZXJwcmludDtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHlOYW1lICsgZmluZ2VycHJpbnQ7XG59XG5cbmZ1bmN0aW9uIG5lZWRsZXNzKHByb3BzLCBkZWNsYXJhdGlvbiwgZmluZ2VycHJpbnRzKSB7XG4gICAgdmFyIHByb3BlcnR5ID0gcmVzb2x2ZVByb3BlcnR5KGRlY2xhcmF0aW9uLnByb3BlcnR5KTtcblxuICAgIGlmIChORUVETEVTU19UQUJMRS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eS5iYXNlbmFtZSkpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gTkVFRExFU1NfVEFCTEVbcHJvcGVydHkuYmFzZW5hbWVdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFibGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwcHJlID0gZ2V0UHJvcGVydHlGaW5nZXJwcmludChwcm9wZXJ0eS5wcmVmaXggKyB0YWJsZVtpXSwgZGVjbGFyYXRpb24sIGZpbmdlcnByaW50cyk7XG4gICAgICAgICAgICB2YXIgcHJldiA9IHByb3BzLmhhc093blByb3BlcnR5KHBwcmUpID8gcHJvcHNbcHByZV0gOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAocHJldiAmJiAoIWRlY2xhcmF0aW9uLmltcG9ydGFudCB8fCBwcmV2Lml0ZW0uZGF0YS5pbXBvcnRhbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSdWxlKHJ1bGUsIGl0ZW0sIGxpc3QsIHByb3BzLCBmaW5nZXJwcmludHMpIHtcbiAgICB2YXIgZGVjbGFyYXRpb25zID0gcnVsZS5ibG9jay5jaGlsZHJlbjtcblxuICAgIGRlY2xhcmF0aW9ucy5lYWNoUmlnaHQoZnVuY3Rpb24oZGVjbGFyYXRpb24sIGRlY2xhcmF0aW9uSXRlbSkge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSBkZWNsYXJhdGlvbi5wcm9wZXJ0eTtcbiAgICAgICAgdmFyIGZpbmdlcnByaW50ID0gZ2V0UHJvcGVydHlGaW5nZXJwcmludChwcm9wZXJ0eSwgZGVjbGFyYXRpb24sIGZpbmdlcnByaW50cyk7XG4gICAgICAgIHZhciBwcmV2ID0gcHJvcHNbZmluZ2VycHJpbnRdO1xuXG4gICAgICAgIGlmIChwcmV2ICYmICFkb250UmVzdHJ1Y3R1cmUuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaW1wb3J0YW50ICYmICFwcmV2Lml0ZW0uZGF0YS5pbXBvcnRhbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9wc1tmaW5nZXJwcmludF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiBkZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IGRlY2xhcmF0aW9uSXRlbVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBwcmV2LmJsb2NrLnJlbW92ZShwcmV2Lml0ZW0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIGl0IHdoZW4gd2UgY2FuIHJlZmVyIHRvIHNldmVyYWwgcG9pbnRzIGluIHNvdXJjZVxuICAgICAgICAgICAgICAgIC8vIGRlY2xhcmF0aW9uLmxvYyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcHJpbWFyeTogZGVjbGFyYXRpb24ubG9jLFxuICAgICAgICAgICAgICAgIC8vICAgICBtZXJnZWQ6IHByZXYuaXRlbS5kYXRhLmxvY1xuICAgICAgICAgICAgICAgIC8vIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9ucy5yZW1vdmUoZGVjbGFyYXRpb25JdGVtKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBpdCB3aGVuIHdlIGNhbiByZWZlciB0byBzZXZlcmFsIHBvaW50cyBpbiBzb3VyY2VcbiAgICAgICAgICAgICAgICAvLyBwcmV2Lml0ZW0uZGF0YS5sb2MgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHByaW1hcnk6IHByZXYuaXRlbS5kYXRhLmxvYyxcbiAgICAgICAgICAgICAgICAvLyAgICAgbWVyZ2VkOiBkZWNsYXJhdGlvbi5sb2NcbiAgICAgICAgICAgICAgICAvLyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXYgPSBuZWVkbGVzcyhwcm9wcywgZGVjbGFyYXRpb24sIGZpbmdlcnByaW50cyk7XG5cbiAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLnJlbW92ZShkZWNsYXJhdGlvbkl0ZW0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIGl0IHdoZW4gd2UgY2FuIHJlZmVyIHRvIHNldmVyYWwgcG9pbnRzIGluIHNvdXJjZVxuICAgICAgICAgICAgICAgIC8vIHByZXYuaXRlbS5kYXRhLmxvYyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcHJpbWFyeTogcHJldi5pdGVtLmRhdGEubG9jLFxuICAgICAgICAgICAgICAgIC8vICAgICBtZXJnZWQ6IGRlY2xhcmF0aW9uLmxvY1xuICAgICAgICAgICAgICAgIC8vIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7XG5cbiAgICAgICAgICAgICAgICBwcm9wc1tmaW5nZXJwcmludF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiBkZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IGRlY2xhcmF0aW9uSXRlbVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChkZWNsYXJhdGlvbnMuaXNFbXB0eSgpKSB7XG4gICAgICAgIGxpc3QucmVtb3ZlKGl0ZW0pO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXN0cnVjdEJsb2NrKGFzdCkge1xuICAgIHZhciBzdHlsZXNoZWV0TWFwID0ge307XG4gICAgdmFyIGZpbmdlcnByaW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB3YWxrKGFzdCwge1xuICAgICAgICB2aXNpdDogJ1J1bGUnLFxuICAgICAgICByZXZlcnNlOiB0cnVlLFxuICAgICAgICBlbnRlcjogZnVuY3Rpb24obm9kZSwgaXRlbSwgbGlzdCkge1xuICAgICAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSB0aGlzLmJsb2NrIHx8IHRoaXMuc3R5bGVzaGVldDtcbiAgICAgICAgICAgIHZhciBydWxlSWQgPSAobm9kZS5wc2V1ZG9TaWduYXR1cmUgfHwgJycpICsgJ3wnICsgbm9kZS5wcmVsdWRlLmNoaWxkcmVuLmZpcnN0KCkuaWQ7XG4gICAgICAgICAgICB2YXIgcnVsZU1hcDtcbiAgICAgICAgICAgIHZhciBwcm9wcztcblxuICAgICAgICAgICAgaWYgKCFzdHlsZXNoZWV0TWFwLmhhc093blByb3BlcnR5KHN0eWxlc2hlZXQuaWQpKSB7XG4gICAgICAgICAgICAgICAgcnVsZU1hcCA9IHt9O1xuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXRNYXBbc3R5bGVzaGVldC5pZF0gPSBydWxlTWFwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBydWxlTWFwID0gc3R5bGVzaGVldE1hcFtzdHlsZXNoZWV0LmlkXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJ1bGVNYXAuaGFzT3duUHJvcGVydHkocnVsZUlkKSkge1xuICAgICAgICAgICAgICAgIHByb3BzID0gcnVsZU1hcFtydWxlSWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9wcyA9IHt9O1xuICAgICAgICAgICAgICAgIHJ1bGVNYXBbcnVsZUlkXSA9IHByb3BzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9jZXNzUnVsZS5jYWxsKHRoaXMsIG5vZGUsIGl0ZW0sIGxpc3QsIHByb3BzLCBmaW5nZXJwcmludHMpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuIiwidmFyIHdhbGsgPSByZXF1aXJlKCdjc3MtdHJlZScpLndhbGs7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qXG4gICAgQXQgdGhpcyBzdGVwIGFsbCBydWxlcyBoYXMgc2luZ2xlIHNpbXBsZSBzZWxlY3Rvci4gV2UgdHJ5IHRvIGpvaW4gYnkgZXF1YWxcbiAgICBkZWNsYXJhdGlvbiBibG9ja3MgdG8gZmlyc3QgcnVsZSwgZS5nLlxuXG4gICAgLmEgeyBjb2xvcjogcmVkIH1cbiAgICBiIHsgLi4uIH1cbiAgICAuYiB7IGNvbG9yOiByZWQgfVxuICAgIC0+XG4gICAgLmEsIC5iIHsgY29sb3I6IHJlZCB9XG4gICAgYiB7IC4uLiB9XG4qL1xuXG5mdW5jdGlvbiBwcm9jZXNzUnVsZShub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IG5vZGUucHJlbHVkZS5jaGlsZHJlbjtcbiAgICB2YXIgZGVjbGFyYXRpb25zID0gbm9kZS5ibG9jay5jaGlsZHJlbjtcbiAgICB2YXIgbm9kZUNvbXBhcmVNYXJrZXIgPSBzZWxlY3RvcnMuZmlyc3QoKS5jb21wYXJlTWFya2VyO1xuICAgIHZhciBza2lwcGVkQ29tcGFyZU1hcmtlcnMgPSB7fTtcblxuICAgIGxpc3QubmV4dFVudGlsKGl0ZW0ubmV4dCwgZnVuY3Rpb24obmV4dCwgbmV4dEl0ZW0pIHtcbiAgICAgICAgLy8gc2tpcCBub24tcnVsZXNldCBub2RlIGlmIHNhZmVcbiAgICAgICAgaWYgKG5leHQudHlwZSAhPT0gJ1J1bGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMudW5zYWZlVG9Ta2lwTm9kZS5jYWxsKHNlbGVjdG9ycywgbmV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5wc2V1ZG9TaWduYXR1cmUgIT09IG5leHQucHNldWRvU2lnbmF0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0Rmlyc3RTZWxlY3RvciA9IG5leHQucHJlbHVkZS5jaGlsZHJlbi5oZWFkO1xuICAgICAgICB2YXIgbmV4dERlY2xhcmF0aW9ucyA9IG5leHQuYmxvY2suY2hpbGRyZW47XG4gICAgICAgIHZhciBuZXh0Q29tcGFyZU1hcmtlciA9IG5leHRGaXJzdFNlbGVjdG9yLmRhdGEuY29tcGFyZU1hcmtlcjtcblxuICAgICAgICAvLyBpZiBuZXh0IHJ1bGVzZXQgaGFzIHNhbWUgbWFya2VkIGFzIG9uZSBvZiBza2lwcGVkIHRoZW4gc3RvcCBqb2luaW5nXG4gICAgICAgIGlmIChuZXh0Q29tcGFyZU1hcmtlciBpbiBza2lwcGVkQ29tcGFyZU1hcmtlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJ5IHRvIGpvaW4gYnkgc2VsZWN0b3JzXG4gICAgICAgIGlmIChzZWxlY3RvcnMuaGVhZCA9PT0gc2VsZWN0b3JzLnRhaWwpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RvcnMuZmlyc3QoKS5pZCA9PT0gbmV4dEZpcnN0U2VsZWN0b3IuZGF0YS5pZCkge1xuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9ucy5hcHBlbmRMaXN0KG5leHREZWNsYXJhdGlvbnMpO1xuICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKG5leHRJdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnkgdG8gam9pbiBieSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh1dGlscy5pc0VxdWFsRGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmV4dERlY2xhcmF0aW9ucykpIHtcbiAgICAgICAgICAgIHZhciBuZXh0U3RyID0gbmV4dEZpcnN0U2VsZWN0b3IuZGF0YS5pZDtcblxuICAgICAgICAgICAgc2VsZWN0b3JzLnNvbWUoZnVuY3Rpb24oZGF0YSwgaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJTdHIgPSBkYXRhLmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5leHRTdHIgPCBjdXJTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLmluc2VydChuZXh0Rmlyc3RTZWxlY3RvciwgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5pbnNlcnQobmV4dEZpcnN0U2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGlzdC5yZW1vdmUobmV4dEl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ28gdG8gbmV4dCBydWxlc2V0IGlmIGN1cnJlbnQgb25lIGNhbiBiZSBza2lwcGVkIChoYXMgbm8gZXF1YWwgc3BlY2lmaWNpdHkgbm9yIGVsZW1lbnQgc2VsZWN0b3IpXG4gICAgICAgIGlmIChuZXh0Q29tcGFyZU1hcmtlciA9PT0gbm9kZUNvbXBhcmVNYXJrZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2tpcHBlZENvbXBhcmVNYXJrZXJzW25leHRDb21wYXJlTWFya2VyXSA9IHRydWU7XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWVyZ2VSdWxlKGFzdCkge1xuICAgIHdhbGsoYXN0LCB7XG4gICAgICAgIHZpc2l0OiAnUnVsZScsXG4gICAgICAgIGVudGVyOiBwcm9jZXNzUnVsZVxuICAgIH0pO1xufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnY3NzLXRyZWUnKS5MaXN0O1xudmFyIHdhbGsgPSByZXF1aXJlKCdjc3MtdHJlZScpLndhbGs7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIGNhbGNTZWxlY3Rvckxlbmd0aChsaXN0KSB7XG4gICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICBsaXN0LmVhY2goZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBsZW5ndGggKz0gZGF0YS5pZC5sZW5ndGggKyAxO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxlbmd0aCAtIDE7XG59XG5cbmZ1bmN0aW9uIGNhbGNEZWNsYXJhdGlvbnNMZW5ndGgodG9rZW5zKSB7XG4gICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZW5ndGggKz0gdG9rZW5zW2ldLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICBsZW5ndGggKyAgICAgICAgICAvLyBkZWNsYXJhdGlvbnNcbiAgICAgICAgdG9rZW5zLmxlbmd0aCAtIDEgLy8gZGVsaW1ldGVyc1xuICAgICk7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSdWxlKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICB2YXIgYXZvaWRSdWxlc01lcmdlID0gdGhpcy5ibG9jayAhPT0gbnVsbCA/IHRoaXMuYmxvY2suYXZvaWRSdWxlc01lcmdlIDogZmFsc2U7XG4gICAgdmFyIHNlbGVjdG9ycyA9IG5vZGUucHJlbHVkZS5jaGlsZHJlbjtcbiAgICB2YXIgYmxvY2sgPSBub2RlLmJsb2NrO1xuICAgIHZhciBkaXNhbGxvd0Rvd25NYXJrZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIgYWxsb3dNZXJnZVVwID0gdHJ1ZTtcbiAgICB2YXIgYWxsb3dNZXJnZURvd24gPSB0cnVlO1xuXG4gICAgbGlzdC5wcmV2VW50aWwoaXRlbS5wcmV2LCBmdW5jdGlvbihwcmV2LCBwcmV2SXRlbSkge1xuICAgICAgICAvLyBza2lwIG5vbi1ydWxlc2V0IG5vZGUgaWYgc2FmZVxuICAgICAgICBpZiAocHJldi50eXBlICE9PSAnUnVsZScpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy51bnNhZmVUb1NraXBOb2RlLmNhbGwoc2VsZWN0b3JzLCBwcmV2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcmV2U2VsZWN0b3JzID0gcHJldi5wcmVsdWRlLmNoaWxkcmVuO1xuICAgICAgICB2YXIgcHJldkJsb2NrID0gcHJldi5ibG9jaztcblxuICAgICAgICBpZiAobm9kZS5wc2V1ZG9TaWduYXR1cmUgIT09IHByZXYucHNldWRvU2lnbmF0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFsbG93TWVyZ2VEb3duID0gIXByZXZTZWxlY3RvcnMuc29tZShmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmNvbXBhcmVNYXJrZXIgaW4gZGlzYWxsb3dEb3duTWFya2VycztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdHJ5IHByZXYgcnVsZXNldCBpZiBzaW1wbGVzZWxlY3RvcnMgaGFzIG5vIGVxdWFsIHNwZWNpZml0eSBhbmQgZWxlbWVudCBzZWxlY3RvclxuICAgICAgICBpZiAoIWFsbG93TWVyZ2VEb3duICYmICFhbGxvd01lcmdlVXApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJ5IHRvIGpvaW4gYnkgc2VsZWN0b3JzXG4gICAgICAgIGlmIChhbGxvd01lcmdlVXAgJiYgdXRpbHMuaXNFcXVhbFNlbGVjdG9ycyhwcmV2U2VsZWN0b3JzLCBzZWxlY3RvcnMpKSB7XG4gICAgICAgICAgICBwcmV2QmxvY2suY2hpbGRyZW4uYXBwZW5kTGlzdChibG9jay5jaGlsZHJlbik7XG4gICAgICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJ5IHRvIGpvaW4gYnkgcHJvcGVydGllc1xuICAgICAgICB2YXIgZGlmZiA9IHV0aWxzLmNvbXBhcmVEZWNsYXJhdGlvbnMoYmxvY2suY2hpbGRyZW4sIHByZXZCbG9jay5jaGlsZHJlbik7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coZGlmZi5lcSwgZGlmZi5uZTEsIGRpZmYubmUyKTtcblxuICAgICAgICBpZiAoZGlmZi5lcS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghZGlmZi5uZTEubGVuZ3RoICYmICFkaWZmLm5lMi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBlcXVhbCBibG9ja3NcbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dNZXJnZURvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgdXRpbHMuYWRkU2VsZWN0b3JzKHNlbGVjdG9ycywgcHJldlNlbGVjdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKHByZXZJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2b2lkUnVsZXNNZXJnZSkgeyAvKiBwcm9iYWJseSB3ZSBkb24ndCBuZWVkIHRvIHByZXZlbnQgdGhvc2UgbWVyZ2VzIGZvciBAa2V5ZnJhbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9ETzogbmVlZCB0byBiZSBjaGVja2VkICovXG5cbiAgICAgICAgICAgICAgICBpZiAoZGlmZi5uZTEubGVuZ3RoICYmICFkaWZmLm5lMi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldkJsb2NrIGlzIHN1YnNldCBibG9ja1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JMZW5ndGggPSBjYWxjU2VsZWN0b3JMZW5ndGgoc2VsZWN0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJsb2NrTGVuZ3RoID0gY2FsY0RlY2xhcmF0aW9uc0xlbmd0aChkaWZmLmVxKTsgLy8gZGVjbGFyYXRpb25zIGxlbmd0aFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd01lcmdlVXAgJiYgc2VsZWN0b3JMZW5ndGggPCBibG9ja0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuYWRkU2VsZWN0b3JzKHByZXZTZWxlY3RvcnMsIHNlbGVjdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5jaGlsZHJlbiA9IG5ldyBMaXN0KCkuZnJvbUFycmF5KGRpZmYubmUxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpZmYubmUxLmxlbmd0aCAmJiBkaWZmLm5lMi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSBpcyBzdWJzZXQgb2YgcHJldkJsb2NrXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3Rvckxlbmd0aCA9IGNhbGNTZWxlY3Rvckxlbmd0aChwcmV2U2VsZWN0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJsb2NrTGVuZ3RoID0gY2FsY0RlY2xhcmF0aW9uc0xlbmd0aChkaWZmLmVxKTsgLy8gZGVjbGFyYXRpb25zIGxlbmd0aFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd01lcmdlRG93biAmJiBzZWxlY3Rvckxlbmd0aCA8IGJsb2NrTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5hZGRTZWxlY3RvcnMoc2VsZWN0b3JzLCBwcmV2U2VsZWN0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZCbG9jay5jaGlsZHJlbiA9IG5ldyBMaXN0KCkuZnJvbUFycmF5KGRpZmYubmUyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZmYubmUxLmxlbmd0aCAmJiBkaWZmLm5lMi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBlcXVhbCBibG9ja1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU2VsZWN0b3JMaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiB1dGlscy5hZGRTZWxlY3RvcnMocHJldlNlbGVjdG9ycy5jb3B5KCksIHNlbGVjdG9ycylcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0Jsb2NrTGVuZ3RoID0gY2FsY1NlbGVjdG9yTGVuZ3RoKG5ld1NlbGVjdG9yLmNoaWxkcmVuKSArIDI7IC8vIHNlbGVjdG9ycyBsZW5ndGggKyBjdXJseSBicmFjZXMgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIHZhciBibG9ja0xlbmd0aCA9IGNhbGNEZWNsYXJhdGlvbnNMZW5ndGgoZGlmZi5lcSk7IC8vIGRlY2xhcmF0aW9ucyBsZW5ndGhcblxuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IHJ1bGVzZXQgaWYgZGVjbGFyYXRpb25zIGxlbmd0aCBncmVhdGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gcnVsZXNldCBkZXNjcmlwdGlvbiBvdmVyaGVhZFxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dNZXJnZURvd24gJiYgYmxvY2tMZW5ndGggPj0gbmV3QmxvY2tMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdSdWxlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSdWxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbHVkZTogbmV3U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0Jsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogbmV3IExpc3QoKS5mcm9tQXJyYXkoZGlmZi5lcSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkb1NpZ25hdHVyZTogbm9kZS5wc2V1ZG9TaWduYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmNoaWxkcmVuID0gbmV3IExpc3QoKS5mcm9tQXJyYXkoZGlmZi5uZTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkJsb2NrLmNoaWxkcmVuID0gbmV3IExpc3QoKS5mcm9tQXJyYXkoZGlmZi5uZTIuY29uY2F0KGRpZmYubmUyb3ZlcnJpZGVkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lmluc2VydChsaXN0LmNyZWF0ZUl0ZW0obmV3UnVsZSksIHByZXZJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsbG93TWVyZ2VVcCkge1xuICAgICAgICAgICAgLy8gVE9ETzogZGlzYWxsb3cgdXAgbWVyZ2Ugb25seSBpZiBhbnkgcHJvcGVydHkgaW50ZXJjZXB0aW9uIG9ubHkgKGkuZS4gZGlmZi5uZTJvdmVycmlkZWQubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICAvLyBhd2FpdCBwcm9wZXJ0eSBmYW1pbGllcyB0byBmaW5kIHByb3BlcnR5IGludGVyY2VwdGlvbiBjb3JyZWN0bHlcbiAgICAgICAgICAgIGFsbG93TWVyZ2VVcCA9ICFwcmV2U2VsZWN0b3JzLnNvbWUoZnVuY3Rpb24ocHJldlNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9ycy5zb21lKGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3Rvci5jb21wYXJlTWFya2VyID09PSBwcmV2U2VsZWN0b3IuY29tcGFyZU1hcmtlcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldlNlbGVjdG9ycy5lYWNoKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGRpc2FsbG93RG93bk1hcmtlcnNbZGF0YS5jb21wYXJlTWFya2VyXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc3RydWN0UnVsZShhc3QpIHtcbiAgICB3YWxrKGFzdCwge1xuICAgICAgICB2aXNpdDogJ1J1bGUnLFxuICAgICAgICByZXZlcnNlOiB0cnVlLFxuICAgICAgICBlbnRlcjogcHJvY2Vzc1J1bGVcbiAgICB9KTtcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJ2Nzcy10cmVlJykuTGlzdDtcbnZhciBjbG9uZSA9IHJlcXVpcmUoJ2Nzcy10cmVlJykuY2xvbmU7XG52YXIgdXNhZ2VVdGlscyA9IHJlcXVpcmUoJy4vdXNhZ2UnKTtcbnZhciBjbGVhbiA9IHJlcXVpcmUoJy4vY2xlYW4nKTtcbnZhciByZXBsYWNlID0gcmVxdWlyZSgnLi9yZXBsYWNlJyk7XG52YXIgcmVzdHJ1Y3R1cmUgPSByZXF1aXJlKCcuL3Jlc3RydWN0dXJlJyk7XG52YXIgd2FsayA9IHJlcXVpcmUoJ2Nzcy10cmVlJykud2FsaztcblxuZnVuY3Rpb24gcmVhZENodW5rKGNoaWxkcmVuLCBzcGVjaWFsQ29tbWVudHMpIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IExpc3QoKTtcbiAgICB2YXIgbm9uU3BhY2VUb2tlbkluQnVmZmVyID0gZmFsc2U7XG4gICAgdmFyIHByb3RlY3RlZENvbW1lbnQ7XG5cbiAgICBjaGlsZHJlbi5uZXh0VW50aWwoY2hpbGRyZW4uaGVhZCwgZnVuY3Rpb24obm9kZSwgaXRlbSwgbGlzdCkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQ29tbWVudCcpIHtcbiAgICAgICAgICAgIGlmICghc3BlY2lhbENvbW1lbnRzIHx8IG5vZGUudmFsdWUuY2hhckF0KDApICE9PSAnIScpIHtcbiAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub25TcGFjZVRva2VuSW5CdWZmZXIgfHwgcHJvdGVjdGVkQ29tbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgIHByb3RlY3RlZENvbW1lbnQgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ1doaXRlU3BhY2UnKSB7XG4gICAgICAgICAgICBub25TcGFjZVRva2VuSW5CdWZmZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyLmluc2VydChsaXN0LnJlbW92ZShpdGVtKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tZW50OiBwcm90ZWN0ZWRDb21tZW50LFxuICAgICAgICBzdHlsZXNoZWV0OiB7XG4gICAgICAgICAgICB0eXBlOiAnU3R5bGVTaGVldCcsXG4gICAgICAgICAgICBsb2M6IG51bGwsXG4gICAgICAgICAgICBjaGlsZHJlbjogYnVmZmVyXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjb21wcmVzc0NodW5rKGFzdCwgZmlyc3RBdHJ1bGVzQWxsb3dlZCwgbnVtLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5sb2dnZXIoJ0NvbXByZXNzIGJsb2NrICMnICsgbnVtLCBudWxsLCB0cnVlKTtcblxuICAgIHZhciBzZWVkID0gMTtcblxuICAgIGlmIChhc3QudHlwZSA9PT0gJ1N0eWxlU2hlZXQnKSB7XG4gICAgICAgIGFzdC5maXJzdEF0cnVsZXNBbGxvd2VkID0gZmlyc3RBdHJ1bGVzQWxsb3dlZDtcbiAgICAgICAgYXN0LmlkID0gc2VlZCsrO1xuICAgIH1cblxuICAgIHdhbGsoYXN0LCB7XG4gICAgICAgIHZpc2l0OiAnQXRydWxlJyxcbiAgICAgICAgZW50ZXI6IGZ1bmN0aW9uIG1hcmtTY29wZXMobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuYmxvY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBub2RlLmJsb2NrLmlkID0gc2VlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgb3B0aW9ucy5sb2dnZXIoJ2luaXQnLCBhc3QpO1xuXG4gICAgLy8gcmVtb3ZlIHJlZHVuZGFudFxuICAgIGNsZWFuKGFzdCwgb3B0aW9ucyk7XG4gICAgb3B0aW9ucy5sb2dnZXIoJ2NsZWFuJywgYXN0KTtcblxuICAgIC8vIHJlcGxhY2Ugbm9kZXMgZm9yIHNob3J0ZW5lZCBmb3Jtc1xuICAgIHJlcGxhY2UoYXN0LCBvcHRpb25zKTtcbiAgICBvcHRpb25zLmxvZ2dlcigncmVwbGFjZScsIGFzdCk7XG5cbiAgICAvLyBzdHJ1Y3R1cmUgb3B0aW1pc2F0aW9uc1xuICAgIGlmIChvcHRpb25zLnJlc3RydWN0dXJpbmcpIHtcbiAgICAgICAgcmVzdHJ1Y3R1cmUoYXN0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXN0O1xufVxuXG5mdW5jdGlvbiBnZXRDb21tZW50c09wdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIGNvbW1lbnRzID0gJ2NvbW1lbnRzJyBpbiBvcHRpb25zID8gb3B0aW9ucy5jb21tZW50cyA6ICdleGNsYW1hdGlvbic7XG5cbiAgICBpZiAodHlwZW9mIGNvbW1lbnRzID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgY29tbWVudHMgPSBjb21tZW50cyA/ICdleGNsYW1hdGlvbicgOiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNvbW1lbnRzICE9PSAnZXhjbGFtYXRpb24nICYmIGNvbW1lbnRzICE9PSAnZmlyc3QtZXhjbGFtYXRpb24nKSB7XG4gICAgICAgIGNvbW1lbnRzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1lbnRzO1xufVxuXG5mdW5jdGlvbiBnZXRSZXN0cnVjdHVyZU9wdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuICdyZXN0cnVjdHVyZScgaW4gb3B0aW9ucyA/IG9wdGlvbnMucmVzdHJ1Y3R1cmUgOlxuICAgICAgICAgICAncmVzdHJ1Y3R1cmluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMucmVzdHJ1Y3R1cmluZyA6XG4gICAgICAgICAgIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdyYXBCbG9jayhibG9jaykge1xuICAgIHJldHVybiBuZXcgTGlzdCgpLmFwcGVuZERhdGEoe1xuICAgICAgICB0eXBlOiAnUnVsZScsXG4gICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgcHJlbHVkZToge1xuICAgICAgICAgICAgdHlwZTogJ1NlbGVjdG9yTGlzdCcsXG4gICAgICAgICAgICBsb2M6IG51bGwsXG4gICAgICAgICAgICBjaGlsZHJlbjogbmV3IExpc3QoKS5hcHBlbmREYXRhKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU2VsZWN0b3InLFxuICAgICAgICAgICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogbmV3IExpc3QoKS5hcHBlbmREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1R5cGVTZWxlY3RvcicsXG4gICAgICAgICAgICAgICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3gnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGJsb2NrOiBibG9ja1xuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvbXByZXNzKGFzdCwgb3B0aW9ucykge1xuICAgIGFzdCA9IGFzdCB8fCB7IHR5cGU6ICdTdHlsZVNoZWV0JywgbG9jOiBudWxsLCBjaGlsZHJlbjogbmV3IExpc3QoKSB9O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgdmFyIGNvbXByZXNzT3B0aW9ucyA9IHtcbiAgICAgICAgbG9nZ2VyOiB0eXBlb2Ygb3B0aW9ucy5sb2dnZXIgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmxvZ2dlciA6IGZ1bmN0aW9uKCkge30sXG4gICAgICAgIHJlc3RydWN0dXJpbmc6IGdldFJlc3RydWN0dXJlT3B0aW9uKG9wdGlvbnMpLFxuICAgICAgICBmb3JjZU1lZGlhTWVyZ2U6IEJvb2xlYW4ob3B0aW9ucy5mb3JjZU1lZGlhTWVyZ2UpLFxuICAgICAgICB1c2FnZTogb3B0aW9ucy51c2FnZSA/IHVzYWdlVXRpbHMuYnVpbGRJbmRleChvcHRpb25zLnVzYWdlKSA6IGZhbHNlXG4gICAgfTtcbiAgICB2YXIgc3BlY2lhbENvbW1lbnRzID0gZ2V0Q29tbWVudHNPcHRpb24ob3B0aW9ucyk7XG4gICAgdmFyIGZpcnN0QXRydWxlc0FsbG93ZWQgPSB0cnVlO1xuICAgIHZhciBpbnB1dDtcbiAgICB2YXIgb3V0cHV0ID0gbmV3IExpc3QoKTtcbiAgICB2YXIgY2h1bms7XG4gICAgdmFyIGNodW5rTnVtID0gMTtcbiAgICB2YXIgY2h1bmtDaGlsZHJlbjtcblxuICAgIGlmIChvcHRpb25zLmNsb25lKSB7XG4gICAgICAgIGFzdCA9IGNsb25lKGFzdCk7XG4gICAgfVxuXG4gICAgaWYgKGFzdC50eXBlID09PSAnU3R5bGVTaGVldCcpIHtcbiAgICAgICAgaW5wdXQgPSBhc3QuY2hpbGRyZW47XG4gICAgICAgIGFzdC5jaGlsZHJlbiA9IG91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dCA9IHdyYXBCbG9jayhhc3QpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgICAgY2h1bmsgPSByZWFkQ2h1bmsoaW5wdXQsIEJvb2xlYW4oc3BlY2lhbENvbW1lbnRzKSk7XG4gICAgICAgIGNvbXByZXNzQ2h1bmsoY2h1bmsuc3R5bGVzaGVldCwgZmlyc3RBdHJ1bGVzQWxsb3dlZCwgY2h1bmtOdW0rKywgY29tcHJlc3NPcHRpb25zKTtcbiAgICAgICAgY2h1bmtDaGlsZHJlbiA9IGNodW5rLnN0eWxlc2hlZXQuY2hpbGRyZW47XG5cbiAgICAgICAgaWYgKGNodW5rLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGFkZCBcXG4gYmVmb3JlIGNvbW1lbnQgaWYgdGhlcmUgaXMgYW5vdGhlciBjb250ZW50IGluIG91dHB1dFxuICAgICAgICAgICAgaWYgKCFvdXRwdXQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0Lmluc2VydChMaXN0LmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUmF3JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdcXG4nXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXRwdXQuaW5zZXJ0KExpc3QuY3JlYXRlSXRlbShjaHVuay5jb21tZW50KSk7XG5cbiAgICAgICAgICAgIC8vIGFkZCBcXG4gYWZ0ZXIgY29tbWVudCBpZiBjaHVuayBpcyBub3QgZW1wdHlcbiAgICAgICAgICAgIGlmICghY2h1bmtDaGlsZHJlbi5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQuaW5zZXJ0KExpc3QuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSYXcnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcbidcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlyc3RBdHJ1bGVzQWxsb3dlZCAmJiAhY2h1bmtDaGlsZHJlbi5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHZhciBsYXN0UnVsZSA9IGNodW5rQ2hpbGRyZW4ubGFzdCgpO1xuXG4gICAgICAgICAgICBpZiAobGFzdFJ1bGUudHlwZSAhPT0gJ0F0cnVsZScgfHxcbiAgICAgICAgICAgICAgIChsYXN0UnVsZS5uYW1lICE9PSAnaW1wb3J0JyAmJiBsYXN0UnVsZS5uYW1lICE9PSAnY2hhcnNldCcpKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RBdHJ1bGVzQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwZWNpYWxDb21tZW50cyAhPT0gJ2V4Y2xhbWF0aW9uJykge1xuICAgICAgICAgICAgc3BlY2lhbENvbW1lbnRzID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQuYXBwZW5kTGlzdChjaHVua0NoaWxkcmVuKTtcbiAgICB9IHdoaWxlICghaW5wdXQuaXNFbXB0eSgpKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFzdDogYXN0XG4gICAgfTtcbn07XG4iLCJ2YXIgY3NzdHJlZSA9IHJlcXVpcmUoJ2Nzcy10cmVlJyk7XG52YXIgcGFyc2UgPSBjc3N0cmVlLnBhcnNlO1xudmFyIGNvbXByZXNzID0gcmVxdWlyZSgnLi9jb21wcmVzcycpO1xudmFyIGdlbmVyYXRlID0gY3NzdHJlZS5nZW5lcmF0ZTtcblxuZnVuY3Rpb24gZGVidWdPdXRwdXQobmFtZSwgb3B0aW9ucywgc3RhcnRUaW1lLCBkYXRhKSB7XG4gICAgaWYgKG9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignIyMgJyArIG5hbWUgKyAnIGRvbmUgaW4gJWQgbXNcXG4nLCBEYXRlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdExvZ2dlcihsZXZlbCkge1xuICAgIHZhciBsYXN0RGVidWc7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gbG9nZ2VyKHRpdGxlLCBhc3QpIHtcbiAgICAgICAgdmFyIGxpbmUgPSB0aXRsZTtcblxuICAgICAgICBpZiAoYXN0KSB7XG4gICAgICAgICAgICBsaW5lID0gJ1snICsgKChEYXRlLm5vdygpIC0gbGFzdERlYnVnKSAvIDEwMDApLnRvRml4ZWQoMykgKyAnc10gJyArIGxpbmU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGV2ZWwgPiAxICYmIGFzdCkge1xuICAgICAgICAgICAgdmFyIGNzcyA9IGdlbmVyYXRlKGFzdCk7XG5cbiAgICAgICAgICAgIC8vIHdoZW4gbGV2ZWwgMiwgbGltaXQgY3NzIHRvIDI1NiBzeW1ib2xzXG4gICAgICAgICAgICBpZiAobGV2ZWwgPT09IDIgJiYgY3NzLmxlbmd0aCA+IDI1Nikge1xuICAgICAgICAgICAgICAgIGNzcyA9IGNzcy5zdWJzdHIoMCwgMjU2KSArICcuLi4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lICs9ICdcXG4gICcgKyBjc3MgKyAnXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IobGluZSk7XG4gICAgICAgIGxhc3REZWJ1ZyA9IERhdGUubm93KCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29weShvYmopIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb21wcmVzc09wdGlvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBjb3B5KG9wdGlvbnMpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmxvZ2dlciAhPT0gJ2Z1bmN0aW9uJyAmJiBvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIG9wdGlvbnMubG9nZ2VyID0gY3JlYXRlRGVmYXVsdExvZ2dlcihvcHRpb25zLmRlYnVnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gcnVuSGFuZGxlcihhc3QsIG9wdGlvbnMsIGhhbmRsZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICBoYW5kbGVycyA9IFtoYW5kbGVyc107XG4gICAgfVxuXG4gICAgaGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbihmbikge1xuICAgICAgICBmbihhc3QsIG9wdGlvbnMpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBtaW5pZnkoY29udGV4dCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB2YXIgZmlsZW5hbWUgPSBvcHRpb25zLmZpbGVuYW1lIHx8ICc8dW5rbm93bj4nO1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICAvLyBwYXJzZVxuICAgIHZhciBhc3QgPSBkZWJ1Z091dHB1dCgncGFyc2luZycsIG9wdGlvbnMsIERhdGUubm93KCksXG4gICAgICAgIHBhcnNlKHNvdXJjZSwge1xuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgIHBvc2l0aW9uczogQm9vbGVhbihvcHRpb25zLnNvdXJjZU1hcClcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gYmVmb3JlIGNvbXByZXNzIGhhbmRsZXJzXG4gICAgaWYgKG9wdGlvbnMuYmVmb3JlQ29tcHJlc3MpIHtcbiAgICAgICAgZGVidWdPdXRwdXQoJ2JlZm9yZUNvbXByZXNzJywgb3B0aW9ucywgRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJ1bkhhbmRsZXIoYXN0LCBvcHRpb25zLCBvcHRpb25zLmJlZm9yZUNvbXByZXNzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzXG4gICAgdmFyIGNvbXByZXNzUmVzdWx0ID0gZGVidWdPdXRwdXQoJ2NvbXByZXNzJywgb3B0aW9ucywgRGF0ZS5ub3coKSxcbiAgICAgICAgY29tcHJlc3MoYXN0LCBidWlsZENvbXByZXNzT3B0aW9ucyhvcHRpb25zKSlcbiAgICApO1xuXG4gICAgLy8gYWZ0ZXIgY29tcHJlc3MgaGFuZGxlcnNcbiAgICBpZiAob3B0aW9ucy5hZnRlckNvbXByZXNzKSB7XG4gICAgICAgIGRlYnVnT3V0cHV0KCdhZnRlckNvbXByZXNzJywgb3B0aW9ucywgRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJ1bkhhbmRsZXIoY29tcHJlc3NSZXN1bHQsIG9wdGlvbnMsIG9wdGlvbnMuYWZ0ZXJDb21wcmVzcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZW5lcmF0ZVxuICAgIGlmIChvcHRpb25zLnNvdXJjZU1hcCkge1xuICAgICAgICByZXN1bHQgPSBkZWJ1Z091dHB1dCgnZ2VuZXJhdGUoc291cmNlTWFwOiB0cnVlKScsIG9wdGlvbnMsIERhdGUubm93KCksIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0bXAgPSBnZW5lcmF0ZShjb21wcmVzc1Jlc3VsdC5hc3QsIHsgc291cmNlTWFwOiB0cnVlIH0pO1xuICAgICAgICAgICAgdG1wLm1hcC5fZmlsZSA9IGZpbGVuYW1lOyAvLyBzaW5jZSBvdGhlciB0b29scyBjYW4gcmVsYXkgb24gZmlsZSBpbiBzb3VyY2UgbWFwIHRyYW5zZm9ybSBjaGFpblxuICAgICAgICAgICAgdG1wLm1hcC5zZXRTb3VyY2VDb250ZW50KGZpbGVuYW1lLCBzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRtcDtcbiAgICAgICAgfSkoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gZGVidWdPdXRwdXQoJ2dlbmVyYXRlJywgb3B0aW9ucywgRGF0ZS5ub3coKSwge1xuICAgICAgICAgICAgY3NzOiBnZW5lcmF0ZShjb21wcmVzc1Jlc3VsdC5hc3QpLFxuICAgICAgICAgICAgbWFwOiBudWxsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1pbmlmeVN0eWxlc2hlZXQoc291cmNlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG1pbmlmeSgnc3R5bGVzaGVldCcsIHNvdXJjZSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIG1pbmlmeUJsb2NrKHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBtaW5pZnkoJ2RlY2xhcmF0aW9uTGlzdCcsIHNvdXJjZSwgb3B0aW9ucyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHZlcnNpb246IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb24sXG5cbiAgICAvLyBtYWluIG1ldGhvZHNcbiAgICBtaW5pZnk6IG1pbmlmeVN0eWxlc2hlZXQsXG4gICAgbWluaWZ5QmxvY2s6IG1pbmlmeUJsb2NrLFxuXG4gICAgLy8gY29tcHJlc3MgYW4gQVNUXG4gICAgY29tcHJlc3M6IGNvbXByZXNzLFxuXG4gICAgLy8gY3NzIHN5bnRheCBwYXJzZXIvd2Fsa2Vycy9nZW5lcmF0b3IvZXRjXG4gICAgc3ludGF4OiBjc3N0cmVlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAnZnVsbCc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdtaW5pZmllcyBzdHlsZXMgYW5kIHJlbW92ZXMgdW51c2VkIHN0eWxlcyBiYXNlZCBvbiB1c2FnZSBkYXRhJztcblxuZXhwb3J0cy5wYXJhbXMgPSB7XG4gICAgLy8gLi4uIENTU08gb3B0aW9ucyBnb2VzIGhlcmVcblxuICAgIC8vIGFkZGl0aW9uYWwgXG4gICAgdXNhZ2U6IHtcbiAgICAgICAgZm9yY2U6IGZhbHNlLCAgLy8gZm9yY2UgdG8gdXNlIHVzYWdlIGRhdGEgZXZlbiBpZiBpdCB1bnNhZmUgKGRvY3VtZW50IGNvbnRhaW5zIDxzY3JpcHQ+IG9yIG9uKiBhdHRyaWJ1dGVzKVxuICAgICAgICBpZHM6IHRydWUsXG4gICAgICAgIGNsYXNzZXM6IHRydWUsXG4gICAgICAgIHRhZ3M6IHRydWVcbiAgICB9XG59O1xuXG52YXIgY3NzbyA9IHJlcXVpcmUoJ2Nzc28nKTtcblxuLyoqXG4gKiBNaW5pZmllcyBzdHlsZXMgKDxzdHlsZT4gZWxlbWVudCArIHN0eWxlIGF0dHJpYnV0ZSkgdXNpbmcgQ1NTT1xuICpcbiAqIEBhdXRob3Igc3RyYXJzaXMgPHN0cmFyc2lzQGdtYWlsLmNvbT5cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGFzdCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgdmFyIG1pbmlmeU9wdGlvbnNGb3JTdHlsZXNoZWV0ID0gY2xvbmVPYmplY3Qob3B0aW9ucyk7XG4gICAgdmFyIG1pbmlmeU9wdGlvbnNGb3JBdHRyaWJ1dGUgPSBjbG9uZU9iamVjdChvcHRpb25zKTtcbiAgICB2YXIgZWxlbXMgPSBmaW5kU3R5bGVFbGVtcyhhc3QpO1xuXG4gICAgbWluaWZ5T3B0aW9uc0ZvclN0eWxlc2hlZXQudXNhZ2UgPSBjb2xsZWN0VXNhZ2VEYXRhKGFzdCwgb3B0aW9ucyk7XG4gICAgbWluaWZ5T3B0aW9uc0ZvckF0dHJpYnV0ZS51c2FnZSA9IG51bGw7XG5cbiAgICBlbGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgICAgaWYgKGVsZW0uaXNFbGVtKCdzdHlsZScpKSB7XG4gICAgICAgICAgICAvLyA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgICAgIHZhciBzdHlsZUNzcyA9IGVsZW0uY29udGVudFswXS50ZXh0IHx8IGVsZW0uY29udGVudFswXS5jZGF0YSB8fCBbXTtcbiAgICAgICAgICAgIHZhciBEQVRBID0gc3R5bGVDc3MuaW5kZXhPZignPicpID49IDAgfHwgc3R5bGVDc3MuaW5kZXhPZignPCcpID49IDAgPyAnY2RhdGEnIDogJ3RleHQnO1xuXG4gICAgICAgICAgICBlbGVtLmNvbnRlbnRbMF1bREFUQV0gPSBjc3NvLm1pbmlmeShzdHlsZUNzcywgbWluaWZ5T3B0aW9uc0ZvclN0eWxlc2hlZXQpLmNzcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0eWxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgdmFyIGVsZW1TdHlsZSA9IGVsZW0uYXR0cignc3R5bGUnKS52YWx1ZTtcblxuICAgICAgICAgICAgZWxlbS5hdHRyKCdzdHlsZScpLnZhbHVlID0gY3Nzby5taW5pZnlCbG9jayhlbGVtU3R5bGUsIG1pbmlmeU9wdGlvbnNGb3JBdHRyaWJ1dGUpLmNzcztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFzdDtcbn07XG5cbmZ1bmN0aW9uIGNsb25lT2JqZWN0KG9iaikge1xuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmaW5kU3R5bGVFbGVtcyhhc3QpIHtcblxuICAgIGZ1bmN0aW9uIHdhbGsoaXRlbXMsIHN0eWxlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXMuY29udGVudFtpXTtcblxuICAgICAgICAgICAgLy8gZ28gZGVlcGVyXG4gICAgICAgICAgICBpZiAoaXRlbS5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgd2FsayhpdGVtLCBzdHlsZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXRlbS5pc0VsZW0oJ3N0eWxlJykgJiYgIWl0ZW0uaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaXNFbGVtKCkgJiYgaXRlbS5oYXNBdHRyKCdzdHlsZScpKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R5bGVzO1xuICAgIH1cblxuICAgIHJldHVybiB3YWxrKGFzdCwgW10pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRGaWx0ZXIob3B0aW9ucywgbmFtZSkge1xuICAgIGlmICgndXNhZ2UnIGluIG9wdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVzYWdlICYmIG5hbWUgaW4gb3B0aW9ucy51c2FnZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJvb2xlYW4ob3B0aW9ucy51c2FnZSAmJiBvcHRpb25zLnVzYWdlW25hbWVdKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFVzYWdlRGF0YShhc3QsIG9wdGlvbnMpIHtcblxuICAgIGZ1bmN0aW9uIHdhbGsoaXRlbXMsIHVzYWdlRGF0YSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXMuY29udGVudFtpXTtcblxuICAgICAgICAgICAgLy8gZ28gZGVlcGVyXG4gICAgICAgICAgICBpZiAoaXRlbS5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgd2FsayhpdGVtLCB1c2FnZURhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXRlbS5pc0VsZW0oJ3NjcmlwdCcpKSB7XG4gICAgICAgICAgICAgICAgc2FmZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXRlbS5pc0VsZW0oKSkge1xuICAgICAgICAgICAgICAgIHVzYWdlRGF0YS50YWdzW2l0ZW0uZWxlbV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaGFzQXR0cignaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICB1c2FnZURhdGEuaWRzW2l0ZW0uYXR0cignaWQnKS52YWx1ZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmhhc0F0dHIoJ2NsYXNzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hdHRyKCdjbGFzcycpLnZhbHVlLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKS5zcGxpdCgvXFxzKy8pLmZvckVhY2goZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZURhdGEuY2xhc3Nlc1tjbGFzc05hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uYXR0cnMgJiYgT2JqZWN0LmtleXMoaXRlbS5hdHRycykuc29tZShmdW5jdGlvbihuYW1lKSB7IHJldHVybiAvXm9uL2kudGVzdChuYW1lKTsgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1c2FnZURhdGE7XG4gICAgfVxuXG4gICAgdmFyIHNhZmUgPSB0cnVlO1xuICAgIHZhciB1c2FnZURhdGEgPSB7fTtcbiAgICB2YXIgaGFzRGF0YSA9IGZhbHNlO1xuICAgIHZhciByYXdEYXRhID0gd2Fsayhhc3QsIHtcbiAgICAgICAgaWRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICBjbGFzc2VzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICB0YWdzOiBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgfSk7XG5cbiAgICBpZiAoIXNhZmUgJiYgb3B0aW9ucy51c2FnZSAmJiBvcHRpb25zLnVzYWdlLmZvcmNlKSB7XG4gICAgICAgIHNhZmUgPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiByYXdEYXRhKSB7XG4gICAgICAgIGlmIChzaG91bGRGaWx0ZXIob3B0aW9ucywga2V5KSkge1xuICAgICAgICAgICAgdXNhZ2VEYXRhW2tleV0gPSBPYmplY3Qua2V5cyhyYXdEYXRhW2tleV0pO1xuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2FmZSAmJiBoYXNEYXRhID8gdXNhZ2VEYXRhIDogbnVsbDtcbn1cbiIsIi8qIGpzaGludCBxdW90bWFyazogZmFsc2UgKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnY29udmVydHMgc3R5bGUgdG8gYXR0cmlidXRlcyc7XG5cbnZhciBzdHlsaW5nUHJvcHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9ucycpLmF0dHJzR3JvdXBzLnByZXNlbnRhdGlvbixcbiAgICByRXNjYXBlID0gJ1xcXFxcXFxcKD86WzAtOWEtZl17MSw2fVxcXFxzP3xcXFxcclxcXFxufC4pJywgICAgICAgICAgICAgICAgIC8vIExpa2UgXFxcIiBvciBcXDIwNTEuIENvZGUgcG9pbnRzIGNvbnN1bWUgb25lIHNwYWNlLlxuICAgIHJBdHRyID0gJ1xcXFxzKignICsgZygnW146O1xcXFxcXFxcXScsIHJFc2NhcGUpICsgJyo/KVxcXFxzKicsICAgICAgICAgIC8vIGF0dHJpYnV0ZSBuYW1lIGxpa2Ug4oCYZmlsbOKAmVxuICAgIHJTaW5nbGVRdW90ZXMgPSBcIicoPzpbXidcXFxcblxcXFxyXFxcXFxcXFxdfFwiICsgckVzY2FwZSArIFwiKSo/KD86J3wkKVwiLCAvLyBzdHJpbmcgaW4gc2luZ2xlIHF1b3RlczogJ3NtdGgnXG4gICAgclF1b3RlcyA9ICdcIig/OlteXCJcXFxcblxcXFxyXFxcXFxcXFxdfCcgKyByRXNjYXBlICsgJykqPyg/OlwifCQpJywgICAgICAgLy8gc3RyaW5nIGluIGRvdWJsZSBxdW90ZXM6IFwic210aFwiXG4gICAgclF1b3RlZFN0cmluZyA9IG5ldyBSZWdFeHAoJ14nICsgZyhyU2luZ2xlUXVvdGVzLCByUXVvdGVzKSArICckJyksXG5cbiAgICAvLyBQYXJlbnRoZXNlcywgRS5nLjogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPLi4uKS5cbiAgICAvLyAnOicgYW5kICc7JyBpbnNpZGUgb2YgaXQgc2hvdWxkIGJlIHRocmVhdGVkIGFzIGlzLiAoSnVzdCBsaWtlIGluIHN0cmluZ3MuKVxuICAgIHJQYXJlbnRoZXNpcyA9ICdcXFxcKCcgKyBnKCdbXlxcJ1wiKClcXFxcXFxcXF0rJywgckVzY2FwZSwgclNpbmdsZVF1b3RlcywgclF1b3RlcykgKyAnKj8nICsgJ1xcXFwpJyxcblxuICAgIC8vIFRoZSB2YWx1ZS4gSXQgY2FuIGhhdmUgc3RyaW5ncyBhbmQgcGFyZW50aGVzZXMgKHNlZSBhYm92ZSkuIEZhbGxiYWNrcyB0byBhbnl0aGluZyBpbiBjYXNlIG9mIHVuZXhwZWN0ZWQgaW5wdXQuXG4gICAgclZhbHVlID0gJ1xcXFxzKignICsgZygnW15cXCdcIigpO1xcXFxcXFxcXSs/JywgckVzY2FwZSwgclNpbmdsZVF1b3RlcywgclF1b3RlcywgclBhcmVudGhlc2lzLCAnW147XSo/JykgKyAnKj8nICsgJyknLFxuXG4gICAgLy8gRW5kIG9mIGRlY2xhcmF0aW9uLiBTcGFjZXMgb3V0c2lkZSBvZiBjYXB0dXJpbmcgZ3JvdXBzIGhlbHAgdG8gZG8gbmF0dXJhbCB0cmltbWluZy5cbiAgICByRGVjbEVuZCA9ICdcXFxccyooPzo7XFxcXHMqfCQpJyxcblxuICAgIC8vIEZpbmFsIFJlZ0V4cCB0byBwYXJzZSBDU1MgZGVjbGFyYXRpb25zLlxuICAgIHJlZ0RlY2xhcmF0aW9uQmxvY2sgPSBuZXcgUmVnRXhwKHJBdHRyICsgJzonICsgclZhbHVlICsgckRlY2xFbmQsICdpZycpLFxuXG4gICAgLy8gQ29tbWVudHMgZXhwcmVzc2lvbi4gSG9ub3JzIGVzY2FwZSBzZXF1ZW5jZXMgYW5kIHN0cmluZ3MuXG4gICAgcmVnU3RyaXBDb21tZW50cyA9IG5ldyBSZWdFeHAoZyhyRXNjYXBlLCByU2luZ2xlUXVvdGVzLCByUXVvdGVzLCAnL1xcXFwqW15dKj9cXFxcKi8nKSwgJ2lnJyk7XG5cbi8qKlxuICogQ29udmVydCBzdHlsZSBpbiBhdHRyaWJ1dGVzLiBDbGVhbnVwcyBjb21tZW50cyBhbmQgaWxsZWdhbCBkZWNsYXJhdGlvbnMgKHdpdGhvdXQgY29sb24pIGFzIGEgc2lkZSBlZmZlY3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxnIHN0eWxlPVwiZmlsbDojMDAwOyBjb2xvcjogI2ZmZjtcIj5cbiAqICAgICAgICAgICAgIOKsh1xuICogPGcgZmlsbD1cIiMwMDBcIiBjb2xvcj1cIiNmZmZcIj5cbiAqXG4gKiBAZXhhbXBsZVxuICogPGcgc3R5bGU9XCJmaWxsOiMwMDA7IGNvbG9yOiAjZmZmOyAtd2Via2l0LWJsYWg6IGJsYWhcIj5cbiAqICAgICAgICAgICAgIOKsh1xuICogPGcgZmlsbD1cIiMwMDBcIiBjb2xvcj1cIiNmZmZcIiBzdHlsZT1cIi13ZWJraXQtYmxhaDogYmxhaFwiPlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAvKiBqc2hpbnQgYm9zczogdHJ1ZSAqL1xuXG4gICAgaWYgKGl0ZW0uZWxlbSAmJiBpdGVtLmhhc0F0dHIoJ3N0eWxlJykpIHtcbiAgICAgICAgICAgIC8vIFsnb3BhY2l0eTogMScsICdjb2xvcjogIzAwMCddXG4gICAgICAgIHZhciBzdHlsZVZhbHVlID0gaXRlbS5hdHRyKCdzdHlsZScpLnZhbHVlLFxuICAgICAgICAgICAgc3R5bGVzID0gW10sXG4gICAgICAgICAgICBhdHRycyA9IHt9O1xuXG4gICAgICAgIC8vIFN0cmlwIENTUyBjb21tZW50cyBwcmVzZXJ2aW5nIGVzY2FwZSBzZXF1ZW5jZXMgYW5kIHN0cmluZ3MuXG4gICAgICAgIHN0eWxlVmFsdWUgPSBzdHlsZVZhbHVlLnJlcGxhY2UocmVnU3RyaXBDb21tZW50cywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFswXSA9PSAnLycgPyAnJyA6XG4gICAgICAgICAgICAgICAgbWF0Y2hbMF0gPT0gJ1xcXFwnICYmIC9bLWctel0vaS50ZXN0KG1hdGNoWzFdKSA/IG1hdGNoWzFdIDogbWF0Y2g7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlZ0RlY2xhcmF0aW9uQmxvY2subGFzdEluZGV4ID0gMDtcbiAgICAgICAgZm9yICh2YXIgcnVsZTsgcnVsZSA9IHJlZ0RlY2xhcmF0aW9uQmxvY2suZXhlYyhzdHlsZVZhbHVlKTspIHtcbiAgICAgICAgICAgIHN0eWxlcy5wdXNoKFtydWxlWzFdLCBydWxlWzJdXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGVzLmxlbmd0aCkge1xuXG4gICAgICAgICAgICBzdHlsZXMgPSBzdHlsZXMuZmlsdGVyKGZ1bmN0aW9uKHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gc3R5bGVbMF0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHN0eWxlWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyUXVvdGVkU3RyaW5nLnRlc3QodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsaW5nUHJvcHMuaW5kZXhPZihwcm9wKSA+IC0xKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzW3Byb3BdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbDogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0uYXR0cnMsIGF0dHJzKTtcblxuICAgICAgICAgICAgaWYgKHN0eWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmF0dHIoJ3N0eWxlJykudmFsdWUgPSBzdHlsZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbihkZWNsYXJhdGlvbikgeyByZXR1cm4gZGVjbGFyYXRpb24uam9pbignOicpIH0pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCc7Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9XG5cbn07XG5cbmZ1bmN0aW9uIGcoKSB7XG4gICAgcmV0dXJuICcoPzonICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsICd8JykgKyAnKSc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdmdWxsJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgdW51c2VkIElEcyBhbmQgbWluaWZpZXMgdXNlZCc7XG5cbmV4cG9ydHMucGFyYW1zID0ge1xuICAgIHJlbW92ZTogdHJ1ZSxcbiAgICBtaW5pZnk6IHRydWUsXG4gICAgcHJlZml4OiAnJyxcbiAgICBwcmVzZXJ2ZTogW10sXG4gICAgZm9yY2U6IGZhbHNlXG59O1xuXG52YXIgcmVmZXJlbmNlc1Byb3BzID0gbmV3IFNldChyZXF1aXJlKCcuL19jb2xsZWN0aW9ucycpLnJlZmVyZW5jZXNQcm9wcyksXG4gICAgcmVnUmVmZXJlbmNlc1VybCA9IC9cXGJ1cmxcXCgoXCJ8Jyk/IyguKz8pXFwxXFwpLyxcbiAgICByZWdSZWZlcmVuY2VzSHJlZiA9IC9eIyguKz8pJC8sXG4gICAgcmVnUmVmZXJlbmNlc0JlZ2luID0gLyhcXHcrKVxcLi8sXG4gICAgc3R5bGVPclNjcmlwdCA9IFsnc3R5bGUnLCAnc2NyaXB0J10sXG4gICAgZ2VuZXJhdGVJRGNoYXJzID0gW1xuICAgICAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JyxcbiAgICAgICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWidcbiAgICBdLFxuICAgIG1heElEaW5kZXggPSBnZW5lcmF0ZUlEY2hhcnMubGVuZ3RoIC0gMTtcblxuLyoqXG4gKiBSZW1vdmUgdW51c2VkIGFuZCBtaW5pZnkgdXNlZCBJRHNcbiAqIChvbmx5IGlmIHRoZXJlIGFyZSBubyBhbnkgPHN0eWxlPiBvciA8c2NyaXB0PikuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGRhdGEsIHBhcmFtcykge1xuICAgIHZhciBjdXJyZW50SUQsXG4gICAgICAgIGN1cnJlbnRJRHN0cmluZyxcbiAgICAgICAgSURzID0gbmV3IE1hcCgpLFxuICAgICAgICByZWZlcmVuY2VzSURzID0gbmV3IE1hcCgpLFxuICAgICAgICBoYXNTdHlsZU9yU2NyaXB0ID0gZmFsc2UsXG4gICAgICAgIHByZXNlcnZlSURzID0gbmV3IFNldChBcnJheS5pc0FycmF5KHBhcmFtcy5wcmVzZXJ2ZSkgPyBwYXJhbXMucHJlc2VydmUgOiBwYXJhbXMucHJlc2VydmUgPyBbcGFyYW1zLnByZXNlcnZlXSA6IFtdKSxcbiAgICAgICAgaWRWYWx1ZVByZWZpeCA9ICcjJyxcbiAgICAgICAgaWRWYWx1ZVBvc3RmaXggPSAnLic7XG5cbiAgICAvKipcbiAgICAgKiBCYW5hbmFzIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gaXRlbXMgaW5wdXQgaXRlbXNcbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IGl0ZW1zXG4gICAgICovXG4gICAgZnVuY3Rpb24gbW9ua2V5cyhpdGVtcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmNvbnRlbnQubGVuZ3RoICYmICFoYXNTdHlsZU9yU2NyaXB0OyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXMuY29udGVudFtpXTtcblxuICAgICAgICAgICAgLy8gcXVpdCBpZiA8c3R5bGU+IG9mIDxzY3JpcHQ+IHByZXNlbnRzICgnZm9yY2UnIHBhcmFtIHByZXZlbnRzIHF1aXR0aW5nKVxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuZm9yY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0VsZW0oc3R5bGVPclNjcmlwdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzU3R5bGVPclNjcmlwdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEb24ndCByZW1vdmUgSURzIGlmIHRoZSB3aG9sZSBTVkcgY29uc2lzdHMgb25seSBvZiBkZWZzLlxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRWxlbSgnZGVmcycpICYmIGl0ZW0ucGFyZW50Tm9kZS5pc0VsZW0oJ3N2ZycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoYXNEZWZzT25seSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBpICsgMTsgaiA8IGl0ZW1zLmNvbnRlbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcy5jb250ZW50W2pdLmlzRWxlbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRGVmc09ubHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRGVmc09ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g4oCmYW5kIGRvbid0IHJlbW92ZSBhbnkgSUQgaWYgeWVzXG4gICAgICAgICAgICBpZiAoaXRlbS5pc0VsZW0oKSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uZWFjaEF0dHIoZnVuY3Rpb24oYXR0cikge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5LCBtYXRjaDtcblxuICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIElEc1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5uYW1lID09PSAnaWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBhdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElEcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cignaWQnKTsgLy8gcmVtb3ZlIHJlcGVhdGVkIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEcy5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZXNQcm9wcy5oYXMoYXR0ci5uYW1lKSAmJiAobWF0Y2ggPSBhdHRyLnZhbHVlLm1hdGNoKHJlZ1JlZmVyZW5jZXNVcmwpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gbWF0Y2hbMl07IC8vIHVybCgpIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5sb2NhbCA9PT0gJ2hyZWYnICYmIChtYXRjaCA9IGF0dHIudmFsdWUubWF0Y2gocmVnUmVmZXJlbmNlc0hyZWYpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5uYW1lID09PSAnYmVnaW4nICYmIChtYXRjaCA9IGF0dHIudmFsdWUubWF0Y2gocmVnUmVmZXJlbmNlc0JlZ2luKSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBtYXRjaFsxXTsgLy8gaHJlZiByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gcmVmZXJlbmNlc0lEcy5nZXQoa2V5KSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlc0lEcy5zZXQoa2V5LCByZWYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBnbyBkZWVwZXJcbiAgICAgICAgICAgIGlmIChpdGVtLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBtb25rZXlzKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBkYXRhID0gbW9ua2V5cyhkYXRhKTtcblxuICAgIGlmIChoYXNTdHlsZU9yU2NyaXB0KSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGZvciAodmFyIHJlZiBvZiByZWZlcmVuY2VzSURzKSB7XG4gICAgICAgIHZhciBrZXkgPSByZWZbMF07XG5cbiAgICAgICAgaWYgKElEcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgLy8gcmVwbGFjZSByZWZlcmVuY2VkIElEcyB3aXRoIHRoZSBtaW5pZmllZCBvbmVzXG4gICAgICAgICAgICBpZiAocGFyYW1zLm1pbmlmeSAmJiAhcHJlc2VydmVJRHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50SURzdHJpbmcgPSBnZXRJRHN0cmluZyhjdXJyZW50SUQgPSBnZW5lcmF0ZUlEKGN1cnJlbnRJRCksIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgSURzLmdldChrZXkpLmF0dHIoJ2lkJykudmFsdWUgPSBjdXJyZW50SURzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhdHRyIG9mIHJlZlsxXSkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyLnZhbHVlID0gYXR0ci52YWx1ZS5pbmNsdWRlcyhpZFZhbHVlUHJlZml4KSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnZhbHVlLnJlcGxhY2UoaWRWYWx1ZVByZWZpeCArIGtleSwgaWRWYWx1ZVByZWZpeCArIGN1cnJlbnRJRHN0cmluZykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci52YWx1ZS5yZXBsYWNlKGtleSArIGlkVmFsdWVQb3N0Zml4LCBjdXJyZW50SURzdHJpbmcgKyBpZFZhbHVlUG9zdGZpeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcmVtb3ZlIHJlZmVyZW5jZWQgSURzXG4gICAgICAgICAgICBJRHMuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcmVtb3ZlIG5vbi1yZWZlcmVuY2VkIElEcyBhdHRyaWJ1dGVzIGZyb20gZWxlbWVudHNcbiAgICBpZiAocGFyYW1zLnJlbW92ZSkge1xuICAgICAgICBmb3IodmFyIGtleUVsZW0gb2YgSURzKSB7XG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlSURzLmhhcyhrZXlFbGVtWzBdKSkge1xuICAgICAgICAgICAgICAgIGtleUVsZW1bMV0ucmVtb3ZlQXR0cignaWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgdW5pcXVlIG1pbmltYWwgSUQuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gW2N1cnJlbnRJRF0gY3VycmVudCBJRFxuICogQHJldHVybiB7QXJyYXl9IGdlbmVyYXRlZCBJRCBhcnJheVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKGN1cnJlbnRJRCkge1xuICAgIGlmICghY3VycmVudElEKSByZXR1cm4gWzBdO1xuXG4gICAgY3VycmVudElEW2N1cnJlbnRJRC5sZW5ndGggLSAxXSsrO1xuXG4gICAgZm9yKHZhciBpID0gY3VycmVudElELmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGN1cnJlbnRJRFtpXSA+IG1heElEaW5kZXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnRJRFtpXSA9IDA7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50SURbaSAtIDFdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50SURbaSAtIDFdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnRJRFswXSA+IG1heElEaW5kZXgpIHtcbiAgICAgICAgY3VycmVudElEWzBdID0gMDtcbiAgICAgICAgY3VycmVudElELnVuc2hpZnQoMCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50SUQ7XG59XG5cbi8qKlxuICogR2V0IHN0cmluZyBmcm9tIGdlbmVyYXRlZCBJRCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnIgaW5wdXQgSUQgYXJyYXlcbiAqIEByZXR1cm4ge1N0cmluZ30gb3V0cHV0IElEIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRJRHN0cmluZyhhcnIsIHBhcmFtcykge1xuICAgIHZhciBzdHIgPSBwYXJhbXMucHJlZml4O1xuICAgIHJldHVybiBzdHIgKyBhcnIubWFwKGkgPT4gZ2VuZXJhdGVJRGNoYXJzW2ldKS5qb2luKCcnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAncmVtb3ZlcyBlbGVtZW50cyBpbiA8ZGVmcz4gd2l0aG91dCBpZCc7XG5cbnZhciBub25SZW5kZXJpbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9ucycpLmVsZW1zR3JvdXBzLm5vblJlbmRlcmluZztcblxuLyoqXG4gKiBSZW1vdmVzIGNvbnRlbnQgb2YgZGVmcyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZW4ndCByZW5kZXJlZCBkaXJlY3RseSB3aXRob3V0IGlkcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgTGV2IFNvbG50c2V2XG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICBpZiAoaXRlbS5pc0VsZW0oJ2RlZnMnKSkge1xuXG4gICAgICAgIGlmIChpdGVtLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGl0ZW0uY29udGVudCA9IGdldFVzZWZ1bEl0ZW1zKGl0ZW0sIFtdKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGl0ZW0uaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7XG5cbiAgICB9IGVsc2UgaWYgKGl0ZW0uaXNFbGVtKG5vblJlbmRlcmluZykgJiYgIWl0ZW0uaGFzQXR0cignaWQnKSkge1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIH1cblxufTtcblxuZnVuY3Rpb24gZ2V0VXNlZnVsSXRlbXMoaXRlbSwgdXNlZnVsSXRlbXMpIHtcblxuICAgIGl0ZW0uY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZC5oYXNBdHRyKCdpZCcpIHx8IGNoaWxkLmlzRWxlbSgnc3R5bGUnKSkge1xuXG4gICAgICAgICAgICB1c2VmdWxJdGVtcy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUgPSBpdGVtO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoIWNoaWxkLmlzRW1wdHkoKSkge1xuXG4gICAgICAgICAgICBjaGlsZC5jb250ZW50ID0gZ2V0VXNlZnVsSXRlbXMoY2hpbGQsIHVzZWZ1bEl0ZW1zKTtcblxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXNlZnVsSXRlbXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ2NvbnZlcnRzIGNvbG9yczogcmdiKCkgdG8gI3JyZ2diYiBhbmQgI3JyZ2diYiB0byAjcmdiJztcblxuZXhwb3J0cy5wYXJhbXMgPSB7XG4gICAgY3VycmVudENvbG9yOiBmYWxzZSxcbiAgICBuYW1lczJoZXg6IHRydWUsXG4gICAgcmdiMmhleDogdHJ1ZSxcbiAgICBzaG9ydGhleDogdHJ1ZSxcbiAgICBzaG9ydG5hbWU6IHRydWVcbn07XG5cbnZhciBjb2xsZWN0aW9ucyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb25zJyksXG4gICAgck51bWJlciA9ICcoWystXT8oPzpcXFxcZCpcXFxcLlxcXFxkK3xcXFxcZCtcXFxcLj8pJT8pJyxcbiAgICByQ29tbWEgPSAnXFxcXHMqLFxcXFxzKicsXG4gICAgcmVnUkdCID0gbmV3IFJlZ0V4cCgnXnJnYlxcXFwoXFxcXHMqJyArIHJOdW1iZXIgKyByQ29tbWEgKyByTnVtYmVyICsgckNvbW1hICsgck51bWJlciArICdcXFxccypcXFxcKSQnKSxcbiAgICByZWdIRVggPSAvXlxcIygoW2EtZkEtRjAtOV0pXFwyKXszfSQvLFxuICAgIG5vbmUgPSAvXFxibm9uZVxcYi9pO1xuXG4vKipcbiAqIENvbnZlcnQgZGlmZmVyZW50IGNvbG9ycyBmb3JtYXRzIGluIGVsZW1lbnQgYXR0cmlidXRlcyB0byBoZXguXG4gKlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvdHlwZXMuaHRtbCNEYXRhVHlwZUNvbG9yXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zaW5nbGUtcGFnZS5odG1sI3R5cGVzLUNvbG9yS2V5d29yZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogQ29udmVydCBjb2xvciBuYW1lIGtleXdvcmQgdG8gbG9uZyBoZXg6XG4gKiBmdWNoc2lhIOKeoSAjZmYwMGZmXG4gKlxuICogQ29udmVydCByZ2IoKSB0byBsb25nIGhleDpcbiAqIHJnYigyNTUsIDAsIDI1NSkg4p6hICNmZjAwZmZcbiAqIHJnYig1MCUsIDEwMCwgMTAwJSkg4p6hICM3ZjY0ZmZcbiAqXG4gKiBDb252ZXJ0IGxvbmcgaGV4IHRvIHNob3J0IGhleDpcbiAqICNhYWJiY2Mg4p6hICNhYmNcbiAqXG4gKiBDb252ZXJ0IGhleCB0byBzaG9ydCBuYW1lXG4gKiAjMDAwMDgwIOKeoSBuYXZ5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtLCBwYXJhbXMpIHtcblxuICAgIGlmIChpdGVtLmVsZW0pIHtcblxuICAgICAgICBpdGVtLmVhY2hBdHRyKGZ1bmN0aW9uKGF0dHIpIHtcblxuICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25zLmNvbG9yc1Byb3BzLmluZGV4T2YoYXR0ci5uYW1lKSA+IC0xKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gYXR0ci52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2g7XG5cbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGNvbG9ycyB0byBjdXJyZW50Q29sb3JcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmN1cnJlbnRDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5jdXJyZW50Q29sb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHZhbCA9PT0gcGFyYW1zLmN1cnJlbnRDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuY3VycmVudENvbG9yLmV4ZWMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gcGFyYW1zLmN1cnJlbnRDb2xvci5leGVjKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9ICF2YWwubWF0Y2gobm9uZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAnY3VycmVudENvbG9yJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgY29sb3IgbmFtZSBrZXl3b3JkIHRvIGxvbmcgaGV4XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5uYW1lczJoZXggJiYgdmFsLnRvTG93ZXJDYXNlKCkgaW4gY29sbGVjdGlvbnMuY29sb3JzTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gY29sbGVjdGlvbnMuY29sb3JzTmFtZXNbdmFsLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgcmdiKCkgdG8gbG9uZyBoZXhcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnJnYjJoZXggJiYgKG1hdGNoID0gdmFsLm1hdGNoKHJlZ1JHQikpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2guc2xpY2UoMSwgNCkubWFwKGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLmluZGV4T2YoJyUnKSA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQobSkgKiAyLjU1KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG0sIDI1NSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB2YWwgPSByZ2IyaGV4KG1hdGNoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGxvbmcgaGV4IHRvIHNob3J0IGhleFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuc2hvcnRoZXggJiYgKG1hdGNoID0gdmFsLm1hdGNoKHJlZ0hFWCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9ICcjJyArIG1hdGNoWzBdWzFdICsgbWF0Y2hbMF1bM10gKyBtYXRjaFswXVs1XTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGhleCB0byBzaG9ydCBuYW1lXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5zaG9ydG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvd2VyVmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb3dlclZhbCBpbiBjb2xsZWN0aW9ucy5jb2xvcnNTaG9ydE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBjb2xsZWN0aW9ucy5jb2xvcnNTaG9ydE5hbWVzW2xvd2VyVmFsXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF0dHIudmFsdWUgPSB2YWw7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgIH1cblxufTtcblxuLyoqXG4gKiBDb252ZXJ0IFtyLCBnLCBiXSB0byAjcnJnZ2JiLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vOTgzNTM1XG4gKlxuICogQGV4YW1wbGVcbiAqIHJnYjJoZXgoWzI1NSwgMjU1LCAyNTVdKSAvLyAnI2ZmZmZmZidcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2IgW3IsIGcsIGJdXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICNycmdnYmJcbiAqXG4gKiBAYXV0aG9yIEplZCBTY2htaWR0XG4gKi9cbmZ1bmN0aW9uIHJnYjJoZXgocmdiKSB7XG4gICAgcmV0dXJuICcjJyArICgnMDAwMDAnICsgKHJnYlswXSA8PCAxNiB8IHJnYlsxXSA8PCA4IHwgcmdiWzJdKS50b1N0cmluZygxNikpLnNsaWNlKC02KS50b1VwcGVyQ2FzZSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbVJldmVyc2UnO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnbW92ZXMgZWxlbWVudHMgYXR0cmlidXRlcyB0byB0aGUgZXhpc3RpbmcgZ3JvdXAgd3JhcHBlcic7XG5cbnZhciBpbmhlcml0YWJsZUF0dHJzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbnMnKS5pbmhlcml0YWJsZUF0dHJzLFxuICAgIHBhdGhFbGVtcyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb25zLmpzJykucGF0aEVsZW1zO1xuXG4vKipcbiAqIENvbGxhcHNlIGNvbnRlbnQncyBpbnRlcnNlY3RlZCBhbmQgaW5oZXJpdGFibGVcbiAqIGF0dHJpYnV0ZXMgdG8gdGhlIGV4aXN0aW5nIGdyb3VwIHdyYXBwZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxnIGF0dHIxPVwidmFsMVwiPlxuICogICAgIDxnIGF0dHIyPVwidmFsMlwiPlxuICogICAgICAgICB0ZXh0XG4gKiAgICAgPC9nPlxuICogICAgIDxjaXJjbGUgYXR0cjI9XCJ2YWwyXCIgYXR0cjM9XCJ2YWwzXCIvPlxuICogPC9nPlxuICogICAgICAgICAgICAgIOKsh1xuICogPGcgYXR0cjE9XCJ2YWwxXCIgYXR0cjI9XCJ2YWwyXCI+XG4gKiAgICAgPGc+XG4gKiAgICAgICAgIHRleHRcbiAqICAgICA8L2c+XG4gKiAgICA8Y2lyY2xlIGF0dHIzPVwidmFsM1wiLz5cbiAqIDwvZz5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICBpZiAoaXRlbS5pc0VsZW0oJ2cnKSAmJiAhaXRlbS5pc0VtcHR5KCkgJiYgaXRlbS5jb250ZW50Lmxlbmd0aCA+IDEpIHtcblxuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0ge30sXG4gICAgICAgICAgICBoYXNUcmFuc2Zvcm0gPSBmYWxzZSxcbiAgICAgICAgICAgIGhhc0NsaXAgPSBpdGVtLmhhc0F0dHIoJ2NsaXAtcGF0aCcpIHx8IGl0ZW0uaGFzQXR0cignbWFzaycpLFxuICAgICAgICAgICAgaW50ZXJzZWN0ZWQgPSBpdGVtLmNvbnRlbnQuZXZlcnkoZnVuY3Rpb24oaW5uZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuaXNFbGVtKCkgJiYgaW5uZXIuaGFzQXR0cigpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IG1lc3Mgd2l0aCBwb3NzaWJsZSBzdHlsZXMgKGhhY2sgdW50aWwgQ1NTIHBhcnNpbmcgaXMgaW1wbGVtZW50ZWQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5oYXNBdHRyKCdjbGFzcycpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMoaW50ZXJzZWN0aW9uKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbiA9IGlubmVyLmF0dHJzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0SW5oZXJpdGFibGVBdHRycyhpbnRlcnNlY3Rpb24sIGlubmVyLmF0dHJzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3Rpb24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgYWxsUGF0aCA9IGl0ZW0uY29udGVudC5ldmVyeShmdW5jdGlvbihpbm5lcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lci5pc0VsZW0ocGF0aEVsZW1zKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbnRlcnNlY3RlZCkge1xuXG4gICAgICAgICAgICBpdGVtLmNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbihnKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIGludGVyc2VjdGlvbikge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghYWxsUGF0aCAmJiAhaGFzQ2xpcCB8fCBuYW1lICE9PSAndHJhbnNmb3JtJykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBnLnJlbW92ZUF0dHIobmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAndHJhbnNmb3JtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzVHJhbnNmb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmhhc0F0dHIoJ3RyYW5zZm9ybScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmF0dHIoJ3RyYW5zZm9ybScpLnZhbHVlICs9ICcgJyArIGludGVyc2VjdGlvbltuYW1lXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkQXR0cihpbnRlcnNlY3Rpb25bbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVHJhbnNmb3JtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkQXR0cihpbnRlcnNlY3Rpb25bbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgIH1cblxufTtcblxuLyoqXG4gKiBJbnRlcnNlY3QgaW5oZXJpdGFibGUgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBmaXJzdCBhdHRycyBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIHNlY29uZCBhdHRycyBvYmplY3RcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGludGVyc2VjdGVkIGF0dHJzIG9iamVjdFxuICovXG5mdW5jdGlvbiBpbnRlcnNlY3RJbmhlcml0YWJsZUF0dHJzKGEsIGIpIHtcblxuICAgIHZhciBjID0ge307XG5cbiAgICBmb3IgKHZhciBuIGluIGEpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYi5oYXNPd25Qcm9wZXJ0eShuKSAmJlxuICAgICAgICAgICAgaW5oZXJpdGFibGVBdHRycy5pbmRleE9mKG4pID4gLTEgJiZcbiAgICAgICAgICAgIGFbbl0ubmFtZSA9PT0gYltuXS5uYW1lICYmXG4gICAgICAgICAgICBhW25dLnZhbHVlID09PSBiW25dLnZhbHVlICYmXG4gICAgICAgICAgICBhW25dLnByZWZpeCA9PT0gYltuXS5wcmVmaXggJiZcbiAgICAgICAgICAgIGFbbl0ubG9jYWwgPT09IGJbbl0ubG9jYWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjW25dID0gYVtuXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmtleXMoYykubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gYztcblxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbVJldmVyc2UnO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnY29sbGFwc2VzIHVzZWxlc3MgZ3JvdXBzJztcblxudmFyIGNvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbnMnKSxcbiAgICBhdHRyc0luaGVyaXRhYmxlID0gY29sbGVjdGlvbnMuaW5oZXJpdGFibGVBdHRycyxcbiAgICBhbmltYXRpb25FbGVtcyA9IGNvbGxlY3Rpb25zLmVsZW1zR3JvdXBzLmFuaW1hdGlvbjtcblxuZnVuY3Rpb24gaGFzQW5pbWF0ZWRBdHRyKGl0ZW0pIHtcbiAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICByZXR1cm4gaXRlbS5pc0VsZW0oYW5pbWF0aW9uRWxlbXMpICYmIGl0ZW0uaGFzQXR0cignYXR0cmlidXRlTmFtZScsIHRoaXMpIHx8XG4gICAgICAgICFpdGVtLmlzRW1wdHkoKSAmJiBpdGVtLmNvbnRlbnQuc29tZShoYXNBbmltYXRlZEF0dHIsIHRoaXMpO1xufVxuXG4vKlxuICogQ29sbGFwc2UgdXNlbGVzcyBncm91cHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxnPlxuICogICAgIDxnIGF0dHIxPVwidmFsMVwiPlxuICogICAgICAgICA8cGF0aCBkPVwiLi4uXCIvPlxuICogICAgIDwvZz5cbiAqIDwvZz5cbiAqICAgICAgICAg4qyHXG4gKiA8Zz5cbiAqICAgICA8Zz5cbiAqICAgICAgICAgPHBhdGggYXR0cjE9XCJ2YWwxXCIgZD1cIi4uLlwiLz5cbiAqICAgICA8L2c+XG4gKiA8L2c+XG4gKiAgICAgICAgIOKsh1xuICogPHBhdGggYXR0cjE9XCJ2YWwxXCIgZD1cIi4uLlwiLz5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICAvLyBub24tZW1wdHkgZWxlbWVudHNcbiAgICBpZiAoaXRlbS5pc0VsZW0oKSAmJiAoIWl0ZW0uaXNFbGVtKCdzd2l0Y2gnKSB8fCBpc0ZlYXR1cmVkU3dpdGNoKGl0ZW0pKSAmJiAhaXRlbS5pc0VtcHR5KCkpIHtcbiAgICAgICAgaXRlbS5jb250ZW50LmZvckVhY2goZnVuY3Rpb24oZywgaSkge1xuICAgICAgICAgICAgLy8gbm9uLWVtcHR5IGdyb3Vwc1xuICAgICAgICAgICAgaWYgKGcuaXNFbGVtKCdnJykgJiYgIWcuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gbW92ZSBncm91cCBhdHRpYnV0ZXMgdG8gdGhlIHNpbmdsZSBjb250ZW50IGVsZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZy5oYXNBdHRyKCkgJiYgZy5jb250ZW50Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5uZXIgPSBnLmNvbnRlbnRbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLmlzRWxlbSgpICYmICFpbm5lci5oYXNBdHRyKCdpZCcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhKGcuaGFzQXR0cignY2xhc3MnKSAmJiBpbm5lci5oYXNBdHRyKCdjbGFzcycpKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWcuaGFzQXR0cignY2xpcC1wYXRoJykgJiYgIWcuaGFzQXR0cignbWFzaycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXIuaXNFbGVtKCdnJykgJiYgIWcuaGFzQXR0cigndHJhbnNmb3JtJykgJiYgIWlubmVyLmhhc0F0dHIoJ3RyYW5zZm9ybScpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZy5lYWNoQXR0cihmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcuY29udGVudC5zb21lKGhhc0FuaW1hdGVkQXR0ciwgYXR0ci5uYW1lKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbm5lci5oYXNBdHRyKGF0dHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXIuYWRkQXR0cihhdHRyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHIubmFtZSA9PSAndHJhbnNmb3JtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lci5hdHRyKGF0dHIubmFtZSkudmFsdWUgPSBhdHRyLnZhbHVlICsgJyAnICsgaW5uZXIuYXR0cihhdHRyLm5hbWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzSW5oZXJpdGFibGUuaW5kZXhPZihhdHRyLm5hbWUpIDwgMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5uZXIuaGFzQXR0cihhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLnJlbW92ZUF0dHIoYXR0ci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29sbGFwc2UgZ3JvdXBzIHdpdGhvdXQgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGlmICghZy5oYXNBdHRyKCkgJiYgIWcuY29udGVudC5zb21lKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGl0ZW0uaXNFbGVtKGFuaW1hdGlvbkVsZW1zKSB9KSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnNwbGljZUNvbnRlbnQoaSwgMSwgZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRmVhdHVyZWRTd2l0Y2goZykpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnNwbGljZUNvbnRlbnQoaSwgMSwgZy5jb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gaXNGZWF0dXJlZFN3aXRjaChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uaXNFbGVtKCdzd2l0Y2gnKSAmJiAhZWxlbS5pc0VtcHR5KCkgJiYgIWVsZW0uY29udGVudC5zb21lKGNoaWxkID0+XG4gICAgICAgIGNoaWxkLmhhc0F0dHIoJ3N5c3RlbUxhbmd1YWdlJykgfHwgY2hpbGQuaGFzQXR0cigncmVxdWlyZWRGZWF0dXJlcycpIHx8IGNoaWxkLmhhc0F0dHIoJ3JlcXVpcmVkRXh0ZW5zaW9ucycpXG4gICAgKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnb3B0aW1pemVzIHBhdGggZGF0YTogd3JpdGVzIGluIHNob3J0ZXIgZm9ybSwgYXBwbGllcyB0cmFuc2Zvcm1hdGlvbnMnO1xuXG5leHBvcnRzLnBhcmFtcyA9IHtcbiAgICBhcHBseVRyYW5zZm9ybXM6IHRydWUsXG4gICAgYXBwbHlUcmFuc2Zvcm1zU3Ryb2tlZDogdHJ1ZSxcbiAgICBtYWtlQXJjczoge1xuICAgICAgICB0aHJlc2hvbGQ6IDIuNSwgLy8gY29lZmZpY2llbnQgb2Ygcm91bmRpbmcgZXJyb3JcbiAgICAgICAgdG9sZXJhbmNlOiAwLjUgIC8vIHBlcmNlbnRhZ2Ugb2YgcmFkaXVzXG4gICAgfSxcbiAgICBzdHJhaWdodEN1cnZlczogdHJ1ZSxcbiAgICBsaW5lU2hvcnRoYW5kczogdHJ1ZSxcbiAgICBjdXJ2ZVNtb290aFNob3J0aGFuZHM6IHRydWUsXG4gICAgZmxvYXRQcmVjaXNpb246IDMsXG4gICAgdHJhbnNmb3JtUHJlY2lzaW9uOiA1LFxuICAgIHJlbW92ZVVzZWxlc3M6IHRydWUsXG4gICAgY29sbGFwc2VSZXBlYXRlZDogdHJ1ZSxcbiAgICB1dGlsaXplQWJzb2x1dGU6IHRydWUsXG4gICAgbGVhZGluZ1plcm86IHRydWUsXG4gICAgbmVnYXRpdmVFeHRyYVNwYWNlOiB0cnVlXG59O1xuXG52YXIgcGF0aEVsZW1zID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbnMuanMnKS5wYXRoRWxlbXMsXG4gICAgcGF0aDJqcyA9IHJlcXVpcmUoJy4vX3BhdGguanMnKS5wYXRoMmpzLFxuICAgIGpzMnBhdGggPSByZXF1aXJlKCcuL19wYXRoLmpzJykuanMycGF0aCxcbiAgICBhcHBseVRyYW5zZm9ybXMgPSByZXF1aXJlKCcuL19wYXRoLmpzJykuYXBwbHlUcmFuc2Zvcm1zLFxuICAgIGNsZWFudXBPdXREYXRhID0gcmVxdWlyZSgnLi4vbGliL3N2Z28vdG9vbHMnKS5jbGVhbnVwT3V0RGF0YSxcbiAgICByb3VuZERhdGEsXG4gICAgcHJlY2lzaW9uLFxuICAgIGVycm9yLFxuICAgIGFyY1RocmVzaG9sZCxcbiAgICBhcmNUb2xlcmFuY2UsXG4gICAgaGFzTWFya2VyTWlkO1xuXG4vKipcbiAqIENvbnZlcnQgYWJzb2x1dGUgUGF0aCB0byByZWxhdGl2ZSxcbiAqIGNvbGxhcHNlIHJlcGVhdGVkIGluc3RydWN0aW9ucyxcbiAqIGRldGVjdCBhbmQgY29udmVydCBMaW5ldG8gc2hvcnRoYW5kcyxcbiAqIHJlbW92ZSB1c2VsZXNzIGluc3RydWN0aW9ucyBsaWtlIFwibDAsMFwiLFxuICogdHJpbSB1c2VsZXNzIGRlbGltaXRlcnMgYW5kIGxlYWRpbmcgemVyb3MsXG4gKiBkZWNyZWFzZSBhY2N1cmFjeSBvZiBmbG9hdGluZy1wb2ludCBudW1iZXJzLlxuICpcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL3BhdGhzLmh0bWwjUGF0aERhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHBsdWdpbiBwYXJhbXNcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0sIHBhcmFtcykge1xuXG4gICAgaWYgKGl0ZW0uaXNFbGVtKHBhdGhFbGVtcykgJiYgaXRlbS5oYXNBdHRyKCdkJykpIHtcblxuICAgICAgICBwcmVjaXNpb24gPSBwYXJhbXMuZmxvYXRQcmVjaXNpb247XG4gICAgICAgIGVycm9yID0gcHJlY2lzaW9uICE9PSBmYWxzZSA/ICtNYXRoLnBvdyguMSwgcHJlY2lzaW9uKS50b0ZpeGVkKHByZWNpc2lvbikgOiAxZS0yO1xuICAgICAgICByb3VuZERhdGEgPSBwcmVjaXNpb24gPiAwICYmIHByZWNpc2lvbiA8IDIwID8gc3Ryb25nUm91bmQgOiByb3VuZDtcbiAgICAgICAgaWYgKHBhcmFtcy5tYWtlQXJjcykge1xuICAgICAgICAgICAgYXJjVGhyZXNob2xkID0gcGFyYW1zLm1ha2VBcmNzLnRocmVzaG9sZDtcbiAgICAgICAgICAgIGFyY1RvbGVyYW5jZSA9IHBhcmFtcy5tYWtlQXJjcy50b2xlcmFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgaGFzTWFya2VyTWlkID0gaXRlbS5oYXNBdHRyKCdtYXJrZXItbWlkJyk7XG5cbiAgICAgICAgdmFyIGRhdGEgPSBwYXRoMmpzKGl0ZW0pO1xuXG4gICAgICAgIC8vIFRPRE86IGdldCByaWQgb2YgZnVuY3Rpb25zIHJldHVybnNcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZShkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHBhcmFtcy5hcHBseVRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYXBwbHlUcmFuc2Zvcm1zKGl0ZW0sIGRhdGEsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXJzKGRhdGEsIHBhcmFtcyk7XG5cbiAgICAgICAgICAgIGlmIChwYXJhbXMudXRpbGl6ZUFic29sdXRlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGNvbnZlcnRUb01peGVkKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpzMnBhdGgoaXRlbSwgZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG59O1xuXG4vKipcbiAqIENvbnZlcnQgYWJzb2x1dGUgcGF0aCBkYXRhIGNvb3JkaW5hdGVzIHRvIHJlbGF0aXZlLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggaW5wdXQgcGF0aCBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHBsdWdpbiBwYXJhbXNcbiAqIEByZXR1cm4ge0FycmF5fSBvdXRwdXQgcGF0aCBkYXRhXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb1JlbGF0aXZlKHBhdGgpIHtcblxuICAgIHZhciBwb2ludCA9IFswLCAwXSxcbiAgICAgICAgc3VicGF0aFBvaW50ID0gWzAsIDBdLFxuICAgICAgICBiYXNlSXRlbTtcblxuICAgIHBhdGguZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuXG4gICAgICAgIHZhciBpbnN0cnVjdGlvbiA9IGl0ZW0uaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICBkYXRhID0gaXRlbS5kYXRhO1xuXG4gICAgICAgIC8vIGRhdGEgIT09ICF6XG4gICAgICAgIGlmIChkYXRhKSB7XG5cbiAgICAgICAgICAgIC8vIGFscmVhZHkgcmVsYXRpdmVcbiAgICAgICAgICAgIC8vIHJlY2FsY3VsYXRlIGN1cnJlbnQgcG9pbnRcbiAgICAgICAgICAgIGlmICgnbWNzbHF0YScuaW5kZXhPZihpbnN0cnVjdGlvbikgPiAtMSkge1xuXG4gICAgICAgICAgICAgICAgcG9pbnRbMF0gKz0gZGF0YVtkYXRhLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgIHBvaW50WzFdICs9IGRhdGFbZGF0YS5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvbiA9PT0gJ20nKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnBhdGhQb2ludFswXSA9IHBvaW50WzBdO1xuICAgICAgICAgICAgICAgICAgICBzdWJwYXRoUG9pbnRbMV0gPSBwb2ludFsxXTtcbiAgICAgICAgICAgICAgICAgICAgYmFzZUl0ZW0gPSBpdGVtO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbiA9PT0gJ2gnKSB7XG5cbiAgICAgICAgICAgICAgICBwb2ludFswXSArPSBkYXRhWzBdO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uID09PSAndicpIHtcblxuICAgICAgICAgICAgICAgIHBvaW50WzFdICs9IGRhdGFbMF07XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY29udmVydCBhYnNvbHV0ZSBwYXRoIGRhdGEgY29vcmRpbmF0ZXMgdG8gcmVsYXRpdmVcbiAgICAgICAgICAgIC8vIGlmIFwiTVwiIHdhcyBub3QgdHJhbnNmb3JtZWQgZnJvbSBcIm1cIlxuICAgICAgICAgICAgLy8gTSDihpIgbVxuICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uID09PSAnTScpIHtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDApIGluc3RydWN0aW9uID0gJ20nO1xuXG4gICAgICAgICAgICAgICAgZGF0YVswXSAtPSBwb2ludFswXTtcbiAgICAgICAgICAgICAgICBkYXRhWzFdIC09IHBvaW50WzFdO1xuXG4gICAgICAgICAgICAgICAgc3VicGF0aFBvaW50WzBdID0gcG9pbnRbMF0gKz0gZGF0YVswXTtcbiAgICAgICAgICAgICAgICBzdWJwYXRoUG9pbnRbMV0gPSBwb2ludFsxXSArPSBkYXRhWzFdO1xuXG4gICAgICAgICAgICAgICAgYmFzZUl0ZW0gPSBpdGVtO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEwg4oaSIGxcbiAgICAgICAgICAgIC8vIFQg4oaSIHRcbiAgICAgICAgICAgIGVsc2UgaWYgKCdMVCcuaW5kZXhPZihpbnN0cnVjdGlvbikgPiAtMSkge1xuXG4gICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8geCB5XG4gICAgICAgICAgICAgICAgLy8gMCAxXG4gICAgICAgICAgICAgICAgZGF0YVswXSAtPSBwb2ludFswXTtcbiAgICAgICAgICAgICAgICBkYXRhWzFdIC09IHBvaW50WzFdO1xuXG4gICAgICAgICAgICAgICAgcG9pbnRbMF0gKz0gZGF0YVswXTtcbiAgICAgICAgICAgICAgICBwb2ludFsxXSArPSBkYXRhWzFdO1xuXG4gICAgICAgICAgICAvLyBDIOKGkiBjXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uID09PSAnQycpIHtcblxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0gJ2MnO1xuXG4gICAgICAgICAgICAgICAgLy8geDEgeTEgeDIgeTIgeCB5XG4gICAgICAgICAgICAgICAgLy8gMCAgMSAgMiAgMyAgNCA1XG4gICAgICAgICAgICAgICAgZGF0YVswXSAtPSBwb2ludFswXTtcbiAgICAgICAgICAgICAgICBkYXRhWzFdIC09IHBvaW50WzFdO1xuICAgICAgICAgICAgICAgIGRhdGFbMl0gLT0gcG9pbnRbMF07XG4gICAgICAgICAgICAgICAgZGF0YVszXSAtPSBwb2ludFsxXTtcbiAgICAgICAgICAgICAgICBkYXRhWzRdIC09IHBvaW50WzBdO1xuICAgICAgICAgICAgICAgIGRhdGFbNV0gLT0gcG9pbnRbMV07XG5cbiAgICAgICAgICAgICAgICBwb2ludFswXSArPSBkYXRhWzRdO1xuICAgICAgICAgICAgICAgIHBvaW50WzFdICs9IGRhdGFbNV07XG5cbiAgICAgICAgICAgIC8vIFMg4oaSIHNcbiAgICAgICAgICAgIC8vIFEg4oaSIHFcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJ1NRJy5pbmRleE9mKGluc3RydWN0aW9uKSA+IC0xKSB7XG5cbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyB4MSB5MSB4IHlcbiAgICAgICAgICAgICAgICAvLyAwICAxICAyIDNcbiAgICAgICAgICAgICAgICBkYXRhWzBdIC09IHBvaW50WzBdO1xuICAgICAgICAgICAgICAgIGRhdGFbMV0gLT0gcG9pbnRbMV07XG4gICAgICAgICAgICAgICAgZGF0YVsyXSAtPSBwb2ludFswXTtcbiAgICAgICAgICAgICAgICBkYXRhWzNdIC09IHBvaW50WzFdO1xuXG4gICAgICAgICAgICAgICAgcG9pbnRbMF0gKz0gZGF0YVsyXTtcbiAgICAgICAgICAgICAgICBwb2ludFsxXSArPSBkYXRhWzNdO1xuXG4gICAgICAgICAgICAvLyBBIOKGkiBhXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uID09PSAnQScpIHtcblxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0gJ2EnO1xuXG4gICAgICAgICAgICAgICAgLy8gcnggcnkgeC1heGlzLXJvdGF0aW9uIGxhcmdlLWFyYy1mbGFnIHN3ZWVwLWZsYWcgeCB5XG4gICAgICAgICAgICAgICAgLy8gMCAgMSAgMiAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIDQgICAgICAgICAgNSA2XG4gICAgICAgICAgICAgICAgZGF0YVs1XSAtPSBwb2ludFswXTtcbiAgICAgICAgICAgICAgICBkYXRhWzZdIC09IHBvaW50WzFdO1xuXG4gICAgICAgICAgICAgICAgcG9pbnRbMF0gKz0gZGF0YVs1XTtcbiAgICAgICAgICAgICAgICBwb2ludFsxXSArPSBkYXRhWzZdO1xuXG4gICAgICAgICAgICAvLyBIIOKGkiBoXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uID09PSAnSCcpIHtcblxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0gJ2gnO1xuXG4gICAgICAgICAgICAgICAgZGF0YVswXSAtPSBwb2ludFswXTtcblxuICAgICAgICAgICAgICAgIHBvaW50WzBdICs9IGRhdGFbMF07XG5cbiAgICAgICAgICAgIC8vIFYg4oaSIHZcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT09ICdWJykge1xuXG4gICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPSAndic7XG5cbiAgICAgICAgICAgICAgICBkYXRhWzBdIC09IHBvaW50WzFdO1xuXG4gICAgICAgICAgICAgICAgcG9pbnRbMV0gKz0gZGF0YVswXTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLmluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb247XG4gICAgICAgICAgICBpdGVtLmRhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAvLyBzdG9yZSBhYnNvbHV0ZSBjb29yZGluYXRlcyBmb3IgbGF0ZXIgdXNlXG4gICAgICAgICAgICBpdGVtLmNvb3JkcyA9IHBvaW50LnNsaWNlKC0yKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gIWRhdGEgPT09IHosIHJlc2V0IGN1cnJlbnQgcG9pbnRcbiAgICAgICAgZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ3onKSB7XG4gICAgICAgICAgICBpZiAoYmFzZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLmNvb3JkcyA9IGJhc2VJdGVtLmNvb3JkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvaW50WzBdID0gc3VicGF0aFBvaW50WzBdO1xuICAgICAgICAgICAgcG9pbnRbMV0gPSBzdWJwYXRoUG9pbnRbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmJhc2UgPSBpbmRleCA+IDAgPyBwYXRoW2luZGV4IC0gMV0uY29vcmRzIDogWzAsIDBdO1xuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0aDtcblxufVxuXG4vKipcbiAqIE1haW4gZmlsdGVycyBsb29wLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggaW5wdXQgcGF0aCBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHBsdWdpbiBwYXJhbXNcbiAqIEByZXR1cm4ge0FycmF5fSBvdXRwdXQgcGF0aCBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcnMocGF0aCwgcGFyYW1zKSB7XG5cbiAgICB2YXIgc3RyaW5naWZ5ID0gZGF0YTJQYXRoLmJpbmQobnVsbCwgcGFyYW1zKSxcbiAgICAgICAgcmVsU3VicG9pbnQgPSBbMCwgMF0sXG4gICAgICAgIHBhdGhCYXNlID0gWzAsIDBdLFxuICAgICAgICBwcmV2ID0ge307XG5cbiAgICBwYXRoID0gcGF0aC5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHBhdGgpIHtcblxuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb24gPSBpdGVtLmluc3RydWN0aW9uLFxuICAgICAgICAgICAgZGF0YSA9IGl0ZW0uZGF0YSxcbiAgICAgICAgICAgIG5leHQgPSBwYXRoW2luZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcblxuICAgICAgICAgICAgdmFyIHNkYXRhID0gZGF0YSxcbiAgICAgICAgICAgICAgICBjaXJjbGU7XG5cbiAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvbiA9PT0gJ3MnKSB7XG4gICAgICAgICAgICAgICAgc2RhdGEgPSBbMCwgMF0uY29uY2F0KGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCdjcycuaW5kZXhPZihwcmV2Lmluc3RydWN0aW9uKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwZGF0YSA9IHByZXYuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBwZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gKC14LCAteSkgb2YgdGhlIHByZXYgdGFuZ2VudCBwb2ludCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBwb2ludFxuICAgICAgICAgICAgICAgICAgICBzZGF0YVswXSA9IHBkYXRhW24gLSAyXSAtIHBkYXRhW24gLSA0XTtcbiAgICAgICAgICAgICAgICAgICAgc2RhdGFbMV0gPSBwZGF0YVtuIC0gMV0gLSBwZGF0YVtuIC0gM107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgY3VydmVzIHRvIGFyY3MgaWYgcG9zc2libGVcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFrZUFyY3MgJiZcbiAgICAgICAgICAgICAgICAoaW5zdHJ1Y3Rpb24gPT0gJ2MnIHx8IGluc3RydWN0aW9uID09ICdzJykgJiZcbiAgICAgICAgICAgICAgICBpc0NvbnZleChzZGF0YSkgJiZcbiAgICAgICAgICAgICAgICAoY2lyY2xlID0gZmluZENpcmNsZShzZGF0YSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHJvdW5kRGF0YShbY2lyY2xlLnJhZGl1c10pWzBdLFxuICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IGZpbmRBcmNBbmdsZShzZGF0YSwgY2lyY2xlKSxcbiAgICAgICAgICAgICAgICAgICAgc3dlZXAgPSBzZGF0YVs1XSAqIHNkYXRhWzBdIC0gc2RhdGFbNF0gKiBzZGF0YVsxXSA+IDAgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgYXJjID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb246ICdhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IFtyLCByLCAwLCAwLCBzd2VlcCwgc2RhdGFbNF0sIHNkYXRhWzVdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkczogaXRlbS5jb29yZHMuc2xpY2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6IGl0ZW0uYmFzZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBbYXJjXSxcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgY29vcmRpbmF0ZXMgdG8gYWRqdXN0IHRoZSBmb3VuZCBjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgcmVsQ2VudGVyID0gW2NpcmNsZS5jZW50ZXJbMF0gLSBzZGF0YVs0XSwgY2lyY2xlLmNlbnRlclsxXSAtIHNkYXRhWzVdXSxcbiAgICAgICAgICAgICAgICAgICAgcmVsQ2lyY2xlID0geyBjZW50ZXI6IHJlbENlbnRlciwgcmFkaXVzOiBjaXJjbGUucmFkaXVzIH0sXG4gICAgICAgICAgICAgICAgICAgIGFyY0N1cnZlcyA9IFtpdGVtXSxcbiAgICAgICAgICAgICAgICAgICAgaGFzUHJldiA9IDAsXG4gICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICcnLFxuICAgICAgICAgICAgICAgICAgICBuZXh0TG9uZ2hhbmQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHByZXYuaW5zdHJ1Y3Rpb24gPT0gJ2MnICYmIGlzQ29udmV4KHByZXYuZGF0YSkgJiYgaXNBcmNQcmV2KHByZXYuZGF0YSwgY2lyY2xlKSB8fFxuICAgICAgICAgICAgICAgICAgICBwcmV2Lmluc3RydWN0aW9uID09ICdhJyAmJiBwcmV2LnNkYXRhICYmIGlzQXJjUHJldihwcmV2LnNkYXRhLCBjaXJjbGUpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyY0N1cnZlcy51bnNoaWZ0KHByZXYpO1xuICAgICAgICAgICAgICAgICAgICBhcmMuYmFzZSA9IHByZXYuYmFzZTtcbiAgICAgICAgICAgICAgICAgICAgYXJjLmRhdGFbNV0gPSBhcmMuY29vcmRzWzBdIC0gYXJjLmJhc2VbMF07XG4gICAgICAgICAgICAgICAgICAgIGFyYy5kYXRhWzZdID0gYXJjLmNvb3Jkc1sxXSAtIGFyYy5iYXNlWzFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJldkRhdGEgPSBwcmV2Lmluc3RydWN0aW9uID09ICdhJyA/IHByZXYuc2RhdGEgOiBwcmV2LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlICs9IGZpbmRBcmNBbmdsZShwcmV2RGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFtwcmV2RGF0YVs0XSArIHJlbENlbnRlclswXSwgcHJldkRhdGFbNV0gKyByZWxDZW50ZXJbMV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogY2lyY2xlLnJhZGl1c1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYW5nbGUgPiBNYXRoLlBJKSBhcmMuZGF0YVszXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGhhc1ByZXYgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIG5leHQgY3VydmVzIGFyZSBmaXR0aW5nIHRoZSBhcmNcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gaW5kZXg7IChuZXh0ID0gcGF0aFsrK2pdKSAmJiB+J2NzJy5pbmRleE9mKG5leHQuaW5zdHJ1Y3Rpb24pOykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dERhdGEgPSBuZXh0LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Lmluc3RydWN0aW9uID09ICdzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExvbmdoYW5kID0gbWFrZUxvbmdoYW5kKHtpbnN0cnVjdGlvbjogJ3MnLCBkYXRhOiBuZXh0LmRhdGEuc2xpY2UoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhbaiAtIDFdLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dERhdGEgPSBuZXh0TG9uZ2hhbmQuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMb25naGFuZC5kYXRhID0gbmV4dERhdGEuc2xpY2UoMCwgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBzdHJpbmdpZnkoW25leHRMb25naGFuZF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbnZleChuZXh0RGF0YSkgJiYgaXNBcmMobmV4dERhdGEsIHJlbENpcmNsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlICs9IGZpbmRBcmNBbmdsZShuZXh0RGF0YSwgcmVsQ2lyY2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmdsZSAtIDIgKiBNYXRoLlBJID4gMWUtMykgYnJlYWs7IC8vIG1vcmUgdGhhbiAzNjDCsFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ2xlID4gTWF0aC5QSSkgYXJjLmRhdGFbM10gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJjQ3VydmVzLnB1c2gobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoMiAqIE1hdGguUEkgLSBhbmdsZSA+IDFlLTMpIHsgLy8gbGVzcyB0aGFuIDM2MMKwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjLmNvb3JkcyA9IG5leHQuY29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5kYXRhWzVdID0gYXJjLmNvb3Jkc1swXSAtIGFyYy5iYXNlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5kYXRhWzZdID0gYXJjLmNvb3Jkc1sxXSAtIGFyYy5iYXNlWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdWxsIGNpcmNsZSwgbWFrZSBhIGhhbGYtY2lyY2xlIGFyYyBhbmQgYWRkIGEgc2Vjb25kIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5kYXRhWzVdID0gMiAqIChyZWxDaXJjbGUuY2VudGVyWzBdIC0gbmV4dERhdGFbNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5kYXRhWzZdID0gMiAqIChyZWxDaXJjbGUuY2VudGVyWzFdIC0gbmV4dERhdGFbNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5jb29yZHMgPSBbYXJjLmJhc2VbMF0gKyBhcmMuZGF0YVs1XSwgYXJjLmJhc2VbMV0gKyBhcmMuZGF0YVs2XV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbjogJ2EnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBbciwgciwgMCwgMCwgc3dlZXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmNvb3Jkc1swXSAtIGFyYy5jb29yZHNbMF0sIG5leHQuY29vcmRzWzFdIC0gYXJjLmNvb3Jkc1sxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkczogbmV4dC5jb29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6IGFyYy5jb29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGFyYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsQ2VudGVyWzBdIC09IG5leHREYXRhWzRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsQ2VudGVyWzFdIC09IG5leHREYXRhWzVdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKChzdHJpbmdpZnkob3V0cHV0KSArIHN1ZmZpeCkubGVuZ3RoIDwgc3RyaW5naWZ5KGFyY0N1cnZlcykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoW2pdICYmIHBhdGhbal0uaW5zdHJ1Y3Rpb24gPT0gJ3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlTG9uZ2hhbmQocGF0aFtqXSwgcGF0aFtqIC0gMV0uZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1ByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2QXJjID0gb3V0cHV0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3VuZERhdGEocHJldkFyYy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbFN1YnBvaW50WzBdICs9IHByZXZBcmMuZGF0YVs1XSAtIHByZXYuZGF0YVtwcmV2LmRhdGEubGVuZ3RoIC0gMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxTdWJwb2ludFsxXSArPSBwcmV2QXJjLmRhdGFbNl0gLSBwcmV2LmRhdGFbcHJldi5kYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5pbnN0cnVjdGlvbiA9ICdhJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuZGF0YSA9IHByZXZBcmMuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYmFzZSA9IHByZXYuY29vcmRzID0gcHJldkFyYy5jb29yZHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJjID0gb3V0cHV0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmNDdXJ2ZXMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2RhdGEgPSBzZGF0YS5zbGljZSgpOyAvLyBwcmVzZXJ2ZSBjdXJ2ZSBkYXRhIGZvciBmdXR1cmUgY2hlY2tzXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJjQ3VydmVzLmxlbmd0aCAtIDEgLSBoYXNQcmV2ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBjb25zdW1lZCBuZXh0IGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnNwbGljZS5hcHBseShwYXRoLCBbaW5kZXggKyAxLCBhcmNDdXJ2ZXMubGVuZ3RoIC0gMSAtIGhhc1ByZXZdLmNvbmNhdChvdXRwdXQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyYykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9ICdhJztcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFyYy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmNvb3JkcyA9IGFyYy5jb29yZHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSb3VuZGluZyByZWxhdGl2ZSBjb29yZGluYXRlcywgdGFraW5nIGluIGFjY291bnQgYWNjdW1tdWxhdGluZyBlcnJvclxuICAgICAgICAgICAgLy8gdG8gZ2V0IGNsb3NlciB0byBhYnNvbHV0ZSBjb29yZGluYXRlcy4gU3VtIG9mIHJvdW5kZWQgdmFsdWUgcmVtYWlucyBzYW1lOlxuICAgICAgICAgICAgLy8gbCAuMjUgMyAuMjUgMiAuMjUgMyAuMjUgMiAtPiBsIC4zIDMgLjIgMiAuMyAzIC4yIDJcbiAgICAgICAgICAgIGlmIChwcmVjaXNpb24gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCdtbHRxc2MnLmluZGV4T2YoaW5zdHJ1Y3Rpb24pID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRhdGEubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2ldICs9IGl0ZW0uYmFzZVtpICUgMl0gLSByZWxTdWJwb2ludFtpICUgMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uID09ICdoJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhWzBdICs9IGl0ZW0uYmFzZVswXSAtIHJlbFN1YnBvaW50WzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ3YnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gKz0gaXRlbS5iYXNlWzFdIC0gcmVsU3VicG9pbnRbMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbiA9PSAnYScpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVs1XSArPSBpdGVtLmJhc2VbMF0gLSByZWxTdWJwb2ludFswXTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSArPSBpdGVtLmJhc2VbMV0gLSByZWxTdWJwb2ludFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcm91bmREYXRhKGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgICAgICAoaW5zdHJ1Y3Rpb24gPT0gJ2gnKSByZWxTdWJwb2ludFswXSArPSBkYXRhWzBdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluc3RydWN0aW9uID09ICd2JykgcmVsU3VicG9pbnRbMV0gKz0gZGF0YVswXTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsU3VicG9pbnRbMF0gKz0gZGF0YVtkYXRhLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICByZWxTdWJwb2ludFsxXSArPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJvdW5kRGF0YShyZWxTdWJwb2ludCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24udG9Mb3dlckNhc2UoKSA9PSAnbScpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aEJhc2VbMF0gPSByZWxTdWJwb2ludFswXTtcbiAgICAgICAgICAgICAgICAgICAgcGF0aEJhc2VbMV0gPSByZWxTdWJwb2ludFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgc3RyYWlnaHQgY3VydmVzIGludG8gbGluZXMgc2VnbWVudHNcbiAgICAgICAgICAgIGlmIChwYXJhbXMuc3RyYWlnaHRDdXJ2ZXMpIHtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPT09ICdjJyAmJlxuICAgICAgICAgICAgICAgICAgICBpc0N1cnZlU3RyYWlnaHRMaW5lKGRhdGEpIHx8XG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID09PSAncycgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNDdXJ2ZVN0cmFpZ2h0TGluZShzZGF0YSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5pbnN0cnVjdGlvbiA9PSAncycpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlTG9uZ2hhbmQobmV4dCwgZGF0YSk7IC8vIGZpeCB1cCBuZXh0IGN1cnZlXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0gJ2wnO1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgtMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID09PSAncScgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNDdXJ2ZVN0cmFpZ2h0TGluZShkYXRhKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0Lmluc3RydWN0aW9uID09ICd0JylcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VMb25naGFuZChuZXh0LCBkYXRhKTsgLy8gZml4IHVwIG5leHQgY3VydmVcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPSAnbCc7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKC0yKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPT09ICd0JyAmJlxuICAgICAgICAgICAgICAgICAgICBwcmV2Lmluc3RydWN0aW9uICE9PSAncScgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJldi5pbnN0cnVjdGlvbiAhPT0gJ3QnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0gJ2wnO1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgtMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID09PSAnYScgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRhdGFbMF0gPT09IDAgfHwgZGF0YVsxXSA9PT0gMClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPSAnbCc7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKC0yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGxpbmUgc2hvcnRoYW5kc1xuICAgICAgICAgICAgLy8gbCA1MCAwIOKGkiBoIDUwXG4gICAgICAgICAgICAvLyBsIDAgNTAg4oaSIHYgNTBcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXJhbXMubGluZVNob3J0aGFuZHMgJiZcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9PT0gJ2wnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVsxXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9ICdoJztcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFbMF0gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPSAndic7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNvbGxhcHNlIHJlcGVhdGVkIGNvbW1hbmRzXG4gICAgICAgICAgICAvLyBoIDIwIGggMzAgLT4gaCA1MFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBhcmFtcy5jb2xsYXBzZVJlcGVhdGVkICYmXG4gICAgICAgICAgICAgICAgIWhhc01hcmtlck1pZCAmJlxuICAgICAgICAgICAgICAgICgnbWh2Jy5pbmRleE9mKGluc3RydWN0aW9uKSA+IC0xKSAmJlxuICAgICAgICAgICAgICAgIHByZXYuaW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9PSBwcmV2Lmluc3RydWN0aW9uLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIChpbnN0cnVjdGlvbiAhPSAnaCcgJiYgaW5zdHJ1Y3Rpb24gIT0gJ3YnKSB8fFxuICAgICAgICAgICAgICAgICAgICAocHJldi5kYXRhWzBdID49IDApID09IChpdGVtLmRhdGFbMF0gPj0gMClcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBwcmV2LmRhdGFbMF0gKz0gZGF0YVswXTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gIT0gJ2gnICYmIGluc3RydWN0aW9uICE9ICd2Jykge1xuICAgICAgICAgICAgICAgICAgICBwcmV2LmRhdGFbMV0gKz0gZGF0YVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldi5jb29yZHMgPSBpdGVtLmNvb3JkcztcbiAgICAgICAgICAgICAgICBwYXRoW2luZGV4XSA9IHByZXY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb252ZXJ0IGN1cnZlcyBpbnRvIHNtb290aCBzaG9ydGhhbmRzXG4gICAgICAgICAgICBpZiAocGFyYW1zLmN1cnZlU21vb3RoU2hvcnRoYW5kcyAmJiBwcmV2Lmluc3RydWN0aW9uKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBjdXJ2ZXRvXG4gICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uID09PSAnYycpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjICsgYyDihpIgYyArIHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5pbnN0cnVjdGlvbiA9PT0gJ2MnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID09PSAtKHByZXYuZGF0YVsyXSAtIHByZXYuZGF0YVs0XSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gPT09IC0ocHJldi5kYXRhWzNdIC0gcHJldi5kYXRhWzVdKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0gJ3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBzICsgYyDihpIgcyArIHNcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lmluc3RydWN0aW9uID09PSAncycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPT09IC0ocHJldi5kYXRhWzBdIC0gcHJldi5kYXRhWzJdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9PT0gLShwcmV2LmRhdGFbMV0gLSBwcmV2LmRhdGFbM10pXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPSAncyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFteY3NdICsgYyDihpIgW15jc10gKyBzXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NzJy5pbmRleE9mKHByZXYuaW5zdHJ1Y3Rpb24pID09PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9PT0gMFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0gJ3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHF1YWRyYXRpYyBCw6l6aWVyIGN1cnZldG9cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnN0cnVjdGlvbiA9PT0gJ3EnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcSArIHEg4oaSIHEgKyB0XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuaW5zdHJ1Y3Rpb24gPT09ICdxJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9PT0gKHByZXYuZGF0YVsyXSAtIHByZXYuZGF0YVswXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gPT09IChwcmV2LmRhdGFbM10gLSBwcmV2LmRhdGFbMV0pXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gPSAndCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHQgKyBxIOKGkiB0ICsgdFxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuaW5zdHJ1Y3Rpb24gPT09ICd0JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSA9PT0gcHJldi5kYXRhWzBdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzNdID09PSBwcmV2LmRhdGFbMV1cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9ICd0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHVzZWxlc3Mgbm9uLWZpcnN0IHBhdGggc2VnbWVudHNcbiAgICAgICAgICAgIGlmIChwYXJhbXMucmVtb3ZlVXNlbGVzcykge1xuXG4gICAgICAgICAgICAgICAgLy8gbCAwLDAgLyBoIDAgLyB2IDAgLyBxIDAsMCAwLDAgLyB0IDAsMCAvIGMgMCwwIDAsMCAwLDAgLyBzIDAsMCAwLDBcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICdsaHZxdGNzJy5pbmRleE9mKGluc3RydWN0aW9uKSA+IC0xXG4gICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5ldmVyeShmdW5jdGlvbihpKSB7IHJldHVybiBpID09PSAwOyB9KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoW2luZGV4XSA9IHByZXY7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhIDI1LDI1IC0zMCAwLDEgMCwwXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9PT0gJ2EnICYmXG4gICAgICAgICAgICAgICAgICAgIGRhdGFbNV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSA9PT0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoW2luZGV4XSA9IHByZXY7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5pbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgICAgICAgICAgaXRlbS5kYXRhID0gZGF0YTtcblxuICAgICAgICAgICAgcHJldiA9IGl0ZW07XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLy8geiByZXNldHMgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHJlbFN1YnBvaW50WzBdID0gcGF0aEJhc2VbMF07XG4gICAgICAgICAgICByZWxTdWJwb2ludFsxXSA9IHBhdGhCYXNlWzFdO1xuICAgICAgICAgICAgaWYgKHByZXYuaW5zdHJ1Y3Rpb24gPT0gJ3onKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBwcmV2ID0gaXRlbTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9KTtcblxuICAgIHJldHVybiBwYXRoO1xuXG59XG5cbi8qKlxuICogV3JpdGVzIGRhdGEgaW4gc2hvcnRlc3QgZm9ybSB1c2luZyBhYnNvbHV0ZSBvciByZWxhdGl2ZSBjb29yZGluYXRlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhIGlucHV0IHBhdGggZGF0YVxuICogQHJldHVybiB7Qm9vbGVhbn0gb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb01peGVkKHBhdGgsIHBhcmFtcykge1xuXG4gICAgdmFyIHByZXYgPSBwYXRoWzBdO1xuXG4gICAgcGF0aCA9IHBhdGguZmlsdGVyKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG5cbiAgICAgICAgaWYgKGluZGV4ID09IDApIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIWl0ZW0uZGF0YSkge1xuICAgICAgICAgICAgcHJldiA9IGl0ZW07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnN0cnVjdGlvbiA9IGl0ZW0uaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICBkYXRhID0gaXRlbS5kYXRhLFxuICAgICAgICAgICAgYWRhdGEgPSBkYXRhICYmIGRhdGEuc2xpY2UoMCk7XG5cbiAgICAgICAgaWYgKCdtbHRxc2MnLmluZGV4T2YoaW5zdHJ1Y3Rpb24pID4gLTEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBhZGF0YS5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICBhZGF0YVtpXSArPSBpdGVtLmJhc2VbaSAlIDJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uID09ICdoJykge1xuICAgICAgICAgICAgICAgIGFkYXRhWzBdICs9IGl0ZW0uYmFzZVswXTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbiA9PSAndicpIHtcbiAgICAgICAgICAgICAgICBhZGF0YVswXSArPSBpdGVtLmJhc2VbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ2EnKSB7XG4gICAgICAgICAgICAgICAgYWRhdGFbNV0gKz0gaXRlbS5iYXNlWzBdO1xuICAgICAgICAgICAgICAgIGFkYXRhWzZdICs9IGl0ZW0uYmFzZVsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdW5kRGF0YShhZGF0YSk7XG5cbiAgICAgICAgdmFyIGFic29sdXRlRGF0YVN0ciA9IGNsZWFudXBPdXREYXRhKGFkYXRhLCBwYXJhbXMpLFxuICAgICAgICAgICAgcmVsYXRpdmVEYXRhU3RyID0gY2xlYW51cE91dERhdGEoZGF0YSwgcGFyYW1zKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRvIGFic29sdXRlIGNvb3JkaW5hdGVzIGlmIGl0J3Mgc2hvcnRlci5cbiAgICAgICAgLy8gdi0yMCAtPiBWMFxuICAgICAgICAvLyBEb24ndCBjb252ZXJ0IGlmIGl0IGZpdHMgZm9sbG93aW5nIHByZXZpb3VzIGluc3RydWN0aW9uLlxuICAgICAgICAvLyBsMjAgMzAtMTAtNTAgaW5zdGVhZCBvZiBsMjAgMzBMMjAgMzBcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWJzb2x1dGVEYXRhU3RyLmxlbmd0aCA8IHJlbGF0aXZlRGF0YVN0ci5sZW5ndGggJiZcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgcGFyYW1zLm5lZ2F0aXZlRXh0cmFTcGFjZSAmJlxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID09IHByZXYuaW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgICAgICAgICBwcmV2Lmluc3RydWN0aW9uLmNoYXJDb2RlQXQoMCkgPiA5NiAmJlxuICAgICAgICAgICAgICAgIGFic29sdXRlRGF0YVN0ci5sZW5ndGggPT0gcmVsYXRpdmVEYXRhU3RyLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgICAoZGF0YVswXSA8IDAgfHwgL14wXFwuLy50ZXN0KGRhdGFbMF0pICYmIHByZXYuZGF0YVtwcmV2LmRhdGEubGVuZ3RoIC0gMV0gJSAxKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGl0ZW0uaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaXRlbS5kYXRhID0gYWRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2ID0gaXRlbTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhdGg7XG5cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgY3VydmUgaXMgY29udmV4LiBDb250cm9sIHBvaW50cyBvZiBzdWNoIGEgY3VydmUgbXVzdCBmb3JtXG4gKiBhIGNvbnZleCBxdWFkcmlsYXRlcmFsIHdpdGggZGlhZ29uYWxzIGNyb3NzcG9pbnQgaW5zaWRlIG9mIGl0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgaW5wdXQgcGF0aCBkYXRhXG4gKiBAcmV0dXJuIHtCb29sZWFufSBvdXRwdXRcbiAqL1xuZnVuY3Rpb24gaXNDb252ZXgoZGF0YSkge1xuXG4gICAgdmFyIGNlbnRlciA9IGdldEludGVyc2VjdGlvbihbMCwgMCwgZGF0YVsyXSwgZGF0YVszXSwgZGF0YVswXSwgZGF0YVsxXSwgZGF0YVs0XSwgZGF0YVs1XV0pO1xuXG4gICAgcmV0dXJuIGNlbnRlciAmJlxuICAgICAgICAoZGF0YVsyXSA8IGNlbnRlclswXSA9PSBjZW50ZXJbMF0gPCAwKSAmJlxuICAgICAgICAoZGF0YVszXSA8IGNlbnRlclsxXSA9PSBjZW50ZXJbMV0gPCAwKSAmJlxuICAgICAgICAoZGF0YVs0XSA8IGNlbnRlclswXSA9PSBjZW50ZXJbMF0gPCBkYXRhWzBdKSAmJlxuICAgICAgICAoZGF0YVs1XSA8IGNlbnRlclsxXSA9PSBjZW50ZXJbMV0gPCBkYXRhWzFdKTtcblxufVxuXG4vKipcbiAqIENvbXB1dGVzIGxpbmVzIGVxdWF0aW9ucyBieSB0d28gcG9pbnRzIGFuZCByZXR1cm5zIHRoZWlyIGludGVyc2VjdGlvbiBwb2ludC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBjb29yZHMgOCBudW1iZXJzIGZvciA0IHBhaXJzIG9mIGNvb3JkaW5hdGVzICh4LHkpXG4gKiBAcmV0dXJuIHtBcnJheXx1bmRlZmluZWR9IG91dHB1dCBjb29yZGluYXRlIG9mIGxpbmVzJyBjcm9zc3BvaW50XG4gKi9cbmZ1bmN0aW9uIGdldEludGVyc2VjdGlvbihjb29yZHMpIHtcblxuICAgICAgICAvLyBQcmV2IGxpbmUgZXF1YXRpb24gcGFyYW1ldGVycy5cbiAgICB2YXIgYTEgPSBjb29yZHNbMV0gLSBjb29yZHNbM10sIC8vIHkxIC0geTJcbiAgICAgICAgYjEgPSBjb29yZHNbMl0gLSBjb29yZHNbMF0sIC8vIHgyIC0geDFcbiAgICAgICAgYzEgPSBjb29yZHNbMF0gKiBjb29yZHNbM10gLSBjb29yZHNbMl0gKiBjb29yZHNbMV0sIC8vIHgxICogeTIgLSB4MiAqIHkxXG5cbiAgICAgICAgLy8gTmV4dCBsaW5lIGVxdWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgICAgYTIgPSBjb29yZHNbNV0gLSBjb29yZHNbN10sIC8vIHkxIC0geTJcbiAgICAgICAgYjIgPSBjb29yZHNbNl0gLSBjb29yZHNbNF0sIC8vIHgyIC0geDFcbiAgICAgICAgYzIgPSBjb29yZHNbNF0gKiBjb29yZHNbN10gLSBjb29yZHNbNV0gKiBjb29yZHNbNl0sIC8vIHgxICogeTIgLSB4MiAqIHkxXG4gICAgICAgIGRlbm9tID0gKGExICogYjIgLSBhMiAqIGIxKTtcblxuICAgIGlmICghZGVub20pIHJldHVybjsgLy8gcGFyYWxsZWwgbGluZXMgaGF2bid0IGFuIGludGVyc2VjdGlvblxuXG4gICAgdmFyIGNyb3NzID0gW1xuICAgICAgICAgICAgKGIxICogYzIgLSBiMiAqIGMxKSAvIGRlbm9tLFxuICAgICAgICAgICAgKGExICogYzIgLSBhMiAqIGMxKSAvIC1kZW5vbVxuICAgICAgICBdO1xuICAgIGlmIChcbiAgICAgICAgIWlzTmFOKGNyb3NzWzBdKSAmJiAhaXNOYU4oY3Jvc3NbMV0pICYmXG4gICAgICAgIGlzRmluaXRlKGNyb3NzWzBdKSAmJiBpc0Zpbml0ZShjcm9zc1sxXSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIGNyb3NzO1xuICAgIH1cblxufVxuXG4vKipcbiAqIERlY3JlYXNlIGFjY3VyYWN5IG9mIGZsb2F0aW5nLXBvaW50IG51bWJlcnNcbiAqIGluIHBhdGggZGF0YSBrZWVwaW5nIGEgc3BlY2lmaWVkIG51bWJlciBvZiBkZWNpbWFscy5cbiAqIFNtYXJ0IHJvdW5kcyB2YWx1ZXMgbGlrZSAyLjM0OTEgdG8gMi4zNSBpbnN0ZWFkIG9mIDIuMzQ5LlxuICogRG9lc24ndCBhcHBseSBcInNtYXJ0bmVzc1wiIGlmIHRoZSBudW1iZXIgcHJlY2lzaW9uIGZpdHMgYWxyZWFkeS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhIGlucHV0IGRhdGEgYXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fSBvdXRwdXQgZGF0YSBhcnJheVxuICovXG5mdW5jdGlvbiBzdHJvbmdSb3VuZChkYXRhKSB7XG4gICAgZm9yICh2YXIgaSA9IGRhdGEubGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgICBpZiAoZGF0YVtpXS50b0ZpeGVkKHByZWNpc2lvbikgIT0gZGF0YVtpXSkge1xuICAgICAgICAgICAgdmFyIHJvdW5kZWQgPSArZGF0YVtpXS50b0ZpeGVkKHByZWNpc2lvbiAtIDEpO1xuICAgICAgICAgICAgZGF0YVtpXSA9ICtNYXRoLmFicyhyb3VuZGVkIC0gZGF0YVtpXSkudG9GaXhlZChwcmVjaXNpb24gKyAxKSA+PSBlcnJvciA/XG4gICAgICAgICAgICAgICAgK2RhdGFbaV0udG9GaXhlZChwcmVjaXNpb24pIDpcbiAgICAgICAgICAgICAgICByb3VuZGVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNpbXBsZSByb3VuZGluZyBmdW5jdGlvbiBpZiBwcmVjaXNpb24gaXMgMC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhIGlucHV0IGRhdGEgYXJyYXlcbiAqIEByZXR1cm4ge0FycmF5fSBvdXRwdXQgZGF0YSBhcnJheVxuICovXG5mdW5jdGlvbiByb3VuZChkYXRhKSB7XG4gICAgZm9yICh2YXIgaSA9IGRhdGEubGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgICBkYXRhW2ldID0gTWF0aC5yb3VuZChkYXRhW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgY3VydmUgaXMgYSBzdHJhaWdodCBsaW5lIGJ5IG1lYXN1cmluZyBkaXN0YW5jZVxuICogZnJvbSBtaWRkbGUgcG9pbnRzIHRvIHRoZSBsaW5lIGZvcm1lZCBieSBlbmQgcG9pbnRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHhzIGFycmF5IG9mIGN1cnZlIHBvaW50cyB4LWNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge0FycmF5fSB5cyBhcnJheSBvZiBjdXJ2ZSBwb2ludHMgeS1jb29yZGluYXRlc1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5mdW5jdGlvbiBpc0N1cnZlU3RyYWlnaHRMaW5lKGRhdGEpIHtcblxuICAgIC8vIEdldCBsaW5lIGVxdWF0aW9uIGHCt3ggKyBiwrd5ICsgYyA9IDAgY29lZmZpY2llbnRzIGEsIGIgKGMgPSAwKSBieSBzdGFydCBhbmQgZW5kIHBvaW50cy5cbiAgICB2YXIgaSA9IGRhdGEubGVuZ3RoIC0gMixcbiAgICAgICAgYSA9IC1kYXRhW2kgKyAxXSwgLy8geTEg4oiSIHkyICh5MSA9IDApXG4gICAgICAgIGIgPSBkYXRhW2ldLCAgICAgIC8vIHgyIOKIkiB4MSAoeDEgPSAwKVxuICAgICAgICBkID0gMSAvIChhICogYSArIGIgKiBiKTsgLy8gc2FtZSBwYXJ0IGZvciBhbGwgcG9pbnRzXG5cbiAgICBpZiAoaSA8PSAxIHx8ICFpc0Zpbml0ZShkKSkgcmV0dXJuIGZhbHNlOyAvLyBjdXJ2ZSB0aGF0IGVuZHMgYXQgc3RhcnQgcG9pbnQgaXNuJ3QgdGhlIGNhc2VcblxuICAgIC8vIERpc3RhbmNlIGZyb20gcG9pbnQgKHgwLCB5MCkgdG8gdGhlIGxpbmUgaXMgc3FydCgoYyDiiJIgYcK3eDAg4oiSIGLCt3kwKcKyIC8gKGHCsiArIGLCsikpXG4gICAgd2hpbGUgKChpIC09IDIpID49IDApIHtcbiAgICAgICAgaWYgKE1hdGguc3FydChNYXRoLnBvdyhhICogZGF0YVtpXSArIGIgKiBkYXRhW2kgKyAxXSwgMikgKiBkKSA+IGVycm9yKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgbmV4dCBjdXJ2ZSBmcm9tIHNob3J0aGFuZCB0byBmdWxsIGZvcm0gdXNpbmcgdGhlIGN1cnJlbnQgY3VydmUgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJ2ZSB0byBjb252ZXJ0XG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhIGN1cnJlbnQgY3VydmUgZGF0YVxuICovXG5cbmZ1bmN0aW9uIG1ha2VMb25naGFuZChpdGVtLCBkYXRhKSB7XG4gICAgc3dpdGNoIChpdGVtLmluc3RydWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3MnOiBpdGVtLmluc3RydWN0aW9uID0gJ2MnOyBicmVhaztcbiAgICAgICAgY2FzZSAndCc6IGl0ZW0uaW5zdHJ1Y3Rpb24gPSAncSc7IGJyZWFrO1xuICAgIH1cbiAgICBpdGVtLmRhdGEudW5zaGlmdChkYXRhW2RhdGEubGVuZ3RoIC0gMl0gLSBkYXRhW2RhdGEubGVuZ3RoIC0gNF0sIGRhdGFbZGF0YS5sZW5ndGggLSAxXSAtIGRhdGFbZGF0YS5sZW5ndGggLSAzXSk7XG4gICAgcmV0dXJuIGl0ZW07XG59XG5cbi8qKlxuICogUmV0dXJucyBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwb2ludDEgZmlyc3QgcG9pbnQgY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7QXJyYXl9IHBvaW50MiBzZWNvbmQgcG9pbnQgY29vcmRpbmF0ZXNcbiAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAqL1xuXG5mdW5jdGlvbiBnZXREaXN0YW5jZShwb2ludDEsIHBvaW50Mikge1xuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocG9pbnQxWzBdIC0gcG9pbnQyWzBdLCAyKSArIE1hdGgucG93KHBvaW50MVsxXSAtIHBvaW50MlsxXSwgMikpO1xufVxuXG4vKipcbiAqIFJldHVybnMgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnZlIHBvaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNlcnRhaW4gdFxuICogYcK3KDEgLSB0KcKzwrdwMSArIGLCtygxIC0gdCnCssK3dMK3cDIgKyBjwrcoMSAtIHQpwrd0wrLCt3AzICsgZMK3dMKzwrdwNCxcbiAqIHdoZXJlIHBOIGFyZSBjb250cm9sIHBvaW50cyBhbmQgcDEgaXMgemVybyBkdWUgdG8gcmVsYXRpdmUgY29vcmRpbmF0ZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gY3VydmUgYXJyYXkgb2YgY3VydmUgcG9pbnRzIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge051bWJlcn0gdCBwYXJhbWV0cmljIHBvc2l0aW9uIGZyb20gMCB0byAxXG4gKiBAcmV0dXJuIHtBcnJheX0gUG9pbnQgY29vcmRpbmF0ZXNcbiAqL1xuXG5mdW5jdGlvbiBnZXRDdWJpY0JlemllclBvaW50KGN1cnZlLCB0KSB7XG4gICAgdmFyIHNxclQgPSB0ICogdCxcbiAgICAgICAgY3ViVCA9IHNxclQgKiB0LFxuICAgICAgICBtdCA9IDEgLSB0LFxuICAgICAgICBzcXJNdCA9IG10ICogbXQ7XG5cbiAgICByZXR1cm4gW1xuICAgICAgICAzICogc3FyTXQgKiB0ICogY3VydmVbMF0gKyAzICogbXQgKiBzcXJUICogY3VydmVbMl0gKyBjdWJUICogY3VydmVbNF0sXG4gICAgICAgIDMgKiBzcXJNdCAqIHQgKiBjdXJ2ZVsxXSArIDMgKiBtdCAqIHNxclQgKiBjdXJ2ZVszXSArIGN1YlQgKiBjdXJ2ZVs1XVxuICAgIF07XG59XG5cbi8qKlxuICogRmluZHMgY2lyY2xlIGJ5IDMgcG9pbnRzIG9mIHRoZSBjdXJ2ZSBhbmQgY2hlY2tzIGlmIHRoZSBjdXJ2ZSBmaXRzIHRoZSBmb3VuZCBjaXJjbGUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gY3VydmVcbiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9IGNpcmNsZVxuICovXG5cbmZ1bmN0aW9uIGZpbmRDaXJjbGUoY3VydmUpIHtcbiAgICB2YXIgbWlkUG9pbnQgPSBnZXRDdWJpY0JlemllclBvaW50KGN1cnZlLCAxLzIpLFxuICAgICAgICBtMSA9IFttaWRQb2ludFswXSAvIDIsIG1pZFBvaW50WzFdIC8gMl0sXG4gICAgICAgIG0yID0gWyhtaWRQb2ludFswXSArIGN1cnZlWzRdKSAvIDIsIChtaWRQb2ludFsxXSArIGN1cnZlWzVdKSAvIDJdLFxuICAgICAgICBjZW50ZXIgPSBnZXRJbnRlcnNlY3Rpb24oW1xuICAgICAgICAgICAgbTFbMF0sIG0xWzFdLFxuICAgICAgICAgICAgbTFbMF0gKyBtMVsxXSwgbTFbMV0gLSBtMVswXSxcbiAgICAgICAgICAgIG0yWzBdLCBtMlsxXSxcbiAgICAgICAgICAgIG0yWzBdICsgKG0yWzFdIC0gbWlkUG9pbnRbMV0pLCBtMlsxXSAtIChtMlswXSAtIG1pZFBvaW50WzBdKVxuICAgICAgICBdKSxcbiAgICAgICAgcmFkaXVzID0gY2VudGVyICYmIGdldERpc3RhbmNlKFswLCAwXSwgY2VudGVyKSxcbiAgICAgICAgdG9sZXJhbmNlID0gTWF0aC5taW4oYXJjVGhyZXNob2xkICogZXJyb3IsIGFyY1RvbGVyYW5jZSAqIHJhZGl1cyAvIDEwMCk7XG5cbiAgICBpZiAoY2VudGVyICYmIFsxLzQsIDMvNF0uZXZlcnkoZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGdldERpc3RhbmNlKGdldEN1YmljQmV6aWVyUG9pbnQoY3VydmUsIHBvaW50KSwgY2VudGVyKSAtIHJhZGl1cykgPD0gdG9sZXJhbmNlO1xuICAgIH0pKVxuICAgICAgICByZXR1cm4geyBjZW50ZXI6IGNlbnRlciwgcmFkaXVzOiByYWRpdXN9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGN1cnZlIGZpdHMgdGhlIGdpdmVuIGNpcmNsZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY2lyY2xlXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJ2ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5mdW5jdGlvbiBpc0FyYyhjdXJ2ZSwgY2lyY2xlKSB7XG4gICAgdmFyIHRvbGVyYW5jZSA9IE1hdGgubWluKGFyY1RocmVzaG9sZCAqIGVycm9yLCBhcmNUb2xlcmFuY2UgKiBjaXJjbGUucmFkaXVzIC8gMTAwKTtcblxuICAgIHJldHVybiBbMCwgMS80LCAxLzIsIDMvNCwgMV0uZXZlcnkoZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGdldERpc3RhbmNlKGdldEN1YmljQmV6aWVyUG9pbnQoY3VydmUsIHBvaW50KSwgY2lyY2xlLmNlbnRlcikgLSBjaXJjbGUucmFkaXVzKSA8PSB0b2xlcmFuY2U7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcHJldmlvdXMgY3VydmUgZml0cyB0aGUgZ2l2ZW4gY2lyY2xlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaXJjbGVcbiAqIEBwYXJhbSB7QXJyYXl9IGN1cnZlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5cbmZ1bmN0aW9uIGlzQXJjUHJldihjdXJ2ZSwgY2lyY2xlKSB7XG4gICAgcmV0dXJuIGlzQXJjKGN1cnZlLCB7XG4gICAgICAgIGNlbnRlcjogW2NpcmNsZS5jZW50ZXJbMF0gKyBjdXJ2ZVs0XSwgY2lyY2xlLmNlbnRlclsxXSArIGN1cnZlWzVdXSxcbiAgICAgICAgcmFkaXVzOiBjaXJjbGUucmFkaXVzXG4gICAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgYW5nbGUgb2YgYSBjdXJ2ZSBmaXR0aW5nIHRoZSBnaXZlbiBhcmMuXG5cbiAqIEBwYXJhbSB7QXJyYXl9IGN1cnZlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVsQ2lyY2xlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gKi9cblxuZnVuY3Rpb24gZmluZEFyY0FuZ2xlKGN1cnZlLCByZWxDaXJjbGUpIHtcbiAgICB2YXIgeDEgPSAtcmVsQ2lyY2xlLmNlbnRlclswXSxcbiAgICAgICAgeTEgPSAtcmVsQ2lyY2xlLmNlbnRlclsxXSxcbiAgICAgICAgeDIgPSBjdXJ2ZVs0XSAtIHJlbENpcmNsZS5jZW50ZXJbMF0sXG4gICAgICAgIHkyID0gY3VydmVbNV0gLSByZWxDaXJjbGUuY2VudGVyWzFdO1xuXG4gICAgcmV0dXJuIE1hdGguYWNvcyhcbiAgICAgICAgICAgICh4MSAqIHgyICsgeTEgKiB5MikgL1xuICAgICAgICAgICAgTWF0aC5zcXJ0KCh4MSAqIHgxICsgeTEgKiB5MSkgKiAoeDIgKiB4MiArIHkyICogeTIpKVxuICAgICAgICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGdpdmVuIHBhdGggZGF0YSB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtBcnJheX0gcGF0aERhdGFcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBkYXRhMlBhdGgocGFyYW1zLCBwYXRoRGF0YSkge1xuICAgIHJldHVybiBwYXRoRGF0YS5yZWR1Y2UoZnVuY3Rpb24ocGF0aFN0cmluZywgaXRlbSkge1xuICAgICAgICByZXR1cm4gcGF0aFN0cmluZyArIGl0ZW0uaW5zdHJ1Y3Rpb24gKyAoaXRlbS5kYXRhID8gY2xlYW51cE91dERhdGEocm91bmREYXRhKGl0ZW0uZGF0YS5zbGljZSgpKSwgcGFyYW1zKSA6ICcnKTtcbiAgICB9LCAnJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ2NvbGxhcHNlcyBtdWx0aXBsZSB0cmFuc2Zvcm1hdGlvbnMgYW5kIG9wdGltaXplcyBpdCc7XG5cbmV4cG9ydHMucGFyYW1zID0ge1xuICAgIGNvbnZlcnRUb1Nob3J0czogdHJ1ZSxcbiAgICAvLyBkZWdQcmVjaXNpb246IDMsIC8vIHRyYW5zZm9ybVByZWNpc2lvbiAob3IgbWF0cml4IHByZWNpc2lvbikgLSAyIGJ5IGRlZmF1bHRcbiAgICBmbG9hdFByZWNpc2lvbjogMyxcbiAgICB0cmFuc2Zvcm1QcmVjaXNpb246IDUsXG4gICAgbWF0cml4VG9UcmFuc2Zvcm06IHRydWUsXG4gICAgc2hvcnRUcmFuc2xhdGU6IHRydWUsXG4gICAgc2hvcnRTY2FsZTogdHJ1ZSxcbiAgICBzaG9ydFJvdGF0ZTogdHJ1ZSxcbiAgICByZW1vdmVVc2VsZXNzOiB0cnVlLFxuICAgIGNvbGxhcHNlSW50b09uZTogdHJ1ZSxcbiAgICBsZWFkaW5nWmVybzogdHJ1ZSxcbiAgICBuZWdhdGl2ZUV4dHJhU3BhY2U6IGZhbHNlXG59O1xuXG52YXIgY2xlYW51cE91dERhdGEgPSByZXF1aXJlKCcuLi9saWIvc3Znby90b29scycpLmNsZWFudXBPdXREYXRhLFxuICAgIHRyYW5zZm9ybTJqcyA9IHJlcXVpcmUoJy4vX3RyYW5zZm9ybXMuanMnKS50cmFuc2Zvcm0yanMsXG4gICAgdHJhbnNmb3Jtc011bHRpcGx5ID0gcmVxdWlyZSgnLi9fdHJhbnNmb3Jtcy5qcycpLnRyYW5zZm9ybXNNdWx0aXBseSxcbiAgICBtYXRyaXhUb1RyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3RyYW5zZm9ybXMuanMnKS5tYXRyaXhUb1RyYW5zZm9ybSxcbiAgICBkZWdSb3VuZCxcbiAgICBmbG9hdFJvdW5kLFxuICAgIHRyYW5zZm9ybVJvdW5kO1xuXG4vKipcbiAqIENvbnZlcnQgbWF0cmljZXMgdG8gdGhlIHNob3J0IGFsaWFzZXMsXG4gKiBjb252ZXJ0IGxvbmcgdHJhbnNsYXRlLCBzY2FsZSBvciByb3RhdGUgdHJhbnNmb3JtIG5vdGF0aW9ucyB0byB0aGUgc2hvcnRzIG9uZXMsXG4gKiBjb252ZXJ0IHRyYW5zZm9ybXMgdG8gdGhlIG1hdHJpY2VzIGFuZCBtdWx0aXBseSB0aGVtIGFsbCBpbnRvIG9uZSxcbiAqIHJlbW92ZSB1c2VsZXNzIHRyYW5zZm9ybXMuXG4gKlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvY29vcmRzLmh0bWwjVHJhbnNmb3JtTWF0cml4RGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEtpciBCZWxldmljaFxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSwgcGFyYW1zKSB7XG5cbiAgICBpZiAoaXRlbS5lbGVtKSB7XG5cbiAgICAgICAgLy8gdHJhbnNmb3JtXG4gICAgICAgIGlmIChpdGVtLmhhc0F0dHIoJ3RyYW5zZm9ybScpKSB7XG4gICAgICAgICAgICBjb252ZXJ0VHJhbnNmb3JtKGl0ZW0sICd0cmFuc2Zvcm0nLCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ3JhZGllbnRUcmFuc2Zvcm1cbiAgICAgICAgaWYgKGl0ZW0uaGFzQXR0cignZ3JhZGllbnRUcmFuc2Zvcm0nKSkge1xuICAgICAgICAgICAgY29udmVydFRyYW5zZm9ybShpdGVtLCAnZ3JhZGllbnRUcmFuc2Zvcm0nLCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGF0dGVyblRyYW5zZm9ybVxuICAgICAgICBpZiAoaXRlbS5oYXNBdHRyKCdwYXR0ZXJuVHJhbnNmb3JtJykpIHtcbiAgICAgICAgICAgIGNvbnZlcnRUcmFuc2Zvcm0oaXRlbSwgJ3BhdHRlcm5UcmFuc2Zvcm0nLCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbn07XG5cbi8qKlxuICogTWFpbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBpbnB1dCBpdGVtXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0ck5hbWUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICovXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNmb3JtKGl0ZW0sIGF0dHJOYW1lLCBwYXJhbXMpIHtcbiAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybTJqcyhpdGVtLmF0dHIoYXR0ck5hbWUpLnZhbHVlKTtcbiAgICBwYXJhbXMgPSBkZWZpbmVQcmVjaXNpb24oZGF0YSwgcGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMuY29sbGFwc2VJbnRvT25lICYmIGRhdGEubGVuZ3RoID4gMSkge1xuICAgICAgICBkYXRhID0gW3RyYW5zZm9ybXNNdWx0aXBseShkYXRhKV07XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5jb252ZXJ0VG9TaG9ydHMpIHtcbiAgICAgICAgZGF0YSA9IGNvbnZlcnRUb1Nob3J0cyhkYXRhLCBwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaChyb3VuZFRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZW1vdmVVc2VsZXNzKSB7XG4gICAgICAgIGRhdGEgPSByZW1vdmVVc2VsZXNzKGRhdGEpO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmxlbmd0aCkge1xuICAgICAgICBpdGVtLmF0dHIoYXR0ck5hbWUpLnZhbHVlID0ganMydHJhbnNmb3JtKGRhdGEsIHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5yZW1vdmVBdHRyKGF0dHJOYW1lKTtcbiAgICB9XG59XG5cbi8qKlxuICogRGVmaW5lcyBwcmVjaXNpb24gdG8gd29yayB3aXRoIGNlcnRhaW4gcGFydHMuXG4gKiB0cmFuc2Zvcm1QcmVjaXNpb24gLSBmb3Igc2NhbGUgYW5kIGZvdXIgZmlyc3QgbWF0cml4IHBhcmFtZXRlcnMgKG5lZWRzIGEgYmV0dGVyIHByZWNpc2lvbiBkdWUgdG8gbXVsdGlwbHlpbmcpLFxuICogZmxvYXRQcmVjaXNpb24gLSBmb3IgdHJhbnNsYXRlIGluY2x1ZGluZyB0d28gbGFzdCBtYXRyaXggYW5kIHJvdGF0ZSBwYXJhbWV0ZXJzLFxuICogZGVnUHJlY2lzaW9uIC0gZm9yIHJvdGF0ZSBhbmQgc2tldy4gQnkgZGVmYXVsdCBpdCdzIGVxdWFsIHRvIChyb3VnbHkpXG4gKiB0cmFuc2Zvcm1QcmVjaXNpb24gLSAyIG9yIGZsb2F0UHJlY2lzaW9uIHdoaWNoZXZlciBpcyBsb3dlci4gQ2FuIGJlIHNldCBpbiBwYXJhbXMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBpbnB1dCBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IGFycmF5XG4gKi9cbmZ1bmN0aW9uIGRlZmluZVByZWNpc2lvbihkYXRhLCBwYXJhbXMpIHtcbiAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gICAgdmFyIG1hdHJpeERhdGEgPSBkYXRhLnJlZHVjZShnZXRNYXRyaXhEYXRhLCBbXSksXG4gICAgICAgIHNpZ25pZmljYW50RGlnaXRzID0gcGFyYW1zLnRyYW5zZm9ybVByZWNpc2lvbjtcblxuICAgIC8vIENsb25lIHBhcmFtcyBzbyBpdCBkb24ndCBhZmZlY3Qgb3RoZXIgZWxlbWVudHMgdHJhbnNmb3JtYXRpb25zLlxuICAgIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyk7XG5cbiAgICAvLyBMaW1pdCB0cmFuc2Zvcm0gcHJlY2lzaW9uIHdpdGggbWF0cml4IG9uZS4gQ2FsY3VsYXRpbmcgd2l0aCBsYXJnZXIgcHJlY2lzaW9uIGRvZXNuJ3QgYWRkIGFueSB2YWx1ZS5cbiAgICBpZiAobWF0cml4RGF0YS5sZW5ndGgpIHtcbiAgICAgICAgcGFyYW1zLnRyYW5zZm9ybVByZWNpc2lvbiA9IE1hdGgubWluKHBhcmFtcy50cmFuc2Zvcm1QcmVjaXNpb24sXG4gICAgICAgICAgICBNYXRoLm1heC5hcHBseShNYXRoLCBtYXRyaXhEYXRhLm1hcChmbG9hdERpZ2l0cykpIHx8IHBhcmFtcy50cmFuc2Zvcm1QcmVjaXNpb24pO1xuXG4gICAgICAgIHNpZ25pZmljYW50RGlnaXRzID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgbWF0cml4RGF0YS5tYXAoZnVuY3Rpb24obikge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhuKS5yZXBsYWNlKC9cXEQrL2csICcnKS5sZW5ndGg7IC8vIE51bWJlciBvZiBkaWdpdHMgaW4gYSBudW1iZXIuIDEyMy40NSDihpIgNVxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8vIE5vIHNlbnNlIGluIGFuZ2xlIHByZWNpc2lvbiBtb3JlIHRoZW4gbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBpbiBtYXRyaXguXG4gICAgaWYgKCEoJ2RlZ1ByZWNpc2lvbicgaW4gcGFyYW1zKSkge1xuICAgICAgICBwYXJhbXMuZGVnUHJlY2lzaW9uID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFyYW1zLmZsb2F0UHJlY2lzaW9uLCBzaWduaWZpY2FudERpZ2l0cyAtIDIpKTtcbiAgICB9XG5cbiAgICBmbG9hdFJvdW5kID0gcGFyYW1zLmZsb2F0UHJlY2lzaW9uID49IDEgJiYgcGFyYW1zLmZsb2F0UHJlY2lzaW9uIDwgMjAgP1xuICAgICAgICBzbWFydFJvdW5kLmJpbmQodGhpcywgcGFyYW1zLmZsb2F0UHJlY2lzaW9uKSA6XG4gICAgICAgIHJvdW5kO1xuICAgIGRlZ1JvdW5kID0gcGFyYW1zLmRlZ1ByZWNpc2lvbiA+PSAxICYmIHBhcmFtcy5mbG9hdFByZWNpc2lvbiA8IDIwID9cbiAgICAgICAgc21hcnRSb3VuZC5iaW5kKHRoaXMsIHBhcmFtcy5kZWdQcmVjaXNpb24pIDpcbiAgICAgICAgcm91bmQ7XG4gICAgdHJhbnNmb3JtUm91bmQgPSBwYXJhbXMudHJhbnNmb3JtUHJlY2lzaW9uID49IDEgJiYgcGFyYW1zLmZsb2F0UHJlY2lzaW9uIDwgMjAgP1xuICAgICAgICBzbWFydFJvdW5kLmJpbmQodGhpcywgcGFyYW1zLnRyYW5zZm9ybVByZWNpc2lvbikgOlxuICAgICAgICByb3VuZDtcblxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogR2F0aGVycyBmb3VyIGZpcnN0IG1hdHJpeCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgYXJyYXkgb2YgZGF0YVxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybVxuICogQHJldHVybiB7QXJyYXl9IG91dHB1dCBhcnJheVxuICovXG5mdW5jdGlvbiBnZXRNYXRyaXhEYXRhKGEsIGIpIHtcbiAgICByZXR1cm4gYi5uYW1lID09ICdtYXRyaXgnID8gYS5jb25jYXQoYi5kYXRhLnNsaWNlKDAsIDQpKSA6IGE7XG59XG5cbi8qKlxuICogUmV0dXJucyBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBwb2ludC4gMC4xMjUg4oaSIDNcbiAqL1xuZnVuY3Rpb24gZmxvYXREaWdpdHMobikge1xuICAgIHJldHVybiAobiA9IFN0cmluZyhuKSkuc2xpY2Uobi5pbmRleE9mKCcuJykpLmxlbmd0aCAtIDE7XG59XG5cbi8qKlxuICogQ29udmVydCB0cmFuc2Zvcm1zIHRvIHRoZSBzaG9ydGhhbmQgYWx0ZXJuYXRpdmVzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgaW5wdXQgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICogQHJldHVybiB7QXJyYXl9IG91dHB1dCBhcnJheVxuICovXG5mdW5jdGlvbiBjb252ZXJ0VG9TaG9ydHModHJhbnNmb3JtcywgcGFyYW1zKSB7XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW2ldO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgbWF0cml4IHRvIHRoZSBzaG9ydCBhbGlhc2VzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5tYXRyaXhUb1RyYW5zZm9ybSAmJlxuICAgICAgICAgICAgdHJhbnNmb3JtLm5hbWUgPT09ICdtYXRyaXgnXG4gICAgICAgICkge1xuICAgICAgICAgICAgdmFyIGRlY29tcG9zZWQgPSBtYXRyaXhUb1RyYW5zZm9ybSh0cmFuc2Zvcm0sIHBhcmFtcyk7XG4gICAgICAgICAgICBpZiAoZGVjb21wb3NlZCAhPSB0cmFuc2Zvcm0gJiZcbiAgICAgICAgICAgICAgICBqczJ0cmFuc2Zvcm0oZGVjb21wb3NlZCwgcGFyYW1zKS5sZW5ndGggPD0ganMydHJhbnNmb3JtKFt0cmFuc2Zvcm1dLCBwYXJhbXMpLmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgdHJhbnNmb3Jtcy5zcGxpY2UuYXBwbHkodHJhbnNmb3JtcywgW2ksIDFdLmNvbmNhdChkZWNvbXBvc2VkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZml4ZWQtcG9pbnQgbnVtYmVyc1xuICAgICAgICAvLyAxMi43NTQ5OTcg4oaSIDEyLjc1NVxuICAgICAgICByb3VuZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgbG9uZyB0cmFuc2xhdGUgdHJhbnNmb3JtIG5vdGF0aW9uIHRvIHRoZSBzaG9ydHMgb25lXG4gICAgICAgIC8vIHRyYW5zbGF0ZSgxMCAwKSDihpIgdHJhbnNsYXRlKDEwKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMuc2hvcnRUcmFuc2xhdGUgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybS5uYW1lID09PSAndHJhbnNsYXRlJyAmJlxuICAgICAgICAgICAgdHJhbnNmb3JtLmRhdGEubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICAhdHJhbnNmb3JtLmRhdGFbMV1cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm0uZGF0YS5wb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnZlcnQgbG9uZyBzY2FsZSB0cmFuc2Zvcm0gbm90YXRpb24gdG8gdGhlIHNob3J0cyBvbmVcbiAgICAgICAgLy8gc2NhbGUoMiAyKSDihpIgc2NhbGUoMilcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1zLnNob3J0U2NhbGUgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybS5uYW1lID09PSAnc2NhbGUnICYmXG4gICAgICAgICAgICB0cmFuc2Zvcm0uZGF0YS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kYXRhWzBdID09PSB0cmFuc2Zvcm0uZGF0YVsxXVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kYXRhLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udmVydCBsb25nIHJvdGF0ZSB0cmFuc2Zvcm0gbm90YXRpb24gdG8gdGhlIHNob3J0IG9uZVxuICAgICAgICAvLyB0cmFuc2xhdGUoY3ggY3kpIHJvdGF0ZShhKSB0cmFuc2xhdGUoLWN4IC1jeSkg4oaSIHJvdGF0ZShhIGN4IGN5KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMuc2hvcnRSb3RhdGUgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybXNbaSAtIDJdICYmXG4gICAgICAgICAgICB0cmFuc2Zvcm1zW2kgLSAyXS5uYW1lID09PSAndHJhbnNsYXRlJyAmJlxuICAgICAgICAgICAgdHJhbnNmb3Jtc1tpIC0gMV0ubmFtZSA9PT0gJ3JvdGF0ZScgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybXNbaV0ubmFtZSA9PT0gJ3RyYW5zbGF0ZScgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybXNbaSAtIDJdLmRhdGFbMF0gPT09IC10cmFuc2Zvcm1zW2ldLmRhdGFbMF0gJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybXNbaSAtIDJdLmRhdGFbMV0gPT09IC10cmFuc2Zvcm1zW2ldLmRhdGFbMV1cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1zLnNwbGljZShpIC0gMiwgMywge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdyb3RhdGUnLFxuICAgICAgICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1tpIC0gMV0uZGF0YVswXSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1tpIC0gMl0uZGF0YVswXSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1tpIC0gMl0uZGF0YVsxXVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzcGxpY2UgY29tcGVuc2F0aW9uXG4gICAgICAgICAgICBpIC09IDI7XG5cbiAgICAgICAgICAgIHRyYW5zZm9ybSA9IHRyYW5zZm9ybXNbaV07XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2Zvcm1zO1xuXG59XG5cbi8qKlxuICogUmVtb3ZlIHVzZWxlc3MgdHJhbnNmb3Jtcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB0cmFuc2Zvcm1zIGlucHV0IGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IGFycmF5XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVVzZWxlc3ModHJhbnNmb3Jtcykge1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybXMuZmlsdGVyKGZ1bmN0aW9uKHRyYW5zZm9ybSkge1xuXG4gICAgICAgIC8vIHRyYW5zbGF0ZSgwKSwgcm90YXRlKDBbLCBjeCwgY3ldKSwgc2tld1goMCksIHNrZXdZKDApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFsndHJhbnNsYXRlJywgJ3JvdGF0ZScsICdza2V3WCcsICdza2V3WSddLmluZGV4T2YodHJhbnNmb3JtLm5hbWUpID4gLTEgJiZcbiAgICAgICAgICAgICh0cmFuc2Zvcm0uZGF0YS5sZW5ndGggPT0gMSB8fCB0cmFuc2Zvcm0ubmFtZSA9PSAncm90YXRlJykgJiZcbiAgICAgICAgICAgICF0cmFuc2Zvcm0uZGF0YVswXSB8fFxuXG4gICAgICAgICAgICAvLyB0cmFuc2xhdGUoMCwgMClcbiAgICAgICAgICAgIHRyYW5zZm9ybS5uYW1lID09ICd0cmFuc2xhdGUnICYmXG4gICAgICAgICAgICAhdHJhbnNmb3JtLmRhdGFbMF0gJiZcbiAgICAgICAgICAgICF0cmFuc2Zvcm0uZGF0YVsxXSB8fFxuXG4gICAgICAgICAgICAvLyBzY2FsZSgxKVxuICAgICAgICAgICAgdHJhbnNmb3JtLm5hbWUgPT0gJ3NjYWxlJyAmJlxuICAgICAgICAgICAgdHJhbnNmb3JtLmRhdGFbMF0gPT0gMSAmJlxuICAgICAgICAgICAgKHRyYW5zZm9ybS5kYXRhLmxlbmd0aCA8IDIgfHwgdHJhbnNmb3JtLmRhdGFbMV0gPT0gMSkgfHxcblxuICAgICAgICAgICAgLy8gbWF0cml4KDEgMCAwIDEgMCAwKVxuICAgICAgICAgICAgdHJhbnNmb3JtLm5hbWUgPT0gJ21hdHJpeCcgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kYXRhWzBdID09IDEgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kYXRhWzNdID09IDEgJiZcbiAgICAgICAgICAgICEodHJhbnNmb3JtLmRhdGFbMV0gfHwgdHJhbnNmb3JtLmRhdGFbMl0gfHwgdHJhbnNmb3JtLmRhdGFbNF0gfHwgdHJhbnNmb3JtLmRhdGFbNV0pXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9KTtcblxufVxuXG4vKipcbiAqIENvbnZlcnQgdHJhbnNmb3JtcyBKUyByZXByZXNlbnRhdGlvbiB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtSlMgSlMgcmVwcmVzZW50YXRpb24gYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICogQHJldHVybiB7U3RyaW5nfSBvdXRwdXQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzMnRyYW5zZm9ybSh0cmFuc2Zvcm1KUywgcGFyYW1zKSB7XG5cbiAgICB2YXIgdHJhbnNmb3JtU3RyaW5nID0gJyc7XG5cbiAgICAvLyBjb2xsZWN0IG91dHB1dCB2YWx1ZSBzdHJpbmdcbiAgICB0cmFuc2Zvcm1KUy5mb3JFYWNoKGZ1bmN0aW9uKHRyYW5zZm9ybSkge1xuICAgICAgICByb3VuZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm1TdHJpbmcgKz0gKHRyYW5zZm9ybVN0cmluZyAmJiAnICcpICsgdHJhbnNmb3JtLm5hbWUgKyAnKCcgKyBjbGVhbnVwT3V0RGF0YSh0cmFuc2Zvcm0uZGF0YSwgcGFyYW1zKSArICcpJztcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1TdHJpbmc7XG5cbn1cblxuZnVuY3Rpb24gcm91bmRUcmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgc3dpdGNoICh0cmFuc2Zvcm0ubmFtZSkge1xuICAgICAgICBjYXNlICd0cmFuc2xhdGUnOlxuICAgICAgICAgICAgdHJhbnNmb3JtLmRhdGEgPSBmbG9hdFJvdW5kKHRyYW5zZm9ybS5kYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyb3RhdGUnOlxuICAgICAgICAgICAgdHJhbnNmb3JtLmRhdGEgPSBkZWdSb3VuZCh0cmFuc2Zvcm0uZGF0YS5zbGljZSgwLCAxKSkuY29uY2F0KGZsb2F0Um91bmQodHJhbnNmb3JtLmRhdGEuc2xpY2UoMSkpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdza2V3WCc6XG4gICAgICAgIGNhc2UgJ3NrZXdZJzpcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kYXRhID0gZGVnUm91bmQodHJhbnNmb3JtLmRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NjYWxlJzpcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kYXRhID0gdHJhbnNmb3JtUm91bmQodHJhbnNmb3JtLmRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21hdHJpeCc6XG4gICAgICAgICAgICB0cmFuc2Zvcm0uZGF0YSA9IHRyYW5zZm9ybVJvdW5kKHRyYW5zZm9ybS5kYXRhLnNsaWNlKDAsIDQpKS5jb25jYXQoZmxvYXRSb3VuZCh0cmFuc2Zvcm0uZGF0YS5zbGljZSg0KSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm07XG59XG5cbi8qKlxuICogUm91bmRzIG51bWJlcnMgaW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZGF0YSBpbnB1dCBkYXRhIGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IGRhdGEgYXJyYXlcbiAqL1xuZnVuY3Rpb24gcm91bmQoZGF0YSkge1xuICAgIHJldHVybiBkYXRhLm1hcChNYXRoLnJvdW5kKTtcbn1cblxuLyoqXG4gKiBEZWNyZWFzZSBhY2N1cmFjeSBvZiBmbG9hdGluZy1wb2ludCBudW1iZXJzXG4gKiBpbiB0cmFuc2Zvcm1zIGtlZXBpbmcgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWxzLlxuICogU21hcnQgcm91bmRzIHZhbHVlcyBsaWtlIDIuMzQ5IHRvIDIuMzUuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGZpeGVkIG51bWJlciBvZiBkZWNpbWFsc1xuICogQHBhcmFtIHtBcnJheX0gZGF0YSBpbnB1dCBkYXRhIGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IGRhdGEgYXJyYXlcbiAqL1xuZnVuY3Rpb24gc21hcnRSb3VuZChwcmVjaXNpb24sIGRhdGEpIHtcbiAgICBmb3IgKHZhciBpID0gZGF0YS5sZW5ndGgsIHRvbGVyYW5jZSA9ICtNYXRoLnBvdyguMSwgcHJlY2lzaW9uKS50b0ZpeGVkKHByZWNpc2lvbik7IGktLTspIHtcbiAgICAgICAgaWYgKGRhdGFbaV0udG9GaXhlZChwcmVjaXNpb24pICE9IGRhdGFbaV0pIHtcbiAgICAgICAgICAgIHZhciByb3VuZGVkID0gK2RhdGFbaV0udG9GaXhlZChwcmVjaXNpb24gLSAxKTtcbiAgICAgICAgICAgIGRhdGFbaV0gPSArTWF0aC5hYnMocm91bmRlZCAtIGRhdGFbaV0pLnRvRml4ZWQocHJlY2lzaW9uICsgMSkgPj0gdG9sZXJhbmNlID9cbiAgICAgICAgICAgICAgICArZGF0YVtpXS50b0ZpeGVkKHByZWNpc2lvbikgOlxuICAgICAgICAgICAgICAgIHJvdW5kZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCAnLi4vdXRpbHMvbm9kZS1nbG9iYWxzL2dsb2JhbCc7XG5pbXBvcnQgc3ZnMmpzIGZyb20gJ3N2Z28vbGliL3N2Z28vc3ZnMmpzJztcbmltcG9ydCBqczJzdmcgZnJvbSAnc3Znby9saWIvc3Znby9qczJzdmcnO1xuaW1wb3J0IEpTQVBJIGZyb20gJ3N2Z28vbGliL3N2Z28vanNBUEknO1xuaW1wb3J0IENTU0NsYXNzTGlzdCBmcm9tICdzdmdvL2xpYi9zdmdvL2Nzcy1jbGFzcy1saXN0JztcbmltcG9ydCBDU1NTdHlsZURlY2xhcmF0aW9uIGZyb20gJ3N2Z28vbGliL3N2Z28vY3NzLXN0eWxlLWRlY2xhcmF0aW9uJztcbmltcG9ydCBwbHVnaW5zIGZyb20gJ3N2Z28vbGliL3N2Z28vcGx1Z2lucyc7XG5cbmltcG9ydCByZW1vdmVEb2N0eXBlIGZyb20gJ3N2Z28vcGx1Z2lucy9yZW1vdmVEb2N0eXBlJztcbmltcG9ydCByZW1vdmVYTUxQcm9jSW5zdCBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlWE1MUHJvY0luc3QnO1xuaW1wb3J0IHJlbW92ZUNvbW1lbnRzIGZyb20gJ3N2Z28vcGx1Z2lucy9yZW1vdmVDb21tZW50cyc7XG5pbXBvcnQgcmVtb3ZlTWV0YWRhdGEgZnJvbSAnc3Znby9wbHVnaW5zL3JlbW92ZU1ldGFkYXRhJztcbmltcG9ydCByZW1vdmVYTUxOUyBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlWE1MTlMnO1xuaW1wb3J0IHJlbW92ZUVkaXRvcnNOU0RhdGEgZnJvbSAnc3Znby9wbHVnaW5zL3JlbW92ZUVkaXRvcnNOU0RhdGEnO1xuaW1wb3J0IGNsZWFudXBBdHRycyBmcm9tICdzdmdvL3BsdWdpbnMvY2xlYW51cEF0dHJzJztcbmltcG9ydCBpbmxpbmVTdHlsZXMgZnJvbSAnc3Znby9wbHVnaW5zL2lubGluZVN0eWxlcyc7XG5pbXBvcnQgbWluaWZ5U3R5bGVzIGZyb20gJ3N2Z28vcGx1Z2lucy9taW5pZnlTdHlsZXMnO1xuaW1wb3J0IGNvbnZlcnRTdHlsZVRvQXR0cnMgZnJvbSAnc3Znby9wbHVnaW5zL2NvbnZlcnRTdHlsZVRvQXR0cnMnO1xuaW1wb3J0IGNsZWFudXBJRHMgZnJvbSAnc3Znby9wbHVnaW5zL2NsZWFudXBJRHMnO1xuaW1wb3J0IHJlbW92ZVJhc3RlckltYWdlcyBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlUmFzdGVySW1hZ2VzJztcbmltcG9ydCByZW1vdmVVc2VsZXNzRGVmcyBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlVXNlbGVzc0RlZnMnO1xuaW1wb3J0IGNsZWFudXBOdW1lcmljVmFsdWVzIGZyb20gJ3N2Z28vcGx1Z2lucy9jbGVhbnVwTnVtZXJpY1ZhbHVlcyc7XG5pbXBvcnQgY2xlYW51cExpc3RPZlZhbHVlcyBmcm9tICdzdmdvL3BsdWdpbnMvY2xlYW51cExpc3RPZlZhbHVlcyc7XG5pbXBvcnQgY29udmVydENvbG9ycyBmcm9tICdzdmdvL3BsdWdpbnMvY29udmVydENvbG9ycyc7XG5pbXBvcnQgcmVtb3ZlVW5rbm93bnNBbmREZWZhdWx0cyBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlVW5rbm93bnNBbmREZWZhdWx0cyc7XG5pbXBvcnQgcmVtb3ZlTm9uSW5oZXJpdGFibGVHcm91cEF0dHJzIGZyb20gJ3N2Z28vcGx1Z2lucy9yZW1vdmVOb25Jbmhlcml0YWJsZUdyb3VwQXR0cnMnO1xuaW1wb3J0IHJlbW92ZVVzZWxlc3NTdHJva2VBbmRGaWxsIGZyb20gJ3N2Z28vcGx1Z2lucy9yZW1vdmVVc2VsZXNzU3Ryb2tlQW5kRmlsbCc7XG5pbXBvcnQgcmVtb3ZlVmlld0JveCBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlVmlld0JveCc7XG5pbXBvcnQgY2xlYW51cEVuYWJsZUJhY2tncm91bmQgZnJvbSAnc3Znby9wbHVnaW5zL2NsZWFudXBFbmFibGVCYWNrZ3JvdW5kJztcbmltcG9ydCByZW1vdmVIaWRkZW5FbGVtcyBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlSGlkZGVuRWxlbXMnO1xuaW1wb3J0IHJlbW92ZUVtcHR5VGV4dCBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlRW1wdHlUZXh0JztcbmltcG9ydCBjb252ZXJ0U2hhcGVUb1BhdGggZnJvbSAnc3Znby9wbHVnaW5zL2NvbnZlcnRTaGFwZVRvUGF0aCc7XG5pbXBvcnQgbW92ZUVsZW1zQXR0cnNUb0dyb3VwIGZyb20gJ3N2Z28vcGx1Z2lucy9tb3ZlRWxlbXNBdHRyc1RvR3JvdXAnO1xuaW1wb3J0IG1vdmVHcm91cEF0dHJzVG9FbGVtcyBmcm9tICdzdmdvL3BsdWdpbnMvbW92ZUdyb3VwQXR0cnNUb0VsZW1zJztcbmltcG9ydCBjb2xsYXBzZUdyb3VwcyBmcm9tICdzdmdvL3BsdWdpbnMvY29sbGFwc2VHcm91cHMnO1xuaW1wb3J0IGNvbnZlcnRQYXRoRGF0YSBmcm9tICdzdmdvL3BsdWdpbnMvY29udmVydFBhdGhEYXRhJztcbmltcG9ydCBjb252ZXJ0VHJhbnNmb3JtIGZyb20gJ3N2Z28vcGx1Z2lucy9jb252ZXJ0VHJhbnNmb3JtJztcbmltcG9ydCByZW1vdmVFbXB0eUF0dHJzIGZyb20gJ3N2Z28vcGx1Z2lucy9yZW1vdmVFbXB0eUF0dHJzJztcbmltcG9ydCByZW1vdmVFbXB0eUNvbnRhaW5lcnMgZnJvbSAnc3Znby9wbHVnaW5zL3JlbW92ZUVtcHR5Q29udGFpbmVycyc7XG5pbXBvcnQgbWVyZ2VQYXRocyBmcm9tICdzdmdvL3BsdWdpbnMvbWVyZ2VQYXRocyc7XG5pbXBvcnQgcmVtb3ZlVW51c2VkTlMgZnJvbSAnc3Znby9wbHVnaW5zL3JlbW92ZVVudXNlZE5TJztcbmltcG9ydCBzb3J0QXR0cnMgZnJvbSAnc3Znby9wbHVnaW5zL3NvcnRBdHRycyc7XG5pbXBvcnQgcmVtb3ZlVGl0bGUgZnJvbSAnc3Znby9wbHVnaW5zL3JlbW92ZVRpdGxlJztcbmltcG9ydCByZW1vdmVEZXNjIGZyb20gJ3N2Z28vcGx1Z2lucy9yZW1vdmVEZXNjJztcbmltcG9ydCByZW1vdmVEaW1lbnNpb25zIGZyb20gJ3N2Z28vcGx1Z2lucy9yZW1vdmVEaW1lbnNpb25zJztcbmltcG9ydCByZW1vdmVTdHlsZUVsZW1lbnQgZnJvbSAnc3Znby9wbHVnaW5zL3JlbW92ZVN0eWxlRWxlbWVudCc7XG5pbXBvcnQgcmVtb3ZlU2NyaXB0RWxlbWVudCBmcm9tICdzdmdvL3BsdWdpbnMvcmVtb3ZlU2NyaXB0RWxlbWVudCc7XG5cbi8vIHRoZSBvcmRlciBpcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zdmcvc3Znby9ibG9iL21hc3Rlci8uc3Znby55bWxcbi8vIFNvbWUgYXJlIGNvbW1lbnRlZCBvdXQgaWYgdGhleSBoYXZlIG5vIGRlZmF1bHQgYWN0aW9uLlxuY29uc3QgcGx1Z2luc0RhdGEgPSB7XG4gIHJlbW92ZURvY3R5cGUsXG4gIHJlbW92ZVhNTFByb2NJbnN0LFxuICByZW1vdmVDb21tZW50cyxcbiAgcmVtb3ZlTWV0YWRhdGEsXG4gIHJlbW92ZVhNTE5TLFxuICByZW1vdmVFZGl0b3JzTlNEYXRhLFxuICBjbGVhbnVwQXR0cnMsXG4gIGlubGluZVN0eWxlcyxcbiAgbWluaWZ5U3R5bGVzLFxuICBjb252ZXJ0U3R5bGVUb0F0dHJzLFxuICBjbGVhbnVwSURzLFxuICAvL3ByZWZpeElkcyxcbiAgcmVtb3ZlUmFzdGVySW1hZ2VzLFxuICByZW1vdmVVc2VsZXNzRGVmcyxcbiAgY2xlYW51cE51bWVyaWNWYWx1ZXMsXG4gIGNsZWFudXBMaXN0T2ZWYWx1ZXMsXG4gIGNvbnZlcnRDb2xvcnMsXG4gIHJlbW92ZVVua25vd25zQW5kRGVmYXVsdHMsXG4gIHJlbW92ZU5vbkluaGVyaXRhYmxlR3JvdXBBdHRycyxcbiAgcmVtb3ZlVXNlbGVzc1N0cm9rZUFuZEZpbGwsXG4gIHJlbW92ZVZpZXdCb3gsXG4gIGNsZWFudXBFbmFibGVCYWNrZ3JvdW5kLFxuICByZW1vdmVIaWRkZW5FbGVtcyxcbiAgcmVtb3ZlRW1wdHlUZXh0LFxuICBjb252ZXJ0U2hhcGVUb1BhdGgsXG4gIG1vdmVFbGVtc0F0dHJzVG9Hcm91cCxcbiAgbW92ZUdyb3VwQXR0cnNUb0VsZW1zLFxuICBjb2xsYXBzZUdyb3VwcyxcbiAgY29udmVydFBhdGhEYXRhLFxuICBjb252ZXJ0VHJhbnNmb3JtLFxuICByZW1vdmVFbXB0eUF0dHJzLFxuICByZW1vdmVFbXB0eUNvbnRhaW5lcnMsXG4gIG1lcmdlUGF0aHMsXG4gIHJlbW92ZVVudXNlZE5TLFxuICBzb3J0QXR0cnMsXG4gIHJlbW92ZVRpdGxlLFxuICByZW1vdmVEZXNjLFxuICByZW1vdmVEaW1lbnNpb25zLFxuICAvL3JlbW92ZUF0dHJzLFxuICAvL3JlbW92ZUVsZW1lbnRzQnlBdHRyLFxuICAvL2FkZENsYXNzZXNUb1NWR0VsZW1lbnQsXG4gIHJlbW92ZVN0eWxlRWxlbWVudCxcbiAgcmVtb3ZlU2NyaXB0RWxlbWVudCxcbiAgLy9hZGRBdHRyaWJ1dGVzVG9TVkdFbGVtZW50LFxufTtcblxuLy8gQ2xvbmUgaXMgY3VycmVudGx5IGJyb2tlbi4gSGFjayBpdDpcbmZ1bmN0aW9uIGNsb25lUGFyc2VkU3ZnKHN2Zykge1xuICBjb25zdCBjbG9uZXMgPSBuZXcgTWFwKCk7XG5cbiAgZnVuY3Rpb24gY2xvbmVLZXlzKHRhcmdldCwgb2JqKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBjbG9uZShvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIGlmIChjbG9uZXMuaGFzKG9iaikpIHtcbiAgICAgIHJldHVybiBjbG9uZXMuZ2V0KG9iaik7XG4gICAgfVxuXG4gICAgbGV0IG9iakNsb25lO1xuXG4gICAgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gSlNBUEkpIHtcbiAgICAgIG9iakNsb25lID0gbmV3IEpTQVBJKHt9LCBvYmoucGFyZW50Tm9kZSk7XG4gICAgICBjbG9uZXMuc2V0KG9iaiwgb2JqQ2xvbmUpO1xuXG4gICAgICBpZiAob2JqLnBhcmVudE5vZGUpIHtcbiAgICAgICAgb2JqQ2xvbmUucGFyZW50Tm9kZSA9IGNsb25lKG9iai5wYXJlbnROb2RlKTtcbiAgICAgIH1cbiAgICAgIGNsb25lS2V5cyhvYmpDbG9uZSwgb2JqKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoXG4gICAgICBvYmouY29uc3RydWN0b3IgPT09IENTU0NsYXNzTGlzdCB8fFxuICAgICAgb2JqLmNvbnN0cnVjdG9yID09PSBDU1NTdHlsZURlY2xhcmF0aW9uIHx8XG4gICAgICBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdCB8fFxuICAgICAgb2JqLmNvbnN0cnVjdG9yID09PSBBcnJheVxuICAgICkge1xuICAgICAgb2JqQ2xvbmUgPSBuZXcgb2JqLmNvbnN0cnVjdG9yKCk7XG4gICAgICBjbG9uZXMuc2V0KG9iaiwgb2JqQ2xvbmUpO1xuICAgICAgY2xvbmVLZXlzKG9iakNsb25lLCBvYmopO1xuICAgIH1cbiAgICBlbHNlIGlmIChvYmouY29uc3RydWN0b3IgPT09IE1hcCkge1xuICAgICAgb2JqQ2xvbmUgPSBuZXcgTWFwKCk7XG4gICAgICBjbG9uZXMuc2V0KG9iaiwgb2JqQ2xvbmUpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2Ygb2JqKSB7XG4gICAgICAgIG9iakNsb25lLnNldChjbG9uZShrZXkpLCBjbG9uZSh2YWwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBTZXQpIHtcbiAgICAgIG9iakNsb25lID0gbmV3IFNldCgpO1xuICAgICAgY2xvbmVzLnNldChvYmosIG9iakNsb25lKTtcblxuICAgICAgZm9yIChjb25zdCB2YWwgb2Ygb2JqKSB7XG4gICAgICAgIG9iakNsb25lLmFkZChjbG9uZSh2YWwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcigndW5leHBlY3RlZCB0eXBlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iakNsb25lO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lKHN2Zyk7XG59XG5cbi8vIEFycmFuZ2UgcGx1Z2lucyBieSB0eXBlIC0gdGhpcyBpcyB3aGF0IHBsdWdpbnMoKSBleHBlY3RzXG5mdW5jdGlvbiBvcHRpbWl6ZVBsdWdpbnNBcnJheShwbHVnaW5zKSB7XG4gIHJldHVybiBwbHVnaW5zLm1hcChpdGVtID0+IFtpdGVtXSkucmVkdWNlKChhcnIsIGl0ZW0pID0+IHtcbiAgICBjb25zdCBsYXN0ID0gYXJyW2Fyci5sZW5ndGggLSAxXTtcblxuICAgIGlmIChsYXN0ICYmIGl0ZW1bMF0udHlwZSA9PT0gbGFzdFswXS50eXBlKSB7XG4gICAgICBsYXN0LnB1c2goaXRlbVswXSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYXJyLnB1c2goaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH0sIFtdKTtcbn1cblxuY29uc3Qgb3B0aW1pc2VkUGx1Z2luc0RhdGEgPSBvcHRpbWl6ZVBsdWdpbnNBcnJheShPYmplY3QudmFsdWVzKHBsdWdpbnNEYXRhKSk7XG5cbmZ1bmN0aW9uIGdldERpbWVuc2lvbnMocGFyc2VkU3ZnKSB7XG4gIGNvbnN0IHN2Z0VsID0gcGFyc2VkU3ZnLmNvbnRlbnQuZmlsdGVyKGVsID0+IGVsLmlzRWxlbSgnc3ZnJykpWzBdO1xuXG4gIGlmICghc3ZnRWwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBpZiAoc3ZnRWwuaGFzQXR0cignd2lkdGgnKSAmJiBzdmdFbC5oYXNBdHRyKCdoZWlnaHQnKSkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogcGFyc2VGbG9hdChzdmdFbC5hdHRyKCd3aWR0aCcpLnZhbHVlKSxcbiAgICAgIGhlaWdodDogcGFyc2VGbG9hdChzdmdFbC5hdHRyKCdoZWlnaHQnKS52YWx1ZSlcbiAgICB9O1xuICB9XG5cbiAgaWYgKHN2Z0VsLmhhc0F0dHIoJ3ZpZXdCb3gnKSkge1xuICAgIGNvbnN0IHZpZXdCb3ggPSBzdmdFbC5hdHRyKCd2aWV3Qm94JykudmFsdWUuc3BsaXQoLyg/OixcXHMqfFxccyspLyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHBhcnNlRmxvYXQodmlld0JveFsyXSksXG4gICAgICBoZWlnaHQ6IHBhcnNlRmxvYXQodmlld0JveFszXSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiogbXVsdGlwYXNzQ29tcHJlc3Moc2V0dGluZ3MpIHtcbiAgLy8gYWN0aXZhdGUvZGVhY3RpdmF0ZSBwbHVnaW5zXG4gIE9iamVjdC5rZXlzKHNldHRpbmdzLnBsdWdpbnMpLmZvckVhY2gocGx1Z2luTmFtZSA9PiB7XG4gICAgcGx1Z2luc0RhdGFbcGx1Z2luTmFtZV0uYWN0aXZlID0gc2V0dGluZ3MucGx1Z2luc1twbHVnaW5OYW1lXTtcbiAgfSk7XG5cbiAgLy8gU2V0IGZsb2F0UHJlY2lzaW9uIGFjcm9zcyBhbGwgdGhlIHBsdWdpbnNcbiAgY29uc3QgZmxvYXRQcmVjaXNpb24gPSBOdW1iZXIoc2V0dGluZ3MuZmxvYXRQcmVjaXNpb24pO1xuXG4gIGZvciAoY29uc3QgcGx1Z2luIG9mIE9iamVjdC52YWx1ZXMocGx1Z2luc0RhdGEpKSB7XG4gICAgaWYgKHBsdWdpbi5wYXJhbXMgJiYgJ2Zsb2F0UHJlY2lzaW9uJyBpbiBwbHVnaW4ucGFyYW1zKSB7XG4gICAgICBwbHVnaW4ucGFyYW1zLmZsb2F0UHJlY2lzaW9uID0gZmxvYXRQcmVjaXNpb247XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3ZnID0gY2xvbmVQYXJzZWRTdmcocGFyc2VkU3ZnKTtcbiAgbGV0IHN2Z0RhdGE7XG4gIGxldCBwcmV2aW91c0RhdGFMZW5ndGg7XG5cbiAgd2hpbGUgKHN2Z0RhdGEgPT09IHVuZGVmaW5lZCB8fCBzdmdEYXRhLmxlbmd0aCAhPSBwcmV2aW91c0RhdGFMZW5ndGgpIHtcbiAgICBwcmV2aW91c0RhdGFMZW5ndGggPSBzdmdEYXRhICYmIHN2Z0RhdGEubGVuZ3RoO1xuICAgIHBsdWdpbnMoc3ZnLCB7aW5wdXQ6ICdzdHJpbmcnfSwgb3B0aW1pc2VkUGx1Z2luc0RhdGEpO1xuICAgIHN2Z0RhdGEgPSBqczJzdmcoc3ZnLCB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICBwcmV0dHk6IHNldHRpbmdzLnByZXR0eVxuICAgIH0pLmRhdGE7XG5cbiAgICB5aWVsZCB7XG4gICAgICBkYXRhOiBzdmdEYXRhLFxuICAgICAgZGltZW5zaW9uczogZ2V0RGltZW5zaW9ucyhzdmcpXG4gICAgfTtcbiAgfVxufVxuXG5sZXQgcGFyc2VkU3ZnO1xubGV0IG11bHRpcGFzc0luc3RhbmNlO1xuXG5jb25zdCBhY3Rpb25zID0ge1xuICBsb2FkKHsgZGF0YSB9KSB7XG4gICAgc3ZnMmpzKGRhdGEsIHAgPT4gcGFyc2VkU3ZnID0gcCk7XG5cbiAgICBpZiAocGFyc2VkU3ZnLmVycm9yKSB0aHJvdyBFcnJvcihwYXJzZWRTdmcuZXJyb3IpO1xuXG4gICAgcmV0dXJuIGdldERpbWVuc2lvbnMocGFyc2VkU3ZnKTtcbiAgfSxcbiAgcHJvY2Vzcyh7IHNldHRpbmdzIH0pIHtcbiAgICBtdWx0aXBhc3NJbnN0YW5jZSA9IG11bHRpcGFzc0NvbXByZXNzKHNldHRpbmdzKTtcbiAgICByZXR1cm4gbXVsdGlwYXNzSW5zdGFuY2UubmV4dCgpLnZhbHVlO1xuICB9LFxuICBuZXh0UGFzcygpIHtcbiAgICByZXR1cm4gbXVsdGlwYXNzSW5zdGFuY2UubmV4dCgpLnZhbHVlO1xuICB9XG59O1xuXG5zZWxmLm9ubWVzc2FnZSA9IGV2ZW50ID0+IHtcbiAgdHJ5IHtcbiAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgIGlkOiBldmVudC5kYXRhLmlkLFxuICAgICAgcmVzdWx0OiBhY3Rpb25zW2V2ZW50LmRhdGEuYWN0aW9uXShldmVudC5kYXRhKVxuICAgIH0pO1xuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICBpZDogZXZlbnQuZGF0YS5pZCxcbiAgICAgIGVycm9yOiBlLm1lc3NhZ2VcbiAgICB9KTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZ1RyYW5zZm9ybVR5cGVzID0gL21hdHJpeHx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHNrZXdYfHNrZXdZLyxcbiAgICByZWdUcmFuc2Zvcm1TcGxpdCA9IC9cXHMqKG1hdHJpeHx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHNrZXdYfHNrZXdZKVxccypcXChcXHMqKC4rPylcXHMqXFwpW1xccyxdKi8sXG4gICAgcmVnTnVtZXJpY1ZhbHVlcyA9IC9bLStdPyg/OlxcZCpcXC5cXGQrfFxcZCtcXC4/KSg/OltlRV1bLStdP1xcZCspPy9nO1xuXG4vKipcbiAqIENvbnZlcnQgdHJhbnNmb3JtIHN0cmluZyB0byBKUyByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHJhbnNmb3JtU3RyaW5nIGlucHV0IHN0cmluZ1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IGFycmF5XG4gKi9cbmV4cG9ydHMudHJhbnNmb3JtMmpzID0gZnVuY3Rpb24odHJhbnNmb3JtU3RyaW5nKSB7XG5cbiAgICAgICAgLy8gSlMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zZm9ybSBkYXRhXG4gICAgdmFyIHRyYW5zZm9ybXMgPSBbXSxcbiAgICAgICAgLy8gY3VycmVudCB0cmFuc2Zvcm0gY29udGV4dFxuICAgICAgICBjdXJyZW50O1xuXG4gICAgLy8gc3BsaXQgdmFsdWUgaW50byBbJycsICd0cmFuc2xhdGUnLCAnMTAgNTAnLCAnJywgJ3NjYWxlJywgJzInLCAnJywgJ3JvdGF0ZScsICctNDUnLCAnJ11cbiAgICB0cmFuc2Zvcm1TdHJpbmcuc3BsaXQocmVnVHJhbnNmb3JtU3BsaXQpLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAvKmpzaGludCAtVzA4NCAqL1xuICAgICAgICB2YXIgbnVtO1xuXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAvLyBpZiBpdGVtIGlzIGEgdHJhbnNsYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAocmVnVHJhbnNmb3JtVHlwZXMudGVzdChpdGVtKSkge1xuICAgICAgICAgICAgICAgIC8vIHRoZW4gY29sbGVjdCBpdCBhbmQgY2hhbmdlIGN1cnJlbnQgY29udGV4dFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMucHVzaChjdXJyZW50ID0geyBuYW1lOiBpdGVtIH0pO1xuICAgICAgICAgICAgLy8gZWxzZSBpZiBpdGVtIGlzIGRhdGFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlbiBzcGxpdCBpdCBpbnRvIFsxMCwgNTBdIGFuZCBjb2xsZWN0IGFzIGNvbnRleHQuZGF0YVxuICAgICAgICAgICAgICAgIHdoaWxlIChudW0gPSByZWdOdW1lcmljVmFsdWVzLmV4ZWMoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtID0gTnVtYmVyKG51bSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmRhdGEucHVzaChudW0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmRhdGEgPSBbbnVtXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHJldHVybiBlbXB0eSBhcnJheSBpZiBicm9rZW4gdHJhbnNmb3JtIChubyBkYXRhKVxuICAgIHJldHVybiBjdXJyZW50ICYmIGN1cnJlbnQuZGF0YSA/IHRyYW5zZm9ybXMgOiBbXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbHkgdHJhbnNmb3JtcyBpbnRvIG9uZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBpbnB1dCB0cmFuc2Zvcm1zIGFycmF5XG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IG1hdHJpeCBhcnJheVxuICovXG5leHBvcnRzLnRyYW5zZm9ybXNNdWx0aXBseSA9IGZ1bmN0aW9uKHRyYW5zZm9ybXMpIHtcblxuICAgIC8vIGNvbnZlcnQgdHJhbnNmb3JtcyBvYmplY3RzIHRvIHRoZSBtYXRyaWNlc1xuICAgIHRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zLm1hcChmdW5jdGlvbih0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRyYW5zZm9ybS5uYW1lID09PSAnbWF0cml4Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1Ub01hdHJpeCh0cmFuc2Zvcm0pO1xuICAgIH0pO1xuXG4gICAgLy8gbXVsdGlwbHkgYWxsIG1hdHJpY2VzIGludG8gb25lXG4gICAgdHJhbnNmb3JtcyA9IHtcbiAgICAgICAgbmFtZTogJ21hdHJpeCcsXG4gICAgICAgIGRhdGE6IHRyYW5zZm9ybXMubGVuZ3RoID4gMCA/IHRyYW5zZm9ybXMucmVkdWNlKG11bHRpcGx5VHJhbnNmb3JtTWF0cmljZXMpIDogW11cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybXM7XG5cbn07XG5cbi8qKlxuICogRG8gbWF0aCBsaWtlIGEgc2Nob29sZ2lybC5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG52YXIgbXRoID0gZXhwb3J0cy5tdGggPSB7XG5cbiAgICByYWQ6IGZ1bmN0aW9uKGRlZykge1xuICAgICAgICByZXR1cm4gZGVnICogTWF0aC5QSSAvIDE4MDtcbiAgICB9LFxuXG4gICAgZGVnOiBmdW5jdGlvbihyYWQpIHtcbiAgICAgICAgcmV0dXJuIHJhZCAqIDE4MCAvIE1hdGguUEk7XG4gICAgfSxcblxuICAgIGNvczogZnVuY3Rpb24oZGVnKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmNvcyh0aGlzLnJhZChkZWcpKTtcbiAgICB9LFxuXG4gICAgYWNvczogZnVuY3Rpb24odmFsLCBmbG9hdFByZWNpc2lvbikge1xuICAgICAgICByZXR1cm4gKyh0aGlzLmRlZyhNYXRoLmFjb3ModmFsKSkudG9GaXhlZChmbG9hdFByZWNpc2lvbikpO1xuICAgIH0sXG5cbiAgICBzaW46IGZ1bmN0aW9uKGRlZykge1xuICAgICAgICByZXR1cm4gTWF0aC5zaW4odGhpcy5yYWQoZGVnKSk7XG4gICAgfSxcblxuICAgIGFzaW46IGZ1bmN0aW9uKHZhbCwgZmxvYXRQcmVjaXNpb24pIHtcbiAgICAgICAgcmV0dXJuICsodGhpcy5kZWcoTWF0aC5hc2luKHZhbCkpLnRvRml4ZWQoZmxvYXRQcmVjaXNpb24pKTtcbiAgICB9LFxuXG4gICAgdGFuOiBmdW5jdGlvbihkZWcpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgudGFuKHRoaXMucmFkKGRlZykpO1xuICAgIH0sXG5cbiAgICBhdGFuOiBmdW5jdGlvbih2YWwsIGZsb2F0UHJlY2lzaW9uKSB7XG4gICAgICAgIHJldHVybiArKHRoaXMuZGVnKE1hdGguYXRhbih2YWwpKS50b0ZpeGVkKGZsb2F0UHJlY2lzaW9uKSk7XG4gICAgfVxuXG59O1xuXG4vKipcbiAqIERlY29tcG9zZSBtYXRyaXggaW50byBzaW1wbGUgdHJhbnNmb3Jtcy4gU2VlXG4gKiBodHRwOi8vd3d3Lm1hdGhzLWluZm9ybWF0aXF1ZS1qZXV4LmNvbS9ibG9nL2ZyZWRlcmljLz9wb3N0LzIwMTMvMTIvMDEvRGVjb21wb3NpdGlvbi1vZi0yRC10cmFuc2Zvcm0tbWF0cmljZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBtYXRyaXggdHJhbnNmb3JtIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fEFycmF5fSB0cmFuc2Zvcm1zIGFycmF5IG9yIG9yaWdpbmFsIHRyYW5zZm9ybSBvYmplY3RcbiAqL1xuZXhwb3J0cy5tYXRyaXhUb1RyYW5zZm9ybSA9IGZ1bmN0aW9uKHRyYW5zZm9ybSwgcGFyYW1zKSB7XG4gICAgdmFyIGZsb2F0UHJlY2lzaW9uID0gcGFyYW1zLmZsb2F0UHJlY2lzaW9uLFxuICAgICAgICBkYXRhID0gdHJhbnNmb3JtLmRhdGEsXG4gICAgICAgIHRyYW5zZm9ybXMgPSBbXSxcbiAgICAgICAgc3ggPSArTWF0aC5zcXJ0KGRhdGFbMF0gKiBkYXRhWzBdICsgZGF0YVsxXSAqIGRhdGFbMV0pLnRvRml4ZWQocGFyYW1zLnRyYW5zZm9ybVByZWNpc2lvbiksXG4gICAgICAgIHN5ID0gKygoZGF0YVswXSAqIGRhdGFbM10gLSBkYXRhWzFdICogZGF0YVsyXSkgLyBzeCkudG9GaXhlZChwYXJhbXMudHJhbnNmb3JtUHJlY2lzaW9uKSxcbiAgICAgICAgY29sc1N1bSA9IGRhdGFbMF0gKiBkYXRhWzJdICsgZGF0YVsxXSAqIGRhdGFbM10sXG4gICAgICAgIHJvd3NTdW0gPSBkYXRhWzBdICogZGF0YVsxXSArIGRhdGFbMl0gKiBkYXRhWzNdLFxuICAgICAgICBzY2FsZUJlZm9yZSA9IHJvd3NTdW0gfHwgKyhzeCA9PSBzeSk7XG5cbiAgICAvLyBbLi4uLCAuLi4sIC4uLiwgLi4uLCB0eCwgdHldIOKGkiB0cmFuc2xhdGUodHgsIHR5KVxuICAgIGlmIChkYXRhWzRdIHx8IGRhdGFbNV0pIHtcbiAgICAgICAgdHJhbnNmb3Jtcy5wdXNoKHsgbmFtZTogJ3RyYW5zbGF0ZScsIGRhdGE6IGRhdGEuc2xpY2UoNCwgZGF0YVs1XSA/IDYgOiA1KSB9KTtcbiAgICB9XG5cbiAgICAvLyBbc3gsIDAsIHRhbihhKcK3c3ksIHN5LCAwLCAwXSDihpIgc2tld1goYSnCt3NjYWxlKHN4LCBzeSlcbiAgICBpZiAoIWRhdGFbMV0gJiYgZGF0YVsyXSkge1xuICAgICAgICB0cmFuc2Zvcm1zLnB1c2goeyBuYW1lOiAnc2tld1gnLCBkYXRhOiBbbXRoLmF0YW4oZGF0YVsyXSAvIHN5LCBmbG9hdFByZWNpc2lvbildIH0pO1xuXG4gICAgLy8gW3N4LCBzeMK3dGFuKGEpLCAwLCBzeSwgMCwgMF0g4oaSIHNrZXdZKGEpwrdzY2FsZShzeCwgc3kpXG4gICAgfSBlbHNlIGlmIChkYXRhWzFdICYmICFkYXRhWzJdKSB7XG4gICAgICAgIHRyYW5zZm9ybXMucHVzaCh7IG5hbWU6ICdza2V3WScsIGRhdGE6IFttdGguYXRhbihkYXRhWzFdIC8gZGF0YVswXSwgZmxvYXRQcmVjaXNpb24pXSB9KTtcbiAgICAgICAgc3ggPSBkYXRhWzBdO1xuICAgICAgICBzeSA9IGRhdGFbM107XG5cbiAgICAvLyBbc3jCt2NvcyhhKSwgc3jCt3NpbihhKSwgc3nCty1zaW4oYSksIHN5wrdjb3MoYSksIHgsIHldIOKGkiByb3RhdGUoYVssIGN4LCBjeV0pwrcoc2NhbGUgb3Igc2tld1gpIG9yXG4gICAgLy8gW3N4wrdjb3MoYSksIHN5wrdzaW4oYSksIHN4wrctc2luKGEpLCBzecK3Y29zKGEpLCB4LCB5XSDihpIgc2NhbGUoc3gsIHN5KcK3cm90YXRlKGFbLCBjeCwgY3ldKSAoaWYgIXNjYWxlQmVmb3JlKVxuICAgIH0gZWxzZSBpZiAoIWNvbHNTdW0gfHwgKHN4ID09IDEgJiYgc3kgPT0gMSkgfHwgIXNjYWxlQmVmb3JlKSB7XG4gICAgICAgIGlmICghc2NhbGVCZWZvcmUpIHtcbiAgICAgICAgICAgIHN4ID0gKGRhdGFbMF0gPCAwID8gLTEgOiAxKSAqIE1hdGguc3FydChkYXRhWzBdICogZGF0YVswXSArIGRhdGFbMl0gKiBkYXRhWzJdKTtcbiAgICAgICAgICAgIHN5ID0gKGRhdGFbM10gPCAwID8gLTEgOiAxKSAqIE1hdGguc3FydChkYXRhWzFdICogZGF0YVsxXSArIGRhdGFbM10gKiBkYXRhWzNdKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybXMucHVzaCh7IG5hbWU6ICdzY2FsZScsIGRhdGE6IFtzeCwgc3ldIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciByb3RhdGUgPSBbbXRoLmFjb3MoZGF0YVswXSAvIHN4LCBmbG9hdFByZWNpc2lvbikgKiAoZGF0YVsxXSAqIHN5IDwgMCA/IC0xIDogMSldO1xuXG4gICAgICAgIGlmIChyb3RhdGVbMF0pIHRyYW5zZm9ybXMucHVzaCh7IG5hbWU6ICdyb3RhdGUnLCBkYXRhOiByb3RhdGUgfSk7XG5cbiAgICAgICAgaWYgKHJvd3NTdW0gJiYgY29sc1N1bSkgdHJhbnNmb3Jtcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6ICdza2V3WCcsXG4gICAgICAgICAgICBkYXRhOiBbbXRoLmF0YW4oY29sc1N1bSAvIChzeCAqIHN4KSwgZmxvYXRQcmVjaXNpb24pXVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyByb3RhdGUoYSwgY3gsIGN5KSBjYW4gY29uc3VtZSB0cmFuc2xhdGUoKSB3aXRoaW4gb3B0aW9uYWwgYXJndW1lbnRzIGN4LCBjeSAocm90YXRpb24gcG9pbnQpXG4gICAgICAgIGlmIChyb3RhdGVbMF0gJiYgKGRhdGFbNF0gfHwgZGF0YVs1XSkpIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybXMuc2hpZnQoKTtcbiAgICAgICAgICAgIHZhciBjb3MgPSBkYXRhWzBdIC8gc3gsXG4gICAgICAgICAgICAgICAgc2luID0gZGF0YVsxXSAvIChzY2FsZUJlZm9yZSA/IHN4IDogc3kpLFxuICAgICAgICAgICAgICAgIHggPSBkYXRhWzRdICogKHNjYWxlQmVmb3JlIHx8IHN5KSxcbiAgICAgICAgICAgICAgICB5ID0gZGF0YVs1XSAqIChzY2FsZUJlZm9yZSB8fCBzeCksXG4gICAgICAgICAgICAgICAgZGVub20gPSAoTWF0aC5wb3coMSAtIGNvcywgMikgKyBNYXRoLnBvdyhzaW4sIDIpKSAqIChzY2FsZUJlZm9yZSB8fCBzeCAqIHN5KTtcbiAgICAgICAgICAgIHJvdGF0ZS5wdXNoKCgoMSAtIGNvcykgKiB4IC0gc2luICogeSkgLyBkZW5vbSk7XG4gICAgICAgICAgICByb3RhdGUucHVzaCgoKDEgLSBjb3MpICogeSArIHNpbiAqIHgpIC8gZGVub20pO1xuICAgICAgICB9XG5cbiAgICAvLyBUb28gbWFueSB0cmFuc2Zvcm1hdGlvbnMsIHJldHVybiBvcmlnaW5hbCBtYXRyaXggaWYgaXQgaXNuJ3QganVzdCBhIHNjYWxlL3RyYW5zbGF0ZVxuICAgIH0gZWxzZSBpZiAoZGF0YVsxXSB8fCBkYXRhWzJdKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm07XG4gICAgfVxuXG4gICAgaWYgKHNjYWxlQmVmb3JlICYmIChzeCAhPSAxIHx8IHN5ICE9IDEpIHx8ICF0cmFuc2Zvcm1zLmxlbmd0aCkgdHJhbnNmb3Jtcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ3NjYWxlJyxcbiAgICAgICAgZGF0YTogc3ggPT0gc3kgPyBbc3hdIDogW3N4LCBzeV1cbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1zO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHRyYW5zZm9ybSB0byB0aGUgbWF0cml4IGRhdGEuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybSB0cmFuc2Zvcm0gb2JqZWN0XG4gKiBAcmV0dXJuIHtBcnJheX0gbWF0cml4IGRhdGFcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtVG9NYXRyaXgodHJhbnNmb3JtKSB7XG5cbiAgICBpZiAodHJhbnNmb3JtLm5hbWUgPT09ICdtYXRyaXgnKSByZXR1cm4gdHJhbnNmb3JtLmRhdGE7XG5cbiAgICB2YXIgbWF0cml4O1xuXG4gICAgc3dpdGNoICh0cmFuc2Zvcm0ubmFtZSkge1xuICAgICAgICBjYXNlICd0cmFuc2xhdGUnOlxuICAgICAgICAgICAgLy8gWzEsIDAsIDAsIDEsIHR4LCB0eV1cbiAgICAgICAgICAgIG1hdHJpeCA9IFsxLCAwLCAwLCAxLCB0cmFuc2Zvcm0uZGF0YVswXSwgdHJhbnNmb3JtLmRhdGFbMV0gfHwgMF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2NhbGUnOlxuICAgICAgICAgICAgLy8gW3N4LCAwLCAwLCBzeSwgMCwgMF1cbiAgICAgICAgICAgIG1hdHJpeCA9IFt0cmFuc2Zvcm0uZGF0YVswXSwgMCwgMCwgdHJhbnNmb3JtLmRhdGFbMV0gfHwgdHJhbnNmb3JtLmRhdGFbMF0sIDAsIDBdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JvdGF0ZSc6XG4gICAgICAgICAgICAvLyBbY29zKGEpLCBzaW4oYSksIC1zaW4oYSksIGNvcyhhKSwgeCwgeV1cbiAgICAgICAgICAgIHZhciBjb3MgPSBtdGguY29zKHRyYW5zZm9ybS5kYXRhWzBdKSxcbiAgICAgICAgICAgICAgICBzaW4gPSBtdGguc2luKHRyYW5zZm9ybS5kYXRhWzBdKSxcbiAgICAgICAgICAgICAgICBjeCA9IHRyYW5zZm9ybS5kYXRhWzFdIHx8IDAsXG4gICAgICAgICAgICAgICAgY3kgPSB0cmFuc2Zvcm0uZGF0YVsyXSB8fCAwO1xuXG4gICAgICAgICAgICBtYXRyaXggPSBbY29zLCBzaW4sIC1zaW4sIGNvcywgKDEgLSBjb3MpICogY3ggKyBzaW4gKiBjeSwgKDEgLSBjb3MpICogY3kgLSBzaW4gKiBjeF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2tld1gnOlxuICAgICAgICAgICAgLy8gWzEsIDAsIHRhbihhKSwgMSwgMCwgMF1cbiAgICAgICAgICAgIG1hdHJpeCA9IFsxLCAwLCBtdGgudGFuKHRyYW5zZm9ybS5kYXRhWzBdKSwgMSwgMCwgMF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2tld1knOlxuICAgICAgICAgICAgLy8gWzEsIHRhbihhKSwgMCwgMSwgMCwgMF1cbiAgICAgICAgICAgIG1hdHJpeCA9IFsxLCBtdGgudGFuKHRyYW5zZm9ybS5kYXRhWzBdKSwgMCwgMSwgMCwgMF07XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0cml4O1xuXG59XG5cbi8qKlxuICogQXBwbGllcyB0cmFuc2Zvcm1hdGlvbiB0byBhbiBhcmMuIFRvIGRvIHNvLCB3ZSByZXByZXNlbnQgZWxsaXBzZSBhcyBhIG1hdHJpeCwgbXVsdGlwbHkgaXRcbiAqIGJ5IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYW5kIHVzZSBhIHNpbmd1bGFyIHZhbHVlIGRlY29tcG9zaXRpb24gdG8gcmVwcmVzZW50IGluIGEgZm9ybVxuICogcm90YXRlKM64KcK3c2NhbGUoYSBiKcK3cm90YXRlKM+GKS4gVGhpcyBnaXZlcyB1cyBuZXcgZWxsaXBzZSBwYXJhbXMgYSwgYiBhbmQgzrguXG4gKiBTVkQgaXMgYmVpbmcgZG9uZSB3aXRoIHRoZSBmb3JtdWxhZSBwcm92aWRlZCBieSBXb2xmZnJhbXxBbHBoYSAoc3ZkIHt7bTAsIG0yfSwge20xLCBtM319KVxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyYyBbYSwgYiwgcm90YXRpb24gaW4gZGVnXVxuICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICogQHJldHVybiB7QXJyYXl9IGFyYyB0cmFuc2Zvcm1lZCBpbnB1dCBhcmNcbiAqL1xuZXhwb3J0cy50cmFuc2Zvcm1BcmMgPSBmdW5jdGlvbihhcmMsIHRyYW5zZm9ybSkge1xuXG4gICAgdmFyIGEgPSBhcmNbMF0sXG4gICAgICAgIGIgPSBhcmNbMV0sXG4gICAgICAgIHJvdCA9IGFyY1syXSAqIE1hdGguUEkgLyAxODAsXG4gICAgICAgIGNvcyA9IE1hdGguY29zKHJvdCksXG4gICAgICAgIHNpbiA9IE1hdGguc2luKHJvdCksXG4gICAgICAgIGggPSBNYXRoLnBvdyhhcmNbNV0gKiBjb3MgKyBhcmNbNl0gKiBzaW4sIDIpIC8gKDQgKiBhICogYSkgK1xuICAgICAgICAgICAgTWF0aC5wb3coYXJjWzZdICogY29zIC0gYXJjWzVdICogc2luLCAyKSAvICg0ICogYiAqIGIpO1xuICAgIGlmIChoID4gMSkge1xuICAgICAgICBoID0gTWF0aC5zcXJ0KGgpO1xuICAgICAgICBhICo9IGg7XG4gICAgICAgIGIgKj0gaDtcbiAgICB9XG4gICAgdmFyIGVsbGlwc2UgPSBbYSAqIGNvcywgYSAqIHNpbiwgLWIgKiBzaW4sIGIgKiBjb3MsIDAsIDBdLFxuICAgICAgICBtID0gbXVsdGlwbHlUcmFuc2Zvcm1NYXRyaWNlcyh0cmFuc2Zvcm0sIGVsbGlwc2UpLFxuICAgICAgICAvLyBEZWNvbXBvc2UgdGhlIG5ldyBlbGxpcHNlIG1hdHJpeFxuICAgICAgICBsYXN0Q29sID0gbVsyXSAqIG1bMl0gKyBtWzNdICogbVszXSxcbiAgICAgICAgc3F1YXJlU3VtID0gbVswXSAqIG1bMF0gKyBtWzFdICogbVsxXSArIGxhc3RDb2wsXG4gICAgICAgIHJvb3QgPSBNYXRoLnNxcnQoXG4gICAgICAgICAgICAoTWF0aC5wb3cobVswXSAtIG1bM10sIDIpICsgTWF0aC5wb3cobVsxXSArIG1bMl0sIDIpKSAqXG4gICAgICAgICAgICAoTWF0aC5wb3cobVswXSArIG1bM10sIDIpICsgTWF0aC5wb3cobVsxXSAtIG1bMl0sIDIpKVxuICAgICAgICApO1xuXG4gICAgaWYgKCFyb290KSB7IC8vIGNpcmNsZVxuICAgICAgICBhcmNbMF0gPSBhcmNbMV0gPSBNYXRoLnNxcnQoc3F1YXJlU3VtIC8gMik7XG4gICAgICAgIGFyY1syXSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1ham9yQXhpc1NxciA9IChzcXVhcmVTdW0gKyByb290KSAvIDIsXG4gICAgICAgICAgICBtaW5vckF4aXNTcXIgPSAoc3F1YXJlU3VtIC0gcm9vdCkgLyAyLFxuICAgICAgICAgICAgbWFqb3IgPSBNYXRoLmFicyhtYWpvckF4aXNTcXIgLSBsYXN0Q29sKSA+IDFlLTYsXG4gICAgICAgICAgICBzdWIgPSAobWFqb3IgPyBtYWpvckF4aXNTcXIgOiBtaW5vckF4aXNTcXIpIC0gbGFzdENvbCxcbiAgICAgICAgICAgIHJvd3NTdW0gPSBtWzBdICogbVsyXSArIG1bMV0gKiBtWzNdLFxuICAgICAgICAgICAgdGVybTEgPSBtWzBdICogc3ViICsgbVsyXSAqIHJvd3NTdW0sXG4gICAgICAgICAgICB0ZXJtMiA9IG1bMV0gKiBzdWIgKyBtWzNdICogcm93c1N1bTtcbiAgICAgICAgYXJjWzBdID0gTWF0aC5zcXJ0KG1ham9yQXhpc1Nxcik7XG4gICAgICAgIGFyY1sxXSA9IE1hdGguc3FydChtaW5vckF4aXNTcXIpO1xuICAgICAgICBhcmNbMl0gPSAoKG1ham9yID8gdGVybTIgPCAwIDogdGVybTEgPiAwKSA/IC0xIDogMSkgKlxuICAgICAgICAgICAgTWF0aC5hY29zKChtYWpvciA/IHRlcm0xIDogdGVybTIpIC8gTWF0aC5zcXJ0KHRlcm0xICogdGVybTEgKyB0ZXJtMiAqIHRlcm0yKSkgKiAxODAgLyBNYXRoLlBJO1xuICAgIH1cblxuICAgIGlmICgodHJhbnNmb3JtWzBdIDwgMCkgIT09ICh0cmFuc2Zvcm1bM10gPCAwKSkge1xuICAgICAgICAvLyBGbGlwIHRoZSBzd2VlcCBmbGFnIGlmIGNvb3JkaW5hdGVzIGFyZSBiZWluZyBmbGlwcGVkIGhvcml6b250YWxseSBYT1IgdmVydGljYWxseVxuICAgICAgICBhcmNbNF0gPSAxIC0gYXJjWzRdO1xuICAgIH1cblxuICAgIHJldHVybiBhcmM7XG5cbn07XG5cbi8qKlxuICogTXVsdGlwbHkgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSBtYXRyaXggQSBkYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBiIG1hdHJpeCBCIGRhdGFcbiAqIEByZXR1cm4ge0FycmF5fSByZXN1bHRcbiAqL1xuZnVuY3Rpb24gbXVsdGlwbHlUcmFuc2Zvcm1NYXRyaWNlcyhhLCBiKSB7XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBhWzBdICogYlswXSArIGFbMl0gKiBiWzFdLFxuICAgICAgICBhWzFdICogYlswXSArIGFbM10gKiBiWzFdLFxuICAgICAgICBhWzBdICogYlsyXSArIGFbMl0gKiBiWzNdLFxuICAgICAgICBhWzFdICogYlsyXSArIGFbM10gKiBiWzNdLFxuICAgICAgICBhWzBdICogYls0XSArIGFbMl0gKiBiWzVdICsgYVs0XSxcbiAgICAgICAgYVsxXSAqIGJbNF0gKyBhWzNdICogYls1XSArIGFbNV1cbiAgICBdO1xuXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBpc05hTihhKSB7XG5cdHJldHVybiBhICE9PSBhO1xufTtcbiIsIjsoZnVuY3Rpb24gKHNheCkgeyAvLyB3cmFwcGVyIGZvciBub24tbm9kZSBlbnZzXG4gIHNheC5wYXJzZXIgPSBmdW5jdGlvbiAoc3RyaWN0LCBvcHQpIHsgcmV0dXJuIG5ldyBTQVhQYXJzZXIoc3RyaWN0LCBvcHQpIH1cbiAgc2F4LlNBWFBhcnNlciA9IFNBWFBhcnNlclxuICBzYXguU0FYU3RyZWFtID0gU0FYU3RyZWFtXG4gIHNheC5jcmVhdGVTdHJlYW0gPSBjcmVhdGVTdHJlYW1cblxuICAvLyBXaGVuIHdlIHBhc3MgdGhlIE1BWF9CVUZGRVJfTEVOR1RIIHBvc2l0aW9uLCBzdGFydCBjaGVja2luZyBmb3IgYnVmZmVyIG92ZXJydW5zLlxuICAvLyBXaGVuIHdlIGNoZWNrLCBzY2hlZHVsZSB0aGUgbmV4dCBjaGVjayBmb3IgTUFYX0JVRkZFUl9MRU5HVEggLSAobWF4KGJ1ZmZlciBsZW5ndGhzKSksXG4gIC8vIHNpbmNlIHRoYXQncyB0aGUgZWFybGllc3QgdGhhdCBhIGJ1ZmZlciBvdmVycnVuIGNvdWxkIG9jY3VyLiAgVGhpcyB3YXksIGNoZWNrcyBhcmVcbiAgLy8gYXMgcmFyZSBhcyByZXF1aXJlZCwgYnV0IGFzIG9mdGVuIGFzIG5lY2Vzc2FyeSB0byBlbnN1cmUgbmV2ZXIgY3Jvc3NpbmcgdGhpcyBib3VuZC5cbiAgLy8gRnVydGhlcm1vcmUsIGJ1ZmZlcnMgYXJlIG9ubHkgdGVzdGVkIGF0IG1vc3Qgb25jZSBwZXIgd3JpdGUoKSwgc28gcGFzc2luZyBhIHZlcnlcbiAgLy8gbGFyZ2Ugc3RyaW5nIGludG8gd3JpdGUoKSBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMsIGJ1dCB0aGlzIGlzIG1hbmFnZWFibGUgYnlcbiAgLy8gdGhlIGNhbGxlciwgc28gaXQgaXMgYXNzdW1lZCB0byBiZSBzYWZlLiAgVGh1cywgYSBjYWxsIHRvIHdyaXRlKCkgbWF5LCBpbiB0aGUgZXh0cmVtZVxuICAvLyBlZGdlIGNhc2UsIHJlc3VsdCBpbiBjcmVhdGluZyBhdCBtb3N0IG9uZSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzdHJpbmcgcGFzc2VkIGluLlxuICAvLyBTZXQgdG8gSW5maW5pdHkgdG8gaGF2ZSB1bmxpbWl0ZWQgYnVmZmVycy5cbiAgc2F4Lk1BWF9CVUZGRVJfTEVOR1RIID0gNjQgKiAxMDI0XG5cbiAgdmFyIGJ1ZmZlcnMgPSBbXG4gICAgJ2NvbW1lbnQnLCAnc2dtbERlY2wnLCAndGV4dE5vZGUnLCAndGFnTmFtZScsICdkb2N0eXBlJyxcbiAgICAncHJvY0luc3ROYW1lJywgJ3Byb2NJbnN0Qm9keScsICdlbnRpdHknLCAnYXR0cmliTmFtZScsXG4gICAgJ2F0dHJpYlZhbHVlJywgJ2NkYXRhJywgJ3NjcmlwdCdcbiAgXVxuXG4gIHNheC5FVkVOVFMgPSBbXG4gICAgJ3RleHQnLFxuICAgICdwcm9jZXNzaW5naW5zdHJ1Y3Rpb24nLFxuICAgICdzZ21sZGVjbGFyYXRpb24nLFxuICAgICdkb2N0eXBlJyxcbiAgICAnY29tbWVudCcsXG4gICAgJ29wZW50YWdzdGFydCcsXG4gICAgJ2F0dHJpYnV0ZScsXG4gICAgJ29wZW50YWcnLFxuICAgICdjbG9zZXRhZycsXG4gICAgJ29wZW5jZGF0YScsXG4gICAgJ2NkYXRhJyxcbiAgICAnY2xvc2VjZGF0YScsXG4gICAgJ2Vycm9yJyxcbiAgICAnZW5kJyxcbiAgICAncmVhZHknLFxuICAgICdzY3JpcHQnLFxuICAgICdvcGVubmFtZXNwYWNlJyxcbiAgICAnY2xvc2VuYW1lc3BhY2UnXG4gIF1cblxuICBmdW5jdGlvbiBTQVhQYXJzZXIgKHN0cmljdCwgb3B0KSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNBWFBhcnNlcikpIHtcbiAgICAgIHJldHVybiBuZXcgU0FYUGFyc2VyKHN0cmljdCwgb3B0KVxuICAgIH1cblxuICAgIHZhciBwYXJzZXIgPSB0aGlzXG4gICAgY2xlYXJCdWZmZXJzKHBhcnNlcilcbiAgICBwYXJzZXIucSA9IHBhcnNlci5jID0gJydcbiAgICBwYXJzZXIuYnVmZmVyQ2hlY2tQb3NpdGlvbiA9IHNheC5NQVhfQlVGRkVSX0xFTkdUSFxuICAgIHBhcnNlci5vcHQgPSBvcHQgfHwge31cbiAgICBwYXJzZXIub3B0Lmxvd2VyY2FzZSA9IHBhcnNlci5vcHQubG93ZXJjYXNlIHx8IHBhcnNlci5vcHQubG93ZXJjYXNldGFnc1xuICAgIHBhcnNlci5sb29zZUNhc2UgPSBwYXJzZXIub3B0Lmxvd2VyY2FzZSA/ICd0b0xvd2VyQ2FzZScgOiAndG9VcHBlckNhc2UnXG4gICAgcGFyc2VyLnRhZ3MgPSBbXVxuICAgIHBhcnNlci5jbG9zZWQgPSBwYXJzZXIuY2xvc2VkUm9vdCA9IHBhcnNlci5zYXdSb290ID0gZmFsc2VcbiAgICBwYXJzZXIudGFnID0gcGFyc2VyLmVycm9yID0gbnVsbFxuICAgIHBhcnNlci5zdHJpY3QgPSAhIXN0cmljdFxuICAgIHBhcnNlci5ub3NjcmlwdCA9ICEhKHN0cmljdCB8fCBwYXJzZXIub3B0Lm5vc2NyaXB0KVxuICAgIHBhcnNlci5zdGF0ZSA9IFMuQkVHSU5cbiAgICBwYXJzZXIuc3RyaWN0RW50aXRpZXMgPSBwYXJzZXIub3B0LnN0cmljdEVudGl0aWVzXG4gICAgcGFyc2VyLkVOVElUSUVTID0gcGFyc2VyLnN0cmljdEVudGl0aWVzID8gT2JqZWN0LmNyZWF0ZShzYXguWE1MX0VOVElUSUVTKSA6IE9iamVjdC5jcmVhdGUoc2F4LkVOVElUSUVTKVxuICAgIHBhcnNlci5hdHRyaWJMaXN0ID0gW11cblxuICAgIC8vIG5hbWVzcGFjZXMgZm9ybSBhIHByb3RvdHlwZSBjaGFpbi5cbiAgICAvLyBpdCBhbHdheXMgcG9pbnRzIGF0IHRoZSBjdXJyZW50IHRhZyxcbiAgICAvLyB3aGljaCBwcm90b3MgdG8gaXRzIHBhcmVudCB0YWcuXG4gICAgaWYgKHBhcnNlci5vcHQueG1sbnMpIHtcbiAgICAgIHBhcnNlci5ucyA9IE9iamVjdC5jcmVhdGUocm9vdE5TKVxuICAgIH1cblxuICAgIC8vIG1vc3RseSBqdXN0IGZvciBlcnJvciByZXBvcnRpbmdcbiAgICBwYXJzZXIudHJhY2tQb3NpdGlvbiA9IHBhcnNlci5vcHQucG9zaXRpb24gIT09IGZhbHNlXG4gICAgaWYgKHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICBwYXJzZXIucG9zaXRpb24gPSBwYXJzZXIubGluZSA9IHBhcnNlci5jb2x1bW4gPSAwXG4gICAgfVxuICAgIGVtaXQocGFyc2VyLCAnb25yZWFkeScpXG4gIH1cblxuICBpZiAoIU9iamVjdC5jcmVhdGUpIHtcbiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIGZ1bmN0aW9uIEYgKCkge31cbiAgICAgIEYucHJvdG90eXBlID0gb1xuICAgICAgdmFyIG5ld2YgPSBuZXcgRigpXG4gICAgICByZXR1cm4gbmV3ZlxuICAgIH1cbiAgfVxuXG4gIGlmICghT2JqZWN0LmtleXMpIHtcbiAgICBPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICB2YXIgYSA9IFtdXG4gICAgICBmb3IgKHZhciBpIGluIG8pIGlmIChvLmhhc093blByb3BlcnR5KGkpKSBhLnB1c2goaSlcbiAgICAgIHJldHVybiBhXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tCdWZmZXJMZW5ndGggKHBhcnNlcikge1xuICAgIHZhciBtYXhBbGxvd2VkID0gTWF0aC5tYXgoc2F4Lk1BWF9CVUZGRVJfTEVOR1RILCAxMClcbiAgICB2YXIgbWF4QWN0dWFsID0gMFxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYnVmZmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBsZW4gPSBwYXJzZXJbYnVmZmVyc1tpXV0ubGVuZ3RoXG4gICAgICBpZiAobGVuID4gbWF4QWxsb3dlZCkge1xuICAgICAgICAvLyBUZXh0L2NkYXRhIG5vZGVzIGNhbiBnZXQgYmlnLCBhbmQgc2luY2UgdGhleSdyZSBidWZmZXJlZCxcbiAgICAgICAgLy8gd2UgY2FuIGdldCBoZXJlIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zLlxuICAgICAgICAvLyBBdm9pZCBpc3N1ZXMgYnkgZW1pdHRpbmcgdGhlIHRleHQgbm9kZSBub3csXG4gICAgICAgIC8vIHNvIGF0IGxlYXN0IGl0IHdvbid0IGdldCBhbnkgYmlnZ2VyLlxuICAgICAgICBzd2l0Y2ggKGJ1ZmZlcnNbaV0pIHtcbiAgICAgICAgICBjYXNlICd0ZXh0Tm9kZSc6XG4gICAgICAgICAgICBjbG9zZVRleHQocGFyc2VyKVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ2NkYXRhJzpcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2RhdGEnLCBwYXJzZXIuY2RhdGEpXG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ3NjcmlwdCc6XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbnNjcmlwdCcsIHBhcnNlci5zY3JpcHQpXG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ID0gJydcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3IocGFyc2VyLCAnTWF4IGJ1ZmZlciBsZW5ndGggZXhjZWVkZWQ6ICcgKyBidWZmZXJzW2ldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYXhBY3R1YWwgPSBNYXRoLm1heChtYXhBY3R1YWwsIGxlbilcbiAgICB9XG4gICAgLy8gc2NoZWR1bGUgdGhlIG5leHQgY2hlY2sgZm9yIHRoZSBlYXJsaWVzdCBwb3NzaWJsZSBidWZmZXIgb3ZlcnJ1bi5cbiAgICB2YXIgbSA9IHNheC5NQVhfQlVGRkVSX0xFTkdUSCAtIG1heEFjdHVhbFxuICAgIHBhcnNlci5idWZmZXJDaGVja1Bvc2l0aW9uID0gbSArIHBhcnNlci5wb3NpdGlvblxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJCdWZmZXJzIChwYXJzZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGJ1ZmZlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBwYXJzZXJbYnVmZmVyc1tpXV0gPSAnJ1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoQnVmZmVycyAocGFyc2VyKSB7XG4gICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBpZiAocGFyc2VyLmNkYXRhICE9PSAnJykge1xuICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25jZGF0YScsIHBhcnNlci5jZGF0YSlcbiAgICAgIHBhcnNlci5jZGF0YSA9ICcnXG4gICAgfVxuICAgIGlmIChwYXJzZXIuc2NyaXB0ICE9PSAnJykge1xuICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25zY3JpcHQnLCBwYXJzZXIuc2NyaXB0KVxuICAgICAgcGFyc2VyLnNjcmlwdCA9ICcnXG4gICAgfVxuICB9XG5cbiAgU0FYUGFyc2VyLnByb3RvdHlwZSA9IHtcbiAgICBlbmQ6IGZ1bmN0aW9uICgpIHsgZW5kKHRoaXMpIH0sXG4gICAgd3JpdGU6IHdyaXRlLFxuICAgIHJlc3VtZTogZnVuY3Rpb24gKCkgeyB0aGlzLmVycm9yID0gbnVsbDsgcmV0dXJuIHRoaXMgfSxcbiAgICBjbG9zZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy53cml0ZShudWxsKSB9LFxuICAgIGZsdXNoOiBmdW5jdGlvbiAoKSB7IGZsdXNoQnVmZmVycyh0aGlzKSB9XG4gIH1cblxuICB2YXIgU3RyZWFtXG4gIHRyeSB7XG4gICAgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtXG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgU3RyZWFtID0gZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIHZhciBzdHJlYW1XcmFwcyA9IHNheC5FVkVOVFMuZmlsdGVyKGZ1bmN0aW9uIChldikge1xuICAgIHJldHVybiBldiAhPT0gJ2Vycm9yJyAmJiBldiAhPT0gJ2VuZCdcbiAgfSlcblxuICBmdW5jdGlvbiBjcmVhdGVTdHJlYW0gKHN0cmljdCwgb3B0KSB7XG4gICAgcmV0dXJuIG5ldyBTQVhTdHJlYW0oc3RyaWN0LCBvcHQpXG4gIH1cblxuICBmdW5jdGlvbiBTQVhTdHJlYW0gKHN0cmljdCwgb3B0KSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNBWFN0cmVhbSkpIHtcbiAgICAgIHJldHVybiBuZXcgU0FYU3RyZWFtKHN0cmljdCwgb3B0KVxuICAgIH1cblxuICAgIFN0cmVhbS5hcHBseSh0aGlzKVxuXG4gICAgdGhpcy5fcGFyc2VyID0gbmV3IFNBWFBhcnNlcihzdHJpY3QsIG9wdClcbiAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZVxuICAgIHRoaXMucmVhZGFibGUgPSB0cnVlXG5cbiAgICB2YXIgbWUgPSB0aGlzXG5cbiAgICB0aGlzLl9wYXJzZXIub25lbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtZS5lbWl0KCdlbmQnKVxuICAgIH1cblxuICAgIHRoaXMuX3BhcnNlci5vbmVycm9yID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgICBtZS5lbWl0KCdlcnJvcicsIGVyKVxuXG4gICAgICAvLyBpZiBkaWRuJ3QgdGhyb3csIHRoZW4gbWVhbnMgZXJyb3Igd2FzIGhhbmRsZWQuXG4gICAgICAvLyBnbyBhaGVhZCBhbmQgY2xlYXIgZXJyb3IsIHNvIHdlIGNhbiB3cml0ZSBhZ2Fpbi5cbiAgICAgIG1lLl9wYXJzZXIuZXJyb3IgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5fZGVjb2RlciA9IG51bGxcblxuICAgIHN0cmVhbVdyYXBzLmZvckVhY2goZnVuY3Rpb24gKGV2KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWUsICdvbicgKyBldiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbWUuX3BhcnNlclsnb24nICsgZXZdXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGgpIHtcbiAgICAgICAgICBpZiAoIWgpIHtcbiAgICAgICAgICAgIG1lLnJlbW92ZUFsbExpc3RlbmVycyhldilcbiAgICAgICAgICAgIG1lLl9wYXJzZXJbJ29uJyArIGV2XSA9IGhcbiAgICAgICAgICAgIHJldHVybiBoXG4gICAgICAgICAgfVxuICAgICAgICAgIG1lLm9uKGV2LCBoKVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBTQVhTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBTQVhTdHJlYW1cbiAgICB9XG4gIH0pXG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBCdWZmZXIuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgaWYgKCF0aGlzLl9kZWNvZGVyKSB7XG4gICAgICAgIHZhciBTRCA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJykuU3RyaW5nRGVjb2RlclxuICAgICAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFNEKCd1dGY4JylcbiAgICAgIH1cbiAgICAgIGRhdGEgPSB0aGlzLl9kZWNvZGVyLndyaXRlKGRhdGEpXG4gICAgfVxuXG4gICAgdGhpcy5fcGFyc2VyLndyaXRlKGRhdGEudG9TdHJpbmcoKSlcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBTQVhTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHRoaXMud3JpdGUoY2h1bmspXG4gICAgfVxuICAgIHRoaXMuX3BhcnNlci5lbmQoKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBTQVhTdHJlYW0ucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBoYW5kbGVyKSB7XG4gICAgdmFyIG1lID0gdGhpc1xuICAgIGlmICghbWUuX3BhcnNlclsnb24nICsgZXZdICYmIHN0cmVhbVdyYXBzLmluZGV4T2YoZXYpICE9PSAtMSkge1xuICAgICAgbWUuX3BhcnNlclsnb24nICsgZXZdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBbYXJndW1lbnRzWzBdXSA6IEFycmF5LmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICAgICAgYXJncy5zcGxpY2UoMCwgMCwgZXYpXG4gICAgICAgIG1lLmVtaXQuYXBwbHkobWUsIGFyZ3MpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmVhbS5wcm90b3R5cGUub24uY2FsbChtZSwgZXYsIGhhbmRsZXIpXG4gIH1cblxuICAvLyB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSByZXBsYWNlZCB3aXRoIGNoYXJhY3RlciBjbGFzc2VzLlxuICAvLyBYTUwgYWxsb3dzIGFsbCBtYW5uZXIgb2YgcmlkaWN1bG91cyBudW1iZXJzIGFuZCBkaWdpdHMuXG4gIHZhciBDREFUQSA9ICdbQ0RBVEFbJ1xuICB2YXIgRE9DVFlQRSA9ICdET0NUWVBFJ1xuICB2YXIgWE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnXG4gIHZhciBYTUxOU19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nXG4gIHZhciByb290TlMgPSB7IHhtbDogWE1MX05BTUVTUEFDRSwgeG1sbnM6IFhNTE5TX05BTUVTUEFDRSB9XG5cbiAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC8jTlQtTmFtZVN0YXJ0Q2hhclxuICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIHdvcmtzIG9uIHN0cmluZ3MsIGEgc2luZ2xlIGNoYXJhY3RlciBhdCBhIHRpbWVcbiAgLy8gYXMgc3VjaCwgaXQgY2Fubm90IGV2ZXIgc3VwcG9ydCBhc3RyYWwtcGxhbmUgY2hhcmFjdGVycyAoMTAwMDAtRUZGRkYpXG4gIC8vIHdpdGhvdXQgYSBzaWduaWZpY2FudCBicmVha2luZyBjaGFuZ2UgdG8gZWl0aGVyIHRoaXMgIHBhcnNlciwgb3IgdGhlXG4gIC8vIEphdmFTY3JpcHQgbGFuZ3VhZ2UuICBJbXBsZW1lbnRhdGlvbiBvZiBhbiBlbW9qaS1jYXBhYmxlIHhtbCBwYXJzZXJcbiAgLy8gaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci5cbiAgdmFyIG5hbWVTdGFydCA9IC9bOl9BLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdL1xuXG4gIHZhciBuYW1lQm9keSA9IC9bOl9BLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwLlxcZC1dL1xuXG4gIHZhciBlbnRpdHlTdGFydCA9IC9bIzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXS9cbiAgdmFyIGVudGl0eUJvZHkgPSAvWyM6X0EtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAuXFxkLV0vXG5cbiAgZnVuY3Rpb24gaXNXaGl0ZXNwYWNlIChjKSB7XG4gICAgcmV0dXJuIGMgPT09ICcgJyB8fCBjID09PSAnXFxuJyB8fCBjID09PSAnXFxyJyB8fCBjID09PSAnXFx0J1xuICB9XG5cbiAgZnVuY3Rpb24gaXNRdW90ZSAoYykge1xuICAgIHJldHVybiBjID09PSAnXCInIHx8IGMgPT09ICdcXCcnXG4gIH1cblxuICBmdW5jdGlvbiBpc0F0dHJpYkVuZCAoYykge1xuICAgIHJldHVybiBjID09PSAnPicgfHwgaXNXaGl0ZXNwYWNlKGMpXG4gIH1cblxuICBmdW5jdGlvbiBpc01hdGNoIChyZWdleCwgYykge1xuICAgIHJldHVybiByZWdleC50ZXN0KGMpXG4gIH1cblxuICBmdW5jdGlvbiBub3RNYXRjaCAocmVnZXgsIGMpIHtcbiAgICByZXR1cm4gIWlzTWF0Y2gocmVnZXgsIGMpXG4gIH1cblxuICB2YXIgUyA9IDBcbiAgc2F4LlNUQVRFID0ge1xuICAgIEJFR0lOOiBTKyssIC8vIGxlYWRpbmcgYnl0ZSBvcmRlciBtYXJrIG9yIHdoaXRlc3BhY2VcbiAgICBCRUdJTl9XSElURVNQQUNFOiBTKyssIC8vIGxlYWRpbmcgd2hpdGVzcGFjZVxuICAgIFRFWFQ6IFMrKywgLy8gZ2VuZXJhbCBzdHVmZlxuICAgIFRFWFRfRU5USVRZOiBTKyssIC8vICZhbXAgYW5kIHN1Y2guXG4gICAgT1BFTl9XQUtBOiBTKyssIC8vIDxcbiAgICBTR01MX0RFQ0w6IFMrKywgLy8gPCFCTEFSR1xuICAgIFNHTUxfREVDTF9RVU9URUQ6IFMrKywgLy8gPCFCTEFSRyBmb28gXCJiYXJcbiAgICBET0NUWVBFOiBTKyssIC8vIDwhRE9DVFlQRVxuICAgIERPQ1RZUEVfUVVPVEVEOiBTKyssIC8vIDwhRE9DVFlQRSBcIi8vYmxhaFxuICAgIERPQ1RZUEVfRFREOiBTKyssIC8vIDwhRE9DVFlQRSBcIi8vYmxhaFwiIFsgLi4uXG4gICAgRE9DVFlQRV9EVERfUVVPVEVEOiBTKyssIC8vIDwhRE9DVFlQRSBcIi8vYmxhaFwiIFsgXCJmb29cbiAgICBDT01NRU5UX1NUQVJUSU5HOiBTKyssIC8vIDwhLVxuICAgIENPTU1FTlQ6IFMrKywgLy8gPCEtLVxuICAgIENPTU1FTlRfRU5ESU5HOiBTKyssIC8vIDwhLS0gYmxhaCAtXG4gICAgQ09NTUVOVF9FTkRFRDogUysrLCAvLyA8IS0tIGJsYWggLS1cbiAgICBDREFUQTogUysrLCAvLyA8IVtDREFUQVsgc29tZXRoaW5nXG4gICAgQ0RBVEFfRU5ESU5HOiBTKyssIC8vIF1cbiAgICBDREFUQV9FTkRJTkdfMjogUysrLCAvLyBdXVxuICAgIFBST0NfSU5TVDogUysrLCAvLyA8P2hpXG4gICAgUFJPQ19JTlNUX0JPRFk6IFMrKywgLy8gPD9oaSB0aGVyZVxuICAgIFBST0NfSU5TVF9FTkRJTkc6IFMrKywgLy8gPD9oaSBcInRoZXJlXCIgP1xuICAgIE9QRU5fVEFHOiBTKyssIC8vIDxzdHJvbmdcbiAgICBPUEVOX1RBR19TTEFTSDogUysrLCAvLyA8c3Ryb25nIC9cbiAgICBBVFRSSUI6IFMrKywgLy8gPGFcbiAgICBBVFRSSUJfTkFNRTogUysrLCAvLyA8YSBmb29cbiAgICBBVFRSSUJfTkFNRV9TQVdfV0hJVEU6IFMrKywgLy8gPGEgZm9vIF9cbiAgICBBVFRSSUJfVkFMVUU6IFMrKywgLy8gPGEgZm9vPVxuICAgIEFUVFJJQl9WQUxVRV9RVU9URUQ6IFMrKywgLy8gPGEgZm9vPVwiYmFyXG4gICAgQVRUUklCX1ZBTFVFX0NMT1NFRDogUysrLCAvLyA8YSBmb289XCJiYXJcIlxuICAgIEFUVFJJQl9WQUxVRV9VTlFVT1RFRDogUysrLCAvLyA8YSBmb289YmFyXG4gICAgQVRUUklCX1ZBTFVFX0VOVElUWV9ROiBTKyssIC8vIDxmb28gYmFyPVwiJnF1b3Q7XCJcbiAgICBBVFRSSUJfVkFMVUVfRU5USVRZX1U6IFMrKywgLy8gPGZvbyBiYXI9JnF1b3RcbiAgICBDTE9TRV9UQUc6IFMrKywgLy8gPC9hXG4gICAgQ0xPU0VfVEFHX1NBV19XSElURTogUysrLCAvLyA8L2EgICA+XG4gICAgU0NSSVBUOiBTKyssIC8vIDxzY3JpcHQ+IC4uLlxuICAgIFNDUklQVF9FTkRJTkc6IFMrKyAvLyA8c2NyaXB0PiAuLi4gPFxuICB9XG5cbiAgc2F4LlhNTF9FTlRJVElFUyA9IHtcbiAgICAnYW1wJzogJyYnLFxuICAgICdndCc6ICc+JyxcbiAgICAnbHQnOiAnPCcsXG4gICAgJ3F1b3QnOiAnXCInLFxuICAgICdhcG9zJzogXCInXCJcbiAgfVxuXG4gIHNheC5FTlRJVElFUyA9IHtcbiAgICAnYW1wJzogJyYnLFxuICAgICdndCc6ICc+JyxcbiAgICAnbHQnOiAnPCcsXG4gICAgJ3F1b3QnOiAnXCInLFxuICAgICdhcG9zJzogXCInXCIsXG4gICAgJ0FFbGlnJzogMTk4LFxuICAgICdBYWN1dGUnOiAxOTMsXG4gICAgJ0FjaXJjJzogMTk0LFxuICAgICdBZ3JhdmUnOiAxOTIsXG4gICAgJ0FyaW5nJzogMTk3LFxuICAgICdBdGlsZGUnOiAxOTUsXG4gICAgJ0F1bWwnOiAxOTYsXG4gICAgJ0NjZWRpbCc6IDE5OSxcbiAgICAnRVRIJzogMjA4LFxuICAgICdFYWN1dGUnOiAyMDEsXG4gICAgJ0VjaXJjJzogMjAyLFxuICAgICdFZ3JhdmUnOiAyMDAsXG4gICAgJ0V1bWwnOiAyMDMsXG4gICAgJ0lhY3V0ZSc6IDIwNSxcbiAgICAnSWNpcmMnOiAyMDYsXG4gICAgJ0lncmF2ZSc6IDIwNCxcbiAgICAnSXVtbCc6IDIwNyxcbiAgICAnTnRpbGRlJzogMjA5LFxuICAgICdPYWN1dGUnOiAyMTEsXG4gICAgJ09jaXJjJzogMjEyLFxuICAgICdPZ3JhdmUnOiAyMTAsXG4gICAgJ09zbGFzaCc6IDIxNixcbiAgICAnT3RpbGRlJzogMjEzLFxuICAgICdPdW1sJzogMjE0LFxuICAgICdUSE9STic6IDIyMixcbiAgICAnVWFjdXRlJzogMjE4LFxuICAgICdVY2lyYyc6IDIxOSxcbiAgICAnVWdyYXZlJzogMjE3LFxuICAgICdVdW1sJzogMjIwLFxuICAgICdZYWN1dGUnOiAyMjEsXG4gICAgJ2FhY3V0ZSc6IDIyNSxcbiAgICAnYWNpcmMnOiAyMjYsXG4gICAgJ2FlbGlnJzogMjMwLFxuICAgICdhZ3JhdmUnOiAyMjQsXG4gICAgJ2FyaW5nJzogMjI5LFxuICAgICdhdGlsZGUnOiAyMjcsXG4gICAgJ2F1bWwnOiAyMjgsXG4gICAgJ2NjZWRpbCc6IDIzMSxcbiAgICAnZWFjdXRlJzogMjMzLFxuICAgICdlY2lyYyc6IDIzNCxcbiAgICAnZWdyYXZlJzogMjMyLFxuICAgICdldGgnOiAyNDAsXG4gICAgJ2V1bWwnOiAyMzUsXG4gICAgJ2lhY3V0ZSc6IDIzNyxcbiAgICAnaWNpcmMnOiAyMzgsXG4gICAgJ2lncmF2ZSc6IDIzNixcbiAgICAnaXVtbCc6IDIzOSxcbiAgICAnbnRpbGRlJzogMjQxLFxuICAgICdvYWN1dGUnOiAyNDMsXG4gICAgJ29jaXJjJzogMjQ0LFxuICAgICdvZ3JhdmUnOiAyNDIsXG4gICAgJ29zbGFzaCc6IDI0OCxcbiAgICAnb3RpbGRlJzogMjQ1LFxuICAgICdvdW1sJzogMjQ2LFxuICAgICdzemxpZyc6IDIyMyxcbiAgICAndGhvcm4nOiAyNTQsXG4gICAgJ3VhY3V0ZSc6IDI1MCxcbiAgICAndWNpcmMnOiAyNTEsXG4gICAgJ3VncmF2ZSc6IDI0OSxcbiAgICAndXVtbCc6IDI1MixcbiAgICAneWFjdXRlJzogMjUzLFxuICAgICd5dW1sJzogMjU1LFxuICAgICdjb3B5JzogMTY5LFxuICAgICdyZWcnOiAxNzQsXG4gICAgJ25ic3AnOiAxNjAsXG4gICAgJ2lleGNsJzogMTYxLFxuICAgICdjZW50JzogMTYyLFxuICAgICdwb3VuZCc6IDE2MyxcbiAgICAnY3VycmVuJzogMTY0LFxuICAgICd5ZW4nOiAxNjUsXG4gICAgJ2JydmJhcic6IDE2NixcbiAgICAnc2VjdCc6IDE2NyxcbiAgICAndW1sJzogMTY4LFxuICAgICdvcmRmJzogMTcwLFxuICAgICdsYXF1byc6IDE3MSxcbiAgICAnbm90JzogMTcyLFxuICAgICdzaHknOiAxNzMsXG4gICAgJ21hY3InOiAxNzUsXG4gICAgJ2RlZyc6IDE3NixcbiAgICAncGx1c21uJzogMTc3LFxuICAgICdzdXAxJzogMTg1LFxuICAgICdzdXAyJzogMTc4LFxuICAgICdzdXAzJzogMTc5LFxuICAgICdhY3V0ZSc6IDE4MCxcbiAgICAnbWljcm8nOiAxODEsXG4gICAgJ3BhcmEnOiAxODIsXG4gICAgJ21pZGRvdCc6IDE4MyxcbiAgICAnY2VkaWwnOiAxODQsXG4gICAgJ29yZG0nOiAxODYsXG4gICAgJ3JhcXVvJzogMTg3LFxuICAgICdmcmFjMTQnOiAxODgsXG4gICAgJ2ZyYWMxMic6IDE4OSxcbiAgICAnZnJhYzM0JzogMTkwLFxuICAgICdpcXVlc3QnOiAxOTEsXG4gICAgJ3RpbWVzJzogMjE1LFxuICAgICdkaXZpZGUnOiAyNDcsXG4gICAgJ09FbGlnJzogMzM4LFxuICAgICdvZWxpZyc6IDMzOSxcbiAgICAnU2Nhcm9uJzogMzUyLFxuICAgICdzY2Fyb24nOiAzNTMsXG4gICAgJ1l1bWwnOiAzNzYsXG4gICAgJ2Zub2YnOiA0MDIsXG4gICAgJ2NpcmMnOiA3MTAsXG4gICAgJ3RpbGRlJzogNzMyLFxuICAgICdBbHBoYSc6IDkxMyxcbiAgICAnQmV0YSc6IDkxNCxcbiAgICAnR2FtbWEnOiA5MTUsXG4gICAgJ0RlbHRhJzogOTE2LFxuICAgICdFcHNpbG9uJzogOTE3LFxuICAgICdaZXRhJzogOTE4LFxuICAgICdFdGEnOiA5MTksXG4gICAgJ1RoZXRhJzogOTIwLFxuICAgICdJb3RhJzogOTIxLFxuICAgICdLYXBwYSc6IDkyMixcbiAgICAnTGFtYmRhJzogOTIzLFxuICAgICdNdSc6IDkyNCxcbiAgICAnTnUnOiA5MjUsXG4gICAgJ1hpJzogOTI2LFxuICAgICdPbWljcm9uJzogOTI3LFxuICAgICdQaSc6IDkyOCxcbiAgICAnUmhvJzogOTI5LFxuICAgICdTaWdtYSc6IDkzMSxcbiAgICAnVGF1JzogOTMyLFxuICAgICdVcHNpbG9uJzogOTMzLFxuICAgICdQaGknOiA5MzQsXG4gICAgJ0NoaSc6IDkzNSxcbiAgICAnUHNpJzogOTM2LFxuICAgICdPbWVnYSc6IDkzNyxcbiAgICAnYWxwaGEnOiA5NDUsXG4gICAgJ2JldGEnOiA5NDYsXG4gICAgJ2dhbW1hJzogOTQ3LFxuICAgICdkZWx0YSc6IDk0OCxcbiAgICAnZXBzaWxvbic6IDk0OSxcbiAgICAnemV0YSc6IDk1MCxcbiAgICAnZXRhJzogOTUxLFxuICAgICd0aGV0YSc6IDk1MixcbiAgICAnaW90YSc6IDk1MyxcbiAgICAna2FwcGEnOiA5NTQsXG4gICAgJ2xhbWJkYSc6IDk1NSxcbiAgICAnbXUnOiA5NTYsXG4gICAgJ251JzogOTU3LFxuICAgICd4aSc6IDk1OCxcbiAgICAnb21pY3Jvbic6IDk1OSxcbiAgICAncGknOiA5NjAsXG4gICAgJ3Jobyc6IDk2MSxcbiAgICAnc2lnbWFmJzogOTYyLFxuICAgICdzaWdtYSc6IDk2MyxcbiAgICAndGF1JzogOTY0LFxuICAgICd1cHNpbG9uJzogOTY1LFxuICAgICdwaGknOiA5NjYsXG4gICAgJ2NoaSc6IDk2NyxcbiAgICAncHNpJzogOTY4LFxuICAgICdvbWVnYSc6IDk2OSxcbiAgICAndGhldGFzeW0nOiA5NzcsXG4gICAgJ3Vwc2loJzogOTc4LFxuICAgICdwaXYnOiA5ODIsXG4gICAgJ2Vuc3AnOiA4MTk0LFxuICAgICdlbXNwJzogODE5NSxcbiAgICAndGhpbnNwJzogODIwMSxcbiAgICAnenduaic6IDgyMDQsXG4gICAgJ3p3aic6IDgyMDUsXG4gICAgJ2xybSc6IDgyMDYsXG4gICAgJ3JsbSc6IDgyMDcsXG4gICAgJ25kYXNoJzogODIxMSxcbiAgICAnbWRhc2gnOiA4MjEyLFxuICAgICdsc3F1byc6IDgyMTYsXG4gICAgJ3JzcXVvJzogODIxNyxcbiAgICAnc2JxdW8nOiA4MjE4LFxuICAgICdsZHF1byc6IDgyMjAsXG4gICAgJ3JkcXVvJzogODIyMSxcbiAgICAnYmRxdW8nOiA4MjIyLFxuICAgICdkYWdnZXInOiA4MjI0LFxuICAgICdEYWdnZXInOiA4MjI1LFxuICAgICdidWxsJzogODIyNixcbiAgICAnaGVsbGlwJzogODIzMCxcbiAgICAncGVybWlsJzogODI0MCxcbiAgICAncHJpbWUnOiA4MjQyLFxuICAgICdQcmltZSc6IDgyNDMsXG4gICAgJ2xzYXF1byc6IDgyNDksXG4gICAgJ3JzYXF1byc6IDgyNTAsXG4gICAgJ29saW5lJzogODI1NCxcbiAgICAnZnJhc2wnOiA4MjYwLFxuICAgICdldXJvJzogODM2NCxcbiAgICAnaW1hZ2UnOiA4NDY1LFxuICAgICd3ZWllcnAnOiA4NDcyLFxuICAgICdyZWFsJzogODQ3NixcbiAgICAndHJhZGUnOiA4NDgyLFxuICAgICdhbGVmc3ltJzogODUwMSxcbiAgICAnbGFycic6IDg1OTIsXG4gICAgJ3VhcnInOiA4NTkzLFxuICAgICdyYXJyJzogODU5NCxcbiAgICAnZGFycic6IDg1OTUsXG4gICAgJ2hhcnInOiA4NTk2LFxuICAgICdjcmFycic6IDg2MjksXG4gICAgJ2xBcnInOiA4NjU2LFxuICAgICd1QXJyJzogODY1NyxcbiAgICAnckFycic6IDg2NTgsXG4gICAgJ2RBcnInOiA4NjU5LFxuICAgICdoQXJyJzogODY2MCxcbiAgICAnZm9yYWxsJzogODcwNCxcbiAgICAncGFydCc6IDg3MDYsXG4gICAgJ2V4aXN0JzogODcwNyxcbiAgICAnZW1wdHknOiA4NzA5LFxuICAgICduYWJsYSc6IDg3MTEsXG4gICAgJ2lzaW4nOiA4NzEyLFxuICAgICdub3Rpbic6IDg3MTMsXG4gICAgJ25pJzogODcxNSxcbiAgICAncHJvZCc6IDg3MTksXG4gICAgJ3N1bSc6IDg3MjEsXG4gICAgJ21pbnVzJzogODcyMixcbiAgICAnbG93YXN0JzogODcyNyxcbiAgICAncmFkaWMnOiA4NzMwLFxuICAgICdwcm9wJzogODczMyxcbiAgICAnaW5maW4nOiA4NzM0LFxuICAgICdhbmcnOiA4NzM2LFxuICAgICdhbmQnOiA4NzQzLFxuICAgICdvcic6IDg3NDQsXG4gICAgJ2NhcCc6IDg3NDUsXG4gICAgJ2N1cCc6IDg3NDYsXG4gICAgJ2ludCc6IDg3NDcsXG4gICAgJ3RoZXJlNCc6IDg3NTYsXG4gICAgJ3NpbSc6IDg3NjQsXG4gICAgJ2NvbmcnOiA4NzczLFxuICAgICdhc3ltcCc6IDg3NzYsXG4gICAgJ25lJzogODgwMCxcbiAgICAnZXF1aXYnOiA4ODAxLFxuICAgICdsZSc6IDg4MDQsXG4gICAgJ2dlJzogODgwNSxcbiAgICAnc3ViJzogODgzNCxcbiAgICAnc3VwJzogODgzNSxcbiAgICAnbnN1Yic6IDg4MzYsXG4gICAgJ3N1YmUnOiA4ODM4LFxuICAgICdzdXBlJzogODgzOSxcbiAgICAnb3BsdXMnOiA4ODUzLFxuICAgICdvdGltZXMnOiA4ODU1LFxuICAgICdwZXJwJzogODg2OSxcbiAgICAnc2RvdCc6IDg5MDEsXG4gICAgJ2xjZWlsJzogODk2OCxcbiAgICAncmNlaWwnOiA4OTY5LFxuICAgICdsZmxvb3InOiA4OTcwLFxuICAgICdyZmxvb3InOiA4OTcxLFxuICAgICdsYW5nJzogOTAwMSxcbiAgICAncmFuZyc6IDkwMDIsXG4gICAgJ2xveic6IDk2NzQsXG4gICAgJ3NwYWRlcyc6IDk4MjQsXG4gICAgJ2NsdWJzJzogOTgyNyxcbiAgICAnaGVhcnRzJzogOTgyOSxcbiAgICAnZGlhbXMnOiA5ODMwXG4gIH1cblxuICBPYmplY3Qua2V5cyhzYXguRU5USVRJRVMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlID0gc2F4LkVOVElUSUVTW2tleV1cbiAgICB2YXIgcyA9IHR5cGVvZiBlID09PSAnbnVtYmVyJyA/IFN0cmluZy5mcm9tQ2hhckNvZGUoZSkgOiBlXG4gICAgc2F4LkVOVElUSUVTW2tleV0gPSBzXG4gIH0pXG5cbiAgZm9yICh2YXIgcyBpbiBzYXguU1RBVEUpIHtcbiAgICBzYXguU1RBVEVbc2F4LlNUQVRFW3NdXSA9IHNcbiAgfVxuXG4gIC8vIHNob3J0aGFuZFxuICBTID0gc2F4LlNUQVRFXG5cbiAgZnVuY3Rpb24gZW1pdCAocGFyc2VyLCBldmVudCwgZGF0YSkge1xuICAgIHBhcnNlcltldmVudF0gJiYgcGFyc2VyW2V2ZW50XShkYXRhKVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdE5vZGUgKHBhcnNlciwgbm9kZVR5cGUsIGRhdGEpIHtcbiAgICBpZiAocGFyc2VyLnRleHROb2RlKSBjbG9zZVRleHQocGFyc2VyKVxuICAgIGVtaXQocGFyc2VyLCBub2RlVHlwZSwgZGF0YSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlVGV4dCAocGFyc2VyKSB7XG4gICAgcGFyc2VyLnRleHROb2RlID0gdGV4dG9wdHMocGFyc2VyLm9wdCwgcGFyc2VyLnRleHROb2RlKVxuICAgIGlmIChwYXJzZXIudGV4dE5vZGUpIGVtaXQocGFyc2VyLCAnb250ZXh0JywgcGFyc2VyLnRleHROb2RlKVxuICAgIHBhcnNlci50ZXh0Tm9kZSA9ICcnXG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0b3B0cyAob3B0LCB0ZXh0KSB7XG4gICAgaWYgKG9wdC50cmltKSB0ZXh0ID0gdGV4dC50cmltKClcbiAgICBpZiAob3B0Lm5vcm1hbGl6ZSkgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxzKy9nLCAnICcpXG4gICAgcmV0dXJuIHRleHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yIChwYXJzZXIsIGVyKSB7XG4gICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBpZiAocGFyc2VyLnRyYWNrUG9zaXRpb24pIHtcbiAgICAgIGVyICs9ICdcXG5MaW5lOiAnICsgcGFyc2VyLmxpbmUgK1xuICAgICAgICAnXFxuQ29sdW1uOiAnICsgcGFyc2VyLmNvbHVtbiArXG4gICAgICAgICdcXG5DaGFyOiAnICsgcGFyc2VyLmNcbiAgICB9XG4gICAgZXIgPSBuZXcgRXJyb3IoZXIpXG4gICAgcGFyc2VyLmVycm9yID0gZXJcbiAgICBlbWl0KHBhcnNlciwgJ29uZXJyb3InLCBlcilcbiAgICByZXR1cm4gcGFyc2VyXG4gIH1cblxuICBmdW5jdGlvbiBlbmQgKHBhcnNlcikge1xuICAgIGlmIChwYXJzZXIuc2F3Um9vdCAmJiAhcGFyc2VyLmNsb3NlZFJvb3QpIHN0cmljdEZhaWwocGFyc2VyLCAnVW5jbG9zZWQgcm9vdCB0YWcnKVxuICAgIGlmICgocGFyc2VyLnN0YXRlICE9PSBTLkJFR0lOKSAmJlxuICAgICAgKHBhcnNlci5zdGF0ZSAhPT0gUy5CRUdJTl9XSElURVNQQUNFKSAmJlxuICAgICAgKHBhcnNlci5zdGF0ZSAhPT0gUy5URVhUKSkge1xuICAgICAgZXJyb3IocGFyc2VyLCAnVW5leHBlY3RlZCBlbmQnKVxuICAgIH1cbiAgICBjbG9zZVRleHQocGFyc2VyKVxuICAgIHBhcnNlci5jID0gJydcbiAgICBwYXJzZXIuY2xvc2VkID0gdHJ1ZVxuICAgIGVtaXQocGFyc2VyLCAnb25lbmQnKVxuICAgIFNBWFBhcnNlci5jYWxsKHBhcnNlciwgcGFyc2VyLnN0cmljdCwgcGFyc2VyLm9wdClcbiAgICByZXR1cm4gcGFyc2VyXG4gIH1cblxuICBmdW5jdGlvbiBzdHJpY3RGYWlsIChwYXJzZXIsIG1lc3NhZ2UpIHtcbiAgICBpZiAodHlwZW9mIHBhcnNlciAhPT0gJ29iamVjdCcgfHwgIShwYXJzZXIgaW5zdGFuY2VvZiBTQVhQYXJzZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBjYWxsIHRvIHN0cmljdEZhaWwnKVxuICAgIH1cbiAgICBpZiAocGFyc2VyLnN0cmljdCkge1xuICAgICAgZXJyb3IocGFyc2VyLCBtZXNzYWdlKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG5ld1RhZyAocGFyc2VyKSB7XG4gICAgaWYgKCFwYXJzZXIuc3RyaWN0KSBwYXJzZXIudGFnTmFtZSA9IHBhcnNlci50YWdOYW1lW3BhcnNlci5sb29zZUNhc2VdKClcbiAgICB2YXIgcGFyZW50ID0gcGFyc2VyLnRhZ3NbcGFyc2VyLnRhZ3MubGVuZ3RoIC0gMV0gfHwgcGFyc2VyXG4gICAgdmFyIHRhZyA9IHBhcnNlci50YWcgPSB7IG5hbWU6IHBhcnNlci50YWdOYW1lLCBhdHRyaWJ1dGVzOiB7fSB9XG5cbiAgICAvLyB3aWxsIGJlIG92ZXJyaWRkZW4gaWYgdGFnIGNvbnRhaWxzIGFuIHhtbG5zPVwiZm9vXCIgb3IgeG1sbnM6Zm9vPVwiYmFyXCJcbiAgICBpZiAocGFyc2VyLm9wdC54bWxucykge1xuICAgICAgdGFnLm5zID0gcGFyZW50Lm5zXG4gICAgfVxuICAgIHBhcnNlci5hdHRyaWJMaXN0Lmxlbmd0aCA9IDBcbiAgICBlbWl0Tm9kZShwYXJzZXIsICdvbm9wZW50YWdzdGFydCcsIHRhZylcbiAgfVxuXG4gIGZ1bmN0aW9uIHFuYW1lIChuYW1lLCBhdHRyaWJ1dGUpIHtcbiAgICB2YXIgaSA9IG5hbWUuaW5kZXhPZignOicpXG4gICAgdmFyIHF1YWxOYW1lID0gaSA8IDAgPyBbICcnLCBuYW1lIF0gOiBuYW1lLnNwbGl0KCc6JylcbiAgICB2YXIgcHJlZml4ID0gcXVhbE5hbWVbMF1cbiAgICB2YXIgbG9jYWwgPSBxdWFsTmFtZVsxXVxuXG4gICAgLy8gPHggXCJ4bWxuc1wiPVwiaHR0cDovL2Zvb1wiPlxuICAgIGlmIChhdHRyaWJ1dGUgJiYgbmFtZSA9PT0gJ3htbG5zJykge1xuICAgICAgcHJlZml4ID0gJ3htbG5zJ1xuICAgICAgbG9jYWwgPSAnJ1xuICAgIH1cblxuICAgIHJldHVybiB7IHByZWZpeDogcHJlZml4LCBsb2NhbDogbG9jYWwgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXR0cmliIChwYXJzZXIpIHtcbiAgICBpZiAoIXBhcnNlci5zdHJpY3QpIHtcbiAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gcGFyc2VyLmF0dHJpYk5hbWVbcGFyc2VyLmxvb3NlQ2FzZV0oKVxuICAgIH1cblxuICAgIGlmIChwYXJzZXIuYXR0cmliTGlzdC5pbmRleE9mKHBhcnNlci5hdHRyaWJOYW1lKSAhPT0gLTEgfHxcbiAgICAgIHBhcnNlci50YWcuYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShwYXJzZXIuYXR0cmliTmFtZSkpIHtcbiAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICB2YXIgcW4gPSBxbmFtZShwYXJzZXIuYXR0cmliTmFtZSwgdHJ1ZSlcbiAgICAgIHZhciBwcmVmaXggPSBxbi5wcmVmaXhcbiAgICAgIHZhciBsb2NhbCA9IHFuLmxvY2FsXG5cbiAgICAgIGlmIChwcmVmaXggPT09ICd4bWxucycpIHtcbiAgICAgICAgLy8gbmFtZXNwYWNlIGJpbmRpbmcgYXR0cmlidXRlLiBwdXNoIHRoZSBiaW5kaW5nIGludG8gc2NvcGVcbiAgICAgICAgaWYgKGxvY2FsID09PSAneG1sJyAmJiBwYXJzZXIuYXR0cmliVmFsdWUgIT09IFhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlcixcbiAgICAgICAgICAgICd4bWw6IHByZWZpeCBtdXN0IGJlIGJvdW5kIHRvICcgKyBYTUxfTkFNRVNQQUNFICsgJ1xcbicgK1xuICAgICAgICAgICAgJ0FjdHVhbDogJyArIHBhcnNlci5hdHRyaWJWYWx1ZSlcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbCA9PT0gJ3htbG5zJyAmJiBwYXJzZXIuYXR0cmliVmFsdWUgIT09IFhNTE5TX05BTUVTUEFDRSkge1xuICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLFxuICAgICAgICAgICAgJ3htbG5zOiBwcmVmaXggbXVzdCBiZSBib3VuZCB0byAnICsgWE1MTlNfTkFNRVNQQUNFICsgJ1xcbicgK1xuICAgICAgICAgICAgJ0FjdHVhbDogJyArIHBhcnNlci5hdHRyaWJWYWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdGFnID0gcGFyc2VyLnRhZ1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBwYXJzZXIudGFnc1twYXJzZXIudGFncy5sZW5ndGggLSAxXSB8fCBwYXJzZXJcbiAgICAgICAgICBpZiAodGFnLm5zID09PSBwYXJlbnQubnMpIHtcbiAgICAgICAgICAgIHRhZy5ucyA9IE9iamVjdC5jcmVhdGUocGFyZW50Lm5zKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0YWcubnNbbG9jYWxdID0gcGFyc2VyLmF0dHJpYlZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZGVmZXIgb25hdHRyaWJ1dGUgZXZlbnRzIHVudGlsIGFsbCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZWVuXG4gICAgICAvLyBzbyBhbnkgbmV3IGJpbmRpbmdzIGNhbiB0YWtlIGVmZmVjdC4gcHJlc2VydmUgYXR0cmlidXRlIG9yZGVyXG4gICAgICAvLyBzbyBkZWZlcnJlZCBldmVudHMgY2FuIGJlIGVtaXR0ZWQgaW4gZG9jdW1lbnQgb3JkZXJcbiAgICAgIHBhcnNlci5hdHRyaWJMaXN0LnB1c2goW3BhcnNlci5hdHRyaWJOYW1lLCBwYXJzZXIuYXR0cmliVmFsdWVdKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbiBub24teG1sbnMgbW9kZSwgd2UgY2FuIGVtaXQgdGhlIGV2ZW50IHJpZ2h0IGF3YXlcbiAgICAgIHBhcnNlci50YWcuYXR0cmlidXRlc1twYXJzZXIuYXR0cmliTmFtZV0gPSBwYXJzZXIuYXR0cmliVmFsdWVcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uYXR0cmlidXRlJywge1xuICAgICAgICBuYW1lOiBwYXJzZXIuYXR0cmliTmFtZSxcbiAgICAgICAgdmFsdWU6IHBhcnNlci5hdHRyaWJWYWx1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuVGFnIChwYXJzZXIsIHNlbGZDbG9zaW5nKSB7XG4gICAgaWYgKHBhcnNlci5vcHQueG1sbnMpIHtcbiAgICAgIC8vIGVtaXQgbmFtZXNwYWNlIGJpbmRpbmcgZXZlbnRzXG4gICAgICB2YXIgdGFnID0gcGFyc2VyLnRhZ1xuXG4gICAgICAvLyBhZGQgbmFtZXNwYWNlIGluZm8gdG8gdGFnXG4gICAgICB2YXIgcW4gPSBxbmFtZShwYXJzZXIudGFnTmFtZSlcbiAgICAgIHRhZy5wcmVmaXggPSBxbi5wcmVmaXhcbiAgICAgIHRhZy5sb2NhbCA9IHFuLmxvY2FsXG4gICAgICB0YWcudXJpID0gdGFnLm5zW3FuLnByZWZpeF0gfHwgJydcblxuICAgICAgaWYgKHRhZy5wcmVmaXggJiYgIXRhZy51cmkpIHtcbiAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbmJvdW5kIG5hbWVzcGFjZSBwcmVmaXg6ICcgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHBhcnNlci50YWdOYW1lKSlcbiAgICAgICAgdGFnLnVyaSA9IHFuLnByZWZpeFxuICAgICAgfVxuXG4gICAgICB2YXIgcGFyZW50ID0gcGFyc2VyLnRhZ3NbcGFyc2VyLnRhZ3MubGVuZ3RoIC0gMV0gfHwgcGFyc2VyXG4gICAgICBpZiAodGFnLm5zICYmIHBhcmVudC5ucyAhPT0gdGFnLm5zKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRhZy5ucykuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3Blbm5hbWVzcGFjZScsIHtcbiAgICAgICAgICAgIHByZWZpeDogcCxcbiAgICAgICAgICAgIHVyaTogdGFnLm5zW3BdXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gaGFuZGxlIGRlZmVycmVkIG9uYXR0cmlidXRlIGV2ZW50c1xuICAgICAgLy8gTm90ZTogZG8gbm90IGFwcGx5IGRlZmF1bHQgbnMgdG8gYXR0cmlidXRlczpcbiAgICAgIC8vICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8jZGVmYXVsdGluZ1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIG52ID0gcGFyc2VyLmF0dHJpYkxpc3RbaV1cbiAgICAgICAgdmFyIG5hbWUgPSBudlswXVxuICAgICAgICB2YXIgdmFsdWUgPSBudlsxXVxuICAgICAgICB2YXIgcXVhbE5hbWUgPSBxbmFtZShuYW1lLCB0cnVlKVxuICAgICAgICB2YXIgcHJlZml4ID0gcXVhbE5hbWUucHJlZml4XG4gICAgICAgIHZhciBsb2NhbCA9IHF1YWxOYW1lLmxvY2FsXG4gICAgICAgIHZhciB1cmkgPSBwcmVmaXggPT09ICcnID8gJycgOiAodGFnLm5zW3ByZWZpeF0gfHwgJycpXG4gICAgICAgIHZhciBhID0ge1xuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgICAgIGxvY2FsOiBsb2NhbCxcbiAgICAgICAgICB1cmk6IHVyaVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlcmUncyBhbnkgYXR0cmlidXRlcyB3aXRoIGFuIHVuZGVmaW5lZCBuYW1lc3BhY2UsXG4gICAgICAgIC8vIHRoZW4gZmFpbCBvbiB0aGVtIG5vdy5cbiAgICAgICAgaWYgKHByZWZpeCAmJiBwcmVmaXggIT09ICd4bWxucycgJiYgIXVyaSkge1xuICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5ib3VuZCBuYW1lc3BhY2UgcHJlZml4OiAnICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHByZWZpeCkpXG4gICAgICAgICAgYS51cmkgPSBwcmVmaXhcbiAgICAgICAgfVxuICAgICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXNbbmFtZV0gPSBhXG4gICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uYXR0cmlidXRlJywgYSlcbiAgICAgIH1cbiAgICAgIHBhcnNlci5hdHRyaWJMaXN0Lmxlbmd0aCA9IDBcbiAgICB9XG5cbiAgICBwYXJzZXIudGFnLmlzU2VsZkNsb3NpbmcgPSAhIXNlbGZDbG9zaW5nXG5cbiAgICAvLyBwcm9jZXNzIHRoZSB0YWdcbiAgICBwYXJzZXIuc2F3Um9vdCA9IHRydWVcbiAgICBwYXJzZXIudGFncy5wdXNoKHBhcnNlci50YWcpXG4gICAgZW1pdE5vZGUocGFyc2VyLCAnb25vcGVudGFnJywgcGFyc2VyLnRhZylcbiAgICBpZiAoIXNlbGZDbG9zaW5nKSB7XG4gICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIDxzY3JpcHQ+IGluIG5vbi1zdHJpY3QgbW9kZS5cbiAgICAgIGlmICghcGFyc2VyLm5vc2NyaXB0ICYmIHBhcnNlci50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzY3JpcHQnKSB7XG4gICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgIH1cbiAgICAgIHBhcnNlci50YWcgPSBudWxsXG4gICAgICBwYXJzZXIudGFnTmFtZSA9ICcnXG4gICAgfVxuICAgIHBhcnNlci5hdHRyaWJOYW1lID0gcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVRhZyAocGFyc2VyKSB7XG4gICAgaWYgKCFwYXJzZXIudGFnTmFtZSkge1xuICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdXZWlyZCBlbXB0eSBjbG9zZSB0YWcuJylcbiAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSAnPC8+J1xuICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocGFyc2VyLnNjcmlwdCkge1xuICAgICAgaWYgKHBhcnNlci50YWdOYW1lICE9PSAnc2NyaXB0Jykge1xuICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8LycgKyBwYXJzZXIudGFnTmFtZSArICc+J1xuICAgICAgICBwYXJzZXIudGFnTmFtZSA9ICcnXG4gICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25zY3JpcHQnLCBwYXJzZXIuc2NyaXB0KVxuICAgICAgcGFyc2VyLnNjcmlwdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gZmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGNsb3NpbmcgdGFnIGFjdHVhbGx5IGV4aXN0cy5cbiAgICAvLyA8YT48Yj48L2M+PC9iPjwvYT4gd2lsbCBjbG9zZSBldmVyeXRoaW5nLCBvdGhlcndpc2UuXG4gICAgdmFyIHQgPSBwYXJzZXIudGFncy5sZW5ndGhcbiAgICB2YXIgdGFnTmFtZSA9IHBhcnNlci50YWdOYW1lXG4gICAgaWYgKCFwYXJzZXIuc3RyaWN0KSB7XG4gICAgICB0YWdOYW1lID0gdGFnTmFtZVtwYXJzZXIubG9vc2VDYXNlXSgpXG4gICAgfVxuICAgIHZhciBjbG9zZVRvID0gdGFnTmFtZVxuICAgIHdoaWxlICh0LS0pIHtcbiAgICAgIHZhciBjbG9zZSA9IHBhcnNlci50YWdzW3RdXG4gICAgICBpZiAoY2xvc2UubmFtZSAhPT0gY2xvc2VUbykge1xuICAgICAgICAvLyBmYWlsIHRoZSBmaXJzdCB0aW1lIGluIHN0cmljdCBtb2RlXG4gICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5leHBlY3RlZCBjbG9zZSB0YWcnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkaWRuJ3QgZmluZCBpdC4gIHdlIGFscmVhZHkgZmFpbGVkIGZvciBzdHJpY3QsIHNvIGp1c3QgYWJvcnQuXG4gICAgaWYgKHQgPCAwKSB7XG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VubWF0Y2hlZCBjbG9zaW5nIHRhZzogJyArIHBhcnNlci50YWdOYW1lKVxuICAgICAgcGFyc2VyLnRleHROb2RlICs9ICc8LycgKyBwYXJzZXIudGFnTmFtZSArICc+J1xuICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcGFyc2VyLnRhZ05hbWUgPSB0YWdOYW1lXG4gICAgdmFyIHMgPSBwYXJzZXIudGFncy5sZW5ndGhcbiAgICB3aGlsZSAocy0tID4gdCkge1xuICAgICAgdmFyIHRhZyA9IHBhcnNlci50YWcgPSBwYXJzZXIudGFncy5wb3AoKVxuICAgICAgcGFyc2VyLnRhZ05hbWUgPSBwYXJzZXIudGFnLm5hbWVcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2xvc2V0YWcnLCBwYXJzZXIudGFnTmFtZSlcblxuICAgICAgdmFyIHggPSB7fVxuICAgICAgZm9yICh2YXIgaSBpbiB0YWcubnMpIHtcbiAgICAgICAgeFtpXSA9IHRhZy5uc1tpXVxuICAgICAgfVxuXG4gICAgICB2YXIgcGFyZW50ID0gcGFyc2VyLnRhZ3NbcGFyc2VyLnRhZ3MubGVuZ3RoIC0gMV0gfHwgcGFyc2VyXG4gICAgICBpZiAocGFyc2VyLm9wdC54bWxucyAmJiB0YWcubnMgIT09IHBhcmVudC5ucykge1xuICAgICAgICAvLyByZW1vdmUgbmFtZXNwYWNlIGJpbmRpbmdzIGludHJvZHVjZWQgYnkgdGFnXG4gICAgICAgIE9iamVjdC5rZXlzKHRhZy5ucykuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICAgIHZhciBuID0gdGFnLm5zW3BdXG4gICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25jbG9zZW5hbWVzcGFjZScsIHsgcHJlZml4OiBwLCB1cmk6IG4gfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHQgPT09IDApIHBhcnNlci5jbG9zZWRSb290ID0gdHJ1ZVxuICAgIHBhcnNlci50YWdOYW1lID0gcGFyc2VyLmF0dHJpYlZhbHVlID0gcGFyc2VyLmF0dHJpYk5hbWUgPSAnJ1xuICAgIHBhcnNlci5hdHRyaWJMaXN0Lmxlbmd0aCA9IDBcbiAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlRW50aXR5IChwYXJzZXIpIHtcbiAgICB2YXIgZW50aXR5ID0gcGFyc2VyLmVudGl0eVxuICAgIHZhciBlbnRpdHlMQyA9IGVudGl0eS50b0xvd2VyQ2FzZSgpXG4gICAgdmFyIG51bVxuICAgIHZhciBudW1TdHIgPSAnJ1xuXG4gICAgaWYgKHBhcnNlci5FTlRJVElFU1tlbnRpdHldKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLkVOVElUSUVTW2VudGl0eV1cbiAgICB9XG4gICAgaWYgKHBhcnNlci5FTlRJVElFU1tlbnRpdHlMQ10pIHtcbiAgICAgIHJldHVybiBwYXJzZXIuRU5USVRJRVNbZW50aXR5TENdXG4gICAgfVxuICAgIGVudGl0eSA9IGVudGl0eUxDXG4gICAgaWYgKGVudGl0eS5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgaWYgKGVudGl0eS5jaGFyQXQoMSkgPT09ICd4Jykge1xuICAgICAgICBlbnRpdHkgPSBlbnRpdHkuc2xpY2UoMilcbiAgICAgICAgbnVtID0gcGFyc2VJbnQoZW50aXR5LCAxNilcbiAgICAgICAgbnVtU3RyID0gbnVtLnRvU3RyaW5nKDE2KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50aXR5ID0gZW50aXR5LnNsaWNlKDEpXG4gICAgICAgIG51bSA9IHBhcnNlSW50KGVudGl0eSwgMTApXG4gICAgICAgIG51bVN0ciA9IG51bS50b1N0cmluZygxMClcbiAgICAgIH1cbiAgICB9XG4gICAgZW50aXR5ID0gZW50aXR5LnJlcGxhY2UoL14wKy8sICcnKVxuICAgIGlmIChpc05hTihudW0pIHx8IG51bVN0ci50b0xvd2VyQ2FzZSgpICE9PSBlbnRpdHkpIHtcbiAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBjaGFyYWN0ZXIgZW50aXR5JylcbiAgICAgIHJldHVybiAnJicgKyBwYXJzZXIuZW50aXR5ICsgJzsnXG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KG51bSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGJlZ2luV2hpdGVTcGFjZSAocGFyc2VyLCBjKSB7XG4gICAgaWYgKGMgPT09ICc8Jykge1xuICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1dBS0FcbiAgICAgIHBhcnNlci5zdGFydFRhZ1Bvc2l0aW9uID0gcGFyc2VyLnBvc2l0aW9uXG4gICAgfSBlbHNlIGlmICghaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAvLyBoYXZlIHRvIHByb2Nlc3MgdGhpcyBhcyBhIHRleHQgbm9kZS5cbiAgICAgIC8vIHdlaXJkLCBidXQgaGFwcGVucy5cbiAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnTm9uLXdoaXRlc3BhY2UgYmVmb3JlIGZpcnN0IHRhZy4nKVxuICAgICAgcGFyc2VyLnRleHROb2RlID0gY1xuICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hhckF0IChjaHVuaywgaSkge1xuICAgIHZhciByZXN1bHQgPSAnJ1xuICAgIGlmIChpIDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICByZXN1bHQgPSBjaHVuay5jaGFyQXQoaSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGUgKGNodW5rKSB7XG4gICAgdmFyIHBhcnNlciA9IHRoaXNcbiAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5lcnJvclxuICAgIH1cbiAgICBpZiAocGFyc2VyLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIGVycm9yKHBhcnNlcixcbiAgICAgICAgJ0Nhbm5vdCB3cml0ZSBhZnRlciBjbG9zZS4gQXNzaWduIGFuIG9ucmVhZHkgaGFuZGxlci4nKVxuICAgIH1cbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmQocGFyc2VyKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnb2JqZWN0Jykge1xuICAgICAgY2h1bmsgPSBjaHVuay50b1N0cmluZygpXG4gICAgfVxuICAgIHZhciBpID0gMFxuICAgIHZhciBjID0gJydcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgYyA9IGNoYXJBdChjaHVuaywgaSsrKVxuICAgICAgcGFyc2VyLmMgPSBjXG5cbiAgICAgIGlmICghYykge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyc2VyLnRyYWNrUG9zaXRpb24pIHtcbiAgICAgICAgcGFyc2VyLnBvc2l0aW9uKytcbiAgICAgICAgaWYgKGMgPT09ICdcXG4nKSB7XG4gICAgICAgICAgcGFyc2VyLmxpbmUrK1xuICAgICAgICAgIHBhcnNlci5jb2x1bW4gPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyc2VyLmNvbHVtbisrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChwYXJzZXIuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBTLkJFR0lOOlxuICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQkVHSU5fV0hJVEVTUEFDRVxuICAgICAgICAgIGlmIChjID09PSAnXFx1RkVGRicpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJlZ2luV2hpdGVTcGFjZShwYXJzZXIsIGMpXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQkVHSU5fV0hJVEVTUEFDRTpcbiAgICAgICAgICBiZWdpbldoaXRlU3BhY2UocGFyc2VyLCBjKVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlRFWFQ6XG4gICAgICAgICAgaWYgKHBhcnNlci5zYXdSb290ICYmICFwYXJzZXIuY2xvc2VkUm9vdCkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0aSA9IGkgLSAxXG4gICAgICAgICAgICB3aGlsZSAoYyAmJiBjICE9PSAnPCcgJiYgYyAhPT0gJyYnKSB7XG4gICAgICAgICAgICAgIGMgPSBjaGFyQXQoY2h1bmssIGkrKylcbiAgICAgICAgICAgICAgaWYgKGMgJiYgcGFyc2VyLnRyYWNrUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwYXJzZXIucG9zaXRpb24rK1xuICAgICAgICAgICAgICAgIGlmIChjID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgcGFyc2VyLmxpbmUrK1xuICAgICAgICAgICAgICAgICAgcGFyc2VyLmNvbHVtbiA9IDBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGFyc2VyLmNvbHVtbisrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZXIudGV4dE5vZGUgKz0gY2h1bmsuc3Vic3RyaW5nKHN0YXJ0aSwgaSAtIDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjID09PSAnPCcgJiYgIShwYXJzZXIuc2F3Um9vdCAmJiBwYXJzZXIuY2xvc2VkUm9vdCAmJiAhcGFyc2VyLnN0cmljdCkpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9XQUtBXG4gICAgICAgICAgICBwYXJzZXIuc3RhcnRUYWdQb3NpdGlvbiA9IHBhcnNlci5wb3NpdGlvblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWlzV2hpdGVzcGFjZShjKSAmJiAoIXBhcnNlci5zYXdSb290IHx8IHBhcnNlci5jbG9zZWRSb290KSkge1xuICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1RleHQgZGF0YSBvdXRzaWRlIG9mIHJvb3Qgbm9kZS4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICcmJykge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRfRU5USVRZXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwYXJzZXIudGV4dE5vZGUgKz0gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5TQ1JJUFQ6XG4gICAgICAgICAgLy8gb25seSBub24tc3RyaWN0XG4gICAgICAgICAgaWYgKGMgPT09ICc8Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5zY3JpcHQgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5TQ1JJUFRfRU5ESU5HOlxuICAgICAgICAgIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0xPU0VfVEFHXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5zY3JpcHQgKz0gJzwnICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuT1BFTl9XQUtBOlxuICAgICAgICAgIC8vIGVpdGhlciBhIC8sID8sICEsIG9yIHRleHQgaXMgY29taW5nIG5leHQuXG4gICAgICAgICAgaWYgKGMgPT09ICchJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TR01MX0RFQ0xcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIGl0Li4uXG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hdGNoKG5hbWVTdGFydCwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9UQUdcbiAgICAgICAgICAgIHBhcnNlci50YWdOYW1lID0gY1xuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNMT1NFX1RBR1xuICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlBST0NfSU5TVFxuICAgICAgICAgICAgcGFyc2VyLnByb2NJbnN0TmFtZSA9IHBhcnNlci5wcm9jSW5zdEJvZHkgPSAnJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuZW5jb2RlZCA8JylcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBzb21lIHdoaXRlc3BhY2UsIHRoZW4gYWRkIHRoYXQgaW4uXG4gICAgICAgICAgICBpZiAocGFyc2VyLnN0YXJ0VGFnUG9zaXRpb24gKyAxIDwgcGFyc2VyLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgIHZhciBwYWQgPSBwYXJzZXIucG9zaXRpb24gLSBwYXJzZXIuc3RhcnRUYWdQb3NpdGlvblxuICAgICAgICAgICAgICBjID0gbmV3IEFycmF5KHBhZCkuam9pbignICcpICsgY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLnRleHROb2RlICs9ICc8JyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5TR01MX0RFQ0w6XG4gICAgICAgICAgaWYgKChwYXJzZXIuc2dtbERlY2wgKyBjKS50b1VwcGVyQ2FzZSgpID09PSBDREFUQSkge1xuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25vcGVuY2RhdGEnKVxuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQVxuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsID0gJydcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSA9ICcnXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuc2dtbERlY2wgKyBjID09PSAnLS0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRcbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgfSBlbHNlIGlmICgocGFyc2VyLnNnbWxEZWNsICsgYykudG9VcHBlckNhc2UoKSA9PT0gRE9DVFlQRSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFXG4gICAgICAgICAgICBpZiAocGFyc2VyLmRvY3R5cGUgfHwgcGFyc2VyLnNhd1Jvb3QpIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsXG4gICAgICAgICAgICAgICAgJ0luYXBwcm9wcmlhdGVseSBsb2NhdGVkIGRvY3R5cGUgZGVjbGFyYXRpb24nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLmRvY3R5cGUgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsID0gJydcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25zZ21sZGVjbGFyYXRpb24nLCBwYXJzZXIuc2dtbERlY2wpXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1F1b3RlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNHTUxfREVDTF9RVU9URURcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlNHTUxfREVDTF9RVU9URUQ6XG4gICAgICAgICAgaWYgKGMgPT09IHBhcnNlci5xKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNHTUxfREVDTFxuICAgICAgICAgICAgcGFyc2VyLnEgPSAnJ1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgKz0gY1xuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkRPQ1RZUEU6XG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmRvY3R5cGUnLCBwYXJzZXIuZG9jdHlwZSlcbiAgICAgICAgICAgIHBhcnNlci5kb2N0eXBlID0gdHJ1ZSAvLyBqdXN0IHJlbWVtYmVyIHRoYXQgd2Ugc2F3IGl0LlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuZG9jdHlwZSArPSBjXG4gICAgICAgICAgICBpZiAoYyA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9EVERcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNRdW90ZShjKSkge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVfUVVPVEVEXG4gICAgICAgICAgICAgIHBhcnNlci5xID0gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5ET0NUWVBFX1FVT1RFRDpcbiAgICAgICAgICBwYXJzZXIuZG9jdHlwZSArPSBjXG4gICAgICAgICAgaWYgKGMgPT09IHBhcnNlci5xKSB7XG4gICAgICAgICAgICBwYXJzZXIucSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRV9EVEQ6XG4gICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgIGlmIChjID09PSAnXScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNRdW90ZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFX0RURF9RVU9URURcbiAgICAgICAgICAgIHBhcnNlci5xID0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5ET0NUWVBFX0RURF9RVU9URUQ6XG4gICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgIGlmIChjID09PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFX0RURFxuICAgICAgICAgICAgcGFyc2VyLnEgPSAnJ1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DT01NRU5UOlxuICAgICAgICAgIGlmIChjID09PSAnLScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ09NTUVOVF9FTkRJTkdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DT01NRU5UX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJy0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRfRU5ERURcbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ID0gdGV4dG9wdHMocGFyc2VyLm9wdCwgcGFyc2VyLmNvbW1lbnQpXG4gICAgICAgICAgICBpZiAocGFyc2VyLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25jb21tZW50JywgcGFyc2VyLmNvbW1lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCA9ICcnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ICs9ICctJyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ09NTUVOVFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DT01NRU5UX0VOREVEOlxuICAgICAgICAgIGlmIChjICE9PSAnPicpIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnTWFsZm9ybWVkIGNvbW1lbnQnKVxuICAgICAgICAgICAgLy8gYWxsb3cgPCEtLSBibGFoIC0tIGJsb28gLS0+IGluIG5vbi1zdHJpY3QgbW9kZSxcbiAgICAgICAgICAgIC8vIHdoaWNoIGlzIGEgY29tbWVudCBvZiBcIiBibGFoIC0tIGJsb28gXCJcbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ICs9ICctLScgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNEQVRBOlxuICAgICAgICAgIGlmIChjID09PSAnXScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0RBVEFfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNEQVRBX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNEQVRBX0VORElOR18yXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSArPSAnXScgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNEQVRBXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNEQVRBX0VORElOR18yOlxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZXIuY2RhdGEpIHtcbiAgICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25jZGF0YScsIHBhcnNlci5jZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2xvc2VjZGF0YScpXG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnXScpIHtcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSArPSAnXSdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmNkYXRhICs9ICddXScgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNEQVRBXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlBST0NfSU5TVDpcbiAgICAgICAgICBpZiAoYyA9PT0gJz8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlBST0NfSU5TVF9FTkRJTkdcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RfQk9EWVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3ROYW1lICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuUFJPQ19JTlNUX0JPRFk6XG4gICAgICAgICAgaWYgKCFwYXJzZXIucHJvY0luc3RCb2R5ICYmIGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdEJvZHkgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5QUk9DX0lOU1RfRU5ESU5HOlxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29ucHJvY2Vzc2luZ2luc3RydWN0aW9uJywge1xuICAgICAgICAgICAgICBuYW1lOiBwYXJzZXIucHJvY0luc3ROYW1lLFxuICAgICAgICAgICAgICBib2R5OiBwYXJzZXIucHJvY0luc3RCb2R5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcGFyc2VyLnByb2NJbnN0TmFtZSA9IHBhcnNlci5wcm9jSW5zdEJvZHkgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdEJvZHkgKz0gJz8nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RfQk9EWVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5PUEVOX1RBRzpcbiAgICAgICAgICBpZiAoaXNNYXRjaChuYW1lQm9keSwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci50YWdOYW1lICs9IGNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3VGFnKHBhcnNlcilcbiAgICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgICAgb3BlblRhZyhwYXJzZXIpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fVEFHX1NMQVNIXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoIWlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBjaGFyYWN0ZXIgaW4gdGFnIG5hbWUnKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLk9QRU5fVEFHX1NMQVNIOlxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyLCB0cnVlKVxuICAgICAgICAgICAgY2xvc2VUYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ZvcndhcmQtc2xhc2ggaW4gb3BlbmluZyB0YWcgbm90IGZvbGxvd2VkIGJ5ID4nKVxuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCOlxuICAgICAgICAgIC8vIGhhdmVuJ3QgcmVhZCB0aGUgYXR0cmlidXRlIG5hbWUgeWV0LlxuICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fVEFHX1NMQVNIXG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hdGNoKG5hbWVTdGFydCwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gY1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX05BTUVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lJylcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX05BTUU6XG4gICAgICAgICAgaWYgKGMgPT09ICc9Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdBdHRyaWJ1dGUgd2l0aG91dCB2YWx1ZScpXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgPSBwYXJzZXIuYXR0cmliTmFtZVxuICAgICAgICAgICAgYXR0cmliKHBhcnNlcilcbiAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FX1NBV19XSElURVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lQm9keSwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lICs9IGNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lJylcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX05BTUVfU0FXX1dISVRFOlxuICAgICAgICAgIGlmIChjID09PSAnPScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnQXR0cmlidXRlIHdpdGhvdXQgdmFsdWUnKVxuICAgICAgICAgICAgcGFyc2VyLnRhZy5hdHRyaWJ1dGVzW3BhcnNlci5hdHRyaWJOYW1lXSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25hdHRyaWJ1dGUnLCB7XG4gICAgICAgICAgICAgIG5hbWU6IHBhcnNlci5hdHRyaWJOYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTogJydcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSA9ICcnXG4gICAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01hdGNoKG5hbWVTdGFydCwgYykpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBjXG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX05BTUVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRTpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNRdW90ZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnEgPSBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9RVU9URURcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUnKVxuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfVU5RVU9URURcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSA9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX1FVT1RFRDpcbiAgICAgICAgICBpZiAoYyAhPT0gcGFyc2VyLnEpIHtcbiAgICAgICAgICAgIGlmIChjID09PSAnJicpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfRU5USVRZX1FcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSArPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBhdHRyaWIocGFyc2VyKVxuICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9DTE9TRURcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfQ0xPU0VEOlxuICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fVEFHX1NMQVNIXG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hdGNoKG5hbWVTdGFydCwgYykpIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnTm8gd2hpdGVzcGFjZSBiZXR3ZWVuIGF0dHJpYnV0ZXMnKVxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBjXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfTkFNRVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWUnKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfVU5RVU9URUQ6XG4gICAgICAgICAgaWYgKCFpc0F0dHJpYkVuZChjKSkge1xuICAgICAgICAgICAgaWYgKGMgPT09ICcmJykge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfVVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlICs9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGF0dHJpYihwYXJzZXIpXG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgb3BlblRhZyhwYXJzZXIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNMT1NFX1RBRzpcbiAgICAgICAgICBpZiAoIXBhcnNlci50YWdOYW1lKSB7XG4gICAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vdE1hdGNoKG5hbWVTdGFydCwgYykpIHtcbiAgICAgICAgICAgICAgaWYgKHBhcnNlci5zY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8LycgKyBjXG4gICAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgdGFnbmFtZSBpbiBjbG9zaW5nIHRhZy4nKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwYXJzZXIudGFnTmFtZSA9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgY2xvc2VUYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lQm9keSwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci50YWdOYW1lICs9IGNcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlci5zY3JpcHQpIHtcbiAgICAgICAgICAgIHBhcnNlci5zY3JpcHQgKz0gJzwvJyArIHBhcnNlci50YWdOYW1lXG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgdGFnbmFtZSBpbiBjbG9zaW5nIHRhZycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNMT1NFX1RBR19TQVdfV0hJVEVcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ0xPU0VfVEFHX1NBV19XSElURTpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBjbG9zZVRhZyhwYXJzZXIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNsb3NpbmcgdGFnJylcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuVEVYVF9FTlRJVFk6XG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfRU5USVRZX1E6XG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfRU5USVRZX1U6XG4gICAgICAgICAgdmFyIHJldHVyblN0YXRlXG4gICAgICAgICAgdmFyIGJ1ZmZlclxuICAgICAgICAgIHN3aXRjaCAocGFyc2VyLnN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIFMuVEVYVF9FTlRJVFk6XG4gICAgICAgICAgICAgIHJldHVyblN0YXRlID0gUy5URVhUXG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICd0ZXh0Tm9kZSdcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfUTpcbiAgICAgICAgICAgICAgcmV0dXJuU3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9RVU9URURcbiAgICAgICAgICAgICAgYnVmZmVyID0gJ2F0dHJpYlZhbHVlJ1xuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9VOlxuICAgICAgICAgICAgICByZXR1cm5TdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX1VOUVVPVEVEXG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICdhdHRyaWJWYWx1ZSdcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYyA9PT0gJzsnKSB7XG4gICAgICAgICAgICBwYXJzZXJbYnVmZmVyXSArPSBwYXJzZUVudGl0eShwYXJzZXIpXG4gICAgICAgICAgICBwYXJzZXIuZW50aXR5ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IHJldHVyblN0YXRlXG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hdGNoKHBhcnNlci5lbnRpdHkubGVuZ3RoID8gZW50aXR5Qm9keSA6IGVudGl0eVN0YXJ0LCBjKSkge1xuICAgICAgICAgICAgcGFyc2VyLmVudGl0eSArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBjaGFyYWN0ZXIgaW4gZW50aXR5IG5hbWUnKVxuICAgICAgICAgICAgcGFyc2VyW2J1ZmZlcl0gKz0gJyYnICsgcGFyc2VyLmVudGl0eSArIGNcbiAgICAgICAgICAgIHBhcnNlci5lbnRpdHkgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gcmV0dXJuU3RhdGVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHBhcnNlciwgJ1Vua25vd24gc3RhdGU6ICcgKyBwYXJzZXIuc3RhdGUpXG4gICAgICB9XG4gICAgfSAvLyB3aGlsZVxuXG4gICAgaWYgKHBhcnNlci5wb3NpdGlvbiA+PSBwYXJzZXIuYnVmZmVyQ2hlY2tQb3NpdGlvbikge1xuICAgICAgY2hlY2tCdWZmZXJMZW5ndGgocGFyc2VyKVxuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyXG4gIH1cblxuICAvKiEgaHR0cDovL210aHMuYmUvZnJvbWNvZGVwb2ludCB2MC4xLjAgYnkgQG1hdGhpYXMgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFTdHJpbmcuZnJvbUNvZGVQb2ludCkge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZVxuICAgICAgdmFyIGZsb29yID0gTWF0aC5mbG9vclxuICAgICAgdmFyIGZyb21Db2RlUG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNQVhfU0laRSA9IDB4NDAwMFxuICAgICAgICB2YXIgY29kZVVuaXRzID0gW11cbiAgICAgICAgdmFyIGhpZ2hTdXJyb2dhdGVcbiAgICAgICAgdmFyIGxvd1N1cnJvZ2F0ZVxuICAgICAgICB2YXIgaW5kZXggPSAtMVxuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSAnJ1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBOdW1iZXIoYXJndW1lbnRzW2luZGV4XSlcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNGaW5pdGUoY29kZVBvaW50KSB8fCAvLyBgTmFOYCwgYCtJbmZpbml0eWAsIG9yIGAtSW5maW5pdHlgXG4gICAgICAgICAgICBjb2RlUG9pbnQgPCAwIHx8IC8vIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludFxuICAgICAgICAgICAgY29kZVBvaW50ID4gMHgxMEZGRkYgfHwgLy8gbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50XG4gICAgICAgICAgICBmbG9vcihjb2RlUG9pbnQpICE9PSBjb2RlUG9pbnQgLy8gbm90IGFuIGludGVnZXJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludDogJyArIGNvZGVQb2ludClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweEZGRkYpIHsgLy8gQk1QIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGNvZGVQb2ludClcbiAgICAgICAgICB9IGVsc2UgeyAvLyBBc3RyYWwgY29kZSBwb2ludDsgc3BsaXQgaW4gc3Vycm9nYXRlIGhhbHZlc1xuICAgICAgICAgICAgLy8gaHR0cDovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcbiAgICAgICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gKGNvZGVQb2ludCA+PiAxMCkgKyAweEQ4MDBcbiAgICAgICAgICAgIGxvd1N1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgJSAweDQwMCkgKyAweERDMDBcbiAgICAgICAgICAgIGNvZGVVbml0cy5wdXNoKGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluZGV4ICsgMSA9PT0gbGVuZ3RoIHx8IGNvZGVVbml0cy5sZW5ndGggPiBNQVhfU0laRSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZS5hcHBseShudWxsLCBjb2RlVW5pdHMpXG4gICAgICAgICAgICBjb2RlVW5pdHMubGVuZ3RoID0gMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyaW5nLCAnZnJvbUNvZGVQb2ludCcsIHtcbiAgICAgICAgICB2YWx1ZTogZnJvbUNvZGVQb2ludCxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFN0cmluZy5mcm9tQ29kZVBvaW50ID0gZnJvbUNvZGVQb2ludFxuICAgICAgfVxuICAgIH0oKSlcbiAgfVxufSkodHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gdGhpcy5zYXggPSB7fSA6IGV4cG9ydHMpXG4iLCJzZWxmLmdsb2JhbCA9IGdsb2JhbDsiLCJcbnZhciBpbmhlcml0cztcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJyl7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGluaGVyaXRzO1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbmV4cG9ydCBkZWZhdWx0IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy9UeXBlcyBvZiBlbGVtZW50cyBmb3VuZCBpbiB0aGUgRE9NXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0VGV4dDogXCJ0ZXh0XCIsIC8vVGV4dFxuXHREaXJlY3RpdmU6IFwiZGlyZWN0aXZlXCIsIC8vPD8gLi4uID8+XG5cdENvbW1lbnQ6IFwiY29tbWVudFwiLCAvLzwhLS0gLi4uIC0tPlxuXHRTY3JpcHQ6IFwic2NyaXB0XCIsIC8vPHNjcmlwdD4gdGFnc1xuXHRTdHlsZTogXCJzdHlsZVwiLCAvLzxzdHlsZT4gdGFnc1xuXHRUYWc6IFwidGFnXCIsIC8vQW55IHRhZ1xuXHRDREFUQTogXCJjZGF0YVwiLCAvLzwhW0NEQVRBWyAuLi4gXV0+XG5cdERvY3R5cGU6IFwiZG9jdHlwZVwiLFxuXG5cdGlzVGFnOiBmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gZWxlbS50eXBlID09PSBcInRhZ1wiIHx8IGVsZW0udHlwZSA9PT0gXCJzY3JpcHRcIiB8fCBlbGVtLnR5cGUgPT09IFwic3R5bGVcIjtcblx0fVxufTtcbiIsIi8vVHlwZXMgb2YgZWxlbWVudHMgZm91bmQgaW4gdGhlIERPTVxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdFRleHQ6IFwidGV4dFwiLCAvL1RleHRcblx0RGlyZWN0aXZlOiBcImRpcmVjdGl2ZVwiLCAvLzw/IC4uLiA/PlxuXHRDb21tZW50OiBcImNvbW1lbnRcIiwgLy88IS0tIC4uLiAtLT5cblx0U2NyaXB0OiBcInNjcmlwdFwiLCAvLzxzY3JpcHQ+IHRhZ3Ncblx0U3R5bGU6IFwic3R5bGVcIiwgLy88c3R5bGU+IHRhZ3Ncblx0VGFnOiBcInRhZ1wiLCAvL0FueSB0YWdcblx0Q0RBVEE6IFwiY2RhdGFcIiwgLy88IVtDREFUQVsgLi4uIF1dPlxuXG5cdGlzVGFnOiBmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gZWxlbS50eXBlID09PSBcInRhZ1wiIHx8IGVsZW0udHlwZSA9PT0gXCJzY3JpcHRcIiB8fCBlbGVtLnR5cGUgPT09IFwic3R5bGVcIjtcblx0fVxufTsiLCJ2YXIgZGVjb2RlTWFwID0gcmVxdWlyZShcIi4uL21hcHMvZGVjb2RlLmpzb25cIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVjb2RlQ29kZVBvaW50O1xuXG4vLyBtb2RpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL2hlL2Jsb2IvbWFzdGVyL3NyYy9oZS5qcyNMOTQtTDExOVxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50KGNvZGVQb2ludCl7XG5cblx0aWYoKGNvZGVQb2ludCA+PSAweEQ4MDAgJiYgY29kZVBvaW50IDw9IDB4REZGRikgfHwgY29kZVBvaW50ID4gMHgxMEZGRkYpe1xuXHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0fVxuXG5cdGlmKGNvZGVQb2ludCBpbiBkZWNvZGVNYXApe1xuXHRcdGNvZGVQb2ludCA9IGRlY29kZU1hcFtjb2RlUG9pbnRdO1xuXHR9XG5cblx0dmFyIG91dHB1dCA9IFwiXCI7XG5cblx0aWYoY29kZVBvaW50ID4gMHhGRkZGKXtcblx0XHRjb2RlUG9pbnQgLT0gMHgxMDAwMDtcblx0XHRvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGO1xuXHR9XG5cblx0b3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcblx0cmV0dXJuIG91dHB1dDtcbn1cbiIsInZhciBlbmNvZGUgPSByZXF1aXJlKFwiLi9saWIvZW5jb2RlLmpzXCIpLFxuICAgIGRlY29kZSA9IHJlcXVpcmUoXCIuL2xpYi9kZWNvZGUuanNcIik7XG5cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24oZGF0YSwgbGV2ZWwpe1xuXHRyZXR1cm4gKCFsZXZlbCB8fCBsZXZlbCA8PSAwID8gZGVjb2RlLlhNTCA6IGRlY29kZS5IVE1MKShkYXRhKTtcbn07XG5cbmV4cG9ydHMuZGVjb2RlU3RyaWN0ID0gZnVuY3Rpb24oZGF0YSwgbGV2ZWwpe1xuXHRyZXR1cm4gKCFsZXZlbCB8fCBsZXZlbCA8PSAwID8gZGVjb2RlLlhNTCA6IGRlY29kZS5IVE1MU3RyaWN0KShkYXRhKTtcbn07XG5cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24oZGF0YSwgbGV2ZWwpe1xuXHRyZXR1cm4gKCFsZXZlbCB8fCBsZXZlbCA8PSAwID8gZW5jb2RlLlhNTCA6IGVuY29kZS5IVE1MKShkYXRhKTtcbn07XG5cbmV4cG9ydHMuZW5jb2RlWE1MID0gZW5jb2RlLlhNTDtcblxuZXhwb3J0cy5lbmNvZGVIVE1MNCA9XG5leHBvcnRzLmVuY29kZUhUTUw1ID1cbmV4cG9ydHMuZW5jb2RlSFRNTCAgPSBlbmNvZGUuSFRNTDtcblxuZXhwb3J0cy5kZWNvZGVYTUwgPVxuZXhwb3J0cy5kZWNvZGVYTUxTdHJpY3QgPSBkZWNvZGUuWE1MO1xuXG5leHBvcnRzLmRlY29kZUhUTUw0ID1cbmV4cG9ydHMuZGVjb2RlSFRNTDUgPVxuZXhwb3J0cy5kZWNvZGVIVE1MID0gZGVjb2RlLkhUTUw7XG5cbmV4cG9ydHMuZGVjb2RlSFRNTDRTdHJpY3QgPVxuZXhwb3J0cy5kZWNvZGVIVE1MNVN0cmljdCA9XG5leHBvcnRzLmRlY29kZUhUTUxTdHJpY3QgPSBkZWNvZGUuSFRNTFN0cmljdDtcblxuZXhwb3J0cy5lc2NhcGUgPSBlbmNvZGUuZXNjYXBlO1xuIiwiLypcbiAgTW9kdWxlIGRlcGVuZGVuY2llc1xuKi9cbnZhciBFbGVtZW50VHlwZSA9IHJlcXVpcmUoJ2RvbWVsZW1lbnR0eXBlJyk7XG52YXIgZW50aXRpZXMgPSByZXF1aXJlKCdlbnRpdGllcycpO1xuXG4vKlxuICBCb29sZWFuIEF0dHJpYnV0ZXNcbiovXG52YXIgYm9vbGVhbkF0dHJpYnV0ZXMgPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgYWxsb3dmdWxsc2NyZWVuOiB0cnVlLFxuICBhc3luYzogdHJ1ZSxcbiAgYXV0b2ZvY3VzOiB0cnVlLFxuICBhdXRvcGxheTogdHJ1ZSxcbiAgY2hlY2tlZDogdHJ1ZSxcbiAgY29udHJvbHM6IHRydWUsXG4gIGRlZmF1bHQ6IHRydWUsXG4gIGRlZmVyOiB0cnVlLFxuICBkaXNhYmxlZDogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICBpc21hcDogdHJ1ZSxcbiAgbG9vcDogdHJ1ZSxcbiAgbXVsdGlwbGU6IHRydWUsXG4gIG11dGVkOiB0cnVlLFxuICBvcGVuOiB0cnVlLFxuICByZWFkb25seTogdHJ1ZSxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHJldmVyc2VkOiB0cnVlLFxuICBzY29wZWQ6IHRydWUsXG4gIHNlYW1sZXNzOiB0cnVlLFxuICBzZWxlY3RlZDogdHJ1ZSxcbiAgdHlwZW11c3RtYXRjaDogdHJ1ZVxufTtcblxudmFyIHVuZW5jb2RlZEVsZW1lbnRzID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIHN0eWxlOiB0cnVlLFxuICBzY3JpcHQ6IHRydWUsXG4gIHhtcDogdHJ1ZSxcbiAgaWZyYW1lOiB0cnVlLFxuICBub2VtYmVkOiB0cnVlLFxuICBub2ZyYW1lczogdHJ1ZSxcbiAgcGxhaW50ZXh0OiB0cnVlLFxuICBub3NjcmlwdDogdHJ1ZVxufTtcblxuLypcbiAgRm9ybWF0IGF0dHJpYnV0ZXNcbiovXG5mdW5jdGlvbiBmb3JtYXRBdHRycyhhdHRyaWJ1dGVzLCBvcHRzKSB7XG4gIGlmICghYXR0cmlidXRlcykgcmV0dXJuO1xuXG4gIHZhciBvdXRwdXQgPSAnJyxcbiAgICAgIHZhbHVlO1xuXG4gIC8vIExvb3AgdGhyb3VnaCB0aGUgYXR0cmlidXRlc1xuICBmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgIHZhbHVlID0gYXR0cmlidXRlc1trZXldO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIG91dHB1dCArPSAnICc7XG4gICAgfVxuXG4gICAgaWYgKCF2YWx1ZSAmJiBib29sZWFuQXR0cmlidXRlc1trZXldKSB7XG4gICAgICBvdXRwdXQgKz0ga2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQgKz0ga2V5ICsgJz1cIicgKyAob3B0cy5kZWNvZGVFbnRpdGllcyA/IGVudGl0aWVzLmVuY29kZVhNTCh2YWx1ZSkgOiB2YWx1ZSkgKyAnXCInO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qXG4gIFNlbGYtZW5jbG9zaW5nIHRhZ3MgKHN0b2xlbiBmcm9tIG5vZGUtaHRtbHBhcnNlcilcbiovXG52YXIgc2luZ2xlVGFnID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJhc2Vmb250OiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBjb21tYW5kOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgZnJhbWU6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBpc2luZGV4OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUsXG59O1xuXG5cbnZhciByZW5kZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbSwgb3B0cykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZG9tKSAmJiAhZG9tLmNoZWVyaW8pIGRvbSA9IFtkb21dO1xuICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICB2YXIgb3V0cHV0ID0gJyc7XG5cbiAgZm9yKHZhciBpID0gMDsgaSA8IGRvbS5sZW5ndGg7IGkrKyl7XG4gICAgdmFyIGVsZW0gPSBkb21baV07XG5cbiAgICBpZiAoZWxlbS50eXBlID09PSAncm9vdCcpXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyKGVsZW0uY2hpbGRyZW4sIG9wdHMpO1xuICAgIGVsc2UgaWYgKEVsZW1lbnRUeXBlLmlzVGFnKGVsZW0pKVxuICAgICAgb3V0cHV0ICs9IHJlbmRlclRhZyhlbGVtLCBvcHRzKTtcbiAgICBlbHNlIGlmIChlbGVtLnR5cGUgPT09IEVsZW1lbnRUeXBlLkRpcmVjdGl2ZSlcbiAgICAgIG91dHB1dCArPSByZW5kZXJEaXJlY3RpdmUoZWxlbSk7XG4gICAgZWxzZSBpZiAoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5Db21tZW50KVxuICAgICAgb3V0cHV0ICs9IHJlbmRlckNvbW1lbnQoZWxlbSk7XG4gICAgZWxzZSBpZiAoZWxlbS50eXBlID09PSBFbGVtZW50VHlwZS5DREFUQSlcbiAgICAgIG91dHB1dCArPSByZW5kZXJDZGF0YShlbGVtKTtcbiAgICBlbHNlXG4gICAgICBvdXRwdXQgKz0gcmVuZGVyVGV4dChlbGVtLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5mdW5jdGlvbiByZW5kZXJUYWcoZWxlbSwgb3B0cykge1xuICAvLyBIYW5kbGUgU1ZHXG4gIGlmIChlbGVtLm5hbWUgPT09IFwic3ZnXCIpIG9wdHMgPSB7ZGVjb2RlRW50aXRpZXM6IG9wdHMuZGVjb2RlRW50aXRpZXMsIHhtbE1vZGU6IHRydWV9O1xuXG4gIHZhciB0YWcgPSAnPCcgKyBlbGVtLm5hbWUsXG4gICAgICBhdHRyaWJzID0gZm9ybWF0QXR0cnMoZWxlbS5hdHRyaWJzLCBvcHRzKTtcblxuICBpZiAoYXR0cmlicykge1xuICAgIHRhZyArPSAnICcgKyBhdHRyaWJzO1xuICB9XG5cbiAgaWYgKFxuICAgIG9wdHMueG1sTW9kZVxuICAgICYmICghZWxlbS5jaGlsZHJlbiB8fCBlbGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMClcbiAgKSB7XG4gICAgdGFnICs9ICcvPic7XG4gIH0gZWxzZSB7XG4gICAgdGFnICs9ICc+JztcbiAgICBpZiAoZWxlbS5jaGlsZHJlbikge1xuICAgICAgdGFnICs9IHJlbmRlcihlbGVtLmNoaWxkcmVuLCBvcHRzKTtcbiAgICB9XG5cbiAgICBpZiAoIXNpbmdsZVRhZ1tlbGVtLm5hbWVdIHx8IG9wdHMueG1sTW9kZSkge1xuICAgICAgdGFnICs9ICc8LycgKyBlbGVtLm5hbWUgKyAnPic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhZztcbn1cblxuZnVuY3Rpb24gcmVuZGVyRGlyZWN0aXZlKGVsZW0pIHtcbiAgcmV0dXJuICc8JyArIGVsZW0uZGF0YSArICc+Jztcbn1cblxuZnVuY3Rpb24gcmVuZGVyVGV4dChlbGVtLCBvcHRzKSB7XG4gIHZhciBkYXRhID0gZWxlbS5kYXRhIHx8ICcnO1xuXG4gIC8vIGlmIGVudGl0aWVzIHdlcmVuJ3QgZGVjb2RlZCwgbm8gbmVlZCB0byBlbmNvZGUgdGhlbSBiYWNrXG4gIGlmIChvcHRzLmRlY29kZUVudGl0aWVzICYmICEoZWxlbS5wYXJlbnQgJiYgZWxlbS5wYXJlbnQubmFtZSBpbiB1bmVuY29kZWRFbGVtZW50cykpIHtcbiAgICBkYXRhID0gZW50aXRpZXMuZW5jb2RlWE1MKGRhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNkYXRhKGVsZW0pIHtcbiAgcmV0dXJuICc8IVtDREFUQVsnICsgZWxlbS5jaGlsZHJlblswXS5kYXRhICsgJ11dPic7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckNvbW1lbnQoZWxlbSkge1xuICByZXR1cm4gJzwhLS0nICsgZWxlbS5kYXRhICsgJy0tPic7XG59XG4iLCJ2YXIgZ2V0Q2hpbGRyZW4gPSBleHBvcnRzLmdldENoaWxkcmVuID0gZnVuY3Rpb24oZWxlbSl7XG5cdHJldHVybiBlbGVtLmNoaWxkcmVuO1xufTtcblxudmFyIGdldFBhcmVudCA9IGV4cG9ydHMuZ2V0UGFyZW50ID0gZnVuY3Rpb24oZWxlbSl7XG5cdHJldHVybiBlbGVtLnBhcmVudDtcbn07XG5cbmV4cG9ydHMuZ2V0U2libGluZ3MgPSBmdW5jdGlvbihlbGVtKXtcblx0dmFyIHBhcmVudCA9IGdldFBhcmVudChlbGVtKTtcblx0cmV0dXJuIHBhcmVudCA/IGdldENoaWxkcmVuKHBhcmVudCkgOiBbZWxlbV07XG59O1xuXG5leHBvcnRzLmdldEF0dHJpYnV0ZVZhbHVlID0gZnVuY3Rpb24oZWxlbSwgbmFtZSl7XG5cdHJldHVybiBlbGVtLmF0dHJpYnMgJiYgZWxlbS5hdHRyaWJzW25hbWVdO1xufTtcblxuZXhwb3J0cy5oYXNBdHRyaWIgPSBmdW5jdGlvbihlbGVtLCBuYW1lKXtcblx0cmV0dXJuICEhZWxlbS5hdHRyaWJzICYmIGhhc093blByb3BlcnR5LmNhbGwoZWxlbS5hdHRyaWJzLCBuYW1lKTtcbn07XG5cbmV4cG9ydHMuZ2V0TmFtZSA9IGZ1bmN0aW9uKGVsZW0pe1xuXHRyZXR1cm4gZWxlbS5uYW1lO1xufTtcbiIsImV4cG9ydHMucmVtb3ZlRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW0pe1xuXHRpZihlbGVtLnByZXYpIGVsZW0ucHJldi5uZXh0ID0gZWxlbS5uZXh0O1xuXHRpZihlbGVtLm5leHQpIGVsZW0ubmV4dC5wcmV2ID0gZWxlbS5wcmV2O1xuXG5cdGlmKGVsZW0ucGFyZW50KXtcblx0XHR2YXIgY2hpbGRzID0gZWxlbS5wYXJlbnQuY2hpbGRyZW47XG5cdFx0Y2hpbGRzLnNwbGljZShjaGlsZHMubGFzdEluZGV4T2YoZWxlbSksIDEpO1xuXHR9XG59O1xuXG5leHBvcnRzLnJlcGxhY2VFbGVtZW50ID0gZnVuY3Rpb24oZWxlbSwgcmVwbGFjZW1lbnQpe1xuXHR2YXIgcHJldiA9IHJlcGxhY2VtZW50LnByZXYgPSBlbGVtLnByZXY7XG5cdGlmKHByZXYpe1xuXHRcdHByZXYubmV4dCA9IHJlcGxhY2VtZW50O1xuXHR9XG5cblx0dmFyIG5leHQgPSByZXBsYWNlbWVudC5uZXh0ID0gZWxlbS5uZXh0O1xuXHRpZihuZXh0KXtcblx0XHRuZXh0LnByZXYgPSByZXBsYWNlbWVudDtcblx0fVxuXG5cdHZhciBwYXJlbnQgPSByZXBsYWNlbWVudC5wYXJlbnQgPSBlbGVtLnBhcmVudDtcblx0aWYocGFyZW50KXtcblx0XHR2YXIgY2hpbGRzID0gcGFyZW50LmNoaWxkcmVuO1xuXHRcdGNoaWxkc1tjaGlsZHMubGFzdEluZGV4T2YoZWxlbSldID0gcmVwbGFjZW1lbnQ7XG5cdH1cbn07XG5cbmV4cG9ydHMuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihlbGVtLCBjaGlsZCl7XG5cdGNoaWxkLnBhcmVudCA9IGVsZW07XG5cblx0aWYoZWxlbS5jaGlsZHJlbi5wdXNoKGNoaWxkKSAhPT0gMSl7XG5cdFx0dmFyIHNpYmxpbmcgPSBlbGVtLmNoaWxkcmVuW2VsZW0uY2hpbGRyZW4ubGVuZ3RoIC0gMl07XG5cdFx0c2libGluZy5uZXh0ID0gY2hpbGQ7XG5cdFx0Y2hpbGQucHJldiA9IHNpYmxpbmc7XG5cdFx0Y2hpbGQubmV4dCA9IG51bGw7XG5cdH1cbn07XG5cbmV4cG9ydHMuYXBwZW5kID0gZnVuY3Rpb24oZWxlbSwgbmV4dCl7XG5cdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudCxcblx0XHRjdXJyTmV4dCA9IGVsZW0ubmV4dDtcblxuXHRuZXh0Lm5leHQgPSBjdXJyTmV4dDtcblx0bmV4dC5wcmV2ID0gZWxlbTtcblx0ZWxlbS5uZXh0ID0gbmV4dDtcblx0bmV4dC5wYXJlbnQgPSBwYXJlbnQ7XG5cblx0aWYoY3Vyck5leHQpe1xuXHRcdGN1cnJOZXh0LnByZXYgPSBuZXh0O1xuXHRcdGlmKHBhcmVudCl7XG5cdFx0XHR2YXIgY2hpbGRzID0gcGFyZW50LmNoaWxkcmVuO1xuXHRcdFx0Y2hpbGRzLnNwbGljZShjaGlsZHMubGFzdEluZGV4T2YoY3Vyck5leHQpLCAwLCBuZXh0KTtcblx0XHR9XG5cdH0gZWxzZSBpZihwYXJlbnQpe1xuXHRcdHBhcmVudC5jaGlsZHJlbi5wdXNoKG5leHQpO1xuXHR9XG59O1xuXG5leHBvcnRzLnByZXBlbmQgPSBmdW5jdGlvbihlbGVtLCBwcmV2KXtcblx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50O1xuXHRpZihwYXJlbnQpe1xuXHRcdHZhciBjaGlsZHMgPSBwYXJlbnQuY2hpbGRyZW47XG5cdFx0Y2hpbGRzLnNwbGljZShjaGlsZHMubGFzdEluZGV4T2YoZWxlbSksIDAsIHByZXYpO1xuXHR9XG5cblx0aWYoZWxlbS5wcmV2KXtcblx0XHRlbGVtLnByZXYubmV4dCA9IHByZXY7XG5cdH1cblx0XG5cdHByZXYucGFyZW50ID0gcGFyZW50O1xuXHRwcmV2LnByZXYgPSBlbGVtLnByZXY7XG5cdHByZXYubmV4dCA9IGVsZW07XG5cdGVsZW0ucHJldiA9IHByZXY7XG59O1xuXG5cbiIsInZhciBFbGVtZW50VHlwZSA9IHJlcXVpcmUoXCJkb21lbGVtZW50dHlwZVwiKTtcbnZhciBpc1RhZyA9IGV4cG9ydHMuaXNUYWcgPSBFbGVtZW50VHlwZS5pc1RhZztcblxuZXhwb3J0cy50ZXN0RWxlbWVudCA9IGZ1bmN0aW9uKG9wdGlvbnMsIGVsZW1lbnQpe1xuXHRmb3IodmFyIGtleSBpbiBvcHRpb25zKXtcblx0XHRpZighb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKTtcblx0XHRlbHNlIGlmKGtleSA9PT0gXCJ0YWdfbmFtZVwiKXtcblx0XHRcdGlmKCFpc1RhZyhlbGVtZW50KSB8fCAhb3B0aW9ucy50YWdfbmFtZShlbGVtZW50Lm5hbWUpKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZihrZXkgPT09IFwidGFnX3R5cGVcIil7XG5cdFx0XHRpZighb3B0aW9ucy50YWdfdHlwZShlbGVtZW50LnR5cGUpKSByZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIGlmKGtleSA9PT0gXCJ0YWdfY29udGFpbnNcIil7XG5cdFx0XHRpZihpc1RhZyhlbGVtZW50KSB8fCAhb3B0aW9ucy50YWdfY29udGFpbnMoZWxlbWVudC5kYXRhKSl7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYoIWVsZW1lbnQuYXR0cmlicyB8fCAhb3B0aW9uc1trZXldKGVsZW1lbnQuYXR0cmlic1trZXldKSl7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufTtcblxudmFyIENoZWNrcyA9IHtcblx0dGFnX25hbWU6IGZ1bmN0aW9uKG5hbWUpe1xuXHRcdGlmKHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gaXNUYWcoZWxlbSkgJiYgbmFtZShlbGVtLm5hbWUpOyB9O1xuXHRcdH0gZWxzZSBpZihuYW1lID09PSBcIipcIil7XG5cdFx0XHRyZXR1cm4gaXNUYWc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIGlzVGFnKGVsZW0pICYmIGVsZW0ubmFtZSA9PT0gbmFtZTsgfTtcblx0XHR9XG5cdH0sXG5cdHRhZ190eXBlOiBmdW5jdGlvbih0eXBlKXtcblx0XHRpZih0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIHR5cGUoZWxlbS50eXBlKTsgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gZWxlbS50eXBlID09PSB0eXBlOyB9O1xuXHRcdH1cblx0fSxcblx0dGFnX2NvbnRhaW5zOiBmdW5jdGlvbihkYXRhKXtcblx0XHRpZih0eXBlb2YgZGF0YSA9PT0gXCJmdW5jdGlvblwiKXtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuICFpc1RhZyhlbGVtKSAmJiBkYXRhKGVsZW0uZGF0YSk7IH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuICFpc1RhZyhlbGVtKSAmJiBlbGVtLmRhdGEgPT09IGRhdGE7IH07XG5cdFx0fVxuXHR9XG59O1xuXG5mdW5jdGlvbiBnZXRBdHRyaWJDaGVjayhhdHRyaWIsIHZhbHVlKXtcblx0aWYodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpe1xuXHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXsgcmV0dXJuIGVsZW0uYXR0cmlicyAmJiB2YWx1ZShlbGVtLmF0dHJpYnNbYXR0cmliXSk7IH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGVsZW0peyByZXR1cm4gZWxlbS5hdHRyaWJzICYmIGVsZW0uYXR0cmlic1thdHRyaWJdID09PSB2YWx1ZTsgfTtcblx0fVxufVxuXG5mdW5jdGlvbiBjb21iaW5lRnVuY3MoYSwgYil7XG5cdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRyZXR1cm4gYShlbGVtKSB8fCBiKGVsZW0pO1xuXHR9O1xufVxuXG5leHBvcnRzLmdldEVsZW1lbnRzID0gZnVuY3Rpb24ob3B0aW9ucywgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHR2YXIgZnVuY3MgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5tYXAoZnVuY3Rpb24oa2V5KXtcblx0XHR2YXIgdmFsdWUgPSBvcHRpb25zW2tleV07XG5cdFx0cmV0dXJuIGtleSBpbiBDaGVja3MgPyBDaGVja3Nba2V5XSh2YWx1ZSkgOiBnZXRBdHRyaWJDaGVjayhrZXksIHZhbHVlKTtcblx0fSk7XG5cblx0cmV0dXJuIGZ1bmNzLmxlbmd0aCA9PT0gMCA/IFtdIDogdGhpcy5maWx0ZXIoXG5cdFx0ZnVuY3MucmVkdWNlKGNvbWJpbmVGdW5jcyksXG5cdFx0ZWxlbWVudCwgcmVjdXJzZSwgbGltaXRcblx0KTtcbn07XG5cbmV4cG9ydHMuZ2V0RWxlbWVudEJ5SWQgPSBmdW5jdGlvbihpZCwgZWxlbWVudCwgcmVjdXJzZSl7XG5cdGlmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQpKSBlbGVtZW50ID0gW2VsZW1lbnRdO1xuXHRyZXR1cm4gdGhpcy5maW5kT25lKGdldEF0dHJpYkNoZWNrKFwiaWRcIiwgaWQpLCBlbGVtZW50LCByZWN1cnNlICE9PSBmYWxzZSk7XG59O1xuXG5leHBvcnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gZnVuY3Rpb24obmFtZSwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHRyZXR1cm4gdGhpcy5maWx0ZXIoQ2hlY2tzLnRhZ19uYW1lKG5hbWUpLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCk7XG59O1xuXG5leHBvcnRzLmdldEVsZW1lbnRzQnlUYWdUeXBlID0gZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcmVjdXJzZSwgbGltaXQpe1xuXHRyZXR1cm4gdGhpcy5maWx0ZXIoQ2hlY2tzLnRhZ190eXBlKHR5cGUpLCBlbGVtZW50LCByZWN1cnNlLCBsaW1pdCk7XG59O1xuIiwiLy8gcmVtb3ZlU3Vic2V0c1xuLy8gR2l2ZW4gYW4gYXJyYXkgb2Ygbm9kZXMsIHJlbW92ZSBhbnkgbWVtYmVyIHRoYXQgaXMgY29udGFpbmVkIGJ5IGFub3RoZXIuXG5leHBvcnRzLnJlbW92ZVN1YnNldHMgPSBmdW5jdGlvbihub2Rlcykge1xuXHR2YXIgaWR4ID0gbm9kZXMubGVuZ3RoLCBub2RlLCBhbmNlc3RvciwgcmVwbGFjZTtcblxuXHQvLyBDaGVjayBpZiBlYWNoIG5vZGUgKG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzKSBpcyBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGVcblx0Ly8gYXJyYXkuXG5cdHdoaWxlICgtLWlkeCA+IC0xKSB7XG5cdFx0bm9kZSA9IGFuY2VzdG9yID0gbm9kZXNbaWR4XTtcblxuXHRcdC8vIFRlbXBvcmFyaWx5IHJlbW92ZSB0aGUgbm9kZSB1bmRlciBjb25zaWRlcmF0aW9uXG5cdFx0bm9kZXNbaWR4XSA9IG51bGw7XG5cdFx0cmVwbGFjZSA9IHRydWU7XG5cblx0XHR3aGlsZSAoYW5jZXN0b3IpIHtcblx0XHRcdGlmIChub2Rlcy5pbmRleE9mKGFuY2VzdG9yKSA+IC0xKSB7XG5cdFx0XHRcdHJlcGxhY2UgPSBmYWxzZTtcblx0XHRcdFx0bm9kZXMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0YW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIG5vZGUgaGFzIGJlZW4gZm91bmQgdG8gYmUgdW5pcXVlLCByZS1pbnNlcnQgaXQuXG5cdFx0aWYgKHJlcGxhY2UpIHtcblx0XHRcdG5vZGVzW2lkeF0gPSBub2RlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBub2Rlcztcbn07XG5cbi8vIFNvdXJjZTogaHR0cDovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ub2RlLWNvbXBhcmVkb2N1bWVudHBvc2l0aW9uXG52YXIgUE9TSVRJT04gPSB7XG5cdERJU0NPTk5FQ1RFRDogMSxcblx0UFJFQ0VESU5HOiAyLFxuXHRGT0xMT1dJTkc6IDQsXG5cdENPTlRBSU5TOiA4LFxuXHRDT05UQUlORURfQlk6IDE2XG59O1xuXG4vLyBDb21wYXJlIHRoZSBwb3NpdGlvbiBvZiBvbmUgbm9kZSBhZ2FpbnN0IGFub3RoZXIgbm9kZSBpbiBhbnkgb3RoZXIgZG9jdW1lbnQuXG4vLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYml0bWFzayB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuLy9cbi8vIGRvY3VtZW50IG9yZGVyOlxuLy8gPiBUaGVyZSBpcyBhbiBvcmRlcmluZywgZG9jdW1lbnQgb3JkZXIsIGRlZmluZWQgb24gYWxsIHRoZSBub2RlcyBpbiB0aGVcbi8vID4gZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGVcbi8vID4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggbm9kZSBvY2N1cnMgaW4gdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGVcbi8vID4gZG9jdW1lbnQgYWZ0ZXIgZXhwYW5zaW9uIG9mIGdlbmVyYWwgZW50aXRpZXMuIFRodXMsIHRoZSBkb2N1bWVudCBlbGVtZW50XG4vLyA+IG5vZGUgd2lsbCBiZSB0aGUgZmlyc3Qgbm9kZS4gRWxlbWVudCBub2RlcyBvY2N1ciBiZWZvcmUgdGhlaXIgY2hpbGRyZW4uXG4vLyA+IFRodXMsIGRvY3VtZW50IG9yZGVyIG9yZGVycyBlbGVtZW50IG5vZGVzIGluIG9yZGVyIG9mIHRoZSBvY2N1cnJlbmNlIG9mXG4vLyA+IHRoZWlyIHN0YXJ0LXRhZyBpbiB0aGUgWE1MIChhZnRlciBleHBhbnNpb24gb2YgZW50aXRpZXMpLiBUaGUgYXR0cmlidXRlXG4vLyA+IG5vZGVzIG9mIGFuIGVsZW1lbnQgb2NjdXIgYWZ0ZXIgdGhlIGVsZW1lbnQgYW5kIGJlZm9yZSBpdHMgY2hpbGRyZW4uIFRoZVxuLy8gPiByZWxhdGl2ZSBvcmRlciBvZiBhdHRyaWJ1dGUgbm9kZXMgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50Li9cbi8vIFNvdXJjZTpcbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUNvcmUvZ2xvc3NhcnkuaHRtbCNkdC1kb2N1bWVudC1vcmRlclxuLy9cbi8vIEBhcmd1bWVudCB7Tm9kZX0gbm9kYUEgVGhlIGZpcnN0IG5vZGUgdG8gdXNlIGluIHRoZSBjb21wYXJpc29uXG4vLyBAYXJndW1lbnQge05vZGV9IG5vZGVCIFRoZSBzZWNvbmQgbm9kZSB0byB1c2UgaW4gdGhlIGNvbXBhcmlzb25cbi8vXG4vLyBAcmV0dXJuIHtOdW1iZXJ9IEEgYml0bWFzayBkZXNjcmliaW5nIHRoZSBpbnB1dCBub2RlcycgcmVsYXRpdmUgcG9zaXRpb24uXG4vLyAgICAgICAgIFNlZSBodHRwOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLW5vZGUtY29tcGFyZWRvY3VtZW50cG9zaXRpb24gZm9yXG4vLyAgICAgICAgIGEgZGVzY3JpcHRpb24gb2YgdGhlc2UgdmFsdWVzLlxudmFyIGNvbXBhcmVQb3MgPSBleHBvcnRzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID0gZnVuY3Rpb24obm9kZUEsIG5vZGVCKSB7XG5cdHZhciBhUGFyZW50cyA9IFtdO1xuXHR2YXIgYlBhcmVudHMgPSBbXTtcblx0dmFyIGN1cnJlbnQsIHNoYXJlZFBhcmVudCwgc2libGluZ3MsIGFTaWJsaW5nLCBiU2libGluZywgaWR4O1xuXG5cdGlmIChub2RlQSA9PT0gbm9kZUIpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGN1cnJlbnQgPSBub2RlQTtcblx0d2hpbGUgKGN1cnJlbnQpIHtcblx0XHRhUGFyZW50cy51bnNoaWZ0KGN1cnJlbnQpO1xuXHRcdGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcblx0fVxuXHRjdXJyZW50ID0gbm9kZUI7XG5cdHdoaWxlIChjdXJyZW50KSB7XG5cdFx0YlBhcmVudHMudW5zaGlmdChjdXJyZW50KTtcblx0XHRjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG5cdH1cblxuXHRpZHggPSAwO1xuXHR3aGlsZSAoYVBhcmVudHNbaWR4XSA9PT0gYlBhcmVudHNbaWR4XSkge1xuXHRcdGlkeCsrO1xuXHR9XG5cblx0aWYgKGlkeCA9PT0gMCkge1xuXHRcdHJldHVybiBQT1NJVElPTi5ESVNDT05ORUNURUQ7XG5cdH1cblxuXHRzaGFyZWRQYXJlbnQgPSBhUGFyZW50c1tpZHggLSAxXTtcblx0c2libGluZ3MgPSBzaGFyZWRQYXJlbnQuY2hpbGRyZW47XG5cdGFTaWJsaW5nID0gYVBhcmVudHNbaWR4XTtcblx0YlNpYmxpbmcgPSBiUGFyZW50c1tpZHhdO1xuXG5cdGlmIChzaWJsaW5ncy5pbmRleE9mKGFTaWJsaW5nKSA+IHNpYmxpbmdzLmluZGV4T2YoYlNpYmxpbmcpKSB7XG5cdFx0aWYgKHNoYXJlZFBhcmVudCA9PT0gbm9kZUIpIHtcblx0XHRcdHJldHVybiBQT1NJVElPTi5GT0xMT1dJTkcgfCBQT1NJVElPTi5DT05UQUlORURfQlk7XG5cdFx0fVxuXHRcdHJldHVybiBQT1NJVElPTi5GT0xMT1dJTkc7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKHNoYXJlZFBhcmVudCA9PT0gbm9kZUEpIHtcblx0XHRcdHJldHVybiBQT1NJVElPTi5QUkVDRURJTkcgfCBQT1NJVElPTi5DT05UQUlOUztcblx0XHR9XG5cdFx0cmV0dXJuIFBPU0lUSU9OLlBSRUNFRElORztcblx0fVxufTtcblxuLy8gU29ydCBhbiBhcnJheSBvZiBub2RlcyBiYXNlZCBvbiB0aGVpciByZWxhdGl2ZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYW5kXG4vLyByZW1vdmUgYW55IGR1cGxpY2F0ZSBub2Rlcy4gSWYgdGhlIGFycmF5IGNvbnRhaW5zIG5vZGVzIHRoYXQgZG8gbm90IGJlbG9uZ1xuLy8gdG8gdGhlIHNhbWUgZG9jdW1lbnQsIHNvcnQgb3JkZXIgaXMgdW5zcGVjaWZpZWQuXG4vL1xuLy8gQGFyZ3VtZW50IHtBcnJheX0gbm9kZXMgQXJyYXkgb2YgRE9NIG5vZGVzXG4vL1xuLy8gQHJldHVybnMge0FycmF5fSBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBub2Rlcywgc29ydGVkIGluIGRvY3VtZW50IG9yZGVyXG5leHBvcnRzLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbihub2Rlcykge1xuXHR2YXIgaWR4ID0gbm9kZXMubGVuZ3RoLCBub2RlLCBwb3NpdGlvbjtcblxuXHRub2RlcyA9IG5vZGVzLnNsaWNlKCk7XG5cblx0d2hpbGUgKC0taWR4ID4gLTEpIHtcblx0XHRub2RlID0gbm9kZXNbaWR4XTtcblx0XHRwb3NpdGlvbiA9IG5vZGVzLmluZGV4T2Yobm9kZSk7XG5cdFx0aWYgKHBvc2l0aW9uID4gLTEgJiYgcG9zaXRpb24gPCBpZHgpIHtcblx0XHRcdG5vZGVzLnNwbGljZShpZHgsIDEpO1xuXHRcdH1cblx0fVxuXHRub2Rlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcblx0XHR2YXIgcmVsYXRpdmUgPSBjb21wYXJlUG9zKGEsIGIpO1xuXHRcdGlmIChyZWxhdGl2ZSAmIFBPU0lUSU9OLlBSRUNFRElORykge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRpdmUgJiBQT1NJVElPTi5GT0xMT1dJTkcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSk7XG5cblx0cmV0dXJuIG5vZGVzO1xufTtcbiIsInZhciBEb21VdGlscyA9IG1vZHVsZS5leHBvcnRzO1xuXG5bXG5cdHJlcXVpcmUoXCIuL2xpYi9zdHJpbmdpZnlcIiksXG5cdHJlcXVpcmUoXCIuL2xpYi90cmF2ZXJzYWxcIiksXG5cdHJlcXVpcmUoXCIuL2xpYi9tYW5pcHVsYXRpb25cIiksXG5cdHJlcXVpcmUoXCIuL2xpYi9xdWVyeWluZ1wiKSxcblx0cmVxdWlyZShcIi4vbGliL2xlZ2FjeVwiKSxcblx0cmVxdWlyZShcIi4vbGliL2hlbHBlcnNcIilcbl0uZm9yRWFjaChmdW5jdGlvbihleHQpe1xuXHRPYmplY3Qua2V5cyhleHQpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcblx0XHREb21VdGlsc1trZXldID0gZXh0W2tleV0uYmluZChEb21VdGlscyk7XG5cdH0pO1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcblx0dHJ1ZUZ1bmM6IGZ1bmN0aW9uIHRydWVGdW5jKCl7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdGZhbHNlRnVuYzogZnVuY3Rpb24gZmFsc2VGdW5jKCl7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59OyIsInZhciBmYWxzZUZ1bmMgPSByZXF1aXJlKFwiYm9vbGJhc2VcIikuZmFsc2VGdW5jO1xuXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS9zbGV2aXRoYW4vWFJlZ0V4cC9ibG9iL21hc3Rlci9zcmMveHJlZ2V4cC5qcyNMNDY5XG52YXIgcmVDaGFycyA9IC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZztcblxuZnVuY3Rpb24gZmFjdG9yeShhZGFwdGVyKXtcblx0Lypcblx0XHRhdHRyaWJ1dGUgc2VsZWN0b3JzXG5cdCovXG5cdHZhciBhdHRyaWJ1dGVSdWxlcyA9IHtcblx0XHRfX3Byb3RvX186IG51bGwsXG5cdFx0ZXF1YWxzOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVxdWFsc0lDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVxdWFscyhlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aHlwaGVuOiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlLFxuXHRcdFx0XHRsZW4gPSB2YWx1ZS5sZW5ndGg7XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gaHlwaGVuSUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiZcblx0XHRcdFx0XHRcdFx0KGF0dHIubGVuZ3RoID09PSBsZW4gfHwgYXR0ci5jaGFyQXQobGVuKSA9PT0gXCItXCIpICYmXG5cdFx0XHRcdFx0XHRcdGF0dHIuc3Vic3RyKDAsIGxlbikudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiZcblx0XHRcdFx0XHRcdFx0bmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGh5cGhlbihlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmXG5cdFx0XHRcdFx0XHRhdHRyLnN1YnN0cigwLCBsZW4pID09PSB2YWx1ZSAmJlxuXHRcdFx0XHRcdFx0KGF0dHIubGVuZ3RoID09PSBsZW4gfHwgYXR0ci5jaGFyQXQobGVuKSA9PT0gXCItXCIpICYmXG5cdFx0XHRcdFx0XHRuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGVsZW1lbnQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZTtcblxuXHRcdFx0aWYoL1xccy8udGVzdCh2YWx1ZSkpe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVDaGFycywgXCJcXFxcJCZcIik7XG5cblx0XHRcdHZhciBwYXR0ZXJuID0gXCIoPzpefFxcXFxzKVwiICsgdmFsdWUgKyBcIig/OiR8XFxcXHMpXCIsXG5cdFx0XHRcdGZsYWdzID0gZGF0YS5pZ25vcmVDYXNlID8gXCJpXCIgOiBcIlwiLFxuXHRcdFx0XHRyZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZWxlbWVudChlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIHJlZ2V4LnRlc3QoYXR0cikgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRleGlzdHM6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgPSBkYXRhLm5hbWU7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZXhpc3RzKGVsZW0pe1xuXHRcdFx0XHRyZXR1cm4gYWRhcHRlci5oYXNBdHRyaWIoZWxlbSwgbmFtZSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRzdGFydDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZSxcblx0XHRcdFx0bGVuID0gdmFsdWUubGVuZ3RoO1xuXG5cdFx0XHRpZihsZW4gPT09IDApe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHN0YXJ0SUMoZWxlbSl7XG5cdFx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRcdHJldHVybiBhdHRyICE9IG51bGwgJiYgYXR0ci5zdWJzdHIoMCwgbGVuKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gc3RhcnQoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLnN1YnN0cigwLCBsZW4pID09PSB2YWx1ZSAmJiBuZXh0KGVsZW0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSAgPSBkYXRhLm5hbWUsXG5cdFx0XHRcdHZhbHVlID0gZGF0YS52YWx1ZSxcblx0XHRcdFx0bGVuICAgPSAtdmFsdWUubGVuZ3RoO1xuXG5cdFx0XHRpZihsZW4gPT09IDApe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2VGdW5jO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVuZElDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKGxlbikudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGVuZChlbGVtKXtcblx0XHRcdFx0dmFyIGF0dHIgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW0sIG5hbWUpO1xuXHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIuc3Vic3RyKGxlbikgPT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0YW55OiBmdW5jdGlvbihuZXh0LCBkYXRhKXtcblx0XHRcdHZhciBuYW1lICA9IGRhdGEubmFtZSxcblx0XHRcdFx0dmFsdWUgPSBkYXRhLnZhbHVlO1xuXG5cdFx0XHRpZih2YWx1ZSA9PT0gXCJcIil7XG5cdFx0XHRcdHJldHVybiBmYWxzZUZ1bmM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKGRhdGEuaWdub3JlQ2FzZSl7XG5cdFx0XHRcdHZhciByZWdleCA9IG5ldyBSZWdFeHAodmFsdWUucmVwbGFjZShyZUNoYXJzLCBcIlxcXFwkJlwiKSwgXCJpXCIpO1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiBhbnlJQyhlbGVtKXtcblx0XHRcdFx0XHR2YXIgYXR0ciA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiByZWdleC50ZXN0KGF0dHIpICYmIG5leHQoZWxlbSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmdW5jdGlvbiBhbnkoZWxlbSl7XG5cdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIGF0dHIgIT0gbnVsbCAmJiBhdHRyLmluZGV4T2YodmFsdWUpID49IDAgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRub3Q6IGZ1bmN0aW9uKG5leHQsIGRhdGEpe1xuXHRcdFx0dmFyIG5hbWUgID0gZGF0YS5uYW1lLFxuXHRcdFx0XHR2YWx1ZSA9IGRhdGEudmFsdWU7XG5cblx0XHRcdGlmKHZhbHVlID09PSBcIlwiKXtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdEVtcHR5KGVsZW0pe1xuXHRcdFx0XHRcdHJldHVybiAhIWFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZihkYXRhLmlnbm9yZUNhc2Upe1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdElDKGVsZW0pe1xuXHRcdFx0XHRcdHZhciBhdHRyID0gYWRhcHRlci5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtLCBuYW1lKTtcblx0XHRcdFx0XHRyZXR1cm4gYXR0ciAhPSBudWxsICYmIGF0dHIudG9Mb3dlckNhc2UoKSAhPT0gdmFsdWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIG5vdChlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbSwgbmFtZSkgIT09IHZhbHVlICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGNvbXBpbGU6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMpe1xuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCAmJiAoXG5cdFx0XHRcdGRhdGEuaWdub3JlQ2FzZSB8fCBkYXRhLmFjdGlvbiA9PT0gXCJub3RcIlxuXHRcdFx0KSkgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYXR0cmlidXRlIHNlbGVjdG9yXCIpO1xuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZVJ1bGVzW2RhdGEuYWN0aW9uXShuZXh0LCBkYXRhKTtcblx0XHR9LFxuXHRcdHJ1bGVzOiBhdHRyaWJ1dGVSdWxlc1xuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG4iLCJ2YXIgYXR0cmlidXRlRmFjdG9yeSA9IHJlcXVpcmUoXCIuL2F0dHJpYnV0ZXMuanNcIik7XG5cbmZ1bmN0aW9uIGdlbmVyYWxGYWN0b3J5KGFkYXB0ZXIsIFBzZXVkb3Mpe1xuXHQvKlxuXHRcdGFsbCBhdmFpbGFibGUgcnVsZXNcblx0Ki9cblx0cmV0dXJuIHtcblx0XHRfX3Byb3RvX186IG51bGwsXG5cblx0XHRhdHRyaWJ1dGU6IGF0dHJpYnV0ZUZhY3RvcnkoYWRhcHRlcikuY29tcGlsZSxcblx0XHRwc2V1ZG86IFBzZXVkb3MuY29tcGlsZSxcblxuXHRcdC8vdGFnc1xuXHRcdHRhZzogZnVuY3Rpb24obmV4dCwgZGF0YSl7XG5cdFx0XHR2YXIgbmFtZSA9IGRhdGEubmFtZTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiB0YWcoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldE5hbWUoZWxlbSkgPT09IG5hbWUgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8vdHJhdmVyc2FsXG5cdFx0ZGVzY2VuZGFudDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZGVzY2VuZGFudChlbGVtKXtcblxuXHRcdFx0XHR2YXIgZm91bmQgPSBmYWxzZTtcblxuXHRcdFx0XHR3aGlsZSghZm91bmQgJiYgKGVsZW0gPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKSkpe1xuXHRcdFx0XHRcdGZvdW5kID0gbmV4dChlbGVtKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmb3VuZDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRfZmxleGlibGVEZXNjZW5kYW50OiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdC8vIEluY2x1ZGUgZWxlbWVudCBpdHNlbGYsIG9ubHkgdXNlZCB3aGlsZSBxdWVyeWluZyBhbiBhcnJheVxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGRlc2NlbmRhbnQoZWxlbSl7XG5cblx0XHRcdFx0dmFyIGZvdW5kID0gbmV4dChlbGVtKTtcblxuXHRcdFx0XHR3aGlsZSghZm91bmQgJiYgKGVsZW0gPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKSkpe1xuXHRcdFx0XHRcdGZvdW5kID0gbmV4dChlbGVtKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmb3VuZDtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRwYXJlbnQ6IGZ1bmN0aW9uKG5leHQsIGRhdGEsIG9wdGlvbnMpe1xuXHRcdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLnN0cmljdCkgdGhyb3cgbmV3IEVycm9yKFwiUGFyZW50IHNlbGVjdG9yIGlzbid0IHBhcnQgb2YgQ1NTM1wiKTtcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcmVudChlbGVtKXtcblx0XHRcdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbSkuc29tZSh0ZXN0KTtcblx0XHRcdH07XG5cblx0XHRcdGZ1bmN0aW9uIHRlc3QoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmlzVGFnKGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjaGlsZDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gY2hpbGQoZWxlbSl7XG5cdFx0XHRcdHZhciBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtKTtcblx0XHRcdFx0cmV0dXJuICEhcGFyZW50ICYmIG5leHQocGFyZW50KTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRzaWJsaW5nOiBmdW5jdGlvbihuZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBzaWJsaW5nKGVsZW0pe1xuXHRcdFx0XHR2YXIgc2libGluZ3MgPSBhZGFwdGVyLmdldFNpYmxpbmdzKGVsZW0pO1xuXG5cdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0XHRcdFx0aWYoYWRhcHRlci5pc1RhZyhzaWJsaW5nc1tpXSkpe1xuXHRcdFx0XHRcdFx0aWYoc2libGluZ3NbaV0gPT09IGVsZW0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0aWYobmV4dChzaWJsaW5nc1tpXSkpIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRhZGphY2VudDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gYWRqYWNlbnQoZWxlbSl7XG5cdFx0XHRcdHZhciBzaWJsaW5ncyA9IGFkYXB0ZXIuZ2V0U2libGluZ3MoZWxlbSksXG5cdFx0XHRcdFx0bGFzdEVsZW1lbnQ7XG5cblx0XHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRpZihhZGFwdGVyLmlzVGFnKHNpYmxpbmdzW2ldKSl7XG5cdFx0XHRcdFx0XHRpZihzaWJsaW5nc1tpXSA9PT0gZWxlbSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudCA9IHNpYmxpbmdzW2ldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAhIWxhc3RFbGVtZW50ICYmIG5leHQobGFzdEVsZW1lbnQpO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHVuaXZlcnNhbDogZnVuY3Rpb24obmV4dCl7XG5cdFx0XHRyZXR1cm4gbmV4dDtcblx0XHR9XG5cdH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhbEZhY3Rvcnk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuXG4vL2ZvbGxvd2luZyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jbnRoLWNoaWxkLXBzZXVkb1xuXG4vL1sgWyctJ3wnKyddPyBJTlRFR0VSPyB7Tn0gWyBTKiBbJy0nfCcrJ10gUyogSU5URUdFUiBdP1xudmFyIHJlX250aEVsZW1lbnQgPSAvXihbK1xcLV0/XFxkKm4pP1xccyooPzooWytcXC1dPylcXHMqKFxcZCspKT8kLztcblxuLypcblx0cGFyc2VzIGEgbnRoLWNoZWNrIGZvcm11bGEsIHJldHVybnMgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnNcbiovXG5mdW5jdGlvbiBwYXJzZShmb3JtdWxhKXtcblx0Zm9ybXVsYSA9IGZvcm11bGEudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cblx0aWYoZm9ybXVsYSA9PT0gXCJldmVuXCIpe1xuXHRcdHJldHVybiBbMiwgMF07XG5cdH0gZWxzZSBpZihmb3JtdWxhID09PSBcIm9kZFwiKXtcblx0XHRyZXR1cm4gWzIsIDFdO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBwYXJzZWQgPSBmb3JtdWxhLm1hdGNoKHJlX250aEVsZW1lbnQpO1xuXG5cdFx0aWYoIXBhcnNlZCl7XG5cdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJuLXRoIHJ1bGUgY291bGRuJ3QgYmUgcGFyc2VkICgnXCIgKyBmb3JtdWxhICsgXCInKVwiKTtcblx0XHR9XG5cblx0XHR2YXIgYTtcblxuXHRcdGlmKHBhcnNlZFsxXSl7XG5cdFx0XHRhID0gcGFyc2VJbnQocGFyc2VkWzFdLCAxMCk7XG5cdFx0XHRpZihpc05hTihhKSl7XG5cdFx0XHRcdGlmKHBhcnNlZFsxXS5jaGFyQXQoMCkgPT09IFwiLVwiKSBhID0gLTE7XG5cdFx0XHRcdGVsc2UgYSA9IDE7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGEgPSAwO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdGEsXG5cdFx0XHRwYXJzZWRbM10gPyBwYXJzZUludCgocGFyc2VkWzJdIHx8IFwiXCIpICsgcGFyc2VkWzNdLCAxMCkgOiAwXG5cdFx0XTtcblx0fVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBjb21waWxlO1xuXG52YXIgQmFzZUZ1bmNzID0gcmVxdWlyZShcImJvb2xiYXNlXCIpLFxuICAgIHRydWVGdW5jICA9IEJhc2VGdW5jcy50cnVlRnVuYyxcbiAgICBmYWxzZUZ1bmMgPSBCYXNlRnVuY3MuZmFsc2VGdW5jO1xuXG4vKlxuXHRyZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYW4gZWxlbWVudHMgaW5kZXggbWF0Y2hlcyB0aGUgZ2l2ZW4gcnVsZVxuXHRoaWdobHkgb3B0aW1pemVkIHRvIHJldHVybiB0aGUgZmFzdGVzdCBzb2x1dGlvblxuKi9cbmZ1bmN0aW9uIGNvbXBpbGUocGFyc2VkKXtcblx0dmFyIGEgPSBwYXJzZWRbMF0sXG5cdCAgICBiID0gcGFyc2VkWzFdIC0gMTtcblxuXHQvL3doZW4gYiA8PSAwLCBhKm4gd29uJ3QgYmUgcG9zc2libGUgZm9yIGFueSBtYXRjaGVzIHdoZW4gYSA8IDBcblx0Ly9iZXNpZGVzLCB0aGUgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgbm8gZWxlbWVudCBpcyBtYXRjaGVkIHdoZW4gYSBhbmQgYiBhcmUgMFxuXHRpZihiIDwgMCAmJiBhIDw9IDApIHJldHVybiBmYWxzZUZ1bmM7XG5cblx0Ly93aGVuIGEgaXMgaW4gdGhlIHJhbmdlIC0xLi4xLCBpdCBtYXRjaGVzIGFueSBlbGVtZW50IChzbyBvbmx5IGIgaXMgY2hlY2tlZClcblx0aWYoYSA9PT0tMSkgcmV0dXJuIGZ1bmN0aW9uKHBvcyl7IHJldHVybiBwb3MgPD0gYjsgfTtcblx0aWYoYSA9PT0gMCkgcmV0dXJuIGZ1bmN0aW9uKHBvcyl7IHJldHVybiBwb3MgPT09IGI7IH07XG5cdC8vd2hlbiBiIDw9IDAgYW5kIGEgPT09IDEsIHRoZXkgbWF0Y2ggYW55IGVsZW1lbnRcblx0aWYoYSA9PT0gMSkgcmV0dXJuIGIgPCAwID8gdHJ1ZUZ1bmMgOiBmdW5jdGlvbihwb3MpeyByZXR1cm4gcG9zID49IGI7IH07XG5cblx0Ly93aGVuIGEgPiAwLCBtb2R1bG8gY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYSBtYXRjaFxuXHR2YXIgYk1vZCA9IGIgJSBhO1xuXHRpZihiTW9kIDwgMCkgYk1vZCArPSBhO1xuXG5cdGlmKGEgPiAxKXtcblx0XHRyZXR1cm4gZnVuY3Rpb24ocG9zKXtcblx0XHRcdHJldHVybiBwb3MgPj0gYiAmJiBwb3MgJSBhID09PSBiTW9kO1xuXHRcdH07XG5cdH1cblxuXHRhICo9IC0xOyAvL21ha2UgYGFgIHBvc2l0aXZlXG5cblx0cmV0dXJuIGZ1bmN0aW9uKHBvcyl7XG5cdFx0cmV0dXJuIHBvcyA8PSBiICYmIHBvcyAlIGEgPT09IGJNb2Q7XG5cdH07XG59IiwidmFyIHBhcnNlID0gcmVxdWlyZShcIi4vcGFyc2UuanNcIiksXG4gICAgY29tcGlsZSA9IHJlcXVpcmUoXCIuL2NvbXBpbGUuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbnRoQ2hlY2soZm9ybXVsYSl7XG5cdHJldHVybiBjb21waWxlKHBhcnNlKGZvcm11bGEpKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5tb2R1bGUuZXhwb3J0cy5jb21waWxlID0gY29tcGlsZTsiLCIvKlxuXHRjb21waWxlcyBhIHNlbGVjdG9yIHRvIGFuIGV4ZWN1dGFibGUgZnVuY3Rpb25cbiovXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZUZhY3Rvcnk7XG5cbnZhciBwYXJzZSAgICAgICAgICA9IHJlcXVpcmUoXCJjc3Mtd2hhdFwiKSxcblx0QmFzZUZ1bmNzICAgICAgPSByZXF1aXJlKFwiYm9vbGJhc2VcIiksXG5cdHNvcnRSdWxlcyAgICAgID0gcmVxdWlyZShcIi4vc29ydC5qc1wiKSxcblx0cHJvY2VkdXJlICAgICAgPSByZXF1aXJlKFwiLi9wcm9jZWR1cmUuanNvblwiKSxcblx0cnVsZXNGYWN0b3J5ICAgPSByZXF1aXJlKFwiLi9nZW5lcmFsLmpzXCIpLFxuXHRwc2V1ZG9zRmFjdG9yeSA9IHJlcXVpcmUoXCIuL3BzZXVkb3MuanNcIiksXG5cdHRydWVGdW5jICAgICAgID0gQmFzZUZ1bmNzLnRydWVGdW5jLFxuXHRmYWxzZUZ1bmMgICAgICA9IEJhc2VGdW5jcy5mYWxzZUZ1bmM7XG5cbmZ1bmN0aW9uIGNvbXBpbGVGYWN0b3J5KGFkYXB0ZXIpe1xuXHR2YXIgUHNldWRvcyAgICAgPSBwc2V1ZG9zRmFjdG9yeShhZGFwdGVyKSxcblx0XHRmaWx0ZXJzICAgICA9IFBzZXVkb3MuZmlsdGVycyxcblx0XHRSdWxlcyBcdFx0XHQ9IHJ1bGVzRmFjdG9yeShhZGFwdGVyLCBQc2V1ZG9zKTtcblxuXHRmdW5jdGlvbiBjb21waWxlKHNlbGVjdG9yLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHR2YXIgbmV4dCA9IGNvbXBpbGVVbnNhZmUoc2VsZWN0b3IsIG9wdGlvbnMsIGNvbnRleHQpO1xuXHRcdHJldHVybiB3cmFwKG5leHQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JhcChuZXh0KXtcblx0XHRyZXR1cm4gZnVuY3Rpb24gYmFzZShlbGVtKXtcblx0XHRcdHJldHVybiBhZGFwdGVyLmlzVGFnKGVsZW0pICYmIG5leHQoZWxlbSk7XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXBpbGVVbnNhZmUoc2VsZWN0b3IsIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHZhciB0b2tlbiA9IHBhcnNlKHNlbGVjdG9yLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gY29tcGlsZVRva2VuKHRva2VuLCBvcHRpb25zLCBjb250ZXh0KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluY2x1ZGVzU2NvcGVQc2V1ZG8odCl7XG5cdFx0cmV0dXJuIHQudHlwZSA9PT0gXCJwc2V1ZG9cIiAmJiAoXG5cdFx0XHR0Lm5hbWUgPT09IFwic2NvcGVcIiB8fCAoXG5cdFx0XHRcdEFycmF5LmlzQXJyYXkodC5kYXRhKSAmJlxuXHRcdFx0XHR0LmRhdGEuc29tZShmdW5jdGlvbihkYXRhKXtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YS5zb21lKGluY2x1ZGVzU2NvcGVQc2V1ZG8pO1xuXHRcdFx0XHR9KVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cblxuXHR2YXIgREVTQ0VOREFOVF9UT0tFTiA9IHt0eXBlOiBcImRlc2NlbmRhbnRcIn0sXG5cdFx0RkxFWElCTEVfREVTQ0VOREFOVF9UT0tFTiA9IHt0eXBlOiBcIl9mbGV4aWJsZURlc2NlbmRhbnRcIn0sXG5cdFx0U0NPUEVfVE9LRU4gPSB7dHlwZTogXCJwc2V1ZG9cIiwgbmFtZTogXCJzY29wZVwifSxcblx0XHRQTEFDRUhPTERFUl9FTEVNRU5UID0ge307XG5cblx0Ly9DU1MgNCBTcGVjIChEcmFmdCk6IDMuMy4xLiBBYnNvbHV0aXppbmcgYSBTY29wZS1yZWxhdGl2ZSBTZWxlY3RvclxuXHQvL2h0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9yczQvI2Fic29sdXRpemluZ1xuXHRmdW5jdGlvbiBhYnNvbHV0aXplKHRva2VuLCBjb250ZXh0KXtcblx0XHQvL1RPRE8gYmV0dGVyIGNoZWNrIGlmIGNvbnRleHQgaXMgZG9jdW1lbnRcblx0XHR2YXIgaGFzQ29udGV4dCA9ICEhY29udGV4dCAmJiAhIWNvbnRleHQubGVuZ3RoICYmIGNvbnRleHQuZXZlcnkoZnVuY3Rpb24oZSl7XG5cdFx0XHRyZXR1cm4gZSA9PT0gUExBQ0VIT0xERVJfRUxFTUVOVCB8fCAhIWFkYXB0ZXIuZ2V0UGFyZW50KGUpO1xuXHRcdH0pO1xuXG5cblx0XHR0b2tlbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe1xuXHRcdFx0aWYodC5sZW5ndGggPiAwICYmIGlzVHJhdmVyc2FsKHRbMF0pICYmIHRbMF0udHlwZSAhPT0gXCJkZXNjZW5kYW50XCIpe1xuXHRcdFx0XHQvL2Rvbid0IHJldHVybiBpbiBlbHNlIGJyYW5jaFxuXHRcdFx0fSBlbHNlIGlmKGhhc0NvbnRleHQgJiYgIWluY2x1ZGVzU2NvcGVQc2V1ZG8odCkpe1xuXHRcdFx0XHR0LnVuc2hpZnQoREVTQ0VOREFOVF9UT0tFTik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHQudW5zaGlmdChTQ09QRV9UT0tFTik7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBjb21waWxlVG9rZW4odG9rZW4sIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHRva2VuID0gdG9rZW4uZmlsdGVyKGZ1bmN0aW9uKHQpeyByZXR1cm4gdC5sZW5ndGggPiAwOyB9KTtcblxuXHRcdHRva2VuLmZvckVhY2goc29ydFJ1bGVzKTtcblxuXHRcdHZhciBpc0FycmF5Q29udGV4dCA9IEFycmF5LmlzQXJyYXkoY29udGV4dCk7XG5cblx0XHRjb250ZXh0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0KSB8fCBjb250ZXh0O1xuXG5cdFx0aWYoY29udGV4dCAmJiAhaXNBcnJheUNvbnRleHQpIGNvbnRleHQgPSBbY29udGV4dF07XG5cblx0XHRhYnNvbHV0aXplKHRva2VuLCBjb250ZXh0KTtcblxuXHRcdHZhciBzaG91bGRUZXN0TmV4dFNpYmxpbmdzID0gZmFsc2U7XG5cblx0XHR2YXIgcXVlcnkgPSB0b2tlblxuXHRcdFx0Lm1hcChmdW5jdGlvbihydWxlcyl7XG5cdFx0XHRcdGlmKHJ1bGVzWzBdICYmIHJ1bGVzWzFdICYmIHJ1bGVzWzBdLm5hbWUgPT09IFwic2NvcGVcIil7XG5cdFx0XHRcdFx0dmFyIHJ1bGVUeXBlID0gcnVsZXNbMV0udHlwZTtcblx0XHRcdFx0XHRpZihpc0FycmF5Q29udGV4dCAmJiBydWxlVHlwZSA9PT0gXCJkZXNjZW5kYW50XCIpIHJ1bGVzWzFdID0gRkxFWElCTEVfREVTQ0VOREFOVF9UT0tFTjtcblx0XHRcdFx0XHRlbHNlIGlmKHJ1bGVUeXBlID09PSBcImFkamFjZW50XCIgfHwgcnVsZVR5cGUgPT09IFwic2libGluZ1wiKSBzaG91bGRUZXN0TmV4dFNpYmxpbmdzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY29tcGlsZVJ1bGVzKHJ1bGVzLCBvcHRpb25zLCBjb250ZXh0KTtcblx0XHRcdH0pXG5cdFx0XHQucmVkdWNlKHJlZHVjZVJ1bGVzLCBmYWxzZUZ1bmMpO1xuXG5cdFx0cXVlcnkuc2hvdWxkVGVzdE5leHRTaWJsaW5ncyA9IHNob3VsZFRlc3ROZXh0U2libGluZ3M7XG5cblx0XHRyZXR1cm4gcXVlcnk7XG5cdH1cblxuXHRmdW5jdGlvbiBpc1RyYXZlcnNhbCh0KXtcblx0XHRyZXR1cm4gcHJvY2VkdXJlW3QudHlwZV0gPCAwO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29tcGlsZVJ1bGVzKHJ1bGVzLCBvcHRpb25zLCBjb250ZXh0KXtcblx0XHRyZXR1cm4gcnVsZXMucmVkdWNlKGZ1bmN0aW9uKGZ1bmMsIHJ1bGUpe1xuXHRcdFx0aWYoZnVuYyA9PT0gZmFsc2VGdW5jKSByZXR1cm4gZnVuYztcblx0XHRcdHJldHVybiBSdWxlc1tydWxlLnR5cGVdKGZ1bmMsIHJ1bGUsIG9wdGlvbnMsIGNvbnRleHQpO1xuXHRcdH0sIG9wdGlvbnMgJiYgb3B0aW9ucy5yb290RnVuYyB8fCB0cnVlRnVuYyk7XG5cdH1cblxuXHRmdW5jdGlvbiByZWR1Y2VSdWxlcyhhLCBiKXtcblx0XHRpZihiID09PSBmYWxzZUZ1bmMgfHwgYSA9PT0gdHJ1ZUZ1bmMpe1xuXHRcdFx0cmV0dXJuIGE7XG5cdFx0fVxuXHRcdGlmKGEgPT09IGZhbHNlRnVuYyB8fCBiID09PSB0cnVlRnVuYyl7XG5cdFx0XHRyZXR1cm4gYjtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tYmluZShlbGVtKXtcblx0XHRcdHJldHVybiBhKGVsZW0pIHx8IGIoZWxlbSk7XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvbnRhaW5zVHJhdmVyc2FsKHQpe1xuXHRcdHJldHVybiB0LnNvbWUoaXNUcmF2ZXJzYWwpO1xuXHR9XG5cblx0Ly86bm90LCA6aGFzIGFuZCA6bWF0Y2hlcyBoYXZlIHRvIGNvbXBpbGUgc2VsZWN0b3JzXG5cdC8vZG9pbmcgdGhpcyBpbiBsaWIvcHNldWRvcy5qcyB3b3VsZCBsZWFkIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyxcblx0Ly9zbyB3ZSBhZGQgdGhlbSBoZXJlXG5cdGZpbHRlcnMubm90ID0gZnVuY3Rpb24obmV4dCwgdG9rZW4sIG9wdGlvbnMsIGNvbnRleHQpe1xuXHRcdHZhciBvcHRzID0ge1xuXHRcdFx0eG1sTW9kZTogISEob3B0aW9ucyAmJiBvcHRpb25zLnhtbE1vZGUpLFxuXHRcdFx0c3RyaWN0OiAhIShvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0KVxuXHRcdH07XG5cblx0XHRpZihvcHRzLnN0cmljdCl7XG5cdFx0XHRpZih0b2tlbi5sZW5ndGggPiAxIHx8IHRva2VuLnNvbWUoY29udGFpbnNUcmF2ZXJzYWwpKXtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiY29tcGxleCBzZWxlY3RvcnMgaW4gOm5vdCBhcmVuJ3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZVwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgZnVuYyA9IGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0cywgY29udGV4dCk7XG5cblx0XHRpZihmdW5jID09PSBmYWxzZUZ1bmMpIHJldHVybiBuZXh0O1xuXHRcdGlmKGZ1bmMgPT09IHRydWVGdW5jKSAgcmV0dXJuIGZhbHNlRnVuYztcblxuXHRcdHJldHVybiBmdW5jdGlvbihlbGVtKXtcblx0XHRcdHJldHVybiAhZnVuYyhlbGVtKSAmJiBuZXh0KGVsZW0pO1xuXHRcdH07XG5cdH07XG5cblx0ZmlsdGVycy5oYXMgPSBmdW5jdGlvbihuZXh0LCB0b2tlbiwgb3B0aW9ucyl7XG5cdFx0dmFyIG9wdHMgPSB7XG5cdFx0XHR4bWxNb2RlOiAhIShvcHRpb25zICYmIG9wdGlvbnMueG1sTW9kZSksXG5cdFx0XHRzdHJpY3Q6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QpXG5cdFx0fTtcblxuXHRcdC8vRklYTUU6IFVzZXMgYW4gYXJyYXkgYXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgKHNpZGUgZWZmZWN0cylcblx0XHR2YXIgY29udGV4dCA9IHRva2VuLnNvbWUoY29udGFpbnNUcmF2ZXJzYWwpID8gW1BMQUNFSE9MREVSX0VMRU1FTlRdIDogbnVsbDtcblxuXHRcdHZhciBmdW5jID0gY29tcGlsZVRva2VuKHRva2VuLCBvcHRzLCBjb250ZXh0KTtcblxuXHRcdGlmKGZ1bmMgPT09IGZhbHNlRnVuYykgcmV0dXJuIGZhbHNlRnVuYztcblx0XHRpZihmdW5jID09PSB0cnVlRnVuYyl7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oZWxlbSl7XG5cdFx0XHRcdHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pLnNvbWUoYWRhcHRlci5pc1RhZykgJiYgbmV4dChlbGVtKTtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0ZnVuYyA9IHdyYXAoZnVuYyk7XG5cblx0XHRpZihjb250ZXh0KXtcblx0XHRcdHJldHVybiBmdW5jdGlvbiBoYXMoZWxlbSl7XG5cdFx0XHRcdHJldHVybiBuZXh0KGVsZW0pICYmIChcblx0XHRcdFx0XHQoY29udGV4dFswXSA9IGVsZW0pLCBhZGFwdGVyLmV4aXN0c09uZShmdW5jLCBhZGFwdGVyLmdldENoaWxkcmVuKGVsZW0pKVxuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaGFzKGVsZW0pe1xuXHRcdFx0cmV0dXJuIG5leHQoZWxlbSkgJiYgYWRhcHRlci5leGlzdHNPbmUoZnVuYywgYWRhcHRlci5nZXRDaGlsZHJlbihlbGVtKSk7XG5cdFx0fTtcblx0fTtcblxuXHRmaWx0ZXJzLm1hdGNoZXMgPSBmdW5jdGlvbihuZXh0LCB0b2tlbiwgb3B0aW9ucywgY29udGV4dCl7XG5cdFx0dmFyIG9wdHMgPSB7XG5cdFx0XHR4bWxNb2RlOiAhIShvcHRpb25zICYmIG9wdGlvbnMueG1sTW9kZSksXG5cdFx0XHRzdHJpY3Q6ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QpLFxuXHRcdFx0cm9vdEZ1bmM6IG5leHRcblx0XHR9O1xuXG5cdFx0cmV0dXJuIGNvbXBpbGVUb2tlbih0b2tlbiwgb3B0cywgY29udGV4dCk7XG5cdH07XG5cblx0Y29tcGlsZS5jb21waWxlVG9rZW4gPSBjb21waWxlVG9rZW47XG5cdGNvbXBpbGUuY29tcGlsZVVuc2FmZSA9IGNvbXBpbGVVbnNhZmU7XG5cdGNvbXBpbGUuUHNldWRvcyA9IFBzZXVkb3M7XG5cblx0cmV0dXJuIGNvbXBpbGU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiYXNlQ3NzQWRhcHRlciA9IHJlcXVpcmUoJ2Nzcy1zZWxlY3QtYmFzZS1hZGFwdGVyJyk7XG5cbi8qKlxuICogRE9NVXRpbHMgQVBJIGZvciBTVkdPIEFTVCAodXNlZCBieSBjc3Mtc2VsZWN0KVxuICovXG52YXIgc3Znb0Nzc1NlbGVjdEFkYXB0ZXJNaW4gPSB7XG5cbiAgICAvLyBpcyB0aGUgbm9kZSBhIHRhZz9cbiAgICAvLyBpc1RhZzogKCBub2RlOk5vZGUgKSA9PiBpc1RhZzpCb29sZWFuXG4gICAgaXNUYWc6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuaXNFbGVtKCk7XG4gICAgfSxcblxuICAgIC8vIGdldCB0aGUgcGFyZW50IG9mIHRoZSBub2RlXG4gICAgLy8gZ2V0UGFyZW50OiAoIG5vZGU6Tm9kZSApID0+IHBhcmVudE5vZGU6Tm9kZVxuICAgIC8vIHJldHVybnMgbnVsbCB3aGVuIG5vIHBhcmVudCBleGlzdHNcbiAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSB8fCBudWxsO1xuICAgIH0sXG5cbiAgICAvLyBnZXQgdGhlIG5vZGUncyBjaGlsZHJlblxuICAgIC8vIGdldENoaWxkcmVuOiAoIG5vZGU6Tm9kZSApID0+IGNoaWxkcmVuOltOb2RlXVxuICAgIGdldENoaWxkcmVuOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNvbnRlbnQgfHwgW107XG4gICAgfSxcblxuICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgdGFnXG4gICAgLy8gZ2V0TmFtZTogKCBlbGVtOkVsZW1lbnROb2RlICkgPT4gdGFnTmFtZTpTdHJpbmdcbiAgICBnZXROYW1lOiBmdW5jdGlvbihlbGVtQXN0KSB7XG4gICAgICAgIHJldHVybiBlbGVtQXN0LmVsZW07XG4gICAgfSxcblxuICAgIC8vIGdldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlLCBhbmQgaXRzIGNoaWxkcmVuIGlmIGl0IGhhcyBhbnlcbiAgICAvLyBnZXRUZXh0OiAoIG5vZGU6Tm9kZSApID0+IHRleHQ6U3RyaW5nXG4gICAgLy8gcmV0dXJucyBlbXB0eSBzdHJpbmcgd2hlbiB0aGVyZSBpcyBubyB0ZXh0XG4gICAgZ2V0VGV4dDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50WzBdLnRleHQgfHwgbm9kZS5jb250ZW50WzBdLmNkYXRhIHx8ICcnO1xuICAgIH0sXG5cbiAgICAvLyBnZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIC8vIGdldEF0dHJpYnV0ZVZhbHVlOiAoIGVsZW06RWxlbWVudE5vZGUsIG5hbWU6U3RyaW5nICkgPT4gdmFsdWU6U3RyaW5nXG4gICAgLy8gcmV0dXJucyBudWxsIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZTogZnVuY3Rpb24oZWxlbSwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZWxlbS5oYXNBdHRyKG5hbWUpID8gZWxlbS5hdHRyKG5hbWUpLnZhbHVlIDogbnVsbDtcbiAgICB9XG59O1xuXG4vLyB1c2UgYmFzZSBhZGFwdGVyIGZvciBkZWZhdWx0IGltcGxlbWVudGF0aW9uXG52YXIgc3Znb0Nzc1NlbGVjdEFkYXB0ZXIgPSBiYXNlQ3NzQWRhcHRlcihzdmdvQ3NzU2VsZWN0QWRhcHRlck1pbik7XG5cbm1vZHVsZS5leHBvcnRzID0gc3Znb0Nzc1NlbGVjdEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjc3NTZWxlY3QgPSByZXF1aXJlKCdjc3Mtc2VsZWN0Jyk7XG5cbnZhciBzdmdvQ3NzU2VsZWN0QWRhcHRlciA9IHJlcXVpcmUoJy4vY3NzLXNlbGVjdC1hZGFwdGVyJyk7XG52YXIgY3NzU2VsZWN0T3B0cyA9IHtcbiAgeG1sTW9kZTogdHJ1ZSxcbiAgYWRhcHRlcjogc3Znb0Nzc1NlbGVjdEFkYXB0ZXJcbn07XG5cbnZhciBKU0FQSSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGF0YSwgcGFyZW50Tm9kZSkge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSk7XG4gICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYXJlbnROb2RlJywge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogcGFyZW50Tm9kZVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gYSBkZWVwIGNsb25lIG9mIHRoaXMgbm9kZS5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGVsZW1lbnRcbiAqL1xuSlNBUEkucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzO1xuICAgIHZhciBub2RlRGF0YSA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXMobm9kZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ2NvbnRlbnQnKSB7XG4gICAgICAgICAgICBub2RlRGF0YVtrZXldID0gbm9kZVtrZXldO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEZWVwLWNsb25lIG5vZGUgZGF0YVxuICAgIG5vZGVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShub2RlRGF0YSkpO1xuXG4gICAgLy8gcGFyZW50Tm9kZSBnZXRzIHNldCB0byBhIHByb3BlciBvYmplY3QgYnkgdGhlIHBhcmVudCBjbG9uZSxcbiAgICAvLyBidXQgaXQgbmVlZHMgdG8gYmUgdHJ1ZS9mYWxzZSBub3cgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nXG4gICAgLy8gaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgIHZhciBjbG9uZWROb2RlID0gbmV3IEpTQVBJKG5vZGVEYXRhLCAhIW5vZGUucGFyZW50Tm9kZSk7XG5cbiAgICBpZiAobm9kZS5jb250ZW50KSB7XG4gICAgICAgIGNsb25lZE5vZGUuY29udGVudCA9IG5vZGUuY29udGVudC5tYXAoZnVuY3Rpb24oY2hpbGROb2RlKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVkQ2hpbGQgPSBjaGlsZE5vZGUuY2xvbmUoKTtcbiAgICAgICAgICAgIGNsb25lZENoaWxkLnBhcmVudE5vZGUgPSBjbG9uZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIGNsb25lZENoaWxkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmVkTm9kZTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGl0ZW0gaXMgYW4gZWxlbWVudFxuICogKGFueSwgd2l0aCBhIHNwZWNpZmljIG5hbWUgb3IgaW4gYSBuYW1lcyBhcnJheSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IFtwYXJhbV0gZWxlbWVudCBuYW1lIG9yIG5hbWVzIGFycmF5c1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuSlNBUEkucHJvdG90eXBlLmlzRWxlbSA9IGZ1bmN0aW9uKHBhcmFtKSB7XG5cbiAgICBpZiAoIXBhcmFtKSByZXR1cm4gISF0aGlzLmVsZW07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbSkpIHJldHVybiAhIXRoaXMuZWxlbSAmJiAocGFyYW0uaW5kZXhPZih0aGlzLmVsZW0pID4gLTEpO1xuXG4gICAgcmV0dXJuICEhdGhpcy5lbGVtICYmIHRoaXMuZWxlbSA9PT0gcGFyYW07XG5cbn07XG5cbi8qKlxuICogUmVuYW1lcyBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmV3IGVsZW1lbnQgbmFtZVxuICogQHJldHVybiB7T2JqZWN0fSBlbGVtZW50XG4gKi9cbkpTQVBJLnByb3RvdHlwZS5yZW5hbWVFbGVtID0gZnVuY3Rpb24obmFtZSkge1xuXG4gICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLmVsZW0gPSB0aGlzLmxvY2FsID0gbmFtZTtcblxuICAgIHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBlbGVtZW50IGlzIGVtcHR5LlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbiBKU0FQSS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgcmV0dXJuICF0aGlzLmNvbnRlbnQgfHwgIXRoaXMuY29udGVudC5sZW5ndGg7XG5cbn07XG5cbi8qKlxuICogRmluZCB0aGUgY2xvc2VzdCBhbmNlc3RvciBvZiB0aGUgY3VycmVudCBlbGVtZW50LlxuICogQHBhcmFtIGVsZW1OYW1lXG4gKlxuICogQHJldHVybiB7P09iamVjdH1cbiAqL1xuIEpTQVBJLnByb3RvdHlwZS5jbG9zZXN0RWxlbSA9IGZ1bmN0aW9uKGVsZW1OYW1lKSB7XG4gICAgdmFyIGVsZW0gPSB0aGlzO1xuXG4gICAgd2hpbGUgKChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiAhZWxlbS5pc0VsZW0oZWxlbU5hbWUpKTtcblxuICAgIHJldHVybiBlbGVtO1xufTtcblxuLyoqXG4gKiBDaGFuZ2VzIGNvbnRlbnQgYnkgcmVtb3ZpbmcgZWxlbWVudHMgYW5kL29yIGFkZGluZyBuZXcgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IEluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IGNoYW5naW5nIHRoZSBjb250ZW50LlxuICogQHBhcmFtIHtOdW1iZXJ9IG4gTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBbaW5zZXJ0aW9uXSBFbGVtZW50cyB0byBhZGQgdG8gdGhlIGNvbnRlbnQuXG4gKiBAcmV0dXJuIHtBcnJheX0gUmVtb3ZlZCBlbGVtZW50cy5cbiAqL1xuIEpTQVBJLnByb3RvdHlwZS5zcGxpY2VDb250ZW50ID0gZnVuY3Rpb24oc3RhcnQsIG4sIGluc2VydGlvbikge1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gW107XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5zZXJ0aW9uKSlcbiAgICAgICAgaW5zZXJ0aW9uID0gQXJyYXkuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5zbGljZSgyKTtcblxuICAgIGluc2VydGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGlubmVyKSB7IGlubmVyLnBhcmVudE5vZGUgPSB0aGlzIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudC5zcGxpY2UuYXBwbHkodGhpcy5jb250ZW50LCBbc3RhcnQsIG5dLmNvbmNhdChpbnNlcnRpb24pKTtcblxuXG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBlbGVtZW50IGhhcyBhbiBhdHRyaWJ1dGVcbiAqIChhbnksIG9yIGJ5IG5hbWUgb3IgYnkgbmFtZSArIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gW3ZhbF0gYXR0cmlidXRlIHZhbHVlICh3aWxsIGJlIHRvU3RyaW5nKCknZWQpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG4gSlNBUEkucHJvdG90eXBlLmhhc0F0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWwpIHtcblxuICAgIGlmICghdGhpcy5hdHRycyB8fCAhT2JqZWN0LmtleXModGhpcy5hdHRycykubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiAhIXRoaXMuYXR0cnM7XG5cbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHJldHVybiAhIXRoaXMuYXR0cnNbbmFtZV0gJiYgdGhpcy5hdHRyc1tuYW1lXS52YWx1ZSA9PT0gdmFsLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gISF0aGlzLmF0dHJzW25hbWVdO1xuXG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBlbGVtZW50IGhhcyBhbiBhdHRyaWJ1dGUgYnkgbG9jYWwgbmFtZVxuICogKGFueSwgb3IgYnkgbmFtZSBvciBieSBuYW1lICsgdmFsdWUpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbG9jYWxOYW1lXSBsb2NhbCBhdHRyaWJ1dGUgbmFtZVxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfFJlZ0V4cHxGdW5jdGlvbn0gW3ZhbF0gYXR0cmlidXRlIHZhbHVlICh3aWxsIGJlIHRvU3RyaW5nKCknZWQgb3IgZXhlY3V0ZWQsIG90aGVyd2lzZSBpZ25vcmVkKVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuIEpTQVBJLnByb3RvdHlwZS5oYXNBdHRyTG9jYWwgPSBmdW5jdGlvbihsb2NhbE5hbWUsIHZhbCkge1xuXG4gICAgaWYgKCF0aGlzLmF0dHJzIHx8ICFPYmplY3Qua2V5cyh0aGlzLmF0dHJzKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuICEhdGhpcy5hdHRycztcblxuICAgIHZhciBjYWxsYmFjaztcblxuICAgIHN3aXRjaCAodmFsICE9IG51bGwgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICAgIGNhc2UgJ051bWJlcic6ICAgLy8gc2FtZSBhcyBTdHJpbmdcbiAgICAgICAgY2FzZSAnU3RyaW5nJzogICBjYWxsYmFjayA9IHN0cmluZ1ZhbHVlVGVzdDsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1JlZ0V4cCc6ICAgY2FsbGJhY2sgPSByZWdleHBWYWx1ZVRlc3Q7IGJyZWFrO1xuICAgICAgICBjYXNlICdGdW5jdGlvbic6IGNhbGxiYWNrID0gZnVuY1ZhbHVlVGVzdDsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgY2FsbGJhY2sgPSBuYW1lVGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc29tZUF0dHIoY2FsbGJhY2spO1xuXG4gICAgZnVuY3Rpb24gbmFtZVRlc3QoYXR0cikge1xuICAgICAgICByZXR1cm4gYXR0ci5sb2NhbCA9PT0gbG9jYWxOYW1lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1ZhbHVlVGVzdChhdHRyKSB7XG4gICAgICAgIHJldHVybiBhdHRyLmxvY2FsID09PSBsb2NhbE5hbWUgJiYgdmFsID09IGF0dHIudmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnZXhwVmFsdWVUZXN0KGF0dHIpIHtcbiAgICAgICAgcmV0dXJuIGF0dHIubG9jYWwgPT09IGxvY2FsTmFtZSAmJiB2YWwudGVzdChhdHRyLnZhbHVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmdW5jVmFsdWVUZXN0KGF0dHIpIHtcbiAgICAgICAgcmV0dXJuIGF0dHIubG9jYWwgPT09IGxvY2FsTmFtZSAmJiB2YWwoYXR0ci52YWx1ZSk7XG4gICAgfVxuXG59O1xuXG4vKipcbiAqIEdldCBhIHNwZWNpZmljIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnRcbiAqIChieSBuYW1lIG9yIG5hbWUgKyB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbdmFsXSBhdHRyaWJ1dGUgdmFsdWUgKHdpbGwgYmUgdG9TdHJpbmcoKSdlZClcbiAqIEByZXR1cm4ge09iamVjdHxVbmRlZmluZWR9XG4gKi9cbiBKU0FQSS5wcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWUsIHZhbCkge1xuXG4gICAgaWYgKCF0aGlzLmhhc0F0dHIoKSB8fCAhYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuaGFzQXR0cihuYW1lLCB2YWwpID8gdGhpcy5hdHRyc1tuYW1lXSA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLmF0dHJzW25hbWVdO1xuXG59O1xuXG4vKipcbiAqIEdldCBjb21wdXRlZCBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgYXR0cmlidXRlIG5hbWVcbiAqIEByZXR1cm4ge09iamVjdHxVbmRlZmluZWR9XG4gKi9cbiBKU0FQSS5wcm90b3R5cGUuY29tcHV0ZWRBdHRyID0gZnVuY3Rpb24obmFtZSwgdmFsKSB7XG4gICAgLyoganNoaW50IGVxbnVsbDogdHJ1ZSAqL1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgZWxlbSA9IHRoaXM7IGVsZW0gJiYgKCFlbGVtLmhhc0F0dHIobmFtZSkgfHwgIWVsZW0uYXR0cihuYW1lKS52YWx1ZSk7IGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpO1xuXG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBlbGVtID8gZWxlbS5oYXNBdHRyKG5hbWUsIHZhbCkgOiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGVsZW0gJiYgZWxlbS5oYXNBdHRyKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBlbGVtLmF0dHJzW25hbWVdLnZhbHVlO1xuICAgIH1cblxufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBzcGVjaWZpYyBhdHRyaWJ1dGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IG5hbWUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbdmFsXSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbiBKU0FQSS5wcm90b3R5cGUucmVtb3ZlQXR0ciA9IGZ1bmN0aW9uKG5hbWUsIHZhbCwgcmVjdXJzaXZlKSB7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSBuYW1lLmZvckVhY2godGhpcy5yZW1vdmVBdHRyLCB0aGlzKTtcblxuICAgIGlmICghdGhpcy5oYXNBdHRyKG5hbWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIXJlY3Vyc2l2ZSAmJiB2YWwgJiYgdGhpcy5hdHRyc1tuYW1lXS52YWx1ZSAhPT0gdmFsKSByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWxldGUgdGhpcy5hdHRyc1tuYW1lXTtcblxuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5hdHRycykubGVuZ3RoKSBkZWxldGUgdGhpcy5hdHRycztcblxuICAgIHJldHVybiB0cnVlO1xuXG59O1xuXG4vKipcbiAqIEFkZCBhdHRyaWJ1dGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFthdHRyPXt9XSBhdHRyaWJ1dGUgb2JqZWN0XG4gKiBAcmV0dXJuIHtPYmplY3R8Qm9vbGVhbn0gY3JlYXRlZCBhdHRyaWJ1dGUgb3IgZmFsc2UgaWYgbm8gYXR0ciB3YXMgcGFzc2VkIGluXG4gKi9cbiBKU0FQSS5wcm90b3R5cGUuYWRkQXR0ciA9IGZ1bmN0aW9uKGF0dHIpIHtcbiAgICBhdHRyID0gYXR0ciB8fCB7fTtcblxuICAgIGlmIChhdHRyLm5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBhdHRyLnByZWZpeCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGF0dHIubG9jYWwgPT09IHVuZGVmaW5lZFxuICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdGhpcy5hdHRycyA9IHRoaXMuYXR0cnMgfHwge307XG4gICAgdGhpcy5hdHRyc1thdHRyLm5hbWVdID0gYXR0cjtcblxuICAgIGlmKGF0dHIubmFtZSA9PT0gJ2NsYXNzJykgeyAvLyBuZXdseSBhZGRlZCBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgdGhpcy5jbGFzcy5oYXNDbGFzcygpO1xuICAgIH1cblxuICAgIGlmKGF0dHIubmFtZSA9PT0gJ3N0eWxlJykgeyAvLyBuZXdseSBhZGRlZCBzdHlsZSBhdHRyaWJ1dGVcbiAgICAgICAgdGhpcy5zdHlsZS5oYXNTdHlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmF0dHJzW2F0dHIubmFtZV07XG5cbn07XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBhbGwgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFja1xuICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSBjYWxsYmFjayBjb250ZXh0XG4gKiBAcmV0dXJuIHtCb29sZWFufSBmYWxzZSBpZiB0aGVyZSBhcmUgbm8gYW55IGF0dHJpYnV0ZXNcbiAqL1xuIEpTQVBJLnByb3RvdHlwZS5lYWNoQXR0ciA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBjb250ZXh0KSB7XG5cbiAgICBpZiAoIXRoaXMuaGFzQXR0cigpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB0aGlzLmF0dHJzW25hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxufTtcblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIHNvbWUgYXR0cmlidXRlIHBhc3NlcyB0aGUgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFja1xuICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0XSBjYWxsYmFjayBjb250ZXh0XG4gKiBAcmV0dXJuIHtCb29sZWFufSBmYWxzZSBpZiB0aGVyZSBhcmUgbm8gYW55IGF0dHJpYnV0ZXNcbiAqL1xuIEpTQVBJLnByb3RvdHlwZS5zb21lQXR0ciA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBjb250ZXh0KSB7XG5cbiAgICBpZiAoIXRoaXMuaGFzQXR0cigpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoY29udGV4dCwgdGhpcy5hdHRyc1tuYW1lXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcblxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIHN0cmluZyBvZiBDU1Mgc2VsZWN0b3JzIGFnYWluc3QgdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgbWF0Y2hlZCBlbGVtZW50cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JzIENTUyBzZWxlY3RvcihzKSBzdHJpbmdcbiAqIEByZXR1cm4ge0FycmF5fSBudWxsIGlmIG5vIGVsZW1lbnRzIG1hdGNoZWRcbiAqL1xuIEpTQVBJLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsID0gZnVuY3Rpb24oc2VsZWN0b3JzKSB7XG5cbiAgIHZhciBtYXRjaGVkRWxzID0gY3NzU2VsZWN0KHNlbGVjdG9ycywgdGhpcywgY3NzU2VsZWN0T3B0cyk7XG5cbiAgIHJldHVybiBtYXRjaGVkRWxzLmxlbmd0aCA+IDAgPyBtYXRjaGVkRWxzIDogbnVsbDtcblxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIHN0cmluZyBvZiBDU1Mgc2VsZWN0b3JzIGFnYWluc3QgdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgb25seSB0aGUgZmlyc3QgbWF0Y2hlZCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvcnMgQ1NTIHNlbGVjdG9yKHMpIHN0cmluZ1xuICogQHJldHVybiB7QXJyYXl9IG51bGwgaWYgbm8gZWxlbWVudCBtYXRjaGVkXG4gKi9cbiBKU0FQSS5wcm90b3R5cGUucXVlcnlTZWxlY3RvciA9IGZ1bmN0aW9uKHNlbGVjdG9ycykge1xuXG4gICByZXR1cm4gY3NzU2VsZWN0LnNlbGVjdE9uZShzZWxlY3RvcnMsIHRoaXMsIGNzc1NlbGVjdE9wdHMpO1xuXG59O1xuXG4vKipcbiAqIFRlc3QgaWYgYSBzZWxlY3RvciBtYXRjaGVzIGEgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgQ1NTIHNlbGVjdG9yIHN0cmluZ1xuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBlbGVtZW50IHdvdWxkIGJlIHNlbGVjdGVkIGJ5IHNlbGVjdG9yIHN0cmluZywgZmFsc2UgaWYgaXQgZG9lcyBub3RcbiAqL1xuIEpTQVBJLnByb3RvdHlwZS5tYXRjaGVzID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcblxuICAgcmV0dXJuIGNzc1NlbGVjdC5pcyh0aGlzLCBzZWxlY3RvciwgY3NzU2VsZWN0T3B0cyk7XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcblx0dmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuXHR2YXIgaXNBcmdzID0gc3RyID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcblx0aWYgKCFpc0FyZ3MpIHtcblx0XHRpc0FyZ3MgPSBzdHIgIT09ICdbb2JqZWN0IEFycmF5XScgJiZcblx0XHRcdHZhbHVlICE9PSBudWxsICYmXG5cdFx0XHR0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG5cdFx0XHR0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJyAmJlxuXHRcdFx0dmFsdWUubGVuZ3RoID49IDAgJiZcblx0XHRcdHRvU3RyLmNhbGwodmFsdWUuY2FsbGVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblx0fVxuXHRyZXR1cm4gaXNBcmdzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW1cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7XG52YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBoYXNEb250RW51bUJ1ZyA9ICFpc0VudW1lcmFibGUuY2FsbCh7IHRvU3RyaW5nOiBudWxsIH0sICd0b1N0cmluZycpO1xudmFyIGhhc1Byb3RvRW51bUJ1ZyA9IGlzRW51bWVyYWJsZS5jYWxsKGZ1bmN0aW9uICgpIHt9LCAncHJvdG90eXBlJyk7XG52YXIgZG9udEVudW1zID0gW1xuXHQndG9TdHJpbmcnLFxuXHQndG9Mb2NhbGVTdHJpbmcnLFxuXHQndmFsdWVPZicsXG5cdCdoYXNPd25Qcm9wZXJ0eScsXG5cdCdpc1Byb3RvdHlwZU9mJyxcblx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0J2NvbnN0cnVjdG9yJ1xuXTtcbnZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdHZhciBjdG9yID0gby5jb25zdHJ1Y3Rvcjtcblx0cmV0dXJuIGN0b3IgJiYgY3Rvci5wcm90b3R5cGUgPT09IG87XG59O1xudmFyIGV4Y2x1ZGVkS2V5cyA9IHtcblx0JGFwcGxpY2F0aW9uQ2FjaGU6IHRydWUsXG5cdCRjb25zb2xlOiB0cnVlLFxuXHQkZXh0ZXJuYWw6IHRydWUsXG5cdCRmcmFtZTogdHJ1ZSxcblx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0JGZyYW1lczogdHJ1ZSxcblx0JGlubmVySGVpZ2h0OiB0cnVlLFxuXHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0JG91dGVySGVpZ2h0OiB0cnVlLFxuXHQkb3V0ZXJXaWR0aDogdHJ1ZSxcblx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHQkcGFnZVlPZmZzZXQ6IHRydWUsXG5cdCRwYXJlbnQ6IHRydWUsXG5cdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHQkc2Nyb2xsVG9wOiB0cnVlLFxuXHQkc2Nyb2xsWDogdHJ1ZSxcblx0JHNjcm9sbFk6IHRydWUsXG5cdCRzZWxmOiB0cnVlLFxuXHQkd2Via2l0SW5kZXhlZERCOiB0cnVlLFxuXHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdCR3aW5kb3c6IHRydWVcbn07XG52YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghZXhjbHVkZWRLZXlzWyckJyArIGtdICYmIGhhcy5jYWxsKHdpbmRvdywgaykgJiYgd2luZG93W2tdICE9PSBudWxsICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn0oKSk7XG52YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1Zykge1xuXHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0dmFyIGlzT2JqZWN0ID0gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnO1xuXHR2YXIgaXNGdW5jdGlvbiA9IHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdHZhciBpc1N0cmluZyA9IGlzT2JqZWN0ICYmIHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cdHZhciB0aGVLZXlzID0gW107XG5cblx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdGlmIChpc1N0cmluZyAmJiBvYmplY3QubGVuZ3RoID4gMCAmJiAhaGFzLmNhbGwob2JqZWN0LCAwKSkge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IG9iamVjdC5sZW5ndGg7ICsraikge1xuXHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhqKSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7XG5cdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhuYW1lKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGhhc0RvbnRFbnVtQnVnKSB7XG5cdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0Zm9yICh2YXIgayA9IDA7IGsgPCBkb250RW51bXMubGVuZ3RoOyArK2spIHtcblx0XHRcdGlmICghKHNraXBDb25zdHJ1Y3RvciAmJiBkb250RW51bXNba10gPT09ICdjb25zdHJ1Y3RvcicpICYmIGhhcy5jYWxsKG9iamVjdCwgZG9udEVudW1zW2tdKSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRoZUtleXM7XG59O1xuXG5rZXlzU2hpbS5zaGltID0gZnVuY3Rpb24gc2hpbU9iamVjdEtleXMoKSB7XG5cdGlmIChPYmplY3Qua2V5cykge1xuXHRcdHZhciBrZXlzV29ya3NXaXRoQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIFNhZmFyaSA1LjAgYnVnXG5cdFx0XHRyZXR1cm4gKE9iamVjdC5rZXlzKGFyZ3VtZW50cykgfHwgJycpLmxlbmd0aCA9PT0gMjtcblx0XHR9KDEsIDIpKTtcblx0XHRpZiAoIWtleXNXb3Jrc1dpdGhBcmd1bWVudHMpIHtcblx0XHRcdHZhciBvcmlnaW5hbEtleXMgPSBPYmplY3Qua2V5cztcblx0XHRcdE9iamVjdC5rZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcblx0XHRcdFx0aWYgKGlzQXJncyhvYmplY3QpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhzbGljZS5jYWxsKG9iamVjdCkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMob2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiXG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZm9yRWFjaCAob2JqLCBmbiwgY3R4KSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwoZm4pICE9PSAnW29iamVjdCBGdW5jdGlvbl0nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICB2YXIgbCA9IG9iai5sZW5ndGg7XG4gICAgaWYgKGwgPT09ICtsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBmbi5jYWxsKGN0eCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChvYmosIGspKSB7XG4gICAgICAgICAgICAgICAgZm4uY2FsbChjdHgsIG9ialtrXSwgaywgb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGZvcmVhY2ggPSByZXF1aXJlKCdmb3JlYWNoJyk7XG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgb2JqID0ge307XG5cdHRyeSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ3gnLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogb2JqIH0pO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycywgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMsIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG5cdFx0cmV0dXJuIG9iai54ID09PSBvYmo7XG5cdH0gY2F0Y2ggKGUpIHsgLyogdGhpcyBpcyBJRSA4LiAqL1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQoKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUsIHByZWRpY2F0ZSkge1xuXHRpZiAobmFtZSBpbiBvYmplY3QgJiYgKCFpc0Z1bmN0aW9uKHByZWRpY2F0ZSkgfHwgIXByZWRpY2F0ZSgpKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvYmplY3RbbmFtZV0gPSB2YWx1ZTtcblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBwcm9wcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3JlYWNoKHByb3BzLCBmdW5jdGlvbiAobmFtZSkge1xuXHRcdGRlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwgbWFwW25hbWVdLCBwcmVkaWNhdGVzW25hbWVdKTtcblx0fSk7XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xudmFyIGlzRVM2Q2xhc3NGbiA9IGZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChmblN0cik7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXG5cdH1cbn07XG5cbnZhciB0cnlGdW5jdGlvbk9iamVjdCA9IGZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWUpIHtcblx0dHJ5IHtcblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRmblRvU3RyLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmICF2YWx1ZS5wcm90b3R5cGUpIHsgcmV0dXJuIHRydWU7IH1cblx0aWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cblx0aWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdHZhciBzdHJDbGFzcyA9IHRvU3RyLmNhbGwodmFsdWUpO1xuXHRyZXR1cm4gc3RyQ2xhc3MgPT09IGZuQ2xhc3MgfHwgc3RyQ2xhc3MgPT09IGdlbkNsYXNzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldERheSA9IERhdGUucHJvdG90eXBlLmdldERheTtcbnZhciB0cnlEYXRlT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkgOiB0b1N0ci5jYWxsKHZhbHVlKSA9PT0gZGF0ZUNsYXNzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCkgPT09ICdzeW1ib2wnO1xuXG5pZiAoaGFzU3ltYm9scykge1xuXHR2YXIgc3ltVG9TdHIgPSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nO1xuXHR2YXIgc3ltU3RyaW5nUmVnZXggPSAvXlN5bWJvbFxcKC4qXFwpJC87XG5cdHZhciBpc1N5bWJvbE9iamVjdCA9IGZ1bmN0aW9uIGlzU3ltYm9sT2JqZWN0KHZhbHVlKSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdHJldHVybiBzeW1TdHJpbmdSZWdleC50ZXN0KHN5bVRvU3RyLmNhbGwodmFsdWUpKTtcblx0fTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cdFx0aWYgKHRvU3RyLmNhbGwodmFsdWUpICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGlzU3ltYm9sT2JqZWN0KHZhbHVlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdC8vIHRoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTeW1ib2xzLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc1N5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnO1xuXG52YXIgaXNQcmltaXRpdmUgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNQcmltaXRpdmUnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnaXMtY2FsbGFibGUnKTtcbnZhciBpc0RhdGUgPSByZXF1aXJlKCdpcy1kYXRlLW9iamVjdCcpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnaXMtc3ltYm9sJyk7XG5cbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG5cdGlmICh0eXBlb2YgTyA9PT0gJ3VuZGVmaW5lZCcgfHwgTyA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIG1ldGhvZCBvbiAnICsgTyk7XG5cdH1cblx0aWYgKHR5cGVvZiBoaW50ICE9PSAnc3RyaW5nJyB8fCAoaGludCAhPT0gJ251bWJlcicgJiYgaGludCAhPT0gJ3N0cmluZycpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignaGludCBtdXN0IGJlIFwic3RyaW5nXCIgb3IgXCJudW1iZXJcIicpO1xuXHR9XG5cdHZhciBtZXRob2ROYW1lcyA9IGhpbnQgPT09ICdzdHJpbmcnID8gWyd0b1N0cmluZycsICd2YWx1ZU9mJ10gOiBbJ3ZhbHVlT2YnLCAndG9TdHJpbmcnXTtcblx0dmFyIG1ldGhvZCwgcmVzdWx0LCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgbWV0aG9kTmFtZXMubGVuZ3RoOyArK2kpIHtcblx0XHRtZXRob2QgPSBPW21ldGhvZE5hbWVzW2ldXTtcblx0XHRpZiAoaXNDYWxsYWJsZShtZXRob2QpKSB7XG5cdFx0XHRyZXN1bHQgPSBtZXRob2QuY2FsbChPKTtcblx0XHRcdGlmIChpc1ByaW1pdGl2ZShyZXN1bHQpKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIGRlZmF1bHQgdmFsdWUnKTtcbn07XG5cbnZhciBHZXRNZXRob2QgPSBmdW5jdGlvbiBHZXRNZXRob2QoTywgUCkge1xuXHR2YXIgZnVuYyA9IE9bUF07XG5cdGlmIChmdW5jICE9PSBudWxsICYmIHR5cGVvZiBmdW5jICE9PSAndW5kZWZpbmVkJykge1xuXHRcdGlmICghaXNDYWxsYWJsZShmdW5jKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihmdW5jICsgJyByZXR1cm5lZCBmb3IgcHJvcGVydHkgJyArIFAgKyAnIG9mIG9iamVjdCAnICsgTyArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZ1bmM7XG5cdH1cbn07XG5cbi8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuXHRpZiAoaXNQcmltaXRpdmUoaW5wdXQpKSB7XG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG5cdHZhciBoaW50ID0gJ2RlZmF1bHQnO1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRpZiAoUHJlZmVycmVkVHlwZSA9PT0gU3RyaW5nKSB7XG5cdFx0XHRoaW50ID0gJ3N0cmluZyc7XG5cdFx0fSBlbHNlIGlmIChQcmVmZXJyZWRUeXBlID09PSBOdW1iZXIpIHtcblx0XHRcdGhpbnQgPSAnbnVtYmVyJztcblx0XHR9XG5cdH1cblxuXHR2YXIgZXhvdGljVG9QcmltO1xuXHRpZiAoaGFzU3ltYm9scykge1xuXHRcdGlmIChTeW1ib2wudG9QcmltaXRpdmUpIHtcblx0XHRcdGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgU3ltYm9sLnRvUHJpbWl0aXZlKTtcblx0XHR9IGVsc2UgaWYgKGlzU3ltYm9sKGlucHV0KSkge1xuXHRcdFx0ZXhvdGljVG9QcmltID0gU3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mO1xuXHRcdH1cblx0fVxuXHRpZiAodHlwZW9mIGV4b3RpY1RvUHJpbSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR2YXIgcmVzdWx0ID0gZXhvdGljVG9QcmltLmNhbGwoaW5wdXQsIGhpbnQpO1xuXHRcdGlmIChpc1ByaW1pdGl2ZShyZXN1bHQpKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmFibGUgdG8gY29udmVydCBleG90aWMgb2JqZWN0IHRvIHByaW1pdGl2ZScpO1xuXHR9XG5cdGlmIChoaW50ID09PSAnZGVmYXVsdCcgJiYgKGlzRGF0ZShpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSkge1xuXHRcdGhpbnQgPSAnc3RyaW5nJztcblx0fVxuXHRyZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gJ2RlZmF1bHQnID8gJ251bWJlcicgOiBoaW50KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbHNcblx0U2V0LFxuXHRNYXAsXG5cdFdlYWtTZXQsXG5cdFdlYWtNYXAsXG5cblx0UHJvbWlzZSxcblxuXHRTeW1ib2wsXG5cdFByb3h5LFxuXG5cdEF0b21pY3MsXG5cdFNoYXJlZEFycmF5QnVmZmVyLFxuXG5cdEFycmF5QnVmZmVyLFxuXHREYXRhVmlldyxcblx0VWludDhBcnJheSxcblx0RmxvYXQzMkFycmF5LFxuXHRGbG9hdDY0QXJyYXksXG5cdEludDhBcnJheSxcblx0SW50MTZBcnJheSxcblx0SW50MzJBcnJheSxcblx0VWludDhDbGFtcGVkQXJyYXksXG5cdFVpbnQxNkFycmF5LFxuXHRVaW50MzJBcnJheSxcbiovXG5cbnZhciB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2hhZG93LXJlc3RyaWN0ZWQtbmFtZXNcblxudmFyIFRocm93VHlwZUVycm9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvclxuXHQ/IChmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDsgfSgpKVxuXHQ6IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyB9O1xuXG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCc7XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5fX3Byb3RvX187IH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblxudmFyIGdlbmVyYXRvcjsgLy8gPSBmdW5jdGlvbiAqICgpIHt9O1xudmFyIGdlbmVyYXRvckZ1bmN0aW9uID0gZ2VuZXJhdG9yID8gZ2V0UHJvdG8oZ2VuZXJhdG9yKSA6IHVuZGVmaW5lZDtcbnZhciBhc3luY0ZuOyAvLyBhc3luYyBmdW5jdGlvbigpIHt9O1xudmFyIGFzeW5jRnVuY3Rpb24gPSBhc3luY0ZuID8gYXN5bmNGbi5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZDtcbnZhciBhc3luY0dlbjsgLy8gYXN5bmMgZnVuY3Rpb24gKiAoKSB7fTtcbnZhciBhc3luY0dlbkZ1bmN0aW9uID0gYXN5bmNHZW4gPyBnZXRQcm90byhhc3luY0dlbikgOiB1bmRlZmluZWQ7XG52YXIgYXN5bmNHZW5JdGVyYXRvciA9IGFzeW5jR2VuID8gYXN5bmNHZW4oKSA6IHVuZGVmaW5lZDtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdCckICVBcnJheSUnOiBBcnJheSxcblx0JyQgJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyQgJUFycmF5QnVmZmVyUHJvdG90eXBlJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlci5wcm90b3R5cGUsXG5cdCckICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJCAlQXJyYXlQcm90b3R5cGUlJzogQXJyYXkucHJvdG90eXBlLFxuXHQnJCAlQXJyYXlQcm90b19lbnRyaWVzJSc6IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzLFxuXHQnJCAlQXJyYXlQcm90b19mb3JFYWNoJSc6IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLFxuXHQnJCAlQXJyYXlQcm90b19rZXlzJSc6IEFycmF5LnByb3RvdHlwZS5rZXlzLFxuXHQnJCAlQXJyYXlQcm90b192YWx1ZXMlJzogQXJyYXkucHJvdG90eXBlLnZhbHVlcyxcblx0JyQgJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCckICVBc3luY0Z1bmN0aW9uJSc6IGFzeW5jRnVuY3Rpb24sXG5cdCckICVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6IGFzeW5jRnVuY3Rpb24gPyBhc3luY0Z1bmN0aW9uLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcblx0JyQgJUFzeW5jR2VuZXJhdG9yJSc6IGFzeW5jR2VuID8gZ2V0UHJvdG8oYXN5bmNHZW5JdGVyYXRvcikgOiB1bmRlZmluZWQsXG5cdCckICVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSc6IGFzeW5jR2VuRnVuY3Rpb24sXG5cdCckICVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBhc3luY0dlbkZ1bmN0aW9uID8gYXN5bmNHZW5GdW5jdGlvbi5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG5cdCckICVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IGFzeW5jR2VuSXRlcmF0b3IgJiYgaGFzU3ltYm9scyAmJiBTeW1ib2wuYXN5bmNJdGVyYXRvciA/IGFzeW5jR2VuSXRlcmF0b3JbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgOiB1bmRlZmluZWQsXG5cdCckICVBdG9taWNzJSc6IHR5cGVvZiBBdG9taWNzID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEF0b21pY3MsXG5cdCckICVCb29sZWFuJSc6IEJvb2xlYW4sXG5cdCckICVCb29sZWFuUHJvdG90eXBlJSc6IEJvb2xlYW4ucHJvdG90eXBlLFxuXHQnJCAlRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LFxuXHQnJCAlRGF0YVZpZXdQcm90b3R5cGUlJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LnByb3RvdHlwZSxcblx0JyQgJURhdGUlJzogRGF0ZSxcblx0JyQgJURhdGVQcm90b3R5cGUlJzogRGF0ZS5wcm90b3R5cGUsXG5cdCckICVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuXHQnJCAlZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyQgJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCckICVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuXHQnJCAlRXJyb3IlJzogRXJyb3IsXG5cdCckICVFcnJvclByb3RvdHlwZSUnOiBFcnJvci5wcm90b3R5cGUsXG5cdCckICVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJCAlRXZhbEVycm9yJSc6IEV2YWxFcnJvcixcblx0JyQgJUV2YWxFcnJvclByb3RvdHlwZSUnOiBFdmFsRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJCAlRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LnByb3RvdHlwZSxcblx0JyQgJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyQgJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheS5wcm90b3R5cGUsXG5cdCckICVGdW5jdGlvbiUnOiBGdW5jdGlvbixcblx0JyQgJUZ1bmN0aW9uUHJvdG90eXBlJSc6IEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0JyQgJUdlbmVyYXRvciUnOiBnZW5lcmF0b3IgPyBnZXRQcm90byhnZW5lcmF0b3IoKSkgOiB1bmRlZmluZWQsXG5cdCckICVHZW5lcmF0b3JGdW5jdGlvbiUnOiBnZW5lcmF0b3JGdW5jdGlvbixcblx0JyQgJUdlbmVyYXRvclByb3RvdHlwZSUnOiBnZW5lcmF0b3JGdW5jdGlvbiA/IGdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcblx0JyQgJUludDhBcnJheSUnOiB0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDhBcnJheSxcblx0JyQgJUludDhBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDhBcnJheS5wcm90b3R5cGUsXG5cdCckICVJbnQxNkFycmF5JSc6IHR5cGVvZiBJbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDE2QXJyYXksXG5cdCckICVJbnQxNkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDhBcnJheS5wcm90b3R5cGUsXG5cdCckICVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCckICVJbnQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXkucHJvdG90eXBlLFxuXHQnJCAlaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCckICVpc05hTiUnOiBpc05hTixcblx0JyQgJUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90byhnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKSA6IHVuZGVmaW5lZCxcblx0JyQgJUpTT04lJzogSlNPTixcblx0JyQgJUpTT05QYXJzZSUnOiBKU09OLnBhcnNlLFxuXHQnJCAlTWFwJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTWFwLFxuXHQnJCAlTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyQgJU1hcFByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcC5wcm90b3R5cGUsXG5cdCckICVNYXRoJSc6IE1hdGgsXG5cdCckICVOdW1iZXIlJzogTnVtYmVyLFxuXHQnJCAlTnVtYmVyUHJvdG90eXBlJSc6IE51bWJlci5wcm90b3R5cGUsXG5cdCckICVPYmplY3QlJzogT2JqZWN0LFxuXHQnJCAlT2JqZWN0UHJvdG90eXBlJSc6IE9iamVjdC5wcm90b3R5cGUsXG5cdCckICVPYmpQcm90b190b1N0cmluZyUnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFxuXHQnJCAlT2JqUHJvdG9fdmFsdWVPZiUnOiBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YsXG5cdCckICVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCckICVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyQgJVByb21pc2UlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZSxcblx0JyQgJVByb21pc2VQcm90b3R5cGUlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZS5wcm90b3R5cGUsXG5cdCckICVQcm9taXNlUHJvdG9fdGhlbiUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLnByb3RvdHlwZS50aGVuLFxuXHQnJCAlUHJvbWlzZV9hbGwlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZS5hbGwsXG5cdCckICVQcm9taXNlX3JlamVjdCUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLnJlamVjdCxcblx0JyQgJVByb21pc2VfcmVzb2x2ZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLnJlc29sdmUsXG5cdCckICVQcm94eSUnOiB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJveHksXG5cdCckICVSYW5nZUVycm9yJSc6IFJhbmdlRXJyb3IsXG5cdCckICVSYW5nZUVycm9yUHJvdG90eXBlJSc6IFJhbmdlRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlUmVmZXJlbmNlRXJyb3IlJzogUmVmZXJlbmNlRXJyb3IsXG5cdCckICVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBSZWZlcmVuY2VFcnJvci5wcm90b3R5cGUsXG5cdCckICVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCckICVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJCAlUmVnRXhwUHJvdG90eXBlJSc6IFJlZ0V4cC5wcm90b3R5cGUsXG5cdCckICVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCckICVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJCAlU2V0UHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LnByb3RvdHlwZSxcblx0JyQgJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyQgJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlci5wcm90b3R5cGUsXG5cdCckICVTdHJpbmclJzogU3RyaW5nLFxuXHQnJCAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCckICVTdHJpbmdQcm90b3R5cGUlJzogU3RyaW5nLnByb3RvdHlwZSxcblx0JyQgJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJCAlU3ltYm9sUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQnJCAlU3ludGF4RXJyb3IlJzogU3ludGF4RXJyb3IsXG5cdCckICVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBTeW50YXhFcnJvci5wcm90b3R5cGUsXG5cdCckICVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyQgJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyQgJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheSA/IFR5cGVkQXJyYXkucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQnJCAlVHlwZUVycm9yJSc6IFR5cGVFcnJvcixcblx0JyQgJVR5cGVFcnJvclByb3RvdHlwZSUnOiBUeXBlRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJCAlVWludDhBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LnByb3RvdHlwZSxcblx0JyQgJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyQgJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheS5wcm90b3R5cGUsXG5cdCckICVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCckICVVaW50MTZBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXkucHJvdG90eXBlLFxuXHQnJCAlVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJCAlVWludDMyQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LnByb3RvdHlwZSxcblx0JyQgJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJCAlVVJJRXJyb3JQcm90b3R5cGUlJzogVVJJRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLFxuXHQnJCAlV2Vha01hcFByb3RvdHlwZSUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLnByb3RvdHlwZSxcblx0JyQgJVdlYWtTZXQlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1NldCxcblx0JyQgJVdlYWtTZXRQcm90b3R5cGUlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1NldC5wcm90b3R5cGVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0dmFyIGtleSA9ICckICcgKyBuYW1lO1xuXHRpZiAoIShrZXkgaW4gSU5UUklOU0lDUykpIHtcblx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG5cdH1cblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgaWYgLy8gaG9wZWZ1bGx5IHRoaXMgaXMgaW1wb3NzaWJsZSB0byB0ZXN0IDotKVxuXHRpZiAodHlwZW9mIElOVFJJTlNJQ1Nba2V5XSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdH1cblx0cmV0dXJuIElOVFJJTlNJQ1Nba2V5XTtcbn07XG4iLCJ2YXIgJGlzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIChhKSB7IHJldHVybiBhICE9PSBhOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmICEkaXNOYU4oeCkgJiYgeCAhPT0gSW5maW5pdHkgJiYgeCAhPT0gLUluZmluaXR5OyB9O1xuIiwidmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7XG5cdGlmICgkYXNzaWduKSB7XG5cdFx0cmV0dXJuICRhc3NpZ24odGFyZ2V0LCBzb3VyY2UpO1xuXHR9XG5cblx0Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuXHRcdGlmIChoYXMoc291cmNlLCBrZXkpKSB7XG5cdFx0XHR0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2lnbihudW1iZXIpIHtcblx0cmV0dXJuIG51bWJlciA+PSAwID8gMSA6IC0xO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbW9kKG51bWJlciwgbW9kdWxvKSB7XG5cdHZhciByZW1haW4gPSBudW1iZXIgJSBtb2R1bG87XG5cdHJldHVybiBNYXRoLmZsb29yKHJlbWFpbiA+PSAwID8gcmVtYWluIDogcmVtYWluICsgbW9kdWxvKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJpbWl0aXZlJyk7XG5cbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnaXMtY2FsbGFibGUnKTtcblxuLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OC4xMlxudmFyIEVTNWludGVybmFsU2xvdHMgPSB7XG5cdCdbW0RlZmF1bHRWYWx1ZV1dJzogZnVuY3Rpb24gKE8sIGhpbnQpIHtcblx0XHR2YXIgYWN0dWFsSGludCA9IGhpbnQgfHwgKHRvU3RyLmNhbGwoTykgPT09ICdbb2JqZWN0IERhdGVdJyA/IFN0cmluZyA6IE51bWJlcik7XG5cblx0XHRpZiAoYWN0dWFsSGludCA9PT0gU3RyaW5nIHx8IGFjdHVhbEhpbnQgPT09IE51bWJlcikge1xuXHRcdFx0dmFyIG1ldGhvZHMgPSBhY3R1YWxIaW50ID09PSBTdHJpbmcgPyBbJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXSA6IFsndmFsdWVPZicsICd0b1N0cmluZyddO1xuXHRcdFx0dmFyIHZhbHVlLCBpO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0aWYgKGlzQ2FsbGFibGUoT1ttZXRob2RzW2ldXSkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IE9bbWV0aG9kc1tpXV0oKTtcblx0XHRcdFx0XHRpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZhdWx0IHZhbHVlJyk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgW1tEZWZhdWx0VmFsdWVdXSBoaW50IHN1cHBsaWVkJyk7XG5cdH1cbn07XG5cbi8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcblx0aWYgKGlzUHJpbWl0aXZlKGlucHV0KSkge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxuXHRyZXR1cm4gRVM1aW50ZXJuYWxTbG90c1snW1tEZWZhdWx0VmFsdWVdXSddKGlucHV0LCBQcmVmZXJyZWRUeXBlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuL0dldEludHJpbnNpYycpO1xuXG52YXIgJE9iamVjdCA9IEdldEludHJpbnNpYygnJU9iamVjdCUnKTtcbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xudmFyICRTdHJpbmcgPSBHZXRJbnRyaW5zaWMoJyVTdHJpbmclJyk7XG5cbnZhciAkaXNOYU4gPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNOYU4nKTtcbnZhciAkaXNGaW5pdGUgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNGaW5pdGUnKTtcblxudmFyIHNpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvc2lnbicpO1xudmFyIG1vZCA9IHJlcXVpcmUoJy4vaGVscGVycy9tb2QnKTtcblxudmFyIElzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnZXMtdG8tcHJpbWl0aXZlL2VzNScpO1xuXG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG5cbi8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDlcbnZhciBFUzUgPSB7XG5cdFRvUHJpbWl0aXZlOiB0b1ByaW1pdGl2ZSxcblxuXHRUb0Jvb2xlYW46IGZ1bmN0aW9uIFRvQm9vbGVhbih2YWx1ZSkge1xuXHRcdHJldHVybiAhIXZhbHVlO1xuXHR9LFxuXHRUb051bWJlcjogZnVuY3Rpb24gVG9OdW1iZXIodmFsdWUpIHtcblx0XHRyZXR1cm4gK3ZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG5cdH0sXG5cdFRvSW50ZWdlcjogZnVuY3Rpb24gVG9JbnRlZ2VyKHZhbHVlKSB7XG5cdFx0dmFyIG51bWJlciA9IHRoaXMuVG9OdW1iZXIodmFsdWUpO1xuXHRcdGlmICgkaXNOYU4obnVtYmVyKSkgeyByZXR1cm4gMDsgfVxuXHRcdGlmIChudW1iZXIgPT09IDAgfHwgISRpc0Zpbml0ZShudW1iZXIpKSB7IHJldHVybiBudW1iZXI7IH1cblx0XHRyZXR1cm4gc2lnbihudW1iZXIpICogTWF0aC5mbG9vcihNYXRoLmFicyhudW1iZXIpKTtcblx0fSxcblx0VG9JbnQzMjogZnVuY3Rpb24gVG9JbnQzMih4KSB7XG5cdFx0cmV0dXJuIHRoaXMuVG9OdW1iZXIoeCkgPj4gMDtcblx0fSxcblx0VG9VaW50MzI6IGZ1bmN0aW9uIFRvVWludDMyKHgpIHtcblx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcih4KSA+Pj4gMDtcblx0fSxcblx0VG9VaW50MTY6IGZ1bmN0aW9uIFRvVWludDE2KHZhbHVlKSB7XG5cdFx0dmFyIG51bWJlciA9IHRoaXMuVG9OdW1iZXIodmFsdWUpO1xuXHRcdGlmICgkaXNOYU4obnVtYmVyKSB8fCBudW1iZXIgPT09IDAgfHwgISRpc0Zpbml0ZShudW1iZXIpKSB7IHJldHVybiAwOyB9XG5cdFx0dmFyIHBvc0ludCA9IHNpZ24obnVtYmVyKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMobnVtYmVyKSk7XG5cdFx0cmV0dXJuIG1vZChwb3NJbnQsIDB4MTAwMDApO1xuXHR9LFxuXHRUb1N0cmluZzogZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUpIHtcblx0XHRyZXR1cm4gJFN0cmluZyh2YWx1ZSk7XG5cdH0sXG5cdFRvT2JqZWN0OiBmdW5jdGlvbiBUb09iamVjdCh2YWx1ZSkge1xuXHRcdHRoaXMuQ2hlY2tPYmplY3RDb2VyY2libGUodmFsdWUpO1xuXHRcdHJldHVybiAkT2JqZWN0KHZhbHVlKTtcblx0fSxcblx0Q2hlY2tPYmplY3RDb2VyY2libGU6IGZ1bmN0aW9uIENoZWNrT2JqZWN0Q29lcmNpYmxlKHZhbHVlLCBvcHRNZXNzYWdlKSB7XG5cdFx0LyoganNoaW50IGVxbnVsbDp0cnVlICovXG5cdFx0aWYgKHZhbHVlID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKG9wdE1lc3NhZ2UgfHwgJ0Nhbm5vdCBjYWxsIG1ldGhvZCBvbiAnICsgdmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cdElzQ2FsbGFibGU6IElzQ2FsbGFibGUsXG5cdFNhbWVWYWx1ZTogZnVuY3Rpb24gU2FtZVZhbHVlKHgsIHkpIHtcblx0XHRpZiAoeCA9PT0geSkgeyAvLyAwID09PSAtMCwgYnV0IHRoZXkgYXJlIG5vdCBpZGVudGljYWwuXG5cdFx0XHRpZiAoeCA9PT0gMCkgeyByZXR1cm4gMSAvIHggPT09IDEgLyB5OyB9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuICRpc05hTih4KSAmJiAkaXNOYU4oeSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04XG5cdFR5cGU6IGZ1bmN0aW9uIFR5cGUoeCkge1xuXHRcdGlmICh4ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gJ051bGwnO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHggPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gJ1VuZGVmaW5lZCc7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiAnT2JqZWN0Jztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuXHRcdFx0cmV0dXJuICdOdW1iZXInO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHggPT09ICdib29sZWFuJykge1xuXHRcdFx0cmV0dXJuICdCb29sZWFuJztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuICdTdHJpbmcnO1xuXHRcdH1cblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtcHJvcGVydHktZGVzY3JpcHRvci1zcGVjaWZpY2F0aW9uLXR5cGVcblx0SXNQcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIElzUHJvcGVydHlEZXNjcmlwdG9yKERlc2MpIHtcblx0XHRpZiAodGhpcy5UeXBlKERlc2MpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgYWxsb3dlZCA9IHtcblx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogdHJ1ZSxcblx0XHRcdCdbW0VudW1lcmFibGVdXSc6IHRydWUsXG5cdFx0XHQnW1tHZXRdXSc6IHRydWUsXG5cdFx0XHQnW1tTZXRdXSc6IHRydWUsXG5cdFx0XHQnW1tWYWx1ZV1dJzogdHJ1ZSxcblx0XHRcdCdbW1dyaXRhYmxlXV0nOiB0cnVlXG5cdFx0fTtcblx0XHQvLyBqc2NzOmRpc2FibGVcblx0XHRmb3IgKHZhciBrZXkgaW4gRGVzYykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0XHRpZiAoaGFzKERlc2MsIGtleSkgJiYgIWFsbG93ZWRba2V5XSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGpzY3M6ZW5hYmxlXG5cdFx0dmFyIGlzRGF0YSA9IGhhcyhEZXNjLCAnW1tWYWx1ZV1dJyk7XG5cdFx0dmFyIElzQWNjZXNzb3IgPSBoYXMoRGVzYywgJ1tbR2V0XV0nKSB8fCBoYXMoRGVzYywgJ1tbU2V0XV0nKTtcblx0XHRpZiAoaXNEYXRhICYmIElzQWNjZXNzb3IpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdQcm9wZXJ0eSBEZXNjcmlwdG9ycyBtYXkgbm90IGJlIGJvdGggYWNjZXNzb3IgYW5kIGRhdGEgZGVzY3JpcHRvcnMnKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTguMTAuMVxuXHRJc0FjY2Vzc29yRGVzY3JpcHRvcjogZnVuY3Rpb24gSXNBY2Nlc3NvckRlc2NyaXB0b3IoRGVzYykge1xuXHRcdGlmICh0eXBlb2YgRGVzYyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdEZXNjIG11c3QgYmUgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXMoRGVzYywgJ1tbR2V0XV0nKSAmJiAhaGFzKERlc2MsICdbW1NldF1dJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC4yXG5cdElzRGF0YURlc2NyaXB0b3I6IGZ1bmN0aW9uIElzRGF0YURlc2NyaXB0b3IoRGVzYykge1xuXHRcdGlmICh0eXBlb2YgRGVzYyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdEZXNjIG11c3QgYmUgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXMoRGVzYywgJ1tbVmFsdWVdXScpICYmICFoYXMoRGVzYywgJ1tbV3JpdGFibGVdXScpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTguMTAuM1xuXHRJc0dlbmVyaWNEZXNjcmlwdG9yOiBmdW5jdGlvbiBJc0dlbmVyaWNEZXNjcmlwdG9yKERlc2MpIHtcblx0XHRpZiAodHlwZW9mIERlc2MgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignRGVzYyBtdXN0IGJlIGEgUHJvcGVydHkgRGVzY3JpcHRvcicpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5Jc0FjY2Vzc29yRGVzY3JpcHRvcihEZXNjKSAmJiAhdGhpcy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTguMTAuNFxuXHRGcm9tUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBGcm9tUHJvcGVydHlEZXNjcmlwdG9yKERlc2MpIHtcblx0XHRpZiAodHlwZW9mIERlc2MgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gRGVzYztcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdEZXNjIG11c3QgYmUgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuSXNEYXRhRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dmFsdWU6IERlc2NbJ1tbVmFsdWVdXSddLFxuXHRcdFx0XHR3cml0YWJsZTogISFEZXNjWydbW1dyaXRhYmxlXV0nXSxcblx0XHRcdFx0ZW51bWVyYWJsZTogISFEZXNjWydbW0VudW1lcmFibGVdXSddLFxuXHRcdFx0XHRjb25maWd1cmFibGU6ICEhRGVzY1snW1tDb25maWd1cmFibGVdXSddXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAodGhpcy5Jc0FjY2Vzc29yRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Z2V0OiBEZXNjWydbW0dldF1dJ10sXG5cdFx0XHRcdHNldDogRGVzY1snW1tTZXRdXSddLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiAhIURlc2NbJ1tbRW51bWVyYWJsZV1dJ10sXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogISFEZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ11cblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdGcm9tUHJvcGVydHlEZXNjcmlwdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggYSBmdWxseSBwb3B1bGF0ZWQgUHJvcGVydHkgRGVzY3JpcHRvcicpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC41XG5cdFRvUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBUb1Byb3BlcnR5RGVzY3JpcHRvcihPYmopIHtcblx0XHRpZiAodGhpcy5UeXBlKE9iaikgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignVG9Qcm9wZXJ0eURlc2NyaXB0b3IgcmVxdWlyZXMgYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0dmFyIGRlc2MgPSB7fTtcblx0XHRpZiAoaGFzKE9iaiwgJ2VudW1lcmFibGUnKSkge1xuXHRcdFx0ZGVzY1snW1tFbnVtZXJhYmxlXV0nXSA9IHRoaXMuVG9Cb29sZWFuKE9iai5lbnVtZXJhYmxlKTtcblx0XHR9XG5cdFx0aWYgKGhhcyhPYmosICdjb25maWd1cmFibGUnKSkge1xuXHRcdFx0ZGVzY1snW1tDb25maWd1cmFibGVdXSddID0gdGhpcy5Ub0Jvb2xlYW4oT2JqLmNvbmZpZ3VyYWJsZSk7XG5cdFx0fVxuXHRcdGlmIChoYXMoT2JqLCAndmFsdWUnKSkge1xuXHRcdFx0ZGVzY1snW1tWYWx1ZV1dJ10gPSBPYmoudmFsdWU7XG5cdFx0fVxuXHRcdGlmIChoYXMoT2JqLCAnd3JpdGFibGUnKSkge1xuXHRcdFx0ZGVzY1snW1tXcml0YWJsZV1dJ10gPSB0aGlzLlRvQm9vbGVhbihPYmoud3JpdGFibGUpO1xuXHRcdH1cblx0XHRpZiAoaGFzKE9iaiwgJ2dldCcpKSB7XG5cdFx0XHR2YXIgZ2V0dGVyID0gT2JqLmdldDtcblx0XHRcdGlmICh0eXBlb2YgZ2V0dGVyICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5Jc0NhbGxhYmxlKGdldHRlcikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0dGVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdFx0fVxuXHRcdFx0ZGVzY1snW1tHZXRdXSddID0gZ2V0dGVyO1xuXHRcdH1cblx0XHRpZiAoaGFzKE9iaiwgJ3NldCcpKSB7XG5cdFx0XHR2YXIgc2V0dGVyID0gT2JqLnNldDtcblx0XHRcdGlmICh0eXBlb2Ygc2V0dGVyICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5Jc0NhbGxhYmxlKHNldHRlcikpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ3NldHRlciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0XHRcdH1cblx0XHRcdGRlc2NbJ1tbU2V0XV0nXSA9IHNldHRlcjtcblx0XHR9XG5cblx0XHRpZiAoKGhhcyhkZXNjLCAnW1tHZXRdXScpIHx8IGhhcyhkZXNjLCAnW1tTZXRdXScpKSAmJiAoaGFzKGRlc2MsICdbW1ZhbHVlXV0nKSB8fCBoYXMoZGVzYywgJ1tbV3JpdGFibGVdXScpKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0ludmFsaWQgcHJvcGVydHkgZGVzY3JpcHRvci4gQ2Fubm90IGJvdGggc3BlY2lmeSBhY2Nlc3NvcnMgYW5kIGEgdmFsdWUgb3Igd3JpdGFibGUgYXR0cmlidXRlJyk7XG5cdFx0fVxuXHRcdHJldHVybiBkZXNjO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVTNTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIHJlZ2V4RXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIHRyeVJlZ2V4RXhlY0NhbGwgPSBmdW5jdGlvbiB0cnlSZWdleEV4ZWModmFsdWUpIHtcblx0dHJ5IHtcblx0XHR2YXIgbGFzdEluZGV4ID0gdmFsdWUubGFzdEluZGV4O1xuXHRcdHZhbHVlLmxhc3RJbmRleCA9IDA7XG5cblx0XHRyZWdleEV4ZWMuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0dmFsdWUubGFzdEluZGV4ID0gbGFzdEluZGV4O1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcpIHtcblx0XHRyZXR1cm4gdG9TdHIuY2FsbCh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH1cblxuXHR2YXIgZGVzY3JpcHRvciA9IGdPUEQodmFsdWUsICdsYXN0SW5kZXgnKTtcblx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRpZiAoIWhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0cnlSZWdleEV4ZWNDYWxsKHZhbHVlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSByZXF1aXJlKCdoYXMnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJ2VzLXRvLXByaW1pdGl2ZS9lczYnKTtcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG5cbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xudmFyICRTeW50YXhFcnJvciA9IEdldEludHJpbnNpYygnJVN5bnRheEVycm9yJScpO1xudmFyICRBcnJheSA9IEdldEludHJpbnNpYygnJUFycmF5JScpO1xudmFyICRTdHJpbmcgPSBHZXRJbnRyaW5zaWMoJyVTdHJpbmclJyk7XG52YXIgJE9iamVjdCA9IEdldEludHJpbnNpYygnJU9iamVjdCUnKTtcbnZhciAkTnVtYmVyID0gR2V0SW50cmluc2ljKCclTnVtYmVyJScpO1xudmFyICRTeW1ib2wgPSBHZXRJbnRyaW5zaWMoJyVTeW1ib2wlJywgdHJ1ZSk7XG52YXIgJFJlZ0V4cCA9IEdldEludHJpbnNpYygnJVJlZ0V4cCUnKTtcblxudmFyIGhhc1N5bWJvbHMgPSAhISRTeW1ib2w7XG5cbnZhciAkaXNOYU4gPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNOYU4nKTtcbnZhciAkaXNGaW5pdGUgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNGaW5pdGUnKTtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gJE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vaGVscGVycy9zaWduJyk7XG52YXIgbW9kID0gcmVxdWlyZSgnLi9oZWxwZXJzL21vZCcpO1xudmFyIGlzUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJpbWl0aXZlJyk7XG52YXIgcGFyc2VJbnRlZ2VyID0gcGFyc2VJbnQ7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBhcnJheVNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRBcnJheS5wcm90b3R5cGUuc2xpY2UpO1xudmFyIHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRTdHJpbmcucHJvdG90eXBlLnNsaWNlKTtcbnZhciBpc0JpbmFyeSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCAkUmVnRXhwLnByb3RvdHlwZS50ZXN0LCAvXjBiWzAxXSskL2kpO1xudmFyIGlzT2N0YWwgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgL14wb1swLTddKyQvaSk7XG52YXIgcmVnZXhFeGVjID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRSZWdFeHAucHJvdG90eXBlLmV4ZWMpO1xudmFyIG5vbldTID0gWydcXHUwMDg1JywgJ1xcdTIwMGInLCAnXFx1ZmZmZSddLmpvaW4oJycpO1xudmFyIG5vbldTcmVnZXggPSBuZXcgJFJlZ0V4cCgnWycgKyBub25XUyArICddJywgJ2cnKTtcbnZhciBoYXNOb25XUyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCAkUmVnRXhwLnByb3RvdHlwZS50ZXN0LCBub25XU3JlZ2V4KTtcbnZhciBpbnZhbGlkSGV4TGl0ZXJhbCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xudmFyIGlzSW52YWxpZEhleExpdGVyYWwgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgaW52YWxpZEhleExpdGVyYWwpO1xudmFyICRjaGFyQ29kZUF0ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRTdHJpbmcucHJvdG90eXBlLmNoYXJDb2RlQXQpO1xuXG52YXIgdG9TdHIgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyk7XG5cbnZhciAkZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyICRhYnMgPSBNYXRoLmFicztcblxudmFyICRPYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xudmFyICRnT1BEID0gJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciAkaXNFeHRlbnNpYmxlID0gJE9iamVjdC5pc0V4dGVuc2libGU7XG5cbi8vIHdoaXRlc3BhY2UgZnJvbTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS41LjQuMjBcbi8vIGltcGxlbWVudGF0aW9uIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2Jsb2IvdjMuNC4wL2VzNS1zaGltLmpzI0wxMzA0LUwxMzI0XG52YXIgd3MgPSBbXG5cdCdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycsXG5cdCdcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOCcsXG5cdCdcXHUyMDI5XFx1RkVGRidcbl0uam9pbignJyk7XG52YXIgdHJpbVJlZ2V4ID0gbmV3IFJlZ0V4cCgnKF5bJyArIHdzICsgJ10rKXwoWycgKyB3cyArICddKyQpJywgJ2cnKTtcbnZhciByZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xudmFyIHRyaW0gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHJlcGxhY2UodmFsdWUsIHRyaW1SZWdleCwgJycpO1xufTtcblxudmFyIEVTNSA9IHJlcXVpcmUoJy4vZXM1Jyk7XG5cbnZhciBoYXNSZWdFeHBNYXRjaGVyID0gcmVxdWlyZSgnaXMtcmVnZXgnKTtcblxuLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWFic3RyYWN0LW9wZXJhdGlvbnNcbnZhciBFUzYgPSBhc3NpZ24oYXNzaWduKHt9LCBFUzUpLCB7XG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWNhbGwtZi12LWFyZ3Ncblx0Q2FsbDogZnVuY3Rpb24gQ2FsbChGLCBWKSB7XG5cdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IFtdO1xuXHRcdGlmICghdGhpcy5Jc0NhbGxhYmxlKEYpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcihGICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHRcdH1cblx0XHRyZXR1cm4gRi5hcHBseShWLCBhcmdzKTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9wcmltaXRpdmVcblx0VG9QcmltaXRpdmU6IHRvUHJpbWl0aXZlLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2Jvb2xlYW5cblx0Ly8gVG9Cb29sZWFuOiBFUzUuVG9Cb29sZWFuLFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b251bWJlclxuXHRUb051bWJlcjogZnVuY3Rpb24gVG9OdW1iZXIoYXJndW1lbnQpIHtcblx0XHR2YXIgdmFsdWUgPSBpc1ByaW1pdGl2ZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCAkTnVtYmVyKTtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAoaXNCaW5hcnkodmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHBhcnNlSW50ZWdlcihzdHJTbGljZSh2YWx1ZSwgMiksIDIpKTtcblx0XHRcdH0gZWxzZSBpZiAoaXNPY3RhbCh2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuVG9OdW1iZXIocGFyc2VJbnRlZ2VyKHN0clNsaWNlKHZhbHVlLCAyKSwgOCkpO1xuXHRcdFx0fSBlbHNlIGlmIChoYXNOb25XUyh2YWx1ZSkgfHwgaXNJbnZhbGlkSGV4TGl0ZXJhbCh2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIE5hTjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciB0cmltbWVkID0gdHJpbSh2YWx1ZSk7XG5cdFx0XHRcdGlmICh0cmltbWVkICE9PSB2YWx1ZSkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHRyaW1tZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAkTnVtYmVyKHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9pbnRlZ2VyXG5cdC8vIFRvSW50ZWdlcjogRVM1LlRvTnVtYmVyLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2ludDMyXG5cdC8vIFRvSW50MzI6IEVTNS5Ub0ludDMyLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3VpbnQzMlxuXHQvLyBUb1VpbnQzMjogRVM1LlRvVWludDMyLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2ludDE2XG5cdFRvSW50MTY6IGZ1bmN0aW9uIFRvSW50MTYoYXJndW1lbnQpIHtcblx0XHR2YXIgaW50MTZiaXQgPSB0aGlzLlRvVWludDE2KGFyZ3VtZW50KTtcblx0XHRyZXR1cm4gaW50MTZiaXQgPj0gMHg4MDAwID8gaW50MTZiaXQgLSAweDEwMDAwIDogaW50MTZiaXQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvdWludDE2XG5cdC8vIFRvVWludDE2OiBFUzUuVG9VaW50MTYsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvaW50OFxuXHRUb0ludDg6IGZ1bmN0aW9uIFRvSW50OChhcmd1bWVudCkge1xuXHRcdHZhciBpbnQ4Yml0ID0gdGhpcy5Ub1VpbnQ4KGFyZ3VtZW50KTtcblx0XHRyZXR1cm4gaW50OGJpdCA+PSAweDgwID8gaW50OGJpdCAtIDB4MTAwIDogaW50OGJpdDtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG91aW50OFxuXHRUb1VpbnQ4OiBmdW5jdGlvbiBUb1VpbnQ4KGFyZ3VtZW50KSB7XG5cdFx0dmFyIG51bWJlciA9IHRoaXMuVG9OdW1iZXIoYXJndW1lbnQpO1xuXHRcdGlmICgkaXNOYU4obnVtYmVyKSB8fCBudW1iZXIgPT09IDAgfHwgISRpc0Zpbml0ZShudW1iZXIpKSB7IHJldHVybiAwOyB9XG5cdFx0dmFyIHBvc0ludCA9IHNpZ24obnVtYmVyKSAqICRmbG9vcigkYWJzKG51bWJlcikpO1xuXHRcdHJldHVybiBtb2QocG9zSW50LCAweDEwMCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvdWludDhjbGFtcFxuXHRUb1VpbnQ4Q2xhbXA6IGZ1bmN0aW9uIFRvVWludDhDbGFtcChhcmd1bWVudCkge1xuXHRcdHZhciBudW1iZXIgPSB0aGlzLlRvTnVtYmVyKGFyZ3VtZW50KTtcblx0XHRpZiAoJGlzTmFOKG51bWJlcikgfHwgbnVtYmVyIDw9IDApIHsgcmV0dXJuIDA7IH1cblx0XHRpZiAobnVtYmVyID49IDB4RkYpIHsgcmV0dXJuIDB4RkY7IH1cblx0XHR2YXIgZiA9ICRmbG9vcihhcmd1bWVudCk7XG5cdFx0aWYgKGYgKyAwLjUgPCBudW1iZXIpIHsgcmV0dXJuIGYgKyAxOyB9XG5cdFx0aWYgKG51bWJlciA8IGYgKyAwLjUpIHsgcmV0dXJuIGY7IH1cblx0XHRpZiAoZiAlIDIgIT09IDApIHsgcmV0dXJuIGYgKyAxOyB9XG5cdFx0cmV0dXJuIGY7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvc3RyaW5nXG5cdFRvU3RyaW5nOiBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzeW1ib2wnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcnKTtcblx0XHR9XG5cdFx0cmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b29iamVjdFxuXHRUb09iamVjdDogZnVuY3Rpb24gVG9PYmplY3QodmFsdWUpIHtcblx0XHR0aGlzLlJlcXVpcmVPYmplY3RDb2VyY2libGUodmFsdWUpO1xuXHRcdHJldHVybiAkT2JqZWN0KHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9wcm9wZXJ0eWtleVxuXHRUb1Byb3BlcnR5S2V5OiBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG5cdFx0dmFyIGtleSA9IHRoaXMuVG9QcmltaXRpdmUoYXJndW1lbnQsICRTdHJpbmcpO1xuXHRcdHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJyA/IGtleSA6IHRoaXMuVG9TdHJpbmcoa2V5KTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9sZW5ndGhcblx0VG9MZW5ndGg6IGZ1bmN0aW9uIFRvTGVuZ3RoKGFyZ3VtZW50KSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMuVG9JbnRlZ2VyKGFyZ3VtZW50KTtcblx0XHRpZiAobGVuIDw9IDApIHsgcmV0dXJuIDA7IH0gLy8gaW5jbHVkZXMgY29udmVydGluZyAtMCB0byArMFxuXHRcdGlmIChsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7IHJldHVybiBNQVhfU0FGRV9JTlRFR0VSOyB9XG5cdFx0cmV0dXJuIGxlbjtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY2Fub25pY2FsbnVtZXJpY2luZGV4c3RyaW5nXG5cdENhbm9uaWNhbE51bWVyaWNJbmRleFN0cmluZzogZnVuY3Rpb24gQ2Fub25pY2FsTnVtZXJpY0luZGV4U3RyaW5nKGFyZ3VtZW50KSB7XG5cdFx0aWYgKHRvU3RyKGFyZ3VtZW50KSAhPT0gJ1tvYmplY3QgU3RyaW5nXScpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdtdXN0IGJlIGEgc3RyaW5nJyk7XG5cdFx0fVxuXHRcdGlmIChhcmd1bWVudCA9PT0gJy0wJykgeyByZXR1cm4gLTA7IH1cblx0XHR2YXIgbiA9IHRoaXMuVG9OdW1iZXIoYXJndW1lbnQpO1xuXHRcdGlmICh0aGlzLlNhbWVWYWx1ZSh0aGlzLlRvU3RyaW5nKG4pLCBhcmd1bWVudCkpIHsgcmV0dXJuIG47IH1cblx0XHRyZXR1cm4gdm9pZCAwO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5cdFJlcXVpcmVPYmplY3RDb2VyY2libGU6IEVTNS5DaGVja09iamVjdENvZXJjaWJsZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNhcnJheVxuXHRJc0FycmF5OiAkQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG5cdFx0cmV0dXJuIHRvU3RyKGFyZ3VtZW50KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNjYWxsYWJsZVxuXHQvLyBJc0NhbGxhYmxlOiBFUzUuSXNDYWxsYWJsZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNjb25zdHJ1Y3RvclxuXHRJc0NvbnN0cnVjdG9yOiBmdW5jdGlvbiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG5cdFx0cmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIWFyZ3VtZW50LnByb3RvdHlwZTsgLy8gdW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vIHdheSB0byB0cnVseSBjaGVjayB0aGlzIHdpdGhvdXQgdHJ5L2NhdGNoIGBuZXcgYXJndW1lbnRgXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzZXh0ZW5zaWJsZS1vXG5cdElzRXh0ZW5zaWJsZTogT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zXG5cdFx0PyBmdW5jdGlvbiBJc0V4dGVuc2libGUob2JqKSB7XG5cdFx0XHRpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJGlzRXh0ZW5zaWJsZShvYmopO1xuXHRcdH1cblx0XHQ6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmopIHsgcmV0dXJuIHRydWU7IH0sIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNpbnRlZ2VyXG5cdElzSW50ZWdlcjogZnVuY3Rpb24gSXNJbnRlZ2VyKGFyZ3VtZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCAhPT0gJ251bWJlcicgfHwgJGlzTmFOKGFyZ3VtZW50KSB8fCAhJGlzRmluaXRlKGFyZ3VtZW50KSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgYWJzID0gJGFicyhhcmd1bWVudCk7XG5cdFx0cmV0dXJuICRmbG9vcihhYnMpID09PSBhYnM7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzcHJvcGVydHlrZXlcblx0SXNQcm9wZXJ0eUtleTogZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuXHRcdHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N5bWJvbCc7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWlzcmVnZXhwXG5cdElzUmVnRXhwOiBmdW5jdGlvbiBJc1JlZ0V4cChhcmd1bWVudCkge1xuXHRcdGlmICghYXJndW1lbnQgfHwgdHlwZW9mIGFyZ3VtZW50ICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoaGFzU3ltYm9scykge1xuXHRcdFx0dmFyIGlzUmVnRXhwID0gYXJndW1lbnRbJFN5bWJvbC5tYXRjaF07XG5cdFx0XHRpZiAodHlwZW9mIGlzUmVnRXhwICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRyZXR1cm4gRVM1LlRvQm9vbGVhbihpc1JlZ0V4cCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBoYXNSZWdFeHBNYXRjaGVyKGFyZ3VtZW50KTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtc2FtZXZhbHVlXG5cdC8vIFNhbWVWYWx1ZTogRVM1LlNhbWVWYWx1ZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtc2FtZXZhbHVlemVyb1xuXHRTYW1lVmFsdWVaZXJvOiBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcblx0XHRyZXR1cm4gKHggPT09IHkpIHx8ICgkaXNOYU4oeCkgJiYgJGlzTmFOKHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogNy4zLjIgR2V0ViAoViwgUClcblx0ICogMS4gQXNzZXJ0OiBJc1Byb3BlcnR5S2V5KFApIGlzIHRydWUuXG5cdCAqIDIuIExldCBPIGJlIFRvT2JqZWN0KFYpLlxuXHQgKiAzLiBSZXR1cm5JZkFicnVwdChPKS5cblx0ICogNC4gUmV0dXJuIE8uW1tHZXRdXShQLCBWKS5cblx0ICovXG5cdEdldFY6IGZ1bmN0aW9uIEdldFYoViwgUCkge1xuXHRcdC8vIDcuMy4yLjFcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cblx0XHQvLyA3LjMuMi4yLTNcblx0XHR2YXIgTyA9IHRoaXMuVG9PYmplY3QoVik7XG5cblx0XHQvLyA3LjMuMi40XG5cdFx0cmV0dXJuIE9bUF07XG5cdH0sXG5cblx0LyoqXG5cdCAqIDcuMy45IC0gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldG1ldGhvZFxuXHQgKiAxLiBBc3NlcnQ6IElzUHJvcGVydHlLZXkoUCkgaXMgdHJ1ZS5cblx0ICogMi4gTGV0IGZ1bmMgYmUgR2V0VihPLCBQKS5cblx0ICogMy4gUmV0dXJuSWZBYnJ1cHQoZnVuYykuXG5cdCAqIDQuIElmIGZ1bmMgaXMgZWl0aGVyIHVuZGVmaW5lZCBvciBudWxsLCByZXR1cm4gdW5kZWZpbmVkLlxuXHQgKiA1LiBJZiBJc0NhbGxhYmxlKGZ1bmMpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uXG5cdCAqIDYuIFJldHVybiBmdW5jLlxuXHQgKi9cblx0R2V0TWV0aG9kOiBmdW5jdGlvbiBHZXRNZXRob2QoTywgUCkge1xuXHRcdC8vIDcuMy45LjFcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cblx0XHQvLyA3LjMuOS4yXG5cdFx0dmFyIGZ1bmMgPSB0aGlzLkdldFYoTywgUCk7XG5cblx0XHQvLyA3LjMuOS40XG5cdFx0aWYgKGZ1bmMgPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHZvaWQgMDtcblx0XHR9XG5cblx0XHQvLyA3LjMuOS41XG5cdFx0aWYgKCF0aGlzLklzQ2FsbGFibGUoZnVuYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKFAgKyAnaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0XHR9XG5cblx0XHQvLyA3LjMuOS42XG5cdFx0cmV0dXJuIGZ1bmM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIDcuMy4xIEdldCAoTywgUCkgLSBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtZ2V0LW8tcFxuXHQgKiAxLiBBc3NlcnQ6IFR5cGUoTykgaXMgT2JqZWN0LlxuXHQgKiAyLiBBc3NlcnQ6IElzUHJvcGVydHlLZXkoUCkgaXMgdHJ1ZS5cblx0ICogMy4gUmV0dXJuIE8uW1tHZXRdXShQLCBPKS5cblx0ICovXG5cdEdldDogZnVuY3Rpb24gR2V0KE8sIFApIHtcblx0XHQvLyA3LjMuMS4xXG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0Ly8gNy4zLjEuMlxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogSXNQcm9wZXJ0eUtleShQKSBpcyBub3QgdHJ1ZScpO1xuXHRcdH1cblx0XHQvLyA3LjMuMS4zXG5cdFx0cmV0dXJuIE9bUF07XG5cdH0sXG5cblx0VHlwZTogZnVuY3Rpb24gVHlwZSh4KSB7XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuICdTeW1ib2wnO1xuXHRcdH1cblx0XHRyZXR1cm4gRVM1LlR5cGUoeCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxuXHRTcGVjaWVzQ29uc3RydWN0b3I6IGZ1bmN0aW9uIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHR2YXIgQyA9IE8uY29uc3RydWN0b3I7XG5cdFx0aWYgKHR5cGVvZiBDID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGRlZmF1bHRDb25zdHJ1Y3Rvcjtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShDKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPLmNvbnN0cnVjdG9yIGlzIG5vdCBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0dmFyIFMgPSBoYXNTeW1ib2xzICYmICRTeW1ib2wuc3BlY2llcyA/IENbJFN5bWJvbC5zcGVjaWVzXSA6IHZvaWQgMDtcblx0XHRpZiAoUyA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdENvbnN0cnVjdG9yO1xuXHRcdH1cblx0XHRpZiAodGhpcy5Jc0NvbnN0cnVjdG9yKFMpKSB7XG5cdFx0XHRyZXR1cm4gUztcblx0XHR9XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ25vIGNvbnN0cnVjdG9yIGZvdW5kJyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNvbXBsZXRlcHJvcGVydHlkZXNjcmlwdG9yXG5cdENvbXBsZXRlUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBDb21wbGV0ZVByb3BlcnR5RGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignRGVzYyBtdXN0IGJlIGEgUHJvcGVydHkgRGVzY3JpcHRvcicpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLklzR2VuZXJpY0Rlc2NyaXB0b3IoRGVzYykgfHwgdGhpcy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRpZiAoIWhhcyhEZXNjLCAnW1tWYWx1ZV1dJykpIHtcblx0XHRcdFx0RGVzY1snW1tWYWx1ZV1dJ10gPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWhhcyhEZXNjLCAnW1tXcml0YWJsZV1dJykpIHtcblx0XHRcdFx0RGVzY1snW1tXcml0YWJsZV1dJ10gPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbR2V0XV0nKSkge1xuXHRcdFx0XHREZXNjWydbW0dldF1dJ10gPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWhhcyhEZXNjLCAnW1tTZXRdXScpKSB7XG5cdFx0XHRcdERlc2NbJ1tbU2V0XV0nXSA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFoYXMoRGVzYywgJ1tbRW51bWVyYWJsZV1dJykpIHtcblx0XHRcdERlc2NbJ1tbRW51bWVyYWJsZV1dJ10gPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFoYXMoRGVzYywgJ1tbQ29uZmlndXJhYmxlXV0nKSkge1xuXHRcdFx0RGVzY1snW1tDb25maWd1cmFibGVdXSddID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBEZXNjO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zZXQtby1wLXYtdGhyb3dcblx0U2V0OiBmdW5jdGlvbiBTZXQoTywgUCwgViwgVGhyb3cpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ08gbXVzdCBiZSBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdQIG11c3QgYmUgYSBQcm9wZXJ0eSBLZXknKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShUaHJvdykgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1Rocm93IG11c3QgYmUgYSBCb29sZWFuJyk7XG5cdFx0fVxuXHRcdGlmIChUaHJvdykge1xuXHRcdFx0T1tQXSA9IFY7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0T1tQXSA9IFY7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWhhc293bnByb3BlcnR5XG5cdEhhc093blByb3BlcnR5OiBmdW5jdGlvbiBIYXNPd25Qcm9wZXJ0eShPLCBQKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdHJldHVybiBoYXMoTywgUCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWhhc3Byb3BlcnR5XG5cdEhhc1Byb3BlcnR5OiBmdW5jdGlvbiBIYXNQcm9wZXJ0eShPLCBQKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdHJldHVybiBQIGluIE87XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWlzY29uY2F0c3ByZWFkYWJsZVxuXHRJc0NvbmNhdFNwcmVhZGFibGU6IGZ1bmN0aW9uIElzQ29uY2F0U3ByZWFkYWJsZShPKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGhhc1N5bWJvbHMgJiYgdHlwZW9mICRTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlID09PSAnc3ltYm9sJykge1xuXHRcdFx0dmFyIHNwcmVhZGFibGUgPSB0aGlzLkdldChPLCBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlKTtcblx0XHRcdGlmICh0eXBlb2Ygc3ByZWFkYWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuVG9Cb29sZWFuKHNwcmVhZGFibGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5Jc0FycmF5KE8pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pbnZva2Vcblx0SW52b2tlOiBmdW5jdGlvbiBJbnZva2UoTywgUCkge1xuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdHZhciBhcmd1bWVudHNMaXN0ID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDIpO1xuXHRcdHZhciBmdW5jID0gdGhpcy5HZXRWKE8sIFApO1xuXHRcdHJldHVybiB0aGlzLkNhbGwoZnVuYywgTywgYXJndW1lbnRzTGlzdCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldGl0ZXJhdG9yXG5cdEdldEl0ZXJhdG9yOiBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmosIG1ldGhvZCkge1xuXHRcdGlmICghaGFzU3ltYm9scykge1xuXHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKCdFUy5HZXRJdGVyYXRvciBkZXBlbmRzIG9uIG5hdGl2ZSBpdGVyYXRvciBzdXBwb3J0LicpO1xuXHRcdH1cblxuXHRcdHZhciBhY3R1YWxNZXRob2QgPSBtZXRob2Q7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0XHRhY3R1YWxNZXRob2QgPSB0aGlzLkdldE1ldGhvZChvYmosICRTeW1ib2wuaXRlcmF0b3IpO1xuXHRcdH1cblx0XHR2YXIgaXRlcmF0b3IgPSB0aGlzLkNhbGwoYWN0dWFsTWV0aG9kLCBvYmopO1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlcmF0b3IpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpdGVyYXRvcjtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXRlcmF0b3JuZXh0XG5cdEl0ZXJhdG9yTmV4dDogZnVuY3Rpb24gSXRlcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWx1ZSkge1xuXHRcdHZhciByZXN1bHQgPSB0aGlzLkludm9rZShpdGVyYXRvciwgJ25leHQnLCBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFtdIDogW3ZhbHVlXSk7XG5cdFx0aWYgKHRoaXMuVHlwZShyZXN1bHQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIG5leHQgbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9yY29tcGxldGVcblx0SXRlcmF0b3JDb21wbGV0ZTogZnVuY3Rpb24gSXRlcmF0b3JDb21wbGV0ZShpdGVyUmVzdWx0KSB7XG5cdFx0aWYgKHRoaXMuVHlwZShpdGVyUmVzdWx0KSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKGl0ZXJSZXN1bHQpIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuVG9Cb29sZWFuKHRoaXMuR2V0KGl0ZXJSZXN1bHQsICdkb25lJykpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pdGVyYXRvcnZhbHVlXG5cdEl0ZXJhdG9yVmFsdWU6IGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlclJlc3VsdCkgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShpdGVyUmVzdWx0KSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLkdldChpdGVyUmVzdWx0LCAndmFsdWUnKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXRlcmF0b3JzdGVwXG5cdEl0ZXJhdG9yU3RlcDogZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMuSXRlcmF0b3JOZXh0KGl0ZXJhdG9yKTtcblx0XHR2YXIgZG9uZSA9IHRoaXMuSXRlcmF0b3JDb21wbGV0ZShyZXN1bHQpO1xuXHRcdHJldHVybiBkb25lID09PSB0cnVlID8gZmFsc2UgOiByZXN1bHQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9yY2xvc2Vcblx0SXRlcmF0b3JDbG9zZTogZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbikge1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlcmF0b3IpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoaXRlcmF0b3IpIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzQ2FsbGFibGUoY29tcGxldGlvbikpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBjb21wbGV0aW9uIGlzIG5vdCBhIHRodW5rIGZvciBhIENvbXBsZXRpb24gUmVjb3JkJyk7XG5cdFx0fVxuXHRcdHZhciBjb21wbGV0aW9uVGh1bmsgPSBjb21wbGV0aW9uO1xuXG5cdFx0dmFyIGl0ZXJhdG9yUmV0dXJuID0gdGhpcy5HZXRNZXRob2QoaXRlcmF0b3IsICdyZXR1cm4nKTtcblxuXHRcdGlmICh0eXBlb2YgaXRlcmF0b3JSZXR1cm4gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gY29tcGxldGlvblRodW5rKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbXBsZXRpb25SZWNvcmQ7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBpbm5lclJlc3VsdCA9IHRoaXMuQ2FsbChpdGVyYXRvclJldHVybiwgaXRlcmF0b3IsIFtdKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHQvLyBpZiB3ZSBoaXQgaGVyZSwgdGhlbiBcImVcIiBpcyB0aGUgaW5uZXJSZXN1bHQgY29tcGxldGlvbiB0aGF0IG5lZWRzIHJlLXRocm93aW5nXG5cblx0XHRcdC8vIGlmIHRoZSBjb21wbGV0aW9uIGlzIG9mIHR5cGUgXCJ0aHJvd1wiLCB0aGlzIHdpbGwgdGhyb3cuXG5cdFx0XHRjb21wbGV0aW9uUmVjb3JkID0gY29tcGxldGlvblRodW5rKCk7XG5cdFx0XHRjb21wbGV0aW9uVGh1bmsgPSBudWxsOyAvLyBlbnN1cmUgaXQncyBub3QgY2FsbGVkIHR3aWNlLlxuXG5cdFx0XHQvLyBpZiBub3QsIHRoZW4gcmV0dXJuIHRoZSBpbm5lclJlc3VsdCBjb21wbGV0aW9uXG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0XHRjb21wbGV0aW9uUmVjb3JkID0gY29tcGxldGlvblRodW5rKCk7IC8vIGlmIGlubmVyUmVzdWx0IHdvcmtlZCwgdGhlbiB0aHJvdyBpZiB0aGUgY29tcGxldGlvbiBkb2VzXG5cdFx0Y29tcGxldGlvblRodW5rID0gbnVsbDsgLy8gZW5zdXJlIGl0J3Mgbm90IGNhbGxlZCB0d2ljZS5cblxuXHRcdGlmICh0aGlzLlR5cGUoaW5uZXJSZXN1bHQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIC5yZXR1cm4gbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBsZXRpb25SZWNvcmQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNyZWF0ZWl0ZXJyZXN1bHRvYmplY3Rcblx0Q3JlYXRlSXRlclJlc3VsdE9iamVjdDogZnVuY3Rpb24gQ3JlYXRlSXRlclJlc3VsdE9iamVjdCh2YWx1ZSwgZG9uZSkge1xuXHRcdGlmICh0aGlzLlR5cGUoZG9uZSkgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoZG9uZSkgaXMgbm90IEJvb2xlYW4nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGRvbmU6IGRvbmVcblx0XHR9O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1yZWdleHBleGVjXG5cdFJlZ0V4cEV4ZWM6IGZ1bmN0aW9uIFJlZ0V4cEV4ZWMoUiwgUykge1xuXHRcdGlmICh0aGlzLlR5cGUoUikgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUiBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKFMpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1MgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0XHR2YXIgZXhlYyA9IHRoaXMuR2V0KFIsICdleGVjJyk7XG5cdFx0aWYgKHRoaXMuSXNDYWxsYWJsZShleGVjKSkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IHRoaXMuQ2FsbChleGVjLCBSLCBbU10pO1xuXHRcdFx0aWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0aGlzLlR5cGUocmVzdWx0KSA9PT0gJ09iamVjdCcpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImV4ZWNcIiBtZXRob2QgbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVnZXhFeGVjKFIsIFMpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcblx0QXJyYXlTcGVjaWVzQ3JlYXRlOiBmdW5jdGlvbiBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG5cdFx0aWYgKCF0aGlzLklzSW50ZWdlcihsZW5ndGgpIHx8IGxlbmd0aCA8IDApIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDAnKTtcblx0XHR9XG5cdFx0dmFyIGxlbiA9IGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGg7XG5cdFx0dmFyIEM7XG5cdFx0dmFyIGlzQXJyYXkgPSB0aGlzLklzQXJyYXkob3JpZ2luYWxBcnJheSk7XG5cdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdEMgPSB0aGlzLkdldChvcmlnaW5hbEFycmF5LCAnY29uc3RydWN0b3InKTtcblx0XHRcdC8vIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgYSBjcm9zcy1yZWFsbSBub3JtYWwgQXJyYXksIGEgc2FtZS1yZWFsbSBBcnJheVxuXHRcdFx0Ly8gaWYgKHRoaXMuSXNDb25zdHJ1Y3RvcihDKSkge1xuXHRcdFx0Ly8gXHRpZiBDIGlzIGFub3RoZXIgcmVhbG0ncyBBcnJheSwgQyA9IHVuZGVmaW5lZFxuXHRcdFx0Ly8gXHRPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihBcnJheSkpKSA9PT0gbnVsbCA/XG5cdFx0XHQvLyB9XG5cdFx0XHRpZiAodGhpcy5UeXBlKEMpID09PSAnT2JqZWN0JyAmJiBoYXNTeW1ib2xzICYmICRTeW1ib2wuc3BlY2llcykge1xuXHRcdFx0XHRDID0gdGhpcy5HZXQoQywgJFN5bWJvbC5zcGVjaWVzKTtcblx0XHRcdFx0aWYgKEMgPT09IG51bGwpIHtcblx0XHRcdFx0XHRDID0gdm9pZCAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgQyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiAkQXJyYXkobGVuKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzQ29uc3RydWN0b3IoQykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdDIG11c3QgYmUgYSBjb25zdHJ1Y3RvcicpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IEMobGVuKTsgLy8gdGhpcy5Db25zdHJ1Y3QoQywgbGVuKTtcblx0fSxcblxuXHRDcmVhdGVEYXRhUHJvcGVydHk6IGZ1bmN0aW9uIENyZWF0ZURhdGFQcm9wZXJ0eShPLCBQLCBWKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXHRcdHZhciBvbGREZXNjID0gJGdPUEQoTywgUCk7XG5cdFx0dmFyIGV4dGVuc2libGUgPSBvbGREZXNjIHx8ICh0eXBlb2YgJGlzRXh0ZW5zaWJsZSAhPT0gJ2Z1bmN0aW9uJyB8fCAkaXNFeHRlbnNpYmxlKE8pKTtcblx0XHR2YXIgaW1tdXRhYmxlID0gb2xkRGVzYyAmJiAoIW9sZERlc2Mud3JpdGFibGUgfHwgIW9sZERlc2MuY29uZmlndXJhYmxlKTtcblx0XHRpZiAoaW1tdXRhYmxlIHx8ICFleHRlbnNpYmxlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHZhciBuZXdEZXNjID0ge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBWLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9O1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBuZXdEZXNjKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY3JlYXRlZGF0YXByb3BlcnR5b3J0aHJvd1xuXHRDcmVhdGVEYXRhUHJvcGVydHlPclRocm93OiBmdW5jdGlvbiBDcmVhdGVEYXRhUHJvcGVydHlPclRocm93KE8sIFAsIFYpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cdFx0dmFyIHN1Y2Nlc3MgPSB0aGlzLkNyZWF0ZURhdGFQcm9wZXJ0eShPLCBQLCBWKTtcblx0XHRpZiAoIXN1Y2Nlc3MpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCd1bmFibGUgdG8gY3JlYXRlIGRhdGEgcHJvcGVydHknKTtcblx0XHR9XG5cdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3RjcmVhdGVcblx0T2JqZWN0Q3JlYXRlOiBmdW5jdGlvbiBPYmplY3RDcmVhdGUocHJvdG8sIGludGVybmFsU2xvdHNMaXN0KSB7XG5cdFx0aWYgKHByb3RvICE9PSBudWxsICYmIHRoaXMuVHlwZShwcm90bykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogcHJvdG8gbXVzdCBiZSBudWxsIG9yIGFuIG9iamVjdCcpO1xuXHRcdH1cblx0XHR2YXIgc2xvdHMgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFtdIDogaW50ZXJuYWxTbG90c0xpc3Q7XG5cdFx0aWYgKHNsb3RzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2VzLWFic3RyYWN0IGRvZXMgbm90IHlldCBzdXBwb3J0IGludGVybmFsIHNsb3RzJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHByb3RvID09PSBudWxsICYmICEkT2JqZWN0Q3JlYXRlKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCduYXRpdmUgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBudWxsIG9iamVjdHMnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJE9iamVjdENyZWF0ZShwcm90byk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWFkdmFuY2VzdHJpbmdpbmRleFxuXHRBZHZhbmNlU3RyaW5nSW5kZXg6IGZ1bmN0aW9uIEFkdmFuY2VTdHJpbmdJbmRleChTLCBpbmRleCwgdW5pY29kZSkge1xuXHRcdGlmICh0aGlzLlR5cGUoUykgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUyBtdXN0IGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc0ludGVnZXIoaW5kZXgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDAgYW5kIDw9IDIqKjUzJyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLlR5cGUodW5pY29kZSkgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IHVuaWNvZGUgbXVzdCBiZSBhIEJvb2xlYW4nKTtcblx0XHR9XG5cdFx0aWYgKCF1bmljb2RlKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblx0XHR2YXIgbGVuZ3RoID0gUy5sZW5ndGg7XG5cdFx0aWYgKChpbmRleCArIDEpID49IGxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cblx0XHR2YXIgZmlyc3QgPSAkY2hhckNvZGVBdChTLCBpbmRleCk7XG5cdFx0aWYgKGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHZhciBzZWNvbmQgPSAkY2hhckNvZGVBdChTLCBpbmRleCArIDEpO1xuXHRcdGlmIChzZWNvbmQgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbmRleCArIDI7XG5cdH1cbn0pO1xuXG5kZWxldGUgRVM2LkNoZWNrT2JqZWN0Q29lcmNpYmxlOyAvLyByZW5hbWVkIGluIEVTNiB0byBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlXG5cbm1vZHVsZS5leHBvcnRzID0gRVM2O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVMyMDE1ID0gcmVxdWlyZSgnLi9lczIwMTUnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG5cbnZhciBFUzIwMTYgPSBhc3NpZ24oYXNzaWduKHt9LCBFUzIwMTUpLCB7XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L2VjbWEyNjIvcHVsbC82MFxuXHRTYW1lVmFsdWVOb25OdW1iZXI6IGZ1bmN0aW9uIFNhbWVWYWx1ZU5vbk51bWJlcih4LCB5KSB7XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgeCAhPT0gdHlwZW9mIHkpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1NhbWVWYWx1ZU5vbk51bWJlciByZXF1aXJlcyB0d28gbm9uLW51bWJlciB2YWx1ZXMgb2YgdGhlIHNhbWUgdHlwZS4nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuU2FtZVZhbHVlKHgsIHkpO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFUzIwMTY7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0L2VzNycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaXNFbnVtZXJhYmxlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbHVlcyhPKSB7XG5cdHZhciBvYmogPSBFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKE8pO1xuXHR2YXIgdmFscyA9IFtdO1xuXHRmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdFx0aWYgKGhhcyhvYmosIGtleSkgJiYgaXNFbnVtZXJhYmxlKG9iaiwga2V5KSkge1xuXHRcdFx0dmFscy5wdXNoKG9ialtrZXldKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHZhbHM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdHJldHVybiB0eXBlb2YgT2JqZWN0LnZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC52YWx1ZXMgOiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG52YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXG5kZWZpbmUocG9seWZpbGwsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvbHlmaWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltVmFsdWVzKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoT2JqZWN0LCB7IHZhbHVlczogcG9seWZpbGwgfSwge1xuXHRcdHZhbHVlczogZnVuY3Rpb24gdGVzdFZhbHVlcygpIHtcblx0XHRcdHJldHVybiBPYmplY3QudmFsdWVzICE9PSBwb2x5ZmlsbDtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdmFsdWVzID0gcmVxdWlyZSgnb2JqZWN0LnZhbHVlcycpO1xuaWYgKCFPYmplY3QudmFsdWVzKSB7XG4gICAgdmFsdWVzLnNoaW0oKTtcbn1cblxuXG52YXIgQ1NTQ2xhc3NMaXN0ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMucGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgdGhpcy5jbGFzc05hbWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuY2xhc3NBdHRyID0gbnVsbDtcbiAgICAvL3RoaXMuY2xhc3NWYWx1ZSA9IG51bGw7XG59O1xuXG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuaGFzQ2xhc3MgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNsYXNzQXR0ciA9IHsgLy8gZW1wdHkgY2xhc3MgYXR0clxuICAgICAgICAnbmFtZSc6ICdjbGFzcycsXG4gICAgICAgICd2YWx1ZSc6IG51bGxcbiAgICB9O1xuXG4gICAgdGhpcy5hZGRDbGFzc0hhbmRsZXIoKTtcbn07XG5cblxuLy8gYXR0ci5jbGFzc1xuXG5DU1NDbGFzc0xpc3QucHJvdG90eXBlLmFkZENsYXNzSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucGFyZW50Tm9kZS5hdHRycywgJ2NsYXNzJywge1xuICAgICAgICBnZXQ6IHRoaXMuZ2V0Q2xhc3NBdHRyLmJpbmQodGhpcyksXG4gICAgICAgIHNldDogdGhpcy5zZXRDbGFzc0F0dHIuYmluZCh0aGlzKSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENsYXNzVmFsdWVIYW5kbGVyKCk7XG59O1xuXG4vLyBhdHRyLmNsYXNzLnZhbHVlXG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuYWRkQ2xhc3NWYWx1ZUhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmNsYXNzQXR0ciwgJ3ZhbHVlJywge1xuICAgICAgICBnZXQ6IHRoaXMuZ2V0Q2xhc3NWYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBzZXQ6IHRoaXMuc2V0Q2xhc3NWYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbn07XG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuZ2V0Q2xhc3NBdHRyID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NBdHRyO1xufTtcblxuQ1NTQ2xhc3NMaXN0LnByb3RvdHlwZS5zZXRDbGFzc0F0dHIgPSBmdW5jdGlvbihuZXdDbGFzc0F0dHIpIHtcbiAgICB0aGlzLnNldENsYXNzVmFsdWUobmV3Q2xhc3NBdHRyLnZhbHVlKTsgLy8gbXVzdCBiZWZvcmUgYXBwbHlpbmcgdmFsdWUgaGFuZGxlciFcblxuICAgIHRoaXMuY2xhc3NBdHRyID0gbmV3Q2xhc3NBdHRyO1xuICAgIHRoaXMuYWRkQ2xhc3NWYWx1ZUhhbmRsZXIoKTtcbn07XG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuZ2V0Q2xhc3NWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcnJDbGFzc05hbWVzID0gQXJyYXkuZnJvbSh0aGlzLmNsYXNzTmFtZXMpO1xuICAgIHJldHVybiBhcnJDbGFzc05hbWVzLmpvaW4oJyAnKTtcbn07XG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuc2V0Q2xhc3NWYWx1ZSA9IGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgaWYodHlwZW9mIG5ld1ZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jbGFzc05hbWVzLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBhcnJDbGFzc05hbWVzID0gbmV3VmFsdWUuc3BsaXQoJyAnKTtcbiAgICB0aGlzLmNsYXNzTmFtZXMgPSBuZXcgU2V0KGFyckNsYXNzTmFtZXMpO1xufTtcblxuXG5DU1NDbGFzc0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKC8qIHZhcmlhZGljICovKSB7XG4gICAgdGhpcy5oYXNDbGFzcygpO1xuICAgIE9iamVjdC52YWx1ZXMoYXJndW1lbnRzKS5mb3JFYWNoKHRoaXMuX2FkZFNpbmdsZS5iaW5kKHRoaXMpKTtcbn07XG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuX2FkZFNpbmdsZSA9IGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgIHRoaXMuY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTtcbn07XG5cblxuQ1NTQ2xhc3NMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigvKiB2YXJpYWRpYyAqLykge1xuICAgIHRoaXMuaGFzQ2xhc3MoKTtcbiAgICBPYmplY3QudmFsdWVzKGFyZ3VtZW50cykuZm9yRWFjaCh0aGlzLl9yZW1vdmVTaW5nbGUuYmluZCh0aGlzKSk7XG59O1xuXG5DU1NDbGFzc0xpc3QucHJvdG90eXBlLl9yZW1vdmVTaW5nbGUgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICB0aGlzLmNsYXNzTmFtZXMuZGVsZXRlKGNsYXNzTmFtZSk7XG59O1xuXG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuaXRlbSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgdmFyIGFyckNsYXNzTmFtZXMgPSBBcnJheS5mcm9tKHRoaXMuY2xhc3NOYW1lcyk7XG4gICAgcmV0dXJuIGFyckNsYXNzTmFtZXNbaW5kZXhdO1xufTtcblxuQ1NTQ2xhc3NMaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbihjbGFzc05hbWUsIGZvcmNlKSB7XG4gICAgaWYodGhpcy5jb250YWlucyhjbGFzc05hbWUpIHx8IGZvcmNlID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZXMuZGVsZXRlKGNsYXNzTmFtZSk7XG4gICAgfVxuICAgIHRoaXMuY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTtcbn07XG5cbkNTU0NsYXNzTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc05hbWVzLmhhcyhjbGFzc05hbWUpO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IENTU0NsYXNzTGlzdDsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUN1c3RvbUVycm9yKG5hbWUsIG1lc3NhZ2UpIHtcbiAgICAvLyB1c2UgT2JqZWN0LmNyZWF0ZSgpLCBiZWNhdXNlIHNvbWUgVk1zIHByZXZlbnQgc2V0dGluZyBsaW5lL2NvbHVtbiBvdGhlcndpc2VcbiAgICAvLyAoaU9TIFNhZmFyaSAxMCBldmVuIHRocm93cyBhbiBleGNlcHRpb24pXG4gICAgdmFyIGVycm9yID0gT2JqZWN0LmNyZWF0ZShTeW50YXhFcnJvci5wcm90b3R5cGUpO1xuICAgIHZhciBlcnJvclN0YWNrID0gbmV3IEVycm9yKCk7XG5cbiAgICBlcnJvci5uYW1lID0gbmFtZTtcbiAgICBlcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIChlcnJvclN0YWNrLnN0YWNrIHx8ICcnKS5yZXBsYWNlKC9eKC4rXFxuKXsxLDN9LywgbmFtZSArICc6ICcgKyBtZXNzYWdlICsgJ1xcbicpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXJyb3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyB0b2tlbiB0eXBlcyAobm90ZTogdmFsdWUgc2hvdWxkbid0IGludGVyc2VjdCB3aXRoIHVzZWQgY2hhciBjb2RlcylcbnZhciBXSElURVNQQUNFID0gMTtcbnZhciBJREVOVElGSUVSID0gMjtcbnZhciBOVU1CRVIgPSAzO1xudmFyIFNUUklORyA9IDQ7XG52YXIgQ09NTUVOVCA9IDU7XG52YXIgUFVOQ1RVQVRPUiA9IDY7XG52YXIgQ0RPID0gNztcbnZhciBDREMgPSA4O1xudmFyIEFUUlVMRSA9IDE0O1xudmFyIEZVTkNUSU9OID0gMTU7XG52YXIgVVJMID0gMTY7XG52YXIgUkFXID0gMTc7XG5cbnZhciBUQUIgPSA5O1xudmFyIE4gPSAxMDtcbnZhciBGID0gMTI7XG52YXIgUiA9IDEzO1xudmFyIFNQQUNFID0gMzI7XG5cbnZhciBUWVBFID0ge1xuICAgIFdoaXRlU3BhY2U6ICAgV0hJVEVTUEFDRSxcbiAgICBJZGVudGlmaWVyOiAgIElERU5USUZJRVIsXG4gICAgTnVtYmVyOiAgICAgICAgICAgTlVNQkVSLFxuICAgIFN0cmluZzogICAgICAgICAgIFNUUklORyxcbiAgICBDb21tZW50OiAgICAgICAgIENPTU1FTlQsXG4gICAgUHVuY3R1YXRvcjogICBQVU5DVFVBVE9SLFxuICAgIENETzogICAgICAgICAgICAgICAgIENETyxcbiAgICBDREM6ICAgICAgICAgICAgICAgICBDREMsXG4gICAgQXRydWxlOiAgICAgICAgICAgQVRSVUxFLFxuICAgIEZ1bmN0aW9uOiAgICAgICBGVU5DVElPTixcbiAgICBVcmw6ICAgICAgICAgICAgICAgICBVUkwsXG4gICAgUmF3OiAgICAgICAgICAgICAgICAgUkFXLFxuXG4gICAgRXhjbGFtYXRpb25NYXJrOiAgICAgIDMzLCAgLy8gIVxuICAgIFF1b3RhdGlvbk1hcms6ICAgICAgICAzNCwgIC8vIFwiXG4gICAgTnVtYmVyU2lnbjogICAgICAgICAgIDM1LCAgLy8gI1xuICAgIERvbGxhclNpZ246ICAgICAgICAgICAzNiwgIC8vICRcbiAgICBQZXJjZW50U2lnbjogICAgICAgICAgMzcsICAvLyAlXG4gICAgQW1wZXJzYW5kOiAgICAgICAgICAgIDM4LCAgLy8gJlxuICAgIEFwb3N0cm9waGU6ICAgICAgICAgICAzOSwgIC8vICdcbiAgICBMZWZ0UGFyZW50aGVzaXM6ICAgICAgNDAsICAvLyAoXG4gICAgUmlnaHRQYXJlbnRoZXNpczogICAgIDQxLCAgLy8gKVxuICAgIEFzdGVyaXNrOiAgICAgICAgICAgICA0MiwgIC8vICpcbiAgICBQbHVzU2lnbjogICAgICAgICAgICAgNDMsICAvLyArXG4gICAgQ29tbWE6ICAgICAgICAgICAgICAgIDQ0LCAgLy8gLFxuICAgIEh5cGhlbk1pbnVzOiAgICAgICAgICA0NSwgIC8vIC1cbiAgICBGdWxsU3RvcDogICAgICAgICAgICAgNDYsICAvLyAuXG4gICAgU29saWR1czogICAgICAgICAgICAgIDQ3LCAgLy8gL1xuICAgIENvbG9uOiAgICAgICAgICAgICAgICA1OCwgIC8vIDpcbiAgICBTZW1pY29sb246ICAgICAgICAgICAgNTksICAvLyA7XG4gICAgTGVzc1RoYW5TaWduOiAgICAgICAgIDYwLCAgLy8gPFxuICAgIEVxdWFsc1NpZ246ICAgICAgICAgICA2MSwgIC8vID1cbiAgICBHcmVhdGVyVGhhblNpZ246ICAgICAgNjIsICAvLyA+XG4gICAgUXVlc3Rpb25NYXJrOiAgICAgICAgIDYzLCAgLy8gP1xuICAgIENvbW1lcmNpYWxBdDogICAgICAgICA2NCwgIC8vIEBcbiAgICBMZWZ0U3F1YXJlQnJhY2tldDogICAgOTEsICAvLyBbXG4gICAgQmFja3NsYXNoOiAgICAgICAgICAgIDkyLCAgLy8gXFxcbiAgICBSaWdodFNxdWFyZUJyYWNrZXQ6ICAgOTMsICAvLyBdXG4gICAgQ2lyY3VtZmxleEFjY2VudDogICAgIDk0LCAgLy8gXlxuICAgIExvd0xpbmU6ICAgICAgICAgICAgICA5NSwgIC8vIF9cbiAgICBHcmF2ZUFjY2VudDogICAgICAgICAgOTYsICAvLyBgXG4gICAgTGVmdEN1cmx5QnJhY2tldDogICAgMTIzLCAgLy8ge1xuICAgIFZlcnRpY2FsTGluZTogICAgICAgIDEyNCwgIC8vIHxcbiAgICBSaWdodEN1cmx5QnJhY2tldDogICAxMjUsICAvLyB9XG4gICAgVGlsZGU6ICAgICAgICAgICAgICAgMTI2ICAgLy8gflxufTtcblxudmFyIE5BTUUgPSBPYmplY3Qua2V5cyhUWVBFKS5yZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBrZXkpIHtcbiAgICByZXN1bHRbVFlQRVtrZXldXSA9IGtleTtcbiAgICByZXR1cm4gcmVzdWx0O1xufSwge30pO1xuXG4vLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC8jdG9rZW5pemVyLWRlZmluaXRpb25zXG4vLyA+IG5vbi1BU0NJSSBjb2RlIHBvaW50XG4vLyA+ICAgQSBjb2RlIHBvaW50IHdpdGggYSB2YWx1ZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gVSswMDgwIDxjb250cm9sPlxuLy8gPiBuYW1lLXN0YXJ0IGNvZGUgcG9pbnRcbi8vID4gICBBIGxldHRlciwgYSBub24tQVNDSUkgY29kZSBwb2ludCwgb3IgVSswMDVGIExPVyBMSU5FIChfKS5cbi8vID4gbmFtZSBjb2RlIHBvaW50XG4vLyA+ICAgQSBuYW1lLXN0YXJ0IGNvZGUgcG9pbnQsIGEgZGlnaXQsIG9yIFUrMDAyRCBIWVBIRU4tTUlOVVMgKC0pXG4vLyBUaGF0IG1lYW5zIG9ubHkgQVNDSUkgY29kZSBwb2ludHMgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGFuZCB3ZSBhIG1hcHMgZm9yIDAuLjEyNyBjb2RlcyBvbmx5XG52YXIgU2FmZVVpbnQzMkFycmF5ID0gdHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQzMkFycmF5IDogQXJyYXk7IC8vIGZhbGxiYWNrIG9uIEFycmF5IHdoZW4gVHlwZWRBcnJheSBpcyBub3Qgc3VwcG9ydGVkXG52YXIgU1lNQk9MX1RZUEUgPSBuZXcgU2FmZVVpbnQzMkFycmF5KDB4ODApO1xudmFyIFBVTkNUVUFUSU9OID0gbmV3IFNhZmVVaW50MzJBcnJheSgweDgwKTtcbnZhciBTVE9QX1VSTF9SQVcgPSBuZXcgU2FmZVVpbnQzMkFycmF5KDB4ODApO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IFNZTUJPTF9UWVBFLmxlbmd0aDsgaSsrKSB7XG4gICAgU1lNQk9MX1RZUEVbaV0gPSBJREVOVElGSUVSO1xufVxuXG4vLyBmaWxsIGNhdGVnb3JpZXNcbltcbiAgICBUWVBFLkV4Y2xhbWF0aW9uTWFyaywgICAgLy8gIVxuICAgIFRZUEUuUXVvdGF0aW9uTWFyaywgICAgICAvLyBcIlxuICAgIFRZUEUuTnVtYmVyU2lnbiwgICAgICAgICAvLyAjXG4gICAgVFlQRS5Eb2xsYXJTaWduLCAgICAgICAgIC8vICRcbiAgICBUWVBFLlBlcmNlbnRTaWduLCAgICAgICAgLy8gJVxuICAgIFRZUEUuQW1wZXJzYW5kLCAgICAgICAgICAvLyAmXG4gICAgVFlQRS5BcG9zdHJvcGhlLCAgICAgICAgIC8vICdcbiAgICBUWVBFLkxlZnRQYXJlbnRoZXNpcywgICAgLy8gKFxuICAgIFRZUEUuUmlnaHRQYXJlbnRoZXNpcywgICAvLyApXG4gICAgVFlQRS5Bc3RlcmlzaywgICAgICAgICAgIC8vICpcbiAgICBUWVBFLlBsdXNTaWduLCAgICAgICAgICAgLy8gK1xuICAgIFRZUEUuQ29tbWEsICAgICAgICAgICAgICAvLyAsXG4gICAgVFlQRS5IeXBoZW5NaW51cywgICAgICAgIC8vIC1cbiAgICBUWVBFLkZ1bGxTdG9wLCAgICAgICAgICAgLy8gLlxuICAgIFRZUEUuU29saWR1cywgICAgICAgICAgICAvLyAvXG4gICAgVFlQRS5Db2xvbiwgICAgICAgICAgICAgIC8vIDpcbiAgICBUWVBFLlNlbWljb2xvbiwgICAgICAgICAgLy8gO1xuICAgIFRZUEUuTGVzc1RoYW5TaWduLCAgICAgICAvLyA8XG4gICAgVFlQRS5FcXVhbHNTaWduLCAgICAgICAgIC8vID1cbiAgICBUWVBFLkdyZWF0ZXJUaGFuU2lnbiwgICAgLy8gPlxuICAgIFRZUEUuUXVlc3Rpb25NYXJrLCAgICAgICAvLyA/XG4gICAgVFlQRS5Db21tZXJjaWFsQXQsICAgICAgIC8vIEBcbiAgICBUWVBFLkxlZnRTcXVhcmVCcmFja2V0LCAgLy8gW1xuICAgIC8vIFRZUEUuQmFja3NsYXNoLCAgICAgICAgICAvLyBcXFxuICAgIFRZUEUuUmlnaHRTcXVhcmVCcmFja2V0LCAvLyBdXG4gICAgVFlQRS5DaXJjdW1mbGV4QWNjZW50LCAgIC8vIF5cbiAgICAvLyBUWVBFLkxvd0xpbmUsICAgICAgICAgICAgLy8gX1xuICAgIFRZUEUuR3JhdmVBY2NlbnQsICAgICAgICAvLyBgXG4gICAgVFlQRS5MZWZ0Q3VybHlCcmFja2V0LCAgIC8vIHtcbiAgICBUWVBFLlZlcnRpY2FsTGluZSwgICAgICAgLy8gfFxuICAgIFRZUEUuUmlnaHRDdXJseUJyYWNrZXQsICAvLyB9XG4gICAgVFlQRS5UaWxkZSAgICAgICAgICAgICAgIC8vIH5cbl0uZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBTWU1CT0xfVFlQRVtOdW1iZXIoa2V5KV0gPSBQVU5DVFVBVE9SO1xuICAgIFBVTkNUVUFUSU9OW051bWJlcihrZXkpXSA9IFBVTkNUVUFUT1I7XG59KTtcblxuZm9yICh2YXIgaSA9IDQ4OyBpIDw9IDU3OyBpKyspIHtcbiAgICBTWU1CT0xfVFlQRVtpXSA9IE5VTUJFUjtcbn1cblxuU1lNQk9MX1RZUEVbU1BBQ0VdID0gV0hJVEVTUEFDRTtcblNZTUJPTF9UWVBFW1RBQl0gPSBXSElURVNQQUNFO1xuU1lNQk9MX1RZUEVbTl0gPSBXSElURVNQQUNFO1xuU1lNQk9MX1RZUEVbUl0gPSBXSElURVNQQUNFO1xuU1lNQk9MX1RZUEVbRl0gPSBXSElURVNQQUNFO1xuXG5TWU1CT0xfVFlQRVtUWVBFLkFwb3N0cm9waGVdID0gU1RSSU5HO1xuU1lNQk9MX1RZUEVbVFlQRS5RdW90YXRpb25NYXJrXSA9IFNUUklORztcblxuU1RPUF9VUkxfUkFXW1NQQUNFXSA9IDE7XG5TVE9QX1VSTF9SQVdbVEFCXSA9IDE7XG5TVE9QX1VSTF9SQVdbTl0gPSAxO1xuU1RPUF9VUkxfUkFXW1JdID0gMTtcblNUT1BfVVJMX1JBV1tGXSA9IDE7XG5TVE9QX1VSTF9SQVdbVFlQRS5BcG9zdHJvcGhlXSA9IDE7XG5TVE9QX1VSTF9SQVdbVFlQRS5RdW90YXRpb25NYXJrXSA9IDE7XG5TVE9QX1VSTF9SQVdbVFlQRS5MZWZ0UGFyZW50aGVzaXNdID0gMTtcblNUT1BfVVJMX1JBV1tUWVBFLlJpZ2h0UGFyZW50aGVzaXNdID0gMTtcblxuLy8gd2hpdGVzcGFjZSBpcyBwdW5jdHVhdGlvbiAuLi5cblBVTkNUVUFUSU9OW1NQQUNFXSA9IFBVTkNUVUFUT1I7XG5QVU5DVFVBVElPTltUQUJdID0gUFVOQ1RVQVRPUjtcblBVTkNUVUFUSU9OW05dID0gUFVOQ1RVQVRPUjtcblBVTkNUVUFUSU9OW1JdID0gUFVOQ1RVQVRPUjtcblBVTkNUVUFUSU9OW0ZdID0gUFVOQ1RVQVRPUjtcbi8vIC4uLiBoeXBlciBtaW51cyBpcyBub3RcblBVTkNUVUFUSU9OW1RZUEUuSHlwaGVuTWludXNdID0gMDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgVFlQRTogVFlQRSxcbiAgICBOQU1FOiBOQU1FLFxuXG4gICAgU1lNQk9MX1RZUEU6IFNZTUJPTF9UWVBFLFxuICAgIFBVTkNUVUFUSU9OOiBQVU5DVFVBVElPTixcbiAgICBTVE9QX1VSTF9SQVc6IFNUT1BfVVJMX1JBV1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNyZWF0ZUN1c3RvbUVycm9yID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvY3JlYXRlQ3VzdG9tRXJyb3InKTtcblxudmFyIFN5bnRheFBhcnNlRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlLCBzeW50YXhTdHIsIG9mZnNldCkge1xuICAgIHZhciBlcnJvciA9IGNyZWF0ZUN1c3RvbUVycm9yKCdTeW50YXhQYXJzZUVycm9yJywgbWVzc2FnZSk7XG5cbiAgICBlcnJvci5yYXdNZXNzYWdlID0gbWVzc2FnZTtcbiAgICBlcnJvci5zeW50YXggPSBzeW50YXhTdHI7XG4gICAgZXJyb3Iub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIGVycm9yLm1lc3NhZ2UgPSBlcnJvci5yYXdNZXNzYWdlICsgJ1xcbicgK1xuICAgICAgICAnICAnICsgZXJyb3Iuc3ludGF4ICsgJ1xcbicgK1xuICAgICAgICAnLS0nICsgbmV3IEFycmF5KChlcnJvci5vZmZzZXQgfHwgZXJyb3Iuc3ludGF4Lmxlbmd0aCkgKyAxKS5qb2luKCctJykgKyAnXic7XG5cbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBTeW50YXhQYXJzZUVycm9yOiBTeW50YXhQYXJzZUVycm9yXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdhbGsobm9kZSwgZm4sIGNvbnRleHQpIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdHcm91cCc6XG4gICAgICAgICAgICBub2RlLnRlcm1zLmZvckVhY2goZnVuY3Rpb24odGVybSkge1xuICAgICAgICAgICAgICAgIHdhbGsodGVybSwgZm4sIGNvbnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICAgIGNhc2UgJ1BhcmVudGhlc2VzJzpcbiAgICAgICAgICAgIHdhbGsobm9kZS5jaGlsZHJlbiwgZm4sIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICAgIGNhc2UgJ1R5cGUnOlxuICAgICAgICBjYXNlICdQcm9wZXJ0eSc6XG4gICAgICAgIGNhc2UgJ0NvbWJpbmF0b3InOlxuICAgICAgICBjYXNlICdDb21tYSc6XG4gICAgICAgIGNhc2UgJ1NsYXNoJzpcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgY2FzZSAnUGVyY2VudCc6XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHR5cGU6ICcgKyBub2RlLnR5cGUpO1xuICAgIH1cblxuICAgIGZuLmNhbGwoY29udGV4dCwgbm9kZSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgU3ludGF4UGFyc2VFcnJvcjogcmVxdWlyZSgnLi9lcnJvcicpLlN5bnRheFBhcnNlRXJyb3IsXG4gICAgcGFyc2U6IHJlcXVpcmUoJy4vcGFyc2UnKSxcbiAgICB0cmFuc2xhdGU6IHJlcXVpcmUoJy4vdHJhbnNsYXRlJyksXG4gICAgd2FsazogcmVxdWlyZSgnLi93YWxrJylcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2xpc3QnKTtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vdG9rZW5pemVyJykuVFlQRTtcbnZhciBXSElURVNQQUNFID0gVFlQRS5XaGl0ZVNwYWNlO1xudmFyIENPTU1FTlQgPSBUWVBFLkNvbW1lbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVhZFNlcXVlbmNlKHJlY29nbml6ZXIpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBuZXcgTGlzdCgpO1xuICAgIHZhciBjaGlsZCA9IG51bGw7XG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIHJlY29nbml6ZXI6IHJlY29nbml6ZXIsXG4gICAgICAgIHNwYWNlOiBudWxsLFxuICAgICAgICBpZ25vcmVXUzogZmFsc2UsXG4gICAgICAgIGlnbm9yZVdTQWZ0ZXI6IGZhbHNlXG4gICAgfTtcblxuICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjYXNlIFdISVRFU1BBQ0U6XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuaWdub3JlV1MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNwYWNlID0gdGhpcy5XaGl0ZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSByZWNvZ25pemVyLmdldE5vZGUuY2FsbCh0aGlzLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5zcGFjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YShjb250ZXh0LnNwYWNlKTtcbiAgICAgICAgICAgIGNvbnRleHQuc3BhY2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YShjaGlsZCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuaWdub3JlV1NBZnRlcikge1xuICAgICAgICAgICAgY29udGV4dC5pZ25vcmVXU0FmdGVyID0gZmFsc2U7XG4gICAgICAgICAgICBjb250ZXh0Lmlnbm9yZVdTID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuaWdub3JlV1MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBpbnRUb0NoYXJNYXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuXG4vKipcbiAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG51bWJlcikge1xuICBpZiAoMCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgaW50VG9DaGFyTWFwLmxlbmd0aCkge1xuICAgIHJldHVybiBpbnRUb0NoYXJNYXBbbnVtYmVyXTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIG51bWJlcik7XG59O1xuXG4vKipcbiAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGNoYXJhY3RlciBjb2RlIGRpZ2l0IHRvIGFuIGludGVnZXIuIFJldHVybnMgLTEgb25cbiAqIGZhaWx1cmUuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gIHZhciBiaWdBID0gNjU7ICAgICAvLyAnQSdcbiAgdmFyIGJpZ1ogPSA5MDsgICAgIC8vICdaJ1xuXG4gIHZhciBsaXR0bGVBID0gOTc7ICAvLyAnYSdcbiAgdmFyIGxpdHRsZVogPSAxMjI7IC8vICd6J1xuXG4gIHZhciB6ZXJvID0gNDg7ICAgICAvLyAnMCdcbiAgdmFyIG5pbmUgPSA1NzsgICAgIC8vICc5J1xuXG4gIHZhciBwbHVzID0gNDM7ICAgICAvLyAnKydcbiAgdmFyIHNsYXNoID0gNDc7ICAgIC8vICcvJ1xuXG4gIHZhciBsaXR0bGVPZmZzZXQgPSAyNjtcbiAgdmFyIG51bWJlck9mZnNldCA9IDUyO1xuXG4gIC8vIDAgLSAyNTogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcbiAgaWYgKGJpZ0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gYmlnWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBiaWdBKTtcbiAgfVxuXG4gIC8vIDI2IC0gNTE6IGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XG4gIGlmIChsaXR0bGVBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGxpdHRsZVopIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gbGl0dGxlQSArIGxpdHRsZU9mZnNldCk7XG4gIH1cblxuICAvLyA1MiAtIDYxOiAwMTIzNDU2Nzg5XG4gIGlmICh6ZXJvIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IG5pbmUpIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gemVybyArIG51bWJlck9mZnNldCk7XG4gIH1cblxuICAvLyA2MjogK1xuICBpZiAoY2hhckNvZGUgPT0gcGx1cykge1xuICAgIHJldHVybiA2MjtcbiAgfVxuXG4gIC8vIDYzOiAvXG4gIGlmIChjaGFyQ29kZSA9PSBzbGFzaCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuXG4gIC8vIEludmFsaWQgYmFzZTY0IGRpZ2l0LlxuICByZXR1cm4gLTE7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gcGFyYW1ldGVyL29wdGlvbnNcbiAqIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGFyZ3MgVGhlIG9iamVjdCB3ZSBhcmUgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBBbiBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmdcbiAqIGZyb20gdGhlIG9iamVjdC4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgaXMgbWlzc2luZywgYW5cbiAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICovXG5mdW5jdGlvbiBnZXRBcmcoYUFyZ3MsIGFOYW1lLCBhRGVmYXVsdFZhbHVlKSB7XG4gIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgIHJldHVybiBhQXJnc1thTmFtZV07XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYU5hbWUgKyAnXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudC4nKTtcbiAgfVxufVxuZXhwb3J0cy5nZXRBcmcgPSBnZXRBcmc7XG5cbnZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Ll0qKSg/OjooXFxkKykpPyhcXFMqKSQvO1xudmFyIGRhdGFVcmxSZWdleHAgPSAvXmRhdGE6LitcXCwuKyQvO1xuXG5mdW5jdGlvbiB1cmxQYXJzZShhVXJsKSB7XG4gIHZhciBtYXRjaCA9IGFVcmwubWF0Y2godXJsUmVnZXhwKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgc2NoZW1lOiBtYXRjaFsxXSxcbiAgICBhdXRoOiBtYXRjaFsyXSxcbiAgICBob3N0OiBtYXRjaFszXSxcbiAgICBwb3J0OiBtYXRjaFs0XSxcbiAgICBwYXRoOiBtYXRjaFs1XVxuICB9O1xufVxuZXhwb3J0cy51cmxQYXJzZSA9IHVybFBhcnNlO1xuXG5mdW5jdGlvbiB1cmxHZW5lcmF0ZShhUGFyc2VkVXJsKSB7XG4gIHZhciB1cmwgPSAnJztcbiAgaWYgKGFQYXJzZWRVcmwuc2NoZW1lKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuc2NoZW1lICsgJzonO1xuICB9XG4gIHVybCArPSAnLy8nO1xuICBpZiAoYVBhcnNlZFVybC5hdXRoKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuYXV0aCArICdAJztcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5ob3N0KSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuaG9zdDtcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5wb3J0KSB7XG4gICAgdXJsICs9IFwiOlwiICsgYVBhcnNlZFVybC5wb3J0XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucGF0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnBhdGg7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cbmV4cG9ydHMudXJsR2VuZXJhdGUgPSB1cmxHZW5lcmF0ZTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCwgb3IgdGhlIHBhdGggcG9ydGlvbiBvZiBhIFVSTDpcbiAqXG4gKiAtIFJlcGxhY2VzIGNvbnNlY3V0aXZlIHNsYXNoZXMgd2l0aCBvbmUgc2xhc2guXG4gKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJy4nIHBhcnRzLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICc8ZGlyPi8uLicgcGFydHMuXG4gKlxuICogQmFzZWQgb24gY29kZSBpbiB0aGUgTm9kZS5qcyAncGF0aCcgY29yZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIHVybCB0byBub3JtYWxpemUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZShhUGF0aCkge1xuICB2YXIgcGF0aCA9IGFQYXRoO1xuICB2YXIgdXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICBpZiAodXJsKSB7XG4gICAgaWYgKCF1cmwucGF0aCkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cbiAgICBwYXRoID0gdXJsLnBhdGg7XG4gIH1cbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCk7XG5cbiAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgvXFwvKy8pO1xuICBmb3IgKHZhciBwYXJ0LCB1cCA9IDAsIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXAgPiAwKSB7XG4gICAgICBpZiAocGFydCA9PT0gJycpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgaXMgYmxhbmsgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGUuIFRyeWluZyB0byBnb1xuICAgICAgICAvLyBhYm92ZSB0aGUgcm9vdCBpcyBhIG5vLW9wLiBUaGVyZWZvcmUgd2UgY2FuIHJlbW92ZSBhbGwgJy4uJyBwYXJ0c1xuICAgICAgICAvLyBkaXJlY3RseSBhZnRlciB0aGUgcm9vdC5cbiAgICAgICAgcGFydHMuc3BsaWNlKGkgKyAxLCB1cCk7XG4gICAgICAgIHVwID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnNwbGljZShpLCAyKTtcbiAgICAgICAgdXAtLTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblxuICBpZiAocGF0aCA9PT0gJycpIHtcbiAgICBwYXRoID0gaXNBYnNvbHV0ZSA/ICcvJyA6ICcuJztcbiAgfVxuXG4gIGlmICh1cmwpIHtcbiAgICB1cmwucGF0aCA9IHBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKHVybCk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5leHBvcnRzLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZTtcblxuLyoqXG4gKiBKb2lucyB0d28gcGF0aHMvVVJMcy5cbiAqXG4gKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIGpvaW5lZCB3aXRoIHRoZSByb290LlxuICpcbiAqIC0gSWYgYVBhdGggaXMgYSBVUkwgb3IgYSBkYXRhIFVSSSwgYVBhdGggaXMgcmV0dXJuZWQsIHVubGVzcyBhUGF0aCBpcyBhXG4gKiAgIHNjaGVtZS1yZWxhdGl2ZSBVUkw6IFRoZW4gdGhlIHNjaGVtZSBvZiBhUm9vdCwgaWYgYW55LCBpcyBwcmVwZW5kZWRcbiAqICAgZmlyc3QuXG4gKiAtIE90aGVyd2lzZSBhUGF0aCBpcyBhIHBhdGguIElmIGFSb290IGlzIGEgVVJMLCB0aGVuIGl0cyBwYXRoIHBvcnRpb25cbiAqICAgaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHQgYW5kIGFSb290IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIHJlc3VsdFxuICogICBpcyByZXR1cm5lZC5cbiAqICAgLSBJZiBhUGF0aCBpcyBhYnNvbHV0ZSwgdGhlIHJlc3VsdCBpcyBhUGF0aC5cbiAqICAgLSBPdGhlcndpc2UgdGhlIHR3byBwYXRocyBhcmUgam9pbmVkIHdpdGggYSBzbGFzaC5cbiAqIC0gSm9pbmluZyBmb3IgZXhhbXBsZSAnaHR0cDovLycgYW5kICd3d3cuZXhhbXBsZS5jb20nIGlzIGFsc28gc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBqb2luKGFSb290LCBhUGF0aCkge1xuICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICBhUm9vdCA9IFwiLlwiO1xuICB9XG4gIGlmIChhUGF0aCA9PT0gXCJcIikge1xuICAgIGFQYXRoID0gXCIuXCI7XG4gIH1cbiAgdmFyIGFQYXRoVXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICB2YXIgYVJvb3RVcmwgPSB1cmxQYXJzZShhUm9vdCk7XG4gIGlmIChhUm9vdFVybCkge1xuICAgIGFSb290ID0gYVJvb3RVcmwucGF0aCB8fCAnLyc7XG4gIH1cblxuICAvLyBgam9pbihmb28sICcvL3d3dy5leGFtcGxlLm9yZycpYFxuICBpZiAoYVBhdGhVcmwgJiYgIWFQYXRoVXJsLnNjaGVtZSkge1xuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVBhdGhVcmwuc2NoZW1lID0gYVJvb3RVcmwuc2NoZW1lO1xuICAgIH1cbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVBhdGhVcmwpO1xuICB9XG5cbiAgaWYgKGFQYXRoVXJsIHx8IGFQYXRoLm1hdGNoKGRhdGFVcmxSZWdleHApKSB7XG4gICAgcmV0dXJuIGFQYXRoO1xuICB9XG5cbiAgLy8gYGpvaW4oJ2h0dHA6Ly8nLCAnd3d3LmV4YW1wbGUuY29tJylgXG4gIGlmIChhUm9vdFVybCAmJiAhYVJvb3RVcmwuaG9zdCAmJiAhYVJvb3RVcmwucGF0aCkge1xuICAgIGFSb290VXJsLmhvc3QgPSBhUGF0aDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICB9XG5cbiAgdmFyIGpvaW5lZCA9IGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgPyBhUGF0aFxuICAgIDogbm9ybWFsaXplKGFSb290LnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgYVBhdGgpO1xuXG4gIGlmIChhUm9vdFVybCkge1xuICAgIGFSb290VXJsLnBhdGggPSBqb2luZWQ7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuICByZXR1cm4gam9pbmVkO1xufVxuZXhwb3J0cy5qb2luID0gam9pbjtcblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24gKGFQYXRoKSB7XG4gIHJldHVybiBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJyB8fCAhIWFQYXRoLm1hdGNoKHVybFJlZ2V4cCk7XG59O1xuXG4vKipcbiAqIE1ha2UgYSBwYXRoIHJlbGF0aXZlIHRvIGEgVVJMIG9yIGFub3RoZXIgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIG1hZGUgcmVsYXRpdmUgdG8gYVJvb3QuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aXZlKGFSb290LCBhUGF0aCkge1xuICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICBhUm9vdCA9IFwiLlwiO1xuICB9XG5cbiAgYVJvb3QgPSBhUm9vdC5yZXBsYWNlKC9cXC8kLywgJycpO1xuXG4gIC8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcGF0aCB0byBiZSBhYm92ZSB0aGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBzaW1wbHlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB0aGUgcm9vdCBpcyBhIHByZWZpeCBvZiB0aGUgcGF0aCB3b24ndCB3b3JrLiBJbnN0ZWFkLCB3ZVxuICAvLyBuZWVkIHRvIHJlbW92ZSBjb21wb25lbnRzIGZyb20gdGhlIHJvb3Qgb25lIGJ5IG9uZSwgdW50aWwgZWl0aGVyIHdlIGZpbmRcbiAgLy8gYSBwcmVmaXggdGhhdCBmaXRzLCBvciB3ZSBydW4gb3V0IG9mIGNvbXBvbmVudHMgdG8gcmVtb3ZlLlxuICB2YXIgbGV2ZWwgPSAwO1xuICB3aGlsZSAoYVBhdGguaW5kZXhPZihhUm9vdCArICcvJykgIT09IDApIHtcbiAgICB2YXIgaW5kZXggPSBhUm9vdC5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBvbmx5IHBhcnQgb2YgdGhlIHJvb3QgdGhhdCBpcyBsZWZ0IGlzIHRoZSBzY2hlbWUgKGkuZS4gaHR0cDovLyxcbiAgICAvLyBmaWxlOi8vLywgZXRjLiksIG9uZSBvciBtb3JlIHNsYXNoZXMgKC8pLCBvciBzaW1wbHkgbm90aGluZyBhdCBhbGwsIHdlXG4gICAgLy8gaGF2ZSBleGhhdXN0ZWQgYWxsIGNvbXBvbmVudHMsIHNvIHRoZSBwYXRoIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcm9vdC5cbiAgICBhUm9vdCA9IGFSb290LnNsaWNlKDAsIGluZGV4KTtcbiAgICBpZiAoYVJvb3QubWF0Y2goL14oW15cXC9dKzpcXC8pP1xcLyokLykpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICArK2xldmVsO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGFkZCBhIFwiLi4vXCIgZm9yIGVhY2ggY29tcG9uZW50IHdlIHJlbW92ZWQgZnJvbSB0aGUgcm9vdC5cbiAgcmV0dXJuIEFycmF5KGxldmVsICsgMSkuam9pbihcIi4uL1wiKSArIGFQYXRoLnN1YnN0cihhUm9vdC5sZW5ndGggKyAxKTtcbn1cbmV4cG9ydHMucmVsYXRpdmUgPSByZWxhdGl2ZTtcblxudmFyIHN1cHBvcnRzTnVsbFByb3RvID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAhKCdfX3Byb3RvX18nIGluIG9iaik7XG59KCkpO1xuXG5mdW5jdGlvbiBpZGVudGl0eSAocykge1xuICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBCZWNhdXNlIGJlaGF2aW9yIGdvZXMgd2Fja3kgd2hlbiB5b3Ugc2V0IGBfX3Byb3RvX19gIG9uIG9iamVjdHMsIHdlXG4gKiBoYXZlIHRvIHByZWZpeCBhbGwgdGhlIHN0cmluZ3MgaW4gb3VyIHNldCB3aXRoIGFuIGFyYml0cmFyeSBjaGFyYWN0ZXIuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvcHVsbC8zMSBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvaXNzdWVzLzMwXG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbmZ1bmN0aW9uIHRvU2V0U3RyaW5nKGFTdHIpIHtcbiAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHtcbiAgICByZXR1cm4gJyQnICsgYVN0cjtcbiAgfVxuXG4gIHJldHVybiBhU3RyO1xufVxuZXhwb3J0cy50b1NldFN0cmluZyA9IHN1cHBvcnRzTnVsbFByb3RvID8gaWRlbnRpdHkgOiB0b1NldFN0cmluZztcblxuZnVuY3Rpb24gZnJvbVNldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuIGFTdHIuc2xpY2UoMSk7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMuZnJvbVNldFN0cmluZyA9IHN1cHBvcnRzTnVsbFByb3RvID8gaWRlbnRpdHkgOiBmcm9tU2V0U3RyaW5nO1xuXG5mdW5jdGlvbiBpc1Byb3RvU3RyaW5nKHMpIHtcbiAgaWYgKCFzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGxlbmd0aCA9IHMubGVuZ3RoO1xuXG4gIGlmIChsZW5ndGggPCA5IC8qIFwiX19wcm90b19fXCIubGVuZ3RoICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHMuY2hhckNvZGVBdChsZW5ndGggLSAxKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDIpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMykgIT09IDExMSAvKiAnbycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA0KSAhPT0gMTE2IC8qICd0JyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDUpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNikgIT09IDExNCAvKiAncicgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA3KSAhPT0gMTEyIC8qICdwJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDgpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gOSkgIT09IDk1ICAvKiAnXycgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gbGVuZ3RoIC0gMTA7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKHMuY2hhckNvZGVBdChpKSAhPT0gMzYgLyogJyQnICovKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aGVyZSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqXG4gKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIG9yaWdpbmFsIHNvdXJjZS9saW5lL2NvbHVtbiwgYnV0IGRpZmZlcmVudCBnZW5lcmF0ZWRcbiAqIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhIG1hcHBpbmcgd2l0aCBhXG4gKiBzdHViYmVkIG91dCBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyhtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLnNvdXJjZSAtIG1hcHBpbmdCLnNvdXJjZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gbWFwcGluZ0EubmFtZSAtIG1hcHBpbmdCLm5hbWU7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLnNvdXJjZSAtIG1hcHBpbmdCLnNvdXJjZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gbWFwcGluZ0EubmFtZSAtIG1hcHBpbmdCLm5hbWU7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQ7XG5cbmZ1bmN0aW9uIHN0cmNtcChhU3RyMSwgYVN0cjIpIHtcbiAgaWYgKGFTdHIxID09PSBhU3RyMikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKGFTdHIxID4gYVN0cjIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdpdGggaW5mbGF0ZWQgc291cmNlIGFuZCBuYW1lIHN0cmluZ3Mgd2hlcmVcbiAqIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG5leHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcbmV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoLlxuICpcbiAqIEBwYXJhbSBhTG93IEluZGljZXMgaGVyZSBhbmQgbG93ZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAqIEBwYXJhbSBhSGlnaCBJbmRpY2VzIGhlcmUgYW5kIGhpZ2hlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgYmVpbmcgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGFIYXlzdGFjayBUaGUgbm9uLWVtcHR5IGFycmF5IGJlaW5nIHNlYXJjaGVkLlxuICogQHBhcmFtIGFDb21wYXJlIEZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBlbGVtZW50cyBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gcmVjdXJzaXZlU2VhcmNoKGFMb3csIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAvL1xuICAvLyAgIDEuIFdlIGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAvL1xuICAvLyAgIDIuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYnV0IHdlIGNhbiByZXR1cm4gdGhlIGluZGV4IG9mXG4gIC8vICAgICAgdGhlIG5leHQtY2xvc2VzdCBlbGVtZW50LlxuICAvL1xuICAvLyAgIDMuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYW5kIHRoZXJlIGlzIG5vIG5leHQtY2xvc2VzdFxuICAvLyAgICAgIGVsZW1lbnQgdGhhbiB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCBzbyB3ZSByZXR1cm4gLTEuXG4gIHZhciBtaWQgPSBNYXRoLmZsb29yKChhSGlnaCAtIGFMb3cpIC8gMikgKyBhTG93O1xuICB2YXIgY21wID0gYUNvbXBhcmUoYU5lZWRsZSwgYUhheXN0YWNrW21pZF0sIHRydWUpO1xuICBpZiAoY21wID09PSAwKSB7XG4gICAgLy8gRm91bmQgdGhlIGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIHJldHVybiBtaWQ7XG4gIH1cbiAgZWxzZSBpZiAoY21wID4gMCkge1xuICAgIC8vIE91ciBuZWVkbGUgaXMgZ3JlYXRlciB0aGFuIGFIYXlzdGFja1ttaWRdLlxuICAgIGlmIChhSGlnaCAtIG1pZCA+IDEpIHtcbiAgICAgIC8vIFRoZSBlbGVtZW50IGlzIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChtaWQsIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGV4YWN0IG5lZWRsZSBlbGVtZW50IHdhcyBub3QgZm91bmQgaW4gdGhpcyBoYXlzdGFjay4gRGV0ZXJtaW5lIGlmXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIGFIaWdoIDwgYUhheXN0YWNrLmxlbmd0aCA/IGFIaWdoIDogLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIE91ciBuZWVkbGUgaXMgbGVzcyB0aGFuIGFIYXlzdGFja1ttaWRdLlxuICAgIGlmIChtaWQgLSBhTG93ID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxvd2VyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKGFMb3csIG1pZCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpO1xuICAgIH1cblxuICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgzKSBvciAoMikgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgaWYgKGFCaWFzID09IGV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQpIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhTG93IDwgMCA/IC0xIDogYUxvdztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2ggd2hpY2ggd2lsbCBhbHdheXMgdHJ5IGFuZCByZXR1cm5cbiAqIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBlbGVtZW50IGlmIHRoZXJlIGlzIG5vIGV4YWN0IGhpdC4gVGhpcyBpcyBiZWNhdXNlXG4gKiBtYXBwaW5ncyBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBnZW5lcmF0ZWQgbGluZS9jb2wgcGFpcnMgYXJlIHNpbmdsZSBwb2ludHMsXG4gKiBhbmQgdGhlcmUgaXMgYW4gaW1wbGljaXQgcmVnaW9uIGJldHdlZW4gZWFjaCBvZiB0aGVtLCBzbyBhIG1pc3MganVzdCBtZWFuc1xuICogdGhhdCB5b3UgYXJlbid0IG9uIHRoZSB2ZXJ5IHN0YXJ0IG9mIGEgcmVnaW9uLlxuICpcbiAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IHlvdSBhcmUgbG9va2luZyBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBhcnJheSB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkLlxuICogQHBhcmFtIGFDb21wYXJlIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdGhlIG5lZWRsZSBhbmQgYW4gZWxlbWVudCBpbiB0aGVcbiAqICAgICBhcnJheSBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmVlZGxlIGlzIGxlc3NcbiAqICAgICB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBlbGVtZW50LCByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gYUJpYXMgRWl0aGVyICdiaW5hcnlTZWFyY2guR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ2JpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKi9cbmV4cG9ydHMuc2VhcmNoID0gZnVuY3Rpb24gc2VhcmNoKGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIGlmIChhSGF5c3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gcmVjdXJzaXZlU2VhcmNoKC0xLCBhSGF5c3RhY2subGVuZ3RoLCBhTmVlZGxlLCBhSGF5c3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ29tcGFyZSwgYUJpYXMgfHwgZXhwb3J0cy5HUkVBVEVTVF9MT1dFUl9CT1VORCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBXZSBoYXZlIGZvdW5kIGVpdGhlciB0aGUgZXhhY3QgZWxlbWVudCwgb3IgdGhlIG5leHQtY2xvc2VzdCBlbGVtZW50IHRoYW5cbiAgLy8gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gSG93ZXZlciwgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgc3VjaFxuICAvLyBlbGVtZW50LiBNYWtlIHN1cmUgd2UgYWx3YXlzIHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlc2UuXG4gIHdoaWxlIChpbmRleCAtIDEgPj0gMCkge1xuICAgIGlmIChhQ29tcGFyZShhSGF5c3RhY2tbaW5kZXhdLCBhSGF5c3RhY2tbaW5kZXggLSAxXSwgdHJ1ZSkgIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAtLWluZGV4O1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufTtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnc291cmNlLW1hcCcpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbnZhciB0cmFja05vZGVzID0ge1xuICAgIEF0cnVsZTogdHJ1ZSxcbiAgICBTZWxlY3RvcjogdHJ1ZSxcbiAgICBEZWNsYXJhdGlvbjogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZVNvdXJjZU1hcChnZW5lcmF0b3IsIGFzdCkge1xuICAgIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKCk7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICAgICAgbGluZTogMSxcbiAgICAgICAgY29sdW1uOiAwXG4gICAgfTtcbiAgICB2YXIgb3JpZ2luYWwgPSB7XG4gICAgICAgIGxpbmU6IDAsIC8vIHNob3VsZCBiZSB6ZXJvIHRvIGFkZCBmaXJzdCBtYXBwaW5nXG4gICAgICAgIGNvbHVtbjogMFxuICAgIH07XG4gICAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB2YXIgYWN0aXZhdGVkR2VuZXJhdGVkID0ge1xuICAgICAgICBsaW5lOiAxLFxuICAgICAgICBjb2x1bW46IDBcbiAgICB9O1xuICAgIHZhciBhY3RpdmF0ZWRNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IGFjdGl2YXRlZEdlbmVyYXRlZFxuICAgIH07XG5cbiAgICB2YXIgY3NzID0gZ2VuZXJhdG9yKGFzdCwgZnVuY3Rpb24obm9kZSwgYnVmZmVyLCBsaW5lLCBjb2x1bW4pIHtcbiAgICAgICAgaWYgKCFub2RlLmxvYyB8fFxuICAgICAgICAgICAgIW5vZGUubG9jLnN0YXJ0IHx8XG4gICAgICAgICAgICAhdHJhY2tOb2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZUxpbmUgPSBub2RlLmxvYy5zdGFydC5saW5lO1xuICAgICAgICB2YXIgbm9kZUNvbHVtbiA9IG5vZGUubG9jLnN0YXJ0LmNvbHVtbiAtIDE7XG5cbiAgICAgICAgaWYgKG9yaWdpbmFsLmxpbmUgIT09IG5vZGVMaW5lIHx8XG4gICAgICAgICAgICBvcmlnaW5hbC5jb2x1bW4gIT09IG5vZGVDb2x1bW4pIHtcbiAgICAgICAgICAgIG9yaWdpbmFsLmxpbmUgPSBub2RlTGluZTtcbiAgICAgICAgICAgIG9yaWdpbmFsLmNvbHVtbiA9IG5vZGVDb2x1bW47XG5cbiAgICAgICAgICAgIGdlbmVyYXRlZC5saW5lID0gbGluZTtcbiAgICAgICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSBjb2x1bW47XG5cbiAgICAgICAgICAgIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0ZWQubGluZSAhPT0gYWN0aXZhdGVkR2VuZXJhdGVkLmxpbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbiAhPT0gYWN0aXZhdGVkR2VuZXJhdGVkLmNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBtYXAuYWRkTWFwcGluZyhhY3RpdmF0ZWRNYXBwaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgICAgIHNvdXJjZTogbm9kZS5sb2Muc291cmNlLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbCxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IGdlbmVyYXRlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH0sIGZ1bmN0aW9uKG5vZGUsIGJ1ZmZlciwgbGluZSwgY29sdW1uKSB7XG4gICAgICAgIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlICYmIHRyYWNrTm9kZXMuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgYWN0aXZhdGVkR2VuZXJhdGVkLmxpbmUgPSBsaW5lO1xuICAgICAgICAgICAgYWN0aXZhdGVkR2VuZXJhdGVkLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoYWN0aXZhdGVkTWFwcGluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBjc3MsXG4gICAgICAgIG1hcDogbWFwXG4gICAgfTtcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2xpc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVDb252ZXJ0b3JzKHdhbGtlcikge1xuICAgIHZhciB3YWxrID0gd2Fsa2VyLndhbGs7XG4gICAgdmFyIHdhbGtVcCA9IHdhbGtlci53YWxrVXA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmcm9tUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKGFzdCkge1xuICAgICAgICAgICAgd2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBMaXN0KCkuZnJvbUFycmF5KG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgICB9LFxuICAgICAgICB0b1BsYWluT2JqZWN0OiBmdW5jdGlvbihhc3QpIHtcbiAgICAgICAgICAgIHdhbGtVcChhc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi50b0FycmF5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBhc3Q7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIExpc3QgPSByZXF1aXJlKCcuL2xpc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjbG9uZShub2RlKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIG5vZGUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gbm9kZVtrZXldO1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgTGlzdCgpLmZyb21BcnJheSh2YWx1ZS5tYXAoY2xvbmUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gY2xvbmUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcbnZhciBMRUZUU1FVQVJFQlJBQ0tFVCA9IFRZUEUuTGVmdFNxdWFyZUJyYWNrZXQ7XG52YXIgUklHSFRTUVVBUkVCUkFDS0VUID0gVFlQRS5SaWdodFNxdWFyZUJyYWNrZXQ7XG5cbi8vIGN1cnJlbnRseSBvbmx5IEdyaWQgTGF5b3V0IHVzZXMgc3F1YXJlIGJyYWNrZXRzLCBidXQgbGVmdCBpdCB1bml2ZXJzYWxcbi8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtZ3JpZC8jdHJhY2stc2l6aW5nXG4vLyBbIGlkZW50KiBdXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQnJhY2tldHMnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1tdXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKHJlYWRTZXF1ZW5jZSwgcmVjb2duaXplcikge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KExFRlRTUVVBUkVCUkFDS0VUKTtcbiAgICAgICAgY2hpbGRyZW4gPSByZWFkU2VxdWVuY2UuY2FsbCh0aGlzLCByZWNvZ25pemVyKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChSSUdIVFNRVUFSRUJSQUNLRVQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQnJhY2tldHMnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCdbJyk7XG4gICAgICAgIHRoaXMuZWFjaChwcm9jZXNzQ2h1bmssIG5vZGUpO1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJ10nKTtcbiAgICB9XG59O1xuIiwidmFyIENEQyA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuQ0RDO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQ0RDJyxcbiAgICBzdHJ1Y3R1cmU6IFtdLFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDREMpOyAvLyAtLT5cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0NEQycsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaykge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJy0tPicpO1xuICAgIH1cbn07XG4iLCJ2YXIgQ0RPID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRS5DRE87XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdDRE8nLFxuICAgIHN0cnVjdHVyZTogW10sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KENETyk7IC8vIDwhLS1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0NETycsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaykge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJzwhLS0nKTtcbiAgICB9XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgRlVMTFNUT1AgPSBUWVBFLkZ1bGxTdG9wO1xuXG4vLyAnLicgaWRlbnRcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdDbGFzc1NlbGVjdG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoRlVMTFNUT1ApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQ2xhc3NTZWxlY3RvcicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24odGhpcy5zY2FubmVyLnRva2VuU3RhcnQgLSAxLCB0aGlzLnNjYW5uZXIudG9rZW5FbmQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5zY2FubmVyLmNvbnN1bWUoSURFTlRJRklFUilcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCcuJyk7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLm5hbWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBQTFVTU0lHTiA9IFRZUEUuUGx1c1NpZ247XG52YXIgU09MSURVUyA9IFRZUEUuU29saWR1cztcbnZhciBHUkVBVEVSVEhBTlNJR04gPSBUWVBFLkdyZWF0ZXJUaGFuU2lnbjtcbnZhciBUSUxERSA9IFRZUEUuVGlsZGU7XG5cbi8vICsgfCA+IHwgfiB8IC9kZWVwL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ0NvbWJpbmF0b3InLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBuYW1lOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEdSRUFURVJUSEFOU0lHTjpcbiAgICAgICAgICAgIGNhc2UgUExVU1NJR046XG4gICAgICAgICAgICBjYXNlIFRJTERFOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU09MSURVUzpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5leHBlY3RJZGVudGlmaWVyKCdkZWVwJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVhdChTT0xJRFVTKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ0NvbWJpbmF0b3IgaXMgZXhwZWN0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQ29tYmluYXRvcicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUubmFtZSk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIEFTVEVSSVNLID0gVFlQRS5Bc3RlcmlzaztcbnZhciBTT0xJRFVTID0gVFlQRS5Tb2xpZHVzO1xuXG4vLyAnLyonIC4qICcqLydcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdDb21tZW50JyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuc2Nhbm5lci50b2tlbkVuZDtcblxuICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0ICsgMikgPj0gMiAmJlxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KGVuZCAtIDIpID09PSBBU1RFUklTSyAmJlxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KGVuZCAtIDEpID09PSBTT0xJRFVTKSB7XG4gICAgICAgICAgICBlbmQgLT0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdDb21tZW50JyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgZW5kKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJy8qJyk7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLnZhbHVlKTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCcqLycpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG52YXIgUklHSFRQQVJFTlRIRVNJUyA9IFRZUEUuUmlnaHRQYXJlbnRoZXNpcztcblxuLy8gPGZ1bmN0aW9uLXRva2VuPiA8c2VxdWVuY2U+ICcpJ1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ0Z1bmN0aW9uJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nLFxuICAgICAgICBjaGlsZHJlbjogW1tdXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKHJlYWRTZXF1ZW5jZSwgcmVjb2duaXplcikge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnNjYW5uZXIuY29uc3VtZUZ1bmN0aW9uTmFtZSgpO1xuICAgICAgICB2YXIgbmFtZUxvd2VyQ2FzZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIGNoaWxkcmVuO1xuXG4gICAgICAgIGNoaWxkcmVuID0gcmVjb2duaXplci5oYXNPd25Qcm9wZXJ0eShuYW1lTG93ZXJDYXNlKVxuICAgICAgICAgICAgPyByZWNvZ25pemVyW25hbWVMb3dlckNhc2VdLmNhbGwodGhpcywgcmVjb2duaXplcilcbiAgICAgICAgICAgIDogcmVhZFNlcXVlbmNlLmNhbGwodGhpcywgcmVjb2duaXplcik7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChSSUdIVFBBUkVOVEhFU0lTKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0Z1bmN0aW9uJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsobm9kZS5uYW1lKTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCcoJyk7XG4gICAgICAgIHRoaXMuZWFjaChwcm9jZXNzQ2h1bmssIG5vZGUpO1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJyknKTtcbiAgICB9LFxuICAgIHdhbGtDb250ZXh0OiAnZnVuY3Rpb24nXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdJZGVudGlmaWVyJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnSWRlbnRpZmllcicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24odGhpcy5zY2FubmVyLnRva2VuU3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlbkVuZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnNjYW5uZXIuY29uc3VtZShJREVOVElGSUVSKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsobm9kZS5uYW1lKTtcbiAgICB9XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgTlVNQkVSU0lHTiA9IFRZUEUuTnVtYmVyU2lnbjtcblxuLy8gJyMnIGlkZW50XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnSWRTZWxlY3RvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KE5VTUJFUlNJR04pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnSWRTZWxlY3RvcicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24odGhpcy5zY2FubmVyLnRva2VuU3RhcnQgLSAxLCB0aGlzLnNjYW5uZXIudG9rZW5FbmQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5zY2FubmVyLmNvbnN1bWUoSURFTlRJRklFUilcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCcjJyk7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLm5hbWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIE5VTUJFUiA9IFRZUEUuTnVtYmVyO1xudmFyIExFRlRQQVJFTlRIRVNJUyA9IFRZUEUuTGVmdFBhcmVudGhlc2lzO1xudmFyIFJJR0hUUEFSRU5USEVTSVMgPSBUWVBFLlJpZ2h0UGFyZW50aGVzaXM7XG52YXIgQ09MT04gPSBUWVBFLkNvbG9uO1xudmFyIFNPTElEVVMgPSBUWVBFLlNvbGlkdXM7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdNZWRpYUZlYXR1cmUnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBuYW1lOiBTdHJpbmcsXG4gICAgICAgIHZhbHVlOiBbJ0lkZW50aWZpZXInLCAnTnVtYmVyJywgJ0RpbWVuc2lvbicsICdSYXRpbycsIG51bGxdXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgbmFtZTtcbiAgICAgICAgdmFyIHZhbHVlID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KExFRlRQQVJFTlRIRVNJUyk7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICBuYW1lID0gdGhpcy5zY2FubmVyLmNvbnN1bWUoSURFTlRJRklFUik7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gUklHSFRQQVJFTlRIRVNJUykge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDT0xPTik7XG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgTlVNQkVSOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmxvb2t1cFR5cGUoMSkgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5EaW1lbnNpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNjYW5uZXIubG9va3VwTm9uV1NUeXBlKDEpID09PSBTT0xJRFVTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuUmF0aW8oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5OdW1iZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuSWRlbnRpZmllcigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdOdW1iZXIsIGRpbWVuc2lvbiwgcmF0aW8gb3IgaWRlbnRpZmllciBpcyBleHBlY3RlZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFJJR0hUUEFSRU5USEVTSVMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnTWVkaWFGZWF0dXJlJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJygnKTtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChub2RlLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9jZXNzQ2h1bmsoJzonKTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGUocHJvY2Vzc0NodW5rLCBub2RlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQ2h1bmsoJyknKTtcbiAgICB9XG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBXSElURVNQQUNFID0gVFlQRS5XaGl0ZVNwYWNlO1xudmFyIENPTU1FTlQgPSBUWVBFLkNvbW1lbnQ7XG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBMRUZUUEFSRU5USEVTSVMgPSBUWVBFLkxlZnRQYXJlbnRoZXNpcztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ01lZGlhUXVlcnknLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1snSWRlbnRpZmllcicsICdNZWRpYUZlYXR1cmUnLCAnV2hpdGVTcGFjZSddXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbmV3IExpc3QoKTtcbiAgICAgICAgdmFyIGNoaWxkID0gbnVsbDtcbiAgICAgICAgdmFyIHNwYWNlID0gbnVsbDtcblxuICAgICAgICBzY2FuOlxuICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFdISVRFU1BBQ0U6XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlID0gdGhpcy5XaGl0ZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuSWRlbnRpZmllcigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgTEVGVFBBUkVOVEhFU0lTOlxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuTWVkaWFGZWF0dXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNwYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YShzcGFjZSk7XG4gICAgICAgICAgICAgICAgc3BhY2UgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmREYXRhKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdJZGVudGlmaWVyIG9yIHBhcmVudGhlc2lzIGlzIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ01lZGlhUXVlcnknLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uRnJvbUxpc3QoY2hpbGRyZW4pLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHRoaXMuZWFjaChwcm9jZXNzQ2h1bmssIG5vZGUpO1xuICAgIH1cbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2xpc3QnKTtcbnZhciBDT01NQSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuQ29tbWE7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdNZWRpYVF1ZXJ5TGlzdCcsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGNoaWxkcmVuOiBbWydNZWRpYVF1ZXJ5J11dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbmV3IExpc3QoKTtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmREYXRhKHRoaXMuTWVkaWFRdWVyeShyZWxhdGl2ZSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSAhPT0gQ09NTUEpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnTWVkaWFRdWVyeUxpc3QnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uRnJvbUxpc3QoY2hpbGRyZW4pLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHRoaXMuZWFjaENvbW1hKHByb2Nlc3NDaHVuaywgbm9kZSk7XG4gICAgfVxufTtcbiIsInZhciBOVU1CRVIgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFLk51bWJlcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ051bWJlcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5FbmQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5jb25zdW1lKE5VTUJFUilcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUudmFsdWUpO1xuICAgIH1cbn07XG4iLCIvLyAnLycgfCAnKicgfCAnLCcgfCAnOicgfCAnKycgfCAnLSdcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdPcGVyYXRvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ09wZXJhdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zdWJzdHJUb0N1cnNvcihzdGFydClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUudmFsdWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG52YXIgTEVGVFBBUkVOVEhFU0lTID0gVFlQRS5MZWZ0UGFyZW50aGVzaXM7XG52YXIgUklHSFRQQVJFTlRIRVNJUyA9IFRZUEUuUmlnaHRQYXJlbnRoZXNpcztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1BhcmVudGhlc2VzJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgY2hpbGRyZW46IFtbXV1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbihyZWFkU2VxdWVuY2UsIHJlY29nbml6ZXIpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChMRUZUUEFSRU5USEVTSVMpO1xuICAgICAgICBjaGlsZHJlbiA9IHJlYWRTZXF1ZW5jZS5jYWxsKHRoaXMsIHJlY29nbml6ZXIpO1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFJJR0hUUEFSRU5USEVTSVMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnUGFyZW50aGVzZXMnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKCcoJyk7XG4gICAgICAgIHRoaXMuZWFjaChwcm9jZXNzQ2h1bmssIG5vZGUpO1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJyknKTtcbiAgICB9XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgUEVSQ0VOVFNJR04gPSBUWVBFLlBlcmNlbnRTaWduO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnUGVyY2VudGFnZScsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBudW1iZXIgPSB0aGlzLnNjYW5uZXIuY29uc3VtZShOVU1CRVIpO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoUEVSQ0VOVFNJR04pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnUGVyY2VudGFnZScsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIHZhbHVlOiBudW1iZXJcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUudmFsdWUpO1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJyUnKTtcbiAgICB9XG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIEZVTkNUSU9OID0gVFlQRS5GdW5jdGlvbjtcbnZhciBDT0xPTiA9IFRZUEUuQ29sb247XG52YXIgUklHSFRQQVJFTlRIRVNJUyA9IFRZUEUuUmlnaHRQYXJlbnRoZXNpcztcblxuLy8gOiBpZGVudCBbICcoJyAuLiAnKScgXT9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdQc2V1ZG9DbGFzc1NlbGVjdG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nLFxuICAgICAgICBjaGlsZHJlbjogW1snUmF3J10sIG51bGxdXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICB2YXIgbmFtZTtcbiAgICAgICAgdmFyIG5hbWVMb3dlckNhc2U7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDT0xPTik7XG5cbiAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IEZVTkNUSU9OKSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5zY2FubmVyLmNvbnN1bWVGdW5jdGlvbk5hbWUoKTtcbiAgICAgICAgICAgIG5hbWVMb3dlckNhc2UgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBzZXVkby5oYXNPd25Qcm9wZXJ0eShuYW1lTG93ZXJDYXNlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMucHNldWRvW25hbWVMb3dlckNhc2VdLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBMaXN0KCkuYXBwZW5kRGF0YShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5SYXcodGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbiwgMCwgMCwgZmFsc2UsIGZhbHNlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoUklHSFRQQVJFTlRIRVNJUyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5zY2FubmVyLmNvbnN1bWUoSURFTlRJRklFUik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ1BzZXVkb0NsYXNzU2VsZWN0b3InLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHByb2Nlc3NDaHVuaygnOicpO1xuICAgICAgICBwcm9jZXNzQ2h1bmsobm9kZS5uYW1lKTtcblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHJvY2Vzc0NodW5rKCcoJyk7XG4gICAgICAgICAgICB0aGlzLmVhY2gocHJvY2Vzc0NodW5rLCBub2RlKTtcbiAgICAgICAgICAgIHByb2Nlc3NDaHVuaygnKScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ2Z1bmN0aW9uJ1xufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbGlzdCcpO1xudmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBGVU5DVElPTiA9IFRZUEUuRnVuY3Rpb247XG52YXIgQ09MT04gPSBUWVBFLkNvbG9uO1xudmFyIFJJR0hUUEFSRU5USEVTSVMgPSBUWVBFLlJpZ2h0UGFyZW50aGVzaXM7XG5cbi8vIDo6IGlkZW50IFsgJygnIC4uICcpJyBdP1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1BzZXVkb0VsZW1lbnRTZWxlY3RvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6IFN0cmluZyxcbiAgICAgICAgY2hpbGRyZW46IFtbJ1JhdyddLCBudWxsXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgdmFyIG5hbWU7XG4gICAgICAgIHZhciBuYW1lTG93ZXJDYXNlO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoQ09MT04pO1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KENPTE9OKTtcblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gRlVOQ1RJT04pIHtcbiAgICAgICAgICAgIG5hbWUgPSB0aGlzLnNjYW5uZXIuY29uc3VtZUZ1bmN0aW9uTmFtZSgpO1xuICAgICAgICAgICAgbmFtZUxvd2VyQ2FzZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucHNldWRvLmhhc093blByb3BlcnR5KG5hbWVMb3dlckNhc2UpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5wc2V1ZG9bbmFtZUxvd2VyQ2FzZV0uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJhdyh0aGlzLnNjYW5uZXIuY3VycmVudFRva2VuLCAwLCAwLCBmYWxzZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVhdChSSUdIVFBBUkVOVEhFU0lTKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hbWUgPSB0aGlzLnNjYW5uZXIuY29uc3VtZShJREVOVElGSUVSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnUHNldWRvRWxlbWVudFNlbGVjdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsoJzo6Jyk7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLm5hbWUpO1xuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9jZXNzQ2h1bmsoJygnKTtcbiAgICAgICAgICAgIHRoaXMuZWFjaChwcm9jZXNzQ2h1bmssIG5vZGUpO1xuICAgICAgICAgICAgcHJvY2Vzc0NodW5rKCcpJyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHdhbGtDb250ZXh0OiAnZnVuY3Rpb24nXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1JhdycsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbihzdGFydFRva2VuLCBlbmRUb2tlblR5cGUxLCBlbmRUb2tlblR5cGUyLCBpbmNsdWRlVG9rZW5UeXBlMiwgZXhjbHVkZVdoaXRlU3BhY2UpIHtcbiAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gdGhpcy5zY2FubmVyLmdldFRva2VuU3RhcnQoc3RhcnRUb2tlbik7XG4gICAgICAgIHZhciBlbmRPZmZzZXQ7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXAoXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuZ2V0UmF3TGVuZ3RoKFxuICAgICAgICAgICAgICAgIHN0YXJ0VG9rZW4sXG4gICAgICAgICAgICAgICAgZW5kVG9rZW5UeXBlMSxcbiAgICAgICAgICAgICAgICBlbmRUb2tlblR5cGUyLFxuICAgICAgICAgICAgICAgIGluY2x1ZGVUb2tlblR5cGUyXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4Y2x1ZGVXaGl0ZVNwYWNlICYmIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0ID4gc3RhcnRPZmZzZXQpIHtcbiAgICAgICAgICAgIGVuZE9mZnNldCA9IHRoaXMuc2Nhbm5lci5nZXRPZmZzZXRFeGNsdWRlV1MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuZE9mZnNldCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdSYXcnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHByb2Nlc3NDaHVuayhub2RlLnZhbHVlKTtcbiAgICB9XG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBDT01NQSA9IFRZUEUuQ29tbWE7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdTZWxlY3Rvckxpc3QnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1snU2VsZWN0b3InLCAnUmF3J11dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5ldyBMaXN0KCk7XG5cbiAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmREYXRhKHRoaXMuU2VsZWN0b3IoKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBDT01NQSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdTZWxlY3Rvckxpc3QnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uRnJvbUxpc3QoY2hpbGRyZW4pLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHRoaXMuZWFjaENvbW1hKHByb2Nlc3NDaHVuaywgbm9kZSk7XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ3NlbGVjdG9yJ1xufTtcbiIsInZhciBTVFJJTkcgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFLlN0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1N0cmluZycsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5FbmQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5jb25zdW1lKFNUUklORylcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgcHJvY2Vzc0NodW5rKG5vZGUudmFsdWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBTVFJJTkcgPSBUWVBFLlN0cmluZztcbnZhciBVUkwgPSBUWVBFLlVybDtcbnZhciBSQVcgPSBUWVBFLlJhdztcbnZhciBSSUdIVFBBUkVOVEhFU0lTID0gVFlQRS5SaWdodFBhcmVudGhlc2lzO1xuXG4vLyB1cmwgJygnIFMqIChzdHJpbmcgfCByYXcpIFMqICcpJ1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1VybCcsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBbJ1N0cmluZycsICdSYXcnXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoVVJMKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTVFJJTkc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLlN0cmluZygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJBVzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuUmF3KHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW4sIDAsIFJBVywgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignU3RyaW5nIG9yIFJhdyBpcyBleHBlY3RlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFJJR0hUUEFSRU5USEVTSVMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnVXJsJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHByb2Nlc3NDaHVuaygndXJsJyk7XG4gICAgICAgIHByb2Nlc3NDaHVuaygnKCcpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlKHByb2Nlc3NDaHVuaywgbm9kZS52YWx1ZSk7XG4gICAgICAgIHByb2Nlc3NDaHVuaygnKScpO1xuICAgIH1cbn07XG4iLCJ2YXIgV0hJVEVTUEFDRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuV2hpdGVTcGFjZTtcbnZhciBTUEFDRSA9IE9iamVjdC5mcmVlemUoe1xuICAgIHR5cGU6ICdXaGl0ZVNwYWNlJyxcbiAgICBsb2M6IG51bGwsXG4gICAgdmFsdWU6ICcgJ1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdXaGl0ZVNwYWNlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFdISVRFU1BBQ0UpO1xuICAgICAgICByZXR1cm4gU1BBQ0U7XG5cbiAgICAgICAgLy8gcmV0dXJuIHtcbiAgICAgICAgLy8gICAgIHR5cGU6ICdXaGl0ZVNwYWNlJyxcbiAgICAgICAgLy8gICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbih0aGlzLnNjYW5uZXIudG9rZW5TdGFydCwgdGhpcy5zY2FubmVyLnRva2VuRW5kKSxcbiAgICAgICAgLy8gICAgIHZhbHVlOiB0aGlzLnNjYW5uZXIuY29uc3VtZShXSElURVNQQUNFKVxuICAgICAgICAvLyB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICBwcm9jZXNzQ2h1bmsobm9kZS52YWx1ZSk7XG4gICAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIEFuUGx1c0I6IHJlcXVpcmUoJy4vQW5QbHVzQicpLFxuICAgIEF0cnVsZTogcmVxdWlyZSgnLi9BdHJ1bGUnKSxcbiAgICBBdHJ1bGVQcmVsdWRlOiByZXF1aXJlKCcuL0F0cnVsZVByZWx1ZGUnKSxcbiAgICBBdHRyaWJ1dGVTZWxlY3RvcjogcmVxdWlyZSgnLi9BdHRyaWJ1dGVTZWxlY3RvcicpLFxuICAgIEJsb2NrOiByZXF1aXJlKCcuL0Jsb2NrJyksXG4gICAgQnJhY2tldHM6IHJlcXVpcmUoJy4vQnJhY2tldHMnKSxcbiAgICBDREM6IHJlcXVpcmUoJy4vQ0RDJyksXG4gICAgQ0RPOiByZXF1aXJlKCcuL0NETycpLFxuICAgIENsYXNzU2VsZWN0b3I6IHJlcXVpcmUoJy4vQ2xhc3NTZWxlY3RvcicpLFxuICAgIENvbWJpbmF0b3I6IHJlcXVpcmUoJy4vQ29tYmluYXRvcicpLFxuICAgIENvbW1lbnQ6IHJlcXVpcmUoJy4vQ29tbWVudCcpLFxuICAgIERlY2xhcmF0aW9uOiByZXF1aXJlKCcuL0RlY2xhcmF0aW9uJyksXG4gICAgRGVjbGFyYXRpb25MaXN0OiByZXF1aXJlKCcuL0RlY2xhcmF0aW9uTGlzdCcpLFxuICAgIERpbWVuc2lvbjogcmVxdWlyZSgnLi9EaW1lbnNpb24nKSxcbiAgICBGdW5jdGlvbjogcmVxdWlyZSgnLi9GdW5jdGlvbicpLFxuICAgIEhleENvbG9yOiByZXF1aXJlKCcuL0hleENvbG9yJyksXG4gICAgSWRlbnRpZmllcjogcmVxdWlyZSgnLi9JZGVudGlmaWVyJyksXG4gICAgSWRTZWxlY3RvcjogcmVxdWlyZSgnLi9JZFNlbGVjdG9yJyksXG4gICAgTWVkaWFGZWF0dXJlOiByZXF1aXJlKCcuL01lZGlhRmVhdHVyZScpLFxuICAgIE1lZGlhUXVlcnk6IHJlcXVpcmUoJy4vTWVkaWFRdWVyeScpLFxuICAgIE1lZGlhUXVlcnlMaXN0OiByZXF1aXJlKCcuL01lZGlhUXVlcnlMaXN0JyksXG4gICAgTnRoOiByZXF1aXJlKCcuL050aCcpLFxuICAgIE51bWJlcjogcmVxdWlyZSgnLi9OdW1iZXInKSxcbiAgICBPcGVyYXRvcjogcmVxdWlyZSgnLi9PcGVyYXRvcicpLFxuICAgIFBhcmVudGhlc2VzOiByZXF1aXJlKCcuL1BhcmVudGhlc2VzJyksXG4gICAgUGVyY2VudGFnZTogcmVxdWlyZSgnLi9QZXJjZW50YWdlJyksXG4gICAgUHNldWRvQ2xhc3NTZWxlY3RvcjogcmVxdWlyZSgnLi9Qc2V1ZG9DbGFzc1NlbGVjdG9yJyksXG4gICAgUHNldWRvRWxlbWVudFNlbGVjdG9yOiByZXF1aXJlKCcuL1BzZXVkb0VsZW1lbnRTZWxlY3RvcicpLFxuICAgIFJhdGlvOiByZXF1aXJlKCcuL1JhdGlvJyksXG4gICAgUmF3OiByZXF1aXJlKCcuL1JhdycpLFxuICAgIFJ1bGU6IHJlcXVpcmUoJy4vUnVsZScpLFxuICAgIFNlbGVjdG9yOiByZXF1aXJlKCcuL1NlbGVjdG9yJyksXG4gICAgU2VsZWN0b3JMaXN0OiByZXF1aXJlKCcuL1NlbGVjdG9yTGlzdCcpLFxuICAgIFN0cmluZzogcmVxdWlyZSgnLi9TdHJpbmcnKSxcbiAgICBTdHlsZVNoZWV0OiByZXF1aXJlKCcuL1N0eWxlU2hlZXQnKSxcbiAgICBUeXBlU2VsZWN0b3I6IHJlcXVpcmUoJy4vVHlwZVNlbGVjdG9yJyksXG4gICAgVW5pY29kZVJhbmdlOiByZXF1aXJlKCcuL1VuaWNvZGVSYW5nZScpLFxuICAgIFVybDogcmVxdWlyZSgnLi9VcmwnKSxcbiAgICBWYWx1ZTogcmVxdWlyZSgnLi9WYWx1ZScpLFxuICAgIFdoaXRlU3BhY2U6IHJlcXVpcmUoJy4vV2hpdGVTcGFjZScpXG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdBdHJ1bGVQcmVsdWRlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgY2hpbGRyZW46IFtbXV1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG51bGw7XG5cbiAgICAgICAgaWYgKG5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hdHJ1bGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSBjb25zdW1lclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0cnVsZVtuYW1lXS5wcmVsdWRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSB0aGlzLmF0cnVsZVtuYW1lXS5wcmVsdWRlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0IGNvbnN1bWVyXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMucmVhZFNlcXVlbmNlKHRoaXMuc2NvcGUuQXRydWxlUHJlbHVkZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IExpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQXRydWxlUHJlbHVkZScsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb25Gcm9tTGlzdChjaGlsZHJlbiksXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihwcm9jZXNzQ2h1bmssIG5vZGUpIHtcbiAgICAgICAgdGhpcy5lYWNoKHByb2Nlc3NDaHVuaywgbm9kZSk7XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ2F0cnVsZVByZWx1ZGUnXG59O1xuIiwiLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1zeW50YXgtMy8jdGhlLWFuYi10eXBlXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnTnRoJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbnRoOiBbJ0FuUGx1c0InLCAnSWRlbnRpZmllciddLFxuICAgICAgICBzZWxlY3RvcjogWydTZWxlY3Rvckxpc3QnLCBudWxsXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKGFsbG93T2ZDbGF1c2UpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgZW5kID0gc3RhcnQ7XG4gICAgICAgIHZhciBzZWxlY3RvciA9IG51bGw7XG4gICAgICAgIHZhciBxdWVyeTtcblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLmxvb2t1cFZhbHVlKDAsICdvZGQnKSB8fCB0aGlzLnNjYW5uZXIubG9va3VwVmFsdWUoMCwgJ2V2ZW4nKSkge1xuICAgICAgICAgICAgcXVlcnkgPSB0aGlzLklkZW50aWZpZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5BblBsdXNCKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgaWYgKGFsbG93T2ZDbGF1c2UgJiYgdGhpcy5zY2FubmVyLmxvb2t1cFZhbHVlKDAsICdvZicpKSB7XG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuXG4gICAgICAgICAgICBzZWxlY3RvciA9IHRoaXMuU2VsZWN0b3JMaXN0KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBzZWxlY3Rvci5jaGlsZHJlbi5sYXN0KCkubG9jLmVuZC5vZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gcXVlcnkubG9jLmVuZC5vZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ050aCcsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIGVuZCksXG4gICAgICAgICAgICBudGg6IHF1ZXJ5LFxuICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocHJvY2Vzc0NodW5rLCBub2RlKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGUocHJvY2Vzc0NodW5rLCBub2RlLm50aCk7XG4gICAgICAgIGlmIChub2RlLnNlbGVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9jZXNzQ2h1bmsoJyBvZiAnKTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGUocHJvY2Vzc0NodW5rLCBub2RlLnNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnU2VsZWN0b3InLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1tcbiAgICAgICAgICAgICdUeXBlU2VsZWN0b3InLFxuICAgICAgICAgICAgJ0lkU2VsZWN0b3InLFxuICAgICAgICAgICAgJ0NsYXNzU2VsZWN0b3InLFxuICAgICAgICAgICAgJ0F0dHJpYnV0ZVNlbGVjdG9yJyxcbiAgICAgICAgICAgICdQc2V1ZG9DbGFzc1NlbGVjdG9yJyxcbiAgICAgICAgICAgICdQc2V1ZG9FbGVtZW50U2VsZWN0b3InLFxuICAgICAgICAgICAgJ0NvbWJpbmF0b3InLFxuICAgICAgICAgICAgJ1doaXRlU3BhY2UnXG4gICAgICAgIF1dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucmVhZFNlcXVlbmNlKHRoaXMuc2NvcGUuU2VsZWN0b3IpO1xuXG4gICAgICAgIC8vIG5vdGhpbmcgd2VyZSBjb25zdW1lZFxuICAgICAgICBpZiAoY2hpbGRyZW4uaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ1NlbGVjdG9yIGlzIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ1NlbGVjdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbkZyb21MaXN0KGNoaWxkcmVuKSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKHByb2Nlc3NDaHVuaywgbm9kZSkge1xuICAgICAgICB0aGlzLmVhY2gocHJvY2Vzc0NodW5rLCBub2RlKTtcbiAgICB9XG59O1xuIiwidmFyIGRhdGEgPSByZXF1aXJlKCcuLi8uLi8uLi9kYXRhJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdlbmVyaWM6IHRydWUsXG4gICAgdHlwZXM6IGRhdGEudHlwZXMsXG4gICAgcHJvcGVydGllczogZGF0YS5wcm9wZXJ0aWVzLFxuICAgIG5vZGU6IHJlcXVpcmUoJy4uL25vZGUnKVxufTtcbiIsInZhciBjbXBDaGFyID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuY21wQ2hhcjtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgU1RSSU5HID0gVFlQRS5TdHJpbmc7XG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgRlVOQ1RJT04gPSBUWVBFLkZ1bmN0aW9uO1xudmFyIFVSTCA9IFRZUEUuVXJsO1xudmFyIE5VTUJFUlNJR04gPSBUWVBFLk51bWJlclNpZ247XG52YXIgTEVGVFBBUkVOVEhFU0lTID0gVFlQRS5MZWZ0UGFyZW50aGVzaXM7XG52YXIgTEVGVFNRVUFSRUJSQUNLRVQgPSBUWVBFLkxlZnRTcXVhcmVCcmFja2V0O1xudmFyIFBMVVNTSUdOID0gVFlQRS5QbHVzU2lnbjtcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgQ09NTUEgPSBUWVBFLkNvbW1hO1xudmFyIFNPTElEVVMgPSBUWVBFLlNvbGlkdXM7XG52YXIgQVNURVJJU0sgPSBUWVBFLkFzdGVyaXNrO1xudmFyIFBFUkNFTlRTSUdOID0gVFlQRS5QZXJjZW50U2lnbjtcbnZhciBCQUNLU0xBU0ggPSBUWVBFLkJhY2tzbGFzaDtcbnZhciBVID0gMTE3OyAvLyAndScuY2hhckNvZGVBdCgwKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmF1bHRSZWNvZ25pemVyKGNvbnRleHQpIHtcbiAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgY2FzZSBOVU1CRVJTSUdOOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuSGV4Q29sb3IoKTtcblxuICAgICAgICBjYXNlIENPTU1BOlxuICAgICAgICAgICAgY29udGV4dC5zcGFjZSA9IG51bGw7XG4gICAgICAgICAgICBjb250ZXh0Lmlnbm9yZVdTQWZ0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuT3BlcmF0b3IoKTtcblxuICAgICAgICBjYXNlIFNPTElEVVM6XG4gICAgICAgIGNhc2UgQVNURVJJU0s6XG4gICAgICAgIGNhc2UgUExVU1NJR046XG4gICAgICAgIGNhc2UgSFlQSEVOTUlOVVM6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5PcGVyYXRvcigpO1xuXG4gICAgICAgIGNhc2UgTEVGVFBBUkVOVEhFU0lTOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuUGFyZW50aGVzZXModGhpcy5yZWFkU2VxdWVuY2UsIGNvbnRleHQucmVjb2duaXplcik7XG5cbiAgICAgICAgY2FzZSBMRUZUU1FVQVJFQlJBQ0tFVDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJyYWNrZXRzKHRoaXMucmVhZFNlcXVlbmNlLCBjb250ZXh0LnJlY29nbml6ZXIpO1xuXG4gICAgICAgIGNhc2UgU1RSSU5HOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU3RyaW5nKCk7XG5cbiAgICAgICAgY2FzZSBOVU1CRVI6XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci5sb29rdXBUeXBlKDEpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBQRVJDRU5UU0lHTjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUGVyY2VudGFnZSgpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICAgICAgICAgICAgICAvLyBlZGdlIGNhc2U6IG51bWJlciB3aXRoIGZvbG93aW5nIFxcMCBhbmQgXFw5IGhhY2sgc2hvdWxkbid0IHRvIGJlIGEgRGltZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbXBDaGFyKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRoaXMuc2Nhbm5lci50b2tlbkVuZCwgQkFDS1NMQVNIKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5EaW1lbnNpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTnVtYmVyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGVU5DVElPTjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkZ1bmN0aW9uKHRoaXMucmVhZFNlcXVlbmNlLCBjb250ZXh0LnJlY29nbml6ZXIpO1xuXG4gICAgICAgIGNhc2UgVVJMOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuVXJsKCk7XG5cbiAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHVuaWNvZGUgcmFuZ2UsIGl0IHNob3VsZCBzdGFydCB3aXRoIHUrIG9yIFUrXG4gICAgICAgICAgICBpZiAoY21wQ2hhcih0aGlzLnNjYW5uZXIuc291cmNlLCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCwgVSkgJiZcbiAgICAgICAgICAgICAgICBjbXBDaGFyKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0ICsgMSwgUExVU1NJR04pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVW5pY29kZVJhbmdlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLklkZW50aWZpZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBOVU1CRVIgPSBUWVBFLk51bWJlcjtcbnZhciBOVU1CRVJTSUdOID0gVFlQRS5OdW1iZXJTaWduO1xudmFyIExFRlRTUVVBUkVCUkFDS0VUID0gVFlQRS5MZWZ0U3F1YXJlQnJhY2tldDtcbnZhciBQTFVTU0lHTiA9IFRZUEUuUGx1c1NpZ247XG52YXIgU09MSURVUyA9IFRZUEUuU29saWR1cztcbnZhciBBU1RFUklTSyA9IFRZUEUuQXN0ZXJpc2s7XG52YXIgRlVMTFNUT1AgPSBUWVBFLkZ1bGxTdG9wO1xudmFyIENPTE9OID0gVFlQRS5Db2xvbjtcbnZhciBHUkVBVEVSVEhBTlNJR04gPSBUWVBFLkdyZWF0ZXJUaGFuU2lnbjtcbnZhciBWRVJUSUNBTExJTkUgPSBUWVBFLlZlcnRpY2FsTGluZTtcbnZhciBUSUxERSA9IFRZUEUuVGlsZGU7XG5cbmZ1bmN0aW9uIGdldE5vZGUoY29udGV4dCkge1xuICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICBjYXNlIFBMVVNTSUdOOlxuICAgICAgICBjYXNlIEdSRUFURVJUSEFOU0lHTjpcbiAgICAgICAgY2FzZSBUSUxERTpcbiAgICAgICAgICAgIGNvbnRleHQuc3BhY2UgPSBudWxsO1xuICAgICAgICAgICAgY29udGV4dC5pZ25vcmVXU0FmdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbWJpbmF0b3IoKTtcblxuICAgICAgICBjYXNlIFNPTElEVVM6ICAvLyAvZGVlcC9cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbWJpbmF0b3IoKTtcblxuICAgICAgICBjYXNlIEZVTExTVE9QOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ2xhc3NTZWxlY3RvcigpO1xuXG4gICAgICAgIGNhc2UgTEVGVFNRVUFSRUJSQUNLRVQ6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGVTZWxlY3RvcigpO1xuXG4gICAgICAgIGNhc2UgTlVNQkVSU0lHTjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLklkU2VsZWN0b3IoKTtcblxuICAgICAgICBjYXNlIENPTE9OOlxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5sb29rdXBUeXBlKDEpID09PSBDT0xPTikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBzZXVkb0VsZW1lbnRTZWxlY3RvcigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Qc2V1ZG9DbGFzc1NlbGVjdG9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICBjYXNlIEFTVEVSSVNLOlxuICAgICAgICBjYXNlIFZFUlRJQ0FMTElORTpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlR5cGVTZWxlY3RvcigpO1xuXG4gICAgICAgIGNhc2UgTlVNQkVSOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuUGVyY2VudGFnZSgpO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldE5vZGU6IGdldE5vZGVcbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2xpc3QnKTtcblxuLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1pbWFnZXMtNC8jZWxlbWVudC1ub3RhdGlvblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2VsZW1lbnRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgdmFyIGlkID0gdGhpcy5JZFNlbGVjdG9yKCk7XG5cbiAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICBpZFxuICAgICk7XG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG52YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIENPTU1BID0gVFlQRS5Db21tYTtcbnZhciBTRU1JQ09MT04gPSBUWVBFLlNlbWljb2xvbjtcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgRVhDTEFNQVRJT05NQVJLID0gVFlQRS5FeGNsYW1hdGlvbk1hcms7XG5cbi8vIHZhciAnKCcgaWRlbnQgKCcsJyA8dmFsdWU+PyApPyAnKSdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbmV3IExpc3QoKTtcblxuICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgIHZhciBpZGVudFN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICB0aGlzLnNjYW5uZXIuZWF0KEhZUEhFTk1JTlVTKTtcbiAgICBpZiAodGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSAhPT0gSFlQSEVOTUlOVVMpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdIeXBoZW5NaW51cyBpcyBleHBlY3RlZCcpO1xuICAgIH1cbiAgICB0aGlzLnNjYW5uZXIuZWF0KElERU5USUZJRVIpO1xuXG4gICAgY2hpbGRyZW4uYXBwZW5kRGF0YSh7XG4gICAgICAgIHR5cGU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKGlkZW50U3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgbmFtZTogdGhpcy5zY2FubmVyLnN1YnN0clRvQ3Vyc29yKGlkZW50U3RhcnQpXG4gICAgfSk7XG5cbiAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gQ09NTUEpIHtcbiAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YSh0aGlzLk9wZXJhdG9yKCkpO1xuICAgICAgICBjaGlsZHJlbi5hcHBlbmREYXRhKHRoaXMucGFyc2VDdXN0b21Qcm9wZXJ0eVxuICAgICAgICAgICAgPyB0aGlzLlZhbHVlKG51bGwpXG4gICAgICAgICAgICA6IHRoaXMuUmF3KHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW4sIEVYQ0xBTUFUSU9OTUFSSywgU0VNSUNPTE9OLCBmYWxzZSwgZmFsc2UpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbGlzdCcpO1xudmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgU1RSSU5HID0gVFlQRS5TdHJpbmc7XG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBVUkwgPSBUWVBFLlVybDtcbnZhciBMRUZUUEFSRU5USEVTSVMgPSBUWVBFLkxlZnRQYXJlbnRoZXNpcztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IHtcbiAgICAgICAgcHJlbHVkZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBuZXcgTGlzdCgpO1xuXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmREYXRhKHRoaXMuU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgVVJMOlxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmREYXRhKHRoaXMuVXJsKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignU3RyaW5nIG9yIHVybCgpIGlzIGV4cGVjdGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIubG9va3VwTm9uV1NUeXBlKDApID09PSBJREVOVElGSUVSIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmxvb2t1cE5vbldTVHlwZSgwKSA9PT0gTEVGVFBBUkVOVEhFU0lTKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YSh0aGlzLldoaXRlU3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kRGF0YSh0aGlzLk1lZGlhUXVlcnlMaXN0KCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH0sXG4gICAgICAgIGJsb2NrOiBudWxsXG4gICAgfVxufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvbGlzdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24gc2VsZWN0b3JMaXN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgdGhpcy5TZWxlY3Rvckxpc3QoKVxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL2xpc3QnKTtcbnZhciBBTExPV19PRl9DTEFVU0UgPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdCgpLmFwcGVuZERhdGEoXG4gICAgICAgICAgICB0aGlzLk50aChBTExPV19PRl9DTEFVU0UpXG4gICAgICAgICk7XG4gICAgfVxufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvbGlzdCcpO1xudmFyIERJU0FMTE9XX09GX0NMQVVTRSA9IGZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24gbnRoKCkge1xuICAgICAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgdGhpcy5OdGgoRElTQUxMT1dfT0ZfQ0xBVVNFKVxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJmdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgZGVzdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNyYyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NyZWF0ZScpLmNyZWF0ZShcbiAgICBtZXJnZShcbiAgICAgICAgcmVxdWlyZSgnLi9jb25maWcvbGV4ZXInKSxcbiAgICAgICAgcmVxdWlyZSgnLi9jb25maWcvcGFyc2VyJyksXG4gICAgICAgIHJlcXVpcmUoJy4vY29uZmlnL3dhbGtlcicpXG4gICAgKVxuKTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlQ29udGV4dDoge1xuICAgICAgICBkZWZhdWx0OiAnU3R5bGVTaGVldCcsXG4gICAgICAgIHN0eWxlc2hlZXQ6ICdTdHlsZVNoZWV0JyxcbiAgICAgICAgYXRydWxlOiAnQXRydWxlJyxcbiAgICAgICAgYXRydWxlUHJlbHVkZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQXRydWxlUHJlbHVkZShvcHRpb25zLmF0cnVsZSA/IFN0cmluZyhvcHRpb25zLmF0cnVsZSkgOiBudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVkaWFRdWVyeUxpc3Q6ICdNZWRpYVF1ZXJ5TGlzdCcsXG4gICAgICAgIG1lZGlhUXVlcnk6ICdNZWRpYVF1ZXJ5JyxcbiAgICAgICAgcnVsZTogJ1J1bGUnLFxuICAgICAgICBzZWxlY3Rvckxpc3Q6ICdTZWxlY3Rvckxpc3QnLFxuICAgICAgICBzZWxlY3RvcjogJ1NlbGVjdG9yJyxcbiAgICAgICAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQmxvY2sodHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlY2xhcmF0aW9uTGlzdDogJ0RlY2xhcmF0aW9uTGlzdCcsXG4gICAgICAgIGRlY2xhcmF0aW9uOiAnRGVjbGFyYXRpb24nLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuVmFsdWUob3B0aW9ucy5wcm9wZXJ0eSA/IFN0cmluZyhvcHRpb25zLnByb3BlcnR5KSA6IG51bGwpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBzY29wZTogcmVxdWlyZSgnLi4vc2NvcGUnKSxcbiAgICBhdHJ1bGU6IHJlcXVpcmUoJy4uL2F0cnVsZScpLFxuICAgIHBzZXVkbzogcmVxdWlyZSgnLi4vcHNldWRvJyksXG4gICAgbm9kZTogcmVxdWlyZSgnLi4vbm9kZScpXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQXRydWxlUHJlbHVkZTogcmVxdWlyZSgnLi9hdHJ1bGVQcmVsdWRlJyksXG4gICAgU2VsZWN0b3I6IHJlcXVpcmUoJy4vc2VsZWN0b3InKSxcbiAgICBWYWx1ZTogcmVxdWlyZSgnLi92YWx1ZScpXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0Tm9kZTogcmVxdWlyZSgnLi9kZWZhdWx0Jylcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBnZXROb2RlOiByZXF1aXJlKCcuL2RlZmF1bHQnKSxcbiAgICAnLW1vei1lbGVtZW50JzogcmVxdWlyZSgnLi4vZnVuY3Rpb24vZWxlbWVudCcpLFxuICAgICdlbGVtZW50JzogcmVxdWlyZSgnLi4vZnVuY3Rpb24vZWxlbWVudCcpLFxuICAgICdleHByZXNzaW9uJzogcmVxdWlyZSgnLi4vZnVuY3Rpb24vZXhwcmVzc2lvbicpLFxuICAgICd2YXInOiByZXF1aXJlKCcuLi9mdW5jdGlvbi92YXInKVxufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbGlzdCcpO1xuXG4vLyBsZWdhY3kgSUUgZnVuY3Rpb25cbi8vIGV4cHJlc3Npb24gJygnIHJhdyAnKSdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBMaXN0KCkuYXBwZW5kRGF0YShcbiAgICAgICAgdGhpcy5SYXcodGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbiwgMCwgMCwgZmFsc2UsIGZhbHNlKVxuICAgICk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2ZvbnQtZmFjZSc6IHJlcXVpcmUoJy4vZm9udC1mYWNlJyksXG4gICAgJ2ltcG9ydCc6IHJlcXVpcmUoJy4vaW1wb3J0JyksXG4gICAgJ21lZGlhJzogcmVxdWlyZSgnLi9tZWRpYScpLFxuICAgICdwYWdlJzogcmVxdWlyZSgnLi9wYWdlJyksXG4gICAgJ3N1cHBvcnRzJzogcmVxdWlyZSgnLi9zdXBwb3J0cycpXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IHtcbiAgICAgICAgcHJlbHVkZTogbnVsbCxcbiAgICAgICAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQmxvY2sodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlOiB7XG4gICAgICAgIHByZWx1ZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0KCkuYXBwZW5kRGF0YShcbiAgICAgICAgICAgICAgICB0aGlzLk1lZGlhUXVlcnlMaXN0KClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGJsb2NrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJsb2NrKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2xpc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IHtcbiAgICAgICAgcHJlbHVkZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JMaXN0KClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGJsb2NrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJsb2NrKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdkaXInOiByZXF1aXJlKCcuL2RpcicpLFxuICAgICdoYXMnOiByZXF1aXJlKCcuL2hhcycpLFxuICAgICdsYW5nJzogcmVxdWlyZSgnLi9sYW5nJyksXG4gICAgJ21hdGNoZXMnOiByZXF1aXJlKCcuL21hdGNoZXMnKSxcbiAgICAnbm90JzogcmVxdWlyZSgnLi9ub3QnKSxcbiAgICAnbnRoLWNoaWxkJzogcmVxdWlyZSgnLi9udGgtY2hpbGQnKSxcbiAgICAnbnRoLWxhc3QtY2hpbGQnOiByZXF1aXJlKCcuL250aC1sYXN0LWNoaWxkJyksXG4gICAgJ250aC1sYXN0LW9mLXR5cGUnOiByZXF1aXJlKCcuL250aC1sYXN0LW9mLXR5cGUnKSxcbiAgICAnbnRoLW9mLXR5cGUnOiByZXF1aXJlKCcuL250aC1vZi10eXBlJyksXG4gICAgJ3Nsb3R0ZWQnOiByZXF1aXJlKCcuL3Nsb3R0ZWQnKVxufTtcbiIsInZhciBMaXN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbGlzdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGlzdCgpLmFwcGVuZERhdGEoXG4gICAgICAgICAgICB0aGlzLklkZW50aWZpZXIoKVxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2xpc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgdGhpcy5TZWxlY3Rvckxpc3QoKVxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2xpc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgdGhpcy5JZGVudGlmaWVyKClcbiAgICAgICAgKTtcbiAgICB9XG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9saXN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlOiBmdW5jdGlvbiBjb21wb3VuZFNlbGVjdG9yKCkge1xuICAgICAgICByZXR1cm4gbmV3IExpc3QoKS5hcHBlbmREYXRhKFxuICAgICAgICAgICAgdGhpcy5TZWxlY3RvcigpXG4gICAgICAgICk7XG4gICAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5vZGU6IHJlcXVpcmUoJy4uL25vZGUnKVxufTtcbiIsIi8vISBzdGFibGUuanMgMC4xLjgsIGh0dHBzOi8vZ2l0aHViLmNvbS9Ud28tU2NyZWVuL3N0YWJsZVxuLy8hIMKpIDIwMTggQW5ncnkgQnl0ZXMgYW5kIGNvbnRyaWJ1dG9ycy4gTUlUIGxpY2Vuc2VkLlxuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gIChnbG9iYWwuc3RhYmxlID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIEEgc3RhYmxlIGFycmF5IHNvcnQsIGJlY2F1c2UgYEFycmF5I3NvcnQoKWAgaXMgbm90IGd1YXJhbnRlZWQgc3RhYmxlLlxuICAvLyBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIG1lcmdlIHNvcnQsIHdpdGhvdXQgcmVjdXJzaW9uLlxuXG4gIHZhciBzdGFibGUgPSBmdW5jdGlvbiAoYXJyLCBjb21wKSB7XG4gICAgcmV0dXJuIGV4ZWMoYXJyLnNsaWNlKCksIGNvbXApXG4gIH07XG5cbiAgc3RhYmxlLmlucGxhY2UgPSBmdW5jdGlvbiAoYXJyLCBjb21wKSB7XG4gICAgdmFyIHJlc3VsdCA9IGV4ZWMoYXJyLCBjb21wKTtcblxuICAgIC8vIFRoaXMgc2ltcGx5IGNvcGllcyBiYWNrIGlmIHRoZSByZXN1bHQgaXNuJ3QgaW4gdGhlIG9yaWdpbmFsIGFycmF5LFxuICAgIC8vIHdoaWNoIGhhcHBlbnMgb24gYW4gb2RkIG51bWJlciBvZiBwYXNzZXMuXG4gICAgaWYgKHJlc3VsdCAhPT0gYXJyKSB7XG4gICAgICBwYXNzKHJlc3VsdCwgbnVsbCwgYXJyLmxlbmd0aCwgYXJyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyXG4gIH07XG5cbiAgLy8gRXhlY3V0ZSB0aGUgc29ydCB1c2luZyB0aGUgaW5wdXQgYXJyYXkgYW5kIGEgc2Vjb25kIGJ1ZmZlciBhcyB3b3JrIHNwYWNlLlxuICAvLyBSZXR1cm5zIG9uZSBvZiB0aG9zZSB0d28sIGNvbnRhaW5pbmcgdGhlIGZpbmFsIHJlc3VsdC5cbiAgZnVuY3Rpb24gZXhlYyhhcnIsIGNvbXApIHtcbiAgICBpZiAodHlwZW9mKGNvbXApICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhhKS5sb2NhbGVDb21wYXJlKGIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNob3J0LWNpcmN1aXQgd2hlbiB0aGVyZSdzIG5vdGhpbmcgdG8gc29ydC5cbiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcbiAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICAvLyBSYXRoZXIgdGhhbiBkaXZpZGluZyBpbnB1dCwgc2ltcGx5IGl0ZXJhdGUgY2h1bmtzIG9mIDEsIDIsIDQsIDgsIGV0Yy5cbiAgICAvLyBDaHVua3MgYXJlIHRoZSBzaXplIG9mIHRoZSBsZWZ0IG9yIHJpZ2h0IGhhbmQgaW4gbWVyZ2Ugc29ydC5cbiAgICAvLyBTdG9wIHdoZW4gdGhlIGxlZnQtaGFuZCBjb3ZlcnMgYWxsIG9mIHRoZSBhcnJheS5cbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGxlbik7XG4gICAgZm9yICh2YXIgY2hrID0gMTsgY2hrIDwgbGVuOyBjaGsgKj0gMikge1xuICAgICAgcGFzcyhhcnIsIGNvbXAsIGNoaywgYnVmZmVyKTtcblxuICAgICAgdmFyIHRtcCA9IGFycjtcbiAgICAgIGFyciA9IGJ1ZmZlcjtcbiAgICAgIGJ1ZmZlciA9IHRtcDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvLyBSdW4gYSBzaW5nbGUgcGFzcyB3aXRoIHRoZSBnaXZlbiBjaHVuayBzaXplLlxuICB2YXIgcGFzcyA9IGZ1bmN0aW9uIChhcnIsIGNvbXAsIGNoaywgcmVzdWx0KSB7XG4gICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIC8vIFN0ZXAgc2l6ZSAvIGRvdWJsZSBjaHVuayBzaXplLlxuICAgIHZhciBkYmwgPSBjaGsgKiAyO1xuICAgIC8vIEJvdW5kcyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgY2h1bmtzLlxuICAgIHZhciBsLCByLCBlO1xuICAgIC8vIEl0ZXJhdG9ycyBvdmVyIHRoZSBsZWZ0IGFuZCByaWdodCBjaHVuay5cbiAgICB2YXIgbGksIHJpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHBhaXJzIG9mIGNodW5rcy5cbiAgICBmb3IgKGwgPSAwOyBsIDwgbGVuOyBsICs9IGRibCkge1xuICAgICAgciA9IGwgKyBjaGs7XG4gICAgICBlID0gciArIGNoaztcbiAgICAgIGlmIChyID4gbGVuKSByID0gbGVuO1xuICAgICAgaWYgKGUgPiBsZW4pIGUgPSBsZW47XG5cbiAgICAgIC8vIEl0ZXJhdGUgYm90aCBjaHVua3MgaW4gcGFyYWxsZWwuXG4gICAgICBsaSA9IGw7XG4gICAgICByaSA9IHI7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBDb21wYXJlIHRoZSBjaHVua3MuXG4gICAgICAgIGlmIChsaSA8IHIgJiYgcmkgPCBlKSB7XG4gICAgICAgICAgLy8gVGhpcyB3b3JrcyBmb3IgYSByZWd1bGFyIGBzb3J0KClgIGNvbXBhdGlibGUgY29tcGFyYXRvcixcbiAgICAgICAgICAvLyBidXQgYWxzbyBmb3IgYSBzaW1wbGUgY29tcGFyYXRvciBsaWtlOiBgYSA+IGJgXG4gICAgICAgICAgaWYgKGNvbXAoYXJyW2xpXSwgYXJyW3JpXSkgPD0gMCkge1xuICAgICAgICAgICAgcmVzdWx0W2krK10gPSBhcnJbbGkrK107XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W2krK10gPSBhcnJbcmkrK107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gY29tcGFyZSwganVzdCBmbHVzaCB3aGF0J3MgbGVmdC5cbiAgICAgICAgZWxzZSBpZiAobGkgPCByKSB7XG4gICAgICAgICAgcmVzdWx0W2krK10gPSBhcnJbbGkrK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmkgPCBlKSB7XG4gICAgICAgICAgcmVzdWx0W2krK10gPSBhcnJbcmkrK107XG4gICAgICAgIH1cbiAgICAgICAgLy8gQm90aCBpdGVyYXRvcnMgYXJlIGF0IHRoZSBjaHVuayBlbmRzLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzdGFibGU7XG5cbn0pKSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwZWNpZmljaXR5KHNpbXBsZVNlbGVjdG9yKSB7XG4gICAgdmFyIEEgPSAwO1xuICAgIHZhciBCID0gMDtcbiAgICB2YXIgQyA9IDA7XG5cbiAgICBzaW1wbGVTZWxlY3Rvci5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uIHdhbGsobm9kZSkge1xuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnU2VsZWN0b3JMaXN0JzpcbiAgICAgICAgICAgIGNhc2UgJ1NlbGVjdG9yJzpcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLmVhY2god2Fsayk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0lkU2VsZWN0b3InOlxuICAgICAgICAgICAgICAgIEErKztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnQ2xhc3NTZWxlY3Rvcic6XG4gICAgICAgICAgICBjYXNlICdBdHRyaWJ1dGVTZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgQisrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdQc2V1ZG9DbGFzc1NlbGVjdG9yJzpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLmVhY2god2Fsayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdhZnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcnN0LWxpbmUnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdmaXJzdC1sZXR0ZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgQysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmb3IgOm50aC0qKC4uIG9mIDxTZWxlY3Rvckxpc3Q+KSwgOm1hdGNoZXMoKSwgOmhhcygpXG5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEIrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ1BzZXVkb0VsZW1lbnRTZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgQysrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdUeXBlU2VsZWN0b3InOlxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB1bml2ZXJzYWwgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5uYW1lLmNoYXJBdChub2RlLm5hbWUubGVuZ3RoIC0gMSkgIT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICBDKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBbQSwgQiwgQ107XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3NzdHJlZSA9IHJlcXVpcmUoJ2Nzcy10cmVlJyksXG4gICAgY3NzdG9vbHMgPSByZXF1aXJlKCcuLi9jc3MtdG9vbHMnKTtcblxuXG52YXIgQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLnBhcmVudE5vZGUgPSBub2RlO1xuXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaGFzU3luY2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLnN0eWxlQXR0ciA9IG51bGw7XG4gICAgdGhpcy5zdHlsZVZhbHVlID0gbnVsbDtcblxuICAgIHRoaXMucGFyc2VFcnJvciA9IGZhbHNlO1xufTtcblxuXG5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZS5oYXNTdHlsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYWRkU3R5bGVIYW5kbGVyKCk7XG59O1xuXG5cblxuXG4vLyBhdHRyLnN0eWxlXG5cbkNTU1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLmFkZFN0eWxlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXG4gICAgdGhpcy5zdHlsZUF0dHIgPSB7IC8vIGVtcHR5IHN0eWxlIGF0dHJcbiAgICAgICAgJ25hbWUnOiAnc3R5bGUnLFxuICAgICAgICAndmFsdWUnOiBudWxsXG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnBhcmVudE5vZGUuYXR0cnMsICdzdHlsZScsIHtcbiAgICAgICAgZ2V0OiB0aGlzLmdldFN0eWxlQXR0ci5iaW5kKHRoaXMpLFxuICAgICAgICBzZXQ6IHRoaXMuc2V0U3R5bGVBdHRyLmJpbmQodGhpcyksXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRTdHlsZVZhbHVlSGFuZGxlcigpO1xufTtcblxuLy8gYXR0ci5zdHlsZS52YWx1ZVxuXG5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZS5hZGRTdHlsZVZhbHVlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuc3R5bGVBdHRyLCAndmFsdWUnLCB7XG4gICAgICAgIGdldDogdGhpcy5nZXRTdHlsZVZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIHNldDogdGhpcy5zZXRTdHlsZVZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xufTtcblxuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuZ2V0U3R5bGVBdHRyID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGVBdHRyO1xufTtcblxuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuc2V0U3R5bGVBdHRyID0gZnVuY3Rpb24obmV3U3R5bGVBdHRyKSB7XG4gICAgdGhpcy5zZXRTdHlsZVZhbHVlKG5ld1N0eWxlQXR0ci52YWx1ZSk7IC8vIG11c3QgYmVmb3JlIGFwcGx5aW5nIHZhbHVlIGhhbmRsZXIhXG5cbiAgICB0aGlzLnN0eWxlQXR0ciA9IG5ld1N0eWxlQXR0cjtcbiAgICB0aGlzLmFkZFN0eWxlVmFsdWVIYW5kbGVyKCk7XG4gICAgdGhpcy5oYXNTeW5jZWQgPSBmYWxzZTsgLy8gcmF3IGNzcyBjaGFuZ2VkXG59O1xuXG5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZS5nZXRTdHlsZVZhbHVlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3NzVGV4dCgpO1xufTtcblxuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuc2V0U3R5bGVWYWx1ZSA9IGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLmNsZWFyKCk7IC8vIHJlc2V0IGFsbCBleGlzdGluZyBwcm9wZXJ0aWVzXG4gICAgdGhpcy5zdHlsZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5oYXNTeW5jZWQgPSBmYWxzZTsgLy8gcmF3IGNzcyBjaGFuZ2VkXG59O1xuXG5cblxuXG5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZS5fbG9hZENzc1RleHQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5oYXNTeW5jZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhc1N5bmNlZCA9IHRydWU7IC8vIG11c3QgYmUgc2V0IGhlcmUgdG8gcHJldmVudCBsb29wIGluIHNldFByb3BlcnR5KC4uLilcblxuICAgIGlmICghdGhpcy5zdHlsZVZhbHVlIHx8IHRoaXMuc3R5bGVWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5saW5lQ3NzU3RyID0gdGhpcy5zdHlsZVZhbHVlO1xuXG4gICAgdmFyIGRlY2xhcmF0aW9ucyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAgIGRlY2xhcmF0aW9ucyA9IGNzc3RyZWUucGFyc2UoaW5saW5lQ3NzU3RyLCB7XG4gICAgICAgICAgICBjb250ZXh0OiAnZGVjbGFyYXRpb25MaXN0JyxcbiAgICAgICAgICAgIHBhcnNlVmFsdWU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gcGFyc2VFcnJvcjtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcnNlRXJyb3IgPSBmYWxzZTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBkZWNsYXJhdGlvbnMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihkZWNsYXJhdGlvbikge1xuICAgICAgICB2YXIgc3R5bGVEZWNsYXJhdGlvbiA9IGNzc3Rvb2xzLmNzc3RyZWVUb1N0eWxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pO1xuICAgICAgICBzZWxmLnNldFByb3BlcnR5KHN0eWxlRGVjbGFyYXRpb24ubmFtZSwgc3R5bGVEZWNsYXJhdGlvbi52YWx1ZSwgc3R5bGVEZWNsYXJhdGlvbi5wcmlvcml0eSk7XG4gICAgfSk7XG59O1xuXG5cbi8vIG9ubHkgcmVhZHMgZnJvbSBwcm9wZXJ0aWVzXG5cbi8qKlxuICogR2V0IHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWNsYXJhdGlvbiBibG9jayAoZXF1aXZhbGVudCB0byAuY3NzVGV4dCBhdHRyaWJ1dGUpLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gVGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVjbGFyYXRpb24gYmxvY2sgKGVtcHR5IHN0cmluZyBmb3Igbm8gcHJvcGVydGllcylcbiAqL1xuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuZ2V0Q3NzVGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodGhpcy5wYXJzZUVycm9yKSB7XG4gICAgICAgIC8vIGluIGNhc2Ugb2YgYSBwYXJzZSBlcnJvciwgcGFzcyB0aHJvdWdoIG9yaWdpbmFsIHN0eWxlc1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZVZhbHVlO1xuICAgIH1cblxuICAgIHZhciBjc3NUZXh0ID0gW107XG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3BlcnR5LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgdmFyIHN0ckltcG9ydGFudCA9IHByb3BlcnR5LnByaW9yaXR5ID09PSAnaW1wb3J0YW50JyA/ICchaW1wb3J0YW50JyA6ICcnO1xuICAgICAgICBjc3NUZXh0LnB1c2gocHJvcGVydHlOYW1lLnRyaW0oKSArICc6JyArIHByb3BlcnR5LnZhbHVlLnRyaW0oKSArIHN0ckltcG9ydGFudCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNzc1RleHQuam9pbignOycpO1xufTtcblxuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuX2hhbmRsZVBhcnNlRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5wYXJzZUVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV2FybmluZzogUGFyc2UgZXJyb3Igd2hlbiBwYXJzaW5nIGlubGluZSBzdHlsZXMsIHN0eWxlIHByb3BlcnRpZXMgb2YgdGhpcyBlbGVtZW50IGNhbm5vdCBiZSB1c2VkLiBUaGUgcmF3IHN0eWxlcyBjYW4gc3RpbGwgYmUgZ2V0L3NldCB1c2luZyAuYXR0cihcXCdzdHlsZVxcJykudmFsdWUuIEVycm9yIGRldGFpbHM6ICcgKyB0aGlzLnBhcnNlRXJyb3IpO1xuICAgIH1cbn07XG5cblxuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuX2dldFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7XG4gICAgaWYodHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcygpO1xuICAgIHRoaXMuX2hhbmRsZVBhcnNlRXJyb3IoKTtcblxuICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZS50cmltKCkpO1xuICAgIHJldHVybiBwcm9wZXJ0eTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBvcHRpb25hbCBwcmlvcml0eSwgXCJpbXBvcnRhbnRcIi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlOYW1lIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHkgbmFtZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybiB7U3RyaW5nfSBwcmlvcml0eSB0aGF0IHJlcHJlc2VudHMgdGhlIHByaW9yaXR5IChlLmcuIFwiaW1wb3J0YW50XCIpIGlmIG9uZSBleGlzdHMuIElmIG5vbmUgZXhpc3RzLCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gKi9cbkNTU1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLmdldFByb3BlcnR5UHJpb3JpdHkgPSBmdW5jdGlvbihwcm9wZXJ0eU5hbWUpIHtcbiAgICB2YXIgcHJvcGVydHkgPSB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgIHJldHVybiBwcm9wZXJ0eSA/IHByb3BlcnR5LnByaW9yaXR5IDogJyc7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZ2l2ZW4gYSBwcm9wZXJ0eSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWUgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHZhbHVlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gSWYgbm90IHNldCwgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICovXG5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZS5nZXRQcm9wZXJ0eVZhbHVlID0gZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7XG4gICAgdmFyIHByb3BlcnR5ID0gdGhpcy5fZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICByZXR1cm4gcHJvcGVydHkgPyBwcm9wZXJ0eS52YWx1ZSA6IG51bGw7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIHByb3BlcnR5IG5hbWUuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IG9mIHRoZSBub2RlIHRvIGJlIGZldGNoZWQuIFRoZSBpbmRleCBpcyB6ZXJvLWJhc2VkLlxuICogQHJldHVybiB7U3RyaW5nfSBwcm9wZXJ0eU5hbWUgdGhhdCBpcyB0aGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gKi9cbkNTU1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLml0ZW0gPSBmdW5jdGlvbihpbmRleCkge1xuICAgIGlmKHR5cGVvZiBpbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcygpO1xuICAgIHRoaXMuX2hhbmRsZVBhcnNlRXJyb3IoKTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHByb3BlcnRpZXMua2V5cygpKVtpbmRleF07XG59O1xuXG4vKipcbiAqIFJldHVybiBhbGwgcHJvcGVydGllcyBvZiB0aGUgbm9kZS5cbiAqXG4gKiBAcmV0dXJuIHtNYXB9IHByb3BlcnRpZXMgdGhhdCBpcyBhIE1hcCB3aXRoIHByb3BlcnR5TmFtZSBhcyBrZXkgYW5kIHByb3BlcnR5IChwcm9wZXJ0eVZhbHVlICsgcHJvcGVydHlQcmlvcml0eSkgYXMgdmFsdWUuXG4gKi9cbkNTU1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLmdldFByb3BlcnRpZXMgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9sb2FkQ3NzVGV4dCgpO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM7XG59O1xuXG5cbi8vIHdyaXRlcyB0byBwcm9wZXJ0aWVzXG5cbi8qKlxuICogUmVtb3ZlIGEgcHJvcGVydHkgZnJvbSB0aGUgQ1NTIGRlY2xhcmF0aW9uIGJsb2NrLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWUgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGJlIHJlbW92ZWQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IG9sZFZhbHVlIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGUgQ1NTIHByb3BlcnR5IGJlZm9yZSBpdCB3YXMgcmVtb3ZlZC5cbiAqL1xuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUucmVtb3ZlUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wZXJ0eU5hbWUpIHtcbiAgICBpZih0eXBlb2YgcHJvcGVydHlOYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBFcnJvcignMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LicpO1xuICAgIH1cblxuICAgIHRoaXMuaGFzU3R5bGUoKTtcblxuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5faGFuZGxlUGFyc2VFcnJvcigpO1xuXG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSk7XG4gICAgcHJvcGVydGllcy5kZWxldGUocHJvcGVydHlOYW1lLnRyaW0oKSk7XG4gICAgcmV0dXJuIG9sZFZhbHVlO1xufTtcblxuLyoqXG4gKiBNb2RpZnkgYW4gZXhpc3RpbmcgQ1NTIHByb3BlcnR5IG9yIGNyZWF0ZXMgYSBuZXcgQ1NTIHByb3BlcnR5IGluIHRoZSBkZWNsYXJhdGlvbiBibG9jay5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlOYW1lIHJlcHJlc2VudGluZyB0aGUgQ1NTIHByb3BlcnR5IG5hbWUgdG8gYmUgbW9kaWZpZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBjb250YWluaW5nIHRoZSBuZXcgcHJvcGVydHkgdmFsdWUuIElmIG5vdCBzcGVjaWZpZWQsIHRyZWF0ZWQgYXMgdGhlIGVtcHR5IHN0cmluZy4gdmFsdWUgbXVzdCBub3QgY29udGFpbiBcIiFpbXBvcnRhbnRcIiAtLSB0aGF0IHNob3VsZCBiZSBzZXQgdXNpbmcgdGhlIHByaW9yaXR5IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbcHJpb3JpdHldIGFsbG93aW5nIHRoZSBcImltcG9ydGFudFwiIENTUyBwcmlvcml0eSB0byBiZSBzZXQuIElmIG5vdCBzcGVjaWZpZWQsIHRyZWF0ZWQgYXMgdGhlIGVtcHR5IHN0cmluZy5cbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuc2V0UHJvcGVydHkgPSBmdW5jdGlvbihwcm9wZXJ0eU5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICAgIGlmKHR5cGVvZiBwcm9wZXJ0eU5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdwcm9wZXJ0eU5hbWUgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IG5vdCBwcmVzZW50LicpO1xuICAgIH1cblxuICAgIHRoaXMuaGFzU3R5bGUoKTtcblxuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5faGFuZGxlUGFyc2VFcnJvcigpO1xuXG4gICAgdmFyIHByb3BlcnR5ID0ge1xuICAgICAgICB2YWx1ZTogdmFsdWUudHJpbSgpLFxuICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkudHJpbSgpXG4gICAgfTtcbiAgICBwcm9wZXJ0aWVzLnNldChwcm9wZXJ0eU5hbWUudHJpbSgpLCBwcm9wZXJ0eSk7XG5cbiAgICByZXR1cm4gcHJvcGVydHk7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFNBWCA9IHJlcXVpcmUoJ3NheCcpLFxuICAgIEpTQVBJID0gcmVxdWlyZSgnLi9qc0FQSS5qcycpLFxuICAgIENTU0NsYXNzTGlzdCA9IHJlcXVpcmUoJy4vY3NzLWNsYXNzLWxpc3QnKSxcbiAgICBDU1NTdHlsZURlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9jc3Mtc3R5bGUtZGVjbGFyYXRpb24nKSxcbiAgICBlbnRpdHlEZWNsYXJhdGlvbiA9IC88IUVOVElUWVxccysoXFxTKylcXHMrKD86JyhbXlxcJ10rKSd8XCIoW15cXFwiXSspXCIpXFxzKj4vZztcblxudmFyIGNvbmZpZyA9IHtcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgdHJpbTogZmFsc2UsXG4gICAgbm9ybWFsaXplOiB0cnVlLFxuICAgIGxvd2VyY2FzZTogdHJ1ZSxcbiAgICB4bWxuczogdHJ1ZSxcbiAgICBwb3NpdGlvbjogdHJ1ZVxufTtcblxuLyoqXG4gKiBDb252ZXJ0IFNWRyAoWE1MKSBzdHJpbmcgdG8gU1ZHLWFzLUpTIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBpbnB1dCBkYXRhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7XG5cbiAgICB2YXIgc2F4ID0gU0FYLnBhcnNlcihjb25maWcuc3RyaWN0LCBjb25maWcpLFxuICAgICAgICByb290ID0gbmV3IEpTQVBJKHsgZWxlbTogJyNkb2N1bWVudCcsIGNvbnRlbnQ6IFtdIH0pLFxuICAgICAgICBjdXJyZW50ID0gcm9vdCxcbiAgICAgICAgc3RhY2sgPSBbcm9vdF0sXG4gICAgICAgIHRleHRDb250ZXh0ID0gbnVsbCxcbiAgICAgICAgcGFyc2luZ0Vycm9yID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBwdXNoVG9Db250ZW50KGNvbnRlbnQpIHtcblxuICAgICAgICBjb250ZW50ID0gbmV3IEpTQVBJKGNvbnRlbnQsIGN1cnJlbnQpO1xuXG4gICAgICAgIChjdXJyZW50LmNvbnRlbnQgPSBjdXJyZW50LmNvbnRlbnQgfHwgW10pLnB1c2goY29udGVudCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgICB9XG5cbiAgICBzYXgub25kb2N0eXBlID0gZnVuY3Rpb24oZG9jdHlwZSkge1xuXG4gICAgICAgIHB1c2hUb0NvbnRlbnQoe1xuICAgICAgICAgICAgZG9jdHlwZTogZG9jdHlwZVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgc3Vic2V0U3RhcnQgPSBkb2N0eXBlLmluZGV4T2YoJ1snKSxcbiAgICAgICAgICAgIGVudGl0eU1hdGNoO1xuXG4gICAgICAgIGlmIChzdWJzZXRTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBlbnRpdHlEZWNsYXJhdGlvbi5sYXN0SW5kZXggPSBzdWJzZXRTdGFydDtcblxuICAgICAgICAgICAgd2hpbGUgKChlbnRpdHlNYXRjaCA9IGVudGl0eURlY2xhcmF0aW9uLmV4ZWMoZGF0YSkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzYXguRU5USVRJRVNbZW50aXR5TWF0Y2hbMV1dID0gZW50aXR5TWF0Y2hbMl0gfHwgZW50aXR5TWF0Y2hbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc2F4Lm9ucHJvY2Vzc2luZ2luc3RydWN0aW9uID0gZnVuY3Rpb24oZGF0YSkge1xuXG4gICAgICAgIHB1c2hUb0NvbnRlbnQoe1xuICAgICAgICAgICAgcHJvY2Vzc2luZ2luc3RydWN0aW9uOiBkYXRhXG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIHNheC5vbmNvbW1lbnQgPSBmdW5jdGlvbihjb21tZW50KSB7XG5cbiAgICAgICAgcHVzaFRvQ29udGVudCh7XG4gICAgICAgICAgICBjb21tZW50OiBjb21tZW50LnRyaW0oKVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBzYXgub25jZGF0YSA9IGZ1bmN0aW9uKGNkYXRhKSB7XG5cbiAgICAgICAgcHVzaFRvQ29udGVudCh7XG4gICAgICAgICAgICBjZGF0YTogY2RhdGFcbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgc2F4Lm9ub3BlbnRhZyA9IGZ1bmN0aW9uKGRhdGEpIHtcblxuICAgICAgICB2YXIgZWxlbSA9IHtcbiAgICAgICAgICAgIGVsZW06IGRhdGEubmFtZSxcbiAgICAgICAgICAgIHByZWZpeDogZGF0YS5wcmVmaXgsXG4gICAgICAgICAgICBsb2NhbDogZGF0YS5sb2NhbCxcbiAgICAgICAgICAgIGF0dHJzOiB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIGVsZW0uY2xhc3MgPSBuZXcgQ1NTQ2xhc3NMaXN0KGVsZW0pO1xuICAgICAgICBlbGVtLnN0eWxlID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb24oZWxlbSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEuYXR0cmlidXRlcykubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIGRhdGEuYXR0cmlidXRlcykge1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHsgLy8gaGFzIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBlbGVtLmNsYXNzLmhhc0NsYXNzKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdzdHlsZScpIHsgLy8gaGFzIHN0eWxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmhhc1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbS5hdHRyc1tuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGEuYXR0cmlidXRlc1tuYW1lXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBkYXRhLmF0dHJpYnV0ZXNbbmFtZV0ucHJlZml4LFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDogZGF0YS5hdHRyaWJ1dGVzW25hbWVdLmxvY2FsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW0gPSBwdXNoVG9Db250ZW50KGVsZW0pO1xuICAgICAgICBjdXJyZW50ID0gZWxlbTtcblxuICAgICAgICAvLyBTYXZlIGluZm8gYWJvdXQgPHRleHQ+IHRhZyB0byBwcmV2ZW50IHRyaW1taW5nIG9mIG1lYW5pbmdmdWwgd2hpdGVzcGFjZVxuICAgICAgICBpZiAoZGF0YS5uYW1lID09ICd0ZXh0JyAmJiAhZGF0YS5wcmVmaXgpIHtcbiAgICAgICAgICAgIHRleHRDb250ZXh0ID0gY3VycmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWNrLnB1c2goZWxlbSk7XG5cbiAgICB9O1xuXG4gICAgc2F4Lm9udGV4dCA9IGZ1bmN0aW9uKHRleHQpIHtcblxuICAgICAgICBpZiAoL1xcUy8udGVzdCh0ZXh0KSB8fCB0ZXh0Q29udGV4dCkge1xuXG4gICAgICAgICAgICBpZiAoIXRleHRDb250ZXh0KVxuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTtcblxuICAgICAgICAgICAgcHVzaFRvQ29udGVudCh7XG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHNheC5vbmNsb3NldGFnID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIGxhc3QgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICAvLyBUcmltIHRleHQgaW5zaWRlIDx0ZXh0PiB0YWcuXG4gICAgICAgIGlmIChsYXN0ID09IHRleHRDb250ZXh0KSB7XG4gICAgICAgICAgICB0cmltKHRleHRDb250ZXh0KTtcbiAgICAgICAgICAgIHRleHRDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICB9O1xuXG4gICAgc2F4Lm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgZS5tZXNzYWdlID0gJ0Vycm9yIGluIHBhcnNpbmcgU1ZHOiAnICsgZS5tZXNzYWdlO1xuICAgICAgICBpZiAoZS5tZXNzYWdlLmluZGV4T2YoJ1VuZXhwZWN0ZWQgZW5kJykgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgc2F4Lm9uZW5kID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhyb290KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHsgZXJyb3I6IHRoaXMuZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICAgIHNheC53cml0ZShkYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhbGxiYWNrKHsgZXJyb3I6IGUubWVzc2FnZSB9KTtcbiAgICAgICAgcGFyc2luZ0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFwYXJzaW5nRXJyb3IpIHNheC5jbG9zZSgpO1xuXG4gICAgZnVuY3Rpb24gdHJpbShlbGVtKSB7XG4gICAgICAgIGlmICghZWxlbS5jb250ZW50KSByZXR1cm4gZWxlbTtcblxuICAgICAgICB2YXIgc3RhcnQgPSBlbGVtLmNvbnRlbnRbMF0sXG4gICAgICAgICAgICBlbmQgPSBlbGVtLmNvbnRlbnRbZWxlbS5jb250ZW50Lmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIHdoaWxlIChzdGFydCAmJiBzdGFydC5jb250ZW50ICYmICFzdGFydC50ZXh0KSBzdGFydCA9IHN0YXJ0LmNvbnRlbnRbMF07XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydC50ZXh0KSBzdGFydC50ZXh0ID0gc3RhcnQudGV4dC5yZXBsYWNlKC9eXFxzKy8sICcnKTtcblxuICAgICAgICB3aGlsZSAoZW5kICYmIGVuZC5jb250ZW50ICYmICFlbmQudGV4dCkgZW5kID0gZW5kLmNvbnRlbnRbZW5kLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChlbmQgJiYgZW5kLnRleHQpIGVuZC50ZXh0ID0gZW5kLnRleHQucmVwbGFjZSgvXFxzKyQvLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGVsZW07XG5cbiAgICB9XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9pbnRyby5odG1sI0RlZmluaXRpb25zXG5leHBvcnRzLmVsZW1zR3JvdXBzID0ge1xuICAgIGFuaW1hdGlvbjogWydhbmltYXRlJywgJ2FuaW1hdGVDb2xvcicsICdhbmltYXRlTW90aW9uJywgJ2FuaW1hdGVUcmFuc2Zvcm0nLCAnc2V0J10sXG4gICAgZGVzY3JpcHRpdmU6IFsnZGVzYycsICdtZXRhZGF0YScsICd0aXRsZSddLFxuICAgIHNoYXBlOiBbJ2NpcmNsZScsICdlbGxpcHNlJywgJ2xpbmUnLCAncGF0aCcsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JlY3QnXSxcbiAgICBzdHJ1Y3R1cmFsOiBbJ2RlZnMnLCAnZycsICdzdmcnLCAnc3ltYm9sJywgJ3VzZSddLFxuICAgIHBhaW50U2VydmVyOiBbJ3NvbGlkQ29sb3InLCAnbGluZWFyR3JhZGllbnQnLCAncmFkaWFsR3JhZGllbnQnLCAnbWVzaEdyYWRpZW50JywgJ3BhdHRlcm4nLCAnaGF0Y2gnXSxcbiAgICBub25SZW5kZXJpbmc6IFsnbGluZWFyR3JhZGllbnQnLCAncmFkaWFsR3JhZGllbnQnLCAncGF0dGVybicsICdjbGlwUGF0aCcsICdtYXNrJywgJ21hcmtlcicsICdzeW1ib2wnLCAnZmlsdGVyJywgJ3NvbGlkQ29sb3InXSxcbiAgICBjb250YWluZXI6IFsnYScsICdkZWZzJywgJ2cnLCAnbWFya2VyJywgJ21hc2snLCAnbWlzc2luZy1nbHlwaCcsICdwYXR0ZXJuJywgJ3N2ZycsICdzd2l0Y2gnLCAnc3ltYm9sJywgJ2ZvcmVpZ25PYmplY3QnXSxcbiAgICB0ZXh0Q29udGVudDogWydhbHRHbHlwaCcsICdhbHRHbHlwaERlZicsICdhbHRHbHlwaEl0ZW0nLCAnZ2x5cGgnLCAnZ2x5cGhSZWYnLCAndGV4dFBhdGgnLCAndGV4dCcsICd0cmVmJywgJ3RzcGFuJ10sXG4gICAgdGV4dENvbnRlbnRDaGlsZDogWydhbHRHbHlwaCcsICd0ZXh0UGF0aCcsICd0cmVmJywgJ3RzcGFuJ10sXG4gICAgbGlnaHRTb3VyY2U6IFsnZmVEaWZmdXNlTGlnaHRpbmcnLCAnZmVTcGVjdWxhckxpZ2h0aW5nJywgJ2ZlRGlzdGFudExpZ2h0JywgJ2ZlUG9pbnRMaWdodCcsICdmZVNwb3RMaWdodCddLFxuICAgIGZpbHRlclByaW1pdGl2ZTogWydmZUJsZW5kJywgJ2ZlQ29sb3JNYXRyaXgnLCAnZmVDb21wb25lbnRUcmFuc2ZlcicsICdmZUNvbXBvc2l0ZScsICdmZUNvbnZvbHZlTWF0cml4JywgJ2ZlRGlmZnVzZUxpZ2h0aW5nJywgJ2ZlRGlzcGxhY2VtZW50TWFwJywgJ2ZlRmxvb2QnLCAnZmVHYXVzc2lhbkJsdXInLCAnZmVJbWFnZScsICdmZU1lcmdlJywgJ2ZlTW9ycGhvbG9neScsICdmZU9mZnNldCcsICdmZVNwZWN1bGFyTGlnaHRpbmcnLCAnZmVUaWxlJywgJ2ZlVHVyYnVsZW5jZSddXG59O1xuXG5leHBvcnRzLnBhdGhFbGVtcyA9IFsncGF0aCcsICdnbHlwaCcsICdtaXNzaW5nLWdseXBoJ107XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9pbnRyby5odG1sI0RlZmluaXRpb25zXG5leHBvcnRzLmF0dHJzR3JvdXBzID0ge1xuICAgIGFuaW1hdGlvbkFkZGl0aW9uOiBbJ2FkZGl0aXZlJywgJ2FjY3VtdWxhdGUnXSxcbiAgICBhbmltYXRpb25BdHRyaWJ1dGVUYXJnZXQ6IFsnYXR0cmlidXRlVHlwZScsICdhdHRyaWJ1dGVOYW1lJ10sXG4gICAgYW5pbWF0aW9uRXZlbnQ6IFsnb25iZWdpbicsICdvbmVuZCcsICdvbnJlcGVhdCcsICdvbmxvYWQnXSxcbiAgICBhbmltYXRpb25UaW1pbmc6IFsnYmVnaW4nLCAnZHVyJywgJ2VuZCcsICdtaW4nLCAnbWF4JywgJ3Jlc3RhcnQnLCAncmVwZWF0Q291bnQnLCAncmVwZWF0RHVyJywgJ2ZpbGwnXSxcbiAgICBhbmltYXRpb25WYWx1ZTogWydjYWxjTW9kZScsICd2YWx1ZXMnLCAna2V5VGltZXMnLCAna2V5U3BsaW5lcycsICdmcm9tJywgJ3RvJywgJ2J5J10sXG4gICAgY29uZGl0aW9uYWxQcm9jZXNzaW5nOiBbJ3JlcXVpcmVkRmVhdHVyZXMnLCAncmVxdWlyZWRFeHRlbnNpb25zJywgJ3N5c3RlbUxhbmd1YWdlJ10sXG4gICAgY29yZTogWydpZCcsICd0YWJpbmRleCcsICd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnXSxcbiAgICBncmFwaGljYWxFdmVudDogWydvbmZvY3VzaW4nLCAnb25mb2N1c291dCcsICdvbmFjdGl2YXRlJywgJ29uY2xpY2snLCAnb25tb3VzZWRvd24nLCAnb25tb3VzZXVwJywgJ29ubW91c2VvdmVyJywgJ29ubW91c2Vtb3ZlJywgJ29ubW91c2VvdXQnLCAnb25sb2FkJ10sXG4gICAgcHJlc2VudGF0aW9uOiBbXG4gICAgICAgICdhbGlnbm1lbnQtYmFzZWxpbmUnLFxuICAgICAgICAnYmFzZWxpbmUtc2hpZnQnLFxuICAgICAgICAnYnVmZmVyZWQtcmVuZGVyaW5nJyxcbiAgICAgICAgJ2NsaXAnLFxuICAgICAgICAnY2xpcC1wYXRoJyxcbiAgICAgICAgJ2NsaXAtcnVsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2xvci1pbnRlcnBvbGF0aW9uJyxcbiAgICAgICAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsXG4gICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgJ2NvbG9yLXJlbmRlcmluZycsXG4gICAgICAgICdjdXJzb3InLFxuICAgICAgICAnZGlyZWN0aW9uJyxcbiAgICAgICAgJ2Rpc3BsYXknLFxuICAgICAgICAnZG9taW5hbnQtYmFzZWxpbmUnLFxuICAgICAgICAnZW5hYmxlLWJhY2tncm91bmQnLFxuICAgICAgICAnZmlsbCcsXG4gICAgICAgICdmaWxsLW9wYWNpdHknLFxuICAgICAgICAnZmlsbC1ydWxlJyxcbiAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICdmbG9vZC1jb2xvcicsXG4gICAgICAgICdmbG9vZC1vcGFjaXR5JyxcbiAgICAgICAgJ2ZvbnQtZmFtaWx5JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZScsXG4gICAgICAgICdmb250LXNpemUtYWRqdXN0JyxcbiAgICAgICAgJ2ZvbnQtc3RyZXRjaCcsXG4gICAgICAgICdmb250LXN0eWxlJyxcbiAgICAgICAgJ2ZvbnQtdmFyaWFudCcsXG4gICAgICAgICdmb250LXdlaWdodCcsXG4gICAgICAgICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJyxcbiAgICAgICAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJyxcbiAgICAgICAgJ2ltYWdlLXJlbmRlcmluZycsXG4gICAgICAgICdrZXJuaW5nJyxcbiAgICAgICAgJ2xldHRlci1zcGFjaW5nJyxcbiAgICAgICAgJ2xpZ2h0aW5nLWNvbG9yJyxcbiAgICAgICAgJ21hcmtlci1lbmQnLFxuICAgICAgICAnbWFya2VyLW1pZCcsXG4gICAgICAgICdtYXJrZXItc3RhcnQnLFxuICAgICAgICAnbWFzaycsXG4gICAgICAgICdvcGFjaXR5JyxcbiAgICAgICAgJ292ZXJmbG93JyxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzJyxcbiAgICAgICAgJ3NoYXBlLXJlbmRlcmluZycsXG4gICAgICAgICdzb2xpZC1jb2xvcicsXG4gICAgICAgICdzb2xpZC1vcGFjaXR5JyxcbiAgICAgICAgJ3N0b3AtY29sb3InLFxuICAgICAgICAnc3RvcC1vcGFjaXR5JyxcbiAgICAgICAgJ3N0cm9rZScsXG4gICAgICAgICdzdHJva2UtZGFzaGFycmF5JyxcbiAgICAgICAgJ3N0cm9rZS1kYXNob2Zmc2V0JyxcbiAgICAgICAgJ3N0cm9rZS1saW5lY2FwJyxcbiAgICAgICAgJ3N0cm9rZS1saW5lam9pbicsXG4gICAgICAgICdzdHJva2UtbWl0ZXJsaW1pdCcsXG4gICAgICAgICdzdHJva2Utb3BhY2l0eScsXG4gICAgICAgICdzdHJva2Utd2lkdGgnLFxuICAgICAgICAncGFpbnQtb3JkZXInLFxuICAgICAgICAndGV4dC1hbmNob3InLFxuICAgICAgICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgICAgICAgJ3RleHQtb3ZlcmZsb3cnLFxuICAgICAgICAnd2hpdGUtc3BhY2UnLFxuICAgICAgICAndGV4dC1yZW5kZXJpbmcnLFxuICAgICAgICAndW5pY29kZS1iaWRpJyxcbiAgICAgICAgJ3ZlY3Rvci1lZmZlY3QnLFxuICAgICAgICAndmlld3BvcnQtZmlsbCcsXG4gICAgICAgICd2aWV3cG9ydC1maWxsLW9wYWNpdHknLFxuICAgICAgICAndmlzaWJpbGl0eScsXG4gICAgICAgICd3aGl0ZS1zcGFjZScsXG4gICAgICAgICd3b3JkLXNwYWNpbmcnLFxuICAgICAgICAnd3JpdGluZy1tb2RlJ1xuICAgIF0sXG4gICAgeGxpbms6IFsneGxpbms6aHJlZicsICd4bGluazpzaG93JywgJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6dHlwZScsICd4bGluazpyb2xlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6dGl0bGUnXSxcbiAgICBkb2N1bWVudEV2ZW50OiBbJ29udW5sb2FkJywgJ29uYWJvcnQnLCAnb25lcnJvcicsICdvbnJlc2l6ZScsICdvbnNjcm9sbCcsICdvbnpvb20nXSxcbiAgICBmaWx0ZXJQcmltaXRpdmU6IFsneCcsICd5JywgJ3dpZHRoJywgJ2hlaWdodCcsICdyZXN1bHQnXSxcbiAgICB0cmFuc2ZlckZ1bmN0aW9uOiBbJ3R5cGUnLCAndGFibGVWYWx1ZXMnLCAnc2xvcGUnLCAnaW50ZXJjZXB0JywgJ2FtcGxpdHVkZScsICdleHBvbmVudCcsICdvZmZzZXQnXVxufTtcblxuZXhwb3J0cy5hdHRyc0dyb3Vwc0RlZmF1bHRzID0ge1xuICAgIGNvcmU6IHsneG1sOnNwYWNlJzogJ3ByZXNlcnZlJ30sXG4gICAgZmlsdGVyUHJpbWl0aXZlOiB7eDogJzAnLCB5OiAnMCcsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnfSxcbiAgICBwcmVzZW50YXRpb246IHtcbiAgICAgICAgY2xpcDogJ2F1dG8nLFxuICAgICAgICAnY2xpcC1wYXRoJzogJ25vbmUnLFxuICAgICAgICAnY2xpcC1ydWxlJzogJ25vbnplcm8nLFxuICAgICAgICBtYXNrOiAnbm9uZScsXG4gICAgICAgIG9wYWNpdHk6ICcxJyxcbiAgICAgICAgJ3NvbGlkLWNvbG9yJzogJyMwMDAnLFxuICAgICAgICAnc29saWQtb3BhY2l0eSc6ICcxJyxcbiAgICAgICAgJ3N0b3AtY29sb3InOiAnIzAwMCcsXG4gICAgICAgICdzdG9wLW9wYWNpdHknOiAnMScsXG4gICAgICAgICdmaWxsLW9wYWNpdHknOiAnMScsXG4gICAgICAgICdmaWxsLXJ1bGUnOiAnbm9uemVybycsXG4gICAgICAgIGZpbGw6ICcjMDAwJyxcbiAgICAgICAgc3Ryb2tlOiAnbm9uZScsXG4gICAgICAgICdzdHJva2Utd2lkdGgnOiAnMScsXG4gICAgICAgICdzdHJva2UtbGluZWNhcCc6ICdidXR0JyxcbiAgICAgICAgJ3N0cm9rZS1saW5lam9pbic6ICdtaXRlcicsXG4gICAgICAgICdzdHJva2UtbWl0ZXJsaW1pdCc6ICc0JyxcbiAgICAgICAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnbm9uZScsXG4gICAgICAgICdzdHJva2UtZGFzaG9mZnNldCc6ICcwJyxcbiAgICAgICAgJ3N0cm9rZS1vcGFjaXR5JzogJzEnLFxuICAgICAgICAncGFpbnQtb3JkZXInOiAnbm9ybWFsJyxcbiAgICAgICAgJ3ZlY3Rvci1lZmZlY3QnOiAnbm9uZScsXG4gICAgICAgICd2aWV3cG9ydC1maWxsJzogJ25vbmUnLFxuICAgICAgICAndmlld3BvcnQtZmlsbC1vcGFjaXR5JzogJzEnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lJyxcbiAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgICAnbWFya2VyLXN0YXJ0JzogJ25vbmUnLFxuICAgICAgICAnbWFya2VyLW1pZCc6ICdub25lJyxcbiAgICAgICAgJ21hcmtlci1lbmQnOiAnbm9uZScsXG4gICAgICAgICdjb2xvci1pbnRlcnBvbGF0aW9uJzogJ3NSR0InLFxuICAgICAgICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2xpbmVhclJHQicsXG4gICAgICAgICdjb2xvci1yZW5kZXJpbmcnOiAnYXV0bycsXG4gICAgICAgICdzaGFwZS1yZW5kZXJpbmcnOiAnYXV0bycsXG4gICAgICAgICd0ZXh0LXJlbmRlcmluZyc6ICdhdXRvJyxcbiAgICAgICAgJ2ltYWdlLXJlbmRlcmluZyc6ICdhdXRvJyxcbiAgICAgICAgJ2J1ZmZlcmVkLXJlbmRlcmluZyc6ICdhdXRvJyxcbiAgICAgICAgJ2ZvbnQtc3R5bGUnOiAnbm9ybWFsJyxcbiAgICAgICAgJ2ZvbnQtdmFyaWFudCc6ICdub3JtYWwnLFxuICAgICAgICAnZm9udC13ZWlnaHQnOiAnbm9ybWFsJyxcbiAgICAgICAgJ2ZvbnQtc3RyZXRjaCc6ICdub3JtYWwnLFxuICAgICAgICAnZm9udC1zaXplJzogJ21lZGl1bScsXG4gICAgICAgICdmb250LXNpemUtYWRqdXN0JzogJ25vbmUnLFxuICAgICAgICBrZXJuaW5nOiAnYXV0bycsXG4gICAgICAgICdsZXR0ZXItc3BhY2luZyc6ICdub3JtYWwnLFxuICAgICAgICAnd29yZC1zcGFjaW5nJzogJ25vcm1hbCcsXG4gICAgICAgICd0ZXh0LWRlY29yYXRpb24nOiAnbm9uZScsXG4gICAgICAgICd0ZXh0LWFuY2hvcic6ICdzdGFydCcsXG4gICAgICAgICd0ZXh0LW92ZXJmbG93JzogJ2NsaXAnLFxuICAgICAgICAnd3JpdGluZy1tb2RlJzogJ2xyLXRiJyxcbiAgICAgICAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJzogJ2F1dG8nLFxuICAgICAgICAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCc6ICcwZGVnJyxcbiAgICAgICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICAgICAgJ3VuaWNvZGUtYmlkaSc6ICdub3JtYWwnLFxuICAgICAgICAnZG9taW5hbnQtYmFzZWxpbmUnOiAnYXV0bycsXG4gICAgICAgICdhbGlnbm1lbnQtYmFzZWxpbmUnOiAnYmFzZWxpbmUnLFxuICAgICAgICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmUnXG4gICAgfSxcbiAgICB0cmFuc2ZlckZ1bmN0aW9uOiB7c2xvcGU6ICcxJywgaW50ZXJjZXB0OiAnMCcsIGFtcGxpdHVkZTogJzEnLCBleHBvbmVudDogJzEnLCBvZmZzZXQ6ICcwJ31cbn07XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9lbHRpbmRleC5odG1sXG5leHBvcnRzLmVsZW1zID0ge1xuICAgIGE6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgJ3hsaW5rJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICd0YXJnZXQnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdfc2VsZidcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnLFxuICAgICAgICAgICAgJ3NoYXBlJyxcbiAgICAgICAgICAgICdzdHJ1Y3R1cmFsJyxcbiAgICAgICAgICAgICdwYWludFNlcnZlcidcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2EnLFxuICAgICAgICAgICAgJ2FsdEdseXBoRGVmJyxcbiAgICAgICAgICAgICdjbGlwUGF0aCcsXG4gICAgICAgICAgICAnY29sb3ItcHJvZmlsZScsXG4gICAgICAgICAgICAnY3Vyc29yJyxcbiAgICAgICAgICAgICdmaWx0ZXInLFxuICAgICAgICAgICAgJ2ZvbnQnLFxuICAgICAgICAgICAgJ2ZvbnQtZmFjZScsXG4gICAgICAgICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21hcmtlcicsXG4gICAgICAgICAgICAnbWFzaycsXG4gICAgICAgICAgICAncGF0dGVybicsXG4gICAgICAgICAgICAnc2NyaXB0JyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnc3dpdGNoJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd2aWV3J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBhbHRHbHlwaDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAnZ3JhcGhpY2FsRXZlbnQnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAneGxpbmsnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICdkeCcsXG4gICAgICAgICAgICAnZHknLFxuICAgICAgICAgICAgJ2dseXBoUmVmJyxcbiAgICAgICAgICAgICdmb3JtYXQnLFxuICAgICAgICAgICAgJ3JvdGF0ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgYWx0R2x5cGhEZWY6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnZ2x5cGhSZWYnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGFsdEdseXBoSXRlbToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdnbHlwaFJlZicsXG4gICAgICAgICAgICAnYWx0R2x5cGhJdGVtJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBhbmltYXRlOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdhbmltYXRpb25BZGRpdGlvbicsXG4gICAgICAgICAgICAnYW5pbWF0aW9uQXR0cmlidXRlVGFyZ2V0JyxcbiAgICAgICAgICAgICdhbmltYXRpb25FdmVudCcsXG4gICAgICAgICAgICAnYW5pbWF0aW9uVGltaW5nJyxcbiAgICAgICAgICAgICdhbmltYXRpb25WYWx1ZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICd4bGluaydcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGFuaW1hdGVDb2xvcjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAnYW5pbWF0aW9uRXZlbnQnLFxuICAgICAgICAgICAgJ3hsaW5rJyxcbiAgICAgICAgICAgICdhbmltYXRpb25BdHRyaWJ1dGVUYXJnZXQnLFxuICAgICAgICAgICAgJ2FuaW1hdGlvblRpbWluZycsXG4gICAgICAgICAgICAnYW5pbWF0aW9uVmFsdWUnLFxuICAgICAgICAgICAgJ2FuaW1hdGlvbkFkZGl0aW9uJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBhbmltYXRlTW90aW9uOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdhbmltYXRpb25FdmVudCcsXG4gICAgICAgICAgICAneGxpbmsnLFxuICAgICAgICAgICAgJ2FuaW1hdGlvblRpbWluZycsXG4gICAgICAgICAgICAnYW5pbWF0aW9uVmFsdWUnLFxuICAgICAgICAgICAgJ2FuaW1hdGlvbkFkZGl0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3BhdGgnLFxuICAgICAgICAgICAgJ2tleVBvaW50cycsXG4gICAgICAgICAgICAncm90YXRlJyxcbiAgICAgICAgICAgICdvcmlnaW4nXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICAncm90YXRlJzogJzAnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ21wYXRoJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBhbmltYXRlVHJhbnNmb3JtOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdhbmltYXRpb25FdmVudCcsXG4gICAgICAgICAgICAneGxpbmsnLFxuICAgICAgICAgICAgJ2FuaW1hdGlvbkF0dHJpYnV0ZVRhcmdldCcsXG4gICAgICAgICAgICAnYW5pbWF0aW9uVGltaW5nJyxcbiAgICAgICAgICAgICdhbmltYXRpb25WYWx1ZScsXG4gICAgICAgICAgICAnYW5pbWF0aW9uQWRkaXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHlwZSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBjaXJjbGU6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ2N4JyxcbiAgICAgICAgICAgICdjeScsXG4gICAgICAgICAgICAncidcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGN4OiAnMCcsXG4gICAgICAgICAgICBjeTogJzAnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdhbmltYXRpb24nLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBjbGlwUGF0aDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICdjbGlwUGF0aFVuaXRzJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgY2xpcFBhdGhVbml0czogJ3VzZXJTcGFjZU9uVXNlJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd1c2UnXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdjb2xvci1wcm9maWxlJzoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3hsaW5rJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2xvY2FsJyxcbiAgICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAgICdyZW5kZXJpbmctaW50ZW50J1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgbmFtZTogJ3NSR0InLFxuICAgICAgICAgICAgJ3JlbmRlcmluZy1pbnRlbnQnOiAnYXV0bydcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBjdXJzb3I6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ3hsaW5rJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB4OiAnMCcsXG4gICAgICAgICAgICB5OiAnMCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBkZWZzOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdncmFwaGljYWxFdmVudCcsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnLFxuICAgICAgICAgICAgJ3N0cnVjdHVyYWwnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGhEZWYnLFxuICAgICAgICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgICAgICdjdXJzb3InLFxuICAgICAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnZm9udCcsXG4gICAgICAgICAgICAnZm9udC1mYWNlJyxcbiAgICAgICAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICdtYXNrJyxcbiAgICAgICAgICAgICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICdzY3JpcHQnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzd2l0Y2gnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3ZpZXcnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGRlc2M6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZWxsaXBzZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAnZ3JhcGhpY2FsRXZlbnQnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgICAgICAnY3gnLFxuICAgICAgICAgICAgJ2N5JyxcbiAgICAgICAgICAgICdyeCcsXG4gICAgICAgICAgICAncnknXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBjeDogJzAnLFxuICAgICAgICAgICAgY3k6ICcwJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVCbGVuZDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAvLyBUT0RPOiBpbiAtICdJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgZmlsdGVyIHByaW1pdGl2ZSxcbiAgICAgICAgICAgIC8vIHRoZW4gdGhpcyBmaWx0ZXIgcHJpbWl0aXZlIHdpbGwgdXNlIFNvdXJjZUdyYXBoaWMgYXMgaXRzIGlucHV0J1xuICAgICAgICAgICAgJ2luJyxcbiAgICAgICAgICAgICdpbjInLFxuICAgICAgICAgICAgJ21vZGUnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBtb2RlOiAnbm9ybWFsJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYW5pbWF0ZScsXG4gICAgICAgICAgICAnc2V0J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBmZUNvbG9yTWF0cml4OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICdmaWx0ZXJQcmltaXRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdpbicsXG4gICAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgICAndmFsdWVzJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdHlwZTogJ21hdHJpeCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVDb21wb25lbnRUcmFuc2Zlcjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnaW4nXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdmZUZ1bmNBJyxcbiAgICAgICAgICAgICdmZUZ1bmNCJyxcbiAgICAgICAgICAgICdmZUZ1bmNHJyxcbiAgICAgICAgICAgICdmZUZ1bmNSJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBmZUNvbXBvc2l0ZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnaW4nLFxuICAgICAgICAgICAgJ2luMicsXG4gICAgICAgICAgICAnb3BlcmF0b3InLFxuICAgICAgICAgICAgJ2sxJyxcbiAgICAgICAgICAgICdrMicsXG4gICAgICAgICAgICAnazMnLFxuICAgICAgICAgICAgJ2s0J1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgb3BlcmF0b3I6ICdvdmVyJyxcbiAgICAgICAgICAgIGsxOiAnMCcsXG4gICAgICAgICAgICBrMjogJzAnLFxuICAgICAgICAgICAgazM6ICcwJyxcbiAgICAgICAgICAgIGs0OiAnMCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVDb252b2x2ZU1hdHJpeDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnaW4nLFxuICAgICAgICAgICAgJ29yZGVyJyxcbiAgICAgICAgICAgICdrZXJuZWxNYXRyaXgnLFxuICAgICAgICAgICAgLy8gVE9ETzogZGl2aXNvciAtICdUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgc3VtIG9mIGFsbCB2YWx1ZXMgaW4ga2VybmVsTWF0cml4LFxuICAgICAgICAgICAgLy8gd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgaWYgdGhlIHN1bSBpcyB6ZXJvLCB0aGVuIHRoZSBkaXZpc29yIGlzIHNldCB0byAxJ1xuICAgICAgICAgICAgJ2Rpdmlzb3InLFxuICAgICAgICAgICAgJ2JpYXMnLFxuICAgICAgICAgICAgLy8gVE9ETzogdGFyZ2V0WCAtICdCeSBkZWZhdWx0LCB0aGUgY29udm9sdXRpb24gbWF0cml4IGlzIGNlbnRlcmVkIGluIFggb3ZlciBlYWNoXG4gICAgICAgICAgICAvLyBwaXhlbCBvZiB0aGUgaW5wdXQgaW1hZ2UgKGkuZS4sIHRhcmdldFggPSBmbG9vciAoIG9yZGVyWCAvIDIgKSknXG4gICAgICAgICAgICAndGFyZ2V0WCcsXG4gICAgICAgICAgICAndGFyZ2V0WScsXG4gICAgICAgICAgICAnZWRnZU1vZGUnLFxuICAgICAgICAgICAgLy8gVE9ETzoga2VybmVsVW5pdExlbmd0aCAtICdUaGUgZmlyc3QgbnVtYmVyIGlzIHRoZSA8ZHg+IHZhbHVlLiBUaGUgc2Vjb25kIG51bWJlclxuICAgICAgICAgICAgLy8gaXMgdGhlIDxkeT4gdmFsdWUuIElmIHRoZSA8ZHk+IHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBzYW1lIHZhbHVlIGFzIDxkeD4nXG4gICAgICAgICAgICAna2VybmVsVW5pdExlbmd0aCcsXG4gICAgICAgICAgICAncHJlc2VydmVBbHBoYSdcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIG9yZGVyOiAnMycsXG4gICAgICAgICAgICBiaWFzOiAnMCcsXG4gICAgICAgICAgICBlZGdlTW9kZTogJ2R1cGxpY2F0ZScsXG4gICAgICAgICAgICBwcmVzZXJ2ZUFscGhhOiAnZmFsc2UnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdzZXQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlRGlmZnVzZUxpZ2h0aW5nOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICdmaWx0ZXJQcmltaXRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdpbicsXG4gICAgICAgICAgICAnc3VyZmFjZVNjYWxlJyxcbiAgICAgICAgICAgICdkaWZmdXNlQ29uc3RhbnQnLFxuICAgICAgICAgICAgJ2tlcm5lbFVuaXRMZW5ndGgnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBzdXJmYWNlU2NhbGU6ICcxJyxcbiAgICAgICAgICAgIGRpZmZ1c2VDb25zdGFudDogJzEnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgLy8gVE9ETzogJ2V4YWN0bHkgb25lIGxpZ2h0IHNvdXJjZSBlbGVtZW50LCBpbiBhbnkgb3JkZXInXG4gICAgICAgICAgICAnZmVEaXN0YW50TGlnaHQnLFxuICAgICAgICAgICAgJ2ZlUG9pbnRMaWdodCcsXG4gICAgICAgICAgICAnZmVTcG90TGlnaHQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlRGlzcGxhY2VtZW50TWFwOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICdmaWx0ZXJQcmltaXRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdpbicsXG4gICAgICAgICAgICAnaW4yJyxcbiAgICAgICAgICAgICdzY2FsZScsXG4gICAgICAgICAgICAneENoYW5uZWxTZWxlY3RvcicsXG4gICAgICAgICAgICAneUNoYW5uZWxTZWxlY3RvcidcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHNjYWxlOiAnMCcsXG4gICAgICAgICAgICB4Q2hhbm5lbFNlbGVjdG9yOiAnQScsXG4gICAgICAgICAgICB5Q2hhbm5lbFNlbGVjdG9yOiAnQSdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVEaXN0YW50TGlnaHQ6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2F6aW11dGgnLFxuICAgICAgICAgICAgJ2VsZXZhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGF6aW11dGg6ICcwJyxcbiAgICAgICAgICAgIGVsZXZhdGlvbjogJzAnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdzZXQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlRmxvb2Q6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgJ2ZpbHRlclByaW1pdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdhbmltYXRlQ29sb3InLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVGdW5jQToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3RyYW5zZmVyRnVuY3Rpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdzZXQnLFxuICAgICAgICAgICAgJ2FuaW1hdGUnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlRnVuY0I6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICd0cmFuc2ZlckZ1bmN0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnc2V0JyxcbiAgICAgICAgICAgICdhbmltYXRlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBmZUZ1bmNHOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAndHJhbnNmZXJGdW5jdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ3NldCcsXG4gICAgICAgICAgICAnYW5pbWF0ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVGdW5jUjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3RyYW5zZmVyRnVuY3Rpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdzZXQnLFxuICAgICAgICAgICAgJ2FuaW1hdGUnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlR2F1c3NpYW5CbHVyOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICdmaWx0ZXJQcmltaXRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdpbicsXG4gICAgICAgICAgICAnc3RkRGV2aWF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgc3RkRGV2aWF0aW9uOiAnMCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ3NldCcsXG4gICAgICAgICAgICAnYW5pbWF0ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVJbWFnZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJyxcbiAgICAgICAgICAgICd4bGluaydcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICAgICAgICAgICAgJ2hyZWYnLFxuICAgICAgICAgICAgJ3hsaW5rOmhyZWYnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAneE1pZFlNaWQgbWVldCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ2FuaW1hdGVUcmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVNZXJnZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2ZlTWVyZ2VOb2RlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBmZU1lcmdlTm9kZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnaW4nXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdzZXQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlTW9ycGhvbG9neToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnaW4nLFxuICAgICAgICAgICAgJ29wZXJhdG9yJyxcbiAgICAgICAgICAgICdyYWRpdXMnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBvcGVyYXRvcjogJ2Vyb2RlJyxcbiAgICAgICAgICAgIHJhZGl1czogJzAnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdzZXQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlT2Zmc2V0OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICdmaWx0ZXJQcmltaXRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdpbicsXG4gICAgICAgICAgICAnZHgnLFxuICAgICAgICAgICAgJ2R5J1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgZHg6ICcwJyxcbiAgICAgICAgICAgIGR5OiAnMCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmVQb2ludExpZ2h0OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICd6J1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgeDogJzAnLFxuICAgICAgICAgICAgeTogJzAnLFxuICAgICAgICAgICAgejogJzAnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdzZXQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlU3BlY3VsYXJMaWdodGluZzoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAnZmlsdGVyUHJpbWl0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnaW4nLFxuICAgICAgICAgICAgJ3N1cmZhY2VTY2FsZScsXG4gICAgICAgICAgICAnc3BlY3VsYXJDb25zdGFudCcsXG4gICAgICAgICAgICAnc3BlY3VsYXJFeHBvbmVudCcsXG4gICAgICAgICAgICAna2VybmVsVW5pdExlbmd0aCdcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHN1cmZhY2VTY2FsZTogJzEnLFxuICAgICAgICAgICAgc3BlY3VsYXJDb25zdGFudDogJzEnLFxuICAgICAgICAgICAgc3BlY3VsYXJFeHBvbmVudDogJzEnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAvLyBUT0RPOiBleGFjdGx5IG9uZSAnbGlnaHQgc291cmNlIGVsZW1lbnQnXG4gICAgICAgICAgICAnbGlnaHRTb3VyY2UnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZlU3BvdExpZ2h0OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICd6JyxcbiAgICAgICAgICAgICdwb2ludHNBdFgnLFxuICAgICAgICAgICAgJ3BvaW50c0F0WScsXG4gICAgICAgICAgICAncG9pbnRzQXRaJyxcbiAgICAgICAgICAgICdzcGVjdWxhckV4cG9uZW50JyxcbiAgICAgICAgICAgICdsaW1pdGluZ0NvbmVBbmdsZSdcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHg6ICcwJyxcbiAgICAgICAgICAgIHk6ICcwJyxcbiAgICAgICAgICAgIHo6ICcwJyxcbiAgICAgICAgICAgIHBvaW50c0F0WDogJzAnLFxuICAgICAgICAgICAgcG9pbnRzQXRZOiAnMCcsXG4gICAgICAgICAgICBwb2ludHNBdFo6ICcwJyxcbiAgICAgICAgICAgIHNwZWN1bGFyRXhwb25lbnQ6ICcxJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYW5pbWF0ZScsXG4gICAgICAgICAgICAnc2V0J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBmZVRpbGU6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgJ2ZpbHRlclByaW1pdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2luJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYW5pbWF0ZScsXG4gICAgICAgICAgICAnc2V0J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBmZVR1cmJ1bGVuY2U6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgJ2ZpbHRlclByaW1pdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2Jhc2VGcmVxdWVuY3knLFxuICAgICAgICAgICAgJ251bU9jdGF2ZXMnLFxuICAgICAgICAgICAgJ3NlZWQnLFxuICAgICAgICAgICAgJ3N0aXRjaFRpbGVzJyxcbiAgICAgICAgICAgICd0eXBlJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYmFzZUZyZXF1ZW5jeTogJzAnLFxuICAgICAgICAgICAgbnVtT2N0YXZlczogJzEnLFxuICAgICAgICAgICAgc2VlZDogJzAnLFxuICAgICAgICAgICAgc3RpdGNoVGlsZXM6ICdub1N0aXRjaCcsXG4gICAgICAgICAgICB0eXBlOiAndHVyYnVsZW5jZSdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgZmlsdGVyOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICd4bGluaydcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICAgJ2ZpbHRlclJlcycsXG4gICAgICAgICAgICAnZmlsdGVyVW5pdHMnLFxuICAgICAgICAgICAgJ3ByaW1pdGl2ZVVuaXRzJyxcbiAgICAgICAgICAgICdocmVmJyxcbiAgICAgICAgICAgICd4bGluazpocmVmJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgcHJpbWl0aXZlVW5pdHM6ICd1c2VyU3BhY2VPblVzZScsXG4gICAgICAgICAgICB4OiAnLTEwJScsXG4gICAgICAgICAgICB5OiAnLTEwJScsXG4gICAgICAgICAgICB3aWR0aDogJzEyMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTIwJSdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJyxcbiAgICAgICAgICAgICdmaWx0ZXJQcmltaXRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdzZXQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZvbnQ6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICdob3Jpei1vcmlnaW4teCcsXG4gICAgICAgICAgICAnaG9yaXotb3JpZ2luLXknLFxuICAgICAgICAgICAgJ2hvcml6LWFkdi14JyxcbiAgICAgICAgICAgICd2ZXJ0LW9yaWdpbi14JyxcbiAgICAgICAgICAgICd2ZXJ0LW9yaWdpbi15JyxcbiAgICAgICAgICAgICd2ZXJ0LWFkdi15J1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgJ2hvcml6LW9yaWdpbi14JzogJzAnLFxuICAgICAgICAgICAgJ2hvcml6LW9yaWdpbi15JzogJzAnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2ZvbnQtZmFjZScsXG4gICAgICAgICAgICAnZ2x5cGgnLFxuICAgICAgICAgICAgJ2hrZXJuJyxcbiAgICAgICAgICAgICdtaXNzaW5nLWdseXBoJyxcbiAgICAgICAgICAgICd2a2VybidcbiAgICAgICAgXVxuICAgIH0sXG4gICAgJ2ZvbnQtZmFjZSc6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2ZvbnQtZmFtaWx5JyxcbiAgICAgICAgICAgICdmb250LXN0eWxlJyxcbiAgICAgICAgICAgICdmb250LXZhcmlhbnQnLFxuICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0JyxcbiAgICAgICAgICAgICdmb250LXN0cmV0Y2gnLFxuICAgICAgICAgICAgJ2ZvbnQtc2l6ZScsXG4gICAgICAgICAgICAndW5pY29kZS1yYW5nZScsXG4gICAgICAgICAgICAndW5pdHMtcGVyLWVtJyxcbiAgICAgICAgICAgICdwYW5vc2UtMScsXG4gICAgICAgICAgICAnc3RlbXYnLFxuICAgICAgICAgICAgJ3N0ZW1oJyxcbiAgICAgICAgICAgICdzbG9wZScsXG4gICAgICAgICAgICAnY2FwLWhlaWdodCcsXG4gICAgICAgICAgICAneC1oZWlnaHQnLFxuICAgICAgICAgICAgJ2FjY2VudC1oZWlnaHQnLFxuICAgICAgICAgICAgJ2FzY2VudCcsXG4gICAgICAgICAgICAnZGVzY2VudCcsXG4gICAgICAgICAgICAnd2lkdGhzJyxcbiAgICAgICAgICAgICdiYm94JyxcbiAgICAgICAgICAgICdpZGVvZ3JhcGhpYycsXG4gICAgICAgICAgICAnYWxwaGFiZXRpYycsXG4gICAgICAgICAgICAnbWF0aGVtYXRpY2FsJyxcbiAgICAgICAgICAgICdoYW5naW5nJyxcbiAgICAgICAgICAgICd2LWlkZW9ncmFwaGljJyxcbiAgICAgICAgICAgICd2LWFscGhhYmV0aWMnLFxuICAgICAgICAgICAgJ3YtbWF0aGVtYXRpY2FsJyxcbiAgICAgICAgICAgICd2LWhhbmdpbmcnLFxuICAgICAgICAgICAgJ3VuZGVybGluZS1wb3NpdGlvbicsXG4gICAgICAgICAgICAndW5kZXJsaW5lLXRoaWNrbmVzcycsXG4gICAgICAgICAgICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsXG4gICAgICAgICAgICAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLFxuICAgICAgICAgICAgJ292ZXJsaW5lLXBvc2l0aW9uJyxcbiAgICAgICAgICAgICdvdmVybGluZS10aGlja25lc3MnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICAnZm9udC1zdHlsZSc6ICdhbGwnLFxuICAgICAgICAgICAgJ2ZvbnQtdmFyaWFudCc6ICdub3JtYWwnLFxuICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0JzogJ2FsbCcsXG4gICAgICAgICAgICAnZm9udC1zdHJldGNoJzogJ25vcm1hbCcsXG4gICAgICAgICAgICAndW5pY29kZS1yYW5nZSc6ICdVKzAtMTBGRkZGJyxcbiAgICAgICAgICAgICd1bml0cy1wZXItZW0nOiAnMTAwMCcsXG4gICAgICAgICAgICAncGFub3NlLTEnOiAnMCAwIDAgMCAwIDAgMCAwIDAgMCcsXG4gICAgICAgICAgICAnc2xvcGUnOiAnMCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAvLyBUT0RPOiBcImF0IG1vc3Qgb25lICdmb250LWZhY2Utc3JjJyBlbGVtZW50XCJcbiAgICAgICAgICAgICdmb250LWZhY2Utc3JjJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICAvLyBUT0RPOiBlbXB0eSBjb250ZW50XG4gICAgJ2ZvbnQtZmFjZS1mb3JtYXQnOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdzdHJpbmcnXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdmb250LWZhY2UtbmFtZSc6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdmb250LWZhY2Utc3JjJzoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdmb250LWZhY2UtbmFtZScsXG4gICAgICAgICAgICAnZm9udC1mYWNlLXVyaSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgJ2ZvbnQtZmFjZS11cmknOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAneGxpbmsnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnaHJlZicsXG4gICAgICAgICAgICAneGxpbms6aHJlZidcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2ZvbnQtZmFjZS1mb3JtYXQnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGZvcmVpZ25PYmplY3Q6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICdoZWlnaHQnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMFxuICAgICAgICB9XG4gICAgfSxcbiAgICBnOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdncmFwaGljYWxFdmVudCcsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnLFxuICAgICAgICAgICAgJ3N0cnVjdHVyYWwnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGhEZWYnLFxuICAgICAgICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgICAgICdjdXJzb3InLFxuICAgICAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnZm9udCcsXG4gICAgICAgICAgICAnZm9udC1mYWNlJyxcbiAgICAgICAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICdtYXNrJyxcbiAgICAgICAgICAgICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICdzY3JpcHQnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzd2l0Y2gnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3ZpZXcnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGdseXBoOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICAnaG9yaXotYWR2LXgnLFxuICAgICAgICAgICAgJ3ZlcnQtb3JpZ2luLXgnLFxuICAgICAgICAgICAgJ3ZlcnQtb3JpZ2luLXknLFxuICAgICAgICAgICAgJ3ZlcnQtYWR2LXknLFxuICAgICAgICAgICAgJ3VuaWNvZGUnLFxuICAgICAgICAgICAgJ2dseXBoLW5hbWUnLFxuICAgICAgICAgICAgJ29yaWVudGF0aW9uJyxcbiAgICAgICAgICAgICdhcmFiaWMtZm9ybScsXG4gICAgICAgICAgICAnbGFuZydcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgICdhcmFiaWMtZm9ybSc6ICdpbml0aWFsJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnLFxuICAgICAgICAgICAgJ3N0cnVjdHVyYWwnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGhEZWYnLFxuICAgICAgICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgICAgICdjdXJzb3InLFxuICAgICAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnZm9udCcsXG4gICAgICAgICAgICAnZm9udC1mYWNlJyxcbiAgICAgICAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICdtYXNrJyxcbiAgICAgICAgICAgICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICdzY3JpcHQnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzd2l0Y2gnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3ZpZXcnXG4gICAgICAgIF0sXG4gICAgfSxcbiAgICBnbHlwaFJlZjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2QnLFxuICAgICAgICAgICAgJ2hvcml6LWFkdi14JyxcbiAgICAgICAgICAgICd2ZXJ0LW9yaWdpbi14JyxcbiAgICAgICAgICAgICd2ZXJ0LW9yaWdpbi15JyxcbiAgICAgICAgICAgICd2ZXJ0LWFkdi15J1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnLFxuICAgICAgICAgICAgJ3N0cnVjdHVyYWwnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGhEZWYnLFxuICAgICAgICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgICAgICdjdXJzb3InLFxuICAgICAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnZm9udCcsXG4gICAgICAgICAgICAnZm9udC1mYWNlJyxcbiAgICAgICAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICdtYXNrJyxcbiAgICAgICAgICAgICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICdzY3JpcHQnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzd2l0Y2gnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3ZpZXcnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGhhdGNoOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICd4bGluaydcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3BpdGNoJyxcbiAgICAgICAgICAgICdyb3RhdGUnLFxuICAgICAgICAgICAgJ2hhdGNoVW5pdHMnLFxuICAgICAgICAgICAgJ2hhdGNoQ29udGVudFVuaXRzJyxcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBoYXRjaFVuaXRzOiAnb2JqZWN0Qm91bmRpbmdCb3gnLFxuICAgICAgICAgICAgaGF0Y2hDb250ZW50VW5pdHM6ICd1c2VyU3BhY2VPblVzZScsXG4gICAgICAgICAgICB4OiAnMCcsXG4gICAgICAgICAgICB5OiAnMCcsXG4gICAgICAgICAgICBwaXRjaDogJzAnLFxuICAgICAgICAgICAgcm90YXRlOiAnMCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdoYXRjaFBhdGgnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGhhdGNoUGF0aDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAneGxpbmsnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdkJyxcbiAgICAgICAgICAgICdvZmZzZXQnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBvZmZzZXQ6ICcwJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgaGtlcm46IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ3UxJyxcbiAgICAgICAgICAgICdnMScsXG4gICAgICAgICAgICAndTInLFxuICAgICAgICAgICAgJ2cyJyxcbiAgICAgICAgICAgICdrJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBpbWFnZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnZ3JhcGhpY2FsRXZlbnQnLFxuICAgICAgICAgICAgJ3hsaW5rJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICAgJ2hyZWYnLFxuICAgICAgICAgICAgJ3hsaW5rOmhyZWYnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB4OiAnMCcsXG4gICAgICAgICAgICB5OiAnMCcsXG4gICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAneE1pZFlNaWQgbWVldCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIGxpbmU6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3gxJyxcbiAgICAgICAgICAgICd5MScsXG4gICAgICAgICAgICAneDInLFxuICAgICAgICAgICAgJ3kyJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgeDE6ICcwJyxcbiAgICAgICAgICAgIHkxOiAnMCcsXG4gICAgICAgICAgICB4MjogJzAnLFxuICAgICAgICAgICAgeTI6ICcwJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgbGluZWFyR3JhZGllbnQ6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgJ3hsaW5rJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAneDEnLFxuICAgICAgICAgICAgJ3kxJyxcbiAgICAgICAgICAgICd4MicsXG4gICAgICAgICAgICAneTInLFxuICAgICAgICAgICAgJ2dyYWRpZW50VW5pdHMnLFxuICAgICAgICAgICAgJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgICAgICAgICAgICdzcHJlYWRNZXRob2QnLFxuICAgICAgICAgICAgJ2hyZWYnLFxuICAgICAgICAgICAgJ3hsaW5rOmhyZWYnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB4MTogJzAnLFxuICAgICAgICAgICAgeTE6ICcwJyxcbiAgICAgICAgICAgIHgyOiAnMTAwJScsXG4gICAgICAgICAgICB5MjogJzAnLFxuICAgICAgICAgICAgc3ByZWFkTWV0aG9kOiAncGFkJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdhbmltYXRlVHJhbnNmb3JtJyxcbiAgICAgICAgICAgICdzZXQnLFxuICAgICAgICAgICAgJ3N0b3AnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIG1hcmtlcjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3ZpZXdCb3gnLFxuICAgICAgICAgICAgJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICAgICAgICAgICAgJ3JlZlgnLFxuICAgICAgICAgICAgJ3JlZlknLFxuICAgICAgICAgICAgJ21hcmtlclVuaXRzJyxcbiAgICAgICAgICAgICdtYXJrZXJXaWR0aCcsXG4gICAgICAgICAgICAnbWFya2VySGVpZ2h0JyxcbiAgICAgICAgICAgICdvcmllbnQnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBtYXJrZXJVbml0czogJ3N0cm9rZVdpZHRoJyxcbiAgICAgICAgICAgIHJlZlg6ICcwJyxcbiAgICAgICAgICAgIHJlZlk6ICcwJyxcbiAgICAgICAgICAgIG1hcmtlcldpZHRoOiAnMycsXG4gICAgICAgICAgICBtYXJrZXJIZWlnaHQ6ICczJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnLFxuICAgICAgICAgICAgJ3N0cnVjdHVyYWwnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGhEZWYnLFxuICAgICAgICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgICAgICdjdXJzb3InLFxuICAgICAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnZm9udCcsXG4gICAgICAgICAgICAnZm9udC1mYWNlJyxcbiAgICAgICAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICdtYXNrJyxcbiAgICAgICAgICAgICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICdzY3JpcHQnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzd2l0Y2gnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3ZpZXcnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIG1hc2s6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICAgJ21hc2tVbml0cycsXG4gICAgICAgICAgICAnbWFza0NvbnRlbnRVbml0cydcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIG1hc2tVbml0czogJ29iamVjdEJvdW5kaW5nQm94JyxcbiAgICAgICAgICAgIG1hc2tDb250ZW50VW5pdHM6ICd1c2VyU3BhY2VPblVzZScsXG4gICAgICAgICAgICB4OiAnLTEwJScsXG4gICAgICAgICAgICB5OiAnLTEwJScsXG4gICAgICAgICAgICB3aWR0aDogJzEyMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTIwJSdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnLFxuICAgICAgICAgICAgJ3NoYXBlJyxcbiAgICAgICAgICAgICdzdHJ1Y3R1cmFsJyxcbiAgICAgICAgICAgICdwYWludFNlcnZlcidcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2EnLFxuICAgICAgICAgICAgJ2FsdEdseXBoRGVmJyxcbiAgICAgICAgICAgICdjbGlwUGF0aCcsXG4gICAgICAgICAgICAnY29sb3ItcHJvZmlsZScsXG4gICAgICAgICAgICAnY3Vyc29yJyxcbiAgICAgICAgICAgICdmaWx0ZXInLFxuICAgICAgICAgICAgJ2ZvbnQnLFxuICAgICAgICAgICAgJ2ZvbnQtZmFjZScsXG4gICAgICAgICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21hcmtlcicsXG4gICAgICAgICAgICAnbWFzaycsXG4gICAgICAgICAgICAncGF0dGVybicsXG4gICAgICAgICAgICAnc2NyaXB0JyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnc3dpdGNoJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd2aWV3J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBtZXRhZGF0YToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdtaXNzaW5nLWdseXBoJzoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2QnLFxuICAgICAgICAgICAgJ2hvcml6LWFkdi14JyxcbiAgICAgICAgICAgICd2ZXJ0LW9yaWdpbi14JyxcbiAgICAgICAgICAgICd2ZXJ0LW9yaWdpbi15JyxcbiAgICAgICAgICAgICd2ZXJ0LWFkdi15J1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnLFxuICAgICAgICAgICAgJ3N0cnVjdHVyYWwnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGhEZWYnLFxuICAgICAgICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgICAgICdjdXJzb3InLFxuICAgICAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnZm9udCcsXG4gICAgICAgICAgICAnZm9udC1mYWNlJyxcbiAgICAgICAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICdtYXNrJyxcbiAgICAgICAgICAgICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICdzY3JpcHQnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzd2l0Y2gnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3ZpZXcnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIG1wYXRoOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAneGxpbmsnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAnaHJlZicsXG4gICAgICAgICAgICAneGxpbms6aHJlZidcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBwYXRoOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdncmFwaGljYWxFdmVudCcsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICdkJyxcbiAgICAgICAgICAgICdwYXRoTGVuZ3RoJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgcGF0dGVybjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICd4bGluaydcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3ZpZXdCb3gnLFxuICAgICAgICAgICAgJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICAgJ3BhdHRlcm5Vbml0cycsXG4gICAgICAgICAgICAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gICAgICAgICAgICAncGF0dGVyblRyYW5zZm9ybScsXG4gICAgICAgICAgICAnaHJlZicsXG4gICAgICAgICAgICAneGxpbms6aHJlZidcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHBhdHRlcm5Vbml0czogJ29iamVjdEJvdW5kaW5nQm94JyxcbiAgICAgICAgICAgIHBhdHRlcm5Db250ZW50VW5pdHM6ICd1c2VyU3BhY2VPblVzZScsXG4gICAgICAgICAgICB4OiAnMCcsXG4gICAgICAgICAgICB5OiAnMCcsXG4gICAgICAgICAgICB3aWR0aDogJzAnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMCcsXG4gICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAneE1pZFlNaWQgbWVldCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJyxcbiAgICAgICAgICAgICdzaGFwZScsXG4gICAgICAgICAgICAnc3RydWN0dXJhbCdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2EnLFxuICAgICAgICAgICAgJ2FsdEdseXBoRGVmJyxcbiAgICAgICAgICAgICdjbGlwUGF0aCcsXG4gICAgICAgICAgICAnY29sb3ItcHJvZmlsZScsXG4gICAgICAgICAgICAnY3Vyc29yJyxcbiAgICAgICAgICAgICdmaWx0ZXInLFxuICAgICAgICAgICAgJ2ZvbnQnLFxuICAgICAgICAgICAgJ2ZvbnQtZmFjZScsXG4gICAgICAgICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21hcmtlcicsXG4gICAgICAgICAgICAnbWFzaycsXG4gICAgICAgICAgICAncGF0dGVybicsXG4gICAgICAgICAgICAnc2NyaXB0JyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnc3dpdGNoJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd2aWV3J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBwb2x5Z29uOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdncmFwaGljYWxFdmVudCcsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICdwb2ludHMnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdhbmltYXRpb24nLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBwb2x5bGluZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAnZ3JhcGhpY2FsRXZlbnQnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgICAgICAncG9pbnRzJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgcmFkaWFsR3JhZGllbnQ6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgJ3hsaW5rJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAnY3gnLFxuICAgICAgICAgICAgJ2N5JyxcbiAgICAgICAgICAgICdyJyxcbiAgICAgICAgICAgICdmeCcsXG4gICAgICAgICAgICAnZnknLFxuICAgICAgICAgICAgJ2ZyJyxcbiAgICAgICAgICAgICdncmFkaWVudFVuaXRzJyxcbiAgICAgICAgICAgICdncmFkaWVudFRyYW5zZm9ybScsXG4gICAgICAgICAgICAnc3ByZWFkTWV0aG9kJyxcbiAgICAgICAgICAgICdocmVmJyxcbiAgICAgICAgICAgICd4bGluazpocmVmJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgZ3JhZGllbnRVbml0czogJ29iamVjdEJvdW5kaW5nQm94JyxcbiAgICAgICAgICAgIGN4OiAnNTAlJyxcbiAgICAgICAgICAgIGN5OiAnNTAlJyxcbiAgICAgICAgICAgIHI6ICc1MCUnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ2FuaW1hdGVUcmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3NldCcsXG4gICAgICAgICAgICAnc3RvcCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgbWVzaEdyYWRpZW50OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICd4bGluaydcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ2dyYWRpZW50VW5pdHMnLFxuICAgICAgICAgICAgJ3RyYW5zZm9ybSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJyxcbiAgICAgICAgICAgICdwYWludFNlcnZlcicsXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ21lc2hSb3cnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIG1lc2hSb3c6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdtZXNoUGF0Y2gnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIG1lc2hQYXRjaDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ3N0b3AnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIHJlY3Q6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICAgJ3J4JyxcbiAgICAgICAgICAgICdyeSdcbiAgICAgICAgXSxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHg6ICcwJyxcbiAgICAgICAgICAgIHk6ICcwJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgc2NyaXB0OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAneGxpbmsnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgICAnaHJlZicsXG4gICAgICAgICAgICAneGxpbms6aHJlZidcbiAgICAgICAgXVxuICAgIH0sXG4gICAgc2V0OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdhbmltYXRpb24nLFxuICAgICAgICAgICAgJ3hsaW5rJyxcbiAgICAgICAgICAgICdhbmltYXRpb25BdHRyaWJ1dGVUYXJnZXQnLFxuICAgICAgICAgICAgJ2FuaW1hdGlvblRpbWluZycsXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndG8nXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgc29saWRDb2xvcjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdwYWludFNlcnZlcidcbiAgICAgICAgXVxuICAgIH0sXG4gICAgc3RvcDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ29mZnNldCcsXG4gICAgICAgICAgICAncGF0aCdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ2FuaW1hdGVDb2xvcicsXG4gICAgICAgICAgICAnc2V0J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBzdHlsZToge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgICAnbWVkaWEnLFxuICAgICAgICAgICAgJ3RpdGxlJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQvY3NzJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICBzdmc6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2RvY3VtZW50RXZlbnQnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAgICd2aWV3Qm94JyxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgICAgICAgICAgICd6b29tQW5kUGFuJyxcbiAgICAgICAgICAgICd2ZXJzaW9uJyxcbiAgICAgICAgICAgICdiYXNlUHJvZmlsZScsXG4gICAgICAgICAgICAnY29udGVudFNjcmlwdFR5cGUnLFxuICAgICAgICAgICAgJ2NvbnRlbnRTdHlsZVR5cGUnXG4gICAgICAgIF0sXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB4OiAnMCcsXG4gICAgICAgICAgICB5OiAnMCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAneE1pZFlNaWQgbWVldCcsXG4gICAgICAgICAgICB6b29tQW5kUGFuOiAnbWFnbmlmeScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4xJyxcbiAgICAgICAgICAgIGJhc2VQcm9maWxlOiAnbm9uZScsXG4gICAgICAgICAgICBjb250ZW50U2NyaXB0VHlwZTogJ2FwcGxpY2F0aW9uL2VjbWFzY3JpcHQnLFxuICAgICAgICAgICAgY29udGVudFN0eWxlVHlwZTogJ3RleHQvY3NzJ1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnYW5pbWF0aW9uJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGl2ZScsXG4gICAgICAgICAgICAnc2hhcGUnLFxuICAgICAgICAgICAgJ3N0cnVjdHVyYWwnLFxuICAgICAgICAgICAgJ3BhaW50U2VydmVyJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGhEZWYnLFxuICAgICAgICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICAgICAgICdjb2xvci1wcm9maWxlJyxcbiAgICAgICAgICAgICdjdXJzb3InLFxuICAgICAgICAgICAgJ2ZpbHRlcicsXG4gICAgICAgICAgICAnZm9udCcsXG4gICAgICAgICAgICAnZm9udC1mYWNlJyxcbiAgICAgICAgICAgICdmb3JlaWduT2JqZWN0JyxcbiAgICAgICAgICAgICdpbWFnZScsXG4gICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICdtYXNrJyxcbiAgICAgICAgICAgICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICdzY3JpcHQnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdzd2l0Y2gnLFxuICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgJ3ZpZXcnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIHN3aXRjaDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAnZ3JhcGhpY2FsRXZlbnQnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICAgICAgICAgICAgJ3RyYW5zZm9ybSdcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnLFxuICAgICAgICAgICAgJ3NoYXBlJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAgICAgICAnZycsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ3N2ZycsXG4gICAgICAgICAgICAnc3dpdGNoJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd1c2UnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIHN5bWJvbDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgICAgICAgICAgICd2aWV3Qm94JyxcbiAgICAgICAgICAgICdyZWZYJyxcbiAgICAgICAgICAgICdyZWZZJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgcmVmWDogMCxcbiAgICAgICAgICAgIHJlZlk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnLFxuICAgICAgICAgICAgJ3NoYXBlJyxcbiAgICAgICAgICAgICdzdHJ1Y3R1cmFsJyxcbiAgICAgICAgICAgICdwYWludFNlcnZlcidcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgJ2EnLFxuICAgICAgICAgICAgJ2FsdEdseXBoRGVmJyxcbiAgICAgICAgICAgICdjbGlwUGF0aCcsXG4gICAgICAgICAgICAnY29sb3ItcHJvZmlsZScsXG4gICAgICAgICAgICAnY3Vyc29yJyxcbiAgICAgICAgICAgICdmaWx0ZXInLFxuICAgICAgICAgICAgJ2ZvbnQnLFxuICAgICAgICAgICAgJ2ZvbnQtZmFjZScsXG4gICAgICAgICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgJ21hcmtlcicsXG4gICAgICAgICAgICAnbWFzaycsXG4gICAgICAgICAgICAncGF0dGVybicsXG4gICAgICAgICAgICAnc2NyaXB0JyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnc3dpdGNoJyxcbiAgICAgICAgICAgICd0ZXh0JyxcbiAgICAgICAgICAgICd2aWV3J1xuICAgICAgICBdXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29uZGl0aW9uYWxQcm9jZXNzaW5nJyxcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdncmFwaGljYWxFdmVudCcsXG4gICAgICAgICAgICAncHJlc2VudGF0aW9uJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICdsZW5ndGhBZGp1c3QnLFxuICAgICAgICAgICAgJ3gnLFxuICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgJ2R4JyxcbiAgICAgICAgICAgICdkeScsXG4gICAgICAgICAgICAncm90YXRlJyxcbiAgICAgICAgICAgICd0ZXh0TGVuZ3RoJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgeDogJzAnLFxuICAgICAgICAgICAgeTogJzAnLFxuICAgICAgICAgICAgbGVuZ3RoQWRqdXN0OiAnc3BhY2luZydcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2FuaW1hdGlvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnLFxuICAgICAgICAgICAgJ3RleHRDb250ZW50Q2hpbGQnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICB0ZXh0UGF0aDoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAnZ3JhcGhpY2FsRXZlbnQnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAneGxpbmsnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICdocmVmJyxcbiAgICAgICAgICAgICd4bGluazpocmVmJyxcbiAgICAgICAgICAgICdzdGFydE9mZnNldCcsXG4gICAgICAgICAgICAnbWV0aG9kJyxcbiAgICAgICAgICAgICdzcGFjaW5nJyxcbiAgICAgICAgICAgICdkJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgc3RhcnRPZmZzZXQ6ICcwJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ2FsaWduJyxcbiAgICAgICAgICAgIHNwYWNpbmc6ICdleGFjdCdcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudEdyb3VwczogW1xuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAnYWx0R2x5cGgnLFxuICAgICAgICAgICAgJ2FuaW1hdGUnLFxuICAgICAgICAgICAgJ2FuaW1hdGVDb2xvcicsXG4gICAgICAgICAgICAnc2V0JyxcbiAgICAgICAgICAgICd0cmVmJyxcbiAgICAgICAgICAgICd0c3BhbidcbiAgICAgICAgXVxuICAgIH0sXG4gICAgdGl0bGU6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZSdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgdHJlZjoge1xuICAgICAgICBhdHRyc0dyb3VwczogW1xuICAgICAgICAgICAgJ2NvbmRpdGlvbmFsUHJvY2Vzc2luZycsXG4gICAgICAgICAgICAnY29yZScsXG4gICAgICAgICAgICAnZ3JhcGhpY2FsRXZlbnQnLFxuICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICAneGxpbmsnXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICdocmVmJyxcbiAgICAgICAgICAgICd4bGluazpocmVmJ1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhbmltYXRlJyxcbiAgICAgICAgICAgICdhbmltYXRlQ29sb3InLFxuICAgICAgICAgICAgJ3NldCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgdHNwYW46IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2NvcmUnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nXG4gICAgICAgIF0sXG4gICAgICAgIGF0dHJzOiBbXG4gICAgICAgICAgICAnY2xhc3MnLFxuICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICdkeCcsXG4gICAgICAgICAgICAnZHknLFxuICAgICAgICAgICAgJ3JvdGF0ZScsXG4gICAgICAgICAgICAndGV4dExlbmd0aCcsXG4gICAgICAgICAgICAnbGVuZ3RoQWRqdXN0J1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF0sXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICdhJyxcbiAgICAgICAgICAgICdhbHRHbHlwaCcsXG4gICAgICAgICAgICAnYW5pbWF0ZScsXG4gICAgICAgICAgICAnYW5pbWF0ZUNvbG9yJyxcbiAgICAgICAgICAgICdzZXQnLFxuICAgICAgICAgICAgJ3RyZWYnLFxuICAgICAgICAgICAgJ3RzcGFuJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICB1c2U6IHtcbiAgICAgICAgYXR0cnNHcm91cHM6IFtcbiAgICAgICAgICAgICdjb3JlJyxcbiAgICAgICAgICAgICdjb25kaXRpb25hbFByb2Nlc3NpbmcnLFxuICAgICAgICAgICAgJ2dyYXBoaWNhbEV2ZW50JyxcbiAgICAgICAgICAgICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgJ3hsaW5rJ1xuICAgICAgICBdLFxuICAgICAgICBhdHRyczogW1xuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICd4JyxcbiAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAgICdocmVmJyxcbiAgICAgICAgICAgICd4bGluazpocmVmJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgeDogJzAnLFxuICAgICAgICAgICAgeTogJzAnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRHcm91cHM6IFtcbiAgICAgICAgICAgICdhbmltYXRpb24nLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aXZlJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICB2aWV3OiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgICAgICAgICAgICd2aWV3Qm94JyxcbiAgICAgICAgICAgICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgICAgICAgICAgICd6b29tQW5kUGFuJyxcbiAgICAgICAgICAgICd2aWV3VGFyZ2V0J1xuICAgICAgICBdLFxuICAgICAgICBjb250ZW50R3JvdXBzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpdmUnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIHZrZXJuOiB7XG4gICAgICAgIGF0dHJzR3JvdXBzOiBbXG4gICAgICAgICAgICAnY29yZSdcbiAgICAgICAgXSxcbiAgICAgICAgYXR0cnM6IFtcbiAgICAgICAgICAgICd1MScsXG4gICAgICAgICAgICAnZzEnLFxuICAgICAgICAgICAgJ3UyJyxcbiAgICAgICAgICAgICdnMicsXG4gICAgICAgICAgICAnaydcbiAgICAgICAgXVxuICAgIH1cbn07XG5cbi8vIGh0dHA6Ly93aWtpLmlua3NjYXBlLm9yZy93aWtpL2luZGV4LnBocC9JbmtzY2FwZS1zcGVjaWZpY19YTUxfYXR0cmlidXRlc1xuZXhwb3J0cy5lZGl0b3JOYW1lc3BhY2VzID0gW1xuICAgICdodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCcsXG4gICAgJ2h0dHA6Ly9pbmtzY2FwZS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkJyxcbiAgICAnaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZScsXG4gICAgJ2h0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucycsXG4gICAgJ2h0dHA6Ly9ucy5hZG9iZS5jb20vQWRvYmVJbGx1c3RyYXRvci8xMC4wLycsXG4gICAgJ2h0dHA6Ly9ucy5hZG9iZS5jb20vR3JhcGhzLzEuMC8nLFxuICAgICdodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlU1ZHVmlld2VyRXh0ZW5zaW9ucy8zLjAvJyxcbiAgICAnaHR0cDovL25zLmFkb2JlLmNvbS9WYXJpYWJsZXMvMS4wLycsXG4gICAgJ2h0dHA6Ly9ucy5hZG9iZS5jb20vU2F2ZUZvcldlYi8xLjAvJyxcbiAgICAnaHR0cDovL25zLmFkb2JlLmNvbS9FeHRlbnNpYmlsaXR5LzEuMC8nLFxuICAgICdodHRwOi8vbnMuYWRvYmUuY29tL0Zsb3dzLzEuMC8nLFxuICAgICdodHRwOi8vbnMuYWRvYmUuY29tL0ltYWdlUmVwbGFjZW1lbnQvMS4wLycsXG4gICAgJ2h0dHA6Ly9ucy5hZG9iZS5jb20vR2VuZXJpY0N1c3RvbU5hbWVzcGFjZS8xLjAvJyxcbiAgICAnaHR0cDovL25zLmFkb2JlLmNvbS9YUGF0aC8xLjAvJ1xuXTtcblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL2xpbmtpbmcuaHRtbCNwcm9jZXNzaW5nSVJJXG5leHBvcnRzLnJlZmVyZW5jZXNQcm9wcyA9IFtcbiAgICAnY2xpcC1wYXRoJyxcbiAgICAnY29sb3ItcHJvZmlsZScsXG4gICAgJ2ZpbGwnLFxuICAgICdmaWx0ZXInLFxuICAgICdtYXJrZXItc3RhcnQnLFxuICAgICdtYXJrZXItbWlkJyxcbiAgICAnbWFya2VyLWVuZCcsXG4gICAgJ21hc2snLFxuICAgICdzdHJva2UnLFxuICAgICdzdHlsZSdcbl07XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9wcm9waWR4Lmh0bWxcbmV4cG9ydHMuaW5oZXJpdGFibGVBdHRycyA9IFtcbiAgICAnY2xpcC1ydWxlJyxcbiAgICAnY29sb3InLFxuICAgICdjb2xvci1pbnRlcnBvbGF0aW9uJyxcbiAgICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJyxcbiAgICAnY29sb3ItcHJvZmlsZScsXG4gICAgJ2NvbG9yLXJlbmRlcmluZycsXG4gICAgJ2N1cnNvcicsXG4gICAgJ2RpcmVjdGlvbicsXG4gICAgJ2ZpbGwnLFxuICAgICdmaWxsLW9wYWNpdHknLFxuICAgICdmaWxsLXJ1bGUnLFxuICAgICdmb250JyxcbiAgICAnZm9udC1mYW1pbHknLFxuICAgICdmb250LXNpemUnLFxuICAgICdmb250LXNpemUtYWRqdXN0JyxcbiAgICAnZm9udC1zdHJldGNoJyxcbiAgICAnZm9udC1zdHlsZScsXG4gICAgJ2ZvbnQtdmFyaWFudCcsXG4gICAgJ2ZvbnQtd2VpZ2h0JyxcbiAgICAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsXG4gICAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJyxcbiAgICAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgICAna2VybmluZycsXG4gICAgJ2xldHRlci1zcGFjaW5nJyxcbiAgICAnbWFya2VyJyxcbiAgICAnbWFya2VyLWVuZCcsXG4gICAgJ21hcmtlci1taWQnLFxuICAgICdtYXJrZXItc3RhcnQnLFxuICAgICdwb2ludGVyLWV2ZW50cycsXG4gICAgJ3NoYXBlLXJlbmRlcmluZycsXG4gICAgJ3N0cm9rZScsXG4gICAgJ3N0cm9rZS1kYXNoYXJyYXknLFxuICAgICdzdHJva2UtZGFzaG9mZnNldCcsXG4gICAgJ3N0cm9rZS1saW5lY2FwJyxcbiAgICAnc3Ryb2tlLWxpbmVqb2luJyxcbiAgICAnc3Ryb2tlLW1pdGVybGltaXQnLFxuICAgICdzdHJva2Utb3BhY2l0eScsXG4gICAgJ3N0cm9rZS13aWR0aCcsXG4gICAgJ3RleHQtYW5jaG9yJyxcbiAgICAndGV4dC1yZW5kZXJpbmcnLFxuICAgICd0cmFuc2Zvcm0nLFxuICAgICd2aXNpYmlsaXR5JyxcbiAgICAnd2hpdGUtc3BhY2UnLFxuICAgICd3b3JkLXNwYWNpbmcnLFxuICAgICd3cml0aW5nLW1vZGUnXG5dO1xuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvc2luZ2xlLXBhZ2UuaHRtbCN0eXBlcy1Db2xvcktleXdvcmRzXG5leHBvcnRzLmNvbG9yc05hbWVzID0ge1xuICAgICdhbGljZWJsdWUnOiAnI2YwZjhmZicsXG4gICAgJ2FudGlxdWV3aGl0ZSc6ICcjZmFlYmQ3JyxcbiAgICAnYXF1YSc6ICcjMGZmJyxcbiAgICAnYXF1YW1hcmluZSc6ICcjN2ZmZmQ0JyxcbiAgICAnYXp1cmUnOiAnI2YwZmZmZicsXG4gICAgJ2JlaWdlJzogJyNmNWY1ZGMnLFxuICAgICdiaXNxdWUnOiAnI2ZmZTRjNCcsXG4gICAgJ2JsYWNrJzogJyMwMDAnLFxuICAgICdibGFuY2hlZGFsbW9uZCc6ICcjZmZlYmNkJyxcbiAgICAnYmx1ZSc6ICcjMDBmJyxcbiAgICAnYmx1ZXZpb2xldCc6ICcjOGEyYmUyJyxcbiAgICAnYnJvd24nOiAnI2E1MmEyYScsXG4gICAgJ2J1cmx5d29vZCc6ICcjZGViODg3JyxcbiAgICAnY2FkZXRibHVlJzogJyM1ZjllYTAnLFxuICAgICdjaGFydHJldXNlJzogJyM3ZmZmMDAnLFxuICAgICdjaG9jb2xhdGUnOiAnI2QyNjkxZScsXG4gICAgJ2NvcmFsJzogJyNmZjdmNTAnLFxuICAgICdjb3JuZmxvd2VyYmx1ZSc6ICcjNjQ5NWVkJyxcbiAgICAnY29ybnNpbGsnOiAnI2ZmZjhkYycsXG4gICAgJ2NyaW1zb24nOiAnI2RjMTQzYycsXG4gICAgJ2N5YW4nOiAnIzBmZicsXG4gICAgJ2RhcmtibHVlJzogJyMwMDAwOGInLFxuICAgICdkYXJrY3lhbic6ICcjMDA4YjhiJyxcbiAgICAnZGFya2dvbGRlbnJvZCc6ICcjYjg4NjBiJyxcbiAgICAnZGFya2dyYXknOiAnI2E5YTlhOScsXG4gICAgJ2RhcmtncmVlbic6ICcjMDA2NDAwJyxcbiAgICAnZGFya2dyZXknOiAnI2E5YTlhOScsXG4gICAgJ2RhcmtraGFraSc6ICcjYmRiNzZiJyxcbiAgICAnZGFya21hZ2VudGEnOiAnIzhiMDA4YicsXG4gICAgJ2RhcmtvbGl2ZWdyZWVuJzogJyM1NTZiMmYnLFxuICAgICdkYXJrb3JhbmdlJzogJyNmZjhjMDAnLFxuICAgICdkYXJrb3JjaGlkJzogJyM5OTMyY2MnLFxuICAgICdkYXJrcmVkJzogJyM4YjAwMDAnLFxuICAgICdkYXJrc2FsbW9uJzogJyNlOTk2N2EnLFxuICAgICdkYXJrc2VhZ3JlZW4nOiAnIzhmYmM4ZicsXG4gICAgJ2RhcmtzbGF0ZWJsdWUnOiAnIzQ4M2Q4YicsXG4gICAgJ2RhcmtzbGF0ZWdyYXknOiAnIzJmNGY0ZicsXG4gICAgJ2RhcmtzbGF0ZWdyZXknOiAnIzJmNGY0ZicsXG4gICAgJ2Rhcmt0dXJxdW9pc2UnOiAnIzAwY2VkMScsXG4gICAgJ2Rhcmt2aW9sZXQnOiAnIzk0MDBkMycsXG4gICAgJ2RlZXBwaW5rJzogJyNmZjE0OTMnLFxuICAgICdkZWVwc2t5Ymx1ZSc6ICcjMDBiZmZmJyxcbiAgICAnZGltZ3JheSc6ICcjNjk2OTY5JyxcbiAgICAnZGltZ3JleSc6ICcjNjk2OTY5JyxcbiAgICAnZG9kZ2VyYmx1ZSc6ICcjMWU5MGZmJyxcbiAgICAnZmlyZWJyaWNrJzogJyNiMjIyMjInLFxuICAgICdmbG9yYWx3aGl0ZSc6ICcjZmZmYWYwJyxcbiAgICAnZm9yZXN0Z3JlZW4nOiAnIzIyOGIyMicsXG4gICAgJ2Z1Y2hzaWEnOiAnI2YwZicsXG4gICAgJ2dhaW5zYm9ybyc6ICcjZGNkY2RjJyxcbiAgICAnZ2hvc3R3aGl0ZSc6ICcjZjhmOGZmJyxcbiAgICAnZ29sZCc6ICcjZmZkNzAwJyxcbiAgICAnZ29sZGVucm9kJzogJyNkYWE1MjAnLFxuICAgICdncmF5JzogJyM4MDgwODAnLFxuICAgICdncmVlbic6ICcjMDA4MDAwJyxcbiAgICAnZ3JlZW55ZWxsb3cnOiAnI2FkZmYyZicsXG4gICAgJ2dyZXknOiAnIzgwODA4MCcsXG4gICAgJ2hvbmV5ZGV3JzogJyNmMGZmZjAnLFxuICAgICdob3RwaW5rJzogJyNmZjY5YjQnLFxuICAgICdpbmRpYW5yZWQnOiAnI2NkNWM1YycsXG4gICAgJ2luZGlnbyc6ICcjNGIwMDgyJyxcbiAgICAnaXZvcnknOiAnI2ZmZmZmMCcsXG4gICAgJ2toYWtpJzogJyNmMGU2OGMnLFxuICAgICdsYXZlbmRlcic6ICcjZTZlNmZhJyxcbiAgICAnbGF2ZW5kZXJibHVzaCc6ICcjZmZmMGY1JyxcbiAgICAnbGF3bmdyZWVuJzogJyM3Y2ZjMDAnLFxuICAgICdsZW1vbmNoaWZmb24nOiAnI2ZmZmFjZCcsXG4gICAgJ2xpZ2h0Ymx1ZSc6ICcjYWRkOGU2JyxcbiAgICAnbGlnaHRjb3JhbCc6ICcjZjA4MDgwJyxcbiAgICAnbGlnaHRjeWFuJzogJyNlMGZmZmYnLFxuICAgICdsaWdodGdvbGRlbnJvZHllbGxvdyc6ICcjZmFmYWQyJyxcbiAgICAnbGlnaHRncmF5JzogJyNkM2QzZDMnLFxuICAgICdsaWdodGdyZWVuJzogJyM5MGVlOTAnLFxuICAgICdsaWdodGdyZXknOiAnI2QzZDNkMycsXG4gICAgJ2xpZ2h0cGluayc6ICcjZmZiNmMxJyxcbiAgICAnbGlnaHRzYWxtb24nOiAnI2ZmYTA3YScsXG4gICAgJ2xpZ2h0c2VhZ3JlZW4nOiAnIzIwYjJhYScsXG4gICAgJ2xpZ2h0c2t5Ymx1ZSc6ICcjODdjZWZhJyxcbiAgICAnbGlnaHRzbGF0ZWdyYXknOiAnIzc4OScsXG4gICAgJ2xpZ2h0c2xhdGVncmV5JzogJyM3ODknLFxuICAgICdsaWdodHN0ZWVsYmx1ZSc6ICcjYjBjNGRlJyxcbiAgICAnbGlnaHR5ZWxsb3cnOiAnI2ZmZmZlMCcsXG4gICAgJ2xpbWUnOiAnIzBmMCcsXG4gICAgJ2xpbWVncmVlbic6ICcjMzJjZDMyJyxcbiAgICAnbGluZW4nOiAnI2ZhZjBlNicsXG4gICAgJ21hZ2VudGEnOiAnI2YwZicsXG4gICAgJ21hcm9vbic6ICcjODAwMDAwJyxcbiAgICAnbWVkaXVtYXF1YW1hcmluZSc6ICcjNjZjZGFhJyxcbiAgICAnbWVkaXVtYmx1ZSc6ICcjMDAwMGNkJyxcbiAgICAnbWVkaXVtb3JjaGlkJzogJyNiYTU1ZDMnLFxuICAgICdtZWRpdW1wdXJwbGUnOiAnIzkzNzBkYicsXG4gICAgJ21lZGl1bXNlYWdyZWVuJzogJyMzY2IzNzEnLFxuICAgICdtZWRpdW1zbGF0ZWJsdWUnOiAnIzdiNjhlZScsXG4gICAgJ21lZGl1bXNwcmluZ2dyZWVuJzogJyMwMGZhOWEnLFxuICAgICdtZWRpdW10dXJxdW9pc2UnOiAnIzQ4ZDFjYycsXG4gICAgJ21lZGl1bXZpb2xldHJlZCc6ICcjYzcxNTg1JyxcbiAgICAnbWlkbmlnaHRibHVlJzogJyMxOTE5NzAnLFxuICAgICdtaW50Y3JlYW0nOiAnI2Y1ZmZmYScsXG4gICAgJ21pc3R5cm9zZSc6ICcjZmZlNGUxJyxcbiAgICAnbW9jY2FzaW4nOiAnI2ZmZTRiNScsXG4gICAgJ25hdmFqb3doaXRlJzogJyNmZmRlYWQnLFxuICAgICduYXZ5JzogJyMwMDAwODAnLFxuICAgICdvbGRsYWNlJzogJyNmZGY1ZTYnLFxuICAgICdvbGl2ZSc6ICcjODA4MDAwJyxcbiAgICAnb2xpdmVkcmFiJzogJyM2YjhlMjMnLFxuICAgICdvcmFuZ2UnOiAnI2ZmYTUwMCcsXG4gICAgJ29yYW5nZXJlZCc6ICcjZmY0NTAwJyxcbiAgICAnb3JjaGlkJzogJyNkYTcwZDYnLFxuICAgICdwYWxlZ29sZGVucm9kJzogJyNlZWU4YWEnLFxuICAgICdwYWxlZ3JlZW4nOiAnIzk4ZmI5OCcsXG4gICAgJ3BhbGV0dXJxdW9pc2UnOiAnI2FmZWVlZScsXG4gICAgJ3BhbGV2aW9sZXRyZWQnOiAnI2RiNzA5MycsXG4gICAgJ3BhcGF5YXdoaXAnOiAnI2ZmZWZkNScsXG4gICAgJ3BlYWNocHVmZic6ICcjZmZkYWI5JyxcbiAgICAncGVydSc6ICcjY2Q4NTNmJyxcbiAgICAncGluayc6ICcjZmZjMGNiJyxcbiAgICAncGx1bSc6ICcjZGRhMGRkJyxcbiAgICAncG93ZGVyYmx1ZSc6ICcjYjBlMGU2JyxcbiAgICAncHVycGxlJzogJyM4MDAwODAnLFxuICAgICdyZWJlY2NhcHVycGxlJzogJyM2MzknLFxuICAgICdyZWQnOiAnI2YwMCcsXG4gICAgJ3Jvc3licm93bic6ICcjYmM4ZjhmJyxcbiAgICAncm95YWxibHVlJzogJyM0MTY5ZTEnLFxuICAgICdzYWRkbGVicm93bic6ICcjOGI0NTEzJyxcbiAgICAnc2FsbW9uJzogJyNmYTgwNzInLFxuICAgICdzYW5keWJyb3duJzogJyNmNGE0NjAnLFxuICAgICdzZWFncmVlbic6ICcjMmU4YjU3JyxcbiAgICAnc2Vhc2hlbGwnOiAnI2ZmZjVlZScsXG4gICAgJ3NpZW5uYSc6ICcjYTA1MjJkJyxcbiAgICAnc2lsdmVyJzogJyNjMGMwYzAnLFxuICAgICdza3libHVlJzogJyM4N2NlZWInLFxuICAgICdzbGF0ZWJsdWUnOiAnIzZhNWFjZCcsXG4gICAgJ3NsYXRlZ3JheSc6ICcjNzA4MDkwJyxcbiAgICAnc2xhdGVncmV5JzogJyM3MDgwOTAnLFxuICAgICdzbm93JzogJyNmZmZhZmEnLFxuICAgICdzcHJpbmdncmVlbic6ICcjMDBmZjdmJyxcbiAgICAnc3RlZWxibHVlJzogJyM0NjgyYjQnLFxuICAgICd0YW4nOiAnI2QyYjQ4YycsXG4gICAgJ3RlYWwnOiAnIzAwODA4MCcsXG4gICAgJ3RoaXN0bGUnOiAnI2Q4YmZkOCcsXG4gICAgJ3RvbWF0byc6ICcjZmY2MzQ3JyxcbiAgICAndHVycXVvaXNlJzogJyM0MGUwZDAnLFxuICAgICd2aW9sZXQnOiAnI2VlODJlZScsXG4gICAgJ3doZWF0JzogJyNmNWRlYjMnLFxuICAgICd3aGl0ZSc6ICcjZmZmJyxcbiAgICAnd2hpdGVzbW9rZSc6ICcjZjVmNWY1JyxcbiAgICAneWVsbG93JzogJyNmZjAnLFxuICAgICd5ZWxsb3dncmVlbic6ICcjOWFjZDMyJ1xufTtcblxuZXhwb3J0cy5jb2xvcnNTaG9ydE5hbWVzID0ge1xuICAnI2YwZmZmZic6ICdhenVyZScsXG4gICcjZjVmNWRjJzogJ2JlaWdlJyxcbiAgJyNmZmU0YzQnOiAnYmlzcXVlJyxcbiAgJyNhNTJhMmEnOiAnYnJvd24nLFxuICAnI2ZmN2Y1MCc6ICdjb3JhbCcsXG4gICcjZmZkNzAwJzogJ2dvbGQnLFxuICAnIzgwODA4MCc6ICdncmF5JyxcbiAgJyMwMDgwMDAnOiAnZ3JlZW4nLFxuICAnIzRiMDA4Mic6ICdpbmRpZ28nLFxuICAnI2ZmZmZmMCc6ICdpdm9yeScsXG4gICcjZjBlNjhjJzogJ2toYWtpJyxcbiAgJyNmYWYwZTYnOiAnbGluZW4nLFxuICAnIzgwMDAwMCc6ICdtYXJvb24nLFxuICAnIzAwMDA4MCc6ICduYXZ5JyxcbiAgJyM4MDgwMDAnOiAnb2xpdmUnLFxuICAnI2ZmYTUwMCc6ICdvcmFuZ2UnLFxuICAnI2RhNzBkNic6ICdvcmNoaWQnLFxuICAnI2NkODUzZic6ICdwZXJ1JyxcbiAgJyNmZmMwY2InOiAncGluaycsXG4gICcjZGRhMGRkJzogJ3BsdW0nLFxuICAnIzgwMDA4MCc6ICdwdXJwbGUnLFxuICAnI2YwMCc6ICdyZWQnLFxuICAnI2ZmMDAwMCc6ICdyZWQnLFxuICAnI2ZhODA3Mic6ICdzYWxtb24nLFxuICAnI2EwNTIyZCc6ICdzaWVubmEnLFxuICAnI2MwYzBjMCc6ICdzaWx2ZXInLFxuICAnI2ZmZmFmYSc6ICdzbm93JyxcbiAgJyNkMmI0OGMnOiAndGFuJyxcbiAgJyMwMDgwODAnOiAndGVhbCcsXG4gICcjZmY2MzQ3JzogJ3RvbWF0bycsXG4gICcjZWU4MmVlJzogJ3Zpb2xldCcsXG4gICcjZjVkZWIzJzogJ3doZWF0J1xufTtcblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL3NpbmdsZS1wYWdlLmh0bWwjdHlwZXMtRGF0YVR5cGVDb2xvclxuZXhwb3J0cy5jb2xvcnNQcm9wcyA9IFtcbiAgICAnY29sb3InLCAnZmlsbCcsICdzdHJva2UnLCAnc3RvcC1jb2xvcicsICdmbG9vZC1jb2xvcicsICdsaWdodGluZy1jb2xvcidcbl07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgZWRpdG9ycyBuYW1lc3BhY2VzLCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyc7XG5cbnZhciBlZGl0b3JOYW1lc3BhY2VzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbnMnKS5lZGl0b3JOYW1lc3BhY2VzLFxuICAgIHByZWZpeGVzID0gW107XG5cbmV4cG9ydHMucGFyYW1zID0ge1xuICAgIGFkZGl0aW9uYWxOYW1lc3BhY2VzOiBbXVxufTtcblxuLyoqXG4gKiBSZW1vdmUgZWRpdG9ycyBuYW1lc3BhY2VzLCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHN2ZyB4bWxuczpzb2RpcG9kaT1cImh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkXCI+XG4gKiA8c29kaXBvZGk6bmFtZWR2aWV3Lz5cbiAqIDxwYXRoIHNvZGlwb2RpOm5vZGV0eXBlcz1cImNjY2NcIi8+XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtLCBwYXJhbXMpIHtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5hZGRpdGlvbmFsTmFtZXNwYWNlcykpIHtcbiAgICAgICAgZWRpdG9yTmFtZXNwYWNlcyA9IGVkaXRvck5hbWVzcGFjZXMuY29uY2F0KHBhcmFtcy5hZGRpdGlvbmFsTmFtZXNwYWNlcyk7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uZWxlbSkge1xuXG4gICAgICAgIGlmIChpdGVtLmlzRWxlbSgnc3ZnJykpIHtcblxuICAgICAgICAgICAgaXRlbS5lYWNoQXR0cihmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnICYmIGVkaXRvck5hbWVzcGFjZXMuaW5kZXhPZihhdHRyLnZhbHVlKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeGVzLnB1c2goYXR0ci5sb2NhbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gPHN2ZyB4bWxuczpzb2RpcG9kaT1cIlwiPlxuICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUF0dHIoYXR0ci5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gPCogc29kaXBvZGk6Kj1cIlwiPlxuICAgICAgICBpdGVtLmVhY2hBdHRyKGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXhlcy5pbmRleE9mKGF0dHIucHJlZml4KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyKGF0dHIubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDxzb2RpcG9kaToqPlxuICAgICAgICBpZiAocHJlZml4ZXMuaW5kZXhPZihpdGVtLnByZWZpeCkgPiAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICB9XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ2NsZWFudXBzIGF0dHJpYnV0ZXMgZnJvbSBuZXdsaW5lcywgdHJhaWxpbmcgYW5kIHJlcGVhdGluZyBzcGFjZXMnO1xuXG5leHBvcnRzLnBhcmFtcyA9IHtcbiAgICBuZXdsaW5lczogdHJ1ZSxcbiAgICB0cmltOiB0cnVlLFxuICAgIHNwYWNlczogdHJ1ZVxufTtcblxudmFyIHJlZ05ld2xpbmVzTmVlZFNwYWNlID0gLyhcXFMpXFxyP1xcbihcXFMpL2csXG4gICAgcmVnTmV3bGluZXMgPSAvXFxyP1xcbi9nLFxuICAgIHJlZ1NwYWNlcyA9IC9cXHN7Mix9L2c7XG5cbi8qKlxuICogQ2xlYW51cCBhdHRyaWJ1dGVzIHZhbHVlcyBmcm9tIG5ld2xpbmVzLCB0cmFpbGluZyBhbmQgcmVwZWF0aW5nIHNwYWNlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHBsdWdpbiBwYXJhbXNcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0sIHBhcmFtcykge1xuXG4gICAgaWYgKGl0ZW0uaXNFbGVtKCkpIHtcblxuICAgICAgICBpdGVtLmVhY2hBdHRyKGZ1bmN0aW9uKGF0dHIpIHtcblxuICAgICAgICAgICAgaWYgKHBhcmFtcy5uZXdsaW5lcykge1xuICAgICAgICAgICAgICAgIC8vIG5ldyBsaW5lIHdoaWNoIHJlcXVpcmVzIGEgc3BhY2UgaW5zdGVhZCBvZiB0aGVtc2VsdmVcbiAgICAgICAgICAgICAgICBhdHRyLnZhbHVlID0gYXR0ci52YWx1ZS5yZXBsYWNlKHJlZ05ld2xpbmVzTmVlZFNwYWNlLCBmdW5jdGlvbihtYXRjaCwgcDEsIHAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwMSArICcgJyArIHAyO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gc2ltcGxlIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IGF0dHIudmFsdWUucmVwbGFjZShyZWdOZXdsaW5lcywgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyYW1zLnRyaW0pIHtcbiAgICAgICAgICAgICAgICBhdHRyLnZhbHVlID0gYXR0ci52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYXJhbXMuc3BhY2VzKSB7XG4gICAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IGF0dHIudmFsdWUucmVwbGFjZShyZWdTcGFjZXMsICcgJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUN1c3RvbUVycm9yKG5hbWUsIG1lc3NhZ2UpIHtcbiAgICAvLyB1c2UgT2JqZWN0LmNyZWF0ZSgpLCBiZWNhdXNlIHNvbWUgVk1zIHByZXZlbnQgc2V0dGluZyBsaW5lL2NvbHVtbiBvdGhlcndpc2VcbiAgICAvLyAoaU9TIFNhZmFyaSAxMCBldmVuIHRocm93cyBhbiBleGNlcHRpb24pXG4gICAgdmFyIGVycm9yID0gT2JqZWN0LmNyZWF0ZShTeW50YXhFcnJvci5wcm90b3R5cGUpO1xuICAgIHZhciBlcnJvclN0YWNrID0gbmV3IEVycm9yKCk7XG5cbiAgICBlcnJvci5uYW1lID0gbmFtZTtcbiAgICBlcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIChlcnJvclN0YWNrLnN0YWNrIHx8ICcnKS5yZXBsYWNlKC9eKC4rXFxuKXsxLDN9LywgbmFtZSArICc6ICcgKyBtZXNzYWdlICsgJ1xcbicpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXJyb3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyB0b2tlbiB0eXBlcyAobm90ZTogdmFsdWUgc2hvdWxkbid0IGludGVyc2VjdCB3aXRoIHVzZWQgY2hhciBjb2RlcylcbnZhciBXSElURVNQQUNFID0gMTtcbnZhciBJREVOVElGSUVSID0gMjtcbnZhciBOVU1CRVIgPSAzO1xudmFyIFNUUklORyA9IDQ7XG52YXIgQ09NTUVOVCA9IDU7XG52YXIgUFVOQ1RVQVRPUiA9IDY7XG52YXIgQ0RPID0gNztcbnZhciBDREMgPSA4O1xudmFyIEFUS0VZV09SRCA9IDE0O1xudmFyIEZVTkNUSU9OID0gMTU7XG52YXIgVVJMID0gMTY7XG52YXIgUkFXID0gMTc7XG5cbnZhciBUQUIgPSA5O1xudmFyIE4gPSAxMDtcbnZhciBGID0gMTI7XG52YXIgUiA9IDEzO1xudmFyIFNQQUNFID0gMzI7XG5cbnZhciBUWVBFID0ge1xuICAgIFdoaXRlU3BhY2U6ICAgV0hJVEVTUEFDRSxcbiAgICBJZGVudGlmaWVyOiAgIElERU5USUZJRVIsXG4gICAgTnVtYmVyOiAgICAgICAgICAgTlVNQkVSLFxuICAgIFN0cmluZzogICAgICAgICAgIFNUUklORyxcbiAgICBDb21tZW50OiAgICAgICAgIENPTU1FTlQsXG4gICAgUHVuY3R1YXRvcjogICBQVU5DVFVBVE9SLFxuICAgIENETzogICAgICAgICAgICAgICAgIENETyxcbiAgICBDREM6ICAgICAgICAgICAgICAgICBDREMsXG4gICAgQXRLZXl3b3JkOiAgICAgQVRLRVlXT1JELFxuICAgIEZ1bmN0aW9uOiAgICAgICBGVU5DVElPTixcbiAgICBVcmw6ICAgICAgICAgICAgICAgICBVUkwsXG4gICAgUmF3OiAgICAgICAgICAgICAgICAgUkFXLFxuXG4gICAgRXhjbGFtYXRpb25NYXJrOiAgICAgIDMzLCAgLy8gIVxuICAgIFF1b3RhdGlvbk1hcms6ICAgICAgICAzNCwgIC8vIFwiXG4gICAgTnVtYmVyU2lnbjogICAgICAgICAgIDM1LCAgLy8gI1xuICAgIERvbGxhclNpZ246ICAgICAgICAgICAzNiwgIC8vICRcbiAgICBQZXJjZW50U2lnbjogICAgICAgICAgMzcsICAvLyAlXG4gICAgQW1wZXJzYW5kOiAgICAgICAgICAgIDM4LCAgLy8gJlxuICAgIEFwb3N0cm9waGU6ICAgICAgICAgICAzOSwgIC8vICdcbiAgICBMZWZ0UGFyZW50aGVzaXM6ICAgICAgNDAsICAvLyAoXG4gICAgUmlnaHRQYXJlbnRoZXNpczogICAgIDQxLCAgLy8gKVxuICAgIEFzdGVyaXNrOiAgICAgICAgICAgICA0MiwgIC8vICpcbiAgICBQbHVzU2lnbjogICAgICAgICAgICAgNDMsICAvLyArXG4gICAgQ29tbWE6ICAgICAgICAgICAgICAgIDQ0LCAgLy8gLFxuICAgIEh5cGhlbk1pbnVzOiAgICAgICAgICA0NSwgIC8vIC1cbiAgICBGdWxsU3RvcDogICAgICAgICAgICAgNDYsICAvLyAuXG4gICAgU29saWR1czogICAgICAgICAgICAgIDQ3LCAgLy8gL1xuICAgIENvbG9uOiAgICAgICAgICAgICAgICA1OCwgIC8vIDpcbiAgICBTZW1pY29sb246ICAgICAgICAgICAgNTksICAvLyA7XG4gICAgTGVzc1RoYW5TaWduOiAgICAgICAgIDYwLCAgLy8gPFxuICAgIEVxdWFsc1NpZ246ICAgICAgICAgICA2MSwgIC8vID1cbiAgICBHcmVhdGVyVGhhblNpZ246ICAgICAgNjIsICAvLyA+XG4gICAgUXVlc3Rpb25NYXJrOiAgICAgICAgIDYzLCAgLy8gP1xuICAgIENvbW1lcmNpYWxBdDogICAgICAgICA2NCwgIC8vIEBcbiAgICBMZWZ0U3F1YXJlQnJhY2tldDogICAgOTEsICAvLyBbXG4gICAgQmFja3NsYXNoOiAgICAgICAgICAgIDkyLCAgLy8gXFxcbiAgICBSaWdodFNxdWFyZUJyYWNrZXQ6ICAgOTMsICAvLyBdXG4gICAgQ2lyY3VtZmxleEFjY2VudDogICAgIDk0LCAgLy8gXlxuICAgIExvd0xpbmU6ICAgICAgICAgICAgICA5NSwgIC8vIF9cbiAgICBHcmF2ZUFjY2VudDogICAgICAgICAgOTYsICAvLyBgXG4gICAgTGVmdEN1cmx5QnJhY2tldDogICAgMTIzLCAgLy8ge1xuICAgIFZlcnRpY2FsTGluZTogICAgICAgIDEyNCwgIC8vIHxcbiAgICBSaWdodEN1cmx5QnJhY2tldDogICAxMjUsICAvLyB9XG4gICAgVGlsZGU6ICAgICAgICAgICAgICAgMTI2ICAgLy8gflxufTtcblxudmFyIE5BTUUgPSBPYmplY3Qua2V5cyhUWVBFKS5yZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBrZXkpIHtcbiAgICByZXN1bHRbVFlQRVtrZXldXSA9IGtleTtcbiAgICByZXR1cm4gcmVzdWx0O1xufSwge30pO1xuXG4vLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC8jdG9rZW5pemVyLWRlZmluaXRpb25zXG4vLyA+IG5vbi1BU0NJSSBjb2RlIHBvaW50XG4vLyA+ICAgQSBjb2RlIHBvaW50IHdpdGggYSB2YWx1ZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gVSswMDgwIDxjb250cm9sPlxuLy8gPiBuYW1lLXN0YXJ0IGNvZGUgcG9pbnRcbi8vID4gICBBIGxldHRlciwgYSBub24tQVNDSUkgY29kZSBwb2ludCwgb3IgVSswMDVGIExPVyBMSU5FIChfKS5cbi8vID4gbmFtZSBjb2RlIHBvaW50XG4vLyA+ICAgQSBuYW1lLXN0YXJ0IGNvZGUgcG9pbnQsIGEgZGlnaXQsIG9yIFUrMDAyRCBIWVBIRU4tTUlOVVMgKC0pXG4vLyBUaGF0IG1lYW5zIG9ubHkgQVNDSUkgY29kZSBwb2ludHMgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGFuZCB3ZSBhIG1hcHMgZm9yIDAuLjEyNyBjb2RlcyBvbmx5XG52YXIgU2FmZVVpbnQzMkFycmF5ID0gdHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQzMkFycmF5IDogQXJyYXk7IC8vIGZhbGxiYWNrIG9uIEFycmF5IHdoZW4gVHlwZWRBcnJheSBpcyBub3Qgc3VwcG9ydGVkXG52YXIgU1lNQk9MX1RZUEUgPSBuZXcgU2FmZVVpbnQzMkFycmF5KDB4ODApO1xudmFyIFBVTkNUVUFUSU9OID0gbmV3IFNhZmVVaW50MzJBcnJheSgweDgwKTtcbnZhciBTVE9QX1VSTF9SQVcgPSBuZXcgU2FmZVVpbnQzMkFycmF5KDB4ODApO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IFNZTUJPTF9UWVBFLmxlbmd0aDsgaSsrKSB7XG4gICAgU1lNQk9MX1RZUEVbaV0gPSBJREVOVElGSUVSO1xufVxuXG4vLyBmaWxsIGNhdGVnb3JpZXNcbltcbiAgICBUWVBFLkV4Y2xhbWF0aW9uTWFyaywgICAgLy8gIVxuICAgIFRZUEUuUXVvdGF0aW9uTWFyaywgICAgICAvLyBcIlxuICAgIFRZUEUuTnVtYmVyU2lnbiwgICAgICAgICAvLyAjXG4gICAgVFlQRS5Eb2xsYXJTaWduLCAgICAgICAgIC8vICRcbiAgICBUWVBFLlBlcmNlbnRTaWduLCAgICAgICAgLy8gJVxuICAgIFRZUEUuQW1wZXJzYW5kLCAgICAgICAgICAvLyAmXG4gICAgVFlQRS5BcG9zdHJvcGhlLCAgICAgICAgIC8vICdcbiAgICBUWVBFLkxlZnRQYXJlbnRoZXNpcywgICAgLy8gKFxuICAgIFRZUEUuUmlnaHRQYXJlbnRoZXNpcywgICAvLyApXG4gICAgVFlQRS5Bc3RlcmlzaywgICAgICAgICAgIC8vICpcbiAgICBUWVBFLlBsdXNTaWduLCAgICAgICAgICAgLy8gK1xuICAgIFRZUEUuQ29tbWEsICAgICAgICAgICAgICAvLyAsXG4gICAgVFlQRS5IeXBoZW5NaW51cywgICAgICAgIC8vIC1cbiAgICBUWVBFLkZ1bGxTdG9wLCAgICAgICAgICAgLy8gLlxuICAgIFRZUEUuU29saWR1cywgICAgICAgICAgICAvLyAvXG4gICAgVFlQRS5Db2xvbiwgICAgICAgICAgICAgIC8vIDpcbiAgICBUWVBFLlNlbWljb2xvbiwgICAgICAgICAgLy8gO1xuICAgIFRZUEUuTGVzc1RoYW5TaWduLCAgICAgICAvLyA8XG4gICAgVFlQRS5FcXVhbHNTaWduLCAgICAgICAgIC8vID1cbiAgICBUWVBFLkdyZWF0ZXJUaGFuU2lnbiwgICAgLy8gPlxuICAgIFRZUEUuUXVlc3Rpb25NYXJrLCAgICAgICAvLyA/XG4gICAgVFlQRS5Db21tZXJjaWFsQXQsICAgICAgIC8vIEBcbiAgICBUWVBFLkxlZnRTcXVhcmVCcmFja2V0LCAgLy8gW1xuICAgIC8vIFRZUEUuQmFja3NsYXNoLCAgICAgICAgICAvLyBcXFxuICAgIFRZUEUuUmlnaHRTcXVhcmVCcmFja2V0LCAvLyBdXG4gICAgVFlQRS5DaXJjdW1mbGV4QWNjZW50LCAgIC8vIF5cbiAgICAvLyBUWVBFLkxvd0xpbmUsICAgICAgICAgICAgLy8gX1xuICAgIFRZUEUuR3JhdmVBY2NlbnQsICAgICAgICAvLyBgXG4gICAgVFlQRS5MZWZ0Q3VybHlCcmFja2V0LCAgIC8vIHtcbiAgICBUWVBFLlZlcnRpY2FsTGluZSwgICAgICAgLy8gfFxuICAgIFRZUEUuUmlnaHRDdXJseUJyYWNrZXQsICAvLyB9XG4gICAgVFlQRS5UaWxkZSAgICAgICAgICAgICAgIC8vIH5cbl0uZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBTWU1CT0xfVFlQRVtOdW1iZXIoa2V5KV0gPSBQVU5DVFVBVE9SO1xuICAgIFBVTkNUVUFUSU9OW051bWJlcihrZXkpXSA9IFBVTkNUVUFUT1I7XG59KTtcblxuZm9yICh2YXIgaSA9IDQ4OyBpIDw9IDU3OyBpKyspIHtcbiAgICBTWU1CT0xfVFlQRVtpXSA9IE5VTUJFUjtcbn1cblxuU1lNQk9MX1RZUEVbU1BBQ0VdID0gV0hJVEVTUEFDRTtcblNZTUJPTF9UWVBFW1RBQl0gPSBXSElURVNQQUNFO1xuU1lNQk9MX1RZUEVbTl0gPSBXSElURVNQQUNFO1xuU1lNQk9MX1RZUEVbUl0gPSBXSElURVNQQUNFO1xuU1lNQk9MX1RZUEVbRl0gPSBXSElURVNQQUNFO1xuXG5TWU1CT0xfVFlQRVtUWVBFLkFwb3N0cm9waGVdID0gU1RSSU5HO1xuU1lNQk9MX1RZUEVbVFlQRS5RdW90YXRpb25NYXJrXSA9IFNUUklORztcblxuU1RPUF9VUkxfUkFXW1NQQUNFXSA9IDE7XG5TVE9QX1VSTF9SQVdbVEFCXSA9IDE7XG5TVE9QX1VSTF9SQVdbTl0gPSAxO1xuU1RPUF9VUkxfUkFXW1JdID0gMTtcblNUT1BfVVJMX1JBV1tGXSA9IDE7XG5TVE9QX1VSTF9SQVdbVFlQRS5BcG9zdHJvcGhlXSA9IDE7XG5TVE9QX1VSTF9SQVdbVFlQRS5RdW90YXRpb25NYXJrXSA9IDE7XG5TVE9QX1VSTF9SQVdbVFlQRS5MZWZ0UGFyZW50aGVzaXNdID0gMTtcblNUT1BfVVJMX1JBV1tUWVBFLlJpZ2h0UGFyZW50aGVzaXNdID0gMTtcblxuLy8gd2hpdGVzcGFjZSBpcyBwdW5jdHVhdGlvbiAuLi5cblBVTkNUVUFUSU9OW1NQQUNFXSA9IFBVTkNUVUFUT1I7XG5QVU5DVFVBVElPTltUQUJdID0gUFVOQ1RVQVRPUjtcblBVTkNUVUFUSU9OW05dID0gUFVOQ1RVQVRPUjtcblBVTkNUVUFUSU9OW1JdID0gUFVOQ1RVQVRPUjtcblBVTkNUVUFUSU9OW0ZdID0gUFVOQ1RVQVRPUjtcbi8vIC4uLiBoeXBlciBtaW51cyBpcyBub3RcblBVTkNUVUFUSU9OW1RZUEUuSHlwaGVuTWludXNdID0gMDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgVFlQRTogVFlQRSxcbiAgICBOQU1FOiBOQU1FLFxuXG4gICAgU1lNQk9MX1RZUEU6IFNZTUJPTF9UWVBFLFxuICAgIFBVTkNUVUFUSU9OOiBQVU5DVFVBVElPTixcbiAgICBTVE9QX1VSTF9SQVc6IFNUT1BfVVJMX1JBV1xufTtcbiIsInZhciBjcmVhdGVDdXN0b21FcnJvciA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2NyZWF0ZUN1c3RvbUVycm9yJyk7XG5cbnZhciBTeW50YXhQYXJzZUVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgaW5wdXQsIG9mZnNldCkge1xuICAgIHZhciBlcnJvciA9IGNyZWF0ZUN1c3RvbUVycm9yKCdTeW50YXhQYXJzZUVycm9yJywgbWVzc2FnZSk7XG5cbiAgICBlcnJvci5pbnB1dCA9IGlucHV0O1xuICAgIGVycm9yLm9mZnNldCA9IG9mZnNldDtcbiAgICBlcnJvci5yYXdNZXNzYWdlID0gbWVzc2FnZTtcbiAgICBlcnJvci5tZXNzYWdlID0gZXJyb3IucmF3TWVzc2FnZSArICdcXG4nICtcbiAgICAgICAgJyAgJyArIGVycm9yLmlucHV0ICsgJ1xcbicgK1xuICAgICAgICAnLS0nICsgbmV3IEFycmF5KChlcnJvci5vZmZzZXQgfHwgZXJyb3IuaW5wdXQubGVuZ3RoKSArIDEpLmpvaW4oJy0nKSArICdeJztcblxuICAgIHJldHVybiBlcnJvcjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFN5bnRheFBhcnNlRXJyb3I6IFN5bnRheFBhcnNlRXJyb3Jcbn07XG4iLCJ2YXIgU3ludGF4UGFyc2VFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKS5TeW50YXhQYXJzZUVycm9yO1xuXG52YXIgVEFCID0gOTtcbnZhciBOID0gMTA7XG52YXIgRiA9IDEyO1xudmFyIFIgPSAxMztcbnZhciBTUEFDRSA9IDMyO1xuXG52YXIgVG9rZW5pemVyID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgdGhpcy5zdHIgPSBzdHI7XG4gICAgdGhpcy5wb3MgPSAwO1xufTtcblxuVG9rZW5pemVyLnByb3RvdHlwZSA9IHtcbiAgICBjaGFyQ29kZUF0OiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgcmV0dXJuIHBvcyA8IHRoaXMuc3RyLmxlbmd0aCA/IHRoaXMuc3RyLmNoYXJDb2RlQXQocG9zKSA6IDA7XG4gICAgfSxcbiAgICBjaGFyQ29kZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgIH0sXG4gICAgbmV4dENoYXJDb2RlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgIH0sXG4gICAgbmV4dE5vbldzQ29kZTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJDb2RlQXQodGhpcy5maW5kV3NFbmQocG9zKSk7XG4gICAgfSxcbiAgICBmaW5kV3NFbmQ6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICBmb3IgKDsgcG9zIDwgdGhpcy5zdHIubGVuZ3RoOyBwb3MrKykge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSB0aGlzLnN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gUiAmJiBjb2RlICE9PSBOICYmIGNvZGUgIT09IEYgJiYgY29kZSAhPT0gU1BBQ0UgJiYgY29kZSAhPT0gVEFCKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH0sXG4gICAgc3Vic3RyaW5nVG9Qb3M6IGZ1bmN0aW9uKGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHIuc3Vic3RyaW5nKHRoaXMucG9zLCB0aGlzLnBvcyA9IGVuZCk7XG4gICAgfSxcbiAgICBlYXQ6IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhckNvZGUoKSAhPT0gY29kZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcignRXhwZWN0IGAnICsgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSArICdgJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcysrO1xuICAgIH0sXG4gICAgcGVlazogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyA8IHRoaXMuc3RyLmxlbmd0aCA/IHRoaXMuc3RyLmNoYXJBdCh0aGlzLnBvcysrKSA6ICcnO1xuICAgIH0sXG4gICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheFBhcnNlRXJyb3IobWVzc2FnZSwgdGhpcy5zdHIsIHRoaXMucG9zKTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRva2VuaXplcjtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24oaGFuZGxlcnMpIHtcbiAgICAgICAgdmFyIGN1ck5vZGUgPSBudWxsO1xuICAgICAgICB2YXIgcHJldiA9IG51bGw7XG4gICAgICAgIHZhciB0b2tlbnMgPSBbXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hpbGRyZW46IGhhbmRsZXJzLmNoaWxkcmVuLFxuICAgICAgICAgICAgbm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciB0bXAgPSBjdXJOb2RlO1xuICAgICAgICAgICAgICAgIGN1ck5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLm5vZGUuY2FsbCh0aGlzLCBub2RlKTtcbiAgICAgICAgICAgICAgICBjdXJOb2RlID0gdG1wO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNodW5rOiBmdW5jdGlvbihjaHVuaykge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1ck5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRGltZW5zaW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hleENvbG9yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0lkU2VsZWN0b3InOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUGVyY2VudGFnZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYubm9kZSA9PT0gY3VyTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LnZhbHVlICs9IGNodW5rO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQc2V1ZG9DbGFzc1NlbGVjdG9yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BzZXVkb0VsZW1lbnRTZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVcmwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuayA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYudmFsdWUgKz0gY2h1bms7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0F0cnVsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYubm9kZSA9PT0gY3VyTm9kZSAmJiBwcmV2LnZhbHVlID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi52YWx1ZSArPSBjaHVuaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHByZXYgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogY3VyTm9kZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3VsdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgU3ludGF4UGFyc2VFcnJvcjogcmVxdWlyZSgnLi9lcnJvcicpLlN5bnRheFBhcnNlRXJyb3IsXG4gICAgcGFyc2U6IHJlcXVpcmUoJy4vcGFyc2UnKSxcbiAgICBnZW5lcmF0ZTogcmVxdWlyZSgnLi9nZW5lcmF0ZScpLFxuICAgIHdhbGs6IHJlcXVpcmUoJy4vd2FsaycpXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi90b2tlbml6ZXInKS5UWVBFO1xudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgQ09NTUVOVCA9IFRZUEUuQ29tbWVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZWFkU2VxdWVuY2UocmVjb2duaXplcikge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY3JlYXRlTGlzdCgpO1xuICAgIHZhciBjaGlsZCA9IG51bGw7XG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIHJlY29nbml6ZXI6IHJlY29nbml6ZXIsXG4gICAgICAgIHNwYWNlOiBudWxsLFxuICAgICAgICBpZ25vcmVXUzogZmFsc2UsXG4gICAgICAgIGlnbm9yZVdTQWZ0ZXI6IGZhbHNlXG4gICAgfTtcblxuICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjYXNlIFdISVRFU1BBQ0U6XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuaWdub3JlV1MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNwYWNlID0gdGhpcy5XaGl0ZVNwYWNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSByZWNvZ25pemVyLmdldE5vZGUuY2FsbCh0aGlzLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5zcGFjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjb250ZXh0LnNwYWNlKTtcbiAgICAgICAgICAgIGNvbnRleHQuc3BhY2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuaWdub3JlV1NBZnRlcikge1xuICAgICAgICAgICAgY29udGV4dC5pZ25vcmVXU0FmdGVyID0gZmFsc2U7XG4gICAgICAgICAgICBjb250ZXh0Lmlnbm9yZVdTID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuaWdub3JlV1MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCdzb3VyY2UtbWFwJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHRyYWNrTm9kZXMgPSB7XG4gICAgQXRydWxlOiB0cnVlLFxuICAgIFNlbGVjdG9yOiB0cnVlLFxuICAgIERlY2xhcmF0aW9uOiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlU291cmNlTWFwKGhhbmRsZXJzKSB7XG4gICAgdmFyIG1hcCA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IoKTtcbiAgICB2YXIgbGluZSA9IDE7XG4gICAgdmFyIGNvbHVtbiA9IDA7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICAgICAgbGluZTogMSxcbiAgICAgICAgY29sdW1uOiAwXG4gICAgfTtcbiAgICB2YXIgb3JpZ2luYWwgPSB7XG4gICAgICAgIGxpbmU6IDAsIC8vIHNob3VsZCBiZSB6ZXJvIHRvIGFkZCBmaXJzdCBtYXBwaW5nXG4gICAgICAgIGNvbHVtbjogMFxuICAgIH07XG4gICAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB2YXIgYWN0aXZhdGVkR2VuZXJhdGVkID0ge1xuICAgICAgICBsaW5lOiAxLFxuICAgICAgICBjb2x1bW46IDBcbiAgICB9O1xuICAgIHZhciBhY3RpdmF0ZWRNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IGFjdGl2YXRlZEdlbmVyYXRlZFxuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlcnNOb2RlID0gaGFuZGxlcnMubm9kZTtcbiAgICBoYW5kbGVycy5ub2RlID0gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5sb2MgJiYgbm9kZS5sb2Muc3RhcnQgJiYgdHJhY2tOb2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUxpbmUgPSBub2RlLmxvYy5zdGFydC5saW5lO1xuICAgICAgICAgICAgdmFyIG5vZGVDb2x1bW4gPSBub2RlLmxvYy5zdGFydC5jb2x1bW4gLSAxO1xuXG4gICAgICAgICAgICBpZiAob3JpZ2luYWwubGluZSAhPT0gbm9kZUxpbmUgfHxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jb2x1bW4gIT09IG5vZGVDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5saW5lID0gbm9kZUxpbmU7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWwuY29sdW1uID0gbm9kZUNvbHVtbjtcblxuICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5saW5lID0gbGluZTtcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuY29sdW1uID0gY29sdW1uO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGVkLmxpbmUgIT09IGFjdGl2YXRlZEdlbmVyYXRlZC5saW5lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuY29sdW1uICE9PSBhY3RpdmF0ZWRHZW5lcmF0ZWQuY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuYWRkTWFwcGluZyhhY3RpdmF0ZWRNYXBwaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBub2RlLmxvYy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbCxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkOiBnZW5lcmF0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGhhbmRsZXJzTm9kZS5jYWxsKHRoaXMsIG5vZGUpO1xuXG4gICAgICAgIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlICYmIHRyYWNrTm9kZXMuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgYWN0aXZhdGVkR2VuZXJhdGVkLmxpbmUgPSBsaW5lO1xuICAgICAgICAgICAgYWN0aXZhdGVkR2VuZXJhdGVkLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlcnNDaHVuayA9IGhhbmRsZXJzLmNodW5rO1xuICAgIGhhbmRsZXJzLmNodW5rID0gZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaHVuay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaSkgPT09IDEwKSB7IC8vIFxcblxuICAgICAgICAgICAgICAgIGxpbmUrKztcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGhhbmRsZXJzQ2h1bmsoY2h1bmspO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlcnNSZXN1bHQgPSBoYW5kbGVycy5yZXN1bHQ7XG4gICAgaGFuZGxlcnMucmVzdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgICBtYXAuYWRkTWFwcGluZyhhY3RpdmF0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3M6IGhhbmRsZXJzUmVzdWx0KCksXG4gICAgICAgICAgICBtYXA6IG1hcFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gaGFuZGxlcnM7XG59O1xuIiwidmFyIExpc3QgPSByZXF1aXJlKCcuLi91dGlscy9saXN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlQ29udmVydG9ycyh3YWxrKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbVBsYWluT2JqZWN0OiBmdW5jdGlvbihhc3QpIHtcbiAgICAgICAgICAgIHdhbGsoYXN0LCB7XG4gICAgICAgICAgICAgICAgZW50ZXI6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbiBpbnN0YW5jZW9mIExpc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbmV3IExpc3QoKS5mcm9tQXJyYXkobm9kZS5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgICAgfSxcbiAgICAgICAgdG9QbGFpbk9iamVjdDogZnVuY3Rpb24oYXN0KSB7XG4gICAgICAgICAgICB3YWxrKGFzdCwge1xuICAgICAgICAgICAgICAgIGxlYXZlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi50b0FycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTGlzdCA9IHJlcXVpcmUoJy4vbGlzdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNsb25lKG5vZGUpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gbm9kZSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBub2RlW2tleV07XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoY2xvbmUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjbG9uZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgU0VNSUNPTE9OID0gVFlQRS5TZW1pY29sb247XG52YXIgTEVGVENVUkxZQlJBQ0tFVCA9IFRZUEUuTGVmdEN1cmx5QnJhY2tldDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ0F0cnVsZVByZWx1ZGUnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1tdXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbnVsbDtcblxuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICBpZiAodGhpcy5hdHJ1bGUuaGFzT3duUHJvcGVydHkobmFtZSkgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmF0cnVsZVtuYW1lXS5wcmVsdWRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBjdXN0b20gY29uc3VtZXJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5hdHJ1bGVbbmFtZV0ucHJlbHVkZS5jYWxsKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCBjb25zdW1lclxuICAgICAgICAgICAgY2hpbGRyZW4gPSB0aGlzLnJlYWRTZXF1ZW5jZSh0aGlzLnNjb3BlLkF0cnVsZVByZWx1ZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIuZW9mICE9PSB0cnVlICYmXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBMRUZUQ1VSTFlCUkFDS0VUICYmXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBTRU1JQ09MT04pIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignU2VtaWNvbG9uIG9yIGJsb2NrIGlzIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jcmVhdGVMaXN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0F0cnVsZVByZWx1ZGUnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uRnJvbUxpc3QoY2hpbGRyZW4pLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuKG5vZGUpO1xuICAgIH0sXG4gICAgd2Fsa0NvbnRleHQ6ICdhdHJ1bGVQcmVsdWRlJ1xufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcbnZhciBMRUZUU1FVQVJFQlJBQ0tFVCA9IFRZUEUuTGVmdFNxdWFyZUJyYWNrZXQ7XG52YXIgUklHSFRTUVVBUkVCUkFDS0VUID0gVFlQRS5SaWdodFNxdWFyZUJyYWNrZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdCcmFja2V0cycsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGNoaWxkcmVuOiBbW11dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24ocmVhZFNlcXVlbmNlLCByZWNvZ25pemVyKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoTEVGVFNRVUFSRUJSQUNLRVQpO1xuXG4gICAgICAgIGNoaWxkcmVuID0gcmVhZFNlcXVlbmNlLmNhbGwodGhpcywgcmVjb2duaXplcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNjYW5uZXIuZW9mKSB7XG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFJJR0hUU1FVQVJFQlJBQ0tFVCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0JyYWNrZXRzJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmNodW5rKCdbJyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4obm9kZSk7XG4gICAgICAgIHRoaXMuY2h1bmsoJ10nKTtcbiAgICB9XG59O1xuIiwidmFyIENEQyA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuQ0RDO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQ0RDJyxcbiAgICBzdHJ1Y3R1cmU6IFtdLFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDREMpOyAvLyAtLT5cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0NEQycsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmNodW5rKCctLT4nKTtcbiAgICB9XG59O1xuIiwidmFyIENETyA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuQ0RPO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQ0RPJyxcbiAgICBzdHJ1Y3R1cmU6IFtdLFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDRE8pOyAvLyA8IS0tXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdDRE8nLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5jaHVuaygnPCEtLScpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBGVUxMU1RPUCA9IFRZUEUuRnVsbFN0b3A7XG5cbi8vICcuJyBpZGVudFxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ0NsYXNzU2VsZWN0b3InLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBuYW1lOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChGVUxMU1RPUCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdDbGFzc1NlbGVjdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbih0aGlzLnNjYW5uZXIudG9rZW5TdGFydCAtIDEsIHRoaXMuc2Nhbm5lci50b2tlbkVuZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnNjYW5uZXIuY29uc3VtZShJREVOVElGSUVSKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuaygnLicpO1xuICAgICAgICB0aGlzLmNodW5rKG5vZGUubmFtZSk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFBMVVNTSUdOID0gVFlQRS5QbHVzU2lnbjtcbnZhciBTT0xJRFVTID0gVFlQRS5Tb2xpZHVzO1xudmFyIEdSRUFURVJUSEFOU0lHTiA9IFRZUEUuR3JlYXRlclRoYW5TaWduO1xudmFyIFRJTERFID0gVFlQRS5UaWxkZTtcblxuLy8gKyB8ID4gfCB+IHwgL2RlZXAvXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQ29tYmluYXRvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgR1JFQVRFUlRIQU5TSUdOOlxuICAgICAgICAgICAgY2FzZSBQTFVTU0lHTjpcbiAgICAgICAgICAgIGNhc2UgVElMREU6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTT0xJRFVTOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmV4cGVjdElkZW50aWZpZXIoJ2RlZXAnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFNPTElEVVMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignQ29tYmluYXRvciBpcyBleHBlY3RlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdDb21iaW5hdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5zY2FubmVyLnN1YnN0clRvQ3Vyc29yKHN0YXJ0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLm5hbWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBBU1RFUklTSyA9IFRZUEUuQXN0ZXJpc2s7XG52YXIgU09MSURVUyA9IFRZUEUuU29saWR1cztcblxuLy8gJy8qJyAuKiAnKi8nXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnQ29tbWVudCcsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnNjYW5uZXIudG9rZW5FbmQ7XG5cbiAgICAgICAgaWYgKChlbmQgLSBzdGFydCArIDIpID49IDIgJiZcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdChlbmQgLSAyKSA9PT0gQVNURVJJU0sgJiZcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdChlbmQgLSAxKSA9PT0gU09MSURVUykge1xuICAgICAgICAgICAgZW5kIC09IDI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnQ29tbWVudCcsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNjYW5uZXIuc291cmNlLnN1YnN0cmluZyhzdGFydCArIDIsIGVuZClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsoJy8qJyk7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS52YWx1ZSk7XG4gICAgICAgIHRoaXMuY2h1bmsoJyovJyk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcbnZhciBSSUdIVFBBUkVOVEhFU0lTID0gVFlQRS5SaWdodFBhcmVudGhlc2lzO1xuXG4vLyA8ZnVuY3Rpb24tdG9rZW4+IDxzZXF1ZW5jZT4gJyknXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnRnVuY3Rpb24nLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBuYW1lOiBTdHJpbmcsXG4gICAgICAgIGNoaWxkcmVuOiBbW11dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24ocmVhZFNlcXVlbmNlLCByZWNvZ25pemVyKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuc2Nhbm5lci5jb25zdW1lRnVuY3Rpb25OYW1lKCk7XG4gICAgICAgIHZhciBuYW1lTG93ZXJDYXNlID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB2YXIgY2hpbGRyZW47XG5cbiAgICAgICAgY2hpbGRyZW4gPSByZWNvZ25pemVyLmhhc093blByb3BlcnR5KG5hbWVMb3dlckNhc2UpXG4gICAgICAgICAgICA/IHJlY29nbml6ZXJbbmFtZUxvd2VyQ2FzZV0uY2FsbCh0aGlzLCByZWNvZ25pemVyKVxuICAgICAgICAgICAgOiByZWFkU2VxdWVuY2UuY2FsbCh0aGlzLCByZWNvZ25pemVyKTtcblxuICAgICAgICBpZiAoIXRoaXMuc2Nhbm5lci5lb2YpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoUklHSFRQQVJFTlRIRVNJUyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ0Z1bmN0aW9uJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLm5hbWUpO1xuICAgICAgICB0aGlzLmNodW5rKCcoJyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4obm9kZSk7XG4gICAgICAgIHRoaXMuY2h1bmsoJyknKTtcbiAgICB9LFxuICAgIHdhbGtDb250ZXh0OiAnZnVuY3Rpb24nXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdJZGVudGlmaWVyJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnSWRlbnRpZmllcicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24odGhpcy5zY2FubmVyLnRva2VuU3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlbkVuZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnNjYW5uZXIuY29uc3VtZShJREVOVElGSUVSKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLm5hbWUpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBOVU1CRVJTSUdOID0gVFlQRS5OdW1iZXJTaWduO1xuXG4vLyAnIycgaWRlbnRcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdJZFNlbGVjdG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoTlVNQkVSU0lHTik7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdJZFNlbGVjdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbih0aGlzLnNjYW5uZXIudG9rZW5TdGFydCAtIDEsIHRoaXMuc2Nhbm5lci50b2tlbkVuZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnNjYW5uZXIuY29uc3VtZShJREVOVElGSUVSKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuaygnIycpO1xuICAgICAgICB0aGlzLmNodW5rKG5vZGUubmFtZSk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgTEVGVFBBUkVOVEhFU0lTID0gVFlQRS5MZWZ0UGFyZW50aGVzaXM7XG52YXIgUklHSFRQQVJFTlRIRVNJUyA9IFRZUEUuUmlnaHRQYXJlbnRoZXNpcztcbnZhciBDT0xPTiA9IFRZUEUuQ29sb247XG52YXIgU09MSURVUyA9IFRZUEUuU29saWR1cztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ01lZGlhRmVhdHVyZScsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6IFN0cmluZyxcbiAgICAgICAgdmFsdWU6IFsnSWRlbnRpZmllcicsICdOdW1iZXInLCAnRGltZW5zaW9uJywgJ1JhdGlvJywgbnVsbF1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoTEVGVFBBUkVOVEhFU0lTKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIG5hbWUgPSB0aGlzLnNjYW5uZXIuY29uc3VtZShJREVOVElGSUVSKTtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlICE9PSBSSUdIVFBBUkVOVEhFU0lTKSB7XG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KENPTE9OKTtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBOVU1CRVI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIubG9va3VwVHlwZSgxKSA9PT0gSURFTlRJRklFUikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLkRpbWVuc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5sb29rdXBOb25XU1R5cGUoMSkgPT09IFNPTElEVVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5SYXRpbygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLk51bWJlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5JZGVudGlmaWVyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ051bWJlciwgZGltZW5zaW9uLCByYXRpbyBvciBpZGVudGlmaWVyIGlzIGV4cGVjdGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoUklHSFRQQVJFTlRIRVNJUyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdNZWRpYUZlYXR1cmUnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmNodW5rKCcoJyk7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoJzonKTtcbiAgICAgICAgICAgIHRoaXMubm9kZShub2RlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rKCcpJyk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFdISVRFU1BBQ0UgPSBUWVBFLldoaXRlU3BhY2U7XG52YXIgQ09NTUVOVCA9IFRZUEUuQ29tbWVudDtcbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIExFRlRQQVJFTlRIRVNJUyA9IFRZUEUuTGVmdFBhcmVudGhlc2lzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnTWVkaWFRdWVyeScsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGNoaWxkcmVuOiBbW1xuICAgICAgICAgICAgJ0lkZW50aWZpZXInLFxuICAgICAgICAgICAgJ01lZGlhRmVhdHVyZScsXG4gICAgICAgICAgICAnV2hpdGVTcGFjZSdcbiAgICAgICAgXV1cbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY3JlYXRlTGlzdCgpO1xuICAgICAgICB2YXIgY2hpbGQgPSBudWxsO1xuICAgICAgICB2YXIgc3BhY2UgPSBudWxsO1xuXG4gICAgICAgIHNjYW46XG4gICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgV0hJVEVTUEFDRTpcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSB0aGlzLldoaXRlU3BhY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5JZGVudGlmaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBMRUZUUEFSRU5USEVTSVM6XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5NZWRpYUZlYXR1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3BhY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICBzcGFjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ0lkZW50aWZpZXIgb3IgcGFyZW50aGVzaXMgaXMgZXhwZWN0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnTWVkaWFRdWVyeScsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb25Gcm9tTGlzdChjaGlsZHJlbiksXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4obm9kZSk7XG4gICAgfVxufTtcbiIsInZhciBDT01NQSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuQ29tbWE7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdNZWRpYVF1ZXJ5TGlzdCcsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGNoaWxkcmVuOiBbW1xuICAgICAgICAgICAgJ01lZGlhUXVlcnknXG4gICAgICAgIF1dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jcmVhdGVMaXN0KCk7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLk1lZGlhUXVlcnkocmVsYXRpdmUpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgIT09IENPTU1BKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ01lZGlhUXVlcnlMaXN0JyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbkZyb21MaXN0KGNoaWxkcmVuKSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbihub2RlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoJywnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsInZhciBOVU1CRVIgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFLk51bWJlcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ051bWJlcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5FbmQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5jb25zdW1lKE5VTUJFUilcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS52YWx1ZSk7XG4gICAgfVxufTtcbiIsIi8vICcvJyB8ICcqJyB8ICcsJyB8ICc6JyB8ICcrJyB8ICctJ1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ09wZXJhdG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnT3BlcmF0b3InLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5zY2FubmVyLnN1YnN0clRvQ3Vyc29yKHN0YXJ0KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLnZhbHVlKTtcbiAgICB9XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xudmFyIExFRlRQQVJFTlRIRVNJUyA9IFRZUEUuTGVmdFBhcmVudGhlc2lzO1xudmFyIFJJR0hUUEFSRU5USEVTSVMgPSBUWVBFLlJpZ2h0UGFyZW50aGVzaXM7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdQYXJlbnRoZXNlcycsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGNoaWxkcmVuOiBbW11dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24ocmVhZFNlcXVlbmNlLCByZWNvZ25pemVyKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoTEVGVFBBUkVOVEhFU0lTKTtcblxuICAgICAgICBjaGlsZHJlbiA9IHJlYWRTZXF1ZW5jZS5jYWxsKHRoaXMsIHJlY29nbml6ZXIpO1xuXG4gICAgICAgIGlmICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVhdChSSUdIVFBBUkVOVEhFU0lTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnUGFyZW50aGVzZXMnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsoJygnKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbihub2RlKTtcbiAgICAgICAgdGhpcy5jaHVuaygnKScpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBOVU1CRVIgPSBUWVBFLk51bWJlcjtcbnZhciBQRVJDRU5UU0lHTiA9IFRZUEUuUGVyY2VudFNpZ247XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdQZXJjZW50YWdlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIG51bWJlciA9IHRoaXMuc2Nhbm5lci5jb25zdW1lKE5VTUJFUik7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChQRVJDRU5UU0lHTik7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdQZXJjZW50YWdlJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgdmFsdWU6IG51bWJlclxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLnZhbHVlKTtcbiAgICAgICAgdGhpcy5jaHVuaygnJScpO1xuICAgIH1cbn07XG4iLCJ2YXIgVFlQRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEU7XG5cbnZhciBJREVOVElGSUVSID0gVFlQRS5JZGVudGlmaWVyO1xudmFyIEZVTkNUSU9OID0gVFlQRS5GdW5jdGlvbjtcbnZhciBDT0xPTiA9IFRZUEUuQ29sb247XG52YXIgUklHSFRQQVJFTlRIRVNJUyA9IFRZUEUuUmlnaHRQYXJlbnRoZXNpcztcblxuLy8gOiBpZGVudCBbICcoJyAuLiAnKScgXT9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdQc2V1ZG9DbGFzc1NlbGVjdG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgbmFtZTogU3RyaW5nLFxuICAgICAgICBjaGlsZHJlbjogW1snUmF3J10sIG51bGxdXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICB2YXIgbmFtZTtcbiAgICAgICAgdmFyIG5hbWVMb3dlckNhc2U7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChDT0xPTik7XG5cbiAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50b2tlblR5cGUgPT09IEZVTkNUSU9OKSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5zY2FubmVyLmNvbnN1bWVGdW5jdGlvbk5hbWUoKTtcbiAgICAgICAgICAgIG5hbWVMb3dlckNhc2UgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBzZXVkby5oYXNPd25Qcm9wZXJ0eShuYW1lTG93ZXJDYXNlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMucHNldWRvW25hbWVMb3dlckNhc2VdLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY3JlYXRlTGlzdCgpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmF3KHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW4sIDAsIDAsIGZhbHNlLCBmYWxzZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFJJR0hUUEFSRU5USEVTSVMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFtZSA9IHRoaXMuc2Nhbm5lci5jb25zdW1lKElERU5USUZJRVIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdQc2V1ZG9DbGFzc1NlbGVjdG9yJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuaygnOicpO1xuICAgICAgICB0aGlzLmNodW5rKG5vZGUubmFtZSk7XG5cbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoJygnKTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4obm9kZSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rKCcpJyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHdhbGtDb250ZXh0OiAnZnVuY3Rpb24nXG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBGVU5DVElPTiA9IFRZUEUuRnVuY3Rpb247XG52YXIgQ09MT04gPSBUWVBFLkNvbG9uO1xudmFyIFJJR0hUUEFSRU5USEVTSVMgPSBUWVBFLlJpZ2h0UGFyZW50aGVzaXM7XG5cbi8vIDo6IGlkZW50IFsgJygnIC4uICcpJyBdP1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1BzZXVkb0VsZW1lbnRTZWxlY3RvcicsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIG5hbWU6IFN0cmluZyxcbiAgICAgICAgY2hpbGRyZW46IFtbJ1JhdyddLCBudWxsXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgdmFyIG5hbWU7XG4gICAgICAgIHZhciBuYW1lTG93ZXJDYXNlO1xuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoQ09MT04pO1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KENPTE9OKTtcblxuICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gRlVOQ1RJT04pIHtcbiAgICAgICAgICAgIG5hbWUgPSB0aGlzLnNjYW5uZXIuY29uc3VtZUZ1bmN0aW9uTmFtZSgpO1xuICAgICAgICAgICAgbmFtZUxvd2VyQ2FzZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucHNldWRvLmhhc093blByb3BlcnR5KG5hbWVMb3dlckNhc2UpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5wc2V1ZG9bbmFtZUxvd2VyQ2FzZV0uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jcmVhdGVMaXN0KCk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5SYXcodGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbiwgMCwgMCwgZmFsc2UsIGZhbHNlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoUklHSFRQQVJFTlRIRVNJUyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5zY2FubmVyLmNvbnN1bWUoSURFTlRJRklFUik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ1BzZXVkb0VsZW1lbnRTZWxlY3RvcicsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsoJzo6Jyk7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS5uYW1lKTtcblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jaHVuaygnKCcpO1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbihub2RlKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoJyknKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgd2Fsa0NvbnRleHQ6ICdmdW5jdGlvbidcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnUmF3JyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKHN0YXJ0VG9rZW4sIGVuZFRva2VuVHlwZTEsIGVuZFRva2VuVHlwZTIsIGluY2x1ZGVUb2tlblR5cGUyLCBleGNsdWRlV2hpdGVTcGFjZSkge1xuICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSB0aGlzLnNjYW5uZXIuZ2V0VG9rZW5TdGFydChzdGFydFRva2VuKTtcbiAgICAgICAgdmFyIGVuZE9mZnNldDtcblxuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcChcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5nZXRSYXdMZW5ndGgoXG4gICAgICAgICAgICAgICAgc3RhcnRUb2tlbixcbiAgICAgICAgICAgICAgICBlbmRUb2tlblR5cGUxLFxuICAgICAgICAgICAgICAgIGVuZFRva2VuVHlwZTIsXG4gICAgICAgICAgICAgICAgaW5jbHVkZVRva2VuVHlwZTJcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZXhjbHVkZVdoaXRlU3BhY2UgJiYgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQgPiBzdGFydE9mZnNldCkge1xuICAgICAgICAgICAgZW5kT2Zmc2V0ID0gdGhpcy5zY2FubmVyLmdldE9mZnNldEV4Y2x1ZGVXUygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kT2Zmc2V0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ1JhdycsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnRPZmZzZXQsIGVuZE9mZnNldCksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5zY2FubmVyLnNvdXJjZS5zdWJzdHJpbmcoc3RhcnRPZmZzZXQsIGVuZE9mZnNldClcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS52YWx1ZSk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIENPTU1BID0gVFlQRS5Db21tYTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1NlbGVjdG9yTGlzdCcsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIGNoaWxkcmVuOiBbW1xuICAgICAgICAgICAgJ1NlbGVjdG9yJyxcbiAgICAgICAgICAgICdSYXcnXG4gICAgICAgIF1dXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY3JlYXRlTGlzdCgpO1xuXG4gICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZikge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLlNlbGVjdG9yKCkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLnRva2VuVHlwZSA9PT0gQ09NTUEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnU2VsZWN0b3JMaXN0JyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbkZyb21MaXN0KGNoaWxkcmVuKSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbihub2RlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsoJywnKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICB3YWxrQ29udGV4dDogJ3NlbGVjdG9yJ1xufTtcbiIsInZhciBTVFJJTkcgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFLlN0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1N0cmluZycsXG4gICAgc3RydWN0dXJlOiB7XG4gICAgICAgIHZhbHVlOiBTdHJpbmdcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5FbmQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5jb25zdW1lKFNUUklORylcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsobm9kZS52YWx1ZSk7XG4gICAgfVxufTtcbiIsInZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIFNUUklORyA9IFRZUEUuU3RyaW5nO1xudmFyIFVSTCA9IFRZUEUuVXJsO1xudmFyIFJBVyA9IFRZUEUuUmF3O1xudmFyIFJJR0hUUEFSRU5USEVTSVMgPSBUWVBFLlJpZ2h0UGFyZW50aGVzaXM7XG5cbi8vIHVybCAnKCcgUyogKHN0cmluZyB8IHJhdykgUyogJyknXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnVXJsJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFsnU3RyaW5nJywgJ1JhdyddXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0O1xuICAgICAgICB2YXIgdmFsdWU7XG5cbiAgICAgICAgdGhpcy5zY2FubmVyLmVhdChVUkwpO1xuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNUUklORzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUkFXOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5SYXcodGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbiwgMCwgUkFXLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmVycm9yKCdTdHJpbmcgb3IgUmF3IGlzIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG4gICAgICAgIHRoaXMuc2Nhbm5lci5lYXQoUklHSFRQQVJFTlRIRVNJUyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdVcmwnLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uKHN0YXJ0LCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuY2h1bmsoJ3VybCcpO1xuICAgICAgICB0aGlzLmNodW5rKCcoJyk7XG4gICAgICAgIHRoaXMubm9kZShub2RlLnZhbHVlKTtcbiAgICAgICAgdGhpcy5jaHVuaygnKScpO1xuICAgIH1cbn07XG4iLCJ2YXIgV0hJVEVTUEFDRSA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpLlRZUEUuV2hpdGVTcGFjZTtcbnZhciBTUEFDRSA9IE9iamVjdC5mcmVlemUoe1xuICAgIHR5cGU6ICdXaGl0ZVNwYWNlJyxcbiAgICBsb2M6IG51bGwsXG4gICAgdmFsdWU6ICcgJ1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdXaGl0ZVNwYWNlJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgdmFsdWU6IFN0cmluZ1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNjYW5uZXIuZWF0KFdISVRFU1BBQ0UpO1xuICAgICAgICByZXR1cm4gU1BBQ0U7XG5cbiAgICAgICAgLy8gcmV0dXJuIHtcbiAgICAgICAgLy8gICAgIHR5cGU6ICdXaGl0ZVNwYWNlJyxcbiAgICAgICAgLy8gICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbih0aGlzLnNjYW5uZXIudG9rZW5TdGFydCwgdGhpcy5zY2FubmVyLnRva2VuRW5kKSxcbiAgICAgICAgLy8gICAgIHZhbHVlOiB0aGlzLnNjYW5uZXIuY29uc3VtZShXSElURVNQQUNFKVxuICAgICAgICAvLyB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaHVuayhub2RlLnZhbHVlKTtcbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQW5QbHVzQjogcmVxdWlyZSgnLi9BblBsdXNCJyksXG4gICAgQXRydWxlOiByZXF1aXJlKCcuL0F0cnVsZScpLFxuICAgIEF0cnVsZVByZWx1ZGU6IHJlcXVpcmUoJy4vQXRydWxlUHJlbHVkZScpLFxuICAgIEF0dHJpYnV0ZVNlbGVjdG9yOiByZXF1aXJlKCcuL0F0dHJpYnV0ZVNlbGVjdG9yJyksXG4gICAgQmxvY2s6IHJlcXVpcmUoJy4vQmxvY2snKSxcbiAgICBCcmFja2V0czogcmVxdWlyZSgnLi9CcmFja2V0cycpLFxuICAgIENEQzogcmVxdWlyZSgnLi9DREMnKSxcbiAgICBDRE86IHJlcXVpcmUoJy4vQ0RPJyksXG4gICAgQ2xhc3NTZWxlY3RvcjogcmVxdWlyZSgnLi9DbGFzc1NlbGVjdG9yJyksXG4gICAgQ29tYmluYXRvcjogcmVxdWlyZSgnLi9Db21iaW5hdG9yJyksXG4gICAgQ29tbWVudDogcmVxdWlyZSgnLi9Db21tZW50JyksXG4gICAgRGVjbGFyYXRpb246IHJlcXVpcmUoJy4vRGVjbGFyYXRpb24nKSxcbiAgICBEZWNsYXJhdGlvbkxpc3Q6IHJlcXVpcmUoJy4vRGVjbGFyYXRpb25MaXN0JyksXG4gICAgRGltZW5zaW9uOiByZXF1aXJlKCcuL0RpbWVuc2lvbicpLFxuICAgIEZ1bmN0aW9uOiByZXF1aXJlKCcuL0Z1bmN0aW9uJyksXG4gICAgSGV4Q29sb3I6IHJlcXVpcmUoJy4vSGV4Q29sb3InKSxcbiAgICBJZGVudGlmaWVyOiByZXF1aXJlKCcuL0lkZW50aWZpZXInKSxcbiAgICBJZFNlbGVjdG9yOiByZXF1aXJlKCcuL0lkU2VsZWN0b3InKSxcbiAgICBNZWRpYUZlYXR1cmU6IHJlcXVpcmUoJy4vTWVkaWFGZWF0dXJlJyksXG4gICAgTWVkaWFRdWVyeTogcmVxdWlyZSgnLi9NZWRpYVF1ZXJ5JyksXG4gICAgTWVkaWFRdWVyeUxpc3Q6IHJlcXVpcmUoJy4vTWVkaWFRdWVyeUxpc3QnKSxcbiAgICBOdGg6IHJlcXVpcmUoJy4vTnRoJyksXG4gICAgTnVtYmVyOiByZXF1aXJlKCcuL051bWJlcicpLFxuICAgIE9wZXJhdG9yOiByZXF1aXJlKCcuL09wZXJhdG9yJyksXG4gICAgUGFyZW50aGVzZXM6IHJlcXVpcmUoJy4vUGFyZW50aGVzZXMnKSxcbiAgICBQZXJjZW50YWdlOiByZXF1aXJlKCcuL1BlcmNlbnRhZ2UnKSxcbiAgICBQc2V1ZG9DbGFzc1NlbGVjdG9yOiByZXF1aXJlKCcuL1BzZXVkb0NsYXNzU2VsZWN0b3InKSxcbiAgICBQc2V1ZG9FbGVtZW50U2VsZWN0b3I6IHJlcXVpcmUoJy4vUHNldWRvRWxlbWVudFNlbGVjdG9yJyksXG4gICAgUmF0aW86IHJlcXVpcmUoJy4vUmF0aW8nKSxcbiAgICBSYXc6IHJlcXVpcmUoJy4vUmF3JyksXG4gICAgUnVsZTogcmVxdWlyZSgnLi9SdWxlJyksXG4gICAgU2VsZWN0b3I6IHJlcXVpcmUoJy4vU2VsZWN0b3InKSxcbiAgICBTZWxlY3Rvckxpc3Q6IHJlcXVpcmUoJy4vU2VsZWN0b3JMaXN0JyksXG4gICAgU3RyaW5nOiByZXF1aXJlKCcuL1N0cmluZycpLFxuICAgIFN0eWxlU2hlZXQ6IHJlcXVpcmUoJy4vU3R5bGVTaGVldCcpLFxuICAgIFR5cGVTZWxlY3RvcjogcmVxdWlyZSgnLi9UeXBlU2VsZWN0b3InKSxcbiAgICBVbmljb2RlUmFuZ2U6IHJlcXVpcmUoJy4vVW5pY29kZVJhbmdlJyksXG4gICAgVXJsOiByZXF1aXJlKCcuL1VybCcpLFxuICAgIFZhbHVlOiByZXF1aXJlKCcuL1ZhbHVlJyksXG4gICAgV2hpdGVTcGFjZTogcmVxdWlyZSgnLi9XaGl0ZVNwYWNlJylcbn07XG4iLCIvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC0zLyN0aGUtYW5iLXR5cGVcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG5hbWU6ICdOdGgnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBudGg6IFsnQW5QbHVzQicsICdJZGVudGlmaWVyJ10sXG4gICAgICAgIHNlbGVjdG9yOiBbJ1NlbGVjdG9yTGlzdCcsIG51bGxdXG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oYWxsb3dPZkNsYXVzZSkge1xuICAgICAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLnRva2VuU3RhcnQ7XG4gICAgICAgIHZhciBlbmQgPSBzdGFydDtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gbnVsbDtcbiAgICAgICAgdmFyIHF1ZXJ5O1xuXG4gICAgICAgIGlmICh0aGlzLnNjYW5uZXIubG9va3VwVmFsdWUoMCwgJ29kZCcpIHx8IHRoaXMuc2Nhbm5lci5sb29rdXBWYWx1ZSgwLCAnZXZlbicpKSB7XG4gICAgICAgICAgICBxdWVyeSA9IHRoaXMuSWRlbnRpZmllcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkgPSB0aGlzLkFuUGx1c0IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgICAgICBpZiAoYWxsb3dPZkNsYXVzZSAmJiB0aGlzLnNjYW5uZXIubG9va3VwVmFsdWUoMCwgJ29mJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5uZXh0KCk7XG5cbiAgICAgICAgICAgIHNlbGVjdG9yID0gdGhpcy5TZWxlY3Rvckxpc3QoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMubmVlZFBvc2l0aW9ucykge1xuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuZ2V0TGFzdExpc3ROb2RlKHNlbGVjdG9yLmNoaWxkcmVuKS5sb2MuZW5kLm9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBxdWVyeS5sb2MuZW5kLm9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnTnRoJyxcbiAgICAgICAgICAgIGxvYzogdGhpcy5nZXRMb2NhdGlvbihzdGFydCwgZW5kKSxcbiAgICAgICAgICAgIG50aDogcXVlcnksXG4gICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3JcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMubm9kZShub2RlLm50aCk7XG4gICAgICAgIGlmIChub2RlLnNlbGVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rKCcgb2YgJyk7XG4gICAgICAgICAgICB0aGlzLm5vZGUobm9kZS5zZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbmFtZTogJ1NlbGVjdG9yJyxcbiAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgY2hpbGRyZW46IFtbXG4gICAgICAgICAgICAnVHlwZVNlbGVjdG9yJyxcbiAgICAgICAgICAgICdJZFNlbGVjdG9yJyxcbiAgICAgICAgICAgICdDbGFzc1NlbGVjdG9yJyxcbiAgICAgICAgICAgICdBdHRyaWJ1dGVTZWxlY3RvcicsXG4gICAgICAgICAgICAnUHNldWRvQ2xhc3NTZWxlY3RvcicsXG4gICAgICAgICAgICAnUHNldWRvRWxlbWVudFNlbGVjdG9yJyxcbiAgICAgICAgICAgICdDb21iaW5hdG9yJyxcbiAgICAgICAgICAgICdXaGl0ZVNwYWNlJ1xuICAgICAgICBdXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnJlYWRTZXF1ZW5jZSh0aGlzLnNjb3BlLlNlbGVjdG9yKTtcblxuICAgICAgICAvLyBub3RoaW5nIHdlcmUgY29uc3VtZWRcbiAgICAgICAgaWYgKHRoaXMuZ2V0Rmlyc3RMaXN0Tm9kZShjaGlsZHJlbikgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5lcnJvcignU2VsZWN0b3IgaXMgZXhwZWN0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnU2VsZWN0b3InLFxuICAgICAgICAgICAgbG9jOiB0aGlzLmdldExvY2F0aW9uRnJvbUxpc3QoY2hpbGRyZW4pLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuKG5vZGUpO1xuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBuYW1lOiAnVmFsdWUnLFxuICAgIHN0cnVjdHVyZToge1xuICAgICAgICBjaGlsZHJlbjogW1tdXVxuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5yZWFkU2VxdWVuY2UodGhpcy5zY29wZS5WYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdWYWx1ZScsXG4gICAgICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oc3RhcnQsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0KSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbihub2RlKTtcbiAgICB9XG59O1xuIiwidmFyIGRhdGEgPSByZXF1aXJlKCcuLi8uLi8uLi9kYXRhJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdlbmVyaWM6IHRydWUsXG4gICAgdHlwZXM6IGRhdGEudHlwZXMsXG4gICAgcHJvcGVydGllczogZGF0YS5wcm9wZXJ0aWVzLFxuICAgIG5vZGU6IHJlcXVpcmUoJy4uL25vZGUnKVxufTtcbiIsInZhciBjbXBDaGFyID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuY21wQ2hhcjtcbnZhciBUWVBFID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJykuVFlQRTtcblxudmFyIElERU5USUZJRVIgPSBUWVBFLklkZW50aWZpZXI7XG52YXIgU1RSSU5HID0gVFlQRS5TdHJpbmc7XG52YXIgTlVNQkVSID0gVFlQRS5OdW1iZXI7XG52YXIgRlVOQ1RJT04gPSBUWVBFLkZ1bmN0aW9uO1xudmFyIFVSTCA9IFRZUEUuVXJsO1xudmFyIE5VTUJFUlNJR04gPSBUWVBFLk51bWJlclNpZ247XG52YXIgTEVGVFBBUkVOVEhFU0lTID0gVFlQRS5MZWZ0UGFyZW50aGVzaXM7XG52YXIgTEVGVFNRVUFSRUJSQUNLRVQgPSBUWVBFLkxlZnRTcXVhcmVCcmFja2V0O1xudmFyIFBMVVNTSUdOID0gVFlQRS5QbHVzU2lnbjtcbnZhciBIWVBIRU5NSU5VUyA9IFRZUEUuSHlwaGVuTWludXM7XG52YXIgQ09NTUEgPSBUWVBFLkNvbW1hO1xudmFyIFNPTElEVVMgPSBUWVBFLlNvbGlkdXM7XG52YXIgQVNURVJJU0sgPSBUWVBFLkFzdGVyaXNrO1xudmFyIFBFUkNFTlRTSUdOID0gVFlQRS5QZXJjZW50U2lnbjtcbnZhciBCQUNLU0xBU0ggPSBUWVBFLkJhY2tzbGFzaDtcbnZhciBVID0gMTE3OyAvLyAndScuY2hhckNvZGVBdCgwKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmF1bHRSZWNvZ25pemVyKGNvbnRleHQpIHtcbiAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgY2FzZSBOVU1CRVJTSUdOOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuSGV4Q29sb3IoKTtcblxuICAgICAgICBjYXNlIENPTU1BOlxuICAgICAgICAgICAgY29udGV4dC5zcGFjZSA9IG51bGw7XG4gICAgICAgICAgICBjb250ZXh0Lmlnbm9yZVdTQWZ0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuT3BlcmF0b3IoKTtcblxuICAgICAgICBjYXNlIFNPTElEVVM6XG4gICAgICAgIGNhc2UgQVNURVJJU0s6XG4gICAgICAgIGNhc2UgUExVU1NJR046XG4gICAgICAgIGNhc2UgSFlQSEVOTUlOVVM6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5PcGVyYXRvcigpO1xuXG4gICAgICAgIGNhc2UgTEVGVFBBUkVOVEhFU0lTOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuUGFyZW50aGVzZXModGhpcy5yZWFkU2VxdWVuY2UsIGNvbnRleHQucmVjb2duaXplcik7XG5cbiAgICAgICAgY2FzZSBMRUZUU1FVQVJFQlJBQ0tFVDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJyYWNrZXRzKHRoaXMucmVhZFNlcXVlbmNlLCBjb250ZXh0LnJlY29nbml6ZXIpO1xuXG4gICAgICAgIGNhc2UgU1RSSU5HOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU3RyaW5nKCk7XG5cbiAgICAgICAgY2FzZSBOVU1CRVI6XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci5sb29rdXBUeXBlKDEpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBQRVJDRU5UU0lHTjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUGVyY2VudGFnZSgpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICAgICAgICAgICAgICAvLyBlZGdlIGNhc2U6IG51bWJlciB3aXRoIGZvbG93aW5nIFxcMCBhbmQgXFw5IGhhY2sgc2hvdWxkbid0IHRvIGJlIGEgRGltZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChjbXBDaGFyKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRoaXMuc2Nhbm5lci50b2tlbkVuZCwgQkFDS1NMQVNIKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5EaW1lbnNpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTnVtYmVyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGVU5DVElPTjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkZ1bmN0aW9uKHRoaXMucmVhZFNlcXVlbmNlLCBjb250ZXh0LnJlY29nbml6ZXIpO1xuXG4gICAgICAgIGNhc2UgVVJMOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuVXJsKCk7XG5cbiAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHVuaWNvZGUgcmFuZ2UsIGl0IHNob3VsZCBzdGFydCB3aXRoIHUrIG9yIFUrXG4gICAgICAgICAgICBpZiAoY21wQ2hhcih0aGlzLnNjYW5uZXIuc291cmNlLCB0aGlzLnNjYW5uZXIudG9rZW5TdGFydCwgVSkgJiZcbiAgICAgICAgICAgICAgICBjbXBDaGFyKHRoaXMuc2Nhbm5lci5zb3VyY2UsIHRoaXMuc2Nhbm5lci50b2tlblN0YXJ0ICsgMSwgUExVU1NJR04pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVW5pY29kZVJhbmdlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLklkZW50aWZpZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBOVU1CRVIgPSBUWVBFLk51bWJlcjtcbnZhciBOVU1CRVJTSUdOID0gVFlQRS5OdW1iZXJTaWduO1xudmFyIExFRlRTUVVBUkVCUkFDS0VUID0gVFlQRS5MZWZ0U3F1YXJlQnJhY2tldDtcbnZhciBQTFVTU0lHTiA9IFRZUEUuUGx1c1NpZ247XG52YXIgU09MSURVUyA9IFRZUEUuU29saWR1cztcbnZhciBBU1RFUklTSyA9IFRZUEUuQXN0ZXJpc2s7XG52YXIgRlVMTFNUT1AgPSBUWVBFLkZ1bGxTdG9wO1xudmFyIENPTE9OID0gVFlQRS5Db2xvbjtcbnZhciBHUkVBVEVSVEhBTlNJR04gPSBUWVBFLkdyZWF0ZXJUaGFuU2lnbjtcbnZhciBWRVJUSUNBTExJTkUgPSBUWVBFLlZlcnRpY2FsTGluZTtcbnZhciBUSUxERSA9IFRZUEUuVGlsZGU7XG5cbmZ1bmN0aW9uIGdldE5vZGUoY29udGV4dCkge1xuICAgIHN3aXRjaCAodGhpcy5zY2FubmVyLnRva2VuVHlwZSkge1xuICAgICAgICBjYXNlIFBMVVNTSUdOOlxuICAgICAgICBjYXNlIEdSRUFURVJUSEFOU0lHTjpcbiAgICAgICAgY2FzZSBUSUxERTpcbiAgICAgICAgICAgIGNvbnRleHQuc3BhY2UgPSBudWxsO1xuICAgICAgICAgICAgY29udGV4dC5pZ25vcmVXU0FmdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbWJpbmF0b3IoKTtcblxuICAgICAgICBjYXNlIFNPTElEVVM6ICAvLyAvZGVlcC9cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbWJpbmF0b3IoKTtcblxuICAgICAgICBjYXNlIEZVTExTVE9QOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ2xhc3NTZWxlY3RvcigpO1xuXG4gICAgICAgIGNhc2UgTEVGVFNRVUFSRUJSQUNLRVQ6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGVTZWxlY3RvcigpO1xuXG4gICAgICAgIGNhc2UgTlVNQkVSU0lHTjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLklkU2VsZWN0b3IoKTtcblxuICAgICAgICBjYXNlIENPTE9OOlxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5sb29rdXBUeXBlKDEpID09PSBDT0xPTikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBzZXVkb0VsZW1lbnRTZWxlY3RvcigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Qc2V1ZG9DbGFzc1NlbGVjdG9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBJREVOVElGSUVSOlxuICAgICAgICBjYXNlIEFTVEVSSVNLOlxuICAgICAgICBjYXNlIFZFUlRJQ0FMTElORTpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlR5cGVTZWxlY3RvcigpO1xuXG4gICAgICAgIGNhc2UgTlVNQkVSOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuUGVyY2VudGFnZSgpO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldE5vZGU6IGdldE5vZGVcbn07XG4iLCIvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLWltYWdlcy00LyNlbGVtZW50LW5vdGF0aW9uXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZWxlbWVudFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNyZWF0ZVNpbmdsZU5vZGVMaXN0KFxuICAgICAgICB0aGlzLklkU2VsZWN0b3IoKVxuICAgICk7XG5cbiAgICB0aGlzLnNjYW5uZXIuc2tpcFNDKCk7XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBDT01NQSA9IFRZUEUuQ29tbWE7XG52YXIgU0VNSUNPTE9OID0gVFlQRS5TZW1pY29sb247XG52YXIgSFlQSEVOTUlOVVMgPSBUWVBFLkh5cGhlbk1pbnVzO1xudmFyIEVYQ0xBTUFUSU9OTUFSSyA9IFRZUEUuRXhjbGFtYXRpb25NYXJrO1xuXG4vLyB2YXIgJygnIGlkZW50ICgnLCcgPHZhbHVlPj8gKT8gJyknXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY3JlYXRlTGlzdCgpO1xuXG4gICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgdmFyIGlkZW50U3RhcnQgPSB0aGlzLnNjYW5uZXIudG9rZW5TdGFydDtcblxuICAgIHRoaXMuc2Nhbm5lci5lYXQoSFlQSEVOTUlOVVMpO1xuICAgIGlmICh0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLnRva2VuU3RhcnQpICE9PSBIWVBIRU5NSU5VUykge1xuICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ0h5cGhlbk1pbnVzIGlzIGV4cGVjdGVkJyk7XG4gICAgfVxuICAgIHRoaXMuc2Nhbm5lci5lYXQoSURFTlRJRklFUik7XG5cbiAgICBjaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgdHlwZTogJ0lkZW50aWZpZXInLFxuICAgICAgICBsb2M6IHRoaXMuZ2V0TG9jYXRpb24oaWRlbnRTdGFydCwgdGhpcy5zY2FubmVyLnRva2VuU3RhcnQpLFxuICAgICAgICBuYW1lOiB0aGlzLnNjYW5uZXIuc3Vic3RyVG9DdXJzb3IoaWRlbnRTdGFydClcbiAgICB9KTtcblxuICAgIHRoaXMuc2Nhbm5lci5za2lwU0MoKTtcblxuICAgIGlmICh0aGlzLnNjYW5uZXIudG9rZW5UeXBlID09PSBDT01NQSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHRoaXMuT3BlcmF0b3IoKSk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5wYXJzZUN1c3RvbVByb3BlcnR5XG4gICAgICAgICAgICA/IHRoaXMuVmFsdWUobnVsbClcbiAgICAgICAgICAgIDogdGhpcy5SYXcodGhpcy5zY2FubmVyLmN1cnJlbnRUb2tlbiwgRVhDTEFNQVRJT05NQVJLLCBTRU1JQ09MT04sIGZhbHNlLCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG59O1xuIiwidmFyIFRZUEUgPSByZXF1aXJlKCcuLi8uLi90b2tlbml6ZXInKS5UWVBFO1xuXG52YXIgU1RSSU5HID0gVFlQRS5TdHJpbmc7XG52YXIgSURFTlRJRklFUiA9IFRZUEUuSWRlbnRpZmllcjtcbnZhciBVUkwgPSBUWVBFLlVybDtcbnZhciBMRUZUUEFSRU5USEVTSVMgPSBUWVBFLkxlZnRQYXJlbnRoZXNpcztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IHtcbiAgICAgICAgcHJlbHVkZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNyZWF0ZUxpc3QoKTtcblxuICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNraXBTQygpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2Nhbm5lci50b2tlblR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFNUUklORzpcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLlN0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFVSTDpcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLlVybCgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuZXJyb3IoJ1N0cmluZyBvciB1cmwoKSBpcyBleHBlY3RlZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmxvb2t1cE5vbldTVHlwZSgwKSA9PT0gSURFTlRJRklFUiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5sb29rdXBOb25XU1R5cGUoMCkgPT09IExFRlRQQVJFTlRIRVNJUykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5XaGl0ZVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5NZWRpYVF1ZXJ5TGlzdCgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICB9LFxuICAgICAgICBibG9jazogbnVsbFxuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24gc2VsZWN0b3JMaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaW5nbGVOb2RlTGlzdChcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JMaXN0KClcbiAgICAgICAgKTtcbiAgICB9XG59O1xuIiwidmFyIEFMTE9XX09GX0NMQVVTRSA9IHRydWU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlOiBmdW5jdGlvbiBudGhXaXRoT2ZDbGF1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZU5vZGVMaXN0KFxuICAgICAgICAgICAgdGhpcy5OdGgoQUxMT1dfT0ZfQ0xBVVNFKVxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJ2YXIgRElTQUxMT1dfT0ZfQ0xBVVNFID0gZmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlOiBmdW5jdGlvbiBudGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZU5vZGVMaXN0KFxuICAgICAgICAgICAgdGhpcy5OdGgoRElTQUxMT1dfT0ZfQ0xBVVNFKVxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJmdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgZGVzdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNyYyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NyZWF0ZScpLmNyZWF0ZShcbiAgICBtZXJnZShcbiAgICAgICAgcmVxdWlyZSgnLi9jb25maWcvbGV4ZXInKSxcbiAgICAgICAgcmVxdWlyZSgnLi9jb25maWcvcGFyc2VyJyksXG4gICAgICAgIHJlcXVpcmUoJy4vY29uZmlnL3dhbGtlcicpXG4gICAgKVxuKTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlQ29udGV4dDoge1xuICAgICAgICBkZWZhdWx0OiAnU3R5bGVTaGVldCcsXG4gICAgICAgIHN0eWxlc2hlZXQ6ICdTdHlsZVNoZWV0JyxcbiAgICAgICAgYXRydWxlOiAnQXRydWxlJyxcbiAgICAgICAgYXRydWxlUHJlbHVkZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQXRydWxlUHJlbHVkZShvcHRpb25zLmF0cnVsZSA/IFN0cmluZyhvcHRpb25zLmF0cnVsZSkgOiBudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVkaWFRdWVyeUxpc3Q6ICdNZWRpYVF1ZXJ5TGlzdCcsXG4gICAgICAgIG1lZGlhUXVlcnk6ICdNZWRpYVF1ZXJ5JyxcbiAgICAgICAgcnVsZTogJ1J1bGUnLFxuICAgICAgICBzZWxlY3Rvckxpc3Q6ICdTZWxlY3Rvckxpc3QnLFxuICAgICAgICBzZWxlY3RvcjogJ1NlbGVjdG9yJyxcbiAgICAgICAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQmxvY2sodHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlY2xhcmF0aW9uTGlzdDogJ0RlY2xhcmF0aW9uTGlzdCcsXG4gICAgICAgIGRlY2xhcmF0aW9uOiAnRGVjbGFyYXRpb24nLFxuICAgICAgICB2YWx1ZTogJ1ZhbHVlJ1xuICAgIH0sXG4gICAgc2NvcGU6IHJlcXVpcmUoJy4uL3Njb3BlJyksXG4gICAgYXRydWxlOiByZXF1aXJlKCcuLi9hdHJ1bGUnKSxcbiAgICBwc2V1ZG86IHJlcXVpcmUoJy4uL3BzZXVkbycpLFxuICAgIG5vZGU6IHJlcXVpcmUoJy4uL25vZGUnKVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIEF0cnVsZVByZWx1ZGU6IHJlcXVpcmUoJy4vYXRydWxlUHJlbHVkZScpLFxuICAgIFNlbGVjdG9yOiByZXF1aXJlKCcuL3NlbGVjdG9yJyksXG4gICAgVmFsdWU6IHJlcXVpcmUoJy4vdmFsdWUnKVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldE5vZGU6IHJlcXVpcmUoJy4vZGVmYXVsdCcpXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0Tm9kZTogcmVxdWlyZSgnLi9kZWZhdWx0JyksXG4gICAgJy1tb3otZWxlbWVudCc6IHJlcXVpcmUoJy4uL2Z1bmN0aW9uL2VsZW1lbnQnKSxcbiAgICAnZWxlbWVudCc6IHJlcXVpcmUoJy4uL2Z1bmN0aW9uL2VsZW1lbnQnKSxcbiAgICAnZXhwcmVzc2lvbic6IHJlcXVpcmUoJy4uL2Z1bmN0aW9uL2V4cHJlc3Npb24nKSxcbiAgICAndmFyJzogcmVxdWlyZSgnLi4vZnVuY3Rpb24vdmFyJylcbn07XG4iLCIvLyBsZWdhY3kgSUUgZnVuY3Rpb25cbi8vIGV4cHJlc3Npb24gJygnIHJhdyAnKSdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2luZ2xlTm9kZUxpc3QoXG4gICAgICAgIHRoaXMuUmF3KHRoaXMuc2Nhbm5lci5jdXJyZW50VG9rZW4sIDAsIDAsIGZhbHNlLCBmYWxzZSlcbiAgICApO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdmb250LWZhY2UnOiByZXF1aXJlKCcuL2ZvbnQtZmFjZScpLFxuICAgICdpbXBvcnQnOiByZXF1aXJlKCcuL2ltcG9ydCcpLFxuICAgICdtZWRpYSc6IHJlcXVpcmUoJy4vbWVkaWEnKSxcbiAgICAncGFnZSc6IHJlcXVpcmUoJy4vcGFnZScpLFxuICAgICdzdXBwb3J0cyc6IHJlcXVpcmUoJy4vc3VwcG9ydHMnKVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlOiB7XG4gICAgICAgIHByZWx1ZGU6IG51bGwsXG4gICAgICAgIGJsb2NrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJsb2NrKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlOiB7XG4gICAgICAgIHByZWx1ZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2luZ2xlTm9kZUxpc3QoXG4gICAgICAgICAgICAgICAgdGhpcy5NZWRpYVF1ZXJ5TGlzdCgpXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBibG9jazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5CbG9jayhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IHtcbiAgICAgICAgcHJlbHVkZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaW5nbGVOb2RlTGlzdChcbiAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yTGlzdCgpXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBibG9jazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5CbG9jayh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGlyJzogcmVxdWlyZSgnLi9kaXInKSxcbiAgICAnaGFzJzogcmVxdWlyZSgnLi9oYXMnKSxcbiAgICAnbGFuZyc6IHJlcXVpcmUoJy4vbGFuZycpLFxuICAgICdtYXRjaGVzJzogcmVxdWlyZSgnLi9tYXRjaGVzJyksXG4gICAgJ25vdCc6IHJlcXVpcmUoJy4vbm90JyksXG4gICAgJ250aC1jaGlsZCc6IHJlcXVpcmUoJy4vbnRoLWNoaWxkJyksXG4gICAgJ250aC1sYXN0LWNoaWxkJzogcmVxdWlyZSgnLi9udGgtbGFzdC1jaGlsZCcpLFxuICAgICdudGgtbGFzdC1vZi10eXBlJzogcmVxdWlyZSgnLi9udGgtbGFzdC1vZi10eXBlJyksXG4gICAgJ250aC1vZi10eXBlJzogcmVxdWlyZSgnLi9udGgtb2YtdHlwZScpLFxuICAgICdzbG90dGVkJzogcmVxdWlyZSgnLi9zbG90dGVkJylcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpbmdsZU5vZGVMaXN0KFxuICAgICAgICAgICAgdGhpcy5JZGVudGlmaWVyKClcbiAgICAgICAgKTtcbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaW5nbGVOb2RlTGlzdChcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JMaXN0KClcbiAgICAgICAgKTtcbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcGFyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaW5nbGVOb2RlTGlzdChcbiAgICAgICAgICAgIHRoaXMuSWRlbnRpZmllcigpXG4gICAgICAgICk7XG4gICAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlOiBmdW5jdGlvbiBjb21wb3VuZFNlbGVjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaW5nbGVOb2RlTGlzdChcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0b3IoKVxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBub2RlOiByZXF1aXJlKCcuLi9ub2RlJylcbn07XG4iLCJ2YXIgcmVzb2x2ZUtleXdvcmQgPSByZXF1aXJlKCdjc3MtdHJlZScpLmtleXdvcmQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2xlYW5BdHJ1bGUobm9kZSwgaXRlbSwgbGlzdCkge1xuICAgIGlmIChub2RlLmJsb2NrKSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSByZW1vdmVkIGF0LXJ1bGUgZG9uJ3QgcHJldmVudCBAaW1wb3J0IGZvciByZW1vdmFsXG4gICAgICAgIGlmICh0aGlzLnN0eWxlc2hlZXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzaGVldC5maXJzdEF0cnVsZXNBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5ibG9jay5jaGlsZHJlbi5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIGxpc3QucmVtb3ZlKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChub2RlLm5hbWUpIHtcbiAgICAgICAgY2FzZSAnY2hhcnNldCc6XG4gICAgICAgICAgICBpZiAoIW5vZGUucHJlbHVkZSB8fCBub2RlLnByZWx1ZGUuY2hpbGRyZW4uaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbnkgcnVsZSBiZWZvcmUgQGNoYXJzZXQgLT4gcmVtb3ZlIGl0XG4gICAgICAgICAgICBpZiAoaXRlbS5wcmV2KSB7XG4gICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdpbXBvcnQnOlxuICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGVzaGVldCA9PT0gbnVsbCB8fCAhdGhpcy5zdHlsZXNoZWV0LmZpcnN0QXRydWxlc0FsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBzb21lIHJ1bGVzIHRoYXQgbm90IGFuIEBpbXBvcnQgb3IgQGNoYXJzZXQgYmVmb3JlIEBpbXBvcnRcbiAgICAgICAgICAgIC8vIHJlbW92ZSBpdFxuICAgICAgICAgICAgbGlzdC5wcmV2VW50aWwoaXRlbS5wcmV2LCBmdW5jdGlvbihydWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUudHlwZSA9PT0gJ0F0cnVsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUubmFtZSA9PT0gJ2ltcG9ydCcgfHwgcnVsZS5uYW1lID09PSAnY2hhcnNldCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucm9vdC5maXJzdEF0cnVsZXNBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciBuYW1lID0gcmVzb2x2ZUtleXdvcmQobm9kZS5uYW1lKS5iYXNlbmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAna2V5ZnJhbWVzJyB8fFxuICAgICAgICAgICAgICAgIG5hbWUgPT09ICdtZWRpYScgfHxcbiAgICAgICAgICAgICAgICBuYW1lID09PSAnc3VwcG9ydHMnKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBkcm9wIGF0LXJ1bGUgd2l0aCBubyBwcmVsdWRlXG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLnByZWx1ZGUgfHwgbm9kZS5wcmVsdWRlLmNoaWxkcmVuLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxufTtcbiIsInZhciB3YWxrID0gcmVxdWlyZSgnY3NzLXRyZWUnKS53YWxrO1xudmFyIGhhbmRsZXJzID0ge1xuICAgIEF0cnVsZTogcmVxdWlyZSgnLi9BdHJ1bGUnKSxcbiAgICBSdWxlOiByZXF1aXJlKCcuL1J1bGUnKSxcbiAgICBEZWNsYXJhdGlvbjogcmVxdWlyZSgnLi9EZWNsYXJhdGlvbicpLFxuICAgIFR5cGVTZWxlY3RvcjogcmVxdWlyZSgnLi9UeXBlU2VsZWN0b3InKSxcbiAgICBDb21tZW50OiByZXF1aXJlKCcuL0NvbW1lbnQnKSxcbiAgICBPcGVyYXRvcjogcmVxdWlyZSgnLi9PcGVyYXRvcicpLFxuICAgIFdoaXRlU3BhY2U6IHJlcXVpcmUoJy4vV2hpdGVTcGFjZScpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFzdCwgb3B0aW9ucykge1xuICAgIHdhbGsoYXN0LCB7XG4gICAgICAgIGxlYXZlOiBmdW5jdGlvbihub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW25vZGUudHlwZV0uY2FsbCh0aGlzLCBub2RlLCBpdGVtLCBsaXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2xlYW5EZWNsYXJ0aW9uKG5vZGUsIGl0ZW0sIGxpc3QpIHtcbiAgICBpZiAobm9kZS52YWx1ZS5jaGlsZHJlbiAmJiBub2RlLnZhbHVlLmNoaWxkcmVuLmlzRW1wdHkoKSkge1xuICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICB9XG59O1xuIiwiLy8gcmVtb3ZlIHVzZWxlc3MgdW5pdmVyc2FsIHNlbGVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNsZWFuVHlwZShub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgdmFyIG5hbWUgPSBpdGVtLmRhdGEubmFtZTtcblxuICAgIC8vIGNoZWNrIGl0J3MgYSBub24tbmFtZXNwYWNlZCB1bml2ZXJzYWwgc2VsZWN0b3JcbiAgICBpZiAobmFtZSAhPT0gJyonKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgd2hlbiB1bml2ZXJzYWwgc2VsZWN0b3IgYmVmb3JlIG90aGVyIHNlbGVjdG9yc1xuICAgIHZhciBuZXh0VHlwZSA9IGl0ZW0ubmV4dCAmJiBpdGVtLm5leHQuZGF0YS50eXBlO1xuICAgIGlmIChuZXh0VHlwZSA9PT0gJ0lkU2VsZWN0b3InIHx8XG4gICAgICAgIG5leHRUeXBlID09PSAnQ2xhc3NTZWxlY3RvcicgfHxcbiAgICAgICAgbmV4dFR5cGUgPT09ICdBdHRyaWJ1dGVTZWxlY3RvcicgfHxcbiAgICAgICAgbmV4dFR5cGUgPT09ICdQc2V1ZG9DbGFzc1NlbGVjdG9yJyB8fFxuICAgICAgICBuZXh0VHlwZSA9PT0gJ1BzZXVkb0VsZW1lbnRTZWxlY3RvcicpIHtcbiAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2xlYW5Db21tZW50KGRhdGEsIGl0ZW0sIGxpc3QpIHtcbiAgICBsaXN0LnJlbW92ZShpdGVtKTtcbn07XG4iLCIvLyByZW1vdmUgd2hpdGUgc3BhY2VzIGFyb3VuZCBvcGVyYXRvcnMgd2hlbiBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNsZWFuV2hpdGVzcGFjZShub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgaWYgKG5vZGUudmFsdWUgPT09ICcrJyB8fCBub2RlLnZhbHVlID09PSAnLScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpdGVtLnByZXYgIT09IG51bGwgJiYgaXRlbS5wcmV2LmRhdGEudHlwZSA9PT0gJ1doaXRlU3BhY2UnKSB7XG4gICAgICAgIGxpc3QucmVtb3ZlKGl0ZW0ucHJldik7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0ubmV4dCAhPT0gbnVsbCAmJiBpdGVtLm5leHQuZGF0YS50eXBlID09PSAnV2hpdGVTcGFjZScpIHtcbiAgICAgICAgbGlzdC5yZW1vdmUoaXRlbS5uZXh0KTtcbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjbGVhbldoaXRlc3BhY2Uobm9kZSwgaXRlbSwgbGlzdCkge1xuICAgIC8vIHJlbW92ZSB3aGVuIGZpcnN0IG9yIGxhc3QgaXRlbSBpbiBzZXF1ZW5jZVxuICAgIGlmIChpdGVtLm5leHQgPT09IG51bGwgfHwgaXRlbS5wcmV2ID09PSBudWxsKSB7XG4gICAgICAgIGxpc3QucmVtb3ZlKGl0ZW0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHdoZW4gcHJldmlvdXMgbm9kZSBpcyB3aGl0ZXNwYWNlXG4gICAgaWYgKGl0ZW0ucHJldi5kYXRhLnR5cGUgPT09ICdXaGl0ZVNwYWNlJykge1xuICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5zdHlsZXNoZWV0ICE9PSBudWxsICYmIHRoaXMuc3R5bGVzaGVldC5jaGlsZHJlbiA9PT0gbGlzdCkgfHxcbiAgICAgICAgKHRoaXMuYmxvY2sgIT09IG51bGwgJiYgdGhpcy5ibG9jay5jaGlsZHJlbiA9PT0gbGlzdCkpIHtcbiAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgbm9kZS5ibG9jay5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKHJ1bGUpIHtcbiAgICAgICAgcnVsZS5wcmVsdWRlLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oc2ltcGxlc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHNpbXBsZXNlbGVjdG9yLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oZGF0YSwgaXRlbSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdQZXJjZW50YWdlJyAmJiBkYXRhLnZhbHVlID09PSAnMTAwJykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVHlwZVNlbGVjdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogZGF0YS5sb2MsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndG8nXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdUeXBlU2VsZWN0b3InICYmIGRhdGEubmFtZSA9PT0gJ2Zyb20nKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQZXJjZW50YWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogZGF0YS5sb2MsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzAnXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbiIsInZhciByZXNvbHZlS2V5d29yZCA9IHJlcXVpcmUoJ2Nzcy10cmVlJykua2V5d29yZDtcbnZhciBjb21wcmVzc0tleWZyYW1lcyA9IHJlcXVpcmUoJy4vYXRydWxlL2tleWZyYW1lcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAvLyBjb21wcmVzcyBAa2V5ZnJhbWUgc2VsZWN0b3JzXG4gICAgaWYgKHJlc29sdmVLZXl3b3JkKG5vZGUubmFtZSkuYmFzZW5hbWUgPT09ICdrZXlmcmFtZXMnKSB7XG4gICAgICAgIGNvbXByZXNzS2V5ZnJhbWVzKG5vZGUpO1xuICAgIH1cbn07XG4iLCJ2YXIgTGlzdCA9IHJlcXVpcmUoJ2Nzcy10cmVlJykuTGlzdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wcmVzc0JhY2tncm91bmQobm9kZSkge1xuICAgIGZ1bmN0aW9uIGxhc3RUeXBlKCkge1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMV0udHlwZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICBpZiAobGFzdFR5cGUoKSA9PT0gJ1doaXRlU3BhY2UnKSB7XG4gICAgICAgICAgICBidWZmZXIucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJ1ZmZlci51bnNoaWZ0KFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICAgICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcwJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnV2hpdGVTcGFjZScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnICdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICAgICAgICAgIGxvYzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcwJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdWYWx1ZS5wdXNoLmFwcGx5KG5ld1ZhbHVlLCBidWZmZXIpO1xuXG4gICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgIH1cblxuICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgIHZhciBidWZmZXIgPSBbXTtcblxuICAgIG5vZGUuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdPcGVyYXRvcicgJiYgbm9kZS52YWx1ZSA9PT0gJywnKSB7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgbmV3VmFsdWUucHVzaChub2RlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBkZWZhdWx0c1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUgPT09ICd0cmFuc3BhcmVudCcgfHxcbiAgICAgICAgICAgICAgICBub2RlLm5hbWUgPT09ICdub25lJyB8fFxuICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9PT0gJ3JlcGVhdCcgfHxcbiAgICAgICAgICAgICAgICBub2RlLm5hbWUgPT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZG9uJ3QgYWRkIHJlZHVuZGFudCBzcGFjZXNcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ1doaXRlU3BhY2UnICYmICghYnVmZmVyLmxlbmd0aCB8fCBsYXN0VHlwZSgpID09PSAnV2hpdGVTcGFjZScpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBidWZmZXIucHVzaChub2RlKTtcbiAgICB9KTtcblxuICAgIGZsdXNoKCk7XG4gICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBMaXN0KCkuZnJvbUFycmF5KG5ld1ZhbHVlKTtcbn07XG4iLCJ2YXIgcmVzb2x2ZU5hbWUgPSByZXF1aXJlKCdjc3MtdHJlZScpLnByb3BlcnR5O1xudmFyIGhhbmRsZXJzID0ge1xuICAgICdmb250JzogcmVxdWlyZSgnLi9wcm9wZXJ0eS9mb250JyksXG4gICAgJ2ZvbnQtd2VpZ2h0JzogcmVxdWlyZSgnLi9wcm9wZXJ0eS9mb250LXdlaWdodCcpLFxuICAgICdiYWNrZ3JvdW5kJzogcmVxdWlyZSgnLi9wcm9wZXJ0eS9iYWNrZ3JvdW5kJyksXG4gICAgJ2JvcmRlcic6IHJlcXVpcmUoJy4vcHJvcGVydHkvYm9yZGVyJyksXG4gICAgJ291dGxpbmUnOiByZXF1aXJlKCcuL3Byb3BlcnR5L2JvcmRlcicpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvbXByZXNzVmFsdWUobm9kZSkge1xuICAgIGlmICghdGhpcy5kZWNsYXJhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5ID0gcmVzb2x2ZU5hbWUodGhpcy5kZWNsYXJhdGlvbi5wcm9wZXJ0eSk7XG5cbiAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkocHJvcGVydHkuYmFzZW5hbWUpKSB7XG4gICAgICAgIGhhbmRsZXJzW3Byb3BlcnR5LmJhc2VuYW1lXShub2RlKTtcbiAgICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wcmVzc0ZvbnQobm9kZSkge1xuICAgIHZhciBsaXN0ID0gbm9kZS5jaGlsZHJlbjtcblxuICAgIGxpc3QuZWFjaFJpZ2h0KGZ1bmN0aW9uKG5vZGUsIGl0ZW0pIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5uYW1lID09PSAnYm9sZCcpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzcwMCdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLm5hbWUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXYgPSBpdGVtLnByZXY7XG5cbiAgICAgICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2LmRhdGEudHlwZSA9PT0gJ09wZXJhdG9yJyAmJiBwcmV2LmRhdGEudmFsdWUgPT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShwcmV2KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uYW1lID09PSAnbWVkaXVtJykge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gaXRlbS5uZXh0O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQuZGF0YS50eXBlICE9PSAnT3BlcmF0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIHJlZHVuZGFudCBzcGFjZXNcbiAgICBsaXN0LmVhY2goZnVuY3Rpb24obm9kZSwgaXRlbSkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnV2hpdGVTcGFjZScpIHtcbiAgICAgICAgICAgIGlmICghaXRlbS5wcmV2IHx8ICFpdGVtLm5leHQgfHwgaXRlbS5uZXh0LmRhdGEudHlwZSA9PT0gJ1doaXRlU3BhY2UnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChsaXN0LmlzRW1wdHkoKSkge1xuICAgICAgICBsaXN0Lmluc2VydChsaXN0LmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgdHlwZTogJ0lkZW50aWZpZXInLFxuICAgICAgICAgICAgbmFtZTogJ25vcm1hbCdcbiAgICAgICAgfSkpO1xuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvbXByZXNzRm9udFdlaWdodChub2RlKSB7XG4gICAgdmFyIHZhbHVlID0gbm9kZS5jaGlsZHJlbi5oZWFkLmRhdGE7XG5cbiAgICBpZiAodmFsdWUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnbm9ybWFsJzpcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLmhlYWQuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gICAgICAgICAgICAgICAgICAgIGxvYzogdmFsdWUubG9jLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzQwMCdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYm9sZCc6XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5oZWFkLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgICAgICAgICBsb2M6IHZhbHVlLmxvYyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICc3MDAnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJ2YXIgcGFja051bWJlciA9IHJlcXVpcmUoJy4vTnVtYmVyJykucGFjaztcbnZhciBMRU5HVEhfVU5JVCA9IHtcbiAgICAvLyBhYnNvbHV0ZSBsZW5ndGggdW5pdHNcbiAgICAncHgnOiB0cnVlLFxuICAgICdtbSc6IHRydWUsXG4gICAgJ2NtJzogdHJ1ZSxcbiAgICAnaW4nOiB0cnVlLFxuICAgICdwdCc6IHRydWUsXG4gICAgJ3BjJzogdHJ1ZSxcblxuICAgIC8vIHJlbGF0aXZlIGxlbmd0aCB1bml0c1xuICAgICdlbSc6IHRydWUsXG4gICAgJ2V4JzogdHJ1ZSxcbiAgICAnY2gnOiB0cnVlLFxuICAgICdyZW0nOiB0cnVlLFxuXG4gICAgLy8gdmlld3BvcnQtcGVyY2VudGFnZSBsZW5ndGhzXG4gICAgJ3ZoJzogdHJ1ZSxcbiAgICAndncnOiB0cnVlLFxuICAgICd2bWluJzogdHJ1ZSxcbiAgICAndm1heCc6IHRydWUsXG4gICAgJ3ZtJzogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wcmVzc0RpbWVuc2lvbihub2RlLCBpdGVtKSB7XG4gICAgdmFyIHZhbHVlID0gcGFja051bWJlcihub2RlLnZhbHVlLCBpdGVtKTtcblxuICAgIG5vZGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJzAnICYmIHRoaXMuZGVjbGFyYXRpb24gIT09IG51bGwgJiYgdGhpcy5hdHJ1bGVQcmVsdWRlID09PSBudWxsKSB7XG4gICAgICAgIHZhciB1bml0ID0gbm9kZS51bml0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gb25seSBsZW5ndGggdmFsdWVzIGNhbiBiZSBjb21wcmVzc2VkXG4gICAgICAgIGlmICghTEVOR1RIX1VOSVQuaGFzT3duUHJvcGVydHkodW5pdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlzc3VlICMzNjI6IHNob3VsZG4ndCByZW1vdmUgdW5pdCBpbiAtbXMtZmxleCBzaW5jZSBpdCBicmVha3MgZmxleCBpbiBJRTEwLzExXG4gICAgICAgIC8vIGlzc3VlICMyMDA6IHNob3VsZG4ndCByZW1vdmUgdW5pdCBpbiBmbGV4IHNpbmNlIGl0IGJyZWFrcyBmbGV4IGluIElFMTAvMTFcbiAgICAgICAgaWYgKHRoaXMuZGVjbGFyYXRpb24ucHJvcGVydHkgPT09ICctbXMtZmxleCcgfHxcbiAgICAgICAgICAgIHRoaXMuZGVjbGFyYXRpb24ucHJvcGVydHkgPT09ICdmbGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaXNzdWUgIzIyMjogZG9uJ3QgcmVtb3ZlIHVuaXRzIGluc2lkZSBjYWxjXG4gICAgICAgIGlmICh0aGlzWydmdW5jdGlvbiddICYmIHRoaXNbJ2Z1bmN0aW9uJ10ubmFtZSA9PT0gJ2NhbGMnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmRhdGEgPSB7XG4gICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICB9XG59O1xuIiwidmFyIHBhY2tOdW1iZXIgPSByZXF1aXJlKCcuL051bWJlcicpLnBhY2s7XG52YXIgUEVSQ0VOVEFHRV9MRU5HVEhfUFJPUEVSVFkgPSB7XG4gICAgJ21hcmdpbic6IHRydWUsXG4gICAgJ21hcmdpbi10b3AnOiB0cnVlLFxuICAgICdtYXJnaW4tbGVmdCc6IHRydWUsXG4gICAgJ21hcmdpbi1ib3R0b20nOiB0cnVlLFxuICAgICdtYXJnaW4tcmlnaHQnOiB0cnVlLFxuXG4gICAgJ3BhZGRpbmcnOiB0cnVlLFxuICAgICdwYWRkaW5nLXRvcCc6IHRydWUsXG4gICAgJ3BhZGRpbmctbGVmdCc6IHRydWUsXG4gICAgJ3BhZGRpbmctYm90dG9tJzogdHJ1ZSxcbiAgICAncGFkZGluZy1yaWdodCc6IHRydWUsXG5cbiAgICAndG9wJzogdHJ1ZSxcbiAgICAnbGVmdCc6IHRydWUsXG4gICAgJ2JvdHRvbSc6IHRydWUsXG4gICAgJ3JpZ2h0JzogdHJ1ZSxcblxuICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uJzogdHJ1ZSxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi14JzogdHJ1ZSxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi15JzogdHJ1ZSxcbiAgICAnYmFja2dyb3VuZC1zaXplJzogdHJ1ZSxcblxuICAgICdib3JkZXInOiB0cnVlLFxuICAgICdib3JkZXItd2lkdGgnOiB0cnVlLFxuICAgICdib3JkZXItdG9wLXdpZHRoJzogdHJ1ZSxcbiAgICAnYm9yZGVyLWxlZnQtd2lkdGgnOiB0cnVlLFxuICAgICdib3JkZXItYm90dG9tLXdpZHRoJzogdHJ1ZSxcbiAgICAnYm9yZGVyLXJpZ2h0LXdpZHRoJzogdHJ1ZSxcbiAgICAnYm9yZGVyLWltYWdlLXdpZHRoJzogdHJ1ZSxcblxuICAgICdib3JkZXItcmFkaXVzJzogdHJ1ZSxcbiAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6IHRydWUsXG4gICAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJzogdHJ1ZSxcbiAgICAnYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyc6IHRydWUsXG4gICAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJzogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wcmVzc1BlcmNlbnRhZ2Uobm9kZSwgaXRlbSkge1xuICAgIHZhciB2YWx1ZSA9IHBhY2tOdW1iZXIobm9kZS52YWx1ZSwgaXRlbSk7XG4gICAgdmFyIHByb3BlcnR5ID0gdGhpcy5kZWNsYXJhdGlvbiAhPT0gbnVsbCA/IHRoaXMuZGVjbGFyYXRpb24ucHJvcGVydHkgOiBudWxsO1xuXG4gICAgbm9kZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHByb3BlcnR5ICE9PSBudWxsICYmIFBFUkNFTlRBR0VfTEVOR1RIX1BST1BFUlRZLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgICBpZiAodmFsdWUgPT09ICcwJykge1xuICAgICAgICAgICAgaXRlbS5kYXRhID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsInZhciBVTklDT0RFID0gJ1xcXFxcXFxcWzAtOWEtZl17MSw2fShcXFxcclxcXFxufFsgXFxcXG5cXFxcclxcXFx0XFxcXGZdKT8nO1xudmFyIEVTQ0FQRSA9ICcoJyArIFVOSUNPREUgKyAnfFxcXFxcXFxcW15cXFxcblxcXFxyXFxcXGYwLTlhLWZBLUZdKSc7XG52YXIgTk9OUFJJTlRBQkxFID0gJ1xcdTAwMDBcXHUwMDA4XFx1MDAwYlxcdTAwMGUtXFx1MDAxZlxcdTAwN2YnO1xudmFyIFNBRkVfVVJMID0gbmV3IFJlZ0V4cCgnXignICsgRVNDQVBFICsgJ3xbXlxcXCJcXCdcXFxcKFxcXFwpXFxcXFxcXFxcXFxccycgKyBOT05QUklOVEFCTEUgKyAnXSkqJCcsICdpJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XG5cbiAgICBpZiAodmFsdWUudHlwZSAhPT0gJ1N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBxdW90ZSA9IHZhbHVlLnZhbHVlWzBdO1xuICAgIHZhciB1cmwgPSB2YWx1ZS52YWx1ZS5zdWJzdHIoMSwgdmFsdWUudmFsdWUubGVuZ3RoIC0gMik7XG5cbiAgICAvLyBjb252ZXJ0IGBcXFxcYCB0byBgL2BcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgvXFxcXFxcXFwvZywgJy8nKTtcblxuICAgIC8vIHJlbW92ZSBxdW90ZXMgd2hlbiBzYWZlXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jdXJsLXVucXVvdGVkLWRpYWdyYW1cbiAgICBpZiAoU0FGRV9VUkwudGVzdCh1cmwpKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSB7XG4gICAgICAgICAgICB0eXBlOiAnUmF3JyxcbiAgICAgICAgICAgIGxvYzogbm9kZS52YWx1ZS5sb2MsXG4gICAgICAgICAgICB2YWx1ZTogdXJsXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGRvdWJsZSBxdW90ZXMgaWYgc3RyaW5nIGhhcyBubyBkb3VibGUgcXVvdGVzXG4gICAgICAgIC8vIG90aGVyd2lzZSB1c2Ugb3JpZ2luYWwgcXVvdGVzXG4gICAgICAgIC8vIFRPRE86IG1ha2UgYmV0dGVyIHF1b3RlIHR5cGUgc2VsZWN0aW9uXG4gICAgICAgIG5vZGUudmFsdWUudmFsdWUgPSB1cmwuaW5kZXhPZignXCInKSA9PT0gLTEgPyAnXCInICsgdXJsICsgJ1wiJyA6IHF1b3RlICsgdXJsICsgcXVvdGU7XG4gICAgfVxufTtcbiIsInZhciB3YWxrID0gcmVxdWlyZSgnY3NzLXRyZWUnKS53YWxrO1xudmFyIGhhbmRsZXJzID0ge1xuICAgIEF0cnVsZTogcmVxdWlyZSgnLi9BdHJ1bGUnKSxcbiAgICBBdHRyaWJ1dGVTZWxlY3RvcjogcmVxdWlyZSgnLi9BdHRyaWJ1dGVTZWxlY3RvcicpLFxuICAgIFZhbHVlOiByZXF1aXJlKCcuL1ZhbHVlJyksXG4gICAgRGltZW5zaW9uOiByZXF1aXJlKCcuL0RpbWVuc2lvbicpLFxuICAgIFBlcmNlbnRhZ2U6IHJlcXVpcmUoJy4vUGVyY2VudGFnZScpLFxuICAgIE51bWJlcjogcmVxdWlyZSgnLi9OdW1iZXInKSxcbiAgICBTdHJpbmc6IHJlcXVpcmUoJy4vU3RyaW5nJyksXG4gICAgVXJsOiByZXF1aXJlKCcuL1VybCcpLFxuICAgIEhleENvbG9yOiByZXF1aXJlKCcuL2NvbG9yJykuY29tcHJlc3NIZXgsXG4gICAgSWRlbnRpZmllcjogcmVxdWlyZSgnLi9jb2xvcicpLmNvbXByZXNzSWRlbnQsXG4gICAgRnVuY3Rpb246IHJlcXVpcmUoJy4vY29sb3InKS5jb21wcmVzc0Z1bmN0aW9uXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFzdCkge1xuICAgIHdhbGsoYXN0LCB7XG4gICAgICAgIGxlYXZlOiBmdW5jdGlvbihub2RlLCBpdGVtLCBsaXN0KSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW25vZGUudHlwZV0uY2FsbCh0aGlzLCBub2RlLCBpdGVtLCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XG5cbiAgICAvLyByZW1vdmUgZXNjYXBlZCBuZXdsaW5lcywgaS5lLlxuICAgIC8vIC5hIHsgY29udGVudDogXCJmb29cXFxuICAgIC8vIGJhclwifVxuICAgIC8vIC0+XG4gICAgLy8gLmEgeyBjb250ZW50OiBcImZvb2JhclwiIH1cbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFwoXFxyXFxufFxccnxcXG58XFxmKS9nLCAnJyk7XG5cbiAgICBub2RlLnZhbHVlID0gdmFsdWU7XG59O1xuIiwidmFyIGdlbmVyYXRlID0gcmVxdWlyZSgnY3NzLXRyZWUnKS5nZW5lcmF0ZTtcbnZhciBzcGVjaWZpY2l0eSA9IHJlcXVpcmUoJy4vc3BlY2lmaWNpdHknKTtcblxudmFyIG5vbkZyZWV6ZVBzZXVkb0VsZW1lbnRzID0ge1xuICAgICdmaXJzdC1sZXR0ZXInOiB0cnVlLFxuICAgICdmaXJzdC1saW5lJzogdHJ1ZSxcbiAgICAnYWZ0ZXInOiB0cnVlLFxuICAgICdiZWZvcmUnOiB0cnVlXG59O1xudmFyIG5vbkZyZWV6ZVBzZXVkb0NsYXNzZXMgPSB7XG4gICAgJ2xpbmsnOiB0cnVlLFxuICAgICd2aXNpdGVkJzogdHJ1ZSxcbiAgICAnaG92ZXInOiB0cnVlLFxuICAgICdhY3RpdmUnOiB0cnVlLFxuICAgICdmaXJzdC1sZXR0ZXInOiB0cnVlLFxuICAgICdmaXJzdC1saW5lJzogdHJ1ZSxcbiAgICAnYWZ0ZXInOiB0cnVlLFxuICAgICdiZWZvcmUnOiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyZWV6ZShub2RlLCB1c2FnZURhdGEpIHtcbiAgICB2YXIgcHNldWRvcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIGhhc1BzZXVkbyA9IGZhbHNlO1xuXG4gICAgbm9kZS5wcmVsdWRlLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oc2ltcGxlU2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIHRhZ05hbWUgPSAnKic7XG4gICAgICAgIHZhciBzY29wZSA9IDA7XG5cbiAgICAgICAgc2ltcGxlU2VsZWN0b3IuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0NsYXNzU2VsZWN0b3InOlxuICAgICAgICAgICAgICAgICAgICBpZiAodXNhZ2VEYXRhICYmIHVzYWdlRGF0YS5zY29wZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGFzc1Njb3BlID0gdXNhZ2VEYXRhLnNjb3Blc1tub2RlLm5hbWVdIHx8IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZSAhPT0gMCAmJiBjbGFzc1Njb3BlICE9PSBzY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0b3IgY2FuXFwndCBoYXMgY2xhc3NlcyBmcm9tIGRpZmZlcmVudCBzY29wZXM6ICcgKyBnZW5lcmF0ZShzaW1wbGVTZWxlY3RvcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZSA9IGNsYXNzU2NvcGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdQc2V1ZG9DbGFzc1NlbGVjdG9yJzpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBub2RlLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vbkZyZWV6ZVBzZXVkb0NsYXNzZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkb3NbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHNldWRvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ1BzZXVkb0VsZW1lbnRTZWxlY3Rvcic6XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gbm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub25GcmVlemVQc2V1ZG9FbGVtZW50cy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvc1tuYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG8gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnVHlwZVNlbGVjdG9yJzpcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZSA9IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0F0dHJpYnV0ZVNlbGVjdG9yJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZmxhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkb3NbJ1snICsgbm9kZS5mbGFncy50b0xvd2VyQ2FzZSgpICsgJ10nXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG8gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnV2hpdGVTcGFjZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnQ29tYmluYXRvcic6XG4gICAgICAgICAgICAgICAgICAgIHRhZ05hbWUgPSAnKic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBzaW1wbGVTZWxlY3Rvci5jb21wYXJlTWFya2VyID0gc3BlY2lmaWNpdHkoc2ltcGxlU2VsZWN0b3IpLnRvU3RyaW5nKCk7XG4gICAgICAgIHNpbXBsZVNlbGVjdG9yLmlkID0gbnVsbDsgLy8gcHJlLWluaXQgcHJvcGVydHkgdG8gYXZvaWQgbXVsdGlwbGUgaGlkZGVuIGNsYXNzXG4gICAgICAgIHNpbXBsZVNlbGVjdG9yLmlkID0gZ2VuZXJhdGUoc2ltcGxlU2VsZWN0b3IpO1xuXG4gICAgICAgIGlmIChzY29wZSkge1xuICAgICAgICAgICAgc2ltcGxlU2VsZWN0b3IuY29tcGFyZU1hcmtlciArPSAnOicgKyBzY29wZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWdOYW1lICE9PSAnKicpIHtcbiAgICAgICAgICAgIHNpbXBsZVNlbGVjdG9yLmNvbXBhcmVNYXJrZXIgKz0gJywnICsgdGFnTmFtZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHByb3BlcnR5IHRvIGFsbCBydWxlIG5vZGVzIHRvIGF2b2lkIG11bHRpcGxlIGhpZGRlbiBjbGFzc1xuICAgIG5vZGUucHNldWRvU2lnbmF0dXJlID0gaGFzUHNldWRvICYmIE9iamVjdC5rZXlzKHBzZXVkb3MpLnNvcnQoKS5qb2luKCcsJyk7XG59O1xuIiwidmFyIHJlc29sdmVLZXl3b3JkID0gcmVxdWlyZSgnY3NzLXRyZWUnKS5rZXl3b3JkO1xudmFyIHdhbGsgPSByZXF1aXJlKCdjc3MtdHJlZScpLndhbGs7XG52YXIgZ2VuZXJhdGUgPSByZXF1aXJlKCdjc3MtdHJlZScpLmdlbmVyYXRlO1xudmFyIGNyZWF0ZURlY2xhcmF0aW9uSW5kZXhlciA9IHJlcXVpcmUoJy4vY3JlYXRlRGVjbGFyYXRpb25JbmRleGVyJyk7XG52YXIgcHJvY2Vzc1NlbGVjdG9yID0gcmVxdWlyZSgnLi9wcm9jZXNzU2VsZWN0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwcmVwYXJlKGFzdCwgb3B0aW9ucykge1xuICAgIHZhciBtYXJrRGVjbGFyYXRpb24gPSBjcmVhdGVEZWNsYXJhdGlvbkluZGV4ZXIoKTtcblxuICAgIHdhbGsoYXN0LCB7XG4gICAgICAgIHZpc2l0OiAnUnVsZScsXG4gICAgICAgIGVudGVyOiBmdW5jdGlvbiBwcm9jZXNzUnVsZShub2RlKSB7XG4gICAgICAgICAgICBub2RlLmJsb2NrLmNoaWxkcmVuLmVhY2gobWFya0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIHByb2Nlc3NTZWxlY3Rvcihub2RlLCBvcHRpb25zLnVzYWdlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgd2Fsayhhc3QsIHtcbiAgICAgICAgdmlzaXQ6ICdBdHJ1bGUnLFxuICAgICAgICBlbnRlcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUucHJlbHVkZSkge1xuICAgICAgICAgICAgICAgIG5vZGUucHJlbHVkZS5pZCA9IG51bGw7IC8vIHByZS1pbml0IHByb3BlcnR5IHRvIGF2b2lkIG11bHRpcGxlIGhpZGRlbiBjbGFzcyBmb3IgZ2VuZXJhdGVcbiAgICAgICAgICAgICAgICBub2RlLnByZWx1ZGUuaWQgPSBnZW5lcmF0ZShub2RlLnByZWx1ZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb21wYXJlIGtleWZyYW1lIHNlbGVjdG9ycyBieSBpdHMgdmFsdWVzXG4gICAgICAgICAgICAvLyBOT1RFOiBzdGlsbCBubyBjbGFyaWZpY2F0aW9uIGFib3V0IHByb2JsZW1zIHdpdGgga2V5ZnJhbWVzIHNlbGVjdG9yIGdyb3VwaW5nIChpc3N1ZSAjMTk3KVxuICAgICAgICAgICAgaWYgKHJlc29sdmVLZXl3b3JkKG5vZGUubmFtZSkuYmFzZW5hbWUgPT09ICdrZXlmcmFtZXMnKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5ibG9jay5hdm9pZFJ1bGVzTWVyZ2UgPSB0cnVlOyAgLyogcHJvYmFibHkgd2UgZG9uJ3QgbmVlZCB0byBwcmV2ZW50IHRob3NlIG1lcmdlcyBmb3IgQGtleWZyYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPRE86IG5lZWQgdG8gYmUgY2hlY2tlZCAqL1xuICAgICAgICAgICAgICAgIG5vZGUuYmxvY2suY2hpbGRyZW4uZWFjaChmdW5jdGlvbihydWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUucHJlbHVkZS5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKHNpbXBsZXNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVzZWxlY3Rvci5jb21wYXJlTWFya2VyID0gc2ltcGxlc2VsZWN0b3IuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZWNsYXJhdGlvbjogbWFya0RlY2xhcmF0aW9uXG4gICAgfTtcbn07XG4iLCJ2YXIgcHJlcGFyZSA9IHJlcXVpcmUoJy4vcHJlcGFyZS9pbmRleCcpO1xudmFyIG1lcmdlQXRydWxlID0gcmVxdWlyZSgnLi8xLW1lcmdlQXRydWxlJyk7XG52YXIgaW5pdGlhbE1lcmdlUnVsZXNldCA9IHJlcXVpcmUoJy4vMi1pbml0aWFsTWVyZ2VSdWxlc2V0Jyk7XG52YXIgZGlzam9pblJ1bGVzZXQgPSByZXF1aXJlKCcuLzMtZGlzam9pblJ1bGVzZXQnKTtcbnZhciByZXN0cnVjdFNob3J0aGFuZCA9IHJlcXVpcmUoJy4vNC1yZXN0cnVjdFNob3J0aGFuZCcpO1xudmFyIHJlc3RydWN0QmxvY2sgPSByZXF1aXJlKCcuLzYtcmVzdHJ1Y3RCbG9jaycpO1xudmFyIG1lcmdlUnVsZXNldCA9IHJlcXVpcmUoJy4vNy1tZXJnZVJ1bGVzZXQnKTtcbnZhciByZXN0cnVjdFJ1bGVzZXQgPSByZXF1aXJlKCcuLzgtcmVzdHJ1Y3RSdWxlc2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYXN0LCBvcHRpb25zKSB7XG4gICAgLy8gcHJlcGFyZSBhc3QgZm9yIHJlc3RydWN0aW5nXG4gICAgdmFyIGluZGV4ZXIgPSBwcmVwYXJlKGFzdCwgb3B0aW9ucyk7XG4gICAgb3B0aW9ucy5sb2dnZXIoJ3ByZXBhcmUnLCBhc3QpO1xuXG4gICAgbWVyZ2VBdHJ1bGUoYXN0LCBvcHRpb25zKTtcbiAgICBvcHRpb25zLmxvZ2dlcignbWVyZ2VBdHJ1bGUnLCBhc3QpO1xuXG4gICAgaW5pdGlhbE1lcmdlUnVsZXNldChhc3QpO1xuICAgIG9wdGlvbnMubG9nZ2VyKCdpbml0aWFsTWVyZ2VSdWxlc2V0JywgYXN0KTtcblxuICAgIGRpc2pvaW5SdWxlc2V0KGFzdCk7XG4gICAgb3B0aW9ucy5sb2dnZXIoJ2Rpc2pvaW5SdWxlc2V0JywgYXN0KTtcblxuICAgIHJlc3RydWN0U2hvcnRoYW5kKGFzdCwgaW5kZXhlcik7XG4gICAgb3B0aW9ucy5sb2dnZXIoJ3Jlc3RydWN0U2hvcnRoYW5kJywgYXN0KTtcblxuICAgIHJlc3RydWN0QmxvY2soYXN0KTtcbiAgICBvcHRpb25zLmxvZ2dlcigncmVzdHJ1Y3RCbG9jaycsIGFzdCk7XG5cbiAgICBtZXJnZVJ1bGVzZXQoYXN0KTtcbiAgICBvcHRpb25zLmxvZ2dlcignbWVyZ2VSdWxlc2V0JywgYXN0KTtcblxuICAgIHJlc3RydWN0UnVsZXNldChhc3QpO1xuICAgIG9wdGlvbnMubG9nZ2VyKCdyZXN0cnVjdFJ1bGVzZXQnLCBhc3QpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFbmNvZGUgcGxhaW4gU1ZHIGRhdGEgc3RyaW5nIGludG8gRGF0YSBVUkkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgaW5wdXQgc3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBEYXRhIFVSSSB0eXBlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IG91dHB1dCBzdHJpbmdcbiAqL1xuZXhwb3J0cy5lbmNvZGVTVkdEYXRhdXJpID0gZnVuY3Rpb24oc3RyLCB0eXBlKSB7XG5cbiAgICB2YXIgcHJlZml4ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbCc7XG5cbiAgICAvLyBiYXNlNjRcbiAgICBpZiAoIXR5cGUgfHwgdHlwZSA9PT0gJ2Jhc2U2NCcpIHtcblxuICAgICAgICBwcmVmaXggKz0gJztiYXNlNjQsJztcblxuICAgICAgICBzdHIgPSBwcmVmaXggKyBuZXcgQnVmZmVyKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgLy8gVVJJIGVuY29kZWRcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlbmMnKSB7XG5cbiAgICAgICAgc3RyID0gcHJlZml4ICsgJywnICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cik7XG5cbiAgICAvLyB1bmVuY29kZWRcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1bmVuYycpIHtcblxuICAgICAgICBzdHIgPSBwcmVmaXggKyAnLCcgKyBzdHI7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuXG59O1xuXG4vKipcbiAqIERlY29kZSBTVkcgRGF0YSBVUkkgc3RyaW5nIGludG8gcGxhaW4gU1ZHIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIGlucHV0IHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSBvdXRwdXQgc3RyaW5nXG4gKi9cbmV4cG9ydHMuZGVjb2RlU1ZHRGF0YXVyaSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciByZWdleHAgPSAvZGF0YTppbWFnZVxcL3N2Z1xcK3htbCg7Y2hhcnNldD1bXjssXSopPyg7YmFzZTY0KT8sKC4qKS87XG4gICAgdmFyIG1hdGNoID0gcmVnZXhwLmV4ZWMoc3RyKTtcblxuICAgIC8vIHBsYWluIHN0cmluZ1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBzdHI7XG5cbiAgICB2YXIgZGF0YSA9IG1hdGNoWzNdO1xuXG4gICAgLy8gYmFzZTY0XG4gICAgaWYgKG1hdGNoWzJdKSB7XG5cbiAgICAgICAgc3RyID0gbmV3IEJ1ZmZlcihkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKTtcblxuICAgIC8vIFVSSSBlbmNvZGVkXG4gICAgfSBlbHNlIGlmIChkYXRhLmNoYXJBdCgwKSA9PT0gJyUnKSB7XG5cbiAgICAgICAgc3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGRhdGEpO1xuXG4gICAgLy8gdW5lbmNvZGVkXG4gICAgfSBlbHNlIGlmIChkYXRhLmNoYXJBdCgwKSA9PT0gJzwnKSB7XG5cbiAgICAgICAgc3RyID0gZGF0YTtcblxuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5leHBvcnRzLmludGVyc2VjdEFycmF5cyA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gYi5pbmRleE9mKG4pID4gLTE7XG4gICAgfSk7XG59O1xuXG5leHBvcnRzLmNsZWFudXBPdXREYXRhID0gZnVuY3Rpb24oZGF0YSwgcGFyYW1zKSB7XG5cbiAgICB2YXIgc3RyID0gJycsXG4gICAgICAgIGRlbGltaXRlcixcbiAgICAgICAgcHJldjtcblxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpKSB7XG5cbiAgICAgICAgLy8gc3BhY2UgZGVsaW1pdGVyIGJ5IGRlZmF1bHRcbiAgICAgICAgZGVsaW1pdGVyID0gJyAnO1xuXG4gICAgICAgIC8vIG5vIGV4dHJhIHNwYWNlIGluIGZyb250IG9mIGZpcnN0IG51bWJlclxuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBsZWFkaW5nIHplcm9zXG4gICAgICAgIC8vIDAuNSDihpIgLjVcbiAgICAgICAgLy8gLTAuNSDihpIgLS41XG4gICAgICAgIGlmIChwYXJhbXMubGVhZGluZ1plcm8pIHtcbiAgICAgICAgICAgIGl0ZW0gPSByZW1vdmVMZWFkaW5nWmVybyhpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGV4dHJhIHNwYWNlIGluIGZyb250IG9mIG5lZ2F0aXZlIG51bWJlciBvclxuICAgICAgICAvLyBpbiBmcm9udCBvZiBhIGZsb2F0aW5nIG51bWJlciBpZiBhIHByZXZpb3VzIG51bWJlciBpcyBmbG9hdGluZyB0b29cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1zLm5lZ2F0aXZlRXh0cmFTcGFjZSAmJlxuICAgICAgICAgICAgKGl0ZW0gPCAwIHx8XG4gICAgICAgICAgICAgICAgKFN0cmluZyhpdGVtKS5jaGFyQ29kZUF0KDApID09IDQ2ICYmIHByZXYgJSAxICE9PSAwKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRlbGltaXRlciA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2F2ZSBwcmV2IGl0ZW0gdmFsdWVcbiAgICAgICAgcHJldiA9IGl0ZW07XG5cbiAgICAgICAgc3RyICs9IGRlbGltaXRlciArIGl0ZW07XG5cbiAgICB9KTtcblxuICAgIHJldHVybiBzdHI7XG5cbn07XG5cbi8qKlxuICogUmVtb3ZlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgbGVhZGluZyB6ZXJvLlxuICpcbiAqIEBleGFtcGxlXG4gKiAwLjUg4oaSIC41XG4gKlxuICogQGV4YW1wbGVcbiAqIC0wLjUg4oaSIC0uNVxuICpcbiAqIEBwYXJhbSB7RmxvYXR9IG51bSBpbnB1dCBudW1iZXJcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IG91dHB1dCBudW1iZXIgYXMgc3RyaW5nXG4gKi9cbnZhciByZW1vdmVMZWFkaW5nWmVybyA9IGV4cG9ydHMucmVtb3ZlTGVhZGluZ1plcm8gPSBmdW5jdGlvbihudW0pIHtcbiAgICB2YXIgc3RyTnVtID0gbnVtLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoMCA8IG51bSAmJiBudW0gPCAxICYmIHN0ck51bS5jaGFyQ29kZUF0KDApID09IDQ4KSB7XG4gICAgICAgIHN0ck51bSA9IHN0ck51bS5zbGljZSgxKTtcbiAgICB9IGVsc2UgaWYgKC0xIDwgbnVtICYmIG51bSA8IDAgJiYgc3RyTnVtLmNoYXJDb2RlQXQoMSkgPT0gNDgpIHtcbiAgICAgICAgc3RyTnVtID0gc3RyTnVtLmNoYXJBdCgwKSArIHN0ck51bS5zbGljZSgyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyTnVtO1xuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyb3VuZHMgbnVtZXJpYyB2YWx1ZXMgdG8gdGhlIGZpeGVkIHByZWNpc2lvbiwgcmVtb3ZlcyBkZWZhdWx0IOKAmHB44oCZIHVuaXRzJztcblxuZXhwb3J0cy5wYXJhbXMgPSB7XG4gICAgZmxvYXRQcmVjaXNpb246IDMsXG4gICAgbGVhZGluZ1plcm86IHRydWUsXG4gICAgZGVmYXVsdFB4OiB0cnVlLFxuICAgIGNvbnZlcnRUb1B4OiB0cnVlXG59O1xuXG52YXIgcmVnTnVtZXJpY1ZhbHVlcyA9IC9eKFtcXC0rXT9cXGQqXFwuP1xcZCsoW2VFXVtcXC0rXT9cXGQrKT8pKHB4fHB0fHBjfG1tfGNtfG18aW58ZnR8ZW18ZXh8JSk/JC8sXG4gICAgcmVtb3ZlTGVhZGluZ1plcm8gPSByZXF1aXJlKCcuLi9saWIvc3Znby90b29scycpLnJlbW92ZUxlYWRpbmdaZXJvLFxuICAgIGFic29sdXRlTGVuZ3RocyA9IHsgLy8gcmVsYXRpdmUgdG8gcHhcbiAgICAgICAgY206IDk2LzIuNTQsXG4gICAgICAgIG1tOiA5Ni8yNS40LFxuICAgICAgICBpbjogOTYsXG4gICAgICAgIHB0OiA0LzMsXG4gICAgICAgIHBjOiAxNlxuICAgIH07XG5cbi8qKlxuICogUm91bmQgbnVtZXJpYyB2YWx1ZXMgdG8gdGhlIGZpeGVkIHByZWNpc2lvbixcbiAqIHJlbW92ZSBkZWZhdWx0ICdweCcgdW5pdHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtLCBwYXJhbXMpIHtcblxuICAgIGlmIChpdGVtLmlzRWxlbSgpKSB7XG5cbiAgICAgICAgdmFyIGZsb2F0UHJlY2lzaW9uID0gcGFyYW1zLmZsb2F0UHJlY2lzaW9uO1xuXG4gICAgICAgIGlmIChpdGVtLmhhc0F0dHIoJ3ZpZXdCb3gnKSkge1xuICAgICAgICAgICAgdmFyIG51bXMgPSBpdGVtLmF0dHIoJ3ZpZXdCb3gnKS52YWx1ZS5zcGxpdCgvWyAsXS9nKTtcbiAgICAgICAgICAgIGl0ZW0uYXR0cigndmlld0JveCcpLnZhbHVlID0gbnVtcy5tYXAoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbnVtID0gK3ZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc05hTihudW0pID8gdmFsdWUgOiArbnVtLnRvRml4ZWQoZmxvYXRQcmVjaXNpb24pO1xuICAgICAgICAgICAgfSkuam9pbignICcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5lYWNoQXR0cihmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2ggPSBhdHRyLnZhbHVlLm1hdGNoKHJlZ051bWVyaWNWYWx1ZXMpO1xuXG4gICAgICAgICAgICAvLyBpZiBhdHRyaWJ1dGUgdmFsdWUgbWF0Y2hlcyByZWdOdW1lcmljVmFsdWVzXG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAvLyByb3VuZCBpdCB0byB0aGUgZml4ZWQgcHJlY2lzaW9uXG4gICAgICAgICAgICAgICAgdmFyIG51bSA9ICsoK21hdGNoWzFdKS50b0ZpeGVkKGZsb2F0UHJlY2lzaW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSBtYXRjaFszXSB8fCAnJztcblxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgYWJzb2x1dGUgdmFsdWVzIHRvIHBpeGVsc1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuY29udmVydFRvUHggJiYgdW5pdHMgJiYgKHVuaXRzIGluIGFic29sdXRlTGVuZ3RocykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB4TnVtID0gKyhhYnNvbHV0ZUxlbmd0aHNbdW5pdHNdICogbWF0Y2hbMV0pLnRvRml4ZWQoZmxvYXRQcmVjaXNpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcocHhOdW0pLmxlbmd0aCA8IG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcHhOdW07XG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0cyA9ICdweCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGxlYWRpbmcgemVyb1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVhZGluZ1plcm8pIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtID0gcmVtb3ZlTGVhZGluZ1plcm8obnVtKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVmYXVsdCAncHgnIHVuaXRzXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5kZWZhdWx0UHggJiYgdW5pdHMgPT09ICdweCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSAnJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhdHRyLnZhbHVlID0gbnVtICsgdW5pdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gZmFsc2U7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAncm91bmRzIGxpc3Qgb2YgdmFsdWVzIHRvIHRoZSBmaXhlZCBwcmVjaXNpb24nO1xuXG5leHBvcnRzLnBhcmFtcyA9IHtcbiAgICBmbG9hdFByZWNpc2lvbjogMyxcbiAgICBsZWFkaW5nWmVybzogdHJ1ZSxcbiAgICBkZWZhdWx0UHg6IHRydWUsXG4gICAgY29udmVydFRvUHg6IHRydWVcbn07XG5cbnZhciByZWdOdW1lcmljVmFsdWVzID0gL14oW1xcLStdP1xcZCpcXC4/XFxkKyhbZUVdW1xcLStdP1xcZCspPykocHh8cHR8cGN8bW18Y218bXxpbnxmdHxlbXxleHwlKT8kLyxcbiAgICByZWdTZXBhcmF0b3IgPSAvXFxzKyw/XFxzKnwsXFxzKi8sXG4gICAgcmVtb3ZlTGVhZGluZ1plcm8gPSByZXF1aXJlKCcuLi9saWIvc3Znby90b29scycpLnJlbW92ZUxlYWRpbmdaZXJvLFxuICAgIGFic29sdXRlTGVuZ3RocyA9IHsgLy8gcmVsYXRpdmUgdG8gcHhcbiAgICAgICAgY206IDk2LzIuNTQsXG4gICAgICAgIG1tOiA5Ni8yNS40LFxuICAgICAgICBpbjogOTYsXG4gICAgICAgIHB0OiA0LzMsXG4gICAgICAgIHBjOiAxNlxuICAgIH07XG5cbi8qKlxuICogUm91bmQgbGlzdCBvZiB2YWx1ZXMgdG8gdGhlIGZpeGVkIHByZWNpc2lvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHN2ZyB2aWV3Qm94PVwiMCAwIDIwMC4yODQyMyAyMDAuMjg0MjNcIiBlbmFibGUtYmFja2dyb3VuZD1cIm5ldyAwIDAgMjAwLjI4NDIzIDIwMC4yODQyM1wiPlxuICogICAgICAgICDirIdcbiAqIDxzdmcgdmlld0JveD1cIjAgMCAyMDAuMjg0IDIwMC4yODRcIiBlbmFibGUtYmFja2dyb3VuZD1cIm5ldyAwIDAgMjAwLjI4NCAyMDAuMjg0XCI+XG4gKlxuICpcbiAqIDxwb2x5Z29uIHBvaW50cz1cIjIwOC4yNTA5NzcgNzcuMTMwODU5NCAyMjMuMDY5MzM2IC4uLiBcIi8+XG4gKiAgICAgICAgIOKsh1xuICogPHBvbHlnb24gcG9pbnRzPVwiMjA4LjI1MSA3Ny4xMzEgMjIzLjA2OSAuLi4gXCIvPlxuICpcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHBsdWdpbiBwYXJhbXNcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBraXlvcGlra29cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0sIHBhcmFtcykge1xuXG5cbiAgICBpZiAoIGl0ZW0uaGFzQXR0cigncG9pbnRzJykgKSB7XG4gICAgICAgIHJvdW5kVmFsdWVzKGl0ZW0uYXR0cnMucG9pbnRzKTtcbiAgICB9XG5cbiAgICBpZiAoIGl0ZW0uaGFzQXR0cignZW5hYmxlLWJhY2tncm91bmQnKSApIHtcbiAgICAgICAgcm91bmRWYWx1ZXMoaXRlbS5hdHRyc1snZW5hYmxlLWJhY2tncm91bmQnXSk7XG4gICAgfVxuXG4gICAgaWYgKCBpdGVtLmhhc0F0dHIoJ3ZpZXdCb3gnKSApIHtcbiAgICAgICAgcm91bmRWYWx1ZXMoaXRlbS5hdHRycy52aWV3Qm94KTtcbiAgICB9XG5cbiAgICBpZiAoIGl0ZW0uaGFzQXR0cignc3Ryb2tlLWRhc2hhcnJheScpICkge1xuICAgICAgICByb3VuZFZhbHVlcyhpdGVtLmF0dHJzWydzdHJva2UtZGFzaGFycmF5J10pO1xuICAgIH1cblxuICAgIGlmICggaXRlbS5oYXNBdHRyKCdkeCcpICkge1xuICAgICAgICByb3VuZFZhbHVlcyhpdGVtLmF0dHJzLmR4KTtcbiAgICB9XG5cbiAgICBpZiAoIGl0ZW0uaGFzQXR0cignZHknKSApIHtcbiAgICAgICAgcm91bmRWYWx1ZXMoaXRlbS5hdHRycy5keSk7XG4gICAgfVxuXG4gICAgaWYgKCBpdGVtLmhhc0F0dHIoJ3gnKSApIHtcbiAgICAgICAgcm91bmRWYWx1ZXMoaXRlbS5hdHRycy54KTtcbiAgICB9XG5cbiAgICBpZiAoIGl0ZW0uaGFzQXR0cigneScpICkge1xuICAgICAgICByb3VuZFZhbHVlcyhpdGVtLmF0dHJzLnkpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gcm91bmRWYWx1ZXMoJHByb3Ape1xuXG4gICAgICAgIHZhciBudW0sIHVuaXRzLFxuICAgICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgICBtYXRjaE5ldyxcbiAgICAgICAgICAgIGxpc3RzID0gJHByb3AudmFsdWUsXG4gICAgICAgICAgICBsaXN0c0FyciA9IGxpc3RzLnNwbGl0KHJlZ1NlcGFyYXRvciksXG4gICAgICAgICAgICByb3VuZGVkTGlzdEFyciA9IFtdLFxuICAgICAgICAgICAgcm91bmRlZExpc3Q7XG5cbiAgICAgICAgbGlzdHNBcnIuZm9yRWFjaChmdW5jdGlvbihlbGVtKXtcblxuICAgICAgICAgICAgbWF0Y2ggPSBlbGVtLm1hdGNoKHJlZ051bWVyaWNWYWx1ZXMpO1xuICAgICAgICAgICAgbWF0Y2hOZXcgPSBlbGVtLm1hdGNoKC9uZXcvKTtcblxuICAgICAgICAgICAgIC8vIGlmIGF0dHJpYnV0ZSB2YWx1ZSBtYXRjaGVzIHJlZ051bWVyaWNWYWx1ZXNcbiAgICAgICAgICAgIGlmKG1hdGNoKXtcblxuICAgICAgICAgICAgICAgIC8vIHJvdW5kIGl0IHRvIHRoZSBmaXhlZCBwcmVjaXNpb25cbiAgICAgICAgICAgICAgICBudW0gPSArKCttYXRjaFsxXSkudG9GaXhlZChwYXJhbXMuZmxvYXRQcmVjaXNpb24pLFxuICAgICAgICAgICAgICAgIHVuaXRzID0gbWF0Y2hbM10gfHwgJyc7XG5cbiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGFic29sdXRlIHZhbHVlcyB0byBwaXhlbHNcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmNvbnZlcnRUb1B4ICYmIHVuaXRzICYmICh1bml0cyBpbiBhYnNvbHV0ZUxlbmd0aHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBweE51bSA9ICsoYWJzb2x1dGVMZW5ndGhzW3VuaXRzXSAqIG1hdGNoWzFdKS50b0ZpeGVkKHBhcmFtcy5mbG9hdFByZWNpc2lvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZyhweE51bSkubGVuZ3RoIDwgbWF0Y2hbMF0ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcHhOdW0sXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0cyA9ICdweCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgbGVhZGluZyB6ZXJvXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZWFkaW5nWmVybykge1xuICAgICAgICAgICAgICAgICAgICBudW0gPSByZW1vdmVMZWFkaW5nWmVybyhudW0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBkZWZhdWx0ICdweCcgdW5pdHNcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmRlZmF1bHRQeCAmJiB1bml0cyA9PT0gJ3B4Jykge1xuICAgICAgICAgICAgICAgICAgICB1bml0cyA9ICcnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdW5kZWRMaXN0QXJyLnB1c2gobnVtK3VuaXRzKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgYXR0cmlidXRlIHZhbHVlIGlzIFwibmV3XCIob25seSBlbmFibGUtYmFja2dyb3VuZCkuXG4gICAgICAgICAgICBlbHNlIGlmKG1hdGNoTmV3KXtcblxuICAgICAgICAgICAgICAgIHJvdW5kZWRMaXN0QXJyLnB1c2goJ25ldycpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91bmRlZExpc3QgPSByb3VuZGVkTGlzdEFyci5qb2luKCcgJyk7XG4gICAgICAgICRwcm9wLnZhbHVlID0gcm91bmRlZExpc3Q7XG5cbiAgICB9XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgdW5rbm93biBlbGVtZW50cyBjb250ZW50IGFuZCBhdHRyaWJ1dGVzLCByZW1vdmVzIGF0dHJzIHdpdGggZGVmYXVsdCB2YWx1ZXMnO1xuXG5leHBvcnRzLnBhcmFtcyA9IHtcbiAgICB1bmtub3duQ29udGVudDogdHJ1ZSxcbiAgICB1bmtub3duQXR0cnM6IHRydWUsXG4gICAgZGVmYXVsdEF0dHJzOiB0cnVlLFxuICAgIHVzZWxlc3NPdmVycmlkZXM6IHRydWUsXG4gICAga2VlcERhdGFBdHRyczogdHJ1ZSxcbiAgICBrZWVwQXJpYUF0dHJzOiB0cnVlXG59O1xuXG52YXIgY29sbGVjdGlvbnMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9ucycpLFxuICAgIGVsZW1zID0gY29sbGVjdGlvbnMuZWxlbXMsXG4gICAgYXR0cnNHcm91cHMgPSBjb2xsZWN0aW9ucy5hdHRyc0dyb3VwcyxcbiAgICBlbGVtc0dyb3VwcyA9IGNvbGxlY3Rpb25zLmVsZW1zR3JvdXBzLFxuICAgIGF0dHJzR3JvdXBzRGVmYXVsdHMgPSBjb2xsZWN0aW9ucy5hdHRyc0dyb3Vwc0RlZmF1bHRzLFxuICAgIGF0dHJzSW5oZXJpdGFibGUgPSBjb2xsZWN0aW9ucy5pbmhlcml0YWJsZUF0dHJzO1xuXG4vLyBjb2xsZWN0IGFuZCBleHRlbmQgYWxsIHJlZmVyZW5jZXNcbmZvciAodmFyIGVsZW0gaW4gZWxlbXMpIHtcbiAgICBlbGVtID0gZWxlbXNbZWxlbV07XG5cbiAgICBpZiAoZWxlbS5hdHRyc0dyb3Vwcykge1xuICAgICAgICBlbGVtLmF0dHJzID0gZWxlbS5hdHRycyB8fCBbXTtcblxuICAgICAgICBlbGVtLmF0dHJzR3JvdXBzLmZvckVhY2goZnVuY3Rpb24oYXR0cnNHcm91cE5hbWUpIHtcbiAgICAgICAgICAgIGVsZW0uYXR0cnMgPSBlbGVtLmF0dHJzLmNvbmNhdChhdHRyc0dyb3Vwc1thdHRyc0dyb3VwTmFtZV0pO1xuXG4gICAgICAgICAgICB2YXIgZ3JvdXBEZWZhdWx0cyA9IGF0dHJzR3JvdXBzRGVmYXVsdHNbYXR0cnNHcm91cE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXBEZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIGVsZW0uZGVmYXVsdHMgPSBlbGVtLmRlZmF1bHRzIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYXR0ck5hbWUgaW4gZ3JvdXBEZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmRlZmF1bHRzW2F0dHJOYW1lXSA9IGdyb3VwRGVmYXVsdHNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBpZiAoZWxlbS5jb250ZW50R3JvdXBzKSB7XG4gICAgICAgIGVsZW0uY29udGVudCA9IGVsZW0uY29udGVudCB8fCBbXTtcblxuICAgICAgICBlbGVtLmNvbnRlbnRHcm91cHMuZm9yRWFjaChmdW5jdGlvbihjb250ZW50R3JvdXBOYW1lKSB7XG4gICAgICAgICAgICBlbGVtLmNvbnRlbnQgPSBlbGVtLmNvbnRlbnQuY29uY2F0KGVsZW1zR3JvdXBzW2NvbnRlbnRHcm91cE5hbWVdKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSB1bmtub3duIGVsZW1lbnRzIGNvbnRlbnQgYW5kIGF0dHJpYnV0ZXMsXG4gKiByZW1vdmUgYXR0cmlidXRlcyB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEtpciBCZWxldmljaFxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSwgcGFyYW1zKSB7XG5cbiAgICAvLyBlbGVtcyB3L28gbmFtZXNwYWNlIHByZWZpeFxuICAgIGlmIChpdGVtLmlzRWxlbSgpICYmICFpdGVtLnByZWZpeCkge1xuXG4gICAgICAgIHZhciBlbGVtID0gaXRlbS5lbGVtO1xuXG4gICAgICAgIC8vIHJlbW92ZSB1bmtub3duIGVsZW1lbnQncyBjb250ZW50XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy51bmtub3duQ29udGVudCAmJlxuICAgICAgICAgICAgIWl0ZW0uaXNFbXB0eSgpICYmXG4gICAgICAgICAgICBlbGVtc1tlbGVtXSAmJiAvLyBtYWtlIHN1cmUgd2Uga25vdyBvZiB0aGlzIGVsZW1lbnQgYmVmb3JlIGNoZWNraW5nIGl0cyBjaGlsZHJlblxuICAgICAgICAgICAgZWxlbSAhPT0gJ2ZvcmVpZ25PYmplY3QnIC8vIERvbid0IGNoZWNrIGZvcmVpZ25PYmplY3RcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpdGVtLmNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbihjb250ZW50LCBpKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LmlzRWxlbSgpICYmXG4gICAgICAgICAgICAgICAgICAgICFjb250ZW50LnByZWZpeCAmJlxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbXNbZWxlbV0uY29udGVudCAmJiAvLyBEbyB3ZSBoYXZlIGEgcmVjb3JkIG9mIGl0cyBwZXJtaXR0ZWQgY29udGVudD9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtc1tlbGVtXS5jb250ZW50LmluZGV4T2YoY29udGVudC5lbGVtKSA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZWxlbXNbZWxlbV0uY29udGVudCAmJiAvLyB3ZSBkb250IGtub3cgYWJvdXQgaXRzIHBlcm1pdHRlZCBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWVsZW1zW2NvbnRlbnQuZWxlbV0gLy8gY2hlY2sgdGhhdCB3ZSBrbm93IGFib3V0IHRoZSBlbGVtZW50IGF0IGFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY29udGVudC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgZWxlbWVudCdzIHVua25vd24gYXR0cnMgYW5kIGF0dHJzIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgaWYgKGVsZW1zW2VsZW1dICYmIGVsZW1zW2VsZW1dLmF0dHJzKSB7XG5cbiAgICAgICAgICAgIGl0ZW0uZWFjaEF0dHIoZnVuY3Rpb24oYXR0cikge1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBhdHRyLm5hbWUgIT09ICd4bWxucycgJiZcbiAgICAgICAgICAgICAgICAgICAgKGF0dHIucHJlZml4ID09PSAneG1sJyB8fCAhYXR0ci5wcmVmaXgpICYmXG4gICAgICAgICAgICAgICAgICAgICghcGFyYW1zLmtlZXBEYXRhQXR0cnMgfHwgYXR0ci5uYW1lLmluZGV4T2YoJ2RhdGEtJykgIT0gMCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFwYXJhbXMua2VlcEFyaWFBdHRycyB8fCBhdHRyLm5hbWUuaW5kZXhPZignYXJpYS0nKSAhPSAwKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmtub3duIGF0dHJzXG4gICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnVua25vd25BdHRycyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1zW2VsZW1dLmF0dHJzLmluZGV4T2YoYXR0ci5uYW1lKSA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJzIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZGVmYXVsdEF0dHJzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbXNbZWxlbV0uZGVmYXVsdHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtc1tlbGVtXS5kZWZhdWx0c1thdHRyLm5hbWVdID09PSBhdHRyLnZhbHVlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNJbmhlcml0YWJsZS5pbmRleE9mKGF0dHIubmFtZSkgPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtLnBhcmVudE5vZGUuY29tcHV0ZWRBdHRyKGF0dHIubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VsZXNzIG92ZXJyaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy51c2VsZXNzT3ZlcnJpZGVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5uYW1lICE9PSAndHJhbnNmb3JtJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzSW5oZXJpdGFibGUuaW5kZXhPZihhdHRyLm5hbWUpID4gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudE5vZGUuY29tcHV0ZWRBdHRyKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUF0dHIoYXR0ci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIG5vbi1pbmhlcml0YWJsZSBncm91cOKAmXMgcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcyc7XG5cbnZhciBpbmhlcml0YWJsZUF0dHJzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbnMnKS5pbmhlcml0YWJsZUF0dHJzLFxuICAgIGF0dHJzR3JvdXBzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbnMnKS5hdHRyc0dyb3VwcyxcbiAgICBleGNsdWRlZEF0dHJzID0gWydkaXNwbGF5JywgJ29wYWNpdHknXTtcblxuLyoqXG4gKiBSZW1vdmUgbm9uLWluaGVyaXRhYmxlIGdyb3VwJ3MgXCJwcmVzZW50YXRpb25cIiBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIGlmIChpdGVtLmlzRWxlbSgnZycpKSB7XG5cbiAgICAgICAgaXRlbS5lYWNoQXR0cihmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgfmF0dHJzR3JvdXBzLnByZXNlbnRhdGlvbi5pbmRleE9mKGF0dHIubmFtZSkgJiZcbiAgICAgICAgICAgICAgICB+YXR0cnNHcm91cHMuZ3JhcGhpY2FsRXZlbnQuaW5kZXhPZihhdHRyLm5hbWUpICYmXG4gICAgICAgICAgICAgICAgfmF0dHJzR3JvdXBzLmNvcmUuaW5kZXhPZihhdHRyLm5hbWUpICYmXG4gICAgICAgICAgICAgICAgfmF0dHJzR3JvdXBzLmNvbmRpdGlvbmFsUHJvY2Vzc2luZy5pbmRleE9mKGF0dHIubmFtZSkgJiZcbiAgICAgICAgICAgICAgICAhfmV4Y2x1ZGVkQXR0cnMuaW5kZXhPZihhdHRyLm5hbWUpICYmXG4gICAgICAgICAgICAgICAgIX5pbmhlcml0YWJsZUF0dHJzLmluZGV4T2YoYXR0ci5uYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyKGF0dHIubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIHVzZWxlc3Mgc3Ryb2tlIGFuZCBmaWxsIGF0dHJpYnV0ZXMnO1xuXG5leHBvcnRzLnBhcmFtcyA9IHtcbiAgICBzdHJva2U6IHRydWUsXG4gICAgZmlsbDogdHJ1ZSxcbiAgICByZW1vdmVOb25lOiBmYWxzZSxcbiAgICBoYXNTdHlsZU9yU2NyaXB0OiBmYWxzZVxufTtcblxudmFyIHNoYXBlID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbnMnKS5lbGVtc0dyb3Vwcy5zaGFwZSxcbiAgICByZWdTdHJva2VQcm9wcyA9IC9ec3Ryb2tlLyxcbiAgICByZWdGaWxsUHJvcHMgPSAvXmZpbGwtLyxcbiAgICBzdHlsZU9yU2NyaXB0ID0gWydzdHlsZScsICdzY3JpcHQnXTtcblxuLyoqXG4gKiBSZW1vdmUgdXNlbGVzcyBzdHJva2UgYW5kIGZpbGwgYXR0cnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtLCBwYXJhbXMpIHtcbiAgICBcbiAgICBpZiAoaXRlbS5pc0VsZW0oc3R5bGVPclNjcmlwdCkpIHtcbiAgICAgICAgcGFyYW1zLmhhc1N0eWxlT3JTY3JpcHQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmhhc1N0eWxlT3JTY3JpcHQgJiYgaXRlbS5pc0VsZW0oc2hhcGUpICYmICFpdGVtLmNvbXB1dGVkQXR0cignaWQnKSkge1xuXG4gICAgICAgIHZhciBzdHJva2UgPSBwYXJhbXMuc3Ryb2tlICYmIGl0ZW0uY29tcHV0ZWRBdHRyKCdzdHJva2UnKSxcbiAgICAgICAgICAgIGZpbGwgPSBwYXJhbXMuZmlsbCAmJiAhaXRlbS5jb21wdXRlZEF0dHIoJ2ZpbGwnLCAnbm9uZScpO1xuXG4gICAgICAgIC8vIHJlbW92ZSBzdHJva2UqXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5zdHJva2UgJiZcbiAgICAgICAgICAgICghc3Ryb2tlIHx8XG4gICAgICAgICAgICAgICAgc3Ryb2tlID09ICdub25lJyB8fFxuICAgICAgICAgICAgICAgIGl0ZW0uY29tcHV0ZWRBdHRyKCdzdHJva2Utb3BhY2l0eScsICcwJykgfHxcbiAgICAgICAgICAgICAgICBpdGVtLmNvbXB1dGVkQXR0cignc3Ryb2tlLXdpZHRoJywgJzAnKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRTdHJva2UgPSBpdGVtLnBhcmVudE5vZGUuY29tcHV0ZWRBdHRyKCdzdHJva2UnKSxcbiAgICAgICAgICAgICAgICBkZWNsaW5lU3Ryb2tlID0gcGFyZW50U3Ryb2tlICYmIHBhcmVudFN0cm9rZSAhPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGl0ZW0uZWFjaEF0dHIoZnVuY3Rpb24oYXR0cikge1xuICAgICAgICAgICAgICAgIGlmIChyZWdTdHJva2VQcm9wcy50ZXN0KGF0dHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyKGF0dHIubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkZWNsaW5lU3Ryb2tlKSBpdGVtLmFkZEF0dHIoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdzdHJva2UnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgICAgICAgICBsb2NhbDogJ3N0cm9rZSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGZpbGwqXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5maWxsICYmXG4gICAgICAgICAgICAoIWZpbGwgfHwgaXRlbS5jb21wdXRlZEF0dHIoJ2ZpbGwtb3BhY2l0eScsICcwJykpXG4gICAgICAgICkge1xuICAgICAgICAgICAgaXRlbS5lYWNoQXR0cihmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlZ0ZpbGxQcm9wcy50ZXN0KGF0dHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyKGF0dHIubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaGFzQXR0cignZmlsbCcpKVxuICAgICAgICAgICAgICAgICAgICBpdGVtLmF0dHIoJ2ZpbGwnKS52YWx1ZSA9ICdub25lJztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkQXR0cih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZmlsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsOiAnZmlsbCdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyYW1zLnJlbW92ZU5vbmUgJiYgXG4gICAgICAgICAgICAoIXN0cm9rZSB8fCBpdGVtLmhhc0F0dHIoJ3N0cm9rZScpICYmIGl0ZW0uYXR0cignc3Ryb2tlJykudmFsdWU9PSdub25lJykgJiZcbiAgICAgICAgICAgICghZmlsbCB8fCBpdGVtLmhhc0F0dHIoJ2ZpbGwnKSAmJiBpdGVtLmF0dHIoJ2ZpbGwnKS52YWx1ZT09J25vbmUnKSkge1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAncmVtb3ZlcyB2aWV3Qm94IGF0dHJpYnV0ZSB3aGVuIHBvc3NpYmxlJztcblxudmFyIHZpZXdCb3hFbGVtcyA9IFsnc3ZnJywgJ3BhdHRlcm4nLCAnc3ltYm9sJ107XG5cbi8qKlxuICogUmVtb3ZlIHZpZXdCb3ggYXR0ciB3aGljaCBjb2luY2lkZXMgd2l0aCBhIHdpZHRoL2hlaWdodCBib3guXG4gKlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvY29vcmRzLmh0bWwjVmlld0JveEF0dHJpYnV0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8c3ZnIHdpZHRoPVwiMTAwXCIgaGVpZ2h0PVwiNTBcIiB2aWV3Qm94PVwiMCAwIDEwMCA1MFwiPlxuICogICAgICAgICAgICAg4qyHXG4gKiA8c3ZnIHdpZHRoPVwiMTAwXCIgaGVpZ2h0PVwiNTBcIj5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICBpZiAoXG4gICAgICAgIGl0ZW0uaXNFbGVtKHZpZXdCb3hFbGVtcykgJiZcbiAgICAgICAgaXRlbS5oYXNBdHRyKCd2aWV3Qm94JykgJiZcbiAgICAgICAgaXRlbS5oYXNBdHRyKCd3aWR0aCcpICYmXG4gICAgICAgIGl0ZW0uaGFzQXR0cignaGVpZ2h0JylcbiAgICApIHtcblxuICAgICAgICB2YXIgbnVtcyA9IGl0ZW0uYXR0cigndmlld0JveCcpLnZhbHVlLnNwbGl0KC9bICxdKy9nKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBudW1zWzBdID09PSAnMCcgJiZcbiAgICAgICAgICAgIG51bXNbMV0gPT09ICcwJyAmJlxuICAgICAgICAgICAgaXRlbS5hdHRyKCd3aWR0aCcpLnZhbHVlLnJlcGxhY2UoL3B4JC8sICcnKSA9PT0gbnVtc1syXSAmJiAvLyBjb3VsZCB1c2UgcGFyc2VGbG9hdCB0b29cbiAgICAgICAgICAgIGl0ZW0uYXR0cignaGVpZ2h0JykudmFsdWUucmVwbGFjZSgvcHgkLywgJycpID09PSBudW1zWzNdXG4gICAgICAgICkge1xuICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyKCd2aWV3Qm94Jyk7XG4gICAgICAgIH1cblxuICAgIH1cblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAncmVtb3ZlcyBoaWRkZW4gZWxlbWVudHMgKHplcm8gc2l6ZWQsIHdpdGggYWJzZW50IGF0dHJpYnV0ZXMpJztcblxuZXhwb3J0cy5wYXJhbXMgPSB7XG4gICAgZGlzcGxheU5vbmU6IHRydWUsXG4gICAgb3BhY2l0eTA6IHRydWUsXG4gICAgY2lyY2xlUjA6IHRydWUsXG4gICAgZWxsaXBzZVJYMDogdHJ1ZSxcbiAgICBlbGxpcHNlUlkwOiB0cnVlLFxuICAgIHJlY3RXaWR0aDA6IHRydWUsXG4gICAgcmVjdEhlaWdodDA6IHRydWUsXG4gICAgcGF0dGVybldpZHRoMDogdHJ1ZSxcbiAgICBwYXR0ZXJuSGVpZ2h0MDogdHJ1ZSxcbiAgICBpbWFnZVdpZHRoMDogdHJ1ZSxcbiAgICBpbWFnZUhlaWdodDA6IHRydWUsXG4gICAgcGF0aEVtcHR5RDogdHJ1ZSxcbiAgICBwb2x5bGluZUVtcHR5UG9pbnRzOiB0cnVlLFxuICAgIHBvbHlnb25FbXB0eVBvaW50czogdHJ1ZVxufTtcblxudmFyIHJlZ1ZhbGlkUGF0aCA9IC9NXFxzKig/OlstK10/KD86XFxkKlxcLlxcZCt8XFxkKyg/OlxcLnwoPyFcXC4pKSkoW2VFXVstK10/XFxkKyk/KD8hXFxkKVxccyosP1xccyopezJ9XFxEKlxcZC9pO1xuXG4vKipcbiAqIFJlbW92ZSBoaWRkZW4gZWxlbWVudHMgd2l0aCBkaXNhYmxlZCByZW5kZXJpbmc6XG4gKiAtIGRpc3BsYXk9XCJub25lXCJcbiAqIC0gb3BhY2l0eT1cIjBcIlxuICogLSBjaXJjbGUgd2l0aCB6ZXJvIHJhZGl1c1xuICogLSBlbGxpcHNlIHdpdGggemVybyB4LWF4aXMgb3IgeS1heGlzIHJhZGl1c1xuICogLSByZWN0YW5nbGUgd2l0aCB6ZXJvIHdpZHRoIG9yIGhlaWdodFxuICogLSBwYXR0ZXJuIHdpdGggemVybyB3aWR0aCBvciBoZWlnaHRcbiAqIC0gaW1hZ2Ugd2l0aCB6ZXJvIHdpZHRoIG9yIGhlaWdodFxuICogLSBwYXRoIHdpdGggZW1wdHkgZGF0YVxuICogLSBwb2x5bGluZSB3aXRoIGVtcHR5IHBvaW50c1xuICogLSBwb2x5Z29uIHdpdGggZW1wdHkgcG9pbnRzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBwbHVnaW4gcGFyYW1zXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtLCBwYXJhbXMpIHtcblxuICAgIGlmIChpdGVtLmVsZW0pIHtcblxuICAgICAgICAvLyBkaXNwbGF5PVwibm9uZVwiXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9wYWludGluZy5odG1sI0Rpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAvLyBcIkEgdmFsdWUgb2YgZGlzcGxheTogbm9uZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAvLyBhbmQgaXRzIGNoaWxkcmVuIHNoYWxsIG5vdCBiZSByZW5kZXJlZCBkaXJlY3RseVwiXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5kaXNwbGF5Tm9uZSAmJlxuICAgICAgICAgICAgaXRlbS5oYXNBdHRyKCdkaXNwbGF5JywgJ25vbmUnKVxuICAgICAgICApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBvcGFjaXR5PVwiMFwiXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9tYXNraW5nLmh0bWwjT2JqZWN0QW5kR3JvdXBPcGFjaXR5UHJvcGVydGllc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMub3BhY2l0eTAgJiZcbiAgICAgICAgICAgIGl0ZW0uaGFzQXR0cignb3BhY2l0eScsICcwJylcbiAgICAgICAgKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2lyY2xlcyB3aXRoIHplcm8gcmFkaXVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zaGFwZXMuaHRtbCNDaXJjbGVFbGVtZW50UkF0dHJpYnV0ZVxuICAgICAgICAvLyBcIkEgdmFsdWUgb2YgemVybyBkaXNhYmxlcyByZW5kZXJpbmcgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICAvL1xuICAgICAgICAvLyA8Y2lyY2xlIHI9XCIwXCI+XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5jaXJjbGVSMCAmJlxuICAgICAgICAgICAgaXRlbS5pc0VsZW0oJ2NpcmNsZScpICYmXG4gICAgICAgICAgICBpdGVtLmlzRW1wdHkoKSAmJlxuICAgICAgICAgICAgaXRlbS5oYXNBdHRyKCdyJywgJzAnKVxuICAgICAgICApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBFbGxpcHNlIHdpdGggemVybyB4LWF4aXMgcmFkaXVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zaGFwZXMuaHRtbCNFbGxpcHNlRWxlbWVudFJYQXR0cmlidXRlXG4gICAgICAgIC8vIFwiQSB2YWx1ZSBvZiB6ZXJvIGRpc2FibGVzIHJlbmRlcmluZyBvZiB0aGUgZWxlbWVudFwiXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDxlbGxpcHNlIHJ4PVwiMFwiPlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMuZWxsaXBzZVJYMCAmJlxuICAgICAgICAgICAgaXRlbS5pc0VsZW0oJ2VsbGlwc2UnKSAmJlxuICAgICAgICAgICAgaXRlbS5pc0VtcHR5KCkgJiZcbiAgICAgICAgICAgIGl0ZW0uaGFzQXR0cigncngnLCAnMCcpXG4gICAgICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIEVsbGlwc2Ugd2l0aCB6ZXJvIHktYXhpcyByYWRpdXNcbiAgICAgICAgLy9cbiAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL3NoYXBlcy5odG1sI0VsbGlwc2VFbGVtZW50UllBdHRyaWJ1dGVcbiAgICAgICAgLy8gXCJBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgcmVuZGVyaW5nIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gPGVsbGlwc2Ugcnk9XCIwXCI+XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5lbGxpcHNlUlkwICYmXG4gICAgICAgICAgICBpdGVtLmlzRWxlbSgnZWxsaXBzZScpICYmXG4gICAgICAgICAgICBpdGVtLmlzRW1wdHkoKSAmJlxuICAgICAgICAgICAgaXRlbS5oYXNBdHRyKCdyeScsICcwJylcbiAgICAgICAgKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVjdGFuZ2xlIHdpdGggemVybyB3aWR0aFxuICAgICAgICAvL1xuICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvc2hhcGVzLmh0bWwjUmVjdEVsZW1lbnRXaWR0aEF0dHJpYnV0ZVxuICAgICAgICAvLyBcIkEgdmFsdWUgb2YgemVybyBkaXNhYmxlcyByZW5kZXJpbmcgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICAvL1xuICAgICAgICAvLyA8cmVjdCB3aWR0aD1cIjBcIj5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1zLnJlY3RXaWR0aDAgJiZcbiAgICAgICAgICAgIGl0ZW0uaXNFbGVtKCdyZWN0JykgJiZcbiAgICAgICAgICAgIGl0ZW0uaXNFbXB0eSgpICYmXG4gICAgICAgICAgICBpdGVtLmhhc0F0dHIoJ3dpZHRoJywgJzAnKVxuICAgICAgICApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBSZWN0YW5nbGUgd2l0aCB6ZXJvIGhlaWdodFxuICAgICAgICAvL1xuICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvc2hhcGVzLmh0bWwjUmVjdEVsZW1lbnRIZWlnaHRBdHRyaWJ1dGVcbiAgICAgICAgLy8gXCJBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgcmVuZGVyaW5nIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gPHJlY3QgaGVpZ2h0PVwiMFwiPlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMucmVjdEhlaWdodDAgJiZcbiAgICAgICAgICAgIHBhcmFtcy5yZWN0V2lkdGgwICYmXG4gICAgICAgICAgICBpdGVtLmlzRWxlbSgncmVjdCcpICYmXG4gICAgICAgICAgICBpdGVtLmlzRW1wdHkoKSAmJlxuICAgICAgICAgICAgaXRlbS5oYXNBdHRyKCdoZWlnaHQnLCAnMCcpXG4gICAgICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFBhdHRlcm4gd2l0aCB6ZXJvIHdpZHRoXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9wc2VydmVycy5odG1sI1BhdHRlcm5FbGVtZW50V2lkdGhBdHRyaWJ1dGVcbiAgICAgICAgLy8gXCJBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgcmVuZGVyaW5nIG9mIHRoZSBlbGVtZW50IChpLmUuLCBubyBwYWludCBpcyBhcHBsaWVkKVwiXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDxwYXR0ZXJuIHdpZHRoPVwiMFwiPlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMucGF0dGVybldpZHRoMCAmJlxuICAgICAgICAgICAgaXRlbS5pc0VsZW0oJ3BhdHRlcm4nKSAmJlxuICAgICAgICAgICAgaXRlbS5oYXNBdHRyKCd3aWR0aCcsICcwJylcbiAgICAgICAgKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gUGF0dGVybiB3aXRoIHplcm8gaGVpZ2h0XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9wc2VydmVycy5odG1sI1BhdHRlcm5FbGVtZW50SGVpZ2h0QXR0cmlidXRlXG4gICAgICAgIC8vIFwiQSB2YWx1ZSBvZiB6ZXJvIGRpc2FibGVzIHJlbmRlcmluZyBvZiB0aGUgZWxlbWVudCAoaS5lLiwgbm8gcGFpbnQgaXMgYXBwbGllZClcIlxuICAgICAgICAvL1xuICAgICAgICAvLyA8cGF0dGVybiBoZWlnaHQ9XCIwXCI+XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5wYXR0ZXJuSGVpZ2h0MCAmJlxuICAgICAgICAgICAgaXRlbS5pc0VsZW0oJ3BhdHRlcm4nKSAmJlxuICAgICAgICAgICAgaXRlbS5oYXNBdHRyKCdoZWlnaHQnLCAnMCcpXG4gICAgICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIEltYWdlIHdpdGggemVybyB3aWR0aFxuICAgICAgICAvL1xuICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvc3RydWN0Lmh0bWwjSW1hZ2VFbGVtZW50V2lkdGhBdHRyaWJ1dGVcbiAgICAgICAgLy8gXCJBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgcmVuZGVyaW5nIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gPGltYWdlIHdpZHRoPVwiMFwiPlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMuaW1hZ2VXaWR0aDAgJiZcbiAgICAgICAgICAgIGl0ZW0uaXNFbGVtKCdpbWFnZScpICYmXG4gICAgICAgICAgICBpdGVtLmhhc0F0dHIoJ3dpZHRoJywgJzAnKVxuICAgICAgICApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBJbWFnZSB3aXRoIHplcm8gaGVpZ2h0XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zdHJ1Y3QuaHRtbCNJbWFnZUVsZW1lbnRIZWlnaHRBdHRyaWJ1dGVcbiAgICAgICAgLy8gXCJBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgcmVuZGVyaW5nIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gPGltYWdlIGhlaWdodD1cIjBcIj5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1zLmltYWdlSGVpZ2h0MCAmJlxuICAgICAgICAgICAgaXRlbS5pc0VsZW0oJ2ltYWdlJykgJiZcbiAgICAgICAgICAgIGl0ZW0uaGFzQXR0cignaGVpZ2h0JywgJzAnKVxuICAgICAgICApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBQYXRoIHdpdGggZW1wdHkgZGF0YVxuICAgICAgICAvL1xuICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvcGF0aHMuaHRtbCNEQXR0cmlidXRlXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDxwYXRoIGQ9XCJcIi8+XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmFtcy5wYXRoRW1wdHlEICYmXG4gICAgICAgICAgICBpdGVtLmlzRWxlbSgncGF0aCcpICYmXG4gICAgICAgICAgICAoIWl0ZW0uaGFzQXR0cignZCcpIHx8ICFyZWdWYWxpZFBhdGgudGVzdChpdGVtLmF0dHIoJ2QnKS52YWx1ZSkpXG4gICAgICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFBvbHlsaW5lIHdpdGggZW1wdHkgcG9pbnRzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zaGFwZXMuaHRtbCNQb2x5bGluZUVsZW1lbnRQb2ludHNBdHRyaWJ1dGVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gPHBvbHlsaW5lIHBvaW50cz1cIlwiPlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMucG9seWxpbmVFbXB0eVBvaW50cyAmJlxuICAgICAgICAgICAgaXRlbS5pc0VsZW0oJ3BvbHlsaW5lJykgJiZcbiAgICAgICAgICAgICFpdGVtLmhhc0F0dHIoJ3BvaW50cycpXG4gICAgICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFBvbHlnb24gd2l0aCBlbXB0eSBwb2ludHNcbiAgICAgICAgLy9cbiAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL3NoYXBlcy5odG1sI1BvbHlnb25FbGVtZW50UG9pbnRzQXR0cmlidXRlXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDxwb2x5Z29uIHBvaW50cz1cIlwiPlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJhbXMucG9seWdvbkVtcHR5UG9pbnRzICYmXG4gICAgICAgICAgICBpdGVtLmlzRWxlbSgncG9seWdvbicpICYmXG4gICAgICAgICAgICAhaXRlbS5oYXNBdHRyKCdwb2ludHMnKVxuICAgICAgICApIHJldHVybiBmYWxzZTtcblxuICAgIH1cblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnY29udmVydHMgYmFzaWMgc2hhcGVzIHRvIG1vcmUgY29tcGFjdCBwYXRoIGZvcm0nO1xuXG5leHBvcnRzLnBhcmFtcyA9IHtcbiAgICBjb252ZXJ0QXJjczogZmFsc2Vcbn07XG5cbnZhciBub25lID0geyB2YWx1ZTogMCB9LFxuICAgIHJlZ051bWJlciA9IC9bLStdPyg/OlxcZCpcXC5cXGQrfFxcZCtcXC4/KSg/OltlRV1bLStdP1xcZCspPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGJhc2ljIHNoYXBlIHRvIG1vcmUgY29tcGFjdCBwYXRoLlxuICogSXQgYWxzbyBhbGxvd3MgZnVydGhlciBvcHRpbWl6YXRpb25zIGxpa2VcbiAqIGNvbWJpbmluZyBwYXRocyB3aXRoIHNpbWlsYXIgYXR0cmlidXRlcy5cbiAqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zaGFwZXMuaHRtbFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIExldiBTb2xudHNldlxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSwgcGFyYW1zKSB7XG4gICAgdmFyIGNvbnZlcnRBcmNzID0gcGFyYW1zICYmIHBhcmFtcy5jb252ZXJ0QXJjcztcblxuICAgIGlmIChcbiAgICAgICAgaXRlbS5pc0VsZW0oJ3JlY3QnKSAmJlxuICAgICAgICBpdGVtLmhhc0F0dHIoJ3dpZHRoJykgJiZcbiAgICAgICAgaXRlbS5oYXNBdHRyKCdoZWlnaHQnKSAmJlxuICAgICAgICAhaXRlbS5oYXNBdHRyKCdyeCcpICYmXG4gICAgICAgICFpdGVtLmhhc0F0dHIoJ3J5JylcbiAgICApIHtcblxuICAgICAgICB2YXIgeCA9ICsoaXRlbS5hdHRyKCd4JykgfHwgbm9uZSkudmFsdWUsXG4gICAgICAgICAgICB5ID0gKyhpdGVtLmF0dHIoJ3knKSB8fCBub25lKS52YWx1ZSxcbiAgICAgICAgICAgIHdpZHRoICA9ICtpdGVtLmF0dHIoJ3dpZHRoJykudmFsdWUsXG4gICAgICAgICAgICBoZWlnaHQgPSAraXRlbS5hdHRyKCdoZWlnaHQnKS52YWx1ZTtcblxuICAgICAgICAgICAgLy8gVmFsdWVzIGxpa2UgJzEwMCUnIGNvbXB1dGUgdG8gTmFOLCB0aHVzIHJ1bm5pbmcgYWZ0ZXJcbiAgICAgICAgICAgIC8vIGNsZWFudXBOdW1lcmljVmFsdWVzIHdoZW4gJ3B4JyB1bml0cyBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQuXG4gICAgICAgICAgICAvLyBUT0RPOiBDYWxjdWxhdGUgc2l6ZXMgZnJvbSAlIGFuZCBub24tcHggdW5pdHMgaWYgcG9zc2libGUuXG4gICAgICAgIGlmIChpc05hTih4IC0geSArIHdpZHRoIC0gaGVpZ2h0KSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwYXRoRGF0YSA9XG4gICAgICAgICAgICAnTScgKyB4ICsgJyAnICsgeSArXG4gICAgICAgICAgICAnSCcgKyAoeCArIHdpZHRoKSArXG4gICAgICAgICAgICAnVicgKyAoeSArIGhlaWdodCkgK1xuICAgICAgICAgICAgJ0gnICsgeCArXG4gICAgICAgICAgICAneic7XG5cbiAgICAgICAgaXRlbS5hZGRBdHRyKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHBhdGhEYXRhLFxuICAgICAgICAgICAgICAgIHByZWZpeDogJycsXG4gICAgICAgICAgICAgICAgbG9jYWw6ICdkJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaXRlbS5yZW5hbWVFbGVtKCdwYXRoJylcbiAgICAgICAgICAgIC5yZW1vdmVBdHRyKFsneCcsICd5JywgJ3dpZHRoJywgJ2hlaWdodCddKTtcblxuICAgIH0gZWxzZSBpZiAoaXRlbS5pc0VsZW0oJ2xpbmUnKSkge1xuXG4gICAgICAgIHZhciB4MSA9ICsoaXRlbS5hdHRyKCd4MScpIHx8IG5vbmUpLnZhbHVlLFxuICAgICAgICAgICAgeTEgPSArKGl0ZW0uYXR0cigneTEnKSB8fCBub25lKS52YWx1ZSxcbiAgICAgICAgICAgIHgyID0gKyhpdGVtLmF0dHIoJ3gyJykgfHwgbm9uZSkudmFsdWUsXG4gICAgICAgICAgICB5MiA9ICsoaXRlbS5hdHRyKCd5MicpIHx8IG5vbmUpLnZhbHVlO1xuICAgICAgICBpZiAoaXNOYU4oeDEgLSB5MSArIHgyIC0geTIpKSByZXR1cm47XG5cbiAgICAgICAgaXRlbS5hZGRBdHRyKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdNJyArIHgxICsgJyAnICsgeTEgKyAnTCcgKyB4MiArICcgJyArIHkyLFxuICAgICAgICAgICAgICAgIHByZWZpeDogJycsXG4gICAgICAgICAgICAgICAgbG9jYWw6ICdkJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaXRlbS5yZW5hbWVFbGVtKCdwYXRoJylcbiAgICAgICAgICAgIC5yZW1vdmVBdHRyKFsneDEnLCAneTEnLCAneDInLCAneTInXSk7XG5cbiAgICB9IGVsc2UgaWYgKChcbiAgICAgICAgICAgIGl0ZW0uaXNFbGVtKCdwb2x5bGluZScpIHx8XG4gICAgICAgICAgICBpdGVtLmlzRWxlbSgncG9seWdvbicpXG4gICAgICAgICkgJiZcbiAgICAgICAgaXRlbS5oYXNBdHRyKCdwb2ludHMnKVxuICAgICkge1xuXG4gICAgICAgIHZhciBjb29yZHMgPSAoaXRlbS5hdHRyKCdwb2ludHMnKS52YWx1ZS5tYXRjaChyZWdOdW1iZXIpIHx8IFtdKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgaWYgKGNvb3Jkcy5sZW5ndGggPCA0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaXRlbS5hZGRBdHRyKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdNJyArIGNvb3Jkcy5zbGljZSgwLDIpLmpvaW4oJyAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICdMJyArIGNvb3Jkcy5zbGljZSgyKS5qb2luKCcgJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5pc0VsZW0oJ3BvbHlnb24nKSA/ICd6JyA6ICcnKSxcbiAgICAgICAgICAgICAgICBwcmVmaXg6ICcnLFxuICAgICAgICAgICAgICAgIGxvY2FsOiAnZCdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGl0ZW0ucmVuYW1lRWxlbSgncGF0aCcpXG4gICAgICAgICAgICAucmVtb3ZlQXR0cigncG9pbnRzJyk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmlzRWxlbSgnY2lyY2xlJykgJiYgY29udmVydEFyY3MpIHtcblxuICAgICAgICB2YXIgY3ggPSArKGl0ZW0uYXR0cignY3gnKSB8fCBub25lKS52YWx1ZTtcbiAgICAgICAgdmFyIGN5ID0gKyhpdGVtLmF0dHIoJ2N5JykgfHwgbm9uZSkudmFsdWU7XG4gICAgICAgIHZhciByID0gKyhpdGVtLmF0dHIoJ3InKSB8fCBub25lKS52YWx1ZTtcbiAgICAgICAgaWYgKGlzTmFOKGN4IC0gY3kgKyByKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjUGF0aERhdGEgPVxuICAgICAgICAgICAgJ00nICsgY3ggICsgJyAnICsgKGN5IC0gcikgK1xuICAgICAgICAgICAgICAgICdBJyArIHIgKyAnICcgKyByICsgJyAwIDEgMCAnICsgY3ggKyAnICcgKyAoY3kgKyByKSArXG4gICAgICAgICAgICAgICAgJ0EnICsgciArICcgJyArIHIgKyAnIDAgMSAwICcgKyBjeCArICcgJyArIChjeSAtIHIpICtcbiAgICAgICAgICAgICAgICAnWic7XG4gICAgICAgIGl0ZW0uYWRkQXR0cih7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2QnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjUGF0aERhdGEsXG4gICAgICAgICAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgICAgICAgICBsb2NhbDogJ2QnLFxuICAgICAgICB9KTtcbiAgICAgICAgaXRlbS5yZW5hbWVFbGVtKCdwYXRoJykucmVtb3ZlQXR0cihbJ2N4JywgJ2N5JywgJ3InXSk7XG5cbiAgICB9IGVsc2UgaWYgKGl0ZW0uaXNFbGVtKCdlbGxpcHNlJykgJiYgY29udmVydEFyY3MpIHtcblxuICAgICAgICB2YXIgZWN4ID0gKyhpdGVtLmF0dHIoJ2N4JykgfHwgbm9uZSkudmFsdWU7XG4gICAgICAgIHZhciBlY3kgPSArKGl0ZW0uYXR0cignY3knKSB8fCBub25lKS52YWx1ZTtcbiAgICAgICAgdmFyIHJ4ID0gKyhpdGVtLmF0dHIoJ3J4JykgfHwgbm9uZSkudmFsdWU7XG4gICAgICAgIHZhciByeSA9ICsoaXRlbS5hdHRyKCdyeScpIHx8IG5vbmUpLnZhbHVlO1xuICAgICAgICBpZiAoaXNOYU4oZWN4IC0gZWN5ICsgcnggLSByeSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZVBhdGhEYXRhID1cbiAgICAgICAgICAgICdNJyArIGVjeCArICcgJyArIChlY3kgLSByeSkgK1xuICAgICAgICAgICAgICAgICdBJyArIHJ4ICsgJyAnICsgcnkgKyAnIDAgMSAwICcgKyBlY3ggKyAnICcgKyAoZWN5ICsgcnkpICtcbiAgICAgICAgICAgICAgICAnQScgKyByeCArICcgJyArIHJ5ICsgJyAwIDEgMCAnICsgZWN4ICsgJyAnICsgKGVjeSAtIHJ5KSArXG4gICAgICAgICAgICAgICAgJ1onO1xuICAgICAgICBpdGVtLmFkZEF0dHIoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdkJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZVBhdGhEYXRhLFxuICAgICAgICAgICAgICAgIHByZWZpeDogJycsXG4gICAgICAgICAgICAgICAgbG9jYWw6ICdkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGl0ZW0ucmVuYW1lRWxlbSgncGF0aCcpLnJlbW92ZUF0dHIoWydjeCcsICdjeScsICdyeCcsICdyeSddKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdtb3ZlcyBzb21lIGdyb3VwIGF0dHJpYnV0ZXMgdG8gdGhlIGNvbnRlbnQgZWxlbWVudHMnO1xuXG52YXIgY29sbGVjdGlvbnMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9ucy5qcycpLFxuICAgIHBhdGhFbGVtcyA9IGNvbGxlY3Rpb25zLnBhdGhFbGVtcy5jb25jYXQoWydnJywgJ3RleHQnXSksXG4gICAgcmVmZXJlbmNlc1Byb3BzID0gY29sbGVjdGlvbnMucmVmZXJlbmNlc1Byb3BzO1xuXG4vKipcbiAqIE1vdmUgZ3JvdXAgYXR0cnMgdG8gdGhlIGNvbnRlbnQgZWxlbWVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxnIHRyYW5zZm9ybT1cInNjYWxlKDIpXCI+XG4gKiAgICAgPHBhdGggdHJhbnNmb3JtPVwicm90YXRlKDQ1KVwiIGQ9XCJNMCwwIEwxMCwyMFwiLz5cbiAqICAgICA8cGF0aCB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTAsIDIwKVwiIGQ9XCJNMCwxMCBMMjAsMzBcIi8+XG4gKiA8L2c+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAg4qyHXG4gKiA8Zz5cbiAqICAgICA8cGF0aCB0cmFuc2Zvcm09XCJzY2FsZSgyKSByb3RhdGUoNDUpXCIgZD1cIk0wLDAgTDEwLDIwXCIvPlxuICogICAgIDxwYXRoIHRyYW5zZm9ybT1cInNjYWxlKDIpIHRyYW5zbGF0ZSgxMCwgMjApXCIgZD1cIk0wLDEwIEwyMCwzMFwiLz5cbiAqIDwvZz5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICAvLyBtb3ZlIGdyb3VwIHRyYW5zZm9ybSBhdHRyIHRvIGNvbnRlbnQncyBwYXRoRWxlbXNcbiAgICBpZiAoXG4gICAgICAgIGl0ZW0uaXNFbGVtKCdnJykgJiZcbiAgICAgICAgaXRlbS5oYXNBdHRyKCd0cmFuc2Zvcm0nKSAmJlxuICAgICAgICAhaXRlbS5pc0VtcHR5KCkgJiZcbiAgICAgICAgIWl0ZW0uc29tZUF0dHIoZnVuY3Rpb24oYXR0cikge1xuICAgICAgICAgICAgcmV0dXJuIH5yZWZlcmVuY2VzUHJvcHMuaW5kZXhPZihhdHRyLm5hbWUpICYmIH5hdHRyLnZhbHVlLmluZGV4T2YoJ3VybCgnKTtcbiAgICAgICAgfSkgJiZcbiAgICAgICAgaXRlbS5jb250ZW50LmV2ZXJ5KGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXIuaXNFbGVtKHBhdGhFbGVtcykgJiYgIWlubmVyLmhhc0F0dHIoJ2lkJyk7XG4gICAgICAgIH0pXG4gICAgKSB7XG4gICAgICAgIGl0ZW0uY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IGl0ZW0uYXR0cigndHJhbnNmb3JtJyk7XG4gICAgICAgICAgICBpZiAoaW5uZXIuaGFzQXR0cigndHJhbnNmb3JtJykpIHtcbiAgICAgICAgICAgICAgICBpbm5lci5hdHRyKCd0cmFuc2Zvcm0nKS52YWx1ZSA9IGF0dHIudmFsdWUgKyAnICcgKyBpbm5lci5hdHRyKCd0cmFuc2Zvcm0nKS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5uZXIuYWRkQXR0cih7XG4gICAgICAgICAgICAgICAgICAgICduYW1lJzogYXR0ci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAnbG9jYWwnOiBhdHRyLmxvY2FsLFxuICAgICAgICAgICAgICAgICAgICAncHJlZml4JzogYXR0ci5wcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IGF0dHIudmFsdWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXRlbS5yZW1vdmVBdHRyKCd0cmFuc2Zvcm0nKTtcbiAgICB9XG5cbn07XG4iLCIvKiBnbG9iYWwgYTJjICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciByZWdQYXRoSW5zdHJ1Y3Rpb25zID0gLyhbTW1MbEhoVnZDY1NzUXFUdEFhWnpdKVxccyovLFxuICAgIHJlZ1BhdGhEYXRhID0gL1stK10/KD86XFxkKlxcLlxcZCt8XFxkK1xcLj8pKFtlRV1bLStdP1xcZCspPy9nLFxuICAgIHJlZ051bWVyaWNWYWx1ZXMgPSAvWy0rXT8oXFxkKlxcLlxcZCt8XFxkK1xcLj8pKD86W2VFXVstK10/XFxkKyk/LyxcbiAgICB0cmFuc2Zvcm0yanMgPSByZXF1aXJlKCcuL190cmFuc2Zvcm1zJykudHJhbnNmb3JtMmpzLFxuICAgIHRyYW5zZm9ybXNNdWx0aXBseSA9IHJlcXVpcmUoJy4vX3RyYW5zZm9ybXMnKS50cmFuc2Zvcm1zTXVsdGlwbHksXG4gICAgdHJhbnNmb3JtQXJjID0gcmVxdWlyZSgnLi9fdHJhbnNmb3JtcycpLnRyYW5zZm9ybUFyYyxcbiAgICBjb2xsZWN0aW9ucyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb25zLmpzJyksXG4gICAgcmVmZXJlbmNlc1Byb3BzID0gY29sbGVjdGlvbnMucmVmZXJlbmNlc1Byb3BzLFxuICAgIGRlZmF1bHRTdHJva2VXaWR0aCA9IGNvbGxlY3Rpb25zLmF0dHJzR3JvdXBzRGVmYXVsdHMucHJlc2VudGF0aW9uWydzdHJva2Utd2lkdGgnXSxcbiAgICBjbGVhbnVwT3V0RGF0YSA9IHJlcXVpcmUoJy4uL2xpYi9zdmdvL3Rvb2xzJykuY2xlYW51cE91dERhdGEsXG4gICAgcmVtb3ZlTGVhZGluZ1plcm8gPSByZXF1aXJlKCcuLi9saWIvc3Znby90b29scycpLnJlbW92ZUxlYWRpbmdaZXJvLFxuICAgIHByZXZDdHJsUG9pbnQ7XG5cbi8qKlxuICogQ29udmVydCBwYXRoIHN0cmluZyB0byBKUyByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFN0cmluZyBpbnB1dCBzdHJpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICogQHJldHVybiB7QXJyYXl9IG91dHB1dCBhcnJheVxuICovXG5leHBvcnRzLnBhdGgyanMgPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgaWYgKHBhdGgucGF0aEpTKSByZXR1cm4gcGF0aC5wYXRoSlM7XG5cbiAgICB2YXIgcGFyYW1zTGVuZ3RoID0geyAvLyBOdW1iZXIgb2YgcGFyYW1ldGVycyBvZiBldmVyeSBwYXRoIGNvbW1hbmRcbiAgICAgICAgICAgIEg6IDEsIFY6IDEsIE06IDIsIEw6IDIsIFQ6IDIsIFE6IDQsIFM6IDQsIEM6IDYsIEE6IDcsXG4gICAgICAgICAgICBoOiAxLCB2OiAxLCBtOiAyLCBsOiAyLCB0OiAyLCBxOiA0LCBzOiA0LCBjOiA2LCBhOiA3XG4gICAgICAgIH0sXG4gICAgICAgIHBhdGhEYXRhID0gW10sICAgLy8gSlMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGggZGF0YVxuICAgICAgICBpbnN0cnVjdGlvbiwgLy8gY3VycmVudCBpbnN0cnVjdGlvbiBjb250ZXh0XG4gICAgICAgIHN0YXJ0TW92ZXRvID0gZmFsc2U7XG5cbiAgICAvLyBzcGxpdHRpbmcgcGF0aCBzdHJpbmcgaW50byBhcnJheSBsaWtlIFsnTScsICcxMCA1MCcsICdMJywgJzIwIDMwJ11cbiAgICBwYXRoLmF0dHIoJ2QnKS52YWx1ZS5zcGxpdChyZWdQYXRoSW5zdHJ1Y3Rpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIGlmICghc3RhcnRNb3ZldG8pIHtcbiAgICAgICAgICAgIGlmIChkYXRhID09ICdNJyB8fCBkYXRhID09ICdtJykge1xuICAgICAgICAgICAgICAgIHN0YXJ0TW92ZXRvID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbnN0cnVjdGlvbiBpdGVtXG4gICAgICAgIGlmIChyZWdQYXRoSW5zdHJ1Y3Rpb25zLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uID0gZGF0YTtcblxuICAgICAgICAgICAgLy8geiAtIGluc3RydWN0aW9uIHcvbyBkYXRhXG4gICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ1onIHx8IGluc3RydWN0aW9uID09ICd6Jykge1xuICAgICAgICAgICAgICAgIHBhdGhEYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbjogJ3onXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIC8vIGRhdGEgaXRlbVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGRhdGEubWF0Y2gocmVnUGF0aERhdGEpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG5cbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLm1hcChOdW1iZXIpO1xuXG4gICAgICAgICAgICAvLyBTdWJzZXF1ZW50IG1vdmV0byBwYWlycyBvZiBjb29yZGluYXRlcyBhcmUgdGhyZWF0ZWQgYXMgaW1wbGljaXQgbGluZXRvIGNvbW1hbmRzXG4gICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvcGF0aHMuaHRtbCNQYXRoRGF0YU1vdmV0b0NvbW1hbmRzXG4gICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ00nIHx8IGluc3RydWN0aW9uID09ICdtJykge1xuICAgICAgICAgICAgICAgIHBhdGhEYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbjogcGF0aERhdGEubGVuZ3RoID09IDAgPyAnTScgOiBpbnN0cnVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YS5zcGxpY2UoMCwgMilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uID09ICdNJyA/ICdMJyA6ICdsJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgcGFpciA9IHBhcmFtc0xlbmd0aFtpbnN0cnVjdGlvbl07IGRhdGEubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgIHBhdGhEYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEuc3BsaWNlKDAsIHBhaXIpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEZpcnN0IG1vdmV0byBpcyBhY3R1YWxseSBhYnNvbHV0ZS4gU3Vic2VxdWVudCBjb29yZGluYXRlcyB3ZXJlIHNlcGFyYXRlZCBhYm92ZS5cbiAgICBpZiAocGF0aERhdGEubGVuZ3RoICYmIHBhdGhEYXRhWzBdLmluc3RydWN0aW9uID09ICdtJykge1xuICAgICAgICBwYXRoRGF0YVswXS5pbnN0cnVjdGlvbiA9ICdNJztcbiAgICB9XG4gICAgcGF0aC5wYXRoSlMgPSBwYXRoRGF0YTtcblxuICAgIHJldHVybiBwYXRoRGF0YTtcbn07XG5cbi8qKlxuICogQ29udmVydCByZWxhdGl2ZSBQYXRoIGRhdGEgdG8gYWJzb2x1dGUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZGF0YSBpbnB1dCBkYXRhXG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IGRhdGFcbiAqL1xudmFyIHJlbGF0aXZlMmFic29sdXRlID0gZXhwb3J0cy5yZWxhdGl2ZTJhYnNvbHV0ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICB2YXIgY3VycmVudFBvaW50ID0gWzAsIDBdLFxuICAgICAgICBzdWJwYXRoUG9pbnQgPSBbMCwgMF0sXG4gICAgICAgIGk7XG5cbiAgICByZXR1cm4gZGF0YS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgICAgIHZhciBpbnN0cnVjdGlvbiA9IGl0ZW0uaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICBpdGVtRGF0YSA9IGl0ZW0uZGF0YSAmJiBpdGVtLmRhdGEuc2xpY2UoKTtcblxuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ00nKSB7XG5cbiAgICAgICAgICAgIHNldChjdXJyZW50UG9pbnQsIGl0ZW1EYXRhKTtcbiAgICAgICAgICAgIHNldChzdWJwYXRoUG9pbnQsIGl0ZW1EYXRhKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCdtbGNzcXQnLmluZGV4T2YoaW5zdHJ1Y3Rpb24pID4gLTEpIHtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1EYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaXRlbURhdGFbaV0gKz0gY3VycmVudFBvaW50W2kgJSAyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldChjdXJyZW50UG9pbnQsIGl0ZW1EYXRhKTtcblxuICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uID09ICdtJykge1xuICAgICAgICAgICAgICAgIHNldChzdWJwYXRoUG9pbnQsIGl0ZW1EYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGluc3RydWN0aW9uID09ICdhJykge1xuXG4gICAgICAgICAgICBpdGVtRGF0YVs1XSArPSBjdXJyZW50UG9pbnRbMF07XG4gICAgICAgICAgICBpdGVtRGF0YVs2XSArPSBjdXJyZW50UG9pbnRbMV07XG4gICAgICAgICAgICBzZXQoY3VycmVudFBvaW50LCBpdGVtRGF0YSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbiA9PSAnaCcpIHtcblxuICAgICAgICAgICAgaXRlbURhdGFbMF0gKz0gY3VycmVudFBvaW50WzBdO1xuICAgICAgICAgICAgY3VycmVudFBvaW50WzBdID0gaXRlbURhdGFbMF07XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbnN0cnVjdGlvbiA9PSAndicpIHtcblxuICAgICAgICAgICAgaXRlbURhdGFbMF0gKz0gY3VycmVudFBvaW50WzFdO1xuICAgICAgICAgICAgY3VycmVudFBvaW50WzFdID0gaXRlbURhdGFbMF07XG5cbiAgICAgICAgfSBlbHNlIGlmICgnTVpMQ1NRVEEnLmluZGV4T2YoaW5zdHJ1Y3Rpb24pID4gLTEpIHtcblxuICAgICAgICAgICAgc2V0KGN1cnJlbnRQb2ludCwgaXRlbURhdGEpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ0gnKSB7XG5cbiAgICAgICAgICAgIGN1cnJlbnRQb2ludFswXSA9IGl0ZW1EYXRhWzBdO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ1YnKSB7XG5cbiAgICAgICAgICAgIGN1cnJlbnRQb2ludFsxXSA9IGl0ZW1EYXRhWzBdO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24gPT0gJ3onKSB7XG5cbiAgICAgICAgICAgIHNldChjdXJyZW50UG9pbnQsIHN1YnBhdGhQb2ludCk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvbiA9PSAneicgP1xuICAgICAgICAgICAgeyBpbnN0cnVjdGlvbjogJ3onIH0gOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uOiBpbnN0cnVjdGlvbi50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW1EYXRhXG4gICAgICAgICAgICB9O1xuXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEFwcGx5IHRyYW5zZm9ybWF0aW9uKHMpIHRvIHRoZSBQYXRoIGRhdGEuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGVsZW0gY3VycmVudCBlbGVtZW50XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIGlucHV0IHBhdGggZGF0YVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyB3aGV0aGVyIHRvIGFwcGx5IHRyYW5zZm9ybXMgdG8gc3Ryb2tlZCBsaW5lcyBhbmQgdHJhbnNmb3JtIHByZWNpc2lvbiAodXNlZCBmb3Igc3Ryb2tlIHdpZHRoKVxuICogQHJldHVybiB7QXJyYXl9IG91dHB1dCBwYXRoIGRhdGFcbiAqL1xuZXhwb3J0cy5hcHBseVRyYW5zZm9ybXMgPSBmdW5jdGlvbihlbGVtLCBwYXRoLCBwYXJhbXMpIHtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gJ3N0cm9rZScgYXR0ciBhbmQgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzIHN1Y2ggYXNcbiAgICAvLyBncmFkaWVuZHMgb3IgY2xpcC1wYXRoIHdoaWNoIGFyZSBhbHNvIHN1YmplY3RzIHRvIHRyYW5zZm9ybS5cbiAgICBpZiAoIWVsZW0uaGFzQXR0cigndHJhbnNmb3JtJykgfHwgIWVsZW0uYXR0cigndHJhbnNmb3JtJykudmFsdWUgfHxcbiAgICAgICAgZWxlbS5zb21lQXR0cihmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICByZXR1cm4gfnJlZmVyZW5jZXNQcm9wcy5pbmRleE9mKGF0dHIubmFtZSkgJiYgfmF0dHIudmFsdWUuaW5kZXhPZigndXJsKCcpO1xuICAgICAgICB9KSlcbiAgICAgICAgcmV0dXJuIHBhdGg7XG5cbiAgICB2YXIgbWF0cml4ID0gdHJhbnNmb3Jtc011bHRpcGx5KHRyYW5zZm9ybTJqcyhlbGVtLmF0dHIoJ3RyYW5zZm9ybScpLnZhbHVlKSksXG4gICAgICAgIHN0cm9rZSA9IGVsZW0uY29tcHV0ZWRBdHRyKCdzdHJva2UnKSxcbiAgICAgICAgaWQgPSBlbGVtLmNvbXB1dGVkQXR0cignaWQnKSxcbiAgICAgICAgdHJhbnNmb3JtUHJlY2lzaW9uID0gcGFyYW1zLnRyYW5zZm9ybVByZWNpc2lvbixcbiAgICAgICAgbmV3UG9pbnQsIHNjYWxlO1xuXG4gICAgaWYgKHN0cm9rZSAmJiBzdHJva2UgIT0gJ25vbmUnKSB7XG4gICAgICAgIGlmICghcGFyYW1zLmFwcGx5VHJhbnNmb3Jtc1N0cm9rZWQgfHxcbiAgICAgICAgICAgIChtYXRyaXguZGF0YVswXSAhPSBtYXRyaXguZGF0YVszXSB8fCBtYXRyaXguZGF0YVsxXSAhPSAtbWF0cml4LmRhdGFbMl0pICYmXG4gICAgICAgICAgICAobWF0cml4LmRhdGFbMF0gIT0gLW1hdHJpeC5kYXRhWzNdIHx8IG1hdHJpeC5kYXRhWzFdICE9IG1hdHJpeC5kYXRhWzJdKSlcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuXG4gICAgICAgIC8vIFwic3Ryb2tlLXdpZHRoXCIgc2hvdWxkIGJlIGluc2lkZSB0aGUgcGFydCB3aXRoIElELCBvdGhlcndpc2UgaXQgY2FuIGJlIG92ZXJyaWRlZCBpbiA8dXNlPlxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHZhciBpZEVsZW0gPSBlbGVtLFxuICAgICAgICAgICAgICAgIGhhc1N0cm9rZVdpZHRoID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoaWRFbGVtLmhhc0F0dHIoJ3N0cm9rZS13aWR0aCcpKSBoYXNTdHJva2VXaWR0aCA9IHRydWU7XG4gICAgICAgICAgICB9IHdoaWxlICghaWRFbGVtLmhhc0F0dHIoJ2lkJywgaWQpICYmICFoYXNTdHJva2VXaWR0aCAmJiAoaWRFbGVtID0gaWRFbGVtLnBhcmVudE5vZGUpKTtcblxuICAgICAgICAgICAgaWYgKCFoYXNTdHJva2VXaWR0aCkgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBzY2FsZSA9ICtNYXRoLnNxcnQobWF0cml4LmRhdGFbMF0gKiBtYXRyaXguZGF0YVswXSArIG1hdHJpeC5kYXRhWzFdICogbWF0cml4LmRhdGFbMV0pLnRvRml4ZWQodHJhbnNmb3JtUHJlY2lzaW9uKTtcblxuICAgICAgICBpZiAoc2NhbGUgIT09IDEpIHtcbiAgICAgICAgICAgIHZhciBzdHJva2VXaWR0aCA9IGVsZW0uY29tcHV0ZWRBdHRyKCdzdHJva2Utd2lkdGgnKSB8fCBkZWZhdWx0U3Ryb2tlV2lkdGg7XG5cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHIoJ3N0cm9rZS13aWR0aCcpKSB7XG4gICAgICAgICAgICAgICAgZWxlbS5hdHRyc1snc3Ryb2tlLXdpZHRoJ10udmFsdWUgPSBlbGVtLmF0dHJzWydzdHJva2Utd2lkdGgnXS52YWx1ZS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocmVnTnVtZXJpY1ZhbHVlcywgZnVuY3Rpb24obnVtKSB7IHJldHVybiByZW1vdmVMZWFkaW5nWmVybyhudW0gKiBzY2FsZSkgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW0uYWRkQXR0cih7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzdHJva2Utd2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICcnLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDogJ3N0cm9rZS13aWR0aCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzdHJva2VXaWR0aC5yZXBsYWNlKHJlZ051bWVyaWNWYWx1ZXMsIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gcmVtb3ZlTGVhZGluZ1plcm8obnVtICogc2NhbGUpIH0pXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlkKSB7IC8vIFN0cm9rZSBhbmQgc3Ryb2tlLXdpZHRoIGNhbiBiZSByZWRlZmluZWQgd2l0aCA8dXNlPlxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBwYXRoLmZvckVhY2goZnVuY3Rpb24ocGF0aEl0ZW0pIHtcblxuICAgICAgICBpZiAocGF0aEl0ZW0uZGF0YSkge1xuXG4gICAgICAgICAgICAvLyBoIC0+IGxcbiAgICAgICAgICAgIGlmIChwYXRoSXRlbS5pbnN0cnVjdGlvbiA9PT0gJ2gnKSB7XG5cbiAgICAgICAgICAgICAgICBwYXRoSXRlbS5pbnN0cnVjdGlvbiA9ICdsJztcbiAgICAgICAgICAgICAgICBwYXRoSXRlbS5kYXRhWzFdID0gMDtcblxuICAgICAgICAgICAgLy8gdiAtPiBsXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhJdGVtLmluc3RydWN0aW9uID09PSAndicpIHtcblxuICAgICAgICAgICAgICAgIHBhdGhJdGVtLmluc3RydWN0aW9uID0gJ2wnO1xuICAgICAgICAgICAgICAgIHBhdGhJdGVtLmRhdGFbMV0gPSBwYXRoSXRlbS5kYXRhWzBdO1xuICAgICAgICAgICAgICAgIHBhdGhJdGVtLmRhdGFbMF0gPSAwO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhbnNsYXRlKCkgdHJhbnNmb3JtXG4gICAgICAgICAgICBpZiAocGF0aEl0ZW0uaW5zdHJ1Y3Rpb24gPT09ICdNJyAmJlxuICAgICAgICAgICAgICAgIChtYXRyaXguZGF0YVs0XSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgIG1hdHJpeC5kYXRhWzVdICE9PSAwKVxuICAgICAgICAgICAgKSB7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGVuIGFwcGx5IGl0IG9ubHkgdG8gdGhlIGZpcnN0IGFic29sdXRlZCBNXG4gICAgICAgICAgICAgICAgbmV3UG9pbnQgPSB0cmFuc2Zvcm1Qb2ludChtYXRyaXguZGF0YSwgcGF0aEl0ZW0uZGF0YVswXSwgcGF0aEl0ZW0uZGF0YVsxXSk7XG4gICAgICAgICAgICAgICAgc2V0KHBhdGhJdGVtLmRhdGEsIG5ld1BvaW50KTtcbiAgICAgICAgICAgICAgICBzZXQocGF0aEl0ZW0uY29vcmRzLCBuZXdQb2ludCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjbGVhciB0cmFuc2xhdGUoKSBkYXRhIGZyb20gdHJhbnNmb3JtIG1hdHJpeFxuICAgICAgICAgICAgICAgIG1hdHJpeC5kYXRhWzRdID0gMDtcbiAgICAgICAgICAgICAgICBtYXRyaXguZGF0YVs1XSA9IDA7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0aEl0ZW0uaW5zdHJ1Y3Rpb24gPT0gJ2EnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtQXJjKHBhdGhJdGVtLmRhdGEsIG1hdHJpeC5kYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyByZWR1Y2UgbnVtYmVyIG9mIGRpZ2l0cyBpbiByb3RhdGlvbiBhbmdsZVxuICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMocGF0aEl0ZW0uZGF0YVsyXSkgPiA4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBwYXRoSXRlbS5kYXRhWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uID0gcGF0aEl0ZW0uZGF0YVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhJdGVtLmRhdGFbMF0gPSBwYXRoSXRlbS5kYXRhWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEl0ZW0uZGF0YVsxXSA9IGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoSXRlbS5kYXRhWzJdID0gcm90YXRpb24gKyAocm90YXRpb24gPiAwID8gLTkwIDogOTApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3UG9pbnQgPSB0cmFuc2Zvcm1Qb2ludChtYXRyaXguZGF0YSwgcGF0aEl0ZW0uZGF0YVs1XSwgcGF0aEl0ZW0uZGF0YVs2XSk7XG4gICAgICAgICAgICAgICAgICAgIHBhdGhJdGVtLmRhdGFbNV0gPSBuZXdQb2ludFswXTtcbiAgICAgICAgICAgICAgICAgICAgcGF0aEl0ZW0uZGF0YVs2XSA9IG5ld1BvaW50WzFdO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhJdGVtLmRhdGEubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BvaW50ID0gdHJhbnNmb3JtUG9pbnQobWF0cml4LmRhdGEsIHBhdGhJdGVtLmRhdGFbaV0sIHBhdGhJdGVtLmRhdGFbaSArIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhJdGVtLmRhdGFbaV0gPSBuZXdQb2ludFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhJdGVtLmRhdGFbaSArIDFdID0gbmV3UG9pbnRbMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXRoSXRlbS5jb29yZHNbMF0gPSBwYXRoSXRlbS5iYXNlWzBdICsgcGF0aEl0ZW0uZGF0YVtwYXRoSXRlbS5kYXRhLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgIHBhdGhJdGVtLmNvb3Jkc1sxXSA9IHBhdGhJdGVtLmJhc2VbMV0gKyBwYXRoSXRlbS5kYXRhW3BhdGhJdGVtLmRhdGEubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9KTtcblxuICAgIC8vIHJlbW92ZSB0cmFuc2Zvcm0gYXR0clxuICAgIGVsZW0ucmVtb3ZlQXR0cigndHJhbnNmb3JtJyk7XG5cbiAgICByZXR1cm4gcGF0aDtcbn07XG5cbi8qKlxuICogQXBwbHkgdHJhbnNmb3JtIDN4MyBtYXRyaXggdG8geC15IHBvaW50LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IG1hdHJpeCB0cmFuc2Zvcm0gM3gzIG1hdHJpeFxuICogQHBhcmFtIHtBcnJheX0gcG9pbnQgeC15IHBvaW50XG4gKiBAcmV0dXJuIHtBcnJheX0gcG9pbnQgd2l0aCBuZXcgY29vcmRpbmF0ZXNcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQobWF0cml4LCB4LCB5KSB7XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzJdICogeSArIG1hdHJpeFs0XSxcbiAgICAgICAgbWF0cml4WzFdICogeCArIG1hdHJpeFszXSAqIHkgKyBtYXRyaXhbNV1cbiAgICBdO1xuXG59XG5cbi8qKlxuICogQ29tcHV0ZSBDdWJpYyBCw6l6aWUgYm91bmRpbmcgYm94LlxuICpcbiAqIEBzZWUgaHR0cDovL3Byb2Nlc3Npbmdqcy5uaWhvbmdvcmVzb3VyY2VzLmNvbS9iZXppZXJpbmZvL1xuICpcbiAqIEBwYXJhbSB7RmxvYXR9IHhhXG4gKiBAcGFyYW0ge0Zsb2F0fSB5YVxuICogQHBhcmFtIHtGbG9hdH0geGJcbiAqIEBwYXJhbSB7RmxvYXR9IHliXG4gKiBAcGFyYW0ge0Zsb2F0fSB4Y1xuICogQHBhcmFtIHtGbG9hdH0geWNcbiAqIEBwYXJhbSB7RmxvYXR9IHhkXG4gKiBAcGFyYW0ge0Zsb2F0fSB5ZFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZXhwb3J0cy5jb21wdXRlQ3ViaWNCb3VuZGluZ0JveCA9IGZ1bmN0aW9uKHhhLCB5YSwgeGIsIHliLCB4YywgeWMsIHhkLCB5ZCkge1xuXG4gICAgdmFyIG1pbnggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgIG1pbnkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgIG1heHggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgICAgIG1heHkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgICAgIHRzLFxuICAgICAgICB0LFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBpO1xuXG4gICAgLy8gWFxuICAgIGlmICh4YSA8IG1pbngpIHsgbWlueCA9IHhhOyB9XG4gICAgaWYgKHhhID4gbWF4eCkgeyBtYXh4ID0geGE7IH1cbiAgICBpZiAoeGQgPCBtaW54KSB7IG1pbng9IHhkOyB9XG4gICAgaWYgKHhkID4gbWF4eCkgeyBtYXh4ID0geGQ7IH1cblxuICAgIHRzID0gY29tcHV0ZUN1YmljRmlyc3REZXJpdmF0aXZlUm9vdHMoeGEsIHhiLCB4YywgeGQpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdCA9IHRzW2ldO1xuXG4gICAgICAgIGlmICh0ID49IDAgJiYgdCA8PSAxKSB7XG4gICAgICAgICAgICB4ID0gY29tcHV0ZUN1YmljQmFzZVZhbHVlKHQsIHhhLCB4YiwgeGMsIHhkKTtcbiAgICAgICAgICAgIC8vIHkgPSBjb21wdXRlQ3ViaWNCYXNlVmFsdWUodCwgeWEsIHliLCB5YywgeWQpO1xuXG4gICAgICAgICAgICBpZiAoeCA8IG1pbngpIHsgbWlueCA9IHg7IH1cbiAgICAgICAgICAgIGlmICh4ID4gbWF4eCkgeyBtYXh4ID0geDsgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvLyBZXG4gICAgaWYgKHlhIDwgbWlueSkgeyBtaW55ID0geWE7IH1cbiAgICBpZiAoeWEgPiBtYXh5KSB7IG1heHkgPSB5YTsgfVxuICAgIGlmICh5ZCA8IG1pbnkpIHsgbWlueSA9IHlkOyB9XG4gICAgaWYgKHlkID4gbWF4eSkgeyBtYXh5ID0geWQ7IH1cblxuICAgIHRzID0gY29tcHV0ZUN1YmljRmlyc3REZXJpdmF0aXZlUm9vdHMoeWEsIHliLCB5YywgeWQpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdCA9IHRzW2ldO1xuXG4gICAgICAgIGlmICh0ID49IDAgJiYgdCA8PSAxKSB7XG4gICAgICAgICAgICAvLyB4ID0gY29tcHV0ZUN1YmljQmFzZVZhbHVlKHQsIHhhLCB4YiwgeGMsIHhkKTtcbiAgICAgICAgICAgIHkgPSBjb21wdXRlQ3ViaWNCYXNlVmFsdWUodCwgeWEsIHliLCB5YywgeWQpO1xuXG4gICAgICAgICAgICBpZiAoeSA8IG1pbnkpIHsgbWlueSA9IHk7IH1cbiAgICAgICAgICAgIGlmICh5ID4gbWF4eSkgeyBtYXh5ID0geTsgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW54OiBtaW54LFxuICAgICAgICBtaW55OiBtaW55LFxuICAgICAgICBtYXh4OiBtYXh4LFxuICAgICAgICBtYXh5OiBtYXh5XG4gICAgfTtcblxufTtcblxuLy8gY29tcHV0ZSB0aGUgdmFsdWUgZm9yIHRoZSBjdWJpYyBiZXppZXIgZnVuY3Rpb24gYXQgdGltZT10XG5mdW5jdGlvbiBjb21wdXRlQ3ViaWNCYXNlVmFsdWUodCwgYSwgYiwgYywgZCkge1xuXG4gICAgdmFyIG10ID0gMSAtIHQ7XG5cbiAgICByZXR1cm4gbXQgKiBtdCAqIG10ICogYSArIDMgKiBtdCAqIG10ICogdCAqIGIgKyAzICogbXQgKiB0ICogdCAqIGMgKyB0ICogdCAqIHQgKiBkO1xuXG59XG5cbi8vIGNvbXB1dGUgdGhlIHZhbHVlIGZvciB0aGUgZmlyc3QgZGVyaXZhdGl2ZSBvZiB0aGUgY3ViaWMgYmV6aWVyIGZ1bmN0aW9uIGF0IHRpbWU9dFxuZnVuY3Rpb24gY29tcHV0ZUN1YmljRmlyc3REZXJpdmF0aXZlUm9vdHMoYSwgYiwgYywgZCkge1xuXG4gICAgdmFyIHJlc3VsdCA9IFstMSwgLTFdLFxuICAgICAgICB0bCA9IC1hICsgMiAqIGIgLSBjLFxuICAgICAgICB0ciA9IC1NYXRoLnNxcnQoLWEgKiAoYyAtIGQpICsgYiAqIGIgLSBiICogKGMgKyBkKSArIGMgKiBjKSxcbiAgICAgICAgZG4gPSAtYSArIDMgKiBiIC0gMyAqIGMgKyBkO1xuXG4gICAgaWYgKGRuICE9PSAwKSB7XG4gICAgICAgIHJlc3VsdFswXSA9ICh0bCArIHRyKSAvIGRuO1xuICAgICAgICByZXN1bHRbMV0gPSAodGwgLSB0cikgLyBkbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuXG59XG5cbi8qKlxuICogQ29tcHV0ZSBRdWFkcmF0aWMgQsOpemllciBib3VuZGluZyBib3guXG4gKlxuICogQHNlZSBodHRwOi8vcHJvY2Vzc2luZ2pzLm5paG9uZ29yZXNvdXJjZXMuY29tL2JlemllcmluZm8vXG4gKlxuICogQHBhcmFtIHtGbG9hdH0geGFcbiAqIEBwYXJhbSB7RmxvYXR9IHlhXG4gKiBAcGFyYW0ge0Zsb2F0fSB4YlxuICogQHBhcmFtIHtGbG9hdH0geWJcbiAqIEBwYXJhbSB7RmxvYXR9IHhjXG4gKiBAcGFyYW0ge0Zsb2F0fSB5Y1xuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZXhwb3J0cy5jb21wdXRlUXVhZHJhdGljQm91bmRpbmdCb3ggPSBmdW5jdGlvbih4YSwgeWEsIHhiLCB5YiwgeGMsIHljKSB7XG5cbiAgICB2YXIgbWlueCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgbWlueSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgbWF4eCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcbiAgICAgICAgbWF4eSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcbiAgICAgICAgdCxcbiAgICAgICAgeCxcbiAgICAgICAgeTtcblxuICAgIC8vIFhcbiAgICBpZiAoeGEgPCBtaW54KSB7IG1pbnggPSB4YTsgfVxuICAgIGlmICh4YSA+IG1heHgpIHsgbWF4eCA9IHhhOyB9XG4gICAgaWYgKHhjIDwgbWlueCkgeyBtaW54ID0geGM7IH1cbiAgICBpZiAoeGMgPiBtYXh4KSB7IG1heHggPSB4YzsgfVxuXG4gICAgdCA9IGNvbXB1dGVRdWFkcmF0aWNGaXJzdERlcml2YXRpdmVSb290KHhhLCB4YiwgeGMpO1xuXG4gICAgaWYgKHQgPj0gMCAmJiB0IDw9IDEpIHtcbiAgICAgICAgeCA9IGNvbXB1dGVRdWFkcmF0aWNCYXNlVmFsdWUodCwgeGEsIHhiLCB4Yyk7XG4gICAgICAgIC8vIHkgPSBjb21wdXRlUXVhZHJhdGljQmFzZVZhbHVlKHQsIHlhLCB5YiwgeWMpO1xuXG4gICAgICAgIGlmICh4IDwgbWlueCkgeyBtaW54ID0geDsgfVxuICAgICAgICBpZiAoeCA+IG1heHgpIHsgbWF4eCA9IHg7IH1cbiAgICB9XG5cbiAgICAvLyBZXG4gICAgaWYgKHlhIDwgbWlueSkgeyBtaW55ID0geWE7IH1cbiAgICBpZiAoeWEgPiBtYXh5KSB7IG1heHkgPSB5YTsgfVxuICAgIGlmICh5YyA8IG1pbnkpIHsgbWlueSA9IHljOyB9XG4gICAgaWYgKHljID4gbWF4eSkgeyBtYXh5ID0geWM7IH1cblxuICAgIHQgPSBjb21wdXRlUXVhZHJhdGljRmlyc3REZXJpdmF0aXZlUm9vdCh5YSwgeWIsIHljKTtcblxuICAgIGlmICh0ID49IDAgJiYgdCA8PTEgKSB7XG4gICAgICAgIC8vIHggPSBjb21wdXRlUXVhZHJhdGljQmFzZVZhbHVlKHQsIHhhLCB4YiwgeGMpO1xuICAgICAgICB5ID0gY29tcHV0ZVF1YWRyYXRpY0Jhc2VWYWx1ZSh0LCB5YSwgeWIsIHljKTtcblxuICAgICAgICBpZiAoeSA8IG1pbnkpIHsgbWlueSA9IHk7IH1cbiAgICAgICAgaWYgKHkgPiBtYXh5KSB7IG1heHkgPSB5IDsgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWlueDogbWlueCxcbiAgICAgICAgbWlueTogbWlueSxcbiAgICAgICAgbWF4eDogbWF4eCxcbiAgICAgICAgbWF4eTogbWF4eVxuICAgIH07XG5cbn07XG5cbi8vIGNvbXB1dGUgdGhlIHZhbHVlIGZvciB0aGUgcXVhZHJhdGljIGJlemllciBmdW5jdGlvbiBhdCB0aW1lPXRcbmZ1bmN0aW9uIGNvbXB1dGVRdWFkcmF0aWNCYXNlVmFsdWUodCwgYSwgYiwgYykge1xuXG4gICAgdmFyIG10ID0gMSAtIHQ7XG5cbiAgICByZXR1cm4gbXQgKiBtdCAqIGEgKyAyICogbXQgKiB0ICogYiArIHQgKiB0ICogYztcblxufVxuXG4vLyBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGRlcml2YXRpdmUgb2YgdGhlIHF1YWRyYXRpYyBiZXppZXIgZnVuY3Rpb24gYXQgdGltZT10XG5mdW5jdGlvbiBjb21wdXRlUXVhZHJhdGljRmlyc3REZXJpdmF0aXZlUm9vdChhLCBiLCBjKSB7XG5cbiAgICB2YXIgdCA9IC0xLFxuICAgICAgICBkZW5vbWluYXRvciA9IGEgLSAyICogYiArIGM7XG5cbiAgICBpZiAoZGVub21pbmF0b3IgIT09IDApIHtcbiAgICAgICAgdCA9IChhIC0gYikgLyBkZW5vbWluYXRvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdDtcblxufVxuXG4vKipcbiAqIENvbnZlcnQgcGF0aCBhcnJheSB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBpbnB1dCBwYXRoIGRhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICogQHJldHVybiB7U3RyaW5nfSBvdXRwdXQgcGF0aCBzdHJpbmdcbiAqL1xuZXhwb3J0cy5qczJwYXRoID0gZnVuY3Rpb24ocGF0aCwgZGF0YSwgcGFyYW1zKSB7XG5cbiAgICBwYXRoLnBhdGhKUyA9IGRhdGE7XG5cbiAgICBpZiAocGFyYW1zLmNvbGxhcHNlUmVwZWF0ZWQpIHtcbiAgICAgICAgZGF0YSA9IGNvbGxhcHNlUmVwZWF0ZWQoZGF0YSk7XG4gICAgfVxuXG4gICAgcGF0aC5hdHRyKCdkJykudmFsdWUgPSBkYXRhLnJlZHVjZShmdW5jdGlvbihwYXRoU3RyaW5nLCBpdGVtKSB7XG4gICAgICAgIHJldHVybiBwYXRoU3RyaW5nICs9IGl0ZW0uaW5zdHJ1Y3Rpb24gKyAoaXRlbS5kYXRhID8gY2xlYW51cE91dERhdGEoaXRlbS5kYXRhLCBwYXJhbXMpIDogJycpO1xuICAgIH0sICcnKTtcblxufTtcblxuLyoqXG4gKiBDb2xsYXBzZSByZXBlYXRlZCBpbnN0cnVjdGlvbnMgZGF0YVxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggaW5wdXQgcGF0aCBkYXRhXG4gKiBAcmV0dXJuIHtBcnJheX0gb3V0cHV0IHBhdGggZGF0YVxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVJlcGVhdGVkKGRhdGEpIHtcblxuICAgIHZhciBwcmV2LFxuICAgICAgICBwcmV2SW5kZXg7XG5cbiAgICAvLyBjb3B5IGFuIGFycmF5IGFuZCBtb2RpZmllZHMgaXRlbSB0byBrZWVwIG9yaWdpbmFsIGRhdGEgdW50b3VjaGVkXG4gICAgZGF0YSA9IGRhdGEucmVkdWNlKGZ1bmN0aW9uKG5ld1BhdGgsIGl0ZW0pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJldiAmJiBpdGVtLmRhdGEgJiZcbiAgICAgICAgICAgIGl0ZW0uaW5zdHJ1Y3Rpb24gPT0gcHJldi5pbnN0cnVjdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIGNvbmNhdCBwcmV2aW91cyBkYXRhIHdpdGggY3VycmVudFxuICAgICAgICAgICAgaWYgKGl0ZW0uaW5zdHJ1Y3Rpb24gIT0gJ00nKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG5ld1BhdGhbcHJldkluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb246IHByZXYuaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHByZXYuZGF0YS5jb25jYXQoaXRlbS5kYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzOiBpdGVtLmNvb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgYmFzZTogcHJldi5iYXNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldi5kYXRhID0gaXRlbS5kYXRhO1xuICAgICAgICAgICAgICAgIHByZXYuY29vcmRzID0gaXRlbS5jb29yZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdQYXRoLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBwcmV2ID0gaXRlbTtcbiAgICAgICAgICAgIHByZXZJbmRleCA9IG5ld1BhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiBkYXRhO1xuXG59XG5cbmZ1bmN0aW9uIHNldChkZXN0LCBzb3VyY2UpIHtcbiAgICBkZXN0WzBdID0gc291cmNlW3NvdXJjZS5sZW5ndGggLSAyXTtcbiAgICBkZXN0WzFdID0gc291cmNlW3NvdXJjZS5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdHdvIHBhdGhzIGhhdmUgYW4gaW50ZXJzZWN0aW9uIGJ5IGNoZWNraW5nIGNvbnZleCBodWxsc1xuICogY29sbGlzaW9uIHVzaW5nIEdpbGJlcnQtSm9obnNvbi1LZWVydGhpIGRpc3RhbmNlIGFsZ29yaXRobVxuICogaHR0cDovL2VudHJvcHlpbnRlcmFjdGl2ZS5jb20vMjAxMS8wNC9namstYWxnb3JpdGhtL1xuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGgxIEpTIHBhdGggcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGgyIEpTIHBhdGggcmVwcmVzZW50YXRpb25cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uKHBhdGgxLCBwYXRoMikge1xuICAgIGlmIChwYXRoMS5sZW5ndGggPCAzIHx8IHBhdGgyLmxlbmd0aCA8IDMpIHJldHVybiBmYWxzZTsgLy8gbm90aGluZyB0byBmaWxsXG5cbiAgICAvLyBDb2xsZWN0IHBvaW50cyBvZiBldmVyeSBzdWJwYXRoLlxuICAgIHZhciBwb2ludHMxID0gcmVsYXRpdmUyYWJzb2x1dGUocGF0aDEpLnJlZHVjZShnYXRoZXJQb2ludHMsIFtdKSxcbiAgICAgICAgcG9pbnRzMiA9IHJlbGF0aXZlMmFic29sdXRlKHBhdGgyKS5yZWR1Y2UoZ2F0aGVyUG9pbnRzLCBbXSk7XG5cbiAgICAvLyBBeGlzLWFsaWduZWQgYm91bmRpbmcgYm94IGNoZWNrLlxuICAgIGlmIChwb2ludHMxLm1heFggPD0gcG9pbnRzMi5taW5YIHx8IHBvaW50czIubWF4WCA8PSBwb2ludHMxLm1pblggfHxcbiAgICAgICAgcG9pbnRzMS5tYXhZIDw9IHBvaW50czIubWluWSB8fCBwb2ludHMyLm1heFkgPD0gcG9pbnRzMS5taW5ZIHx8XG4gICAgICAgIHBvaW50czEuZXZlcnkoZnVuY3Rpb24gKHNldDEpIHtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHMyLmV2ZXJ5KGZ1bmN0aW9uIChzZXQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldDFbc2V0MS5tYXhYXVswXSA8PSBzZXQyW3NldDIubWluWF1bMF0gfHxcbiAgICAgICAgICAgICAgICAgICAgc2V0MltzZXQyLm1heFhdWzBdIDw9IHNldDFbc2V0MS5taW5YXVswXSB8fFxuICAgICAgICAgICAgICAgICAgICBzZXQxW3NldDEubWF4WV1bMV0gPD0gc2V0MltzZXQyLm1pblldWzFdIHx8XG4gICAgICAgICAgICAgICAgICAgIHNldDJbc2V0Mi5tYXhZXVsxXSA8PSBzZXQxW3NldDEubWluWV1bMV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEdldCBhIGNvbnZleCBodWxsIGZyb20gcG9pbnRzIG9mIGVhY2ggc3VicGF0aC4gSGFzIHRoZSBtb3N0IGNvbXBsZXhpdHkgTyhuwrdsb2cgbikuXG4gICAgdmFyIGh1bGxOZXN0MSA9IHBvaW50czEubWFwKGNvbnZleEh1bGwpLFxuICAgICAgICBodWxsTmVzdDIgPSBwb2ludHMyLm1hcChjb252ZXhIdWxsKTtcblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbiBvZiBldmVyeSBzdWJwYXRoIG9mIHRoZSBmaXJzdCBwYXRoIHdpdGggZXZlcnkgc3VicGF0aCBvZiB0aGUgc2Vjb25kLlxuICAgIHJldHVybiBodWxsTmVzdDEuc29tZShmdW5jdGlvbihodWxsMSkge1xuICAgICAgICBpZiAoaHVsbDEubGVuZ3RoIDwgMykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBodWxsTmVzdDIuc29tZShmdW5jdGlvbihodWxsMikge1xuICAgICAgICAgICAgaWYgKGh1bGwyLmxlbmd0aCA8IDMpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgdmFyIHNpbXBsZXggPSBbZ2V0U3VwcG9ydChodWxsMSwgaHVsbDIsIFsxLCAwXSldLCAvLyBjcmVhdGUgdGhlIGluaXRpYWwgc2ltcGxleFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IG1pbnVzKHNpbXBsZXhbMF0pOyAvLyBzZXQgdGhlIGRpcmVjdGlvbiB0byBwb2ludCB0b3dhcmRzIHRoZSBvcmlnaW5cblxuICAgICAgICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAxZTQ7IC8vIGluZmluaXRlIGxvb3AgcHJvdGVjdGlvbiwgMTAgMDAwIGl0ZXJhdGlvbnMgaXMgbW9yZSB0aGFuIGVub3VnaFxuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmF0aW9ucy0tID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGluZmluaXRlIGxvb3Agd2hpbGUgcHJvY2Vzc2luZyBtZXJnZVBhdGhzIHBsdWdpbi4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHRydWUgaXMgdGhlIHNhZmUgdmFsdWUgdGhhdCBtZWFucyDigJxkbyBub3RoaW5nIHdpdGggcGF0aHPigJ1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYWRkIGEgbmV3IHBvaW50XG4gICAgICAgICAgICAgICAgc2ltcGxleC5wdXNoKGdldFN1cHBvcnQoaHVsbDEsIGh1bGwyLCBkaXJlY3Rpb24pKTtcbiAgICAgICAgICAgICAgICAvLyBzZWUgaWYgdGhlIG5ldyBwb2ludCB3YXMgb24gdGhlIGNvcnJlY3Qgc2lkZSBvZiB0aGUgb3JpZ2luXG4gICAgICAgICAgICAgICAgaWYgKGRvdChkaXJlY3Rpb24sIHNpbXBsZXhbc2ltcGxleC5sZW5ndGggLSAxXSkgPD0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIHNpbXBsZXhcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc1NpbXBsZXgoc2ltcGxleCwgZGlyZWN0aW9uKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZ2V0U3VwcG9ydChhLCBiLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHN1YihzdXBwb3J0UG9pbnQoYSwgZGlyZWN0aW9uKSwgc3VwcG9ydFBvaW50KGIsIG1pbnVzKGRpcmVjdGlvbikpKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlcyBmYXJ0aGVzdCBwb2x5Z29uIHBvaW50IGluIHBhcnRpY3VsYXIgZGlyZWN0aW9uLlxuICAgIC8vIFRoYW5rcyB0byBrbm93bGVkZ2Ugb2YgbWluL21heCB4IGFuZCB5IGNvb3JkaW5hdGVzIHdlIGNhbiBjaG9vc2UgYSBxdWFkcmFudCB0byBzZWFyY2ggaW4uXG4gICAgLy8gU2luY2Ugd2UncmUgd29ya2luZyBvbiBjb252ZXggaHVsbCwgdGhlIGRvdCBwcm9kdWN0IGlzIGluY3JlYXNpbmcgdW50aWwgd2UgZmluZCB0aGUgZmFydGhlc3QgcG9pbnQuXG4gICAgZnVuY3Rpb24gc3VwcG9ydFBvaW50KHBvbHlnb24sIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgaW5kZXggPSBkaXJlY3Rpb25bMV0gPj0gMCA/XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uWzBdIDwgMCA/IHBvbHlnb24ubWF4WSA6IHBvbHlnb24ubWF4WCA6XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uWzBdIDwgMCA/IHBvbHlnb24ubWluWCA6IHBvbHlnb24ubWluWSxcbiAgICAgICAgICAgIG1heCA9IC1JbmZpbml0eSxcbiAgICAgICAgICAgIHZhbHVlO1xuICAgICAgICB3aGlsZSAoKHZhbHVlID0gZG90KHBvbHlnb25baW5kZXhdLCBkaXJlY3Rpb24pKSA+IG1heCkge1xuICAgICAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9ICsraW5kZXggJSBwb2x5Z29uLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9seWdvblsoaW5kZXggfHwgcG9seWdvbi5sZW5ndGgpIC0gMV07XG4gICAgfVxufTtcblxuZnVuY3Rpb24gcHJvY2Vzc1NpbXBsZXgoc2ltcGxleCwgZGlyZWN0aW9uKSB7XG4gICAgLyoganNoaW50IC1XMDA0ICovXG5cbiAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRvIDEtc2ltcGxleCBhbmQgMi1zaW1wbGV4XG4gICAgaWYgKHNpbXBsZXgubGVuZ3RoID09IDIpIHsgLy8gMS1zaW1wbGV4XG4gICAgICAgIHZhciBhID0gc2ltcGxleFsxXSxcbiAgICAgICAgICAgIGIgPSBzaW1wbGV4WzBdLFxuICAgICAgICAgICAgQU8gPSBtaW51cyhzaW1wbGV4WzFdKSxcbiAgICAgICAgICAgIEFCID0gc3ViKGIsIGEpO1xuICAgICAgICAvLyBBTyBpcyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgQUJcbiAgICAgICAgaWYgKGRvdChBTywgQUIpID4gMCkge1xuICAgICAgICAgICAgLy8gZ2V0IHRoZSB2ZWN0b3IgcGVycGVuZGljdWxhciB0byBBQiBmYWNpbmcgT1xuICAgICAgICAgICAgc2V0KGRpcmVjdGlvbiwgb3J0aChBQiwgYSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0KGRpcmVjdGlvbiwgQU8pO1xuICAgICAgICAgICAgLy8gb25seSBBIHJlbWFpbnMgaW4gdGhlIHNpbXBsZXhcbiAgICAgICAgICAgIHNpbXBsZXguc2hpZnQoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIDItc2ltcGxleFxuICAgICAgICB2YXIgYSA9IHNpbXBsZXhbMl0sIC8vIFthLCBiLCBjXSA9IHNpbXBsZXhcbiAgICAgICAgICAgIGIgPSBzaW1wbGV4WzFdLFxuICAgICAgICAgICAgYyA9IHNpbXBsZXhbMF0sXG4gICAgICAgICAgICBBQiA9IHN1YihiLCBhKSxcbiAgICAgICAgICAgIEFDID0gc3ViKGMsIGEpLFxuICAgICAgICAgICAgQU8gPSBtaW51cyhhKSxcbiAgICAgICAgICAgIEFDQiA9IG9ydGgoQUIsIEFDKSwgLy8gdGhlIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIEFCIGZhY2luZyBhd2F5IGZyb20gQ1xuICAgICAgICAgICAgQUJDID0gb3J0aChBQywgQUIpOyAvLyB0aGUgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gQUMgZmFjaW5nIGF3YXkgZnJvbSBCXG5cbiAgICAgICAgaWYgKGRvdChBQ0IsIEFPKSA+IDApIHtcbiAgICAgICAgICAgIGlmIChkb3QoQUIsIEFPKSA+IDApIHsgLy8gcmVnaW9uIDRcbiAgICAgICAgICAgICAgICBzZXQoZGlyZWN0aW9uLCBBQ0IpO1xuICAgICAgICAgICAgICAgIHNpbXBsZXguc2hpZnQoKTsgLy8gc2ltcGxleCA9IFtiLCBhXVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gcmVnaW9uIDVcbiAgICAgICAgICAgICAgICBzZXQoZGlyZWN0aW9uLCBBTyk7XG4gICAgICAgICAgICAgICAgc2ltcGxleC5zcGxpY2UoMCwgMik7IC8vIHNpbXBsZXggPSBbYV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb3QoQUJDLCBBTykgPiAwKSB7XG4gICAgICAgICAgICBpZiAoZG90KEFDLCBBTykgPiAwKSB7IC8vIHJlZ2lvbiA2XG4gICAgICAgICAgICAgICAgc2V0KGRpcmVjdGlvbiwgQUJDKTtcbiAgICAgICAgICAgICAgICBzaW1wbGV4LnNwbGljZSgxLCAxKTsgLy8gc2ltcGxleCA9IFtjLCBhXVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gcmVnaW9uIDUgKGFnYWluKVxuICAgICAgICAgICAgICAgIHNldChkaXJlY3Rpb24sIEFPKTtcbiAgICAgICAgICAgICAgICBzaW1wbGV4LnNwbGljZSgwLCAyKTsgLy8gc2ltcGxleCA9IFthXVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgLy8gcmVnaW9uIDdcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1pbnVzKHYpIHtcbiAgICByZXR1cm4gWy12WzBdLCAtdlsxXV07XG59XG5cbmZ1bmN0aW9uIHN1Yih2MSwgdjIpIHtcbiAgICByZXR1cm4gW3YxWzBdIC0gdjJbMF0sIHYxWzFdIC0gdjJbMV1dO1xufVxuXG5mdW5jdGlvbiBkb3QodjEsIHYyKSB7XG4gICAgcmV0dXJuIHYxWzBdICogdjJbMF0gKyB2MVsxXSAqIHYyWzFdO1xufVxuXG5mdW5jdGlvbiBvcnRoKHYsIGZyb20pIHtcbiAgICB2YXIgbyA9IFstdlsxXSwgdlswXV07XG4gICAgcmV0dXJuIGRvdChvLCBtaW51cyhmcm9tKSkgPCAwID8gbWludXMobykgOiBvO1xufVxuXG5mdW5jdGlvbiBnYXRoZXJQb2ludHMocG9pbnRzLCBpdGVtLCBpbmRleCwgcGF0aCkge1xuXG4gICAgdmFyIHN1YlBhdGggPSBwb2ludHMubGVuZ3RoICYmIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICAgIHByZXYgPSBpbmRleCAmJiBwYXRoW2luZGV4IC0gMV0sXG4gICAgICAgIGJhc2VQb2ludCA9IHN1YlBhdGgubGVuZ3RoICYmIHN1YlBhdGhbc3ViUGF0aC5sZW5ndGggLSAxXSxcbiAgICAgICAgZGF0YSA9IGl0ZW0uZGF0YSxcbiAgICAgICAgY3RybFBvaW50ID0gYmFzZVBvaW50O1xuXG4gICAgc3dpdGNoIChpdGVtLmluc3RydWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goc3ViUGF0aCA9IFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICAgIGFkZFBvaW50KHN1YlBhdGgsIFtkYXRhWzBdLCBiYXNlUG9pbnRbMV1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgIGFkZFBvaW50KHN1YlBhdGgsIFtiYXNlUG9pbnRbMF0sIGRhdGFbMF1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgIGFkZFBvaW50KHN1YlBhdGgsIGRhdGEuc2xpY2UoMCwgMikpO1xuICAgICAgICAgICAgcHJldkN0cmxQb2ludCA9IFtkYXRhWzJdIC0gZGF0YVswXSwgZGF0YVszXSAtIGRhdGFbMV1dOyAvLyBTYXZlIGNvbnRyb2wgcG9pbnQgZm9yIHNob3J0aGFuZFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgaWYgKHByZXYuaW5zdHJ1Y3Rpb24gPT0gJ1EnIHx8IHByZXYuaW5zdHJ1Y3Rpb24gPT0gJ1QnKSB7XG4gICAgICAgICAgICAgICAgY3RybFBvaW50ID0gW2Jhc2VQb2ludFswXSArIHByZXZDdHJsUG9pbnRbMF0sIGJhc2VQb2ludFsxXSArIHByZXZDdHJsUG9pbnRbMV1dO1xuICAgICAgICAgICAgICAgIGFkZFBvaW50KHN1YlBhdGgsIGN0cmxQb2ludCk7XG4gICAgICAgICAgICAgICAgcHJldkN0cmxQb2ludCA9IFtkYXRhWzBdIC0gY3RybFBvaW50WzBdLCBkYXRhWzFdIC0gY3RybFBvaW50WzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgIC8vIEFwcHJveGltYXRlIHF1aWJpYyBCZXppZXIgY3VydmUgd2l0aCBtaWRkbGUgcG9pbnRzIGJldHdlZW4gY29udHJvbCBwb2ludHNcbiAgICAgICAgICAgIGFkZFBvaW50KHN1YlBhdGgsIFsuNSAqIChiYXNlUG9pbnRbMF0gKyBkYXRhWzBdKSwgLjUgKiAoYmFzZVBvaW50WzFdICsgZGF0YVsxXSldKTtcbiAgICAgICAgICAgIGFkZFBvaW50KHN1YlBhdGgsIFsuNSAqIChkYXRhWzBdICsgZGF0YVsyXSksIC41ICogKGRhdGFbMV0gKyBkYXRhWzNdKV0pO1xuICAgICAgICAgICAgYWRkUG9pbnQoc3ViUGF0aCwgWy41ICogKGRhdGFbMl0gKyBkYXRhWzRdKSwgLjUgKiAoZGF0YVszXSArIGRhdGFbNV0pXSk7XG4gICAgICAgICAgICBwcmV2Q3RybFBvaW50ID0gW2RhdGFbNF0gLSBkYXRhWzJdLCBkYXRhWzVdIC0gZGF0YVszXV07IC8vIFNhdmUgY29udHJvbCBwb2ludCBmb3Igc2hvcnRoYW5kXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUyc6XG4gICAgICAgICAgICBpZiAocHJldi5pbnN0cnVjdGlvbiA9PSAnQycgfHwgcHJldi5pbnN0cnVjdGlvbiA9PSAnUycpIHtcbiAgICAgICAgICAgICAgICBhZGRQb2ludChzdWJQYXRoLCBbYmFzZVBvaW50WzBdICsgLjUgKiBwcmV2Q3RybFBvaW50WzBdLCBiYXNlUG9pbnRbMV0gKyAuNSAqIHByZXZDdHJsUG9pbnRbMV1dKTtcbiAgICAgICAgICAgICAgICBjdHJsUG9pbnQgPSBbYmFzZVBvaW50WzBdICsgcHJldkN0cmxQb2ludFswXSwgYmFzZVBvaW50WzFdICsgcHJldkN0cmxQb2ludFsxXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRQb2ludChzdWJQYXRoLCBbLjUgKiAoY3RybFBvaW50WzBdICsgZGF0YVswXSksIC41ICogKGN0cmxQb2ludFsxXSsgZGF0YVsxXSldKTtcbiAgICAgICAgICAgIGFkZFBvaW50KHN1YlBhdGgsIFsuNSAqIChkYXRhWzBdICsgZGF0YVsyXSksIC41ICogKGRhdGFbMV0gKyBkYXRhWzNdKV0pO1xuICAgICAgICAgICAgcHJldkN0cmxQb2ludCA9IFtkYXRhWzJdIC0gZGF0YVswXSwgZGF0YVszXSAtIGRhdGFbMV1dO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgYXJjIHRvIGJlemllciBjdXJ2ZXMgYW5kIHVzZSB0aGUgc2FtZSBhcHByb3hpbWF0aW9uXG4gICAgICAgICAgICB2YXIgY3VydmVzID0gYTJjLmFwcGx5KDAsIGJhc2VQb2ludC5jb25jYXQoZGF0YSkpO1xuICAgICAgICAgICAgZm9yICh2YXIgY0RhdGE7IChjRGF0YSA9IGN1cnZlcy5zcGxpY2UoMCw2KS5tYXAodG9BYnNvbHV0ZSkpLmxlbmd0aDspIHtcbiAgICAgICAgICAgICAgICBhZGRQb2ludChzdWJQYXRoLCBbLjUgKiAoYmFzZVBvaW50WzBdICsgY0RhdGFbMF0pLCAuNSAqIChiYXNlUG9pbnRbMV0gKyBjRGF0YVsxXSldKTtcbiAgICAgICAgICAgICAgICBhZGRQb2ludChzdWJQYXRoLCBbLjUgKiAoY0RhdGFbMF0gKyBjRGF0YVsyXSksIC41ICogKGNEYXRhWzFdICsgY0RhdGFbM10pXSk7XG4gICAgICAgICAgICAgICAgYWRkUG9pbnQoc3ViUGF0aCwgWy41ICogKGNEYXRhWzJdICsgY0RhdGFbNF0pLCAuNSAqIChjRGF0YVszXSArIGNEYXRhWzVdKV0pO1xuICAgICAgICAgICAgICAgIGlmIChjdXJ2ZXMubGVuZ3RoKSBhZGRQb2ludChzdWJQYXRoLCBiYXNlUG9pbnQgPSBjRGF0YS5zbGljZSgtMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIFNhdmUgZmluYWwgY29tbWFuZCBjb29yZGluYXRlc1xuICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID49IDIpIGFkZFBvaW50KHN1YlBhdGgsIGRhdGEuc2xpY2UoLTIpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuXG4gICAgZnVuY3Rpb24gdG9BYnNvbHV0ZShuLCBpKSB7IHJldHVybiBuICsgYmFzZVBvaW50W2kgJSAyXSB9XG5cbiAgICAvLyBXcml0ZXMgZGF0YSBhYm91dCB0aGUgZXh0cmVtZSBwb2ludHMgb24gZWFjaCBheGxlXG4gICAgZnVuY3Rpb24gYWRkUG9pbnQocGF0aCwgcG9pbnQpIHtcbiAgICAgICAgaWYgKCFwYXRoLmxlbmd0aCB8fCBwb2ludFsxXSA+IHBhdGhbcGF0aC5tYXhZXVsxXSkge1xuICAgICAgICAgICAgcGF0aC5tYXhZID0gcGF0aC5sZW5ndGg7XG4gICAgICAgICAgICBwb2ludHMubWF4WSA9IHBvaW50cy5sZW5ndGggPyBNYXRoLm1heChwb2ludFsxXSwgcG9pbnRzLm1heFkpIDogcG9pbnRbMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXRoLmxlbmd0aCB8fCBwb2ludFswXSA+IHBhdGhbcGF0aC5tYXhYXVswXSkge1xuICAgICAgICAgICAgcGF0aC5tYXhYID0gcGF0aC5sZW5ndGg7XG4gICAgICAgICAgICBwb2ludHMubWF4WCA9IHBvaW50cy5sZW5ndGggPyBNYXRoLm1heChwb2ludFswXSwgcG9pbnRzLm1heFgpIDogcG9pbnRbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXRoLmxlbmd0aCB8fCBwb2ludFsxXSA8IHBhdGhbcGF0aC5taW5ZXVsxXSkge1xuICAgICAgICAgICAgcGF0aC5taW5ZID0gcGF0aC5sZW5ndGg7XG4gICAgICAgICAgICBwb2ludHMubWluWSA9IHBvaW50cy5sZW5ndGggPyBNYXRoLm1pbihwb2ludFsxXSwgcG9pbnRzLm1pblkpIDogcG9pbnRbMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXRoLmxlbmd0aCB8fCBwb2ludFswXSA8IHBhdGhbcGF0aC5taW5YXVswXSkge1xuICAgICAgICAgICAgcGF0aC5taW5YID0gcGF0aC5sZW5ndGg7XG4gICAgICAgICAgICBwb2ludHMubWluWCA9IHBvaW50cy5sZW5ndGggPyBNYXRoLm1pbihwb2ludFswXSwgcG9pbnRzLm1pblgpIDogcG9pbnRbMF07XG4gICAgICAgIH1cbiAgICAgICAgcGF0aC5wdXNoKHBvaW50KTtcbiAgICB9XG59XG5cbi8qKlxuICogRm9ybXMgYSBjb252ZXggaHVsbCBmcm9tIHNldCBvZiBwb2ludHMgb2YgZXZlcnkgc3VicGF0aCB1c2luZyBtb25vdG9uZSBjaGFpbiBjb252ZXggaHVsbCBhbGdvcml0aG0uXG4gKiBodHRwOi8vZW4ud2lraWJvb2tzLm9yZy93aWtpL0FsZ29yaXRobV9JbXBsZW1lbnRhdGlvbi9HZW9tZXRyeS9Db252ZXhfaHVsbC9Nb25vdG9uZV9jaGFpblxuICpcbiAqIEBwYXJhbSBwb2ludHMgQW4gYXJyYXkgb2YgW1gsIFldIGNvb3JkaW5hdGVzXG4gKi9cbmZ1bmN0aW9uIGNvbnZleEh1bGwocG9pbnRzKSB7XG4gICAgLyoganNoaW50IC1XMDA0ICovXG5cbiAgICBwb2ludHMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBhWzBdID09IGJbMF0gPyBhWzFdIC0gYlsxXSA6IGFbMF0gLSBiWzBdO1xuICAgIH0pO1xuXG4gICAgdmFyIGxvd2VyID0gW10sXG4gICAgICAgIG1pblkgPSAwLFxuICAgICAgICBib3R0b20gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdoaWxlIChsb3dlci5sZW5ndGggPj0gMiAmJiBjcm9zcyhsb3dlcltsb3dlci5sZW5ndGggLSAyXSwgbG93ZXJbbG93ZXIubGVuZ3RoIC0gMV0sIHBvaW50c1tpXSkgPD0gMCkge1xuICAgICAgICAgICAgbG93ZXIucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvaW50c1tpXVsxXSA8IHBvaW50c1ttaW5ZXVsxXSkge1xuICAgICAgICAgICAgbWluWSA9IGk7XG4gICAgICAgICAgICBib3R0b20gPSBsb3dlci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbG93ZXIucHVzaChwb2ludHNbaV0pO1xuICAgIH1cblxuICAgIHZhciB1cHBlciA9IFtdLFxuICAgICAgICBtYXhZID0gcG9pbnRzLmxlbmd0aCAtIDEsXG4gICAgICAgIHRvcCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHBvaW50cy5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgd2hpbGUgKHVwcGVyLmxlbmd0aCA+PSAyICYmIGNyb3NzKHVwcGVyW3VwcGVyLmxlbmd0aCAtIDJdLCB1cHBlclt1cHBlci5sZW5ndGggLSAxXSwgcG9pbnRzW2ldKSA8PSAwKSB7XG4gICAgICAgICAgICB1cHBlci5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9pbnRzW2ldWzFdID4gcG9pbnRzW21heFldWzFdKSB7XG4gICAgICAgICAgICBtYXhZID0gaTtcbiAgICAgICAgICAgIHRvcCA9IHVwcGVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB1cHBlci5wdXNoKHBvaW50c1tpXSk7XG4gICAgfVxuXG4gICAgLy8gbGFzdCBwb2ludHMgYXJlIGVxdWFsIHRvIHN0YXJ0aW5nIHBvaW50cyBvZiB0aGUgb3RoZXIgcGFydFxuICAgIHVwcGVyLnBvcCgpO1xuICAgIGxvd2VyLnBvcCgpO1xuXG4gICAgdmFyIGh1bGwgPSBsb3dlci5jb25jYXQodXBwZXIpO1xuXG4gICAgaHVsbC5taW5YID0gMDsgLy8gYnkgc29ydGluZ1xuICAgIGh1bGwubWF4WCA9IGxvd2VyLmxlbmd0aDtcbiAgICBodWxsLm1pblkgPSBib3R0b207XG4gICAgaHVsbC5tYXhZID0gKGxvd2VyLmxlbmd0aCArIHRvcCkgJSBodWxsLmxlbmd0aDtcblxuICAgIHJldHVybiBodWxsO1xufVxuXG5mdW5jdGlvbiBjcm9zcyhvLCBhLCBiKSB7XG4gICAgcmV0dXJuIChhWzBdIC0gb1swXSkgKiAoYlsxXSAtIG9bMV0pIC0gKGFbMV0gLSBvWzFdKSAqIChiWzBdIC0gb1swXSk7XG59XG5cbi8qIEJhc2VkIG9uIGNvZGUgZnJvbSBTbmFwLnN2ZyAoQXBhY2hlIDIgbGljZW5zZSkuIGh0dHA6Ly9zbmFwc3ZnLmlvL1xuICogVGhhbmtzIHRvIERtaXRyeSBCYXJhbm92c2tpeSBmb3IgaGlzIGdyZWF0IHdvcmshXG4gKi9cblxuLy8ganNoaW50IGlnbm9yZTogc3RhcnRcbmZ1bmN0aW9uIGEyYyh4MSwgeTEsIHJ4LCByeSwgYW5nbGUsIGxhcmdlX2FyY19mbGFnLCBzd2VlcF9mbGFnLCB4MiwgeTIsIHJlY3Vyc2l2ZSkge1xuICAgIC8vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9mIHdoZXJlIHRoaXMgTWF0aCBjYW1lIGZyb20gdmlzaXQ6XG4gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvaW1wbG5vdGUuaHRtbCNBcmNJbXBsZW1lbnRhdGlvbk5vdGVzXG4gICAgdmFyIF8xMjAgPSBNYXRoLlBJICogMTIwIC8gMTgwLFxuICAgICAgICByYWQgPSBNYXRoLlBJIC8gMTgwICogKCthbmdsZSB8fCAwKSxcbiAgICAgICAgcmVzID0gW10sXG4gICAgICAgIHJvdGF0ZVggPSBmdW5jdGlvbih4LCB5LCByYWQpIHsgcmV0dXJuIHggKiBNYXRoLmNvcyhyYWQpIC0geSAqIE1hdGguc2luKHJhZCkgfSxcbiAgICAgICAgcm90YXRlWSA9IGZ1bmN0aW9uKHgsIHksIHJhZCkgeyByZXR1cm4geCAqIE1hdGguc2luKHJhZCkgKyB5ICogTWF0aC5jb3MocmFkKSB9O1xuICAgIGlmICghcmVjdXJzaXZlKSB7XG4gICAgICAgIHgxID0gcm90YXRlWCh4MSwgeTEsIC1yYWQpO1xuICAgICAgICB5MSA9IHJvdGF0ZVkoeDEsIHkxLCAtcmFkKTtcbiAgICAgICAgeDIgPSByb3RhdGVYKHgyLCB5MiwgLXJhZCk7XG4gICAgICAgIHkyID0gcm90YXRlWSh4MiwgeTIsIC1yYWQpO1xuICAgICAgICB2YXIgeCA9ICh4MSAtIHgyKSAvIDIsXG4gICAgICAgICAgICB5ID0gKHkxIC0geTIpIC8gMjtcbiAgICAgICAgdmFyIGggPSAoeCAqIHgpIC8gKHJ4ICogcngpICsgKHkgKiB5KSAvIChyeSAqIHJ5KTtcbiAgICAgICAgaWYgKGggPiAxKSB7XG4gICAgICAgICAgICBoID0gTWF0aC5zcXJ0KGgpO1xuICAgICAgICAgICAgcnggPSBoICogcng7XG4gICAgICAgICAgICByeSA9IGggKiByeTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcngyID0gcnggKiByeCxcbiAgICAgICAgICAgIHJ5MiA9IHJ5ICogcnksXG4gICAgICAgICAgICBrID0gKGxhcmdlX2FyY19mbGFnID09IHN3ZWVwX2ZsYWcgPyAtMSA6IDEpICpcbiAgICAgICAgICAgICAgICBNYXRoLnNxcnQoTWF0aC5hYnMoKHJ4MiAqIHJ5MiAtIHJ4MiAqIHkgKiB5IC0gcnkyICogeCAqIHgpIC8gKHJ4MiAqIHkgKiB5ICsgcnkyICogeCAqIHgpKSksXG4gICAgICAgICAgICBjeCA9IGsgKiByeCAqIHkgLyByeSArICh4MSArIHgyKSAvIDIsXG4gICAgICAgICAgICBjeSA9IGsgKiAtcnkgKiB4IC8gcnggKyAoeTEgKyB5MikgLyAyLFxuICAgICAgICAgICAgZjEgPSBNYXRoLmFzaW4oKCh5MSAtIGN5KSAvIHJ5KS50b0ZpeGVkKDkpKSxcbiAgICAgICAgICAgIGYyID0gTWF0aC5hc2luKCgoeTIgLSBjeSkgLyByeSkudG9GaXhlZCg5KSk7XG5cbiAgICAgICAgZjEgPSB4MSA8IGN4ID8gTWF0aC5QSSAtIGYxIDogZjE7XG4gICAgICAgIGYyID0geDIgPCBjeCA/IE1hdGguUEkgLSBmMiA6IGYyO1xuICAgICAgICBmMSA8IDAgJiYgKGYxID0gTWF0aC5QSSAqIDIgKyBmMSk7XG4gICAgICAgIGYyIDwgMCAmJiAoZjIgPSBNYXRoLlBJICogMiArIGYyKTtcbiAgICAgICAgaWYgKHN3ZWVwX2ZsYWcgJiYgZjEgPiBmMikge1xuICAgICAgICAgICAgZjEgPSBmMSAtIE1hdGguUEkgKiAyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3dlZXBfZmxhZyAmJiBmMiA+IGYxKSB7XG4gICAgICAgICAgICBmMiA9IGYyIC0gTWF0aC5QSSAqIDI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmMSA9IHJlY3Vyc2l2ZVswXTtcbiAgICAgICAgZjIgPSByZWN1cnNpdmVbMV07XG4gICAgICAgIGN4ID0gcmVjdXJzaXZlWzJdO1xuICAgICAgICBjeSA9IHJlY3Vyc2l2ZVszXTtcbiAgICB9XG4gICAgdmFyIGRmID0gZjIgLSBmMTtcbiAgICBpZiAoTWF0aC5hYnMoZGYpID4gXzEyMCkge1xuICAgICAgICB2YXIgZjJvbGQgPSBmMixcbiAgICAgICAgICAgIHgyb2xkID0geDIsXG4gICAgICAgICAgICB5Mm9sZCA9IHkyO1xuICAgICAgICBmMiA9IGYxICsgXzEyMCAqIChzd2VlcF9mbGFnICYmIGYyID4gZjEgPyAxIDogLTEpO1xuICAgICAgICB4MiA9IGN4ICsgcnggKiBNYXRoLmNvcyhmMik7XG4gICAgICAgIHkyID0gY3kgKyByeSAqIE1hdGguc2luKGYyKTtcbiAgICAgICAgcmVzID0gYTJjKHgyLCB5MiwgcngsIHJ5LCBhbmdsZSwgMCwgc3dlZXBfZmxhZywgeDJvbGQsIHkyb2xkLCBbZjIsIGYyb2xkLCBjeCwgY3ldKTtcbiAgICB9XG4gICAgZGYgPSBmMiAtIGYxO1xuICAgIHZhciBjMSA9IE1hdGguY29zKGYxKSxcbiAgICAgICAgczEgPSBNYXRoLnNpbihmMSksXG4gICAgICAgIGMyID0gTWF0aC5jb3MoZjIpLFxuICAgICAgICBzMiA9IE1hdGguc2luKGYyKSxcbiAgICAgICAgdCA9IE1hdGgudGFuKGRmIC8gNCksXG4gICAgICAgIGh4ID0gNCAvIDMgKiByeCAqIHQsXG4gICAgICAgIGh5ID0gNCAvIDMgKiByeSAqIHQsXG4gICAgICAgIG0gPSBbXG4gICAgICAgICAgICAtIGh4ICogczEsIGh5ICogYzEsXG4gICAgICAgICAgICB4MiArIGh4ICogczIgLSB4MSwgeTIgLSBoeSAqIGMyIC0geTEsXG4gICAgICAgICAgICB4MiAtIHgxLCB5MiAtIHkxXG4gICAgICAgIF07XG4gICAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgICAgICByZXR1cm4gbS5jb25jYXQocmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXMgPSBtLmNvbmNhdChyZXMpO1xuICAgICAgICB2YXIgbmV3cmVzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgbmV3cmVzW2ldID0gaSAlIDIgPyByb3RhdGVZKHJlc1tpIC0gMV0sIHJlc1tpXSwgcmFkKSA6IHJvdGF0ZVgocmVzW2ldLCByZXNbaSArIDFdLCByYWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdyZXM7XG4gICAgfVxufVxuLy8ganNoaW50IGlnbm9yZTogZW5kXG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtUmV2ZXJzZSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIGVtcHR5IGNvbnRhaW5lciBlbGVtZW50cyc7XG5cbnZhciBjb250YWluZXIgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9ucycpLmVsZW1zR3JvdXBzLmNvbnRhaW5lcjtcblxuLyoqXG4gKiBSZW1vdmUgZW1wdHkgY29udGFpbmVycy5cbiAqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9pbnRyby5odG1sI1Rlcm1Db250YWluZXJFbGVtZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIDxkZWZzLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogPGc+PG1hcmtlcj48YS8+PC9tYXJrZXI+PC9nPlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIHJldHVybiAhKGl0ZW0uaXNFbGVtKGNvbnRhaW5lcikgJiYgIWl0ZW0uaXNFbGVtKCdzdmcnKSAmJiBpdGVtLmlzRW1wdHkoKSAmJlxuICAgICAgICAoIWl0ZW0uaXNFbGVtKCdwYXR0ZXJuJykgfHwgIWl0ZW0uaGFzQXR0ckxvY2FsKCdocmVmJykpKTtcblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnbWVyZ2VzIG11bHRpcGxlIHBhdGhzIGluIG9uZSBpZiBwb3NzaWJsZSc7XG5cbmV4cG9ydHMucGFyYW1zID0ge1xuICAgIGNvbGxhcHNlUmVwZWF0ZWQ6IHRydWUsXG4gICAgbGVhZGluZ1plcm86IHRydWUsXG4gICAgbmVnYXRpdmVFeHRyYVNwYWNlOiB0cnVlXG59O1xuXG52YXIgcGF0aDJqcyA9IHJlcXVpcmUoJy4vX3BhdGguanMnKS5wYXRoMmpzLFxuICAgIGpzMnBhdGggPSByZXF1aXJlKCcuL19wYXRoLmpzJykuanMycGF0aCxcbiAgICBpbnRlcnNlY3RzID0gcmVxdWlyZSgnLi9fcGF0aC5qcycpLmludGVyc2VjdHM7XG5cbi8qKlxuICogTWVyZ2UgbXVsdGlwbGUgUGF0aHMgaW50byBvbmUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEtpciBCZWxldmljaCwgTGV2IFNvbG50c2V2XG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtLCBwYXJhbXMpIHtcblxuICAgIGlmICghaXRlbS5pc0VsZW0oKSB8fCBpdGVtLmlzRW1wdHkoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHByZXZDb250ZW50SXRlbSA9IG51bGwsXG4gICAgICAgIHByZXZDb250ZW50SXRlbUtleXMgPSBudWxsO1xuXG4gICAgaXRlbS5jb250ZW50ID0gaXRlbS5jb250ZW50LmZpbHRlcihmdW5jdGlvbihjb250ZW50SXRlbSkge1xuXG4gICAgICAgIGlmIChwcmV2Q29udGVudEl0ZW0gJiZcbiAgICAgICAgICAgIHByZXZDb250ZW50SXRlbS5pc0VsZW0oJ3BhdGgnKSAmJlxuICAgICAgICAgICAgcHJldkNvbnRlbnRJdGVtLmlzRW1wdHkoKSAmJlxuICAgICAgICAgICAgcHJldkNvbnRlbnRJdGVtLmhhc0F0dHIoJ2QnKSAmJlxuICAgICAgICAgICAgY29udGVudEl0ZW0uaXNFbGVtKCdwYXRoJykgJiZcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLmlzRW1wdHkoKSAmJlxuICAgICAgICAgICAgY29udGVudEl0ZW0uaGFzQXR0cignZCcpXG4gICAgICAgICkge1xuXG4gICAgICAgICAgICBpZiAoIXByZXZDb250ZW50SXRlbUtleXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2Q29udGVudEl0ZW1LZXlzID0gT2JqZWN0LmtleXMocHJldkNvbnRlbnRJdGVtLmF0dHJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbnRlbnRJdGVtQXR0cnMgPSBPYmplY3Qua2V5cyhjb250ZW50SXRlbS5hdHRycyksXG4gICAgICAgICAgICAgICAgZXF1YWxEYXRhID0gcHJldkNvbnRlbnRJdGVtS2V5cy5sZW5ndGggPT0gY29udGVudEl0ZW1BdHRycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW1BdHRycy5ldmVyeShmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPT0gJ2QnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNvbnRlbnRJdGVtLmhhc0F0dHIoa2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDb250ZW50SXRlbS5hdHRyKGtleSkudmFsdWUgPT0gY29udGVudEl0ZW0uYXR0cihrZXkpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBwcmV2UGF0aEpTID0gcGF0aDJqcyhwcmV2Q29udGVudEl0ZW0pLFxuICAgICAgICAgICAgICAgIGN1clBhdGhKUyA9IHBhdGgyanMoY29udGVudEl0ZW0pO1xuXG4gICAgICAgICAgICBpZiAoZXF1YWxEYXRhICYmICFpbnRlcnNlY3RzKHByZXZQYXRoSlMsIGN1clBhdGhKUykpIHtcbiAgICAgICAgICAgICAgICBqczJwYXRoKHByZXZDb250ZW50SXRlbSwgcHJldlBhdGhKUy5jb25jYXQoY3VyUGF0aEpTKSwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2Q29udGVudEl0ZW0gPSBjb250ZW50SXRlbTtcbiAgICAgICAgcHJldkNvbnRlbnRJdGVtS2V5cyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgfSk7XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLnBhcmFtcyA9IHtcbiAgICByZW1vdmVBbnk6IHRydWVcbn07XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAncmVtb3ZlcyA8ZGVzYz4nO1xuXG52YXIgc3RhbmRhcmREZXNjcyA9IC9eKENyZWF0ZWQgd2l0aHxDcmVhdGVkIHVzaW5nKS87XG5cbi8qKlxuICogUmVtb3ZlcyA8ZGVzYz4uXG4gKiBSZW1vdmVzIG9ubHkgc3RhbmRhcmQgZWRpdG9ycyBjb250ZW50IG9yIGVtcHR5IGVsZW1lbnRzICdjYXVzZSBpdCBjYW4gYmUgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eS5cbiAqIEVuYWJsZSBwYXJhbWV0ZXIgJ3JlbW92ZUFueScgdG8gcmVtb3ZlIGFueSBkZXNjcmlwdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvRWxlbWVudC9kZXNjXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIERhbmllbCBXYWJ5aWNrXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtLCBwYXJhbXMpIHtcblxuICAgIHJldHVybiAhaXRlbS5pc0VsZW0oJ2Rlc2MnKSB8fCAhKHBhcmFtcy5yZW1vdmVBbnkgfHwgaXRlbS5pc0VtcHR5KCkgfHxcbiAgICAgICAgICAgIHN0YW5kYXJkRGVzY3MudGVzdChpdGVtLmNvbnRlbnRbMF0udGV4dCkpO1xuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIGRvY3R5cGUgZGVjbGFyYXRpb24nO1xuXG4vKipcbiAqIFJlbW92ZSBET0NUWVBFIGRlY2xhcmF0aW9uLlxuICpcbiAqIFwiVW5mb3J0dW5hdGVseSB0aGUgU1ZHIERURHMgYXJlIGEgc291cmNlIG9mIHNvIG1hbnlcbiAqIGlzc3VlcyB0aGF0IHRoZSBTVkcgV0cgaGFzIGRlY2lkZWQgbm90IHRvIHdyaXRlIG9uZVxuICogZm9yIHRoZSB1cGNvbWluZyBTVkcgMS4yIHN0YW5kYXJkLiBJbiBmYWN0IFNWRyBXR1xuICogbWVtYmVycyBhcmUgZXZlbiB0ZWxsaW5nIHBlb3BsZSBub3QgdG8gdXNlIGEgRE9DVFlQRVxuICogZGVjbGFyYXRpb24gaW4gU1ZHIDEuMCBhbmQgMS4xIGRvY3VtZW50c1wiXG4gKiBodHRwczovL2p3YXR0Lm9yZy9zdmcvYXV0aG9yaW5nLyNkb2N0eXBlLWRlY2xhcmF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIDwhRE9DVFlQRSBzdmcgUFVCTElDIFwiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU5cIlxuICogcVwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCI+XG4gKlxuICogQGV4YW1wbGVcbiAqIDwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOXCJcbiAqIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZFwiIFtcbiAqICAgICA8IS0tIGFuIGludGVybmFsIHN1YnNldCBjYW4gYmUgZW1iZWRkZWQgaGVyZSAtLT5cbiAqIF0+XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEtpciBCZWxldmljaFxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgaWYgKGl0ZW0uZG9jdHlwZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyc7XG5cbi8qKlxuICogUmVtb3ZlIFhNTCBQcm9jZXNzaW5nIEluc3RydWN0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICByZXR1cm4gIShpdGVtLnByb2Nlc3NpbmdpbnN0cnVjdGlvbiAmJiBpdGVtLnByb2Nlc3NpbmdpbnN0cnVjdGlvbi5uYW1lID09PSAneG1sJyk7XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgY29tbWVudHMnO1xuXG4vKipcbiAqIFJlbW92ZSBjb21tZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE1LjAuMCwgU1ZHIEV4cG9ydFxuICogUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgS2lyIEJlbGV2aWNoXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICBpZiAoaXRlbS5jb21tZW50ICYmIGl0ZW0uY29tbWVudC5jaGFyQXQoMCkgIT09ICchJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIDxtZXRhZGF0YT4nO1xuXG4vKipcbiAqIFJlbW92ZSA8bWV0YWRhdGE+LlxuICpcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9tZXRhZGF0YS5odG1sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEtpciBCZWxldmljaFxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgcmV0dXJuICFpdGVtLmlzRWxlbSgnbWV0YWRhdGEnKTtcblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IGZhbHNlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgeG1sbnMgYXR0cmlidXRlIChmb3IgaW5saW5lIHN2ZywgZGlzYWJsZWQgYnkgZGVmYXVsdCknO1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgeG1sbnMgYXR0cmlidXRlIHdoZW4gcHJlc2VudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHN2ZyB2aWV3Qm94PVwiMCAwIDEwMCA1MFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAqICAg4oaTXG4gKiA8c3ZnIHZpZXdCb3g9XCIwIDAgMTAwIDUwXCI+XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgdHJ1ZSwgeG1sbnMgd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIFJpY2FyZG8gVG9tYXNpXG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbihpdGVtKSB7XG5cbiAgICBpZiAoaXRlbS5pc0VsZW0oJ3N2ZycpICYmIGl0ZW0uaGFzQXR0cigneG1sbnMnKSkge1xuICAgICAgICBpdGVtLnJlbW92ZUF0dHIoJ3htbG5zJyk7XG4gICAgfVxuXG59OyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ2Z1bGwnO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMucGFyYW1zID0ge1xuICAgIG9ubHlNYXRjaGVkT25jZTogdHJ1ZSxcbiAgICByZW1vdmVNYXRjaGVkU2VsZWN0b3JzOiB0cnVlLFxuICAgIHVzZU1xczogWycnLCAnc2NyZWVuJ10sXG4gICAgdXNlUHNldWRvczogWycnXVxufTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdpbmxpbmUgc3R5bGVzIChhZGRpdGlvbmFsIG9wdGlvbnMpJztcblxuXG52YXIgY3NzdHJlZSA9IHJlcXVpcmUoJ2Nzcy10cmVlJyksXG4gICAgY3NzVG9vbHMgPSByZXF1aXJlKCcuLi9saWIvY3NzLXRvb2xzJyk7XG5cbi8qKlxuICogTW92ZXMgKyBtZXJnZXMgc3R5bGVzIGZyb20gc3R5bGUgZWxlbWVudHMgdG8gZWxlbWVudCBzdHlsZXNcbiAqXG4gKiBPcHRpb25zXG4gKiAgIG9ubHlNYXRjaGVkT25jZSAoZGVmYXVsdDogdHJ1ZSlcbiAqICAgICBpbmxpbmUgb25seSBzZWxlY3RvcnMgdGhhdCBtYXRjaCBvbmNlXG4gKlxuICogICByZW1vdmVNYXRjaGVkU2VsZWN0b3JzIChkZWZhdWx0OiB0cnVlKVxuICogICAgIGNsZWFuIHVwIG1hdGNoZWQgc2VsZWN0b3JzLFxuICogICAgIGxlYXZlIHNlbGVjdG9ycyB0aGF0IGhhZG4ndCBtYXRjaGVkXG4gKlxuICogICB1c2VNcXMgKGRlZmF1bHQ6IFsnJywgJ3NjcmVlbiddKVxuICogICAgIHdoYXQgbWVkaWEgcXVlcmllcyB0byBiZSB1c2VkXG4gKiAgICAgZW1wdHkgc3RyaW5nIGVsZW1lbnQgZm9yIHN0eWxlcyBvdXRzaWRlIG1lZGlhIHF1ZXJpZXNcbiAqXG4gKiAgIHVzZVBzZXVkb3MgKGRlZmF1bHQ6IFsnJ10pXG4gKiAgICAgd2hhdCBwc2V1ZG8tY2xhc3Nlcy8tZWxlbWVudHMgdG8gYmUgdXNlZFxuICogICAgIGVtcHR5IHN0cmluZyBlbGVtZW50IGZvciBhbGwgbm9uLXBzZXVkby1jbGFzc2VzIGFuZC9vciAtZWxlbWVudHNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZG9jdW1lbnQgZG9jdW1lbnQgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgcGx1Z2luIHBhcmFtc1xuICpcbiAqIEBhdXRob3Igc3RyYXJzaXMgPHN0cmFyc2lzQGdtYWlsLmNvbT5cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGRvY3VtZW50LCBvcHRzKSB7XG5cbiAgICAvLyBjb2xsZWN0IDxzdHlsZS8+c1xuICAgIHZhciBzdHlsZUVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7XG5cbiAgICAvL25vIDxzdHlsZXMvPnMsIG5vdGhpbmcgdG8gZG9cbiAgICBpZiAoc3R5bGVFbHMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cblxuICAgIHZhciBzdHlsZXMgPSBbXSxcbiAgICAgICAgc2VsZWN0b3JzID0gW107XG5cbiAgICBmb3IgKHZhciBzdHlsZUVsIG9mIHN0eWxlRWxzKSB7XG4gICAgICAgIGlmIChzdHlsZUVsLmlzRW1wdHkoKSB8fCBzdHlsZUVsLmNsb3Nlc3RFbGVtKCdmb3JlaWduT2JqZWN0JykpIHtcbiAgICAgICAgICAgIC8vIHNraXAgZW1wdHkgPHN0eWxlLz5zIG9yIDxmb3JlaWduT2JqZWN0PiBjb250ZW50LlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3NzU3RyID0gY3NzVG9vbHMuZ2V0Q3NzU3RyKHN0eWxlRWwpO1xuXG4gICAgICAgIC8vIGNvbGxlY3QgPHN0eWxlLz5zIGFuZCB0aGVpciBjc3MgYXN0XG4gICAgICAgIHZhciBjc3NBc3QgPSB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNzc0FzdCA9IGNzc3RyZWUucGFyc2UoY3NzU3RyLCB7XG4gICAgICAgICAgICAgICAgcGFyc2VWYWx1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgcGFyc2VDdXN0b21Qcm9wZXJ0eTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ1dhcm5pbmc6IFBhcnNlIGVycm9yIG9mIHN0eWxlcyBvZiA8c3R5bGUvPiBlbGVtZW50LCBza2lwcGVkLiBFcnJvciBkZXRhaWxzOiAnICsgcGFyc2VFcnJvcik7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgICAgIHN0eWxlRWw6IHN0eWxlRWwsXG4gICAgICAgICAgICBjc3NBc3Q6IGNzc0FzdFxuICAgICAgICB9KTtcblxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMuY29uY2F0KGNzc1Rvb2xzLmZsYXR0ZW5Ub1NlbGVjdG9ycyhjc3NBc3QpKTtcbiAgICB9XG5cblxuICAgIC8vIGZpbHRlciBmb3IgbWVkaWFxdWVyaWVzIHRvIGJlIHVzZWQgb3Igd2l0aG91dCBhbnkgbWVkaWFxdWVyeVxuICAgIHZhciBzZWxlY3RvcnNNcSA9IGNzc1Rvb2xzLmZpbHRlckJ5TXFzKHNlbGVjdG9ycywgb3B0cy51c2VNcXMpO1xuXG5cbiAgICAvLyBmaWx0ZXIgZm9yIHBzZXVkbyBlbGVtZW50cyB0byBiZSB1c2VkXG4gICAgdmFyIHNlbGVjdG9yc1BzZXVkbyA9IGNzc1Rvb2xzLmZpbHRlckJ5UHNldWRvcyhzZWxlY3RvcnNNcSwgb3B0cy51c2VQc2V1ZG9zKTtcblxuICAgIC8vIHJlbW92ZSBQc2V1ZG9DbGFzcyBmcm9tIGl0cyBTaW1wbGVTZWxlY3RvciBmb3IgcHJvcGVyIG1hdGNoaW5nXG4gICAgY3NzVG9vbHMuY2xlYW5Qc2V1ZG9zKHNlbGVjdG9yc1BzZXVkbyk7XG5cblxuICAgIC8vIHN0YWJsZSBzb3J0IHNlbGVjdG9yc1xuICAgIHZhciBzb3J0ZWRTZWxlY3RvcnMgPSBjc3NUb29scy5zb3J0U2VsZWN0b3JzKHNlbGVjdG9yc1BzZXVkbykucmV2ZXJzZSgpO1xuXG5cbiAgICB2YXIgc2VsZWN0b3IsXG4gICAgICAgIHNlbGVjdGVkRWw7XG5cbiAgICAvLyBtYXRjaCBzZWxlY3RvcnNcbiAgICBmb3IgKHNlbGVjdG9yIG9mIHNvcnRlZFNlbGVjdG9ycykge1xuICAgICAgICB2YXIgc2VsZWN0b3JTdHIgPSBjc3N0cmVlLnRyYW5zbGF0ZShzZWxlY3Rvci5pdGVtLmRhdGEpLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbHMgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWxlY3RlZEVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JTdHIpO1xuICAgICAgICB9IGNhdGNoIChzZWxlY3RFcnJvcikge1xuICAgICAgICAgICAgaWYgKHNlbGVjdEVycm9yLmNvbnN0cnVjdG9yID09PSBTeW50YXhFcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignV2FybmluZzogU3ludGF4IGVycm9yIHdoZW4gdHJ5aW5nIHRvIHNlbGVjdCBcXG5cXG4nICsgc2VsZWN0b3JTdHIgKyAnXFxuXFxuLCBza2lwcGVkLiBFcnJvciBkZXRhaWxzOiAnICsgc2VsZWN0RXJyb3IpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgc2VsZWN0RXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRFbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgc2VsZWN0ZWRcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0b3Iuc2VsZWN0ZWRFbHMgPSBzZWxlY3RlZEVscztcbiAgICB9XG5cblxuICAgIC8vIGFwcGx5IDxzdHlsZS8+IHN0eWxlcyB0byBtYXRjaGVkIGVsZW1lbnRzXG4gICAgZm9yIChzZWxlY3RvciBvZiBzb3J0ZWRTZWxlY3RvcnMpIHtcbiAgICAgICAgaWYoIXNlbGVjdG9yLnNlbGVjdGVkRWxzKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLm9ubHlNYXRjaGVkT25jZSAmJiBzZWxlY3Rvci5zZWxlY3RlZEVscyAhPT0gbnVsbCAmJiBzZWxlY3Rvci5zZWxlY3RlZEVscy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBza2lwIHNlbGVjdG9ycyB0aGF0IG1hdGNoIG1vcmUgdGhhbiBvbmNlIGlmIG9wdGlvbiBvbmx5TWF0Y2hlZE9uY2UgaXMgZW5hYmxlZFxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBseSA8c3R5bGUvPiB0byBtYXRjaGVkIGVsZW1lbnRzXG4gICAgICAgIGZvciAoc2VsZWN0ZWRFbCBvZiBzZWxlY3Rvci5zZWxlY3RlZEVscykge1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yLnJ1bGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbWVyZ2UgZGVjbGFyYXRpb25zXG4gICAgICAgICAgICBjc3N0cmVlLndhbGtEZWNsYXJhdGlvbnMoc2VsZWN0b3IucnVsZSwgZnVuY3Rpb24oc3R5bGVDc3N0cmVlRGVjbGFyYXRpb24pIHtcblxuICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGlubGluZSBzdHlsZXMgaGF2ZSBoaWdoZXIgcHJpb3JpdHlcbiAgICAgICAgICAgICAgICAvLyBubyBpbmxpbmUgc3R5bGVzLCBleHRlcm5hbCBzdHlsZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgc3R5bGVzIHVzZWRcbiAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3R5bGVzLCAgICBleHRlcm5hbCBzdHlsZXMgc2FtZSAgIHByaW9yaXR5IGFzIGlubGluZSBzdHlsZXMsICAgaW5saW5lICAgc3R5bGVzIHVzZWRcbiAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3R5bGVzLCAgICBleHRlcm5hbCBzdHlsZXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gaW5saW5lIHN0eWxlcywgZXh0ZXJuYWwgc3R5bGVzIHVzZWRcbiAgICAgICAgICAgICAgICB2YXIgc3R5bGVEZWNsYXJhdGlvbiA9IGNzc1Rvb2xzLmNzc3RyZWVUb1N0eWxlRGVjbGFyYXRpb24oc3R5bGVDc3N0cmVlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVEZWNsYXJhdGlvbi5uYW1lKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsLnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoc3R5bGVEZWNsYXJhdGlvbi5uYW1lKSA+PSBzdHlsZURlY2xhcmF0aW9uLnByaW9yaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZURlY2xhcmF0aW9uLm5hbWUsIHN0eWxlRGVjbGFyYXRpb24udmFsdWUsIHN0eWxlRGVjbGFyYXRpb24ucHJpb3JpdHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0cy5yZW1vdmVNYXRjaGVkU2VsZWN0b3JzICYmIHNlbGVjdG9yLnNlbGVjdGVkRWxzICE9PSBudWxsICYmIHNlbGVjdG9yLnNlbGVjdGVkRWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIGNsZWFuIHVwIG1hdGNoaW5nIHNpbXBsZSBzZWxlY3RvcnMgaWYgb3B0aW9uIHJlbW92ZU1hdGNoZWRTZWxlY3RvcnMgaXMgZW5hYmxlZFxuICAgICAgICAgICAgc2VsZWN0b3IucnVsZS5wcmVsdWRlLmNoaWxkcmVuLnJlbW92ZShzZWxlY3Rvci5pdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgaWYgKCFvcHRzLnJlbW92ZU1hdGNoZWRTZWxlY3RvcnMpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50OyAvLyBubyBmdXJ0aGVyIHByb2Nlc3NpbmcgcmVxdWlyZWRcbiAgICB9XG5cblxuICAgIC8vIGNsZWFuIHVwIG1hdGNoZWQgY2xhc3MgKyBJRCBhdHRyaWJ1dGUgdmFsdWVzXG4gICAgZm9yIChzZWxlY3RvciBvZiBzb3J0ZWRTZWxlY3RvcnMpIHtcbiAgICAgICAgaWYoIXNlbGVjdG9yLnNlbGVjdGVkRWxzKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLm9ubHlNYXRjaGVkT25jZSAmJiBzZWxlY3Rvci5zZWxlY3RlZEVscyAhPT0gbnVsbCAmJiBzZWxlY3Rvci5zZWxlY3RlZEVscy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBza2lwIHNlbGVjdG9ycyB0aGF0IG1hdGNoIG1vcmUgdGhhbiBvbmNlIGlmIG9wdGlvbiBvbmx5TWF0Y2hlZE9uY2UgaXMgZW5hYmxlZFxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHNlbGVjdGVkRWwgb2Ygc2VsZWN0b3Iuc2VsZWN0ZWRFbHMpIHtcbiAgICAgICAgICAgIC8vIGNsYXNzXG4gICAgICAgICAgICB2YXIgZmlyc3RTdWJTZWxlY3RvciA9IHNlbGVjdG9yLml0ZW0uZGF0YS5jaGlsZHJlbi5maXJzdCgpO1xuICAgICAgICAgICAgaWYoZmlyc3RTdWJTZWxlY3Rvci50eXBlID09PSAnQ2xhc3NTZWxlY3RvcicpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsLmNsYXNzLnJlbW92ZShmaXJzdFN1YlNlbGVjdG9yLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2xlYW4gdXAgbm93IGVtcHR5IGNsYXNzIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmKHR5cGVvZiBzZWxlY3RlZEVsLmNsYXNzLml0ZW0oMCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbC5yZW1vdmVBdHRyKCdjbGFzcycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJRFxuICAgICAgICAgICAgaWYoZmlyc3RTdWJTZWxlY3Rvci50eXBlID09PSAnSWRTZWxlY3RvcicpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsLnJlbW92ZUF0dHIoJ2lkJywgZmlyc3RTdWJTZWxlY3Rvci5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gY2xlYW4gdXAgbm93IGVtcHR5IGVsZW1lbnRzXG4gICAgZm9yICh2YXIgc3R5bGUgb2Ygc3R5bGVzKSB7XG4gICAgICAgIGNzc3RyZWUud2Fsa1J1bGVzKHN0eWxlLmNzc0FzdCwgZnVuY3Rpb24obm9kZSwgaXRlbSwgbGlzdCkge1xuICAgICAgICAgICAgLy8gY2xlYW4gdXAgPHN0eWxlLz4gYXRydWxlcyB3aXRob3V0IGFueSBydWxlc2V0cyBsZWZ0XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQXRydWxlJyAmJlxuICAgICAgICAgICAgICAgIC8vIG9ubHkgQXRydWxlcyBjb250YWluaW5nIHJ1bGVzZXRzXG4gICAgICAgICAgICAgICAgbm9kZS5ibG9jayAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIG5vZGUuYmxvY2suY2hpbGRyZW4uaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjbGVhbiB1cCA8c3R5bGUvPiBydWxlc2V0cyB3aXRob3V0IGFueSBjc3Mgc2VsZWN0b3JzIGxlZnRcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdSdWxlJyAmJlxuICAgICAgICAgICAgICAgIG5vZGUucHJlbHVkZS5jaGlsZHJlbi5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBpZiAoc3R5bGUuY3NzQXN0LmNoaWxkcmVuLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgLy8gY2xlYW4gdXAgbm93IGVtdHB5IDxzdHlsZS8+c1xuICAgICAgICAgICAgdmFyIHN0eWxlUGFyZW50RWwgPSBzdHlsZS5zdHlsZUVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBzdHlsZVBhcmVudEVsLnNwbGljZUNvbnRlbnQoc3R5bGVQYXJlbnRFbC5jb250ZW50LmluZGV4T2Yoc3R5bGUuc3R5bGVFbCksIDEpO1xuXG4gICAgICAgICAgICBpZiAoc3R5bGVQYXJlbnRFbC5lbGVtID09PSAnZGVmcycgJiZcbiAgICAgICAgICAgICAgICBzdHlsZVBhcmVudEVsLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYWxzbyBjbGVhbiB1cCBub3cgZW1wdHkgPGRlZi8+c1xuICAgICAgICAgICAgICAgIHZhciBkZWZzUGFyZW50RWwgPSBzdHlsZVBhcmVudEVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgZGVmc1BhcmVudEVsLnNwbGljZUNvbnRlbnQoZGVmc1BhcmVudEVsLmNvbnRlbnQuaW5kZXhPZihzdHlsZVBhcmVudEVsKSwgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB1cGRhdGUgZXhpc3RpbmcsIGxlZnQgb3ZlciA8c3R5bGU+c1xuICAgICAgICBjc3NUb29scy5zZXRDc3NTdHIoc3R5bGUuc3R5bGVFbCwgY3NzdHJlZS50cmFuc2xhdGUoc3R5bGUuY3NzQXN0KSk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gZmFsc2U7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAncmVtb3ZlcyByYXN0ZXIgaW1hZ2VzIChkaXNhYmxlZCBieSBkZWZhdWx0KSc7XG5cbi8qKlxuICogUmVtb3ZlIHJhc3RlciBpbWFnZXMgcmVmZXJlbmNlcyBpbiA8aW1hZ2U+LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzNTQ4XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEtpciBCZWxldmljaFxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgaWYgKFxuICAgICAgICBpdGVtLmlzRWxlbSgnaW1hZ2UnKSAmJlxuICAgICAgICBpdGVtLmhhc0F0dHJMb2NhbCgnaHJlZicsIC8oXFwufGltYWdlXFwvKShqcGd8cG5nfGdpZikvKVxuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAnZnVsbCc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmUgb3IgY2xlYW51cCBlbmFibGUtYmFja2dyb3VuZCBhdHRyaWJ1dGUgd2hlbiBwb3NzaWJsZSc7XG5cbi8qKlxuICogUmVtb3ZlIG9yIGNsZWFudXAgZW5hYmxlLWJhY2tncm91bmQgYXR0ciB3aGljaCBjb2luY2lkZXMgd2l0aCBhIHdpZHRoL2hlaWdodCBib3guXG4gKlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvZmlsdGVycy5odG1sI0VuYWJsZUJhY2tncm91bmRQcm9wZXJ0eVxuICpcbiAqIEBleGFtcGxlXG4gKiA8c3ZnIHdpZHRoPVwiMTAwXCIgaGVpZ2h0PVwiNTBcIiBlbmFibGUtYmFja2dyb3VuZD1cIm5ldyAwIDAgMTAwIDUwXCI+XG4gKiAgICAgICAgICAgICDirIdcbiAqIDxzdmcgd2lkdGg9XCIxMDBcIiBoZWlnaHQ9XCI1MFwiPlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGRhdGEpIHtcblxuICAgIHZhciByZWdFbmFibGVCYWNrZ3JvdW5kID0gL15uZXdcXHMwXFxzMFxccyhbXFwtK10/XFxkKlxcLj9cXGQrKFtlRV1bXFwtK10/XFxkKyk/KVxccyhbXFwtK10/XFxkKlxcLj9cXGQrKFtlRV1bXFwtK10/XFxkKyk/KSQvLFxuICAgICAgICBoYXNGaWx0ZXIgPSBmYWxzZSxcbiAgICAgICAgZWxlbXMgPSBbJ3N2ZycsICdtYXNrJywgJ3BhdHRlcm4nXTtcblxuICAgIGZ1bmN0aW9uIGNoZWNrRW5hYmxlQmFja2dyb3VuZChpdGVtKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGl0ZW0uaXNFbGVtKGVsZW1zKSAmJlxuICAgICAgICAgICAgaXRlbS5oYXNBdHRyKCdlbmFibGUtYmFja2dyb3VuZCcpICYmXG4gICAgICAgICAgICBpdGVtLmhhc0F0dHIoJ3dpZHRoJykgJiZcbiAgICAgICAgICAgIGl0ZW0uaGFzQXR0cignaGVpZ2h0JylcbiAgICAgICAgKSB7XG5cbiAgICAgICAgICAgIHZhciBtYXRjaCA9IGl0ZW0uYXR0cignZW5hYmxlLWJhY2tncm91bmQnKS52YWx1ZS5tYXRjaChyZWdFbmFibGVCYWNrZ3JvdW5kKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmF0dHIoJ3dpZHRoJykudmFsdWUgPT09IG1hdGNoWzFdICYmXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYXR0cignaGVpZ2h0JykudmFsdWUgPT09IG1hdGNoWzNdXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRWxlbSgnc3ZnJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cignZW5hYmxlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXR0cignZW5hYmxlLWJhY2tncm91bmQnKS52YWx1ZSA9ICduZXcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ZvckZpbHRlcihpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtLmlzRWxlbSgnZmlsdGVyJykpIHtcbiAgICAgICAgICAgIGhhc0ZpbHRlciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb25rZXlzKGl0ZW1zLCBmbikge1xuICAgICAgICBpdGVtcy5jb250ZW50LmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgZm4oaXRlbSk7XG5cbiAgICAgICAgICAgIGlmIChpdGVtLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBtb25rZXlzKGl0ZW0sIGZuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RTdGVwID0gbW9ua2V5cyhkYXRhLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIGNoZWNrRW5hYmxlQmFja2dyb3VuZChpdGVtKTtcbiAgICAgICAgaWYgKCFoYXNGaWx0ZXIpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yRmlsdGVyKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFzRmlsdGVyID8gZmlyc3RTdGVwIDogbW9ua2V5cyhmaXJzdFN0ZXAsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgIC8vd2UgZG9uJ3QgbmVlZCAnZW5hYmxlLWJhY2tncm91bmQnIGlmIHdlIGhhdmUgbm8gZmlsdGVyc1xuICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyKCdlbmFibGUtYmFja2dyb3VuZCcpO1xuICAgICAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgZW1wdHkgPHRleHQ+IGVsZW1lbnRzJztcblxuZXhwb3J0cy5wYXJhbXMgPSB7XG4gICAgdGV4dDogdHJ1ZSxcbiAgICB0c3BhbjogdHJ1ZSxcbiAgICB0cmVmOiB0cnVlXG59O1xuXG4vKipcbiAqIFJlbW92ZSBlbXB0eSBUZXh0IGVsZW1lbnRzLlxuICpcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL3RleHQuaHRtbFxuICpcbiAqIEBleGFtcGxlXG4gKiBSZW1vdmUgZW1wdHkgdGV4dCBlbGVtZW50OlxuICogPHRleHQvPlxuICpcbiAqIFJlbW92ZSBlbXB0eSB0c3BhbiBlbGVtZW50OlxuICogPHRzcGFuLz5cbiAqXG4gKiBSZW1vdmUgdHJlZiB3aXRoIGVtcHR5IHhsaW5rOmhyZWYgYXR0cmlidXRlOlxuICogPHRyZWYgeGxpbms6aHJlZj1cIlwiLz5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHBsdWdpbiBwYXJhbXNcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0sIHBhcmFtcykge1xuXG4gICAgLy8gUmVtb3ZlIGVtcHR5IHRleHQgZWxlbWVudFxuICAgIGlmIChcbiAgICAgICAgcGFyYW1zLnRleHQgJiZcbiAgICAgICAgaXRlbS5pc0VsZW0oJ3RleHQnKSAmJlxuICAgICAgICBpdGVtLmlzRW1wdHkoKVxuICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVtb3ZlIGVtcHR5IHRzcGFuIGVsZW1lbnRcbiAgICBpZiAoXG4gICAgICAgIHBhcmFtcy50c3BhbiAmJlxuICAgICAgICBpdGVtLmlzRWxlbSgndHNwYW4nKSAmJlxuICAgICAgICBpdGVtLmlzRW1wdHkoKVxuICAgICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVtb3ZlIHRyZWYgd2l0aCBlbXB0eSB4bGluazpocmVmIGF0dHJpYnV0ZVxuICAgIGlmIChcbiAgICAgICAgcGFyYW1zLnRyZWYgJiZcbiAgICAgICAgaXRlbS5pc0VsZW0oJ3RyZWYnKSAmJlxuICAgICAgICAhaXRlbS5oYXNBdHRyTG9jYWwoJ2hyZWYnKVxuICAgICkgcmV0dXJuIGZhbHNlO1xuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIGVtcHR5IGF0dHJpYnV0ZXMnO1xuXG4vKipcbiAqIFJlbW92ZSBhdHRyaWJ1dGVzIHdpdGggZW1wdHkgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIGlmIChpdGVtLmVsZW0pIHtcblxuICAgICAgICBpdGVtLmVhY2hBdHRyKGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgICAgICAgIGlmIChhdHRyLnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cihhdHRyLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH1cblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ2Z1bGwnO1xuXG5leHBvcnRzLmFjdGl2ZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAncmVtb3ZlcyB1bnVzZWQgbmFtZXNwYWNlcyBkZWNsYXJhdGlvbic7XG5cbi8qKlxuICogUmVtb3ZlIHVudXNlZCBuYW1lc3BhY2VzIGRlY2xhcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBLaXIgQmVsZXZpY2hcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGRhdGEpIHtcblxuICAgIHZhciBzdmdFbGVtLFxuICAgICAgICB4bWxuc0NvbGxlY3Rpb24gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBuYW1lc3BhY2UgZnJvbSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5zIG5hbWVzY2FwZSBuYW1lXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTlNmcm9tQ29sbGVjdGlvbihucykge1xuXG4gICAgICAgIHZhciBwb3MgPSB4bWxuc0NvbGxlY3Rpb24uaW5kZXhPZihucyk7XG5cbiAgICAgICAgLy8gaWYgZm91bmQgLSByZW1vdmUgbnMgZnJvbSB0aGUgbmFtZXNwYWNlcyBjb2xsZWN0aW9uXG4gICAgICAgIGlmIChwb3MgPiAtMSkge1xuICAgICAgICAgICAgeG1sbnNDb2xsZWN0aW9uLnNwbGljZShwb3MsIDEpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCYW5hbmFzIVxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gaXRlbXMgaW5wdXQgaXRlbXNcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBvdXRwdXQgaXRlbXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtb25rZXlzKGl0ZW1zKSB7XG5cbiAgICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgICAgbGVuZ3RoID0gaXRlbXMuY29udGVudC5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUoaSA8IGxlbmd0aCkge1xuXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zLmNvbnRlbnRbaV07XG5cbiAgICAgICAgICAgIGlmIChpdGVtLmlzRWxlbSgnc3ZnJykpIHtcblxuICAgICAgICAgICAgICAgIGl0ZW0uZWFjaEF0dHIoZnVuY3Rpb24oYXR0cikge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IG5hbWVzcGFjZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnICYmIGF0dHIubG9jYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zQ29sbGVjdGlvbi5wdXNoKGF0dHIubG9jYWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBzdmcgZWxlbWVudCBoYXMgbnMtYXR0clxuICAgICAgICAgICAgICAgIGlmICh4bWxuc0NvbGxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgc3ZnIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgc3ZnRWxlbSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHhtbG5zQ29sbGVjdGlvbi5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0ZW0gZm9yIHRoZSBucy1hdHRyc1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnByZWZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVOU2Zyb21Db2xsZWN0aW9uKGl0ZW0ucHJlZml4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBlYWNoIGF0dHIgZm9yIHRoZSBucy1hdHRyc1xuICAgICAgICAgICAgICAgIGl0ZW0uZWFjaEF0dHIoZnVuY3Rpb24oYXR0cikge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVOU2Zyb21Db2xsZWN0aW9uKGF0dHIucHJlZml4KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBub3RoaW5nIGlzIGZvdW5kIC0gZ28gZGVlcGVyXG4gICAgICAgICAgICBpZiAoeG1sbnNDb2xsZWN0aW9uLmxlbmd0aCAmJiBpdGVtLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBtb25rZXlzKGl0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpKys7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtcztcblxuICAgIH1cblxuICAgIGRhdGEgPSBtb25rZXlzKGRhdGEpO1xuXG4gICAgLy8gcmVtb3ZlIHN2ZyBlbGVtZW50IG5zLWF0dHJpYnV0ZXMgaWYgdGhleSBhcmUgbm90IHVzZWQgZXZlbiBvbmNlXG4gICAgaWYgKHhtbG5zQ29sbGVjdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgeG1sbnNDb2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgc3ZnRWxlbS5yZW1vdmVBdHRyKCd4bWxuczonICsgbmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnR5cGUgPSAncGVySXRlbSc7XG5cbmV4cG9ydHMuYWN0aXZlID0gZmFsc2U7XG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSAnc29ydHMgZWxlbWVudCBhdHRyaWJ1dGVzIChkaXNhYmxlZCBieSBkZWZhdWx0KSc7XG5cbmV4cG9ydHMucGFyYW1zID0ge1xuXHRvcmRlcjogW1xuXHRcdCdpZCcsXG5cdFx0J3dpZHRoJywgJ2hlaWdodCcsXG5cdFx0J3gnLCAneDEnLCAneDInLFxuXHRcdCd5JywgJ3kxJywgJ3kyJyxcblx0XHQnY3gnLCAnY3knLCAncicsXG5cdFx0J2ZpbGwnLCAnc3Ryb2tlJywgJ21hcmtlcicsXG5cdFx0J2QnLCAncG9pbnRzJ1xuXHRdXG59O1xuXG4vKipcbiAqIFNvcnQgZWxlbWVudCBhdHRyaWJ1dGVzIGZvciBlcGljIHJlYWRhYmlsaXR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgcGx1Z2luIHBhcmFtc1xuICpcbiAqIEBhdXRob3IgTmlrb2xheSBGcmFudHNldlxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSwgcGFyYW1zKSB7XG5cblx0dmFyIGF0dHJzID0gW10sXG5cdFx0c29ydGVkID0ge30sXG5cdFx0b3JkZXJsZW4gPSBwYXJhbXMub3JkZXIubGVuZ3RoICsgMTtcblxuXHRpZiAoaXRlbS5lbGVtKSB7XG5cblx0XHRpdGVtLmVhY2hBdHRyKGZ1bmN0aW9uKGF0dHIpIHtcblx0XHRcdGF0dHJzLnB1c2goYXR0cik7XG5cdFx0fSk7XG5cblx0XHRhdHRycy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdGlmIChhLnByZWZpeCAhPSBiLnByZWZpeCkge1xuXHRcdFx0XHQvLyB4bWxucyBhdHRyaWJ1dGVzIGltcGxpY2l0bHkgaGF2ZSB0aGUgcHJlZml4IHhtbG5zXG5cdFx0XHRcdGlmIChhLnByZWZpeCA9PSAneG1sbnMnKVxuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0aWYgKGIucHJlZml4ID09ICd4bWxucycpXG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdHJldHVybiBhLnByZWZpeCA8IGIucHJlZml4ID8gLTEgOiAxO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYWluZGV4ID0gb3JkZXJsZW47XG5cdFx0XHR2YXIgYmluZGV4ID0gb3JkZXJsZW47XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLm9yZGVyLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChhLm5hbWUgPT0gcGFyYW1zLm9yZGVyW2ldKSB7XG5cdFx0XHRcdFx0YWluZGV4ID0gaTtcblx0XHRcdFx0fSBlbHNlIGlmIChhLm5hbWUuaW5kZXhPZihwYXJhbXMub3JkZXJbaV0gKyAnLScpID09PSAwKSB7XG5cdFx0XHRcdFx0YWluZGV4ID0gaSArIC41O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChiLm5hbWUgPT0gcGFyYW1zLm9yZGVyW2ldKSB7XG5cdFx0XHRcdFx0YmluZGV4ID0gaTtcblx0XHRcdFx0fSBlbHNlIGlmIChiLm5hbWUuaW5kZXhPZihwYXJhbXMub3JkZXJbaV0gKyAnLScpID09PSAwKSB7XG5cdFx0XHRcdFx0YmluZGV4ID0gaSArIC41O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhaW5kZXggIT0gYmluZGV4KSB7XG5cdFx0XHRcdHJldHVybiBhaW5kZXggLSBiaW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxO1xuXHRcdH0pO1xuXG5cdFx0YXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuXHRcdFx0c29ydGVkW2F0dHIubmFtZV0gPSBhdHRyO1xuXHRcdH0pO1xuXG5cdFx0aXRlbS5hdHRycyA9IHNvcnRlZDtcblxuXHR9XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSB0cnVlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgPHRpdGxlPic7XG5cbi8qKlxuICogUmVtb3ZlIDx0aXRsZT4uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0VsZW1lbnQvdGl0bGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiBmYWxzZSwgaXRlbSB3aWxsIGJlIGZpbHRlcmVkIG91dFxuICpcbiAqIEBhdXRob3IgSWdvciBLYWxhc2huaWtvdlxuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgcmV0dXJuICFpdGVtLmlzRWxlbSgndGl0bGUnKTtcblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IGZhbHNlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgd2lkdGggYW5kIGhlaWdodCBpbiBwcmVzZW5jZSBvZiB2aWV3Qm94IChvcHBvc2l0ZSB0byByZW1vdmVWaWV3Qm94LCBkaXNhYmxlIGl0IGZpcnN0KSc7XG5cbi8qKlxuICogUmVtb3ZlIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHdoZW4gYSB2aWV3Qm94IGF0dHJpYnV0ZSBpcyBwcmVzZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiA8c3ZnIHdpZHRoPVwiMTAwXCIgaGVpZ2h0PVwiNTBcIiB2aWV3Qm94PVwiMCAwIDEwMCA1MFwiPlxuICogICDihpNcbiAqIDxzdmcgdmlld0JveD1cIjAgMCAxMDAgNTBcIj5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSBjdXJyZW50IGl0ZXJhdGlvbiBpdGVtXG4gKiBAcmV0dXJuIHtCb29sZWFufSBpZiB0cnVlLCB3aXRoIGFuZCBoZWlnaHQgd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEJlbm55IFNjaHVkZWxcbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIGlmIChcbiAgICAgICAgaXRlbS5pc0VsZW0oJ3N2ZycpICYmXG4gICAgICAgIGl0ZW0uaGFzQXR0cigndmlld0JveCcpXG4gICAgKSB7XG4gICAgICAgIGl0ZW0ucmVtb3ZlQXR0cignd2lkdGgnKTtcbiAgICAgICAgaXRlbS5yZW1vdmVBdHRyKCdoZWlnaHQnKTtcbiAgICB9XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMudHlwZSA9ICdwZXJJdGVtJztcblxuZXhwb3J0cy5hY3RpdmUgPSBmYWxzZTtcblxuZXhwb3J0cy5kZXNjcmlwdGlvbiA9ICdyZW1vdmVzIDxzdHlsZT4gZWxlbWVudCAoZGlzYWJsZWQgYnkgZGVmYXVsdCknO1xuXG4vKipcbiAqIFJlbW92ZSA8c3R5bGU+LlxuICpcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zdHlsaW5nLmh0bWwjU3R5bGVFbGVtZW50XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gY3VycmVudCBpdGVyYXRpb24gaXRlbVxuICogQHJldHVybiB7Qm9vbGVhbn0gaWYgZmFsc2UsIGl0ZW0gd2lsbCBiZSBmaWx0ZXJlZCBvdXRcbiAqXG4gKiBAYXV0aG9yIEJldHN5IER1cHVpc1xuICovXG5leHBvcnRzLmZuID0gZnVuY3Rpb24oaXRlbSkge1xuXG4gICAgcmV0dXJuICFpdGVtLmlzRWxlbSgnc3R5bGUnKTtcblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50eXBlID0gJ3Blckl0ZW0nO1xuXG5leHBvcnRzLmFjdGl2ZSA9IGZhbHNlO1xuXG5leHBvcnRzLmRlc2NyaXB0aW9uID0gJ3JlbW92ZXMgPHNjcmlwdD4gZWxlbWVudHMgKGRpc2FibGVkIGJ5IGRlZmF1bHQpJztcblxuLyoqXG4gKiBSZW1vdmUgPHNjcmlwdD4uXG4gKlxuICogaHR0cHM6Ly93d3cudzMub3JnL1RSL1NWRy9zY3JpcHQuaHRtbFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIGN1cnJlbnQgaXRlcmF0aW9uIGl0ZW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlmIGZhbHNlLCBpdGVtIHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gKlxuICogQGF1dGhvciBQYXRyaWNrIEtsaW5nZW1hbm5cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIHJldHVybiAhaXRlbS5pc0VsZW0oJ3NjcmlwdCcpO1xuXG59O1xuIl0sIm5hbWVzIjpbImluaXQiLCJjYWxsIiwiX21heExpc3RlbmVycyIsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLCJsZW5ndGgiLCJhcHBseSIsIlR5cGVFcnJvciIsIl9ldmVudHMiLCJuZXdMaXN0ZW5lciIsImVtaXQiLCJsaXN0ZW5lciIsIl9ldmVudHNDb3VudCIsInVuc2hpZnQiLCJwdXNoIiwid2FybmVkIiwiRXJyb3IiLCJuYW1lIiwiZW1pdHRlciIsInR5cGUiLCJjb3VudCIsImNvbnNvbGUiLCJ3YXJuIiwibG9nIiwicmVtb3ZlTGlzdGVuZXIiLCJhcmd1bWVudHMiLCJwb3AiLCJBcnJheSIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJjb25jYXQiLCJydW4iLCJmdW4iLCJhcnJheSIsImpvaW4iLCJyZXBsYWNlIiwiSlNPTiIsInN0cmluZ2lmeSIsImdsb2JhbCIsInByb2Nlc3MiLCJub0RlcHJlY2F0aW9uIiwidGhyb3dEZXByZWNhdGlvbiIsInRyYWNlRGVwcmVjYXRpb24iLCJ0cmFjZSIsImVycm9yIiwic2VlbiIsInN0eWxpemUiLCJkZXB0aCIsImNvbG9ycyIsInNob3dIaWRkZW4iLCJjdXN0b21JbnNwZWN0Iiwic3R5bGVzIiwiZm9yRWFjaCIsImluc3BlY3QiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiaW5kZXhPZiIsIlJlZ0V4cCIsInRvU3RyaW5nIiwiRGF0ZSIsInRvVVRDU3RyaW5nIiwibWFwIiwiaGFzT3duUHJvcGVydHkiLCJtYXRjaCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInZhbHVlIiwiZ2V0Iiwic2V0Iiwic3BsaXQiLCJzdWJzdHIiLCJyZWR1Y2UiLCJpc0FycmF5IiwiY2hhckNvZGVBdCIsIk5hTiIsIkluZmluaXR5IiwiaXNOYU4iLCJNYXRoIiwiTE4yIiwiQnVmZmVyIiwiVFlQRURfQVJSQVlfU1VQUE9SVCIsIlJhbmdlRXJyb3IiLCJVaW50OEFycmF5IiwiX19wcm90b19fIiwiQXJyYXlCdWZmZXIiLCJmaWxsIiwiaXNFbmNvZGluZyIsIndyaXRlIiwic2xpY2UiLCJieXRlTGVuZ3RoIiwiY29weSIsImJ1ZmZlciIsImRhdGEiLCJfaXNCdWZmZXIiLCJpc1ZpZXciLCJ0b0xvd2VyQ2FzZSIsImZyb20iLCJsYXN0SW5kZXhPZiIsInJlYWRVSW50MTZCRSIsInJlYWQiLCJwYXJzZUludCIsImJhc2U2NC5mcm9tQnl0ZUFycmF5IiwiU3RyaW5nIiwiaWVlZTc1NC53cml0ZSIsInRyaW0iLCJiYXNlNjQudG9CeXRlQXJyYXkiLCJpc0J1ZmZlciIsInJlYWRGbG9hdExFIiwiaGVhZCIsInRhaWwiLCJlbmNvZGluZyIsInN1cnJvZ2F0ZVNpemUiLCJkZXRlY3RJbmNvbXBsZXRlQ2hhciIsImNoYXJCdWZmZXIiLCJjaGFyUmVjZWl2ZWQiLCJjaGFyTGVuZ3RoIiwicHJlcGVuZExpc3RlbmVyIiwib24iLCJsaXN0ZW5lcnMiLCJvYmplY3RNb2RlIiwicmVhZGFibGVPYmplY3RNb2RlIiwiaGlnaFdhdGVyTWFyayIsInBpcGVzIiwicGlwZXNDb3VudCIsImZsb3dpbmciLCJlbmRlZCIsImVuZEVtaXR0ZWQiLCJyZWFkaW5nIiwic3luYyIsIm5lZWRSZWFkYWJsZSIsImVtaXR0ZWRSZWFkYWJsZSIsInJlYWRhYmxlTGlzdGVuaW5nIiwicmVzdW1lU2NoZWR1bGVkIiwiZGVmYXVsdEVuY29kaW5nIiwicmFuT3V0IiwiYXdhaXREcmFpbiIsInJlYWRpbmdNb3JlIiwiZGVjb2RlciIsIl9yZWFkYWJsZVN0YXRlIiwicmVhZGFibGUiLCJfcmVhZCIsImVuZCIsInNoaWZ0IiwiY2xlYXIiLCJuZXh0IiwiYWxsb2NVbnNhZmUiLCJjaHVuayIsImNhbGxiYWNrIiwiZGVmaW5lUHJvcGVydHkiLCJnZXRCdWZmZXIiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJuZWVkRHJhaW4iLCJlbmRpbmciLCJmaW5pc2hlZCIsImRlY29kZVN0cmluZ3MiLCJ3cml0aW5nIiwiY29ya2VkIiwiYnVmZmVyUHJvY2Vzc2luZyIsIm9ud3JpdGUiLCJ3cml0ZWNiIiwid3JpdGVsZW4iLCJidWZmZXJlZFJlcXVlc3QiLCJsYXN0QnVmZmVyZWRSZXF1ZXN0IiwicGVuZGluZ2NiIiwicHJlZmluaXNoZWQiLCJlcnJvckVtaXR0ZWQiLCJidWZmZXJlZFJlcXVlc3RDb3VudCIsImNvcmtlZFJlcXVlc3RzRnJlZSIsIl93cml0YWJsZVN0YXRlIiwid3JpdGFibGUiLCJfd3JpdGUiLCJ3cml0ZXYiLCJfd3JpdGV2IiwiZW50cnkiLCJmaW5pc2giLCJvbmNlIiwiUmVhZGFibGUiLCJXcml0YWJsZSIsImFsbG93SGFsZk9wZW4iLCJhZnRlclRyYW5zZm9ybSIsIm5lZWRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm1pbmciLCJ3cml0ZWNodW5rIiwid3JpdGVlbmNvZGluZyIsIl90cmFuc2Zvcm1TdGF0ZSIsIkR1cGxleCIsInRyYW5zZm9ybSIsIl90cmFuc2Zvcm0iLCJmbHVzaCIsIl9mbHVzaCIsIlRyYW5zZm9ybSIsIkVFIiwic29ydCIsInRvVXBwZXJDYXNlIiwiY2hhckF0IiwiZGVjb2RlQ29kZVBvaW50IiwiRWxlbWVudFR5cGUiLCJDREFUQSIsImNoaWxkcmVuIiwiVGV4dCIsImlzVGFnIiwiU3ludGF4RXJyb3IiLCJhY3Rpb24iLCJpZ25vcmVDYXNlIiwibG93ZXJDYXNlQXR0cmlidXRlTmFtZXMiLCJ4bWxNb2RlIiwidGVzdCIsImxvd2VyQ2FzZVRhZ3MiLCJwcm9jZWR1cmUiLCJhdHRyaWJ1dGUiLCJlcXVhbHMiLCJwc2V1ZG8iLCJnZXRQYXJlbnQiLCJhdHRyaWJ1dGVzRmFjdG9yeSIsInJ1bGVzIiwiY29udGFpbnMiLCJnZXRUZXh0IiwiaWNvbnRhaW5zIiwiZ2V0TkNoZWNrIiwiZ2V0U2libGluZ3MiLCJnZXROYW1lIiwicm9vdCIsInNjb3BlIiwiY2hlY2tib3giLCJmaWxlIiwicGFzc3dvcmQiLCJyYWRpbyIsInJlc2V0IiwiaW1hZ2UiLCJzdWJtaXQiLCJlbXB0eSIsImdldENoaWxkcmVuIiwic29tZSIsImxpbmsiLCJoYXNBdHRyaWIiLCJ2aXNpdGVkIiwic2VsZWN0ZWQiLCJkaXNhYmxlZCIsImVuYWJsZWQiLCJjaGVja2VkIiwicmVxdWlyZWQiLCJvcHRpb25hbCIsInBhcmVudCIsImhlYWRlciIsImJ1dHRvbiIsImdldEF0dHJpYnV0ZVZhbHVlIiwiaW5wdXQiLCJ0ZXh0IiwiY29tcGlsZUZhY3RvcnkiLCJhZGFwdGVyIiwiY29tcGlsZSIsImNvbXBpbGVVbnNhZmUiLCJzaG91bGRUZXN0TmV4dFNpYmxpbmdzIiwiY29udGV4dCIsInJlbW92ZVN1YnNldHMiLCJmaWx0ZXIiLCJzcGxpY2UiLCJleGlzdHNPbmUiLCJmaW5kT25lIiwiZmluZEFsbCIsInByZXYiLCJjdXJzb3IiLCJzb3VyY2UiLCJsaW5lIiwiY29sdW1uIiwiQm9vbGVhbiIsImxpbmVzIiwic3RhcnRMaW5lIiwiY29sdW1ucyIsInN0YXJ0Q29sdW1uIiwibGluZXNBbnNDb2x1bW5zQ29tcHV0ZWQiLCJvZmZzZXRBbmRUeXBlIiwiYmFsYW5jZSIsImlzTnVtYmVyIiwidG9rZW5Db3VudCIsIm1pbiIsIm1heCIsImNvbW1hIiwiZXhwbGljaXQiLCJ0ZXJtcyIsImNvbWJpbmF0b3IiLCJkaXNhbGxvd0VtcHR5IiwibXVsdGlwbGllciIsImxvYyIsIm9mZnNldCIsInN1YnN0cmluZyIsImtleXdvcmQiLCJ2ZW5kb3IiLCJ1bml0IiwicG9zIiwic3RyIiwic3Vic3RyaW5nVG9Qb3MiLCJlYXQiLCJjaGFyQ29kZSIsIm5leHRDaGFyQ29kZSIsInN5bnRheCIsIm5vZGUiLCJiYWROb2RlIiwibGFzdE5vZGUiLCJtaXNtYXRjaCIsIm1hdGNoU3ludGF4IiwiY2hpbGRyZW5NYXRjaCIsInRvSlNPTiIsImdldFR5cGUiLCJnZXRQcm9wZXJ0eSIsIm1hdGNoZWQiLCJpc0Zpbml0ZSIsInN0YXJ0Iiwic3RydWN0dXJlIiwiZG9jcyIsImNoZWNrIiwidHJhbnNsYXRlIiwid2FsayIsImdldFRyYWNlIiwiaXNUeXBlIiwiaXNQcm9wZXJ0eSIsImlzS2V5d29yZCIsInZhbHVlQ29tbW9uU3ludGF4IiwiYXRydWxlIiwicGFyc2VDb250ZXh0IiwicGFyc2UiLCJfYXJyYXkiLCJfc2V0IiwiTWFwIiwiY3JlYXRlIiwiZ2VuZXJhdGVkTGluZSIsImdlbmVyYXRlZENvbHVtbiIsInV0aWwiLCJjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCIsIl9zb3J0ZWQiLCJfbGFzdCIsIl9maWxlIiwiZ2V0QXJnIiwiX3NvdXJjZVJvb3QiLCJfc2tpcFZhbGlkYXRpb24iLCJfc291cmNlcyIsIl9uYW1lcyIsIl9tYXBwaW5ncyIsIl9zb3VyY2VzQ29udGVudHMiLCJyYW5kb20iLCJzd2FwIiwic2VjdGlvbnMiLCJfdmVyc2lvbiIsIm5vcm1hbGl6ZSIsImlzQWJzb2x1dGUiLCJyZWxhdGl2ZSIsIkFycmF5U2V0IiwiZnJvbUFycmF5Iiwic291cmNlUm9vdCIsInNvdXJjZXNDb250ZW50Iiwib3JpZ2luYWxMaW5lIiwib3JpZ2luYWxDb2x1bW4iLCJfc2VjdGlvbnMiLCJ1cmwiLCJnZW5lcmF0ZWRPZmZzZXQiLCJjb25zdW1lciIsInNvdXJjZUNvbnRlbnRzIiwiYWRkIiwiZ2VuZXJhdGUiLCJlYWNoIiwiZWFjaENvbW1hIiwic3R5bGVzaGVldCIsImJsb2NrIiwiZm4iLCJydWxlIiwiZWFjaFJpZ2h0IiwibnVsbGFibGUiLCJ3YWxrQ29udGV4dCIsImZpZWxkcyIsImF0cnVsZVByZWx1ZGUiLCJzZWxlY3RvciIsImRlY2xhcmF0aW9uIiwiZnVuY3Rpb24iLCJpc09iamVjdCIsImNyZWF0ZVBhcnNlciIsImNyZWF0ZVdhbGtlciIsImNyZWF0ZUdlbmVyYXRvciIsImNyZWF0ZUNvbnZlcnRvciIsIkxpc3QiLCJUb2tlbml6ZXIiLCJMZXhlciIsInByb3BlcnR5IiwiZ3JhbW1hciIsImxleGVyIiwiY3JlYXRlTGV4ZXIiLCJ3YWxrVXAiLCJ3YWxrUnVsZXMiLCJ3YWxrUnVsZXNSaWdodCIsIndhbGtEZWNsYXJhdGlvbnMiLCJ0cmFuc2xhdGVXaXRoU291cmNlTWFwIiwidHJhbnNsYXRlTWFya3VwIiwiY2xvbmUiLCJmcm9tUGxhaW5PYmplY3QiLCJ0b1BsYWluT2JqZWN0IiwiY3JlYXRlU3ludGF4IiwibWl4IiwiZm9yayIsImdlbmVyaWMiLCJ0eXBlcyIsInByb3BlcnRpZXMiLCJ0b2tlblN0YXJ0IiwidG9rZW5FbmQiLCJSYXciLCJzY2FubmVyIiwibG9va3VwVHlwZSIsInRvbGVyYW50Iiwic2tpcCIsImVvZiIsInRva2VuVHlwZSIsImdldExvY2F0aW9uIiwic3Vic3RyVG9DdXJzb3IiLCJ0b2xlcmFudFBhcnNlIiwiUnVsZSIsIkRlY2xhcmF0aW9uIiwic2tpcFNDIiwiY29uc3VtZSIsImdldFRva2VuVmFsdWUiLCJpc0hleCIsImNvbnN1bWVOb25XUyIsInNjYW4iLCJsb29rdXBWYWx1ZSIsImFwcGVuZERhdGEiLCJjdXJyZW50VG9rZW4iLCJsb29rdXBOb25XU1R5cGUiLCJXaGl0ZVNwYWNlIiwiRnVuY3Rpb24iLCJBdHJ1bGVQcmVsdWRlIiwiSWRlbnRpZmllciIsIlBhcmVudGhlc2VzIiwiaXRlbSIsIlVpbnQxNkFycmF5IiwibG9jYXRpb24iLCJob3N0bmFtZSIsIm5hdmlnYXRvciIsImFwcFZlcnNpb24iLCJjb25maWciLCJhc3NpZ24iLCJpbmRlbnQiLCJyZXBlYXQiLCJwcmV0dHkiLCJkb2N0eXBlRW5kIiwicHJvY0luc3RFbmQiLCJjb21tZW50RW5kIiwiY2RhdGFFbmQiLCJ0YWdTaG9ydEVuZCIsInRhZ09wZW5FbmQiLCJ0YWdDbG9zZUVuZCIsInRleHRFbmQiLCJpbmRlbnRMZXZlbCIsInRleHRDb250ZXh0IiwiY29udGVudCIsImFjdGl2ZSIsInBhcmFtcyIsImN1cnNvcnMiLCJUQUJfUkVQTEFDRU1FTlQiLCJPRkZTRVRfQ09SUkVDVElPTiIsIk1BWF9MSU5FX0xFTkdUSCIsImlzTmV3bGluZSIsImZpcnN0Q2hhck9mZnNldCIsIlNZTUJPTF9UWVBFIiwiZmluZFdoaXRlU3BhY2VFbmQiLCJmaW5kQ29tbWVudEVuZCIsImZpbmROdW1iZXJFbmQiLCJjbXBTdHIiLCJVUkwiLCJXSElURVNQQUNFIiwiZmluZFVybFJhd0VuZCIsImZpbmRTdHJpbmdFbmQiLCJmaW5kSWRlbnRpZmllckVuZCIsInRlcm0iLCJ0b2tlbnMiLCJsb25nZXN0TWF0Y2giLCJjc3MiLCJtaXNtYXRjaE9mZnNldCIsImxhc3QiLCJjb25zdW1lTnVtYmVyIiwiZGltZW5zaW9uIiwiZmluZFdzRW5kIiwiTkFNRV9DSEFSIiwic2Nhbk51bWJlciIsInJlYWRNdWx0aXBsaWVyUmFuZ2UiLCJyZWFkTXVsdGlwbGllciIsInBlZWsiLCJzY2FuV29yZCIsIm1heWJlTXVsdGlwbGllZCIsIkNPTUJJTkFUT1JfUFJFQ0VERU5DRSIsInJlZ3JvdXBUZXJtcyIsInJlYWRJbXBsaWNpdEdyb3VwIiwicmVhZEtleXdvcmRPckZ1bmN0aW9uIiwicmVhZEdyb3VwIiwicmVhZFByb3BlcnR5IiwicmVhZFR5cGUiLCJzY2FuU3RyaW5nIiwic2NhblNwYWNlcyIsImVsc2UiLCJ0aGVuIiwiYWxsIiwiYnVpbGRNYXRjaEdyYXBoIiwibmV4dFN5bnRheCIsIm1hdGNoU3RhY2siLCJzeW50YXhTdGFjayIsInRoZW5TdGFjayIsInRva2VuQ3Vyc29yIiwidG9rZW4iLCJpbmRleCIsIm1hc2siLCJyZWFzb24iLCJpdGVyYXRpb25zIiwiZ2V0Rmlyc3RNYXRjaE5vZGUiLCJnZXRMYXN0TWF0Y2hOb2RlIiwiaXNWYWxpZE51bWJlciIsImlzVmFsaWRMb2NhdGlvbiIsImNyZWF0ZU5vZGVTdHJ1Y3R1cmVDaGVja2VyIiwiYnVpbGRNYXRjaFJlc3VsdCIsInZhbHVlSGFzVmFyIiwiY3JlYXRlUGFyc2VDb250ZXh0IiwiZ2V0V2Fsa2Vyc0Zyb21TdHJ1Y3R1cmUiLCJyZXZlcnNlIiwiQXRydWxlIiwiU3R5bGVTaGVldCIsIkJsb2NrIiwiZXh0ZW5kIiwidmVuZG9yUHJlZml4IiwibmFtZXMiLCJpc0N1c3RvbVByb3BlcnR5IiwicGFyc2VXaXRoRmFsbGJhY2siLCJjb25zdW1lUmF3RGVjbGFyYXRpb24iLCJWYWx1ZSIsImlzQmFsYW5jZUVkZ2UiLCJTZWxlY3Rvckxpc3QiLCJzY2FuVW5pY29kZU51bWJlciIsImNyZWF0ZVNpbmdsZU5vZGVMaXN0IiwicmVhZFNlcXVlbmNlIiwiY3JlYXRlTGlzdCIsInRhZ3MiLCJpZHMiLCJjbGFzc2VzIiwid2hpdGVsaXN0IiwiYmxhY2tsaXN0IiwicmVtb3ZlIiwiaXNFbXB0eSIsInNlZWQiLCJyZXNvbHZlS2V5d29yZCIsImJhc2VuYW1lIiwicHJlbHVkZSIsImlkIiwiYXBwZW5kIiwiZm9yY2VNZWRpYU1lcmdlIiwiaW5zZXJ0TGlzdCIsImFwcGVuZExpc3QiLCJjb21wYXJlTWFya2VyIiwicHJldlVudGlsIiwidXRpbHMiLCJ1bnNhZmVUb1NraXBOb2RlIiwicHNldWRvU2lnbmF0dXJlIiwiaXNFcXVhbFNlbGVjdG9ycyIsImlzRXF1YWxEZWNsYXJhdGlvbnMiLCJhZGRTZWxlY3RvcnMiLCJoYXNTaW1pbGFyU2VsZWN0b3JzIiwiaW5zZXJ0IiwiY3JlYXRlSXRlbSIsImllaGFjayIsInNpZGVzIiwiZmlyc3QiLCJvcGVyYXRpb24iLCJzaG9ydGhhbmQiLCJpc09rVG9NaW5pbWl6ZSIsImdldERlY2xhcmF0aW9uIiwibGFzdE1hdGNoIiwicHJlZml4IiwiaW1wb3J0YW50IiwiZmluZ2VycHJpbnQiLCJuZXh0VW50aWwiLCJhdm9pZFJ1bGVzTWVyZ2UiLCJjb21wYXJlRGVjbGFyYXRpb25zIiwiZXEiLCJuZTEiLCJuZTIiLCJuZTJvdmVycmlkZWQiLCJjb21tZW50IiwibG9nZ2VyIiwiZmlyc3RBdHJ1bGVzQWxsb3dlZCIsInZpc2l0IiwiZW50ZXIiLCJyZXN0cnVjdHVyaW5nIiwiY29tbWVudHMiLCJyZXN0cnVjdHVyZSIsImRlYnVnIiwibm93IiwidG9GaXhlZCIsImZpbGVuYW1lIiwicG9zaXRpb25zIiwic291cmNlTWFwIiwiYmVmb3JlQ29tcHJlc3MiLCJhZnRlckNvbXByZXNzIiwiYXN0Iiwic2V0U291cmNlQ29udGVudCIsImlzRWxlbSIsImhhc0F0dHIiLCJ1c2FnZSIsImVsZW0iLCJhdHRyIiwiYXR0cnMiLCJmb3JjZSIsInBhcmVudE5vZGUiLCJpbmhlcml0YWJsZUF0dHJzIiwibG9jYWwiLCJpbnN0cnVjdGlvbiIsImNvb3JkcyIsImJhc2UiLCJiaW5kIiwibWFrZUFyY3MiLCJyYWRpdXMiLCJjZW50ZXIiLCJzZGF0YSIsInN0cmFpZ2h0Q3VydmVzIiwibGluZVNob3J0aGFuZHMiLCJjb2xsYXBzZVJlcGVhdGVkIiwiY3VydmVTbW9vdGhTaG9ydGhhbmRzIiwicmVtb3ZlVXNlbGVzcyIsImV2ZXJ5IiwibmVnYXRpdmVFeHRyYVNwYWNlIiwiY29sbGFwc2VJbnRvT25lIiwiY29udmVydFRvU2hvcnRzIiwicmVtb3ZlQXR0ciIsInRyYW5zZm9ybVByZWNpc2lvbiIsImRlZ1ByZWNpc2lvbiIsImZsb2F0UHJlY2lzaW9uIiwibWF0cml4VG9UcmFuc2Zvcm0iLCJzaG9ydFRyYW5zbGF0ZSIsInNob3J0U2NhbGUiLCJzaG9ydFJvdGF0ZSIsImNsZWFudXBPdXREYXRhIiwicm91bmQiLCJoYXMiLCJTZXQiLCJ3aWR0aCIsInBhcnNlRmxvYXQiLCJoZWlnaHQiLCJwbHVnaW5zIiwidmFsdWVzIiwiZGltZW5zaW9ucyIsInNxcnQiLCJ0YW4iLCJhc2luIiwic2luIiwiYWNvcyIsImNvcyIsIlBJIiwiTnVtYmVyIiwiTUFYX1ZBTFVFIiwiZnJvbUNoYXJDb2RlIiwiYWJzIiwicG93IiwiZmxvb3IiLCJzZWxmIiwiRXZlbnRFbWl0dGVyIiwidXNpbmdEb21haW5zIiwiZG9tYWluIiwiRG9tYWluIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJkb21haW5FbWl0dGVyIiwiZG9tYWluVGhyb3duIiwiYWRkTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwibGlzdGVuZXJDb3VudCIsImV2ZW50TmFtZXMiLCJSZWZsZWN0Iiwib3duS2V5cyIsInBlcmZvcm1hbmNlIiwibW96Tm93IiwibXNOb3ciLCJvTm93Iiwid2Via2l0Tm93IiwiZ2V0VGltZSIsIm5leHRUaWNrIiwidGl0bGUiLCJicm93c2VyIiwiZW52IiwiYXJndiIsInZlcnNpb24iLCJ2ZXJzaW9ucyIsIm9mZiIsImJpbmRpbmciLCJjd2QiLCJjaGRpciIsInVtYXNrIiwiaHJ0aW1lIiwicGxhdGZvcm0iLCJyZWxlYXNlIiwidXB0aW1lIiwic3VwZXJfIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsInBvb2xTaXplIiwiX2F1Z21lbnQiLCJhbGxvYyIsImFsbG9jVW5zYWZlU2xvdyIsImNvbXBhcmUiLCJzd2FwMTYiLCJzd2FwMzIiLCJzd2FwNjQiLCJpbmNsdWRlcyIsIl9hcnIiLCJzdWJhcnJheSIsInJlYWRVSW50TEUiLCJyZWFkVUludEJFIiwicmVhZFVJbnQ4IiwicmVhZFVJbnQxNkxFIiwicmVhZFVJbnQzMkxFIiwicmVhZFVJbnQzMkJFIiwicmVhZEludExFIiwicmVhZEludEJFIiwicmVhZEludDgiLCJyZWFkSW50MTZMRSIsInJlYWRJbnQxNkJFIiwicmVhZEludDMyTEUiLCJyZWFkSW50MzJCRSIsImllZWU3NTQucmVhZCIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50MTZCRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQzMkJFIiwid3JpdGVJbnRMRSIsIndyaXRlSW50QkUiLCJ3cml0ZUludDgiLCJ3cml0ZUludDE2TEUiLCJ3cml0ZUludDE2QkUiLCJ3cml0ZUludDMyTEUiLCJ3cml0ZUludDMyQkUiLCJ3cml0ZUZsb2F0TEUiLCJ3cml0ZUZsb2F0QkUiLCJ3cml0ZURvdWJsZUxFIiwid3JpdGVEb3VibGVCRSIsIkJ1ZmZlckxpc3QiLCJSZWFkYWJsZVN0YXRlIiwiTk9ERV9ERUJVRyIsImluaGVyaXRzIiwiaXNQYXVzZWQiLCJzZXRFbmNvZGluZyIsInBpcGUiLCJwYXVzZSIsInVucGlwZSIsInJlc3VtZSIsIndyYXAiLCJfZnJvbUxpc3QiLCJXcml0YWJsZVN0YXRlIiwiY29yayIsInVuY29yayIsInNldERlZmF1bHRFbmNvZGluZyIsIlBhc3NUaHJvdWdoIiwiU3RyZWFtIiwiZGVzdHJveSIsIl9pc1N0ZGlvIiwicSIsImMiLCJidWZmZXJDaGVja1Bvc2l0aW9uIiwiTUFYX0JVRkZFUl9MRU5HVEgiLCJvcHQiLCJsb3dlcmNhc2UiLCJsb3dlcmNhc2V0YWdzIiwibG9vc2VDYXNlIiwiY2xvc2VkIiwiY2xvc2VkUm9vdCIsInNhd1Jvb3QiLCJ0YWciLCJzdHJpY3QiLCJub3NjcmlwdCIsInN0YXRlIiwiQkVHSU4iLCJzdHJpY3RFbnRpdGllcyIsIkVOVElUSUVTIiwiWE1MX0VOVElUSUVTIiwiYXR0cmliTGlzdCIsInhtbG5zIiwibnMiLCJ0cmFja1Bvc2l0aW9uIiwicG9zaXRpb24iLCJjZGF0YSIsInNjcmlwdCIsIl9wYXJzZXIiLCJvbmVuZCIsIm9uZXJyb3IiLCJfZGVjb2RlciIsInRleHROb2RlIiwiQkVHSU5fV0hJVEVTUEFDRSIsIlRFWFQiLCJ0YWdOYW1lIiwiYXR0cmlidXRlcyIsImF0dHJpYk5hbWUiLCJhdHRyaWJWYWx1ZSIsInVyaSIsImlzU2VsZkNsb3NpbmciLCJTQ1JJUFQiLCJlbnRpdHkiLCJPUEVOX1dBS0EiLCJzdGFydFRhZ1Bvc2l0aW9uIiwiZnJvbUNvZGVQb2ludCIsInBhcnNlciIsIlNBWFBhcnNlciIsIlNBWFN0cmVhbSIsImNyZWF0ZVN0cmVhbSIsIkVWRU5UUyIsIlRFWFRfRU5USVRZIiwiU0NSSVBUX0VORElORyIsIkNMT1NFX1RBRyIsIlNHTUxfREVDTCIsInNnbWxEZWNsIiwiT1BFTl9UQUciLCJQUk9DX0lOU1QiLCJwcm9jSW5zdE5hbWUiLCJwcm9jSW5zdEJvZHkiLCJDT01NRU5UIiwiRE9DVFlQRSIsImRvY3R5cGUiLCJTR01MX0RFQ0xfUVVPVEVEIiwiRE9DVFlQRV9EVEQiLCJET0NUWVBFX1FVT1RFRCIsIkRPQ1RZUEVfRFREX1FVT1RFRCIsIkNPTU1FTlRfRU5ESU5HIiwiQ09NTUVOVF9FTkRFRCIsIkNEQVRBX0VORElORyIsIkNEQVRBX0VORElOR18yIiwiUFJPQ19JTlNUX0VORElORyIsIlBST0NfSU5TVF9CT0RZIiwiYm9keSIsIk9QRU5fVEFHX1NMQVNIIiwiQVRUUklCIiwiQVRUUklCX05BTUUiLCJBVFRSSUJfVkFMVUUiLCJBVFRSSUJfTkFNRV9TQVdfV0hJVEUiLCJBVFRSSUJfVkFMVUVfUVVPVEVEIiwiQVRUUklCX1ZBTFVFX1VOUVVPVEVEIiwiQVRUUklCX1ZBTFVFX0VOVElUWV9RIiwiQVRUUklCX1ZBTFVFX0NMT1NFRCIsIkFUVFJJQl9WQUxVRV9FTlRJVFlfVSIsIkNMT1NFX1RBR19TQVdfV0hJVEUiLCJjbG9zZSIsInJlcXVpcmUkJDEiLCJTdHJpbmdEZWNvZGVyIiwieG1sIiwiU1RBVEUiLCJDT01NRU5UX1NUQVJUSU5HIiwiRGlyZWN0aXZlIiwiQ29tbWVudCIsIlNjcmlwdCIsIlN0eWxlIiwiVGFnIiwiRG9jdHlwZSIsIlhNTCIsIkhUTUwiLCJIVE1MU3RyaWN0IiwiZXNjYXBlIiwiZGVjb2RlRW50aXRpZXMiLCJlbmNvZGVYTUwiLCJhdHRyaWJzIiwiYWxsb3dmdWxsc2NyZWVuIiwiYXN5bmMiLCJhdXRvZm9jdXMiLCJhdXRvcGxheSIsImNvbnRyb2xzIiwiZGVmYXVsdCIsImRlZmVyIiwiaGlkZGVuIiwiaXNtYXAiLCJsb29wIiwibXVsdGlwbGUiLCJtdXRlZCIsIm9wZW4iLCJyZWFkb25seSIsInJldmVyc2VkIiwic2NvcGVkIiwic2VhbWxlc3MiLCJ0eXBlbXVzdG1hdGNoIiwic3R5bGUiLCJ4bXAiLCJpZnJhbWUiLCJub2VtYmVkIiwibm9mcmFtZXMiLCJwbGFpbnRleHQiLCJhcmVhIiwiYmFzZWZvbnQiLCJiciIsImNvbCIsImNvbW1hbmQiLCJlbWJlZCIsImZyYW1lIiwiaHIiLCJpbWciLCJpc2luZGV4Iiwia2V5Z2VuIiwibWV0YSIsInBhcmFtIiwidHJhY2siLCJ3YnIiLCJjaGVlcmlvIiwiZ2V0SW5uZXJIVE1MIiwiZ2V0T3V0ZXJIVE1MIiwicmVxdWlyZSQkMCIsImZpbmQiLCJmaW5kT25lQ2hpbGQiLCJ0YWdfbmFtZSIsInRhZ190eXBlIiwidGFnX2NvbnRhaW5zIiwiRElTQ09OTkVDVEVEIiwiUFJFQ0VESU5HIiwiRk9MTE9XSU5HIiwiQ09OVEFJTlMiLCJDT05UQUlORURfQlkiLCJleHBvcnRzIiwidHJ1ZUZ1bmMiLCJmYWxzZUZ1bmMiLCJleGlzdHMiLCJub3QiLCJhbnkiLCJoeXBoZW4iLCJlbGVtZW50IiwiYXR0cmlidXRlRmFjdG9yeSIsImRlc2NlbmRhbnQiLCJfZmxleGlibGVEZXNjZW5kYW50IiwiY2hpbGQiLCJzaWJsaW5nIiwiYWRqYWNlbnQiLCJ1bml2ZXJzYWwiLCJCYXNlRnVuY3MiLCJmaWx0ZXJzIiwicHNldWRvcyIsInJvb3RGdW5jIiwicHNldWRvc0ZhY3RvcnkiLCJydWxlc0ZhY3RvcnkiLCJtYXRjaGVzIiwiY29tcGlsZVRva2VuIiwiUHNldWRvcyIsInNlbGVjdEFsbCIsInNlbGVjdE9uZSIsImlzIiwiaXRlcmF0ZSIsIl9jb21waWxlVW5zYWZlIiwiX2NvbXBpbGVUb2tlbiIsImJhc2VDc3NBZGFwdGVyIiwicmVuYW1lRWxlbSIsImNsb3Nlc3RFbGVtIiwic3BsaWNlQ29udGVudCIsImhhc0F0dHJMb2NhbCIsInNvbWVBdHRyIiwiY29tcHV0ZWRBdHRyIiwiYWRkQXR0ciIsImNsYXNzIiwiaGFzQ2xhc3MiLCJoYXNTdHlsZSIsImVhY2hBdHRyIiwicXVlcnlTZWxlY3RvckFsbCIsInF1ZXJ5U2VsZWN0b3IiLCJ0b1N0ciIsImNhbGxlZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiJGFwcGxpY2F0aW9uQ2FjaGUiLCIkY29uc29sZSIsIiRleHRlcm5hbCIsIiRmcmFtZSIsIiRmcmFtZUVsZW1lbnQiLCIkZnJhbWVzIiwiJGlubmVySGVpZ2h0IiwiJGlubmVyV2lkdGgiLCIkb3V0ZXJIZWlnaHQiLCIkb3V0ZXJXaWR0aCIsIiRwYWdlWE9mZnNldCIsIiRwYWdlWU9mZnNldCIsIiRwYXJlbnQiLCIkc2Nyb2xsTGVmdCIsIiRzY3JvbGxUb3AiLCIkc2Nyb2xsWCIsIiRzY3JvbGxZIiwiJHNlbGYiLCIkd2Via2l0SW5kZXhlZERCIiwiJHdlYmtpdFN0b3JhZ2VJbmZvIiwiJHdpbmRvdyIsIndpbmRvdyIsImlzQXJndW1lbnRzIiwiaXNBcmdzIiwic2hpbSIsIlN5bWJvbCIsImlzRnVuY3Rpb24iLCJ4IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3VwcG9ydHNEZXNjcmlwdG9ycyIsInRvU3RyaW5nVGFnIiwiZ2V0RGF5IiwiaGFzVG9TdHJpbmdUYWciLCJ2YWx1ZU9mIiwiaGFzU3ltYm9scyIsIml0ZXJhdG9yIiwiaXNQcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsImlzU3ltYm9sIiwiaXNEYXRlIiwiZW50cmllcyIsImFzeW5jSXRlcmF0b3IiLCJBdG9taWNzIiwiRGF0YVZpZXciLCJkZWNvZGVVUkkiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUkkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJldmFsIiwiRXZhbEVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJQcm9taXNlIiwicmVqZWN0IiwicmVzb2x2ZSIsIlByb3h5IiwiUmVmZXJlbmNlRXJyb3IiLCJTaGFyZWRBcnJheUJ1ZmZlciIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDMyQXJyYXkiLCJVUklFcnJvciIsIldlYWtNYXAiLCJXZWFrU2V0IiwidW5kZWZpbmVkIiwiJE9iamVjdCIsIiRUeXBlRXJyb3IiLCIkU3RyaW5nIiwiVG9QcmltaXRpdmUiLCJUb0Jvb2xlYW4iLCJUb051bWJlciIsIlRvSW50ZWdlciIsIiRpc05hTiIsIiRpc0Zpbml0ZSIsIlRvSW50MzIiLCJUb1VpbnQzMiIsIlRvVWludDE2IiwiVG9TdHJpbmciLCJUb09iamVjdCIsIkNoZWNrT2JqZWN0Q29lcmNpYmxlIiwiSXNDYWxsYWJsZSIsIlNhbWVWYWx1ZSIsIlR5cGUiLCJJc1Byb3BlcnR5RGVzY3JpcHRvciIsIklzQWNjZXNzb3JEZXNjcmlwdG9yIiwiSXNEYXRhRGVzY3JpcHRvciIsIklzR2VuZXJpY0Rlc2NyaXB0b3IiLCJGcm9tUHJvcGVydHlEZXNjcmlwdG9yIiwiVG9Qcm9wZXJ0eURlc2NyaXB0b3IiLCJyZWdleEV4ZWMiLCJleGVjIiwibGFzdEluZGV4IiwiTUFYX1NBRkVfSU5URUdFUiIsImlzRXh0ZW5zaWJsZSIsIkNhbGwiLCJUb0ludDE2IiwiVG9JbnQ4IiwiVG9VaW50OCIsIlRvVWludDhDbGFtcCIsIlJlcXVpcmVPYmplY3RDb2VyY2libGUiLCJUb1Byb3BlcnR5S2V5IiwiVG9MZW5ndGgiLCJDYW5vbmljYWxOdW1lcmljSW5kZXhTdHJpbmciLCJFUzUiLCJJc0FycmF5IiwiSXNDb25zdHJ1Y3RvciIsIklzRXh0ZW5zaWJsZSIsInByZXZlbnRFeHRlbnNpb25zIiwiSXNJbnRlZ2VyIiwiSXNQcm9wZXJ0eUtleSIsIklzUmVnRXhwIiwiaGFzUmVnRXhwTWF0Y2hlciIsIlNhbWVWYWx1ZVplcm8iLCJHZXRWIiwiR2V0TWV0aG9kIiwiR2V0IiwiU3BlY2llc0NvbnN0cnVjdG9yIiwic3BlY2llcyIsIkNvbXBsZXRlUHJvcGVydHlEZXNjcmlwdG9yIiwiSGFzT3duUHJvcGVydHkiLCJIYXNQcm9wZXJ0eSIsIklzQ29uY2F0U3ByZWFkYWJsZSIsImlzQ29uY2F0U3ByZWFkYWJsZSIsIkludm9rZSIsIkdldEl0ZXJhdG9yIiwiSXRlcmF0b3JOZXh0IiwiSXRlcmF0b3JDb21wbGV0ZSIsIkl0ZXJhdG9yVmFsdWUiLCJJdGVyYXRvclN0ZXAiLCJJdGVyYXRvckNsb3NlIiwiQ3JlYXRlSXRlclJlc3VsdE9iamVjdCIsImRvbmUiLCJSZWdFeHBFeGVjIiwiQXJyYXlTcGVjaWVzQ3JlYXRlIiwiQ3JlYXRlRGF0YVByb3BlcnR5IiwiQ3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyIsIk9iamVjdENyZWF0ZSIsIkFkdmFuY2VTdHJpbmdJbmRleCIsIlNhbWVWYWx1ZU5vbk51bWJlciIsImlzRW51bWVyYWJsZSIsIkVTIiwiZ2V0UG9seWZpbGwiLCJkZWZpbmUiLCJpbXBsZW1lbnRhdGlvbiIsImNsYXNzTmFtZXMiLCJjbGFzc0F0dHIiLCJhZGRDbGFzc0hhbmRsZXIiLCJnZXRDbGFzc0F0dHIiLCJzZXRDbGFzc0F0dHIiLCJhZGRDbGFzc1ZhbHVlSGFuZGxlciIsImdldENsYXNzVmFsdWUiLCJzZXRDbGFzc1ZhbHVlIiwiX2FkZFNpbmdsZSIsIl9yZW1vdmVTaW5nbGUiLCJkZWxldGUiLCJ0b2dnbGUiLCJnZXRTaXplIiwidG9BcnJheSIsInVwZGF0ZUN1cnNvcnMiLCJwcmVwZW5kIiwicHJlcGVuZERhdGEiLCJpbnNlcnREYXRhIiwibWVzc2FnZSIsInN0YWNrIiwic291cmNlRnJhZ21lbnQiLCJwYXJzZUVycm9yIiwiSURFTlRJRklFUiIsIk5VTUJFUiIsIlNUUklORyIsIlBVTkNUVUFUT1IiLCJOIiwiRiIsIlIiLCJUWVBFIiwiUHVuY3R1YXRvciIsIkNETyIsIkNEQyIsIlVybCIsIkV4Y2xhbWF0aW9uTWFyayIsIlF1b3RhdGlvbk1hcmsiLCJOdW1iZXJTaWduIiwiRG9sbGFyU2lnbiIsIlBlcmNlbnRTaWduIiwiQW1wZXJzYW5kIiwiQXBvc3Ryb3BoZSIsIkxlZnRQYXJlbnRoZXNpcyIsIlJpZ2h0UGFyZW50aGVzaXMiLCJBc3RlcmlzayIsIlBsdXNTaWduIiwiQ29tbWEiLCJIeXBoZW5NaW51cyIsIkZ1bGxTdG9wIiwiU29saWR1cyIsIkNvbG9uIiwiU2VtaWNvbG9uIiwiTGVzc1RoYW5TaWduIiwiRXF1YWxzU2lnbiIsIkdyZWF0ZXJUaGFuU2lnbiIsIlF1ZXN0aW9uTWFyayIsIkNvbW1lcmNpYWxBdCIsIkxlZnRTcXVhcmVCcmFja2V0IiwiQmFja3NsYXNoIiwiUmlnaHRTcXVhcmVCcmFja2V0IiwiQ2lyY3VtZmxleEFjY2VudCIsIkxvd0xpbmUiLCJHcmF2ZUFjY2VudCIsIkxlZnRDdXJseUJyYWNrZXQiLCJWZXJ0aWNhbExpbmUiLCJSaWdodEN1cmx5QnJhY2tldCIsIlRpbGRlIiwiTkFNRSIsIlNhZmVVaW50MzJBcnJheSIsIlBVTkNUVUFUSU9OIiwiU1RPUF9VUkxfUkFXIiwiY29uc3RhbnRzIiwiRlVMTFNUT1AiLCJQTFVTU0lHTiIsIkhZUEhFTk1JTlVTIiwiVEFCIiwiU1BBQ0UiLCJjbXBDaGFyIiwiZW5kc1dpdGgiLCJmaW5kTGFzdE5vblNwYWNlTG9jYXRpb24iLCJmaW5kRGVjaW1hbE51bWJlckVuZCIsImZpbmRFc2Nhc2VFbmQiLCJzZXRTb3VyY2UiLCJzdGFydE9mZnNldCIsImdldFRva2VuU3RhcnQiLCJnZXRPZmZzZXRFeGNsdWRlV1MiLCJnZXRSYXdMZW5ndGgiLCJza2lwV1MiLCJlYXROb25XUyIsImNvbnN1bWVGdW5jdGlvbk5hbWUiLCJleHBlY3RJZGVudGlmaWVyIiwiZ2V0TG9jYXRpb25SYW5nZSIsImR1bXAiLCJpZHgiLCJDc3NTeW50YXhFcnJvciIsIlN5bnRheFJlZmVyZW5jZUVycm9yIiwicmVmZXJlbmNlIiwiTWF0Y2hFcnJvciIsInJhd01lc3NhZ2UiLCJ0cmFuc2xhdGVHcmFtbWFyIiwiZnJlZXplIiwiaGFjayIsImN1c3RvbSIsIlN5bnRheFBhcnNlRXJyb3IiLCJFWENMQU1BVElPTk1BUksiLCJBUE9TVFJPUEhFIiwiTEVGVFBBUkVOVEhFU0lTIiwiUklHSFRQQVJFTlRIRVNJUyIsIkxFU1NUSEFOU0lHTiIsIkdSRUFURVJUSEFOU0lHTiIsIkxFRlRTUVVBUkVCUkFDS0VUIiwiUklHSFRTUVVBUkVCUkFDS0VUIiwiTEVGVENVUkxZQlJBQ0tFVCIsIlJJR0hUQ1VSTFlCUkFDS0VUIiwiTVVMVElQTElFUl9ERUZBVUxUIiwibWF0Y2hGcmFnbWVudHMiLCJub2RlcyIsImdldFN0cnVjdHVyZUZyb21Db25maWciLCJhZGRUeXBlXyIsImFkZFByb3BlcnR5XyIsImNoZWNrU3RydWN0dXJlIiwiY3JlYXRlRGVzY3JpcHRvciIsImV4cHJlc3Npb24iLCJtYXRjaERlY2xhcmF0aW9uIiwibWF0Y2hQcm9wZXJ0eSIsIm1hdGNoVHlwZSIsImZpbmRWYWx1ZUZyYWdtZW50cyIsImZpbmREZWNsYXJhdGlvblZhbHVlRnJhZ21lbnRzIiwiZmluZEFsbEZyYWdtZW50cyIsInZhbGlkYXRlIiwicmVjb2duaXplciIsInNwYWNlIiwiaWdub3JlV1MiLCJpZ25vcmVXU0FmdGVyIiwiZ2V0Tm9kZSIsIm5vb3AiLCJuZWVkUG9zaXRpb25zIiwib25QYXJzZUVycm9yIiwicGFyc2VBdHJ1bGVQcmVsdWRlIiwicGFyc2VSdWxlUHJlbHVkZSIsInBhcnNlVmFsdWUiLCJwYXJzZUN1c3RvbVByb3BlcnR5IiwiZ2V0TG9jYXRpb25Gcm9tTGlzdCIsImVuY29kZSIsImRlY29kZSIsInJlc3QiLCJzY2hlbWUiLCJhdXRoIiwiaG9zdCIsInBvcnQiLCJwYXRoIiwic2l6ZSIsInRvU2V0U3RyaW5nIiwiYXQiLCJNYXBwaW5nTGlzdCIsInVuc29ydGVkRm9yRWFjaCIsIlNvdXJjZU1hcEdlbmVyYXRvciIsImZyb21Tb3VyY2VNYXAiLCJlYWNoTWFwcGluZyIsImdlbmVyYXRlZCIsIm9yaWdpbmFsIiwiYWRkTWFwcGluZyIsInNvdXJjZXMiLCJzb3VyY2VDb250ZW50Rm9yIiwiX3ZhbGlkYXRlTWFwcGluZyIsImFwcGx5U291cmNlTWFwIiwib3JpZ2luYWxQb3NpdGlvbkZvciIsIl9zZXJpYWxpemVNYXBwaW5ncyIsImJhc2U2NFZMUSIsIl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50IiwibWFwcGluZ3MiLCJMRUFTVF9VUFBFUl9CT1VORCIsIkdSRUFURVNUX0xPV0VSX0JPVU5EIiwicXVpY2tTb3J0IiwiU291cmNlTWFwQ29uc3VtZXIiLCJfX2dlbmVyYXRlZE1hcHBpbmdzIiwiX3BhcnNlTWFwcGluZ3MiLCJfX29yaWdpbmFsTWFwcGluZ3MiLCJfY2hhcklzTWFwcGluZ1NlcGFyYXRvciIsIkdFTkVSQVRFRF9PUkRFUiIsIk9SSUdJTkFMX09SREVSIiwiX2dlbmVyYXRlZE1hcHBpbmdzIiwiX29yaWdpbmFsTWFwcGluZ3MiLCJhbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IiLCJfZmluZE1hcHBpbmciLCJjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyIsImxhc3RDb2x1bW4iLCJjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCIsInNlYXJjaCIsImNvbXB1dGVDb2x1bW5TcGFucyIsImxhc3RHZW5lcmF0ZWRDb2x1bW4iLCJoYXNDb250ZW50c09mQWxsU291cmNlcyIsInVybFBhcnNlIiwiZ2VuZXJhdGVkUG9zaXRpb25Gb3IiLCJiaWFzIiwiU291cmNlTm9kZSIsImZyb21TdHJpbmdXaXRoU291cmNlTWFwIiwicmVwbGFjZVJpZ2h0Iiwid2Fsa1NvdXJjZUNvbnRlbnRzIiwiZnJvbVNldFN0cmluZyIsInRvU3RyaW5nV2l0aFNvdXJjZU1hcCIsImNvZGUiLCJyZXF1aXJlJCQyIiwiU2VsZWN0b3IiLCJzb3VyY2VNYXBHZW5lcmF0b3IiLCJnZXRUeXBlc0Zyb21Db25maWciLCJwYXRjaCIsInN5bnRheGVzIiwiYSIsImIiLCJBVFJVTEUiLCJBU1RFUklTSyIsIlZFUlRJQ0FMTElORSIsIm1hdGNoZXIiLCJmbGFncyIsIlNFTUlDT0xPTiIsIlNPTElEVVMiLCJUSUxERSIsIkNPTE9OIiwiRE9MTEFSU0lHTiIsIk5VTUJFUlNJR04iLCJEaW1lbnNpb24iLCJSYXRpbyIsIkNPTU1BIiwiUEVSQ0VOVFNJR04iLCJGVU5DVElPTiIsImxlZnQiLCJyaWdodCIsIlFVRVNUSU9OTUFSSyIsIlJBVyIsIkFuUGx1c0IiLCJBdHRyaWJ1dGVTZWxlY3RvciIsIkJyYWNrZXRzIiwiQ2xhc3NTZWxlY3RvciIsIkNvbWJpbmF0b3IiLCJEZWNsYXJhdGlvbkxpc3QiLCJIZXhDb2xvciIsIklkU2VsZWN0b3IiLCJNZWRpYUZlYXR1cmUiLCJNZWRpYVF1ZXJ5IiwiTWVkaWFRdWVyeUxpc3QiLCJOdGgiLCJudGgiLCJPcGVyYXRvciIsIlBlcmNlbnRhZ2UiLCJQc2V1ZG9DbGFzc1NlbGVjdG9yIiwiUHNldWRvRWxlbWVudFNlbGVjdG9yIiwiY29uc3VtZVJhdyIsIlR5cGVTZWxlY3RvciIsIlVuaWNvZGVSYW5nZSIsIm1lZGlhUXVlcnlMaXN0IiwibWVkaWFRdWVyeSIsInNlbGVjdG9yTGlzdCIsImRlY2xhcmF0aW9uTGlzdCIsImxvY2FsZUNvbXBhcmUiLCJpbnBsYWNlIiwiY3NzdHJlZSIsImxpc3QiLCJwcmlvcml0eSIsImhhc1N5bmNlZCIsInN0eWxlQXR0ciIsInN0eWxlVmFsdWUiLCJhZGRTdHlsZUhhbmRsZXIiLCJnZXRTdHlsZUF0dHIiLCJzZXRTdHlsZUF0dHIiLCJhZGRTdHlsZVZhbHVlSGFuZGxlciIsImdldFN0eWxlVmFsdWUiLCJzZXRTdHlsZVZhbHVlIiwiZ2V0Q3NzVGV4dCIsIl9sb2FkQ3NzVGV4dCIsImNzc3Rvb2xzIiwiY3NzdHJlZVRvU3R5bGVEZWNsYXJhdGlvbiIsInNldFByb3BlcnR5IiwiZ2V0UHJvcGVydGllcyIsIl9oYW5kbGVQYXJzZUVycm9yIiwiX2dldFByb3BlcnR5IiwiZ2V0UHJvcGVydHlQcmlvcml0eSIsImdldFByb3BlcnR5VmFsdWUiLCJyZW1vdmVQcm9wZXJ0eSIsInNheCIsIlNBWCIsIm9uZG9jdHlwZSIsIm9ucHJvY2Vzc2luZ2luc3RydWN0aW9uIiwicHJvY2Vzc2luZ2luc3RydWN0aW9uIiwib25jb21tZW50Iiwib25jZGF0YSIsIm9ub3BlbnRhZyIsIm9udGV4dCIsIm9uY2xvc2V0YWciLCJFT0wiLCJ0bXBkaXIiLCJ0bXBEaXIiLCJuZXR3b3JrSW50ZXJmYWNlcyIsImdldE5ldHdvcmtJbnRlcmZhY2VzIiwiY3B1cyIsInRvdGFsbWVtIiwiZnJlZW1lbSIsImxvYWRhdmciLCJlbmRpYW5uZXNzIiwiYW5pbWF0aW9uIiwiZGVzY3JpcHRpdmUiLCJzaGFwZSIsInN0cnVjdHVyYWwiLCJwYWludFNlcnZlciIsIm5vblJlbmRlcmluZyIsImNvbnRhaW5lciIsInRleHRDb250ZW50IiwidGV4dENvbnRlbnRDaGlsZCIsImxpZ2h0U291cmNlIiwiZmlsdGVyUHJpbWl0aXZlIiwiYW5pbWF0aW9uQWRkaXRpb24iLCJhbmltYXRpb25BdHRyaWJ1dGVUYXJnZXQiLCJhbmltYXRpb25FdmVudCIsImFuaW1hdGlvblRpbWluZyIsImFuaW1hdGlvblZhbHVlIiwiY29uZGl0aW9uYWxQcm9jZXNzaW5nIiwiY29yZSIsImdyYXBoaWNhbEV2ZW50IiwicHJlc2VudGF0aW9uIiwieGxpbmsiLCJkb2N1bWVudEV2ZW50IiwidHJhbnNmZXJGdW5jdGlvbiIsInkiLCJjbGlwIiwib3BhY2l0eSIsInN0cm9rZSIsImRpc3BsYXkiLCJ2aXNpYmlsaXR5Iiwia2VybmluZyIsImRpcmVjdGlvbiIsInNsb3BlIiwiaW50ZXJjZXB0IiwiYW1wbGl0dWRlIiwiZXhwb25lbnQiLCJhdHRyc0dyb3VwcyIsImRlZmF1bHRzIiwidGFyZ2V0IiwiY29udGVudEdyb3VwcyIsImFsdEdseXBoIiwiYWx0R2x5cGhEZWYiLCJhbHRHbHlwaEl0ZW0iLCJhbmltYXRlIiwiYW5pbWF0ZUNvbG9yIiwiYW5pbWF0ZU1vdGlvbiIsImFuaW1hdGVUcmFuc2Zvcm0iLCJjaXJjbGUiLCJjeCIsImN5IiwiY2xpcFBhdGgiLCJjbGlwUGF0aFVuaXRzIiwiZGVmcyIsImRlc2MiLCJlbGxpcHNlIiwiZmVCbGVuZCIsIm1vZGUiLCJmZUNvbG9yTWF0cml4IiwiZmVDb21wb25lbnRUcmFuc2ZlciIsImZlQ29tcG9zaXRlIiwib3BlcmF0b3IiLCJrMSIsImsyIiwiazMiLCJrNCIsImZlQ29udm9sdmVNYXRyaXgiLCJvcmRlciIsImVkZ2VNb2RlIiwicHJlc2VydmVBbHBoYSIsImZlRGlmZnVzZUxpZ2h0aW5nIiwic3VyZmFjZVNjYWxlIiwiZGlmZnVzZUNvbnN0YW50IiwiZmVEaXNwbGFjZW1lbnRNYXAiLCJzY2FsZSIsInhDaGFubmVsU2VsZWN0b3IiLCJ5Q2hhbm5lbFNlbGVjdG9yIiwiZmVEaXN0YW50TGlnaHQiLCJhemltdXRoIiwiZWxldmF0aW9uIiwiZmVGbG9vZCIsImZlRnVuY0EiLCJmZUZ1bmNCIiwiZmVGdW5jRyIsImZlRnVuY1IiLCJmZUdhdXNzaWFuQmx1ciIsInN0ZERldmlhdGlvbiIsImZlSW1hZ2UiLCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwiZmVNZXJnZSIsImZlTWVyZ2VOb2RlIiwiZmVNb3JwaG9sb2d5IiwiZmVPZmZzZXQiLCJkeCIsImR5IiwiZmVQb2ludExpZ2h0IiwieiIsImZlU3BlY3VsYXJMaWdodGluZyIsInNwZWN1bGFyQ29uc3RhbnQiLCJzcGVjdWxhckV4cG9uZW50IiwiZmVTcG90TGlnaHQiLCJwb2ludHNBdFgiLCJwb2ludHNBdFkiLCJwb2ludHNBdFoiLCJmZVRpbGUiLCJmZVR1cmJ1bGVuY2UiLCJiYXNlRnJlcXVlbmN5IiwibnVtT2N0YXZlcyIsInN0aXRjaFRpbGVzIiwicHJpbWl0aXZlVW5pdHMiLCJmb250IiwiZm9yZWlnbk9iamVjdCIsImciLCJnbHlwaCIsImdseXBoUmVmIiwiaGF0Y2giLCJoYXRjaFVuaXRzIiwiaGF0Y2hDb250ZW50VW5pdHMiLCJwaXRjaCIsInJvdGF0ZSIsImhhdGNoUGF0aCIsImhrZXJuIiwieDEiLCJ5MSIsIngyIiwieTIiLCJsaW5lYXJHcmFkaWVudCIsInNwcmVhZE1ldGhvZCIsIm1hcmtlciIsIm1hcmtlclVuaXRzIiwicmVmWCIsInJlZlkiLCJtYXJrZXJXaWR0aCIsIm1hcmtlckhlaWdodCIsIm1hc2tVbml0cyIsIm1hc2tDb250ZW50VW5pdHMiLCJtZXRhZGF0YSIsIm1wYXRoIiwicGF0dGVybiIsInBhdHRlcm5Vbml0cyIsInBhdHRlcm5Db250ZW50VW5pdHMiLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRpYWxHcmFkaWVudCIsImdyYWRpZW50VW5pdHMiLCJyIiwibWVzaEdyYWRpZW50IiwibWVzaFJvdyIsIm1lc2hQYXRjaCIsInJlY3QiLCJzb2xpZENvbG9yIiwic3RvcCIsInN2ZyIsInpvb21BbmRQYW4iLCJiYXNlUHJvZmlsZSIsImNvbnRlbnRTY3JpcHRUeXBlIiwiY29udGVudFN0eWxlVHlwZSIsInN3aXRjaCIsInN5bWJvbCIsImxlbmd0aEFkanVzdCIsInRleHRQYXRoIiwibWV0aG9kIiwic3BhY2luZyIsInRyZWYiLCJ0c3BhbiIsInVzZSIsInZpZXciLCJ2a2VybiIsImVsZW1zR3JvdXBzIiwiZG9jdHlwZVN0YXJ0IiwicHJvY0luc3RTdGFydCIsInRhZ09wZW5TdGFydCIsInRhZ0Nsb3NlU3RhcnQiLCJ0YWdTaG9ydFN0YXJ0IiwiYXR0clN0YXJ0IiwiYXR0ckVuZCIsImNvbW1lbnRTdGFydCIsImNkYXRhU3RhcnQiLCJ0ZXh0U3RhcnQiLCJyZWdFbnRpdGllcyIsInJlZ1ZhbEVudGl0aWVzIiwiZW5jb2RlRW50aXR5IiwiZW50aXRpZXMiLCJ1c2VTaG9ydFRhZ3MiLCJjb252ZXJ0IiwiY3JlYXRlRWxlbSIsImNyZWF0ZVRleHQiLCJjcmVhdGVEb2N0eXBlIiwiY3JlYXRlUHJvY0luc3QiLCJjcmVhdGVDb21tZW50IiwiY3JlYXRlQ0RBVEEiLCJpbmZvIiwiY3JlYXRlSW5kZW50IiwiY3JlYXRlQXR0cnMiLCJlZGl0b3JOYW1lc3BhY2VzIiwiYWxsb2NhdGVDdXJzb3IiLCJyZWxlYXNlQ3Vyc29yIiwiZm9yRWFjaFJpZ2h0IiwicHJlcGVuZExpc3QiLCJjcmVhdGVDdXN0b21FcnJvciIsIkF0S2V5d29yZCIsImkiLCJCQUNLX1NMQVNIIiwiaXNXaGl0ZVNwYWNlIiwiZ2V0TmV3bGluZUxlbmd0aCIsImZpbmRXaGl0ZVNwYWNlU3RhcnQiLCJmaW5kRXNjYXBlRW5kIiwiTlVMTCIsIlNUQVIiLCJTTEFTSCIsIkNPTU1FUkNJQUxBVCIsIlFVT1RBVElPTk1BUksiLCJNSU5fQlVGRkVSX1NJWkUiLCJPRkZTRVRfTUFTSyIsIlRZUEVfU0hJRlQiLCJ0b2tlbkxheW91dCIsImNvbXB1dGVMaW5lc0FuZENvbHVtbnMiLCJmb3JjZUJyYWNlcyIsImRlY29yYXRlIiwiZ2VuZXJhdGVHcmFtbWFyIiwia2V5d29yZHMiLCJnZXRWZW5kb3JQcmVmaXgiLCJ0b2tlbml6ZXJVdGlscyIsInRva2VuaXplckNvbnN0IiwiemVyb1VuaXRsZXNzRGltZW5zaW9uIiwiYXN0Tm9kZSIsIm5leHROb25Xc0NvZGUiLCJBTVBFUlNBTkQiLCJsZWF2ZSIsImRlY29yYXRvciIsInJlc3VsdCIsIk1BVENIIiwiTUlTTUFUQ0giLCJESVNBTExPV19FTVBUWSIsInRlc3ROb2RlIiwibWF0Y2hBc0xpc3QiLCJtYXRjaEFzVHJlZSIsIm1hdGNoR3JhcGgiLCJnZXRUb3RhbEl0ZXJhdGlvbkNvdW50IiwicHJvY2Vzc1N0cnVjdHVyZSIsInJlcXVpcmUkJDMiLCJjc3NXaWRlS2V5d29yZHMiLCJjc3NXaWRlS2V5d29yZHNXaXRoRXhwcmVzc2lvbiIsImR1bXBNYXBTeW50YXgiLCJvblBhcnNlRXJyb3JUaHJvdyIsImdldEZpcnN0TGlzdE5vZGUiLCJnZXRMYXN0TGlzdE5vZGUiLCJwcm9jZXNzQ29uZmlnIiwidHJhY2tOb2RlcyIsImVuc3VyZUZ1bmN0aW9uIiwiY2hlY2tUb2tlbklzSW50ZWdlciIsIkFUS0VZV09SRCIsImlzRGVjbGFyYXRpb25CbG9ja0F0cnVsZSIsIkVRVUFMU1NJR04iLCJDSVJDVU1GTEVYQUNDRU5UIiwiZ2V0QXR0cmlidXRlTmFtZSIsImdldE9wZXJhdG9yIiwiZ2V0SW1wb3J0YW50IiwicmVhZFVuaXQiLCJjb25zdW1lSGV4U2VxdWVuY2UiLCJlYXRJZGVudGlmaWVyT3JBc3RlcmlzayIsInNjYW5Vbmljb2RlUmFuZ2UiLCJCQUNLU0xBU0giLCJtZXJnZSIsImJ1aWxkSW5kZXgiLCJzY29wZXMiLCJoYW5kbGVycyIsInBhY2tOdW1iZXIiLCJwYWNrIiwiY29tcHJlc3NGdW5jdGlvbiIsInRvSGV4IiwiY29tcHJlc3NJZGVudCIsImNvbXByZXNzSGV4IiwiY29tcHJlc3NLZXlmcmFtZXMiLCJyZXF1aXJlJCQ5IiwiZ2V0VmFsdWVTZXF1ZW5jZSIsInNwZWNpYWwiLCJjYW5PdmVycmlkZSIsInRvcCIsImJvdHRvbSIsImdldFZhbHVlIiwibGFzdFNob3J0U2VsZWN0b3IiLCJwcm9jZXNzUnVsZSIsIm1lcmdlQXRydWxlIiwiaW5pdGlhbE1lcmdlUnVsZXNldCIsImRpc2pvaW5SdWxlc2V0IiwicmVzdHJ1Y3RTaG9ydGhhbmQiLCJyZXN0cnVjdEJsb2NrIiwibWVyZ2VSdWxlc2V0IiwicmVzdHJ1Y3RSdWxlc2V0IiwidXNhZ2VVdGlscyIsIm1pbmlmeSIsIm1pbmlmeUJsb2NrIiwiY29tcHJlc3MiLCJyZWZlcmVuY2VzUHJvcHMiLCJsZWFkaW5nWmVybyIsInJlbW92ZUxlYWRpbmdaZXJvIiwiY20iLCJtbSIsImluIiwicHQiLCJwYyIsInJlZ051bWVyaWNWYWx1ZXMiLCJhYnNvbHV0ZUxlbmd0aHMiLCJlbGVtcyIsImNvbGxlY3Rpb25zIiwiYXR0cnNHcm91cHNEZWZhdWx0cyIsInN0eWxlT3JTY3JpcHQiLCJub25lIiwicGF0aEVsZW1zIiwiYXR0cnNJbmhlcml0YWJsZSIsInJhZCIsImRlZyIsImF0YW4iLCJtYXhZIiwibWF4WCIsIm1pblkiLCJtaW5YIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJQT1NJVElWRV9JTkZJTklUWSIsInRyYW5zZm9ybTJqcyIsInRyYW5zZm9ybXNNdWx0aXBseSIsInRyYW5zZm9ybUFyYyIsInBhdGhKUyIsIkgiLCJWIiwiTSIsIkwiLCJUIiwiUSIsIlMiLCJDIiwiQSIsImgiLCJ2IiwibSIsImwiLCJ0IiwicyIsImFwcGx5VHJhbnNmb3Jtc1N0cm9rZWQiLCJtaW54IiwibWlueSIsIm1heHgiLCJtYXh5IiwicGF0aDJqcyIsImpzMnBhdGgiLCJhcHBseVRyYW5zZm9ybXMiLCJpbnRlcnNlY3RzIiwicmVtb3ZlRG9jdHlwZSIsInJlbW92ZVhNTFByb2NJbnN0IiwicmVtb3ZlQ29tbWVudHMiLCJyZW1vdmVNZXRhZGF0YSIsInJlbW92ZVhNTE5TIiwicmVtb3ZlRWRpdG9yc05TRGF0YSIsImFkZGl0aW9uYWxOYW1lc3BhY2VzIiwiY2xlYW51cEF0dHJzIiwibmV3bGluZXMiLCJzcGFjZXMiLCJpbmxpbmVTdHlsZXMiLCJvbmx5TWF0Y2hlZE9uY2UiLCJyZW1vdmVNYXRjaGVkU2VsZWN0b3JzIiwidXNlTXFzIiwidXNlUHNldWRvcyIsImdldENzc1N0ciIsInN0eWxlRWwiLCJjc3NBc3QiLCJmbGF0dGVuVG9TZWxlY3RvcnMiLCJmaWx0ZXJCeU1xcyIsImZpbHRlckJ5UHNldWRvcyIsImNsZWFuUHNldWRvcyIsInNvcnRTZWxlY3RvcnMiLCJzZWxlY3RlZEVscyIsInNldENzc1N0ciIsIm1pbmlmeVN0eWxlcyIsImNzc28iLCJjb252ZXJ0U3R5bGVUb0F0dHJzIiwiY2xlYW51cElEcyIsInByZXNlcnZlIiwicmVtb3ZlUmFzdGVySW1hZ2VzIiwicmVtb3ZlVXNlbGVzc0RlZnMiLCJjbGVhbnVwTnVtZXJpY1ZhbHVlcyIsImRlZmF1bHRQeCIsImNvbnZlcnRUb1B4IiwiY2xlYW51cExpc3RPZlZhbHVlcyIsInBvaW50cyIsInZpZXdCb3giLCJjb252ZXJ0Q29sb3JzIiwiY3VycmVudENvbG9yIiwibmFtZXMyaGV4IiwicmdiMmhleCIsInNob3J0aGV4Iiwic2hvcnRuYW1lIiwiY29sb3JzUHJvcHMiLCJjb2xvcnNOYW1lcyIsImNvbG9yc1Nob3J0TmFtZXMiLCJyZW1vdmVVbmtub3duc0FuZERlZmF1bHRzIiwidW5rbm93bkNvbnRlbnQiLCJ1bmtub3duQXR0cnMiLCJkZWZhdWx0QXR0cnMiLCJ1c2VsZXNzT3ZlcnJpZGVzIiwia2VlcERhdGFBdHRycyIsImtlZXBBcmlhQXR0cnMiLCJyZW1vdmVOb25Jbmhlcml0YWJsZUdyb3VwQXR0cnMiLCJyZW1vdmVVc2VsZXNzU3Ryb2tlQW5kRmlsbCIsInJlbW92ZU5vbmUiLCJoYXNTdHlsZU9yU2NyaXB0IiwicmVtb3ZlVmlld0JveCIsImNsZWFudXBFbmFibGVCYWNrZ3JvdW5kIiwicmVtb3ZlSGlkZGVuRWxlbXMiLCJkaXNwbGF5Tm9uZSIsIm9wYWNpdHkwIiwiY2lyY2xlUjAiLCJlbGxpcHNlUlgwIiwiZWxsaXBzZVJZMCIsInJlY3RXaWR0aDAiLCJyZWN0SGVpZ2h0MCIsInBhdHRlcm5XaWR0aDAiLCJwYXR0ZXJuSGVpZ2h0MCIsImltYWdlV2lkdGgwIiwiaW1hZ2VIZWlnaHQwIiwicGF0aEVtcHR5RCIsInBvbHlsaW5lRW1wdHlQb2ludHMiLCJwb2x5Z29uRW1wdHlQb2ludHMiLCJyZW1vdmVFbXB0eVRleHQiLCJjb252ZXJ0U2hhcGVUb1BhdGgiLCJjb252ZXJ0QXJjcyIsIm1vdmVFbGVtc0F0dHJzVG9Hcm91cCIsIm1vdmVHcm91cEF0dHJzVG9FbGVtcyIsImNvbGxhcHNlR3JvdXBzIiwiY29udmVydFBhdGhEYXRhIiwidGhyZXNob2xkIiwidG9sZXJhbmNlIiwidXRpbGl6ZUFic29sdXRlIiwicmVtb3ZlRW1wdHlBdHRycyIsInJlbW92ZUVtcHR5Q29udGFpbmVycyIsIm1lcmdlUGF0aHMiLCJyZW1vdmVVbnVzZWROUyIsInNvcnRBdHRycyIsInJlbW92ZVRpdGxlIiwicmVtb3ZlRGVzYyIsInJlbW92ZUFueSIsInJlbW92ZURpbWVuc2lvbnMiLCJyZW1vdmVTdHlsZUVsZW1lbnQiLCJyZW1vdmVTY3JpcHRFbGVtZW50IiwibG9hZCIsInNldHRpbmdzIiwibmV4dFBhc3MiLCJvbm1lc3NhZ2UiLCJwb3N0TWVzc2FnZSJdLCJtYXBwaW5ncyI6IndGQU9BLFlBQXlCLENBQUUsQ0FHM0IsWUFBd0IsQ0FDdEIsRUFBYUEsSUFBYixDQUFrQkMsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FDRCxDQTRDRCxhQUFnQyxPQUMxQixZQUFLQyxhQURxQixDQUVyQixFQUFhQyxtQkFGUSxD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"}