@vue/devtools
Version:
StandAlone vue-devtools
1 lines • 59.2 kB
JavaScript
"use strict";(self["webpackChunk_vue_devtools"]=self["webpackChunk_vue_devtools"]||[]).push([[5972],{45972:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"conf\": () => (/* binding */ conf),\n/* harmony export */ \"language\": () => (/* binding */ language)\n/* harmony export */ });\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar conf = {\n comments: {\n lineComment: '#'\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')']\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: \"'\", close: \"'\" },\n { open: '\"', close: '\"' }\n ],\n autoClosingPairs: [\n { open: \"'\", close: \"'\", notIn: ['string', 'comment'] },\n { open: '\"', close: '\"', notIn: ['comment'] },\n { open: '\"\"\"', close: '\"\"\"' },\n { open: '`', close: '`', notIn: ['string', 'comment'] },\n { open: '(', close: ')' },\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '<<', close: '>>' }\n ],\n indentationRules: {\n increaseIndentPattern: /^\\s*(after|else|catch|rescue|fn|[^#]*(do|<\\-|\\->|\\{|\\[|\\=))\\s*$/,\n decreaseIndentPattern: /^\\s*((\\}|\\])\\s*$|(after|else|catch|rescue|end)\\b)/\n }\n};\n/**\n * A Monarch lexer for the Elixir language.\n *\n * References:\n *\n * * Monarch documentation - https://microsoft.github.io/monaco-editor/monarch.html\n * * Elixir lexer - https://github.com/elixir-makeup/makeup_elixir/blob/master/lib/makeup/lexers/elixir_lexer.ex\n * * TextMate lexer (elixir-tmbundle) - https://github.com/elixir-editors/elixir-tmbundle/blob/master/Syntaxes/Elixir.tmLanguage\n * * TextMate lexer (vscode-elixir-ls) - https://github.com/elixir-lsp/vscode-elixir-ls/blob/master/syntaxes/elixir.json\n */\nvar language = {\n defaultToken: 'source',\n tokenPostfix: '.elixir',\n brackets: [\n { open: '[', close: ']', token: 'delimiter.square' },\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\n { open: '{', close: '}', token: 'delimiter.curly' },\n { open: '<<', close: '>>', token: 'delimiter.angle.special' }\n ],\n // Below are lists/regexps to which we reference later.\n declarationKeywords: [\n 'def',\n 'defp',\n 'defn',\n 'defnp',\n 'defguard',\n 'defguardp',\n 'defmacro',\n 'defmacrop',\n 'defdelegate',\n 'defcallback',\n 'defmacrocallback',\n 'defmodule',\n 'defprotocol',\n 'defexception',\n 'defimpl',\n 'defstruct'\n ],\n operatorKeywords: ['and', 'in', 'not', 'or', 'when'],\n namespaceKeywords: ['alias', 'import', 'require', 'use'],\n otherKeywords: [\n 'after',\n 'case',\n 'catch',\n 'cond',\n 'do',\n 'else',\n 'end',\n 'fn',\n 'for',\n 'if',\n 'quote',\n 'raise',\n 'receive',\n 'rescue',\n 'super',\n 'throw',\n 'try',\n 'unless',\n 'unquote_splicing',\n 'unquote',\n 'with'\n ],\n constants: ['true', 'false', 'nil'],\n nameBuiltin: ['__MODULE__', '__DIR__', '__ENV__', '__CALLER__', '__STACKTRACE__'],\n // Matches any of the operator names:\n // <<< >>> ||| &&& ^^^ ~~~ === !== ~>> <~> |~> <|> == != <= >= && || \\\\ <> ++ -- |> =~ -> <- ~> <~ :: .. = < > + - * / | . ^ & !\n operator: /-[->]?|!={0,2}|\\*|\\/|\\\\\\\\|&{1,3}|\\.\\.?|\\^(?:\\^\\^)?|\\+\\+?|<(?:-|<<|=|>|\\|>|~>?)?|=~|={1,3}|>(?:=|>>)?|\\|~>|\\|>|\\|{1,3}|~>>?|~~~|::/,\n // See https://hexdocs.pm/elixir/syntax-reference.html#variables\n variableName: /[a-z_][a-zA-Z0-9_]*[?!]?/,\n // See https://hexdocs.pm/elixir/syntax-reference.html#atoms\n atomName: /[a-zA-Z_][a-zA-Z0-9_@]*[?!]?|@specialAtomName|@operator/,\n specialAtomName: /\\.\\.\\.|<<>>|%\\{\\}|%|\\{\\}/,\n aliasPart: /[A-Z][a-zA-Z0-9_]*/,\n moduleName: /@aliasPart(?:\\.@aliasPart)*/,\n // Sigil pairs are: \"\"\" \"\"\", ''' ''', \" \", ' ', / /, | |, < >, { }, [ ], ( )\n sigilSymmetricDelimiter: /\"\"\"|'''|\"|'|\\/|\\|/,\n sigilStartDelimiter: /@sigilSymmetricDelimiter|<|\\{|\\[|\\(/,\n sigilEndDelimiter: /@sigilSymmetricDelimiter|>|\\}|\\]|\\)/,\n decimal: /\\d(?:_?\\d)*/,\n hex: /[0-9a-fA-F](_?[0-9a-fA-F])*/,\n octal: /[0-7](_?[0-7])*/,\n binary: /[01](_?[01])*/,\n // See https://hexdocs.pm/elixir/master/String.html#module-escape-characters\n escape: /\\\\u[0-9a-fA-F]{4}|\\\\x[0-9a-fA-F]{2}|\\\\./,\n // The keys below correspond to tokenizer states.\n // We start from the root state and match against its rules\n // until we explicitly transition into another state.\n // The `include` simply brings in all operations from the given state\n // and is useful for improving readability.\n tokenizer: {\n root: [\n { include: '@whitespace' },\n { include: '@comments' },\n // Keywords start as either an identifier or a string,\n // but end with a : so it's important to match this first.\n { include: '@keywordsShorthand' },\n { include: '@numbers' },\n { include: '@identifiers' },\n { include: '@strings' },\n { include: '@atoms' },\n { include: '@sigils' },\n { include: '@attributes' },\n { include: '@symbols' }\n ],\n // Whitespace\n whitespace: [[/\\s+/, 'white']],\n // Comments\n comments: [[/(#)(.*)/, ['comment.punctuation', 'comment']]],\n // Keyword list shorthand\n keywordsShorthand: [\n [/(@atomName)(:)/, ['constant', 'constant.punctuation']],\n // Use positive look-ahead to ensure the string is followed by :\n // and should be considered a keyword.\n [\n /\"(?=([^\"]|#\\{.*?\\}|\\\\\")*\":)/,\n { token: 'constant.delimiter', next: '@doubleQuotedStringKeyword' }\n ],\n [\n /'(?=([^']|#\\{.*?\\}|\\\\')*':)/,\n { token: 'constant.delimiter', next: '@singleQuotedStringKeyword' }\n ]\n ],\n doubleQuotedStringKeyword: [\n [/\":/, { token: 'constant.delimiter', next: '@pop' }],\n { include: '@stringConstantContentInterpol' }\n ],\n singleQuotedStringKeyword: [\n [/':/, { token: 'constant.delimiter', next: '@pop' }],\n { include: '@stringConstantContentInterpol' }\n ],\n // Numbers\n numbers: [\n [/0b@binary/, 'number.binary'],\n [/0o@octal/, 'number.octal'],\n [/0x@hex/, 'number.hex'],\n [/@decimal\\.@decimal([eE]-?@decimal)?/, 'number.float'],\n [/@decimal/, 'number']\n ],\n // Identifiers\n identifiers: [\n // Tokenize identifier name in function-like definitions.\n // Note: given `def a + b, do: nil`, `a` is not a function name,\n // so we use negative look-ahead to ensure there's no operator.\n [\n /\\b(defp?|defnp?|defmacrop?|defguardp?|defdelegate)(\\s+)(@variableName)(?!\\s+@operator)/,\n [\n 'keyword.declaration',\n 'white',\n {\n cases: {\n unquote: 'keyword',\n '@default': 'function'\n }\n }\n ]\n ],\n // Tokenize function calls\n [\n // In-scope call - an identifier followed by ( or .(\n /(@variableName)(?=\\s*\\.?\\s*\\()/,\n {\n cases: {\n // Tokenize as keyword in cases like `if(..., do: ..., else: ...)`\n '@declarationKeywords': 'keyword.declaration',\n '@namespaceKeywords': 'keyword',\n '@otherKeywords': 'keyword',\n '@default': 'function.call'\n }\n }\n ],\n [\n // Referencing function in a module\n /(@moduleName)(\\s*)(\\.)(\\s*)(@variableName)/,\n ['type.identifier', 'white', 'operator', 'white', 'function.call']\n ],\n [\n // Referencing function in an Erlang module\n /(:)(@atomName)(\\s*)(\\.)(\\s*)(@variableName)/,\n ['constant.punctuation', 'constant', 'white', 'operator', 'white', 'function.call']\n ],\n [\n // Piping into a function (tokenized separately as it may not have parentheses)\n /(\\|>)(\\s*)(@variableName)/,\n [\n 'operator',\n 'white',\n {\n cases: {\n '@otherKeywords': 'keyword',\n '@default': 'function.call'\n }\n }\n ]\n ],\n [\n // Function reference passed to another function\n /(&)(\\s*)(@variableName)/,\n ['operator', 'white', 'function.call']\n ],\n // Language keywords, builtins, constants and variables\n [\n /@variableName/,\n {\n cases: {\n '@declarationKeywords': 'keyword.declaration',\n '@operatorKeywords': 'keyword.operator',\n '@namespaceKeywords': 'keyword',\n '@otherKeywords': 'keyword',\n '@constants': 'constant.language',\n '@nameBuiltin': 'variable.language',\n '_.*': 'comment.unused',\n '@default': 'identifier'\n }\n }\n ],\n // Module names\n [/@moduleName/, 'type.identifier']\n ],\n // Strings\n strings: [\n [/\"\"\"/, { token: 'string.delimiter', next: '@doubleQuotedHeredoc' }],\n [/'''/, { token: 'string.delimiter', next: '@singleQuotedHeredoc' }],\n [/\"/, { token: 'string.delimiter', next: '@doubleQuotedString' }],\n [/'/, { token: 'string.delimiter', next: '@singleQuotedString' }]\n ],\n doubleQuotedHeredoc: [\n [/\"\"\"/, { token: 'string.delimiter', next: '@pop' }],\n { include: '@stringContentInterpol' }\n ],\n singleQuotedHeredoc: [\n [/'''/, { token: 'string.delimiter', next: '@pop' }],\n { include: '@stringContentInterpol' }\n ],\n doubleQuotedString: [\n [/\"/, { token: 'string.delimiter', next: '@pop' }],\n { include: '@stringContentInterpol' }\n ],\n singleQuotedString: [\n [/'/, { token: 'string.delimiter', next: '@pop' }],\n { include: '@stringContentInterpol' }\n ],\n // Atoms\n atoms: [\n [/(:)(@atomName)/, ['constant.punctuation', 'constant']],\n [/:\"/, { token: 'constant.delimiter', next: '@doubleQuotedStringAtom' }],\n [/:'/, { token: 'constant.delimiter', next: '@singleQuotedStringAtom' }]\n ],\n doubleQuotedStringAtom: [\n [/\"/, { token: 'constant.delimiter', next: '@pop' }],\n { include: '@stringConstantContentInterpol' }\n ],\n singleQuotedStringAtom: [\n [/'/, { token: 'constant.delimiter', next: '@pop' }],\n { include: '@stringConstantContentInterpol' }\n ],\n // Sigils\n // See https://elixir-lang.org/getting-started/sigils.html\n // Sigils allow for typing values using their textual representation.\n // All sigils start with ~ followed by a letter indicating sigil type\n // and then a delimiter pair enclosing the textual representation.\n // Optional modifiers are allowed after the closing delimiter.\n // For instance a regular expressions can be written as:\n // ~r/foo|bar/ ~r{foo|bar} ~r/foo|bar/g\n //\n // In general lowercase sigils allow for interpolation\n // and escaped characters, whereas uppercase sigils don't\n //\n // During tokenization we want to distinguish some\n // specific sigil types, namely string and regexp,\n // so that they cen be themed separately.\n //\n // To reasonably handle all those combinations we leverage\n // dot-separated states, so if we transition to @sigilStart.interpol.s.{.}\n // then \"sigilStart.interpol.s\" state will match and also all\n // the individual dot-separated parameters can be accessed.\n sigils: [\n [/~[a-z]@sigilStartDelimiter/, { token: '@rematch', next: '@sigil.interpol' }],\n [/~[A-Z]@sigilStartDelimiter/, { token: '@rematch', next: '@sigil.noInterpol' }]\n ],\n sigil: [\n [/~([a-zA-Z])\\{/, { token: '@rematch', switchTo: '@sigilStart.$S2.$1.{.}' }],\n [/~([a-zA-Z])\\[/, { token: '@rematch', switchTo: '@sigilStart.$S2.$1.[.]' }],\n [/~([a-zA-Z])\\(/, { token: '@rematch', switchTo: '@sigilStart.$S2.$1.(.)' }],\n [/~([a-zA-Z])\\</, { token: '@rematch', switchTo: '@sigilStart.$S2.$1.<.>' }],\n [\n /~([a-zA-Z])(@sigilSymmetricDelimiter)/,\n { token: '@rematch', switchTo: '@sigilStart.$S2.$1.$2.$2' }\n ]\n ],\n // The definitions below expect states to be of the form:\n //\n // sigilStart.<interpol-or-noInterpol>.<sigil-letter>.<start-delimiter>.<end-delimiter>\n // sigilContinue.<interpol-or-noInterpol>.<sigil-letter>.<start-delimiter>.<end-delimiter>\n //\n // The sigilStart state is used only to properly classify the token (as string/regex/sigil)\n // and immediately switches to the sigilContinue sate, which handles the actual content\n // and waits for the corresponding end delimiter.\n 'sigilStart.interpol.s': [\n [\n /~s@sigilStartDelimiter/,\n {\n token: 'string.delimiter',\n switchTo: '@sigilContinue.$S2.$S3.$S4.$S5'\n }\n ]\n ],\n 'sigilContinue.interpol.s': [\n [\n /(@sigilEndDelimiter)[a-zA-Z]*/,\n {\n cases: {\n '$1==$S5': { token: 'string.delimiter', next: '@pop' },\n '@default': 'string'\n }\n }\n ],\n { include: '@stringContentInterpol' }\n ],\n 'sigilStart.noInterpol.S': [\n [\n /~S@sigilStartDelimiter/,\n {\n token: 'string.delimiter',\n switchTo: '@sigilContinue.$S2.$S3.$S4.$S5'\n }\n ]\n ],\n 'sigilContinue.noInterpol.S': [\n // Ignore escaped sigil end\n [/(^|[^\\\\])\\\\@sigilEndDelimiter/, 'string'],\n [\n /(@sigilEndDelimiter)[a-zA-Z]*/,\n {\n cases: {\n '$1==$S5': { token: 'string.delimiter', next: '@pop' },\n '@default': 'string'\n }\n }\n ],\n { include: '@stringContent' }\n ],\n 'sigilStart.interpol.r': [\n [\n /~r@sigilStartDelimiter/,\n {\n token: 'regexp.delimiter',\n switchTo: '@sigilContinue.$S2.$S3.$S4.$S5'\n }\n ]\n ],\n 'sigilContinue.interpol.r': [\n [\n /(@sigilEndDelimiter)[a-zA-Z]*/,\n {\n cases: {\n '$1==$S5': { token: 'regexp.delimiter', next: '@pop' },\n '@default': 'regexp'\n }\n }\n ],\n { include: '@regexpContentInterpol' }\n ],\n 'sigilStart.noInterpol.R': [\n [\n /~R@sigilStartDelimiter/,\n {\n token: 'regexp.delimiter',\n switchTo: '@sigilContinue.$S2.$S3.$S4.$S5'\n }\n ]\n ],\n 'sigilContinue.noInterpol.R': [\n // Ignore escaped sigil end\n [/(^|[^\\\\])\\\\@sigilEndDelimiter/, 'regexp'],\n [\n /(@sigilEndDelimiter)[a-zA-Z]*/,\n {\n cases: {\n '$1==$S5': { token: 'regexp.delimiter', next: '@pop' },\n '@default': 'regexp'\n }\n }\n ],\n { include: '@regexpContent' }\n ],\n // Fallback to the generic sigil by default\n 'sigilStart.interpol': [\n [\n /~([a-zA-Z])@sigilStartDelimiter/,\n {\n token: 'sigil.delimiter',\n switchTo: '@sigilContinue.$S2.$S3.$S4.$S5'\n }\n ]\n ],\n 'sigilContinue.interpol': [\n [\n /(@sigilEndDelimiter)[a-zA-Z]*/,\n {\n cases: {\n '$1==$S5': { token: 'sigil.delimiter', next: '@pop' },\n '@default': 'sigil'\n }\n }\n ],\n { include: '@sigilContentInterpol' }\n ],\n 'sigilStart.noInterpol': [\n [\n /~([a-zA-Z])@sigilStartDelimiter/,\n {\n token: 'sigil.delimiter',\n switchTo: '@sigilContinue.$S2.$S3.$S4.$S5'\n }\n ]\n ],\n 'sigilContinue.noInterpol': [\n // Ignore escaped sigil end\n [/(^|[^\\\\])\\\\@sigilEndDelimiter/, 'sigil'],\n [\n /(@sigilEndDelimiter)[a-zA-Z]*/,\n {\n cases: {\n '$1==$S5': { token: 'sigil.delimiter', next: '@pop' },\n '@default': 'sigil'\n }\n }\n ],\n { include: '@sigilContent' }\n ],\n // Attributes\n attributes: [\n // Module @doc* attributes - tokenized as comments\n [\n /\\@(module|type)?doc (~[sS])?\"\"\"/,\n {\n token: 'comment.block.documentation',\n next: '@doubleQuotedHeredocDocstring'\n }\n ],\n [\n /\\@(module|type)?doc (~[sS])?\"/,\n {\n token: 'comment.block.documentation',\n next: '@doubleQuotedStringDocstring'\n }\n ],\n [/\\@(module|type)?doc false/, 'comment.block.documentation'],\n // Module attributes\n [/\\@(@variableName)/, 'variable']\n ],\n doubleQuotedHeredocDocstring: [\n [/\"\"\"/, { token: 'comment.block.documentation', next: '@pop' }],\n { include: '@docstringContent' }\n ],\n doubleQuotedStringDocstring: [\n [/\"/, { token: 'comment.block.documentation', next: '@pop' }],\n { include: '@docstringContent' }\n ],\n // Operators, punctuation, brackets\n symbols: [\n // Code point operator (either with regular character ?a or an escaped one ?\\n)\n [/\\?(\\\\.|[^\\\\\\s])/, 'number.constant'],\n // Anonymous function arguments\n [/&\\d+/, 'operator'],\n // Bitshift operators (must go before delimiters, so that << >> don't match first)\n [/<<<|>>>/, 'operator'],\n // Delimiter pairs\n [/[()\\[\\]\\{\\}]|<<|>>/, '@brackets'],\n // Triple dot is a valid name (must go before operators, so that .. doesn't match instead)\n [/\\.\\.\\./, 'identifier'],\n // Punctuation => (must go before operators, so it's not tokenized as = then >)\n [/=>/, 'punctuation'],\n // Operators\n [/@operator/, 'operator'],\n // Punctuation\n [/[:;,.%]/, 'punctuation']\n ],\n // Generic helpers\n stringContentInterpol: [\n { include: '@interpolation' },\n { include: '@escapeChar' },\n { include: '@stringContent' }\n ],\n stringContent: [[/./, 'string']],\n stringConstantContentInterpol: [\n { include: '@interpolation' },\n { include: '@escapeChar' },\n { include: '@stringConstantContent' }\n ],\n stringConstantContent: [[/./, 'constant']],\n regexpContentInterpol: [\n { include: '@interpolation' },\n { include: '@escapeChar' },\n { include: '@regexpContent' }\n ],\n regexpContent: [\n // # may be a regular regexp char, so we use a heuristic\n // assuming a # surrounded by whitespace is actually a comment.\n [/(\\s)(#)(\\s.*)$/, ['white', 'comment.punctuation', 'comment']],\n [/./, 'regexp']\n ],\n sigilContentInterpol: [\n { include: '@interpolation' },\n { include: '@escapeChar' },\n { include: '@sigilContent' }\n ],\n sigilContent: [[/./, 'sigil']],\n docstringContent: [[/./, 'comment.block.documentation']],\n escapeChar: [[/@escape/, 'constant.character.escape']],\n interpolation: [\n [/#{/, { token: 'delimiter.bracket.embed', next: '@interpolationContinue' }]\n ],\n interpolationContinue: [\n [/}/, { token: 'delimiter.bracket.embed', next: '@pop' }],\n // Interpolation brackets may contain arbitrary code,\n // so we simply match against all the root rules,\n // until we reach interpolation end (the above matches).\n { include: '@root' }\n ]\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMkJBQTJCO0FBQ3pDLGNBQWMsd0JBQXdCO0FBQ3RDLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxjQUFjLDJCQUEyQjtBQUN6QyxjQUFjLHdCQUF3QjtBQUN0QyxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsY0FBYywyQkFBMkI7QUFDekMsY0FBYyx3QkFBd0I7QUFDdEMsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDJCQUEyQjtBQUN6QyxjQUFjLHdCQUF3QjtBQUN0QyxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixLQUFLLGtFQUFrRTtBQUN2RjtBQUNBO0FBQ0EsZUFBZSxLQUFLLGdEQUFnRDtBQUNwRTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQHZ1ZS9kZXZ0b29scy8uLi8uLi9ub2RlX21vZHVsZXMvbW9uYWNvLWVkaXRvci9lc20vdnMvYmFzaWMtbGFuZ3VhZ2VzL2VsaXhpci9lbGl4aXIuanM/NmUxZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCB2YXIgY29uZiA9IHtcbiAgICBjb21tZW50czoge1xuICAgICAgICBsaW5lQ29tbWVudDogJyMnXG4gICAgfSxcbiAgICBicmFja2V0czogW1xuICAgICAgICBbJ3snLCAnfSddLFxuICAgICAgICBbJ1snLCAnXSddLFxuICAgICAgICBbJygnLCAnKSddXG4gICAgXSxcbiAgICBzdXJyb3VuZGluZ1BhaXJzOiBbXG4gICAgICAgIHsgb3BlbjogJ3snLCBjbG9zZTogJ30nIH0sXG4gICAgICAgIHsgb3BlbjogJ1snLCBjbG9zZTogJ10nIH0sXG4gICAgICAgIHsgb3BlbjogJygnLCBjbG9zZTogJyknIH0sXG4gICAgICAgIHsgb3BlbjogXCInXCIsIGNsb3NlOiBcIidcIiB9LFxuICAgICAgICB7IG9wZW46ICdcIicsIGNsb3NlOiAnXCInIH1cbiAgICBdLFxuICAgIGF1dG9DbG9zaW5nUGFpcnM6IFtcbiAgICAgICAgeyBvcGVuOiBcIidcIiwgY2xvc2U6IFwiJ1wiLCBub3RJbjogWydzdHJpbmcnLCAnY29tbWVudCddIH0sXG4gICAgICAgIHsgb3BlbjogJ1wiJywgY2xvc2U6ICdcIicsIG5vdEluOiBbJ2NvbW1lbnQnXSB9LFxuICAgICAgICB7IG9wZW46ICdcIlwiXCInLCBjbG9zZTogJ1wiXCJcIicgfSxcbiAgICAgICAgeyBvcGVuOiAnYCcsIGNsb3NlOiAnYCcsIG5vdEluOiBbJ3N0cmluZycsICdjb21tZW50J10gfSxcbiAgICAgICAgeyBvcGVuOiAnKCcsIGNsb3NlOiAnKScgfSxcbiAgICAgICAgeyBvcGVuOiAneycsIGNsb3NlOiAnfScgfSxcbiAgICAgICAgeyBvcGVuOiAnWycsIGNsb3NlOiAnXScgfSxcbiAgICAgICAgeyBvcGVuOiAnPDwnLCBjbG9zZTogJz4+JyB9XG4gICAgXSxcbiAgICBpbmRlbnRhdGlvblJ1bGVzOiB7XG4gICAgICAgIGluY3JlYXNlSW5kZW50UGF0dGVybjogL15cXHMqKGFmdGVyfGVsc2V8Y2F0Y2h8cmVzY3VlfGZufFteI10qKGRvfDxcXC18XFwtPnxcXHt8XFxbfFxcPSkpXFxzKiQvLFxuICAgICAgICBkZWNyZWFzZUluZGVudFBhdHRlcm46IC9eXFxzKigoXFx9fFxcXSlcXHMqJHwoYWZ0ZXJ8ZWxzZXxjYXRjaHxyZXNjdWV8ZW5kKVxcYikvXG4gICAgfVxufTtcbi8qKlxuICogQSBNb25hcmNoIGxleGVyIGZvciB0aGUgRWxpeGlyIGxhbmd1YWdlLlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKlxuICogKiBNb25hcmNoIGRvY3VtZW50YXRpb24gLSBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbW9uYWNvLWVkaXRvci9tb25hcmNoLmh0bWxcbiAqICogRWxpeGlyIGxleGVyIC0gaHR0cHM6Ly9naXRodWIuY29tL2VsaXhpci1tYWtldXAvbWFrZXVwX2VsaXhpci9ibG9iL21hc3Rlci9saWIvbWFrZXVwL2xleGVycy9lbGl4aXJfbGV4ZXIuZXhcbiAqICogVGV4dE1hdGUgbGV4ZXIgKGVsaXhpci10bWJ1bmRsZSkgLSBodHRwczovL2dpdGh1Yi5jb20vZWxpeGlyLWVkaXRvcnMvZWxpeGlyLXRtYnVuZGxlL2Jsb2IvbWFzdGVyL1N5bnRheGVzL0VsaXhpci50bUxhbmd1YWdlXG4gKiAqIFRleHRNYXRlIGxleGVyICh2c2NvZGUtZWxpeGlyLWxzKSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9lbGl4aXItbHNwL3ZzY29kZS1lbGl4aXItbHMvYmxvYi9tYXN0ZXIvc3ludGF4ZXMvZWxpeGlyLmpzb25cbiAqL1xuZXhwb3J0IHZhciBsYW5ndWFnZSA9IHtcbiAgICBkZWZhdWx0VG9rZW46ICdzb3VyY2UnLFxuICAgIHRva2VuUG9zdGZpeDogJy5lbGl4aXInLFxuICAgIGJyYWNrZXRzOiBbXG4gICAgICAgIHsgb3BlbjogJ1snLCBjbG9zZTogJ10nLCB0b2tlbjogJ2RlbGltaXRlci5zcXVhcmUnIH0sXG4gICAgICAgIHsgb3BlbjogJygnLCBjbG9zZTogJyknLCB0b2tlbjogJ2RlbGltaXRlci5wYXJlbnRoZXNpcycgfSxcbiAgICAgICAgeyBvcGVuOiAneycsIGNsb3NlOiAnfScsIHRva2VuOiAnZGVsaW1pdGVyLmN1cmx5JyB9LFxuICAgICAgICB7IG9wZW46ICc8PCcsIGNsb3NlOiAnPj4nLCB0b2tlbjogJ2RlbGltaXRlci5hbmdsZS5zcGVjaWFsJyB9XG4gICAgXSxcbiAgICAvLyBCZWxvdyBhcmUgbGlzdHMvcmVnZXhwcyB0byB3aGljaCB3ZSByZWZlcmVuY2UgbGF0ZXIuXG4gICAgZGVjbGFyYXRpb25LZXl3b3JkczogW1xuICAgICAgICAnZGVmJyxcbiAgICAgICAgJ2RlZnAnLFxuICAgICAgICAnZGVmbicsXG4gICAgICAgICdkZWZucCcsXG4gICAgICAgICdkZWZndWFyZCcsXG4gICAgICAgICdkZWZndWFyZHAnLFxuICAgICAgICAnZGVmbWFjcm8nLFxuICAgICAgICAnZGVmbWFjcm9wJyxcbiAgICAgICAgJ2RlZmRlbGVnYXRlJyxcbiAgICAgICAgJ2RlZmNhbGxiYWNrJyxcbiAgICAgICAgJ2RlZm1hY3JvY2FsbGJhY2snLFxuICAgICAgICAnZGVmbW9kdWxlJyxcbiAgICAgICAgJ2RlZnByb3RvY29sJyxcbiAgICAgICAgJ2RlZmV4Y2VwdGlvbicsXG4gICAgICAgICdkZWZpbXBsJyxcbiAgICAgICAgJ2RlZnN0cnVjdCdcbiAgICBdLFxuICAgIG9wZXJhdG9yS2V5d29yZHM6IFsnYW5kJywgJ2luJywgJ25vdCcsICdvcicsICd3aGVuJ10sXG4gICAgbmFtZXNwYWNlS2V5d29yZHM6IFsnYWxpYXMnLCAnaW1wb3J0JywgJ3JlcXVpcmUnLCAndXNlJ10sXG4gICAgb3RoZXJLZXl3b3JkczogW1xuICAgICAgICAnYWZ0ZXInLFxuICAgICAgICAnY2FzZScsXG4gICAgICAgICdjYXRjaCcsXG4gICAgICAgICdjb25kJyxcbiAgICAgICAgJ2RvJyxcbiAgICAgICAgJ2Vsc2UnLFxuICAgICAgICAnZW5kJyxcbiAgICAgICAgJ2ZuJyxcbiAgICAgICAgJ2ZvcicsXG4gICAgICAgICdpZicsXG4gICAgICAgICdxdW90ZScsXG4gICAgICAgICdyYWlzZScsXG4gICAgICAgICdyZWNlaXZlJyxcbiAgICAgICAgJ3Jlc2N1ZScsXG4gICAgICAgICdzdXBlcicsXG4gICAgICAgICd0aHJvdycsXG4gICAgICAgICd0cnknLFxuICAgICAgICAndW5sZXNzJyxcbiAgICAgICAgJ3VucXVvdGVfc3BsaWNpbmcnLFxuICAgICAgICAndW5xdW90ZScsXG4gICAgICAgICd3aXRoJ1xuICAgIF0sXG4gICAgY29uc3RhbnRzOiBbJ3RydWUnLCAnZmFsc2UnLCAnbmlsJ10sXG4gICAgbmFtZUJ1aWx0aW46IFsnX19NT0RVTEVfXycsICdfX0RJUl9fJywgJ19fRU5WX18nLCAnX19DQUxMRVJfXycsICdfX1NUQUNLVFJBQ0VfXyddLFxuICAgIC8vIE1hdGNoZXMgYW55IG9mIHRoZSBvcGVyYXRvciBuYW1lczpcbiAgICAvLyA8PDwgPj4+IHx8fCAmJiYgXl5eIH5+fiA9PT0gIT09IH4+PiA8fj4gfH4+IDx8PiA9PSAhPSA8PSA+PSAmJiB8fCBcXFxcIDw+ICsrIC0tIHw+ID1+IC0+IDwtIH4+IDx+IDo6IC4uID0gPCA+ICsgLSAqIC8gfCAuIF4gJiAhXG4gICAgb3BlcmF0b3I6IC8tWy0+XT98IT17MCwyfXxcXCp8XFwvfFxcXFxcXFxcfCZ7MSwzfXxcXC5cXC4/fFxcXig/OlxcXlxcXik/fFxcK1xcKz98PCg/Oi18PDx8PXw+fFxcfD58fj4/KT98PX58PXsxLDN9fD4oPzo9fD4+KT98XFx8fj58XFx8PnxcXHx7MSwzfXx+Pj4/fH5+fnw6Oi8sXG4gICAgLy8gU2VlIGh0dHBzOi8vaGV4ZG9jcy5wbS9lbGl4aXIvc3ludGF4LXJlZmVyZW5jZS5odG1sI3ZhcmlhYmxlc1xuICAgIHZhcmlhYmxlTmFtZTogL1thLXpfXVthLXpBLVowLTlfXSpbPyFdPy8sXG4gICAgLy8gU2VlIGh0dHBzOi8vaGV4ZG9jcy5wbS9lbGl4aXIvc3ludGF4LXJlZmVyZW5jZS5odG1sI2F0b21zXG4gICAgYXRvbU5hbWU6IC9bYS16QS1aX11bYS16QS1aMC05X0BdKls/IV0/fEBzcGVjaWFsQXRvbU5hbWV8QG9wZXJhdG9yLyxcbiAgICBzcGVjaWFsQXRvbU5hbWU6IC9cXC5cXC5cXC58PDw+PnwlXFx7XFx9fCV8XFx7XFx9LyxcbiAgICBhbGlhc1BhcnQ6IC9bQS1aXVthLXpBLVowLTlfXSovLFxuICAgIG1vZHVsZU5hbWU6IC9AYWxpYXNQYXJ0KD86XFwuQGFsaWFzUGFydCkqLyxcbiAgICAvLyBTaWdpbCBwYWlycyBhcmU6IFwiXCJcIiBcIlwiXCIsICcnJyAnJycsIFwiIFwiLCAnICcsIC8gLywgfCB8LCA8ID4sIHsgfSwgWyBdLCAoIClcbiAgICBzaWdpbFN5bW1ldHJpY0RlbGltaXRlcjogL1wiXCJcInwnJyd8XCJ8J3xcXC98XFx8LyxcbiAgICBzaWdpbFN0YXJ0RGVsaW1pdGVyOiAvQHNpZ2lsU3ltbWV0cmljRGVsaW1pdGVyfDx8XFx7fFxcW3xcXCgvLFxuICAgIHNpZ2lsRW5kRGVsaW1pdGVyOiAvQHNpZ2lsU3ltbWV0cmljRGVsaW1pdGVyfD58XFx9fFxcXXxcXCkvLFxuICAgIGRlY2ltYWw6IC9cXGQoPzpfP1xcZCkqLyxcbiAgICBoZXg6IC9bMC05YS1mQS1GXShfP1swLTlhLWZBLUZdKSovLFxuICAgIG9jdGFsOiAvWzAtN10oXz9bMC03XSkqLyxcbiAgICBiaW5hcnk6IC9bMDFdKF8/WzAxXSkqLyxcbiAgICAvLyBTZWUgaHR0cHM6Ly9oZXhkb2NzLnBtL2VsaXhpci9tYXN0ZXIvU3RyaW5nLmh0bWwjbW9kdWxlLWVzY2FwZS1jaGFyYWN0ZXJzXG4gICAgZXNjYXBlOiAvXFxcXHVbMC05YS1mQS1GXXs0fXxcXFxceFswLTlhLWZBLUZdezJ9fFxcXFwuLyxcbiAgICAvLyBUaGUga2V5cyBiZWxvdyBjb3JyZXNwb25kIHRvIHRva2VuaXplciBzdGF0ZXMuXG4gICAgLy8gV2Ugc3RhcnQgZnJvbSB0aGUgcm9vdCBzdGF0ZSBhbmQgbWF0Y2ggYWdhaW5zdCBpdHMgcnVsZXNcbiAgICAvLyB1bnRpbCB3ZSBleHBsaWNpdGx5IHRyYW5zaXRpb24gaW50byBhbm90aGVyIHN0YXRlLlxuICAgIC8vIFRoZSBgaW5jbHVkZWAgc2ltcGx5IGJyaW5ncyBpbiBhbGwgb3BlcmF0aW9ucyBmcm9tIHRoZSBnaXZlbiBzdGF0ZVxuICAgIC8vIGFuZCBpcyB1c2VmdWwgZm9yIGltcHJvdmluZyByZWFkYWJpbGl0eS5cbiAgICB0b2tlbml6ZXI6IHtcbiAgICAgICAgcm9vdDogW1xuICAgICAgICAgICAgeyBpbmNsdWRlOiAnQHdoaXRlc3BhY2UnIH0sXG4gICAgICAgICAgICB7IGluY2x1ZGU6ICdAY29tbWVudHMnIH0sXG4gICAgICAgICAgICAvLyBLZXl3b3JkcyBzdGFydCBhcyBlaXRoZXIgYW4gaWRlbnRpZmllciBvciBhIHN0cmluZyxcbiAgICAgICAgICAgIC8vIGJ1dCBlbmQgd2l0aCBhIDogc28gaXQncyBpbXBvcnRhbnQgdG8gbWF0Y2ggdGhpcyBmaXJzdC5cbiAgICAgICAgICAgIHsgaW5jbHVkZTogJ0BrZXl3b3Jkc1Nob3J0aGFuZCcgfSxcbiAgICAgICAgICAgIHsgaW5jbHVkZTogJ0BudW1iZXJzJyB9LFxuICAgICAgICAgICAgeyBpbmNsdWRlOiAnQGlkZW50aWZpZXJzJyB9LFxuICAgICAgICAgICAgeyBpbmNsdWRlOiAnQHN0cmluZ3MnIH0sXG4gICAgICAgICAgICB7IGluY2x1ZGU6ICdAYXRvbXMnIH0sXG4gICAgICAgICAgICB7IGluY2x1ZGU6ICdAc2lnaWxzJyB9LFxuICAgICAgICAgICAgeyBpbmNsdWRlOiAnQGF0dHJpYnV0ZXMnIH0sXG4gICAgICAgICAgICB7IGluY2x1ZGU6ICdAc3ltYm9scycgfVxuICAgICAgICBdLFxuICAgICAgICAvLyBXaGl0ZXNwYWNlXG4gICAgICAgIHdoaXRlc3BhY2U6IFtbL1xccysvLCAnd2hpdGUnXV0sXG4gICAgICAgIC8vIENvbW1lbnRzXG4gICAgICAgIGNvbW1lbnRzOiBbWy8oIykoLiopLywgWydjb21tZW50LnB1bmN0dWF0aW9uJywgJ2NvbW1lbnQnXV1dLFxuICAgICAgICAvLyBLZXl3b3JkIGxpc3Qgc2hvcnRoYW5kXG4gICAgICAgIGtleXdvcmRzU2hvcnRoYW5kOiBbXG4gICAgICAgICAgICBbLyhAYXRvbU5hbWUpKDopLywgWydjb25zdGFudCcsICdjb25zdGFudC5wdW5jdHVhdGlvbiddXSxcbiAgICAgICAgICAgIC8vIFVzZSBwb3NpdGl2ZSBsb29rLWFoZWFkIHRvIGVuc3VyZSB0aGUgc3RyaW5nIGlzIGZvbGxvd2VkIGJ5IDpcbiAgICAgICAgICAgIC8vIGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGtleXdvcmQuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgL1wiKD89KFteXCJdfCNcXHsuKj9cXH18XFxcXFwiKSpcIjopLyxcbiAgICAgICAgICAgICAgICB7IHRva2VuOiAnY29uc3RhbnQuZGVsaW1pdGVyJywgbmV4dDogJ0Bkb3VibGVRdW90ZWRTdHJpbmdLZXl3b3JkJyB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIC8nKD89KFteJ118I1xcey4qP1xcfXxcXFxcJykqJzopLyxcbiAgICAgICAgICAgICAgICB7IHRva2VuOiAnY29uc3RhbnQuZGVsaW1pdGVyJywgbmV4dDogJ0BzaW5nbGVRdW90ZWRTdHJpbmdLZXl3b3JkJyB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIGRvdWJsZVF1b3RlZFN0cmluZ0tleXdvcmQ6IFtcbiAgICAgICAgICAgIFsvXCI6LywgeyB0b2tlbjogJ2NvbnN0YW50LmRlbGltaXRlcicsIG5leHQ6ICdAcG9wJyB9XSxcbiAgICAgICAgICAgIHsgaW5jbHVkZTogJ0BzdHJpbmdDb25zdGFudENvbnRlbnRJbnRlcnBvbCcgfVxuICAgICAgICBdLFxuICAgICAgICBzaW5nbGVRdW90ZWRTdHJpbmdLZXl3b3JkOiBbXG4gICAgICAgICAgICBbLyc6LywgeyB0b2tlbjogJ2NvbnN0YW50LmRlbGltaXRlcicsIG5leHQ6ICdAcG9wJyB9XSxcbiAgICAgICAgICAgIHsgaW5jbHVkZTogJ0BzdHJpbmdDb25zdGFudENvbnRlbnRJbnRlcnBvbCcgfVxuICAgICAgICBdLFxuICAgICAgICAvLyBOdW1iZXJzXG4gICAgICAgIG51bWJlcnM6IFtcbiAgICAgICAgICAgIFsvMGJAYmluYXJ5LywgJ251bWJlci5iaW5hcnknXSxcbiAgICAgICAgICAgIFsvMG9Ab2N0YWwvLCAnbnVtYmVyLm9jdGFsJ10sXG4gICAgICAgICAgICBbLzB4QGhleC8sICdudW1iZXIuaGV4J10sXG4gICAgICAgICAgICBbL0BkZWNpbWFsXFwuQGRlY2ltYWwoW2VFXS0/QGRlY2ltYWwpPy8sICdudW1iZXIuZmxvYXQnXSxcbiAgICAgICAgICAgIFsvQGRlY2ltYWwvLCAnbnVtYmVyJ11cbiAgICAgICAgXSxcbiAgICAgICAgLy8gSWRlbnRpZmllcnNcbiAgICAgICAgaWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgIC8vIFRva2VuaXplIGlkZW50aWZpZXIgbmFtZSBpbiBmdW5jdGlvbi1saWtlIGRlZmluaXRpb25zLlxuICAgICAgICAgICAgLy8gTm90ZTogZ2l2ZW4gYGRlZiBhICsgYiwgZG86IG5pbGAsIGBhYCBpcyBub3QgYSBmdW5jdGlvbiBuYW1lLFxuICAgICAgICAgICAgLy8gc28gd2UgdXNlIG5lZ2F0aXZlIGxvb2stYWhlYWQgdG8gZW5zdXJlIHRoZXJlJ3Mgbm8gb3BlcmF0b3IuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgL1xcYihkZWZwP3xkZWZucD98ZGVmbWFjcm9wP3xkZWZndWFyZHA/fGRlZmRlbGVnYXRlKShcXHMrKShAdmFyaWFibGVOYW1lKSg/IVxccytAb3BlcmF0b3IpLyxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICdrZXl3b3JkLmRlY2xhcmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1b3RlOiAna2V5d29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0BkZWZhdWx0JzogJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIFRva2VuaXplIGZ1bmN0aW9uIGNhbGxzXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgLy8gSW4tc2NvcGUgY2FsbCAtIGFuIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgKCBvciAuKFxuICAgICAgICAgICAgICAgIC8oQHZhcmlhYmxlTmFtZSkoPz1cXHMqXFwuP1xccypcXCgpLyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2VzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2tlbml6ZSBhcyBrZXl3b3JkIGluIGNhc2VzIGxpa2UgYGlmKC4uLiwgZG86IC4uLiwgZWxzZTogLi4uKWBcbiAgICAgICAgICAgICAgICAgICAgICAgICdAZGVjbGFyYXRpb25LZXl3b3Jkcyc6ICdrZXl3b3JkLmRlY2xhcmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdAbmFtZXNwYWNlS2V5d29yZHMnOiAna2V5d29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQG90aGVyS2V5d29yZHMnOiAna2V5d29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQGRlZmF1bHQnOiAnZnVuY3Rpb24uY2FsbCdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNpbmcgZnVuY3Rpb24gaW4gYSBtb2R1bGVcbiAgICAgICAgICAgICAgICAvKEBtb2R1bGVOYW1lKShcXHMqKShcXC4pKFxccyopKEB2YXJpYWJsZU5hbWUpLyxcbiAgICAgICAgICAgICAgICBbJ3R5cGUuaWRlbnRpZmllcicsICd3aGl0ZScsICdvcGVyYXRvcicsICd3aGl0ZScsICdmdW5jdGlvbi5jYWxsJ11cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNpbmcgZnVuY3Rpb24gaW4gYW4gRXJsYW5nIG1vZHVsZVxuICAgICAgICAgICAgICAgIC8oOikoQGF0b21OYW1lKShcXHMqKShcXC4pKFxccyopKEB2YXJpYWJsZU5hbWUpLyxcbiAgICAgICAgICAgICAgICBbJ2NvbnN0YW50LnB1bmN0dWF0aW9uJywgJ2NvbnN0YW50JywgJ3doaXRlJywgJ29wZXJhdG9yJywgJ3doaXRlJywgJ2Z1bmN0aW9uLmNhbGwnXVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAvLyBQaXBpbmcgaW50byBhIGZ1bmN0aW9uICh0b2tlbml6ZWQgc2VwYXJhdGVseSBhcyBpdCBtYXkgbm90IGhhdmUgcGFyZW50aGVzZXMpXG4gICAgICAgICAgICAgICAgLyhcXHw+KShcXHMqKShAdmFyaWFibGVOYW1lKS8sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAnb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgICAgICAnd2hpdGUnLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAb3RoZXJLZXl3b3Jkcyc6ICdrZXl3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQGRlZmF1bHQnOiAnZnVuY3Rpb24uY2FsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVmZXJlbmNlIHBhc3NlZCB0byBhbm90aGVyIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgLygmKShcXHMqKShAdmFyaWFibGVOYW1lKS8sXG4gICAgICAgICAgICAgICAgWydvcGVyYXRvcicsICd3aGl0ZScsICdmdW5jdGlvbi5jYWxsJ11cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAvLyBMYW5ndWFnZSBrZXl3b3JkcywgYnVpbHRpbnMsIGNvbnN0YW50cyBhbmQgdmFyaWFibGVzXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgL0B2YXJpYWJsZU5hbWUvLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdAZGVjbGFyYXRpb25LZXl3b3Jkcyc6ICdrZXl3b3JkLmRlY2xhcmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdAb3BlcmF0b3JLZXl3b3Jkcyc6ICdrZXl3b3JkLm9wZXJhdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdAbmFtZXNwYWNlS2V5d29yZHMnOiAna2V5d29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQG90aGVyS2V5d29yZHMnOiAna2V5d29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQGNvbnN0YW50cyc6ICdjb25zdGFudC5sYW5ndWFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQG5hbWVCdWlsdGluJzogJ3ZhcmlhYmxlLmxhbmd1YWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdfLionOiAnY29tbWVudC51bnVzZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0BkZWZhdWx0JzogJ2lkZW50aWZpZXInXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgLy8gTW9kdWxlIG5hbWVzXG4gICAgICAgICAgICBbL0Btb2R1bGVOYW1lLywgJ3R5cGUuaWRlbnRpZmllciddXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFN0cmluZ3NcbiAgICAgICAgc3RyaW5nczogW1xuICAgICAgICAgICAgWy9cIlwiXCIvLCB7IHRva2VuOiAnc3RyaW5nLmRlbGltaXRlcicsIG5leHQ6ICdAZG91YmxlUXVvdGVkSGVyZWRvYycgfV0sXG4gICAgICAgICAgICBbLycnJy8sIHsgdG9rZW46ICdzdHJpbmcuZGVsaW1pdGVyJywgbmV4dDogJ0BzaW5nbGVRdW90ZWRIZXJlZG9jJyB9XSxcbiAgICAgICAgICAgIFsvXCIvLCB7IHRva2VuOiAnc3RyaW5nLmRlbGltaXRlcicsIG5leHQ6ICdAZG91YmxlUXVvdGVkU3RyaW5nJyB9XSxcbiAgICAgICAgICAgIFsvJy8sIHsgdG9rZW46ICdzdHJpbmcuZGVsaW1pdGVyJywgbmV4dDogJ0BzaW5nbGVRdW90ZWRTdHJpbmcnIH1dXG4gICAgICAgIF0sXG4gICAgICAgIGRvdWJsZVF1b3RlZEhlcmVkb2M6IFtcbiAgICAgICAgICAgIFsvXCJcIlwiLywgeyB0b2tlbjogJ3N0cmluZy5kZWxpbWl0ZXInLCBuZXh0OiAnQHBvcCcgfV0sXG4gICAgICAgICAgICB7IGluY2x1ZGU6ICdAc3RyaW5nQ29udGVudEludGVycG9sJyB9XG4gICAgICAgIF0sXG4gICAgICAgIHNpbmdsZVF1b3RlZEhlcmVkb2M6IFtcbiAgICAgICAgICAgIFsvJycnLywgeyB0b2tlbjogJ3N0cmluZy5kZWxpbWl0ZXInLCBuZXh0OiAnQHBvcCcgfV0sXG4gICAgICAgICAgICB7IGluY2x1ZGU6ICdAc3RyaW5nQ29udGVudEludGVycG9sJyB9XG4gICAgICAgIF0sXG4gICAgICAgIGRvdWJsZVF1b3RlZFN0cmluZzogW1xuICAgICAgICAgICAgWy9cIi8sIHsgdG9rZW46ICdzdHJpbmcuZGVsaW1pdGVyJywgbmV4dDogJ0Bwb3AnIH1dLFxuICAgICAgICAgICAgeyBpbmNsdWRlOiAnQHN0cmluZ0NvbnRlbnRJbnRlcnBvbCcgfVxuICAgICAgICBdLFxuICAgICAgICBzaW5nbGVRdW90ZWRTdHJpbmc6IFtcbiAgICAgICAgICAgIFsvJy8sIHsgdG9rZW46ICdzdHJpbmcuZGVsaW1pdGVyJywgbmV4dDogJ0Bwb3AnIH1dLFxuICAgICAgICAgICAgeyBpbmNsdWRlOiAnQHN0cmluZ0NvbnRlbnRJbnRlcnBvbCcgfVxuICAgICAgICBdLFxuICAgICAgICAvLyBBdG9tc1xuICAgICAgICBhdG9tczogW1xuICAgICAgICAgICAgWy8oOikoQGF0b21OYW1lKS8sIFsnY29uc3RhbnQucHVuY3R1YXRpb24nLCAnY29uc3RhbnQnXV0sXG4gICAgICAgICAgICBbLzpcIi8sIHsgdG9rZW46ICdjb25zdGFudC5kZWxpbWl0ZXInLCBuZXh0OiAnQGRvdWJsZVF1b3RlZFN0cmluZ0F0b20nIH1dLFxuICAgICAgICAgICAgWy86Jy8sIHsgdG9rZW46ICdjb25zdGFudC5kZWxpbWl0ZXInLCBuZXh0OiAnQHNpbmdsZVF1b3RlZFN0cmluZ0F0b20nIH1dXG4gICAgICAgIF0sXG4gICAgICAgIGRvdWJsZVF1b3RlZFN0cmluZ0F0b206IFtcbiAgICAgICAgICAgIFsvXCIvLCB7IHRva2VuOiAnY29uc3RhbnQuZGVsaW1pdGVyJywgbmV4dDogJ0Bwb3AnIH1dLFxuICAgICAgICAgICAgeyBpbmNsdWRlOiAnQHN0cmluZ0NvbnN0YW50Q29udGVudEludGVycG9sJyB9XG4gICAgICAgIF0sXG4gICAgICAgIHNpbmdsZVF1b3RlZFN0cmluZ0F0b206IFtcbiAgICAgICAgICAgIFsvJy8sIHsgdG9rZW46ICdjb25zdGFudC5kZWxpbWl0ZXInLCBuZXh0OiAnQHBvcCcgfV0sXG4gICAgICAgICAgICB7IGluY2x1ZGU6ICdAc3RyaW5nQ29uc3RhbnRDb250ZW50SW50ZXJwb2wnIH1cbiAgICAgICAgXSxcbiAgICAgICAgLy8gU2lnaWxzXG4gICAgICAgIC8vIFNlZSBodHRwczovL2VsaXhpci1sYW5nLm9yZy9nZXR0aW5nLXN0YXJ0ZWQvc2lnaWxzLmh0bWxcbiAgICAgICAgLy8gU2lnaWxzIGFsbG93IGZvciB0eXBpbmcgdmFsdWVzIHVzaW5nIHRoZWlyIHRleHR1YWwgcmVwcmVzZW50YXRpb24uXG4gICAgICAgIC8vIEFsbCBzaWdpbHMgc3RhcnQgd2l0aCB+IGZvbGxvd2VkIGJ5IGEgbGV0dGVyIGluZGljYXRpbmcgc2lnaWwgdHlwZVxuICAgICAgICAvLyBhbmQgdGhlbiBhIGRlbGltaXRlciBwYWlyIGVuY2xvc2luZyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbi5cbiAgICAgICAgLy8gT3B0aW9uYWwgbW9kaWZpZXJzIGFyZSBhbGxvd2VkIGFmdGVyIHRoZSBjbG9zaW5nIGRlbGltaXRlci5cbiAgICAgICAgLy8gRm9yIGluc3RhbmNlIGEgcmVndWxhciBleHByZXNzaW9ucyBjYW4gYmUgd3JpdHRlbiBhczpcbiAgICAgICAgLy8gfnIvZm9vfGJhci8gfnJ7Zm9vfGJhcn0gfnIvZm9vfGJhci9nXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEluIGdlbmVyYWwgbG93ZXJjYXNlIHNpZ2lscyBhbGxvdyBmb3IgaW50ZXJwb2xhdGlvblxuICAgICAgICAvLyBhbmQgZXNjYXBlZCBjaGFyYWN0ZXJzLCB3aGVyZWFzIHVwcGVyY2FzZSBzaWdpbHMgZG9uJ3RcbiAgICAgICAgLy9cbiAgICAgICAgLy8gRHVyaW5nIHRva2VuaXphdGlvbiB3ZSB3YW50IHRvIGRpc3Rpbmd1aXNoIHNvbWVcbiAgICAgICAgLy8gc3BlY2lmaWMgc2lnaWwgdHlwZXMsIG5hbWVseSBzdHJpbmcgYW5kIHJlZ2V4cCxcbiAgICAgICAgLy8gc28gdGhhdCB0aGV5IGNlbiBiZSB0aGVtZWQgc2VwYXJhdGVseS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVG8gcmVhc29uYWJseSBoYW5kbGUgYWxsIHRob3NlIGNvbWJpbmF0aW9ucyB3ZSBsZXZlcmFnZVxuICAgICAgICAvLyBkb3Qtc2VwYXJhdGVkIHN0YXRlcywgc28gaWYgd2UgdHJhbnNpdGlvbiB0byBAc2lnaWxTdGFydC5pbnRlcnBvbC5zLnsufVxuICAgICAgICAvLyB0aGVuIFwic2lnaWxTdGFydC5pbnRlcnBvbC5zXCIgc3RhdGUgd2lsbCBtYXRjaCBhbmQgYWxzbyBhbGxcbiAgICAgICAgLy8gdGhlIGluZGl2aWR1YWwgZG90LXNlcGFyYXRlZCBwYXJhbWV0ZXJzIGNhbiBiZSBhY2Nlc3NlZC5cbiAgICAgICAgc2lnaWxzOiBbXG4gICAgICAgICAgICBbL35bYS16XUBzaWdpbFN0YXJ0RGVsaW1pdGVyLywgeyB0b2tlbjogJ0ByZW1hdGNoJywgbmV4dDogJ0BzaWdpbC5pbnRlcnBvbCcgfV0sXG4gICAgICAgICAgICBbL35bQS1aXUBzaWdpbFN0YXJ0RGVsaW1pdGVyLywgeyB0b2tlbjogJ0ByZW1hdGNoJywgbmV4dDogJ0BzaWdpbC5ub0ludGVycG9sJyB9XVxuICAgICAgICBdLFxuICAgICAgICBzaWdpbDogW1xuICAgICAgICAgICAgWy9+KFthLXpBLVpdKVxcey8sIHsgdG9rZW46ICdAcmVtYXRjaCcsIHN3aXRjaFRvOiAnQHNpZ2lsU3RhcnQuJFMyLiQxLnsufScgfV0sXG4gICAgICAgICAgICBbL34oW2EtekEtWl0pXFxbLywgeyB0b2tlbjogJ0ByZW1hdGNoJywgc3dpdGNoVG86ICdAc2lnaWxTdGFydC4kUzIuJDEuWy5dJyB9XSxcbiAgICAgICAgICAgIFsvfihbYS16QS1aXSlcXCgvLCB7IHRva2VuOiAnQHJlbWF0Y2gnLCBzd2l0Y2hUbzogJ0BzaWdpbFN0YXJ0LiRTMi4kMS4oLiknIH1dLFxuICAgICAgICAgICAgWy9+KFthLXpBLVpdKVxcPC8sIHsgdG9rZW46ICdAcmVtYXRjaCcsIHN3aXRjaFRvOiAnQHNpZ2lsU3RhcnQuJFMyLiQxLjwuPicgfV0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgL34oW2EtekEtWl0pKEBzaWdpbFN5bW1ldHJpY0RlbGltaXRlcikvLFxuICAgICAgICAgICAgICAgIHsgdG9rZW46ICdAcmVtYXRjaCcsIHN3aXRjaFRvOiAnQHNpZ2lsU3RhcnQuJFMyLiQxLiQyLiQyJyB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBleHBlY3Qgc3RhdGVzIHRvIGJlIG9mIHRoZSBmb3JtOlxuICAgICAgICAvL1xuICAgICAgICAvLyBzaWdpbFN0YXJ0LjxpbnRlcnBvbC1vci1ub0ludGVycG9sPi48c2lnaWwtbGV0dGVyPi48c3RhcnQtZGVsaW1pdGVyPi48ZW5kLWRlbGltaXRlcj5cbiAgICAgICAgLy8gc2lnaWxDb250aW51ZS48aW50ZXJwb2wtb3Itbm9JbnRlcnBvbD4uPHNpZ2lsLWxldHRlcj4uPHN0YXJ0LWRlbGltaXRlcj4uPGVuZC1kZWxpbWl0ZXI+XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBzaWdpbFN0YXJ0IHN0YXRlIGlzIHVzZWQgb25seSB0byBwcm9wZXJseSBjbGFzc2lmeSB0aGUgdG9rZW4gKGFzIHN0cmluZy9yZWdleC9zaWdpbClcbiAgICAgICAgLy8gYW5kIGltbWVkaWF0ZWx5IHN3aXRjaGVzIHRvIHRoZSBzaWdpbENvbnRpbnVlIHNhdGUsIHdoaWNoIGhhbmRsZXMgdGhlIGFjdHVhbCBjb250ZW50XG4gICAgICAgIC8vIGFuZCB3YWl0cyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZW5kIGRlbGltaXRlci5cbiAgICAgICAgJ3NpZ2lsU3RhcnQuaW50ZXJwb2wucyc6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAvfnNAc2lnaWxTdGFydERlbGltaXRlci8sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbjogJ3N0cmluZy5kZWxpbWl0ZXInLFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUbzogJ0BzaWdpbENvbnRpbnVlLiRTMi4kUzMuJFM0LiRTNSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgICdzaWdpbENvbnRpbnVlLmludGVycG9sLnMnOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgLyhAc2lnaWxFbmREZWxpbWl0ZXIpW2EtekEtWl0qLyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2VzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnJDE9PSRTNSc6IHsgdG9rZW46ICdzdHJpbmcuZGVsaW1pdGVyJywgbmV4dDogJ0Bwb3AnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnQGRlZmF1bHQnOiAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgaW5jbHVkZTogJ0BzdHJpbmdDb250ZW50SW50ZXJwb2wnIH1cbiAgICAgICAgXSxcbiAgICAgICAgJ3NpZ2lsU3RhcnQubm9JbnRlcnBvbC5TJzogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIC9+U0BzaWdpbFN0YXJ0RGVsaW1pdGVyLyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuOiAnc3RyaW5nLmRlbGltaXRlcicsXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvOiAnQHNpZ2lsQ29udGludWUuJFMyLiRTMy4kUzQuJFM1J1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXSxcbiAgICAgICAgJ3NpZ2lsQ29udGludWUubm9JbnRlcnBvbC5TJzogW1xuICAgICAgICAgICAgLy8gSWdub3JlIGVzY2FwZWQgc2lnaWwgZW5kXG4gICAgICAgICAgICBbLyhefFteXFxcXF0pXFxcXEBzaWdpbEVuZERlbGltaXRlci8sICdzdHJpbmcnXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAvKEBzaWdpbEVuZERlbGltaXRlcilbYS16QS1aXSovLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICckMT09JFM1JzogeyB0b2tlbjogJ3N0cmluZy5kZWxpbWl0ZXInLCBuZXh0OiAnQHBvcCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdAZGVmYXVsdCc6ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBpbmNsdWR