diff --git a/.github/workflows/testapp.yml b/.github/workflows/testapp.yml index 248c4df6..96fa3845 100644 --- a/.github/workflows/testapp.yml +++ b/.github/workflows/testapp.yml @@ -16,11 +16,11 @@ jobs: - name: Install dependencies run: go mod tidy - name: Build - run: go build -v ./... + run: go build -tags=cli -v ./... - name: Test with the Go CLI run: | go mod tidy - go build -o build/l2 -ldflags "-X main.version=`git tag --sort=-version:refname | head -n 1`" l2.go - go test -v ./tests/ + go build -tags=cli -o build/l2 -ldflags "-X main.version=`git tag --sort=-version:refname | head -n 1`" l2.go + go test -tags=cli -v ./tests/ - name: Deploy hexmos doc run: curl -X POST --fail -F token=${{ secrets.TRIGGER_TOKEN }} -F ref=main https://git.apps.hexmos.com/api/v4/projects/85/trigger/pipeline \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6d5232b7..6c4e6f9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ build/ lama2 .vscode +buildAndPublish.sh +static/ +.env diff --git a/cmdexec/cmdexec.go b/cmdexec/cmdexec.go index 4b7513ce..e998429c 100644 --- a/cmdexec/cmdexec.go +++ b/cmdexec/cmdexec.go @@ -1,3 +1,5 @@ +//go:build cli + // Package `cmdexec` provides a facility to execute // l2 commands, stream output to stdout, while also // providing ability to retrieve the command output as @@ -11,7 +13,6 @@ import ( "github.com/HexmosTech/httpie-go" "github.com/HexmosTech/lama2/utils" - "github.com/rs/zerolog/log" ) // ExecCommand changes directory to the given `apiDir` @@ -25,10 +26,8 @@ func ExecCommand(cmdSlice []string, stdinBody string, apiDir string) (httpie.ExR utils.ChangeWorkingDir(apiDir) resp, err := httpie.Lama2Entry(cmdSlice, strings.NewReader(stdinBody)) if err != nil { - log.Fatal().Str("Error from the API executor", err.Error()).Msg("") return httpie.ExResponse{}, errors.New("Error from API executor: " + err.Error()) } - log.Debug().Str("Response body from API executor", resp.Body).Msg("") utils.ChangeWorkingDir(oldDir) return resp, nil } diff --git a/cmdexec/cmdexec.wasm.go b/cmdexec/cmdexec.wasm.go new file mode 100644 index 00000000..f490f492 --- /dev/null +++ b/cmdexec/cmdexec.wasm.go @@ -0,0 +1,36 @@ +//go:build wasm + +// Package `cmdexec` provides a facility to execute +// l2 commands, stream output to stdout, while also +// providing ability to retrieve the command output as +// a string. +package cmdexec + +import ( + "errors" + "fmt" + "os" + + "strings" + + "github.com/HexmosTech/httpie-go" +) + +// ExecCommand changes directory to the given `apiDir` +// and then executes the command specified in `cmdStr` +// During command execution, ExecCommand streams output +// to stdout. +// Once execution finishes, previous CWD is restored, +// and the command output is returned as a string +func ExecCommand(cmdSlice []string, stdinBody string, apiDir string) (httpie.ExResponse, error) { + proxyURL := os.Getenv("PROXY_URL") + proxyUserName := os.Getenv("PROXY_USERNAME") + proxyUserPassword := os.Getenv("PROXY_PASSWORD") + allowRedirects := true + resp, err := httpie.Lama2Entry(cmdSlice, strings.NewReader(stdinBody), proxyURL, proxyUserName, proxyUserPassword, allowRedirects) + if err != nil { + fmt.Println("Got error while executing", err) + return httpie.ExResponse{}, errors.New("Error from API executor: " + err.Error()) + } + return resp, nil +} diff --git a/cmdexec/js.go b/cmdexec/js.go index 3aced561..bf621d4d 100644 --- a/cmdexec/js.go +++ b/cmdexec/js.go @@ -1,3 +1,6 @@ +//go:build cli + + package cmdexec import ( @@ -9,7 +12,7 @@ import ( // GetJSVm creates a new goja runtime instance // with console.log enabled -func GetJSVm() *goja.Runtime { +func GetJSVm() interface{} { vm := goja.New() new(require.Registry).Enable(vm) console.Enable(vm) @@ -23,8 +26,11 @@ func GetJSVm() *goja.Runtime { // Note: the vm runtime remains modified; so if // you reuse the vm for other operations, the state // from previous invocations carry over -func RunVMCode(jsCode string, vm *goja.Runtime) { - _, err := vm.RunString(jsCode) +func RunVMCode(jsCode string, vm interface{}) { + if vm == nil { + vm = GetJSVm() + } + _, err := vm.(*goja.Runtime).RunString(jsCode) if ex, ok := err.(*goja.Exception); ok { log.Fatal().Str("Error executing JS processor block", ex.String()).Msg("") } diff --git a/cmdexec/js.wasm.go b/cmdexec/js.wasm.go new file mode 100644 index 00000000..af1e5624 --- /dev/null +++ b/cmdexec/js.wasm.go @@ -0,0 +1,44 @@ +//go:build wasm + +package cmdexec + +import ( + "fmt" + "syscall/js" + "github.com/rs/zerolog/log" +) + +// RunVMCode takes in a JS snippet as a string, executes the code in a JS VM using Web Worker +func RunVMCode(jsCode string, vm interface{}) { + worker := vm.(js.Value) + resultChan := make(chan js.Value) + worker.Call("postMessage", map[string]interface{}{ + "code": jsCode, + }) + + js.Global().Get("addEventListener").Invoke("message", js.FuncOf(func(this js.Value, args []js.Value) interface{} { + resultChan <- args[0].Get("data") + return nil + })) + + result := <-resultChan + err := result.Get("error").String() + if err != "null" { + log.Fatal().Str("Error executing JS processor block", err).Msg("") + } +} + +// GenerateChainCode takes in an HTTP response body and comes up with some JS code to define the "magic variable" result. +func GenerateChainCode(httpRespBody string) string { + fmt.Println("WW: Value of httpRespBody is",httpRespBody) + code := `try { + result = JSON.parse(String.raw` + "`" + httpRespBody + "`" + `) + console.log("Stored as JSON") + } catch (e) { + result = String.raw` + "`" + httpRespBody + "`" + ` + console.log(e) + console.log("Stored as string") + }` + log.Debug().Str("Chain code generated", code).Msg("") + return code +} diff --git a/cmdgen/cmdgen.cli.go b/cmdgen/cmdgen.cli.go new file mode 100644 index 00000000..e256813e --- /dev/null +++ b/cmdgen/cmdgen.cli.go @@ -0,0 +1,16 @@ +//go:build cli + +package cmdgen + +import ( + "github.com/HexmosTech/gabs/v2" + "github.com/HexmosTech/lama2/lama2cmd" + "github.com/rs/zerolog/log" +) + +func ConstructCommand(parsedInput *gabs.Container, o *lama2cmd.Opts) ([]string, string) { + log.Info().Str("ParsedInput", parsedInput.String()).Msg("") + httpv, url, jsonObj, headers, multipartBool, formBool := ConstructCommandHelper(parsedInput) + res, stdinBody := assembleCmdString(httpv, url, jsonObj, headers, multipartBool, formBool, o) + return res, stdinBody +} diff --git a/cmdgen/cmdgen.go b/cmdgen/cmdgen.go index dafd90a7..d4804417 100644 --- a/cmdgen/cmdgen.go +++ b/cmdgen/cmdgen.go @@ -12,30 +12,19 @@ import ( "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/lama2/lama2cmd" - "github.com/rs/zerolog/log" ) +// The assembleCmdString function constructs a httpie +// command string for an HTTP request based on the provided +// HTTP method, URL, JSON object, headers, and options. It also +// handle multipart and form data. func assembleCmdString(httpv string, url string, jsonObj *gabs.Container, headers *gabs.Container, multipart bool, form bool, o *lama2cmd.Opts) ([]string, string) { command := make([]string, 0) - log.Info(). - Str("Type", "Construct Command"). - Str("httpv", httpv). - Str("url", url). - Bool("multipart", multipart). - Bool("form", form). - Msg(fmt.Sprint("Construct parameters")) - - log.Debug(). - Str("JSONObj", jsonObj.String()). - Str("Headers", headers.String()).Msg("") - var files *gabs.Container if multipart { if jsonObj.ExistsP("@files") { files = jsonObj.S("@files") - log.Debug().Str("Files", files.String()).Msg("") jsonObj.Delete("@files") - log.Trace().Str("Shortened JsonObj", jsonObj.String()).Msg("") } } @@ -43,9 +32,7 @@ func assembleCmdString(httpv string, url string, jsonObj *gabs.Container, header if jsonObj != nil && !multipart && !form { dst := &bytes.Buffer{} if err := json.Compact(dst, []byte(jsonObj.String())); err != nil { - log.Fatal(). - Str("Error", err.Error()). - Msg("Couldn't minify JSON") + fmt.Println(err) } jsonStr = dst.String() } @@ -58,7 +45,7 @@ func assembleCmdString(httpv string, url string, jsonObj *gabs.Container, header }*/ command = append(command, "ht ") - if o.Nocolor { + if o != nil && o.Nocolor { command = append(command, "--pretty=none ") } if multipart || form { @@ -105,20 +92,20 @@ func assembleCmdString(httpv string, url string, jsonObj *gabs.Container, header // API file inputs, figures out the type of target command // and finally generates a string representing the generated // command -func ConstructCommand(parsedInput *gabs.Container, o *lama2cmd.Opts) ([]string, string) { - log.Info().Str("ParsedInput", parsedInput.String()).Msg("") +func ConstructCommandHelper(parsedInput *gabs.Container) (string, string, *gabs.Container, *gabs.Container, bool, bool) { + fmt.Println("WW parsedInput:", parsedInput.StringIndent("", " ")) httpv := parsedInput.S("verb", "value") url := parsedInput.S("url", "value") jsonObj := parsedInput.S("details", "ip_data") headers := parsedInput.S("details", "headers") multipart := parsedInput.S("multipart", "value") + form := parsedInput.S("form", "value") multipartBool := false if multipart != nil { multipartBool = true } - form := parsedInput.S("form", "value") formBool := form != nil - - res, stdinBody := assembleCmdString(httpv.Data().(string), url.Data().(string), jsonObj, headers, multipartBool, formBool, o) - return res, stdinBody + fmt.Println("WW httpv:", httpv.Data().(string)) + fmt.Println("WW url:", url.Data().(string)) + return httpv.Data().(string), url.Data().(string), jsonObj, headers, multipartBool, formBool } diff --git a/cmdgen/cmdgen.wasm.go b/cmdgen/cmdgen.wasm.go new file mode 100644 index 00000000..de1d54f0 --- /dev/null +++ b/cmdgen/cmdgen.wasm.go @@ -0,0 +1,14 @@ +//go:build wasm + +package cmdgen + +import ( + "github.com/HexmosTech/gabs/v2" + "github.com/HexmosTech/lama2/lama2cmd" +) + +func ConstructCommand(parsedInput *gabs.Container, o *lama2cmd.Opts) ([]string, string) { + httpv, url, jsonObj, headers, multipartBool, formBool := ConstructCommandHelper(parsedInput) + res, stdinBody := assembleCmdString(httpv, url, jsonObj, headers, multipartBool, formBool, nil) + return res, stdinBody +} diff --git a/codegen/codegen.cli.go b/codegen/codegen.cli.go new file mode 100644 index 00000000..3dd7f6b8 --- /dev/null +++ b/codegen/codegen.cli.go @@ -0,0 +1,92 @@ +//go:build cli + +package codegen + +import ( + "bytes" + _ "embed" + "fmt" + "strings" + "text/template" + + "github.com/HexmosTech/gabs/v2" + "github.com/HexmosTech/lama2/cmdexec" + "github.com/atotto/clipboard" + "github.com/dop251/goja" + "github.com/rs/zerolog/log" +) + +//go:embed httpsnippet.js +var snippetcore string + +var globalVM interface{} + +func initialize() { + globalVM = cmdexec.GetJSVm() +} + +var flag = 0 + +func GenerateTargetCode(targetLangLib string, parsedAPI *gabs.Container) { + convertedSnippetFinal := generateConvertedSippet(targetLangLib, parsedAPI) + fmt.Println("Converted snippet:\n", convertedSnippetFinal) + clipboard.WriteAll(convertedSnippetFinal) + fmt.Println("Code copied to clipboard") +} + +func PrepareHTTPSnippetGenerator(snippetArgs SnippetArgs) string { + var templOutput bytes.Buffer + templStr := `{{.SnippetCore}} + + const snippet = new window.HTTPSnippet({{.HARRequest}}); + + convertedSnippet = snippet.convert('{{.Language}}'{{if .Library }}, '{{.Library}}'{{end}}); + ` + tmpl, _ := template.New("httpsnippet").Parse(templStr) + tmpl.Execute(&templOutput, snippetArgs) + return templOutput.String() +} + +func generateConvertedSippet(targetLangLib string, parsedAPI *gabs.Container) string { + initialize() + parsedAPIblocks := parsedAPI.S("value").Data().(*gabs.Container).Children() + convertedSnippetList := make([]string, 0) + blockLength := len(parsedAPIblocks) + for i, block := range parsedAPIblocks { + log.Debug().Int("Block num", i).Msg("") + log.Debug().Str("Block getting processed", block.String()).Msg("") + blockType := block.S("type").Data().(string) + if blockType == "processor" { + snippet := block.S("value").Data().(*gabs.Container).Data().(string) + log.Debug().Str("Processor block incoming block", block.String()).Msg("") + convertedSnippetList = append(convertedSnippetList, snippet) + } else if blockType == "Lama2File" { + harRequest, flag := GetRequestHARString(block,targetLangLib) + snippetArgs := SnippetArgs{} + lang, lib := SplitLangLib(targetLangLib) + snippetArgs.Language = lang + snippetArgs.Library = lib + snippetArgs.HARRequest = harRequest + snippetArgs.SnippetCore = snippetcore + httpsnippetCode := PrepareHTTPSnippetGenerator(snippetArgs) + vm := cmdexec.GetJSVm() + _, e := vm.(*goja.Runtime).RunString(httpsnippetCode) + if e != nil { + log.Fatal(). + Str("Type", "CodeGen"). + Str("Error", e.Error()). + Msg("Code generator error") + } + convertedSnippet := vm.(*goja.Runtime).Get("convertedSnippet").String() + convertedSnippetWithPostProcessing := postprocessURL(convertedSnippet, flag) + flag = 0 + convertedSnippetList = append(convertedSnippetList, convertedSnippetWithPostProcessing) + } + if i != blockLength-1 { + convertedSnippetList = append(convertedSnippetList, "\n---\n") + } + } + + convertedSnippetFinal := strings.Join(convertedSnippetList, "\n") + return convertedSnippetFinal +} diff --git a/codegen/codegen.go b/codegen/codegen.go index efc76600..0f855c78 100644 --- a/codegen/codegen.go +++ b/codegen/codegen.go @@ -1,24 +1,14 @@ package codegen import ( - "bytes" _ "embed" "fmt" + "net/url" "strings" - "text/template" - - "github.com/dop251/goja" - "github.com/rs/zerolog/log" "github.com/HexmosTech/gabs/v2" - "github.com/HexmosTech/lama2/cmdexec" - "github.com/HexmosTech/lama2/preprocess" - "github.com/atotto/clipboard" ) -//go:embed httpsnippet.js -var snippetcore string - type SnippetArgs struct { Language string Library string @@ -26,23 +16,41 @@ type SnippetArgs struct { SnippetCore string } -var globalVM *goja.Runtime +func GetRequestHARString(block *gabs.Container, targetLang string) (string, int) { + httpv := block.S("verb", "value").String() + httpv = strings.Trim(httpv, `"`) + httpv = strings.Trim(httpv, `'`) + url := block.S("url", "value") + flag := preprocessURL(url) + jsonObj := block.S("details", "ip_data") + headers := block.S("details", "headers") + harObj := gabs.New() -func initialize() { - globalVM = cmdexec.GetJSVm() -} + if strings.Contains(strings.ToLower(targetLang), "python") || strings.Contains(strings.ToLower(targetLang), "shell") || strings.Contains(strings.ToLower(targetLang), "php") { + httpv = strings.ToUpper(httpv) + } + + if jsonObj != nil { + postData := gabs.New() + postData.Set("application/json", "mimeType") + postData.Set(jsonObj.String(), "text") + harObj.Set(postData, "postData") + } -func PrepareHTTPSnippetGenerator(snippetArgs SnippetArgs) string { - var templOutput bytes.Buffer - templStr := `{{.SnippetCore}} + if headers != nil { + headersData, cookiesData := GetHARHeadersCookies(headers) + if cookiesData.String() != "[]" { + harObj.Set(cookiesData, "cookies") + } + harObj.Set(headersData, "headers") + } - const snippet = new window.HTTPSnippet({{.HARRequest}}); - - let convertedSnippet = snippet.convert('{{.Language}}'{{if .Library }}, '{{.Library}}'{{end}}); - ` - tmpl, _ := template.New("httpsnippet").Parse(templStr) - tmpl.Execute(&templOutput, snippetArgs) - return templOutput.String() + harObj.Set(httpv, "method") + harObj.Set(url, "url") + + res := harObj.String() + fmt.Println("HAR request:", res) + return res, flag } // takes in the headers in L2 format, and generates @@ -96,82 +104,48 @@ func GetHARHeadersCookies(headers *gabs.Container) (*gabs.Container, *gabs.Conta return headersData, cookiesData } -func GetRequestHARString(block *gabs.Container) string { - preprocess.ProcessVarsInBlock(block, globalVM) - httpv := block.S("verb", "value") - url := block.S("url", "value") - jsonObj := block.S("details", "ip_data") - headers := block.S("details", "headers") - /* - TODO: Handle multipart case - - multipart := block.S("multipart", "value") - multipartBool := false - if multipart != nil { - multipartBool = true - } - */ - harObj := gabs.New() - - if jsonObj != nil { - postData := gabs.New() - postData.Set("application/json", "mimeType") - postData.Set(jsonObj.String(), "text") - harObj.Set(postData, "postData") - } - - if headers != nil { - headersData, cookiesData := GetHARHeadersCookies(headers) - if cookiesData.String() != "[]" { - harObj.Set(cookiesData, "cookies") - } - harObj.Set(headersData, "headers") - } - - harObj.Set(httpv, "method") - harObj.Set(url, "url") - - res := harObj.String() - return res +func preprocessURL(url *gabs.Container) int { + urls := url.String() + flag := 0 + fmt.Println("URL:", urls) + urls = strings.Trim(urls, `"`) + urls = strings.Trim(urls, `'`) + fmt.Println("URL Updated:", urls) + if !strings.HasPrefix(urls, "https://") && !strings.HasPrefix(urls, "http://") { + fmt.Println("URL does not start with 'https://' or 'http://'") + newURL := "https://" + urls + // if !strings.Contains(newURL, ".com") { + // parts := strings.SplitN(newURL, "://", 2) + // protocol = parts[0] + "://" + // if len(parts) == 2 { + // domain := parts[1] + // newURL = parts[0] + "://" + domain + ".com" + // } else { + // newURL += ".com" + // } + // } + url.Set(newURL) + flag = 1 + } + + // Remove the outermost "${}" to isolate the placeholder content + fmt.Print("URL:", urls) + return flag } -func GenerateTargetCode(targetLangLib string, parsedAPI *gabs.Container) { - initialize() - parsedAPIblocks := parsedAPI.S("value").Data().(*gabs.Container).Children() - convertedSnippetList := make([]string, 0) - - for i, block := range parsedAPIblocks { - log.Debug().Int("Block num", i).Msg("") - log.Debug().Str("Block getting processed", block.String()).Msg("") - blockType := block.S("type").Data().(string) - if blockType == "processor" { - snippet := block.S("value").Data().(*gabs.Container).Data().(string) - convertedSnippetList = append(convertedSnippetList, snippet) - } else if blockType == "Lama2File" { - harRequest := GetRequestHARString(block) - snippetArgs := SnippetArgs{} - lang, lib := SplitLangLib(targetLangLib) - snippetArgs.Language = lang - snippetArgs.Library = lib - snippetArgs.HARRequest = harRequest - snippetArgs.SnippetCore = snippetcore - httpsnippetCode := PrepareHTTPSnippetGenerator(snippetArgs) - - vm := cmdexec.GetJSVm() - _, e := vm.RunString(httpsnippetCode) - if e != nil { - log.Fatal(). - Str("Type", "CodeGen"). - Str("Error", e.Error()). - Msg("Code generator error") - } - // Init returns an error if the package is not ready for use. - convertedSnippet := vm.Get("convertedSnippet").String() - convertedSnippetList = append(convertedSnippetList, convertedSnippet) +func postprocessURL(convertedSnippet string, flag int) string { + fmt.Println("Converted snippet to postprocess:", convertedSnippet) + if flag == 1 { + convertedSnippet = strings.Replace(convertedSnippet, "https://", "", 1) + convertedSnippet = strings.Replace(convertedSnippet, ".com", "", 1) + decodedURL, err := url.QueryUnescape(convertedSnippet) + if err != nil { + fmt.Println("Error decoding URL:", err) + return convertedSnippet } + // decodedURL = strings.Replace(decodedURL, `""`, `"`, -1) removed for python + return decodedURL + // return convertedSnippet } - convertedSnippetFinal := strings.Join(convertedSnippetList, "\n") - fmt.Println(convertedSnippetFinal) - clipboard.WriteAll(convertedSnippetFinal) - fmt.Println("Code copied to clipboard") + return convertedSnippet } diff --git a/codegen/codegen.wasm.go b/codegen/codegen.wasm.go new file mode 100644 index 00000000..27673129 --- /dev/null +++ b/codegen/codegen.wasm.go @@ -0,0 +1,126 @@ +//go:build wasm + +package codegen + +import ( + "bytes" + _ "embed" + "fmt" + "strings" + "syscall/js" + "text/template" + "time" + + "github.com/HexmosTech/gabs/v2" + "github.com/rs/zerolog/log" +) + +//go:embed httpsnippet.js +var snippetcore string + +var flag = 0 + +//go:noinline +func GenerateTargetCode(targetLangLib string, parsedAPI *gabs.Container) string { + convertedSnippetFinal := generateConvertedSippet(targetLangLib, parsedAPI) + fmt.Println("This is the converted snippet:", convertedSnippetFinal) + return convertedSnippetFinal +} + +//go:noinline +func asyncTask(resultChan0 chan<- string) { + time.Sleep(2 * time.Second) + resultChan0 <- "Task Completed" +} + +//go:noinline +func generateConvertedSippet(targetLangLib string, parsedAPI *gabs.Container) string { + parsedAPIblocks := parsedAPI.S("value").Data().(*gabs.Container).Children() + convertedSnippetList := make([]string, 0) + blockLength := len(parsedAPIblocks) + fmt.Println("Parsed API", parsedAPIblocks) + for i, block := range parsedAPIblocks { + blockType := block.S("type").Data().(string) + fmt.Println("Block type:", blockType) + if blockType == "processor" { + fmt.Println("Block type is processor") + snippet := block.S("value").Data().(*gabs.Container).Data().(string) + log.Debug().Str("Processor block incoming block", block.String()).Msg("") + convertedSnippetList = append(convertedSnippetList, snippet) + } else if blockType == "Lama2File" { + fmt.Println("Block type is L2File") + harRequest, flag := GetRequestHARString(block, targetLangLib) + fmt.Println("HAR request:", harRequest) + snippetArgs := SnippetArgs{} + lang, lib := SplitLangLib(targetLangLib) + fmt.Println("Target lang:", lang) + snippetArgs.Language = lang + snippetArgs.Library = lib + snippetArgs.HARRequest = harRequest + snippetArgs.SnippetCore = snippetcore + fmt.Println("Snippet args:", snippetArgs) + httpsnippetCode := PrepareHTTPSnippetGenerator(snippetArgs) + //fmt.Println("httpsnippetCode:", httpsnippetCode) + convertedSnippet := js.Global().Call("eval", httpsnippetCode) + fmt.Println("convertedSnippet data:", convertedSnippet.String()) + // convertedSnippet, err := evaluateJSCode(httpsnippetCode) + // if err != nil { + // log.Fatal(). + // Str("Type", "CodeGen"). + // Str("Error", err.Error()). + // Msg("Code generator error") + // } + convertedSnippetWithPostProcessing := postprocessURL(convertedSnippet.String(), flag) + flag = 0 + convertedSnippetList = append(convertedSnippetList, convertedSnippetWithPostProcessing) + } + if i != blockLength-1 { + convertedSnippetList = append(convertedSnippetList, "\n---\n") + } + } + + convertedSnippetFinal := strings.Join(convertedSnippetList, "\n") + return convertedSnippetFinal +} + +// func PrepareHTTPSnippetGenerator(snippetArgs SnippetArgs) string { +// var templOutput bytes.Buffer +// templStr := `{{.SnippetCore}} + +// const snippet = new window.HTTPSnippet({{.HARRequest}}); + +// window.convertedSnippet = snippet.convert('{{.Language}}'{{if .Library }}, '{{.Library}}'{{end}}); + +// console.log("convertedSnippet results from httpsnippet:",convertedSnippet) + +// function evaluateAsync(jsCode, callback) { +// new Promise((resolve, reject) => { +// setTimeout(() => { +// eval(jsCode); +// resolve(window.convertedSnippet); +// }, 1000); +// }).then(result => { +// callback(result); +// }).catch(error => { +// callback('Error: ' + error.message); +// }); +// } +// ` +// tmpl, _ := template.New("httpsnippet").Parse(templStr) +// tmpl.Execute(&templOutput, snippetArgs) +// return templOutput.String() +// } + +//go:noinline +func PrepareHTTPSnippetGenerator(snippetArgs SnippetArgs) string { + var templOutput bytes.Buffer + templStr := `{{.SnippetCore}} + + const snippet = new window.HTTPSnippet({{.HARRequest}}); + + convertedSnippet = snippet.convert('{{.Language}}'{{if .Library }}, '{{.Library}}'{{end}}); + ` + tmpl, _ := template.New("httpsnippet").Parse(templStr) + tmpl.Execute(&templOutput, snippetArgs) + return templOutput.String() +} diff --git a/codegen/codegenwasmgonew b/codegen/codegenwasmgonew new file mode 100644 index 00000000..70c4f9d5 --- /dev/null +++ b/codegen/codegenwasmgonew @@ -0,0 +1,95 @@ +//go:build wasm + +package codegen + +import ( + "bytes" + _ "embed" + "fmt" + "strings" + "syscall/js" + "text/template" + "time" + + "github.com/HexmosTech/gabs/v2" + "github.com/rs/zerolog/log" +) + +//go:embed httpsnippet.js +var snippetcore string + +var flag = 0 + +func GenerateTargetCode(targetLangLib string, parsedAPI *gabs.Container) string { + convertedSnippetFinal := generateConvertedSippet(targetLangLib, parsedAPI) + fmt.Println("This is the converted snippet:", convertedSnippetFinal) + return convertedSnippetFinal +} + +func asyncTask(resultChan0 chan<- string) { + time.Sleep(2 * time.Second) + resultChan0 <- "Task Completed" +} + + +func generateConvertedSippet(targetLangLib string, parsedAPI *gabs.Container) string { + parsedAPIblocks := parsedAPI.S("value").Data().(*gabs.Container).Children() + convertedSnippetList := make([]string, 0) + blockLength := len(parsedAPIblocks) + fmt.Println("Parsed API", parsedAPIblocks) + for i, block := range parsedAPIblocks { + blockType := block.S("type").Data().(string) + fmt.Println("Block type:", blockType) + if blockType == "processor" { + fmt.Println("Block type is processor") + snippet := block.S("value").Data().(*gabs.Container).Data().(string) + log.Debug().Str("Processor block incoming block", block.String()).Msg("") + convertedSnippetList = append(convertedSnippetList, snippet) + } else if blockType == "Lama2File" { + fmt.Println("CC: 1. Started on L2File block contents:",block) + fmt.Println("Block type is L2File") + harRequest, flag := GetRequestHARString(block) + fmt.Println("CC: 2. Finished HAR request",harRequest) + fmt.Println("HAR request:", harRequest) + snippetArgs := SnippetArgs{} + lang, lib := SplitLangLib(targetLangLib) + fmt.Println("CC: 2.1") + fmt.Println("Target lang:", lang) + snippetArgs.Language = lang + snippetArgs.Library = lib + snippetArgs.HARRequest = harRequest + snippetArgs.SnippetCore = snippetcore + fmt.Println("Snippet args:", snippetArgs) + fmt.Println("CC: 2.2") + httpsnippetCode := PrepareHTTPSnippetGenerator(snippetArgs) + // fmt.Println("CC: 3. Prepared HTTPSnippet",httpsnippetCode) + // fmt.Println("httpsnippetCode:", httpsnippetCode) + fmt.Println("CC: 3.1 Finished preparation, calling converstion") + convertedSnippet := js.Global().Call("eval", httpsnippetCode) + fmt.Println("CC: 4. Converted httpsnippet",convertedSnippet.String()) + fmt.Println("convertedSnippet data:", convertedSnippet.String()) + convertedSnippetWithPostProcessing := postprocessURL(convertedSnippet.String(), flag) + flag = 0 + convertedSnippetList = append(convertedSnippetList, convertedSnippetWithPostProcessing) + } + if i != blockLength-1 { + convertedSnippetList = append(convertedSnippetList, "\n---\n") + } + } + convertedSnippetFinal := strings.Join(convertedSnippetList, "\n") + return convertedSnippetFinal +} + + +func PrepareHTTPSnippetGenerator(snippetArgs SnippetArgs) string { + var templOutput bytes.Buffer + templStr := `{{.SnippetCore}} + + const snippet = new window.HTTPSnippet({{.HARRequest}}); + + convertedSnippet = snippet.convert('{{.Language}}'{{if .Library }}, '{{.Library}}'{{end}}); + ` + tmpl, _ := template.New("httpsnippet").Parse(templStr) + tmpl.Execute(&templOutput, snippetArgs) + return templOutput.String() +} diff --git a/codegen/httpsnippet.js b/codegen/httpsnippet.js index ab9c8e0c..71bf737d 100644 --- a/codegen/httpsnippet.js +++ b/codegen/httpsnippet.js @@ -5723,7 +5723,7 @@ function validateKeyword(definition, throwError) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CodeBuilder": () => (/* binding */ CodeBuilder) +/* harmony export */ CodeBuilder: () => (/* binding */ CodeBuilder) /* harmony export */ }); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } @@ -5777,6 +5777,17 @@ function CodeBuilder() { var newLine = _this.indentLine(line, indentationLevel); _this.code.push(newLine); }); + /** + * Add the line to the end of the last line. Creates a new line + * if no lines exist yet. + */ + _defineProperty(this, "pushToLast", function (line) { + if (!_this.code) { + _this.push(line); + } + var updatedLine = "".concat(_this.code[_this.code.length - 1]).concat(line); + _this.code[_this.code.length - 1] = updatedLine; + }); /** * Add an empty line at the end of current lines */ @@ -5815,9 +5826,9 @@ function CodeBuilder() { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "escapeForDoubleQuotes": () => (/* binding */ escapeForDoubleQuotes), -/* harmony export */ "escapeForSingleQuotes": () => (/* binding */ escapeForSingleQuotes), -/* harmony export */ "escapeString": () => (/* binding */ escapeString) +/* harmony export */ escapeForDoubleQuotes: () => (/* binding */ escapeForDoubleQuotes), +/* harmony export */ escapeForSingleQuotes: () => (/* binding */ escapeForSingleQuotes), +/* harmony export */ escapeString: () => (/* binding */ escapeString) /* harmony export */ }); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } @@ -5847,23 +5858,21 @@ function escapeString(rawValue) { var stringValue = rawValue.toString(); return _toConsumableArray(stringValue).map(function (c) { if (c === '\b') { - return escapeChar + 'b'; + return "".concat(escapeChar, "b"); } else if (c === '\t') { - return escapeChar + 't'; + return "".concat(escapeChar, "t"); } else if (c === '\n') { if (escapeNewlines) { - return escapeChar + 'n'; - } else { - return c; // Don't just continue, or this is caught by < \u0020 + return "".concat(escapeChar, "n"); } + return c; // Don't just continue, or this is caught by < \u0020 } else if (c === '\f') { - return escapeChar + 'f'; + return "".concat(escapeChar, "f"); } else if (c === '\r') { if (escapeNewlines) { - return escapeChar + 'r'; - } else { - return c; // Don't just continue, or this is caught by < \u0020 + return "".concat(escapeChar, "r"); } + return c; // Don't just continue, or this is caught by < \u0020 } else if (c === escapeChar) { return escapeChar + escapeChar; } else if (c === delimiter) { @@ -5874,9 +5883,8 @@ function escapeString(rawValue) { // using this primarily for header values that are generally (though not 100% // strictly?) ASCII-only, this should almost never happen. return JSON.stringify(c).slice(1, -1); - } else { - return c; } + return c; }).join(''); } @@ -5917,8 +5925,8 @@ var escapeForDoubleQuotes = function escapeForDoubleQuotes(value) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "formDataIterator": () => (/* binding */ formDataIterator), -/* harmony export */ "isBlob": () => (/* binding */ isBlob) +/* harmony export */ formDataIterator: () => (/* binding */ formDataIterator), +/* harmony export */ isBlob: () => (/* binding */ isBlob) /* harmony export */ }); function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } @@ -6043,8 +6051,8 @@ var formDataIterator = /*#__PURE__*/_regeneratorRuntime().mark(function formData "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "HARError": () => (/* binding */ HARError), -/* harmony export */ "validateHarRequest": () => (/* binding */ validateHarRequest) +/* harmony export */ HARError: () => (/* binding */ HARError), +/* harmony export */ validateHarRequest: () => (/* binding */ validateHarRequest) /* harmony export */ }); /* harmony import */ var ajv__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ajv */ "./node_modules/ajv/lib/ajv.js"); /* harmony import */ var ajv__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ajv__WEBPACK_IMPORTED_MODULE_0__); @@ -6054,10 +6062,23 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" = function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _callSuper(_this, derived, args) { + function isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + return !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + } catch (e) { + return false; + } + } + derived = _getPrototypeOf(derived); + return _possibleConstructorReturn(_this, isNativeReflectConstruct() ? Reflect.construct(derived, args || [], _getPrototypeOf(_this).constructor) : derived.apply(_this, args)); +} function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct.bind(); } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } @@ -6070,19 +6091,18 @@ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input == var HARError = /*#__PURE__*/function (_Error) { - _inherits(HARError, _Error); - var _super = _createSuper(HARError); function HARError(errors) { - var _this; + var _this2; _classCallCheck(this, HARError); - _this = _super.call(this); - _defineProperty(_assertThisInitialized(_this), "name", 'HARError'); - _defineProperty(_assertThisInitialized(_this), "message", 'validation failed'); - _defineProperty(_assertThisInitialized(_this), "errors", []); - _this.errors = errors; - Error.captureStackTrace(_assertThisInitialized(_this), _this.constructor); - return _this; + _this2 = _callSuper(this, HARError); + _defineProperty(_this2, "name", 'HARError'); + _defineProperty(_this2, "message", 'validation failed'); + _defineProperty(_this2, "errors", []); + _this2.errors = errors; + Error.captureStackTrace(_this2, _this2.constructor); + return _this2; } + _inherits(HARError, _Error); return _createClass(HARError); }( /*#__PURE__*/_wrapNativeSuper(Error)); var ajv = new (ajv__WEBPACK_IMPORTED_MODULE_0___default())({ @@ -6112,10 +6132,10 @@ var validateHarRequest = function validateHarRequest(request) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getHeader": () => (/* binding */ getHeader), -/* harmony export */ "getHeaderName": () => (/* binding */ getHeaderName), -/* harmony export */ "hasHeader": () => (/* binding */ hasHeader), -/* harmony export */ "isMimeTypeJSON": () => (/* binding */ isMimeTypeJSON) +/* harmony export */ getHeader: () => (/* binding */ getHeader), +/* harmony export */ getHeaderName: () => (/* binding */ getHeaderName), +/* harmony export */ hasHeader: () => (/* binding */ hasHeader), +/* harmony export */ isMimeTypeJSON: () => (/* binding */ isMimeTypeJSON) /* harmony export */ }); /** * Given a headers object retrieve a specific header out of it via a case-insensitive key. @@ -6164,7 +6184,7 @@ var isMimeTypeJSON = function isMimeTypeJSON(mimeType) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "reducer": () => (/* binding */ reducer) +/* harmony export */ reducer: () => (/* binding */ reducer) /* harmony export */ }); var reducer = function reducer(accumulator, pair) { var currentValue = accumulator[pair.name]; @@ -6195,8 +6215,8 @@ var reducer = function reducer(accumulator, pair) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "escape": () => (/* binding */ escape), -/* harmony export */ "quote": () => (/* binding */ quote) +/* harmony export */ escape: () => (/* binding */ escape), +/* harmony export */ quote: () => (/* binding */ quote) /* harmony export */ }); /** * Use 'strong quoting' using single quotes so that we only need to deal with nested single quote characters. @@ -6228,8 +6248,8 @@ var escape = function escape(value) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "availableTargets": () => (/* binding */ availableTargets), -/* harmony export */ "extname": () => (/* binding */ extname) +/* harmony export */ availableTargets: () => (/* binding */ availableTargets), +/* harmony export */ extname: () => (/* binding */ extname) /* harmony export */ }); /* harmony import */ var _targets_targets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../targets/targets */ "./src/targets/targets.ts"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } @@ -6264,7 +6284,7 @@ var extname = function extname(targetId) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "libcurl": () => (/* binding */ libcurl) +/* harmony export */ libcurl: () => (/* binding */ libcurl) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -6331,7 +6351,7 @@ var libcurl = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "c": () => (/* binding */ c) +/* harmony export */ c: () => (/* binding */ c) /* harmony export */ }); /* harmony import */ var _libcurl_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./libcurl/client */ "./src/targets/c/libcurl/client.ts"); @@ -6358,7 +6378,7 @@ var c = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "clj_http": () => (/* binding */ clj_http) +/* harmony export */ clj_http: () => (/* binding */ clj_http) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/headers */ "./src/helpers/headers.ts"); @@ -6426,7 +6446,7 @@ var padBlock = function padBlock(padSize, input) { var padding = ' '.repeat(padSize); return input.replace(/\n/g, "\n".concat(padding)); }; -var jsToEdn = function jsToEdn(js) { +var _jsToEdn = function jsToEdn(js) { switch (jsType(js)) { case 'string': return "\"".concat(js.replace(/"/g, '\\"'), "\""); @@ -6442,7 +6462,7 @@ var jsToEdn = function jsToEdn(js) { { // simple vertical format var obj = Object.keys(js).reduce(function (accumulator, key) { - var val = padBlock(key.length + 2, jsToEdn(js[key])); + var val = padBlock(key.length + 2, _jsToEdn(js[key])); return "".concat(accumulator, ":").concat(key, " ").concat(val, "\n "); }, '').trim(); return "{".concat(padBlock(1, obj), "}"); @@ -6451,7 +6471,7 @@ var jsToEdn = function jsToEdn(js) { { // simple horizontal format var arr = js.reduce(function (accumulator, value) { - return "".concat(accumulator, " ").concat(jsToEdn(value)); + return "".concat(accumulator, " ").concat(_jsToEdn(value)); }, '').trim(); return "[".concat(padBlock(1, arr), "]"); } @@ -6556,7 +6576,7 @@ var clj_http = { push("(client/".concat(method, " \"").concat(url, "\")")); } else { var padding = 11 + method.length + url.length; - var formattedParams = padBlock(padding, jsToEdn(filterEmpty(params))); + var formattedParams = padBlock(padding, _jsToEdn(filterEmpty(params))); push("(client/".concat(method, " \"").concat(url, "\" ").concat(formattedParams, ")")); } return join(); @@ -6574,7 +6594,7 @@ var clj_http = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "clojure": () => (/* binding */ clojure) +/* harmony export */ clojure: () => (/* binding */ clojure) /* harmony export */ }); /* harmony import */ var _clj_http_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clj_http/client */ "./src/targets/clojure/clj_http/client.ts"); @@ -6592,6 +6612,109 @@ var clojure = { /***/ }), +/***/ "./src/targets/crystal/native/client.ts": +/*!**********************************************!*\ + !*** ./src/targets/crystal/native/client.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ native: () => (/* binding */ _native) +/* harmony export */ }); +/* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); +/* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); +/** + * @description + * HTTP code snippet generator for native Crystal + * + * @author + * @18183883296 + * + * for any questions or issues regarding the generated code snippet, please open an issue mentioning the author. + */ + + +var _native = { + info: { + key: 'native', + title: 'http::client', + link: 'https://crystal-lang.org/api/master/HTTP/Client.html', + description: 'Crystal HTTP client' + }, + convert: function convert(_ref) { + var rawMethod = _ref.method, + fullUrl = _ref.fullUrl, + postData = _ref.postData, + allHeaders = _ref.allHeaders; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var _options$insecureSkip = options.insecureSkipVerify, + insecureSkipVerify = _options$insecureSkip === void 0 ? false : _options$insecureSkip; + var _CodeBuilder = new _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__.CodeBuilder(), + push = _CodeBuilder.push, + blank = _CodeBuilder.blank, + join = _CodeBuilder.join; + push('require "http/client"'); + blank(); + push("url = \"".concat(fullUrl, "\"")); + var headers = Object.keys(allHeaders); + if (headers.length) { + push('headers = HTTP::Headers{'); + headers.forEach(function (key) { + push(" \"".concat(key, "\" => \"").concat((0,_helpers_escape__WEBPACK_IMPORTED_MODULE_1__.escapeForDoubleQuotes)(allHeaders[key]), "\"")); + }); + push('}'); + } + if (postData.text) { + push("reqBody = ".concat(JSON.stringify(postData.text))); + } + blank(); + var method = rawMethod.toUpperCase(); + var methods = ['GET', 'POST', 'HEAD', 'DELETE', 'PATCH', 'PUT', 'OPTIONS']; + var headersContext = headers.length ? ', headers: headers' : ''; + var bodyContext = postData.text ? ', body: reqBody' : ''; + var sslContext = insecureSkipVerify ? ', tls: OpenSSL::SSL::Context::Client.insecure' : ''; + if (methods.includes(method)) { + push("response = HTTP::Client.".concat(method.toLowerCase(), " url").concat(headersContext).concat(bodyContext).concat(sslContext)); + } else { + push("response = HTTP::Client.exec \"".concat(method, "\", url").concat(headersContext).concat(bodyContext).concat(sslContext)); + } + push('puts response.body'); + return join(); + } +}; + + +/***/ }), + +/***/ "./src/targets/crystal/target.ts": +/*!***************************************!*\ + !*** ./src/targets/crystal/target.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ crystal: () => (/* binding */ crystal) +/* harmony export */ }); +/* harmony import */ var _native_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./native/client */ "./src/targets/crystal/native/client.ts"); + +var crystal = { + info: { + key: 'crystal', + title: 'Crystal', + extname: '.cr', + "default": 'native' + }, + clientsById: { + "native": _native_client__WEBPACK_IMPORTED_MODULE_0__.native + } +}; + +/***/ }), + /***/ "./src/targets/csharp/httpclient/client.ts": /*!*************************************************!*\ !*** ./src/targets/csharp/httpclient/client.ts ***! @@ -6601,7 +6724,7 @@ var clojure = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "httpclient": () => (/* binding */ httpclient) +/* harmony export */ httpclient: () => (/* binding */ httpclient) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -6620,7 +6743,6 @@ var getDecompressionMethods = function getDecompressionMethods(allHeaders) { if (!acceptEncodings) { return []; // no decompression } - var supportedMethods = { gzip: 'DecompressionMethods.GZip', deflate: 'DecompressionMethods.Deflate' @@ -6720,7 +6842,7 @@ var httpclient = { case 'application/x-www-form-urlencoded': push('Content = new FormUrlEncodedContent(new Dictionary', 1); push('{', 1); - (_postData$params = postData.params) === null || _postData$params === void 0 ? void 0 : _postData$params.forEach(function (param) { + (_postData$params = postData.params) === null || _postData$params === void 0 || _postData$params.forEach(function (param) { push("{ \"".concat(param.name, "\", \"").concat(param.value, "\" },"), 2); }); push('}),', 1); @@ -6728,7 +6850,7 @@ var httpclient = { case 'multipart/form-data': push('Content = new MultipartFormDataContent', 1); push('{', 1); - (_postData$params2 = postData.params) === null || _postData$params2 === void 0 ? void 0 : _postData$params2.forEach(function (param) { + (_postData$params2 = postData.params) === null || _postData$params2 === void 0 || _postData$params2.forEach(function (param) { push("new StringContent(".concat(JSON.stringify(param.value || ''), ")"), 2); push('{', 2); push('Headers =', 3); @@ -6783,7 +6905,7 @@ var httpclient = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "restsharp": () => (/* binding */ restsharp) +/* harmony export */ restsharp: () => (/* binding */ restsharp) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -6846,7 +6968,7 @@ var restsharp = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "csharp": () => (/* binding */ csharp) +/* harmony export */ csharp: () => (/* binding */ csharp) /* harmony export */ }); /* harmony import */ var _httpclient_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./httpclient/client */ "./src/targets/csharp/httpclient/client.ts"); /* harmony import */ var _restsharp_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./restsharp/client */ "./src/targets/csharp/restsharp/client.ts"); @@ -6876,7 +6998,7 @@ var csharp = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "native": () => (/* binding */ _native) +/* harmony export */ native: () => (/* binding */ _native) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -7040,7 +7162,7 @@ var _native = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "go": () => (/* binding */ go) +/* harmony export */ go: () => (/* binding */ go) /* harmony export */ }); /* harmony import */ var _native_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./native/client */ "./src/targets/go/native/client.ts"); @@ -7067,7 +7189,7 @@ var go = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "http11": () => (/* binding */ http11) +/* harmony export */ http11: () => (/* binding */ http11) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } @@ -7180,7 +7302,7 @@ var http11 = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "http": () => (/* binding */ http) +/* harmony export */ http: () => (/* binding */ http) /* harmony export */ }); /* harmony import */ var _http1_1_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./http1.1/client */ "./src/targets/http/http1.1/client.ts"); @@ -7207,7 +7329,7 @@ var http = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "asynchttp": () => (/* binding */ asynchttp) +/* harmony export */ asynchttp: () => (/* binding */ asynchttp) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -7281,7 +7403,7 @@ var asynchttp = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "nethttp": () => (/* binding */ nethttp) +/* harmony export */ nethttp: () => (/* binding */ nethttp) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -7351,7 +7473,7 @@ var nethttp = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "okhttp": () => (/* binding */ okhttp) +/* harmony export */ okhttp: () => (/* binding */ okhttp) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -7446,7 +7568,7 @@ var okhttp = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "java": () => (/* binding */ java) +/* harmony export */ java: () => (/* binding */ java) /* harmony export */ }); /* harmony import */ var _asynchttp_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./asynchttp/client */ "./src/targets/java/asynchttp/client.ts"); /* harmony import */ var _nethttp_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nethttp/client */ "./src/targets/java/nethttp/client.ts"); @@ -7482,7 +7604,7 @@ var java = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "unirest": () => (/* binding */ unirest) +/* harmony export */ unirest: () => (/* binding */ unirest) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -7554,7 +7676,7 @@ var unirest = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "axios": () => (/* binding */ axios) +/* harmony export */ axios: () => (/* binding */ axios) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -7674,7 +7796,7 @@ var axios = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "fetch": () => (/* binding */ fetch) +/* harmony export */ fetch: () => (/* binding */ fetch) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -7802,7 +7924,7 @@ var fetch = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "jquery": () => (/* binding */ jquery) +/* harmony export */ jquery: () => (/* binding */ jquery) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -7916,7 +8038,7 @@ var jquery = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "javascript": () => (/* binding */ javascript) +/* harmony export */ javascript: () => (/* binding */ javascript) /* harmony export */ }); /* harmony import */ var _axios_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./axios/client */ "./src/targets/javascript/axios/client.ts"); /* harmony import */ var _fetch_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fetch/client */ "./src/targets/javascript/fetch/client.ts"); @@ -7952,7 +8074,7 @@ var javascript = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "xhr": () => (/* binding */ xhr) +/* harmony export */ xhr: () => (/* binding */ xhr) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -8065,7 +8187,7 @@ var xhr = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "okhttp": () => (/* binding */ okhttp) +/* harmony export */ okhttp: () => (/* binding */ okhttp) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -8160,7 +8282,7 @@ var okhttp = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "kotlin": () => (/* binding */ kotlin) +/* harmony export */ kotlin: () => (/* binding */ kotlin) /* harmony export */ }); /* harmony import */ var _okhttp_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./okhttp/client */ "./src/targets/kotlin/okhttp/client.ts"); @@ -8187,7 +8309,7 @@ var kotlin = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "axios": () => (/* binding */ axios) +/* harmony export */ axios: () => (/* binding */ axios) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -8299,7 +8421,7 @@ var axios = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "fetch": () => (/* binding */ fetch) +/* harmony export */ fetch: () => (/* binding */ fetch) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -8361,7 +8483,7 @@ var fetch = { case 'application/x-www-form-urlencoded': unshift("const { URLSearchParams } = require('url');"); push('const encodedParams = new URLSearchParams();'); - (_postData$params = postData.params) === null || _postData$params === void 0 ? void 0 : _postData$params.forEach(function (param) { + (_postData$params = postData.params) === null || _postData$params === void 0 || _postData$params.forEach(function (param) { push("encodedParams.set('".concat(param.name, "', '").concat(param.value, "');")); }); blank(); @@ -8455,7 +8577,7 @@ var fetch = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "native": () => (/* binding */ _native) +/* harmony export */ native: () => (/* binding */ _native) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -8574,7 +8696,7 @@ var _native = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "request": () => (/* binding */ request) +/* harmony export */ request: () => (/* binding */ request) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -8713,7 +8835,7 @@ var request = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "node": () => (/* binding */ node) +/* harmony export */ node: () => (/* binding */ node) /* harmony export */ }); /* harmony import */ var _axios_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./axios/client */ "./src/targets/node/axios/client.ts"); /* harmony import */ var _fetch_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fetch/client */ "./src/targets/node/fetch/client.ts"); @@ -8752,7 +8874,7 @@ var node = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "unirest": () => (/* binding */ unirest) +/* harmony export */ unirest: () => (/* binding */ unirest) /* harmony export */ }); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stringify-object */ "./node_modules/stringify-object/index.js"); /* harmony import */ var stringify_object__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stringify_object__WEBPACK_IMPORTED_MODULE_0__); @@ -8904,8 +9026,8 @@ var unirest = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "literalRepresentation": () => (/* binding */ literalRepresentation), -/* harmony export */ "nsDeclaration": () => (/* binding */ nsDeclaration) +/* harmony export */ literalRepresentation: () => (/* binding */ _literalRepresentation), +/* harmony export */ nsDeclaration: () => (/* binding */ nsDeclaration) /* harmony export */ }); /** * Create a string corresponding to a valid declaration and initialization of an Objective-C object literal. @@ -8928,7 +9050,7 @@ __webpack_require__.r(__webpack_exports__); */ var nsDeclaration = function nsDeclaration(nsClass, name, parameters, indent) { var opening = "".concat(nsClass, " *").concat(name, " = "); - var literal = literalRepresentation(parameters, indent ? opening.length : undefined); + var literal = _literalRepresentation(parameters, indent ? opening.length : undefined); return "".concat(opening).concat(literal, ";"); }; @@ -8937,7 +9059,7 @@ var nsDeclaration = function nsDeclaration(nsClass, name, parameters, indent) { * * @param value Any JavaScript literal */ -var literalRepresentation = function literalRepresentation(value, indentation) { +var _literalRepresentation = function literalRepresentation(value, indentation) { var join = indentation === undefined ? ', ' : ",\n ".concat(' '.repeat(indentation)); switch (Object.prototype.toString.call(value)) { case '[object Number]': @@ -8945,7 +9067,7 @@ var literalRepresentation = function literalRepresentation(value, indentation) { case '[object Array]': { var valuesRepresentation = value.map(function (value) { - return literalRepresentation(value); + return _literalRepresentation(value); }); return "@[ ".concat(valuesRepresentation.join(join), " ]"); } @@ -8953,7 +9075,7 @@ var literalRepresentation = function literalRepresentation(value, indentation) { { var keyValuePairs = []; for (var key in value) { - keyValuePairs.push("@\"".concat(key, "\": ").concat(literalRepresentation(value[key]))); + keyValuePairs.push("@\"".concat(key, "\": ").concat(_literalRepresentation(value[key]))); } return "@{ ".concat(keyValuePairs.join(join), " }"); } @@ -8967,6 +9089,7 @@ var literalRepresentation = function literalRepresentation(value, indentation) { } }; + /***/ }), /***/ "./src/targets/objc/nsurlsession/client.ts": @@ -8978,7 +9101,7 @@ var literalRepresentation = function literalRepresentation(value, indentation) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "nsurlsession": () => (/* binding */ nsurlsession) +/* harmony export */ nsurlsession: () => (/* binding */ nsurlsession) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers */ "./src/targets/objc/helpers.ts"); @@ -9147,7 +9270,7 @@ var nsurlsession = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "objc": () => (/* binding */ objc) +/* harmony export */ objc: () => (/* binding */ objc) /* harmony export */ }); /* harmony import */ var _nsurlsession_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nsurlsession/client */ "./src/targets/objc/nsurlsession/client.ts"); @@ -9174,7 +9297,7 @@ var objc = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "cohttp": () => (/* binding */ cohttp) +/* harmony export */ cohttp: () => (/* binding */ cohttp) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -9267,7 +9390,7 @@ var cohttp = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ocaml": () => (/* binding */ ocaml) +/* harmony export */ ocaml: () => (/* binding */ ocaml) /* harmony export */ }); /* harmony import */ var _cohttp_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cohttp/client */ "./src/targets/ocaml/cohttp/client.ts"); @@ -9294,7 +9417,7 @@ var ocaml = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "curl": () => (/* binding */ curl) +/* harmony export */ curl: () => (/* binding */ curl) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -9458,7 +9581,7 @@ var curl = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "guzzle": () => (/* binding */ guzzle) +/* harmony export */ guzzle: () => (/* binding */ guzzle) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -9617,12 +9740,12 @@ var guzzle = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "convertType": () => (/* binding */ convertType), -/* harmony export */ "supportedMethods": () => (/* binding */ supportedMethods) +/* harmony export */ convertType: () => (/* binding */ _convertType), +/* harmony export */ supportedMethods: () => (/* binding */ supportedMethods) /* harmony export */ }); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../helpers/escape */ "./src/helpers/escape.ts"); -var convertType = function convertType(obj, indent, lastIndent) { +var _convertType = function convertType(obj, indent, lastIndent) { lastIndent = lastIndent || ''; indent = indent || ''; switch (Object.prototype.toString.call(obj)) { @@ -9640,7 +9763,7 @@ var convertType = function convertType(obj, indent, lastIndent) { case '[object Array]': { var contents = obj.map(function (item) { - return convertType(item, "".concat(indent).concat(indent), indent); + return _convertType(item, "".concat(indent).concat(indent), indent); }).join(",\n".concat(indent)); return "[\n".concat(indent).concat(contents, "\n").concat(lastIndent, "]"); } @@ -9649,7 +9772,7 @@ var convertType = function convertType(obj, indent, lastIndent) { var result = []; for (var i in obj) { if (Object.prototype.hasOwnProperty.call(obj, i)) { - result.push("".concat(convertType(i, indent), " => ").concat(convertType(obj[i], "".concat(indent).concat(indent), indent))); + result.push("".concat(_convertType(i, indent), " => ").concat(_convertType(obj[i], "".concat(indent).concat(indent), indent))); } } return "[\n".concat(indent).concat(result.join(",\n".concat(indent)), "\n").concat(lastIndent, "]"); @@ -9658,6 +9781,7 @@ var convertType = function convertType(obj, indent, lastIndent) { return 'null'; } }; + var supportedMethods = ['ACL', 'BASELINE_CONTROL', 'CHECKIN', 'CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD', 'LABEL', 'LOCK', 'MERGE', 'MKACTIVITY', 'MKCOL', 'MKWORKSPACE', 'MOVE', 'OPTIONS', 'POST', 'PROPFIND', 'PROPPATCH', 'PUT', 'REPORT', 'TRACE', 'UNCHECKOUT', 'UNLOCK', 'UPDATE', 'VERSION_CONTROL']; /***/ }), @@ -9671,7 +9795,7 @@ var supportedMethods = ['ACL', 'BASELINE_CONTROL', 'CHECKIN', 'CHECKOUT', 'CONNE "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "http1": () => (/* binding */ http1) +/* harmony export */ http1: () => (/* binding */ http1) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers */ "./src/targets/php/helpers.ts"); @@ -9786,7 +9910,7 @@ var http1 = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "http2": () => (/* binding */ http2) +/* harmony export */ http2: () => (/* binding */ http2) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/headers */ "./src/helpers/headers.ts"); @@ -9947,7 +10071,7 @@ var http2 = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "php": () => (/* binding */ php) +/* harmony export */ php: () => (/* binding */ php) /* harmony export */ }); /* harmony import */ var _curl_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curl/client */ "./src/targets/php/curl/client.ts"); /* harmony import */ var _guzzle_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./guzzle/client */ "./src/targets/php/guzzle/client.ts"); @@ -9983,7 +10107,7 @@ var php = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "generatePowershellConvert": () => (/* binding */ generatePowershellConvert) +/* harmony export */ generatePowershellConvert: () => (/* binding */ generatePowershellConvert) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../helpers/escape */ "./src/helpers/escape.ts"); @@ -10003,10 +10127,8 @@ var generatePowershellConvert = function generatePowershellConvert(command) { var _CodeBuilder = new _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__.CodeBuilder(), push = _CodeBuilder.push, join = _CodeBuilder.join; - var methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']; - if (!methods.includes(method.toUpperCase())) { - return 'Method not supported'; - } + var methods = ['DEFAULT', 'DELETE', 'GET', 'HEAD', 'MERGE', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']; + var methodArg = methods.includes(method.toUpperCase()) ? '-Method' : '-CustomMethod'; var commandOptions = []; // Add headers, including the cookies @@ -10045,7 +10167,7 @@ var generatePowershellConvert = function generatePowershellConvert(command) { }), "'")); commandOptions.push("-Body '".concat(postData.text, "'")); } - push("$response = ".concat(command, " -Uri '").concat(fullUrl, "' -Method ").concat(method, " ").concat(commandOptions.join(' '))); + push("$response = ".concat(command, " -Uri '").concat(fullUrl, "' ").concat(methodArg, " ").concat(method, " ").concat(commandOptions.join(' '))); return join(); }; return convert; @@ -10062,7 +10184,7 @@ var generatePowershellConvert = function generatePowershellConvert(command) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "restmethod": () => (/* binding */ restmethod) +/* harmony export */ restmethod: () => (/* binding */ restmethod) /* harmony export */ }); /* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common */ "./src/targets/powershell/common.ts"); @@ -10087,7 +10209,7 @@ var restmethod = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "powershell": () => (/* binding */ powershell) +/* harmony export */ powershell: () => (/* binding */ powershell) /* harmony export */ }); /* harmony import */ var _restmethod_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restmethod/client */ "./src/targets/powershell/restmethod/client.ts"); /* harmony import */ var _webrequest_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webrequest/client */ "./src/targets/powershell/webrequest/client.ts"); @@ -10117,7 +10239,7 @@ var powershell = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "webrequest": () => (/* binding */ webrequest) +/* harmony export */ webrequest: () => (/* binding */ webrequest) /* harmony export */ }); /* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common */ "./src/targets/powershell/common.ts"); @@ -10142,7 +10264,7 @@ var webrequest = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "literalRepresentation": () => (/* binding */ literalRepresentation) +/* harmony export */ literalRepresentation: () => (/* binding */ _literalRepresentation) /* harmony export */ }); /** * Create a string corresponding to a Dictionary or Array literal representation with pretty option @@ -10170,7 +10292,7 @@ function concatValues(concatType, values, pretty, indentation, indentLevel) { * @param {Object} opts Target options * @return {string} */ -var literalRepresentation = function literalRepresentation(value, opts, indentLevel) { +var _literalRepresentation = function literalRepresentation(value, opts, indentLevel) { indentLevel = indentLevel === undefined ? 1 : indentLevel + 1; switch (Object.prototype.toString.call(value)) { case '[object Number]': @@ -10183,7 +10305,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe if (Object.prototype.toString.call(v) === '[object Object]') { pretty = Object.keys(v).length > 1; } - return literalRepresentation(v, opts, indentLevel); + return _literalRepresentation(v, opts, indentLevel); }); return concatValues('array', valuesRepresentation, pretty, opts.indent, indentLevel); } @@ -10191,7 +10313,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe { var keyValuePairs = []; for (var key in value) { - keyValuePairs.push("\"".concat(key, "\": ").concat(literalRepresentation(value[key], opts, indentLevel))); + keyValuePairs.push("\"".concat(key, "\": ").concat(_literalRepresentation(value[key], opts, indentLevel))); } return concatValues('object', keyValuePairs, opts.pretty && keyValuePairs.length > 1, opts.indent, indentLevel); } @@ -10207,6 +10329,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe } }; + /***/ }), /***/ "./src/targets/python/python3/client.ts": @@ -10218,7 +10341,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "python3": () => (/* binding */ python3) +/* harmony export */ python3: () => (/* binding */ python3) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -10334,7 +10457,7 @@ var python3 = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "requests": () => (/* binding */ requests) +/* harmony export */ requests: () => (/* binding */ requests) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -10529,7 +10652,7 @@ var requests = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "python": () => (/* binding */ python) +/* harmony export */ python: () => (/* binding */ python) /* harmony export */ }); /* harmony import */ var _python3_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./python3/client */ "./src/targets/python/python3/client.ts"); /* harmony import */ var _requests_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./requests/client */ "./src/targets/python/requests/client.ts"); @@ -10559,7 +10682,7 @@ var python = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "httr": () => (/* binding */ httr) +/* harmony export */ httr: () => (/* binding */ httr) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -10699,7 +10822,7 @@ var httr = { return !!x; }).join(', '); if (headerAdditions) { - request += ', ' + headerAdditions; + request += ", ".concat(headerAdditions); } if (postData.text || postData.jsonObj || postData.params) { request += ', encode = encode'; @@ -10724,7 +10847,7 @@ var httr = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "r": () => (/* binding */ r) +/* harmony export */ r: () => (/* binding */ r) /* harmony export */ }); /* harmony import */ var _httr_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./httr/client */ "./src/targets/r/httr/client.ts"); @@ -10742,6 +10865,111 @@ var r = { /***/ }), +/***/ "./src/targets/ruby/faraday/client.ts": +/*!********************************************!*\ + !*** ./src/targets/ruby/faraday/client.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ faraday: () => (/* binding */ faraday) +/* harmony export */ }); +/* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); +/* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); + + +var faraday = { + info: { + key: 'faraday', + title: 'faraday', + link: 'https://github.com/lostisland/faraday', + description: 'Faraday HTTP client' + }, + convert: function convert(_ref) { + var uriObj = _ref.uriObj, + queryObj = _ref.queryObj, + rawMethod = _ref.method, + postData = _ref.postData, + allHeaders = _ref.allHeaders; + var _CodeBuilder = new _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__.CodeBuilder(), + push = _CodeBuilder.push, + blank = _CodeBuilder.blank, + join = _CodeBuilder.join; + + // To support custom methods we check for the supported methods + // and if doesn't exist then we build a custom class for it + var method = rawMethod.toUpperCase(); + var methods = ['GET', 'POST', 'HEAD', 'DELETE', 'PATCH', 'PUT', 'OPTIONS', 'COPY', 'LOCK', 'UNLOCK', 'MOVE', 'TRACE']; + if (!methods.includes(method)) { + push("# Faraday cannot currently run ".concat(method, " requests. Please use another client.")); + return join(); + } + push("require 'faraday'"); + blank(); + + // Write body to beginning of script + if (postData.mimeType === 'application/x-www-form-urlencoded') { + if (postData.params) { + push("data = {"); + postData.params.forEach(function (param) { + push(" :".concat(param.name, " => ").concat(JSON.stringify(param.value), ",")); + }); + push("}"); + blank(); + } + } + push("conn = Faraday.new("); + push(" url: '".concat(uriObj.protocol, "//").concat(uriObj.host, "',")); + if (allHeaders['content-type'] || allHeaders['Content-Type']) { + push(" headers: {'Content-Type' => '".concat(allHeaders['content-type'] || allHeaders['Content-Type'], "'}")); + } + push(")"); + blank(); + push("response = conn.".concat(method.toLowerCase(), "('").concat(uriObj.pathname, "') do |req|")); + var headers = Object.keys(allHeaders); + if (headers.length) { + headers.forEach(function (key) { + if (key.toLowerCase() !== 'content-type') { + push(" req.headers['".concat(key, "'] = '").concat((0,_helpers_escape__WEBPACK_IMPORTED_MODULE_1__.escapeForSingleQuotes)(allHeaders[key]), "'")); + } + }); + } + Object.keys(queryObj).forEach(function (name) { + var value = queryObj[name]; + if (Array.isArray(value)) { + push(" req.params['".concat(name, "'] = ").concat(JSON.stringify(value))); + } else { + push(" req.params['".concat(name, "'] = '").concat(value, "'")); + } + }); + switch (postData.mimeType) { + case 'application/x-www-form-urlencoded': + if (postData.params) { + push(" req.body = URI.encode_www_form(data)"); + } + break; + case 'application/json': + if (postData.jsonObj) { + push(" req.body = ".concat(JSON.stringify(postData.text))); + } + break; + default: + if (postData.text) { + push(" req.body = ".concat(JSON.stringify(postData.text))); + } + } + push('end'); + blank(); + push('puts response.status'); + push('puts response.body'); + return join(); + } +}; + +/***/ }), + /***/ "./src/targets/ruby/native/client.ts": /*!*******************************************!*\ !*** ./src/targets/ruby/native/client.ts ***! @@ -10751,7 +10979,7 @@ var r = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "native": () => (/* binding */ _native) +/* harmony export */ native: () => (/* binding */ _native) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_escape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/escape */ "./src/helpers/escape.ts"); @@ -10833,9 +11061,11 @@ var _native = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ruby": () => (/* binding */ ruby) +/* harmony export */ ruby: () => (/* binding */ ruby) /* harmony export */ }); -/* harmony import */ var _native_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./native/client */ "./src/targets/ruby/native/client.ts"); +/* harmony import */ var _faraday_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./faraday/client */ "./src/targets/ruby/faraday/client.ts"); +/* harmony import */ var _native_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./native/client */ "./src/targets/ruby/native/client.ts"); + var ruby = { info: { @@ -10845,27 +11075,109 @@ var ruby = { "default": 'native' }, clientsById: { - "native": _native_client__WEBPACK_IMPORTED_MODULE_0__.native + "native": _native_client__WEBPACK_IMPORTED_MODULE_1__.native, + faraday: _faraday_client__WEBPACK_IMPORTED_MODULE_0__.faraday } }; /***/ }), -/***/ "./src/targets/shell/curl/client.ts": -/*!******************************************!*\ - !*** ./src/targets/shell/curl/client.ts ***! - \******************************************/ +/***/ "./src/targets/rust/helpers.ts": +/*!*************************************!*\ + !*** ./src/targets/rust/helpers.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ literalRepresentation: () => (/* binding */ _literalRepresentation) +/* harmony export */ }); +function concatValues(concatType, values, pretty, indentation, indentLevel) { + var currentIndent = indentation.repeat(indentLevel); + var closingBraceIndent = indentation.repeat(indentLevel - 1); + var join = pretty ? ",\n".concat(currentIndent) : ', '; + var openingBrace = concatType === 'object' ? 'json!({' : '('; + var closingBrace = concatType === 'object' ? '})' : ')'; + if (pretty) { + return "".concat(openingBrace, "\n").concat(currentIndent).concat(values.join(join), "\n").concat(closingBraceIndent).concat(closingBrace); + } + return "".concat(openingBrace).concat(values.join(join)).concat(closingBrace); +} + +/** + * Create a valid Rust string of a literal value using serde_json according to its type. + * + * @param {*} value Any Javascript literal + * @param {Object} opts Target options + * @return {string} + */ +var _literalRepresentation = function literalRepresentation(value, opts, indentLevel) { + /* + * Note: this version is almost entirely borrowed from the Python client helper. The + * only real modification involves the braces and the types. The helper + * could potentially be parameterised for reuse. + */ + indentLevel = indentLevel === undefined ? 1 : indentLevel + 1; + switch (Object.prototype.toString.call(value)) { + case '[object Number]': + return value; + case '[object Array]': + { + var pretty = false; + var valuesRep = value.map(function (v) { + // Switch to prettify if the value is a dict with more than one key. + if (Object.prototype.toString.call(v) === '[object Object]') { + pretty = Object.keys(v).length > 1; + } + return _literalRepresentation(v, opts, indentLevel); + }); + return concatValues('array', valuesRep, pretty, opts.indent, indentLevel); + } + case '[object Object]': + { + var keyValuePairs = []; + for (var key in value) { + keyValuePairs.push("\"".concat(key, "\": ").concat(_literalRepresentation(value[key], opts, indentLevel))); + } + return concatValues('object', keyValuePairs, opts.pretty && keyValuePairs.length > 1, opts.indent, indentLevel); + } + case '[object Null]': + return 'json!(null)'; + case '[object Boolean]': + return value ? 'true' : 'false'; + default: + if (value === null || value === undefined) { + return ''; + } + return "\"".concat(value.toString().replace(/"/g, '\\"'), "\""); + } +}; + + +/***/ }), + +/***/ "./src/targets/rust/reqwest/client.ts": +/*!********************************************!*\ + !*** ./src/targets/rust/reqwest/client.ts ***! + \********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "curl": () => (/* binding */ curl) +/* harmony export */ reqwest: () => (/* binding */ reqwest) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); -/* harmony import */ var _helpers_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/headers */ "./src/helpers/headers.ts"); -/* harmony import */ var _helpers_shell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../helpers/shell */ "./src/helpers/shell.ts"); +/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers */ "./src/targets/rust/helpers.ts"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -10873,27 +11185,299 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _ty function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /** * @description - * - * HTTP code snippet generator for the Shell using cURL. + * HTTP code snippet generator for Rust using reqwest * * @author - * @AhmadNassri + * @Benjscho * * for any questions or issues regarding the generated code snippet, please open an issue mentioning the author. */ - -/** - * This is a const record with keys that correspond to the long names and values that correspond to the short names for cURL arguments. - */ -var params = { - 'http1.0': '0', - 'url ': '', - cookie: 'b', - data: 'd', - form: 'F', +var reqwest = { + info: { + key: 'reqwest', + title: 'reqwest', + link: 'https://docs.rs/reqwest/latest/reqwest/', + description: 'reqwest HTTP library' + }, + convert: function convert(_ref, options) { + var queryObj = _ref.queryObj, + url = _ref.url, + postData = _ref.postData, + allHeaders = _ref.allHeaders, + method = _ref.method; + var opts = _objectSpread({ + indent: ' ', + pretty: true + }, options); + var indentLevel = 0; + + // start snippet + var _CodeBuilder = new _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__.CodeBuilder({ + indent: opts.indent + }), + push = _CodeBuilder.push, + blank = _CodeBuilder.blank, + join = _CodeBuilder.join, + pushToLast = _CodeBuilder.pushToLast, + unshift = _CodeBuilder.unshift; + + // import reqwest + push('use reqwest;', indentLevel); + blank(); + + // start async main for tokio + push('#[tokio::main]', indentLevel); + push('pub async fn main() {', indentLevel); + indentLevel += 1; + + // add url + push("let url = \"".concat(url, "\";"), indentLevel); + blank(); + var hasQuery = false; + // construct query string + if (Object.keys(queryObj).length) { + hasQuery = true; + push('let querystring = [', indentLevel); + indentLevel += 1; + for (var _i = 0, _Object$entries = Object.entries(queryObj); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + push("(\"".concat(key, "\", \"").concat(value, "\"),"), indentLevel); + } + indentLevel -= 1; + push('];', indentLevel); + blank(); + } + + // construct payload + var payload = {}; + var files = {}; + var hasFiles = false; + var hasForm = false; + var hasBody = false; + var jsonPayload = false; + var isMultipart = false; + switch (postData.mimeType) { + case 'application/json': + if (postData.jsonObj) { + push("let payload = ".concat((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.literalRepresentation)(postData.jsonObj, opts, indentLevel), ";"), indentLevel); + } + jsonPayload = true; + break; + case 'multipart/form-data': + isMultipart = true; + if (!postData.params) { + push("let form = reqwest::multipart::Form::new()", indentLevel); + push(".text(\"\", \"\");", indentLevel + 1); + break; + } + payload = {}; + postData.params.forEach(function (p) { + if (p.fileName) { + files[p.name] = p.fileName; + hasFiles = true; + } else { + payload[p.name] = p.value; + } + }); + if (hasFiles) { + var _iterator = _createForOfIteratorHelper(fileToPartString), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var line = _step.value; + push(line, indentLevel); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + blank(); + } + push("let form = reqwest::multipart::Form::new()", indentLevel); + for (var _i2 = 0, _Object$entries2 = Object.entries(files); _i2 < _Object$entries2.length; _i2++) { + var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2), + name = _Object$entries2$_i[0], + fileName = _Object$entries2$_i[1]; + push(".part(\"".concat(name, "\", file_to_part(\"").concat(fileName, "\").await)"), indentLevel + 1); + } + for (var _i3 = 0, _Object$entries3 = Object.entries(payload); _i3 < _Object$entries3.length; _i3++) { + var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i3], 2), + _name = _Object$entries3$_i[0], + _value = _Object$entries3$_i[1]; + push(".text(\"".concat(_name, "\", \"").concat(_value, "\")"), indentLevel + 1); + } + pushToLast(';'); + break; + default: + { + if (postData.mimeType === 'application/x-www-form-urlencoded' && postData.paramsObj) { + push("let payload = ".concat((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.literalRepresentation)(postData.paramsObj, opts, indentLevel), ";"), indentLevel); + hasForm = true; + break; + } + if (postData.text) { + push("let payload = ".concat((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.literalRepresentation)(postData.text, opts, indentLevel), ";"), indentLevel); + hasBody = true; + break; + } + } + } + if (hasForm || jsonPayload || hasBody) { + unshift("use serde_json::json;"); + blank(); + } + var hasHeaders = false; + // construct headers + if (Object.keys(allHeaders).length) { + hasHeaders = true; + push('let mut headers = reqwest::header::HeaderMap::new();', indentLevel); + for (var _i4 = 0, _Object$entries4 = Object.entries(allHeaders); _i4 < _Object$entries4.length; _i4++) { + var _Object$entries4$_i = _slicedToArray(_Object$entries4[_i4], 2), + _key = _Object$entries4$_i[0], + _value2 = _Object$entries4$_i[1]; + // Skip setting content-type if there is a file, as this header will + // cause the request to hang, and reqwest will set it for us. + if (_key.toLowerCase() === 'content-type' && isMultipart) { + continue; + } + push("headers.insert(\"".concat(_key, "\", ").concat((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.literalRepresentation)(_value2, opts), ".parse().unwrap());"), indentLevel); + } + blank(); + } + + // construct client + push('let client = reqwest::Client::new();', indentLevel); + + // construct query + switch (method) { + case 'POST': + push("let response = client.post(url)", indentLevel); + break; + case 'GET': + push("let response = client.get(url)", indentLevel); + break; + default: + { + push("let response = client.request(reqwest::Method::from_str(\"".concat(method, "\").unwrap(), url)"), indentLevel); + unshift("use std::str::FromStr;"); + break; + } + } + if (hasQuery) { + push(".query(&querystring)", indentLevel + 1); + } + if (isMultipart) { + push(".multipart(form)", indentLevel + 1); + } + if (hasHeaders) { + push(".headers(headers)", indentLevel + 1); + } + if (jsonPayload) { + push(".json(&payload)", indentLevel + 1); + } + if (hasForm) { + push(".form(&payload)", indentLevel + 1); + } + if (hasBody) { + push(".body(payload)", indentLevel + 1); + } + + // send query + push('.send()', indentLevel + 1); + push('.await;', indentLevel + 1); + blank(); + + // Print response + push('let results = response.unwrap()', indentLevel); + push('.json::()', indentLevel + 1); + push('.await', indentLevel + 1); + push('.unwrap();', indentLevel + 1); + blank(); + push('dbg!(results);', indentLevel); + push('}\n'); + return join(); + } +}; +var fileToPartString = ["async fn file_to_part(file_name: &'static str) -> reqwest::multipart::Part {", " let file = tokio::fs::File::open(file_name).await.unwrap();", " let stream = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new());", " let body = reqwest::Body::wrap_stream(stream);", " reqwest::multipart::Part::stream(body)", " .file_name(file_name)", " .mime_str(\"text/plain\").unwrap()", "}"]; + +/***/ }), + +/***/ "./src/targets/rust/target.ts": +/*!************************************!*\ + !*** ./src/targets/rust/target.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ rust: () => (/* binding */ rust) +/* harmony export */ }); +/* harmony import */ var _reqwest_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reqwest/client */ "./src/targets/rust/reqwest/client.ts"); + +var rust = { + info: { + key: 'rust', + title: 'Rust', + extname: '.rs', + "default": 'reqwest' + }, + clientsById: { + reqwest: _reqwest_client__WEBPACK_IMPORTED_MODULE_0__.reqwest + } +}; + +/***/ }), + +/***/ "./src/targets/shell/curl/client.ts": +/*!******************************************!*\ + !*** ./src/targets/shell/curl/client.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ curl: () => (/* binding */ curl) +/* harmony export */ }); +/* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); +/* harmony import */ var _helpers_headers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/headers */ "./src/helpers/headers.ts"); +/* harmony import */ var _helpers_shell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../helpers/shell */ "./src/helpers/shell.ts"); +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +/** + * @description + * + * HTTP code snippet generator for the Shell using cURL. + * + * @author + * @AhmadNassri + * + * for any questions or issues regarding the generated code snippet, please open an issue mentioning the author. + */ + + + + +/** + * This is a const record with keys that correspond to the long names and values that correspond to the short names for cURL arguments. + */ +var params = { + 'http1.0': '0', + 'url ': '', + cookie: 'b', + data: 'd', + form: 'F', globoff: 'g', header: 'H', insecure: 'k', @@ -10995,7 +11579,7 @@ var curl = { // construct post params switch (postData.mimeType) { case 'multipart/form-data': - (_postData$params = postData.params) === null || _postData$params === void 0 ? void 0 : _postData$params.forEach(function (param) { + (_postData$params = postData.params) === null || _postData$params === void 0 || _postData$params.forEach(function (param) { var post = ''; if (param.fileName) { post = "".concat(param.name, "=@").concat(param.fileName); @@ -11070,7 +11654,7 @@ var curl = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "httpie": () => (/* binding */ httpie) +/* harmony export */ httpie: () => (/* binding */ httpie) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_shell__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/shell */ "./src/helpers/shell.ts"); @@ -11209,7 +11793,7 @@ var httpie = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "shell": () => (/* binding */ shell) +/* harmony export */ shell: () => (/* binding */ shell) /* harmony export */ }); /* harmony import */ var _curl_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curl/client */ "./src/targets/shell/curl/client.ts"); /* harmony import */ var _httpie_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./httpie/client */ "./src/targets/shell/httpie/client.ts"); @@ -11242,7 +11826,7 @@ var shell = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "wget": () => (/* binding */ wget) +/* harmony export */ wget: () => (/* binding */ wget) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers_shell__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../helpers/shell */ "./src/helpers/shell.ts"); @@ -11318,8 +11902,8 @@ var wget = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "literalDeclaration": () => (/* binding */ literalDeclaration), -/* harmony export */ "literalRepresentation": () => (/* binding */ literalRepresentation) +/* harmony export */ literalDeclaration: () => (/* binding */ literalDeclaration), +/* harmony export */ literalRepresentation: () => (/* binding */ _literalRepresentation) /* harmony export */ }); /** * Create an string of given length filled with blank spaces @@ -11353,7 +11937,7 @@ var concatArray = function concatArray(arr, pretty, indentation, indentLevel) { * @return {string} */ var literalDeclaration = function literalDeclaration(name, parameters, opts) { - return "let ".concat(name, " = ").concat(literalRepresentation(parameters, opts)); + return "let ".concat(name, " = ").concat(_literalRepresentation(parameters, opts)); }; /** @@ -11362,7 +11946,7 @@ var literalDeclaration = function literalDeclaration(name, parameters, opts) { * @param value Any JavaScript literal * @param opts Target options */ -var literalRepresentation = function literalRepresentation(value, opts, indentLevel) { +var _literalRepresentation = function literalRepresentation(value, opts, indentLevel) { indentLevel = indentLevel === undefined ? 1 : indentLevel + 1; switch (Object.prototype.toString.call(value)) { case '[object Number]': @@ -11376,7 +11960,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe if (Object.prototype.toString.call(v) === '[object Object]') { pretty = Object.keys(v).length > 1; } - return literalRepresentation(v, opts, indentLevel); + return _literalRepresentation(v, opts, indentLevel); }); // @ts-expect-error needs better types return concatArray(valuesRepresentation, pretty, opts.indent, indentLevel); @@ -11385,7 +11969,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe { var keyValuePairs = []; for (var key in value) { - keyValuePairs.push("\"".concat(key, "\": ").concat(literalRepresentation(value[key], opts, indentLevel))); + keyValuePairs.push("\"".concat(key, "\": ").concat(_literalRepresentation(value[key], opts, indentLevel))); } return concatArray(keyValuePairs, // @ts-expect-error needs better types @@ -11403,6 +11987,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe } }; + /***/ }), /***/ "./src/targets/swift/nsurlsession/client.ts": @@ -11414,7 +11999,7 @@ var literalRepresentation = function literalRepresentation(value, opts, indentLe "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "nsurlsession": () => (/* binding */ nsurlsession) +/* harmony export */ nsurlsession: () => (/* binding */ nsurlsession) /* harmony export */ }); /* harmony import */ var _helpers_code_builder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../helpers/code-builder */ "./src/helpers/code-builder.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers */ "./src/targets/swift/helpers.ts"); @@ -11588,7 +12173,7 @@ var nsurlsession = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "swift": () => (/* binding */ swift) +/* harmony export */ swift: () => (/* binding */ swift) /* harmony export */ }); /* harmony import */ var _nsurlsession_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nsurlsession/client */ "./src/targets/swift/nsurlsession/client.ts"); @@ -11615,30 +12200,32 @@ var swift = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "addTarget": () => (/* binding */ addTarget), -/* harmony export */ "addTargetClient": () => (/* binding */ addTargetClient), -/* harmony export */ "isClient": () => (/* binding */ isClient), -/* harmony export */ "isTarget": () => (/* binding */ isTarget), -/* harmony export */ "targets": () => (/* binding */ targets) +/* harmony export */ addTarget: () => (/* binding */ addTarget), +/* harmony export */ addTargetClient: () => (/* binding */ addTargetClient), +/* harmony export */ isClient: () => (/* binding */ isClient), +/* harmony export */ isTarget: () => (/* binding */ isTarget), +/* harmony export */ targets: () => (/* binding */ targets) /* harmony export */ }); /* harmony import */ var _c_target__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./c/target */ "./src/targets/c/target.ts"); /* harmony import */ var _clojure_target__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clojure/target */ "./src/targets/clojure/target.ts"); -/* harmony import */ var _csharp_target__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./csharp/target */ "./src/targets/csharp/target.ts"); -/* harmony import */ var _go_target__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./go/target */ "./src/targets/go/target.ts"); -/* harmony import */ var _http_target__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./http/target */ "./src/targets/http/target.ts"); -/* harmony import */ var _java_target__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./java/target */ "./src/targets/java/target.ts"); -/* harmony import */ var _javascript_target__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./javascript/target */ "./src/targets/javascript/target.ts"); -/* harmony import */ var _kotlin_target__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./kotlin/target */ "./src/targets/kotlin/target.ts"); -/* harmony import */ var _node_target__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./node/target */ "./src/targets/node/target.ts"); -/* harmony import */ var _objc_target__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./objc/target */ "./src/targets/objc/target.ts"); -/* harmony import */ var _ocaml_target__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ocaml/target */ "./src/targets/ocaml/target.ts"); -/* harmony import */ var _php_target__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./php/target */ "./src/targets/php/target.ts"); -/* harmony import */ var _powershell_target__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./powershell/target */ "./src/targets/powershell/target.ts"); -/* harmony import */ var _python_target__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./python/target */ "./src/targets/python/target.ts"); -/* harmony import */ var _r_target__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./r/target */ "./src/targets/r/target.ts"); -/* harmony import */ var _ruby_target__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./ruby/target */ "./src/targets/ruby/target.ts"); -/* harmony import */ var _shell_target__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./shell/target */ "./src/targets/shell/target.ts"); -/* harmony import */ var _swift_target__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./swift/target */ "./src/targets/swift/target.ts"); +/* harmony import */ var _crystal_target__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./crystal/target */ "./src/targets/crystal/target.ts"); +/* harmony import */ var _csharp_target__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./csharp/target */ "./src/targets/csharp/target.ts"); +/* harmony import */ var _go_target__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./go/target */ "./src/targets/go/target.ts"); +/* harmony import */ var _http_target__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./http/target */ "./src/targets/http/target.ts"); +/* harmony import */ var _java_target__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./java/target */ "./src/targets/java/target.ts"); +/* harmony import */ var _javascript_target__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./javascript/target */ "./src/targets/javascript/target.ts"); +/* harmony import */ var _kotlin_target__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./kotlin/target */ "./src/targets/kotlin/target.ts"); +/* harmony import */ var _node_target__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./node/target */ "./src/targets/node/target.ts"); +/* harmony import */ var _objc_target__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./objc/target */ "./src/targets/objc/target.ts"); +/* harmony import */ var _ocaml_target__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ocaml/target */ "./src/targets/ocaml/target.ts"); +/* harmony import */ var _php_target__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./php/target */ "./src/targets/php/target.ts"); +/* harmony import */ var _powershell_target__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./powershell/target */ "./src/targets/powershell/target.ts"); +/* harmony import */ var _python_target__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./python/target */ "./src/targets/python/target.ts"); +/* harmony import */ var _r_target__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./r/target */ "./src/targets/r/target.ts"); +/* harmony import */ var _ruby_target__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ruby/target */ "./src/targets/ruby/target.ts"); +/* harmony import */ var _rust_target__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./rust/target */ "./src/targets/rust/target.ts"); +/* harmony import */ var _shell_target__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./shell/target */ "./src/targets/shell/target.ts"); +/* harmony import */ var _swift_target__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./swift/target */ "./src/targets/swift/target.ts"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } @@ -11658,25 +12245,29 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" = + + var targets = { c: _c_target__WEBPACK_IMPORTED_MODULE_0__.c, clojure: _clojure_target__WEBPACK_IMPORTED_MODULE_1__.clojure, - csharp: _csharp_target__WEBPACK_IMPORTED_MODULE_2__.csharp, - go: _go_target__WEBPACK_IMPORTED_MODULE_3__.go, - http: _http_target__WEBPACK_IMPORTED_MODULE_4__.http, - java: _java_target__WEBPACK_IMPORTED_MODULE_5__.java, - javascript: _javascript_target__WEBPACK_IMPORTED_MODULE_6__.javascript, - kotlin: _kotlin_target__WEBPACK_IMPORTED_MODULE_7__.kotlin, - node: _node_target__WEBPACK_IMPORTED_MODULE_8__.node, - objc: _objc_target__WEBPACK_IMPORTED_MODULE_9__.objc, - ocaml: _ocaml_target__WEBPACK_IMPORTED_MODULE_10__.ocaml, - php: _php_target__WEBPACK_IMPORTED_MODULE_11__.php, - powershell: _powershell_target__WEBPACK_IMPORTED_MODULE_12__.powershell, - python: _python_target__WEBPACK_IMPORTED_MODULE_13__.python, - r: _r_target__WEBPACK_IMPORTED_MODULE_14__.r, - ruby: _ruby_target__WEBPACK_IMPORTED_MODULE_15__.ruby, - shell: _shell_target__WEBPACK_IMPORTED_MODULE_16__.shell, - swift: _swift_target__WEBPACK_IMPORTED_MODULE_17__.swift + crystal: _crystal_target__WEBPACK_IMPORTED_MODULE_2__.crystal, + csharp: _csharp_target__WEBPACK_IMPORTED_MODULE_3__.csharp, + go: _go_target__WEBPACK_IMPORTED_MODULE_4__.go, + http: _http_target__WEBPACK_IMPORTED_MODULE_5__.http, + java: _java_target__WEBPACK_IMPORTED_MODULE_6__.java, + javascript: _javascript_target__WEBPACK_IMPORTED_MODULE_7__.javascript, + kotlin: _kotlin_target__WEBPACK_IMPORTED_MODULE_8__.kotlin, + node: _node_target__WEBPACK_IMPORTED_MODULE_9__.node, + objc: _objc_target__WEBPACK_IMPORTED_MODULE_10__.objc, + ocaml: _ocaml_target__WEBPACK_IMPORTED_MODULE_11__.ocaml, + php: _php_target__WEBPACK_IMPORTED_MODULE_12__.php, + powershell: _powershell_target__WEBPACK_IMPORTED_MODULE_13__.powershell, + python: _python_target__WEBPACK_IMPORTED_MODULE_14__.python, + r: _r_target__WEBPACK_IMPORTED_MODULE_15__.r, + ruby: _ruby_target__WEBPACK_IMPORTED_MODULE_16__.ruby, + rust: _rust_target__WEBPACK_IMPORTED_MODULE_17__.rust, + shell: _shell_target__WEBPACK_IMPORTED_MODULE_18__.shell, + swift: _swift_target__WEBPACK_IMPORTED_MODULE_19__.swift }; var isTarget = function isTarget(target) { if (_typeof(target) !== 'object' || target === null || Array.isArray(target)) { @@ -14040,6 +14631,145 @@ function BufferBigIntNotDefined () { } +/***/ }), + +/***/ "./node_modules/call-bind/callBound.js": +/*!*********************************************!*\ + !*** ./node_modules/call-bind/callBound.js ***! + \*********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); + +var callBind = __webpack_require__(/*! ./ */ "./node_modules/call-bind/index.js"); + +var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); + +module.exports = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBind(intrinsic); + } + return intrinsic; +}; + + +/***/ }), + +/***/ "./node_modules/call-bind/index.js": +/*!*****************************************!*\ + !*** ./node_modules/call-bind/index.js ***! + \*****************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var bind = __webpack_require__(/*! function-bind */ "./node_modules/function-bind/index.js"); +var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); +var setFunctionLength = __webpack_require__(/*! set-function-length */ "./node_modules/set-function-length/index.js"); + +var $TypeError = __webpack_require__(/*! es-errors/type */ "./node_modules/es-errors/type.js"); +var $apply = GetIntrinsic('%Function.prototype.apply%'); +var $call = GetIntrinsic('%Function.prototype.call%'); +var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); + +var $defineProperty = __webpack_require__(/*! es-define-property */ "./node_modules/es-define-property/index.js"); +var $max = GetIntrinsic('%Math.max%'); + +module.exports = function callBind(originalFunction) { + if (typeof originalFunction !== 'function') { + throw new $TypeError('a function is required'); + } + var func = $reflectApply(bind, $call, arguments); + return setFunctionLength( + func, + 1 + $max(0, originalFunction.length - (arguments.length - 1)), + true + ); +}; + +var applyBind = function applyBind() { + return $reflectApply(bind, $apply, arguments); +}; + +if ($defineProperty) { + $defineProperty(module.exports, 'apply', { value: applyBind }); +} else { + module.exports.apply = applyBind; +} + + +/***/ }), + +/***/ "./node_modules/define-data-property/index.js": +/*!****************************************************!*\ + !*** ./node_modules/define-data-property/index.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var $defineProperty = __webpack_require__(/*! es-define-property */ "./node_modules/es-define-property/index.js"); + +var $SyntaxError = __webpack_require__(/*! es-errors/syntax */ "./node_modules/es-errors/syntax.js"); +var $TypeError = __webpack_require__(/*! es-errors/type */ "./node_modules/es-errors/type.js"); + +var gopd = __webpack_require__(/*! gopd */ "./node_modules/gopd/index.js"); + +/** @type {import('.')} */ +module.exports = function defineDataProperty( + obj, + property, + value +) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + throw new $TypeError('`obj` must be an object or a function`'); + } + if (typeof property !== 'string' && typeof property !== 'symbol') { + throw new $TypeError('`property` must be a string or a symbol`'); + } + if (arguments.length > 3 && typeof arguments[3] !== 'boolean' && arguments[3] !== null) { + throw new $TypeError('`nonEnumerable`, if provided, must be a boolean or null'); + } + if (arguments.length > 4 && typeof arguments[4] !== 'boolean' && arguments[4] !== null) { + throw new $TypeError('`nonWritable`, if provided, must be a boolean or null'); + } + if (arguments.length > 5 && typeof arguments[5] !== 'boolean' && arguments[5] !== null) { + throw new $TypeError('`nonConfigurable`, if provided, must be a boolean or null'); + } + if (arguments.length > 6 && typeof arguments[6] !== 'boolean') { + throw new $TypeError('`loose`, if provided, must be a boolean'); + } + + var nonEnumerable = arguments.length > 3 ? arguments[3] : null; + var nonWritable = arguments.length > 4 ? arguments[4] : null; + var nonConfigurable = arguments.length > 5 ? arguments[5] : null; + var loose = arguments.length > 6 ? arguments[6] : false; + + /* @type {false | TypedPropertyDescriptor} */ + var desc = !!gopd && gopd(obj, property); + + if ($defineProperty) { + $defineProperty(obj, property, { + configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable, + enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable, + value: value, + writable: nonWritable === null && desc ? desc.writable : !nonWritable + }); + } else if (loose || (!nonEnumerable && !nonWritable && !nonConfigurable)) { + // must fall back to [[Set]], and was not explicitly asked to make non-enumerable, non-writable, or non-configurable + obj[property] = value; // eslint-disable-line no-param-reassign + } else { + throw new $SyntaxError('This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.'); + } +}; + + /***/ }), /***/ "./node_modules/duplexer/index.js": @@ -14139,31 +14869,163 @@ function duplex(writer, reader) { /***/ }), -/***/ "./node_modules/event-stream/index.js": -/*!********************************************!*\ - !*** ./node_modules/event-stream/index.js ***! - \********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "./node_modules/es-define-property/index.js": +/*!**************************************************!*\ + !*** ./node_modules/es-define-property/index.js ***! + \**************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -/* provided dependency */ var process = __webpack_require__(/*! ./node_modules/process/browser.js */ "./node_modules/process/browser.js"); -//filter will reemit the data if cb(err,pass) pass is truthy +"use strict"; -// reduce is more tricky -// maybe we want to group the reductions or emit progress updates occasionally -// the most basic reduce just emits one 'data' event after it has recieved 'end' -var Stream = (__webpack_require__(/*! stream */ "./node_modules/stream-browserify/index.js").Stream) - , es = exports - , through = __webpack_require__(/*! through */ "./node_modules/through/index.js") - , from = __webpack_require__(/*! from */ "./node_modules/from/index.js") - , duplex = __webpack_require__(/*! duplexer */ "./node_modules/duplexer/index.js") - , map = __webpack_require__(/*! map-stream */ "./node_modules/map-stream/index.js") - , pause = __webpack_require__(/*! pause-stream */ "./node_modules/pause-stream/index.js") - , split = __webpack_require__(/*! split */ "./node_modules/split/index.js") - , pipeline = __webpack_require__(/*! stream-combiner */ "./node_modules/stream-combiner/index.js") - , immediately = __webpack_require__.g.setImmediate || process.nextTick; +var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); -es.Stream = Stream //re-export Stream from core +/** @type {import('.')} */ +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true) || false; +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = false; + } +} + +module.exports = $defineProperty; + + +/***/ }), + +/***/ "./node_modules/es-errors/eval.js": +/*!****************************************!*\ + !*** ./node_modules/es-errors/eval.js ***! + \****************************************/ +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./eval')} */ +module.exports = EvalError; + + +/***/ }), + +/***/ "./node_modules/es-errors/index.js": +/*!*****************************************!*\ + !*** ./node_modules/es-errors/index.js ***! + \*****************************************/ +/***/ ((module) => { + +"use strict"; + + +/** @type {import('.')} */ +module.exports = Error; + + +/***/ }), + +/***/ "./node_modules/es-errors/range.js": +/*!*****************************************!*\ + !*** ./node_modules/es-errors/range.js ***! + \*****************************************/ +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./range')} */ +module.exports = RangeError; + + +/***/ }), + +/***/ "./node_modules/es-errors/ref.js": +/*!***************************************!*\ + !*** ./node_modules/es-errors/ref.js ***! + \***************************************/ +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./ref')} */ +module.exports = ReferenceError; + + +/***/ }), + +/***/ "./node_modules/es-errors/syntax.js": +/*!******************************************!*\ + !*** ./node_modules/es-errors/syntax.js ***! + \******************************************/ +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./syntax')} */ +module.exports = SyntaxError; + + +/***/ }), + +/***/ "./node_modules/es-errors/type.js": +/*!****************************************!*\ + !*** ./node_modules/es-errors/type.js ***! + \****************************************/ +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./type')} */ +module.exports = TypeError; + + +/***/ }), + +/***/ "./node_modules/es-errors/uri.js": +/*!***************************************!*\ + !*** ./node_modules/es-errors/uri.js ***! + \***************************************/ +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./uri')} */ +module.exports = URIError; + + +/***/ }), + +/***/ "./node_modules/event-stream/index.js": +/*!********************************************!*\ + !*** ./node_modules/event-stream/index.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +/* provided dependency */ var process = __webpack_require__(/*! ./node_modules/process/browser.js */ "./node_modules/process/browser.js"); +//filter will reemit the data if cb(err,pass) pass is truthy + +// reduce is more tricky +// maybe we want to group the reductions or emit progress updates occasionally +// the most basic reduce just emits one 'data' event after it has recieved 'end' + +var Stream = (__webpack_require__(/*! stream */ "./node_modules/stream-browserify/index.js").Stream) + , es = exports + , through = __webpack_require__(/*! through */ "./node_modules/through/index.js") + , from = __webpack_require__(/*! from */ "./node_modules/from/index.js") + , duplex = __webpack_require__(/*! duplexer */ "./node_modules/duplexer/index.js") + , map = __webpack_require__(/*! map-stream */ "./node_modules/map-stream/index.js") + , pause = __webpack_require__(/*! pause-stream */ "./node_modules/pause-stream/index.js") + , split = __webpack_require__(/*! split */ "./node_modules/split/index.js") + , pipeline = __webpack_require__(/*! stream-combiner */ "./node_modules/stream-combiner/index.js") + , immediately = __webpack_require__.g.setImmediate || process.nextTick; + +es.Stream = Stream //re-export Stream from core es.through = through es.from = from es.duplex = duplex @@ -15227,6 +16089,487 @@ function from (source) { } +/***/ }), + +/***/ "./node_modules/function-bind/implementation.js": +/*!******************************************************!*\ + !*** ./node_modules/function-bind/implementation.js ***! + \******************************************************/ +/***/ ((module) => { + +"use strict"; + + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var toStr = Object.prototype.toString; +var max = Math.max; +var funcType = '[object Function]'; + +var concatty = function concatty(a, b) { + var arr = []; + + for (var i = 0; i < a.length; i += 1) { + arr[i] = a[i]; + } + for (var j = 0; j < b.length; j += 1) { + arr[j + a.length] = b[j]; + } + + return arr; +}; + +var slicy = function slicy(arrLike, offset) { + var arr = []; + for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { + arr[j] = arrLike[i]; + } + return arr; +}; + +var joiny = function (arr, joiner) { + var str = ''; + for (var i = 0; i < arr.length; i += 1) { + str += arr[i]; + if (i + 1 < arr.length) { + str += joiner; + } + } + return str; +}; + +module.exports = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr.apply(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slicy(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + concatty(args, arguments) + ); + if (Object(result) === result) { + return result; + } + return this; + } + return target.apply( + that, + concatty(args, arguments) + ); + + }; + + var boundLength = max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs[i] = '$' + i; + } + + bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + + +/***/ }), + +/***/ "./node_modules/function-bind/index.js": +/*!*********************************************!*\ + !*** ./node_modules/function-bind/index.js ***! + \*********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var implementation = __webpack_require__(/*! ./implementation */ "./node_modules/function-bind/implementation.js"); + +module.exports = Function.prototype.bind || implementation; + + +/***/ }), + +/***/ "./node_modules/get-intrinsic/index.js": +/*!*********************************************!*\ + !*** ./node_modules/get-intrinsic/index.js ***! + \*********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var undefined; + +var $Error = __webpack_require__(/*! es-errors */ "./node_modules/es-errors/index.js"); +var $EvalError = __webpack_require__(/*! es-errors/eval */ "./node_modules/es-errors/eval.js"); +var $RangeError = __webpack_require__(/*! es-errors/range */ "./node_modules/es-errors/range.js"); +var $ReferenceError = __webpack_require__(/*! es-errors/ref */ "./node_modules/es-errors/ref.js"); +var $SyntaxError = __webpack_require__(/*! es-errors/syntax */ "./node_modules/es-errors/syntax.js"); +var $TypeError = __webpack_require__(/*! es-errors/type */ "./node_modules/es-errors/type.js"); +var $URIError = __webpack_require__(/*! es-errors/uri */ "./node_modules/es-errors/uri.js"); + +var $Function = Function; + +// eslint-disable-next-line consistent-return +var getEvalledConstructor = function (expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); + } catch (e) {} +}; + +var $gOPD = Object.getOwnPropertyDescriptor; +if ($gOPD) { + try { + $gOPD({}, ''); + } catch (e) { + $gOPD = null; // this is IE 8, which has a broken gOPD + } +} + +var throwTypeError = function () { + throw new $TypeError(); +}; +var ThrowTypeError = $gOPD + ? (function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }()) + : throwTypeError; + +var hasSymbols = __webpack_require__(/*! has-symbols */ "./node_modules/has-symbols/index.js")(); +var hasProto = __webpack_require__(/*! has-proto */ "./node_modules/has-proto/index.js")(); + +var getProto = Object.getPrototypeOf || ( + hasProto + ? function (x) { return x.__proto__; } // eslint-disable-line no-proto + : null +); + +var needsEval = {}; + +var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array); + +var INTRINSICS = { + __proto__: null, + '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, + '%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined, + '%AsyncFromSyncIteratorPrototype%': undefined, + '%AsyncFunction%': needsEval, + '%AsyncGenerator%': needsEval, + '%AsyncGeneratorFunction%': needsEval, + '%AsyncIteratorPrototype%': needsEval, + '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, + '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, + '%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array, + '%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array, + '%Boolean%': Boolean, + '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, + '%Date%': Date, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': $Error, + '%eval%': eval, // eslint-disable-line no-eval + '%EvalError%': $EvalError, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, + '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, + '%Function%': $Function, + '%GeneratorFunction%': needsEval, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined, + '%JSON%': typeof JSON === 'object' ? JSON : undefined, + '%Map%': typeof Map === 'undefined' ? undefined : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()), + '%Math%': Math, + '%Number%': Number, + '%Object%': Object, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, + '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, + '%RangeError%': $RangeError, + '%ReferenceError%': $ReferenceError, + '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, + '%RegExp%': RegExp, + '%Set%': typeof Set === 'undefined' ? undefined : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()), + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined, + '%Symbol%': hasSymbols ? Symbol : undefined, + '%SyntaxError%': $SyntaxError, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypeError%': $TypeError, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, + '%URIError%': $URIError, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, + '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet +}; + +if (getProto) { + try { + null.error; // eslint-disable-line no-unused-expressions + } catch (e) { + // https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229 + var errorProto = getProto(getProto(e)); + INTRINSICS['%Error.prototype%'] = errorProto; + } +} + +var doEval = function doEval(name) { + var value; + if (name === '%AsyncFunction%') { + value = getEvalledConstructor('async function () {}'); + } else if (name === '%GeneratorFunction%') { + value = getEvalledConstructor('function* () {}'); + } else if (name === '%AsyncGeneratorFunction%') { + value = getEvalledConstructor('async function* () {}'); + } else if (name === '%AsyncGenerator%') { + var fn = doEval('%AsyncGeneratorFunction%'); + if (fn) { + value = fn.prototype; + } + } else if (name === '%AsyncIteratorPrototype%') { + var gen = doEval('%AsyncGenerator%'); + if (gen && getProto) { + value = getProto(gen.prototype); + } + } + + INTRINSICS[name] = value; + + return value; +}; + +var LEGACY_ALIASES = { + __proto__: null, + '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], + '%ArrayPrototype%': ['Array', 'prototype'], + '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], + '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], + '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], + '%ArrayProto_values%': ['Array', 'prototype', 'values'], + '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], + '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], + '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], + '%BooleanPrototype%': ['Boolean', 'prototype'], + '%DataViewPrototype%': ['DataView', 'prototype'], + '%DatePrototype%': ['Date', 'prototype'], + '%ErrorPrototype%': ['Error', 'prototype'], + '%EvalErrorPrototype%': ['EvalError', 'prototype'], + '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], + '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], + '%FunctionPrototype%': ['Function', 'prototype'], + '%Generator%': ['GeneratorFunction', 'prototype'], + '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], + '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], + '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], + '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], + '%JSONParse%': ['JSON', 'parse'], + '%JSONStringify%': ['JSON', 'stringify'], + '%MapPrototype%': ['Map', 'prototype'], + '%NumberPrototype%': ['Number', 'prototype'], + '%ObjectPrototype%': ['Object', 'prototype'], + '%ObjProto_toString%': ['Object', 'prototype', 'toString'], + '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], + '%PromisePrototype%': ['Promise', 'prototype'], + '%PromiseProto_then%': ['Promise', 'prototype', 'then'], + '%Promise_all%': ['Promise', 'all'], + '%Promise_reject%': ['Promise', 'reject'], + '%Promise_resolve%': ['Promise', 'resolve'], + '%RangeErrorPrototype%': ['RangeError', 'prototype'], + '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], + '%RegExpPrototype%': ['RegExp', 'prototype'], + '%SetPrototype%': ['Set', 'prototype'], + '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], + '%StringPrototype%': ['String', 'prototype'], + '%SymbolPrototype%': ['Symbol', 'prototype'], + '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], + '%TypedArrayPrototype%': ['TypedArray', 'prototype'], + '%TypeErrorPrototype%': ['TypeError', 'prototype'], + '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], + '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], + '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], + '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], + '%URIErrorPrototype%': ['URIError', 'prototype'], + '%WeakMapPrototype%': ['WeakMap', 'prototype'], + '%WeakSetPrototype%': ['WeakSet', 'prototype'] +}; + +var bind = __webpack_require__(/*! function-bind */ "./node_modules/function-bind/index.js"); +var hasOwn = __webpack_require__(/*! hasown */ "./node_modules/hasown/index.js"); +var $concat = bind.call(Function.call, Array.prototype.concat); +var $spliceApply = bind.call(Function.apply, Array.prototype.splice); +var $replace = bind.call(Function.call, String.prototype.replace); +var $strSlice = bind.call(Function.call, String.prototype.slice); +var $exec = bind.call(Function.call, RegExp.prototype.exec); + +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ +var stringToPath = function stringToPath(string) { + var first = $strSlice(string, 0, 1); + var last = $strSlice(string, -1); + if (first === '%' && last !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); + } else if (last === '%' && first !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); + } + var result = []; + $replace(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = '%' + alias[0] + '%'; + } + + if (hasOwn(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === 'undefined' && !allowMissing) { + throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return { + alias: alias, + name: intrinsicName, + value: value + }; + } + + throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); +}; + +module.exports = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new $TypeError('intrinsic name must be a non-empty string'); + } + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + + if ($exec(/^%?[^%]*%?$/, name) === null) { + throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name'); + } + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; + + var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ( + ( + (first === '"' || first === "'" || first === '`') + || (last === '"' || last === "'" || last === '`') + ) + && first !== last + ) { + throw new $SyntaxError('property names with quotes must have matching quotes'); + } + if (part === 'constructor' || !isOwn) { + skipFurtherCaching = true; + } + + intrinsicBaseName += '.' + part; + intrinsicRealName = '%' + intrinsicBaseName + '%'; + + if (hasOwn(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + return void undefined; + } + if ($gOPD && (i + 1) >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + + // By convention, when a data property is converted to an accessor + // property to emulate a data property that does not suffer from + // the override mistake, that accessor's getter is marked with + // an `originalValue` property. Here, when we detect this, we + // uphold the illusion by pretending to see that original data + // property, i.e., returning the value rather than the getter + // itself. + if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn(value, part); + value = value[part]; + } + + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; +}; + + /***/ }), /***/ "./node_modules/get-own-enumerable-property-symbols/lib/index.js": @@ -15243,6 +16586,33 @@ exports["default"] = (object) => Object .filter((keySymbol) => Object.prototype.propertyIsEnumerable.call(object, keySymbol)); //# sourceMappingURL=index.js.map +/***/ }), + +/***/ "./node_modules/gopd/index.js": +/*!************************************!*\ + !*** ./node_modules/gopd/index.js ***! + \************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); + +var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true); + +if ($gOPD) { + try { + $gOPD([], 'length'); + } catch (e) { + // IE 8 has a broken gOPD + $gOPD = null; + } +} + +module.exports = $gOPD; + + /***/ }), /***/ "./node_modules/har-schema/lib/index.js": @@ -15278,9 +16648,164 @@ module.exports = { /***/ }), -/***/ "./node_modules/ieee754/index.js": -/*!***************************************!*\ - !*** ./node_modules/ieee754/index.js ***! +/***/ "./node_modules/has-property-descriptors/index.js": +/*!********************************************************!*\ + !*** ./node_modules/has-property-descriptors/index.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var $defineProperty = __webpack_require__(/*! es-define-property */ "./node_modules/es-define-property/index.js"); + +var hasPropertyDescriptors = function hasPropertyDescriptors() { + return !!$defineProperty; +}; + +hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() { + // node v0.6 has a bug where array lengths can be Set but not Defined + if (!$defineProperty) { + return null; + } + try { + return $defineProperty([], 'length', { value: 1 }).length !== 1; + } catch (e) { + // In Firefox 4-22, defining length on an array throws an exception. + return true; + } +}; + +module.exports = hasPropertyDescriptors; + + +/***/ }), + +/***/ "./node_modules/has-proto/index.js": +/*!*****************************************!*\ + !*** ./node_modules/has-proto/index.js ***! + \*****************************************/ +/***/ ((module) => { + +"use strict"; + + +var test = { + __proto__: null, + foo: {} +}; + +var $Object = Object; + +/** @type {import('.')} */ +module.exports = function hasProto() { + // @ts-expect-error: TS errors on an inherited property for some reason + return { __proto__: test }.foo === test.foo + && !(test instanceof $Object); +}; + + +/***/ }), + +/***/ "./node_modules/has-symbols/index.js": +/*!*******************************************!*\ + !*** ./node_modules/has-symbols/index.js ***! + \*******************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var origSymbol = typeof Symbol !== 'undefined' && Symbol; +var hasSymbolSham = __webpack_require__(/*! ./shams */ "./node_modules/has-symbols/shams.js"); + +module.exports = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { return false; } + if (typeof Symbol !== 'function') { return false; } + if (typeof origSymbol('foo') !== 'symbol') { return false; } + if (typeof Symbol('bar') !== 'symbol') { return false; } + + return hasSymbolSham(); +}; + + +/***/ }), + +/***/ "./node_modules/has-symbols/shams.js": +/*!*******************************************!*\ + !*** ./node_modules/has-symbols/shams.js ***! + \*******************************************/ +/***/ ((module) => { + +"use strict"; + + +/* eslint complexity: [2, 18], max-statements: [2, 33] */ +module.exports = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } + if (typeof Symbol.iterator === 'symbol') { return true; } + + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + if (typeof sym === 'string') { return false; } + + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + + // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } + + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + + var symVal = 42; + obj[sym] = symVal; + for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { return false; } + + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + + if (typeof Object.getOwnPropertyDescriptor === 'function') { + var descriptor = Object.getOwnPropertyDescriptor(obj, sym); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } + } + + return true; +}; + + +/***/ }), + +/***/ "./node_modules/hasown/index.js": +/*!**************************************!*\ + !*** ./node_modules/hasown/index.js ***! + \**************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var call = Function.prototype.call; +var $hasOwn = Object.prototype.hasOwnProperty; +var bind = __webpack_require__(/*! function-bind */ "./node_modules/function-bind/index.js"); + +/** @type {import('.')} */ +module.exports = bind.call(call, $hasOwn); + + +/***/ }), + +/***/ "./node_modules/ieee754/index.js": +/*!***************************************!*\ + !*** ./node_modules/ieee754/index.js ***! \***************************************/ /***/ ((__unused_webpack_module, exports) => { @@ -15694,6 +17219,543 @@ module.exports = function (mapper, opts) { +/***/ }), + +/***/ "./node_modules/object-inspect/index.js": +/*!**********************************************!*\ + !*** ./node_modules/object-inspect/index.js ***! + \**********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var hasMap = typeof Map === 'function' && Map.prototype; +var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; +var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; +var mapForEach = hasMap && Map.prototype.forEach; +var hasSet = typeof Set === 'function' && Set.prototype; +var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; +var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; +var setForEach = hasSet && Set.prototype.forEach; +var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; +var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; +var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; +var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; +var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; +var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; +var booleanValueOf = Boolean.prototype.valueOf; +var objectToString = Object.prototype.toString; +var functionToString = Function.prototype.toString; +var $match = String.prototype.match; +var $slice = String.prototype.slice; +var $replace = String.prototype.replace; +var $toUpperCase = String.prototype.toUpperCase; +var $toLowerCase = String.prototype.toLowerCase; +var $test = RegExp.prototype.test; +var $concat = Array.prototype.concat; +var $join = Array.prototype.join; +var $arrSlice = Array.prototype.slice; +var $floor = Math.floor; +var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; +var gOPS = Object.getOwnPropertySymbols; +var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; +var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object'; +// ie, `has-tostringtag/shams +var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol') + ? Symbol.toStringTag + : null; +var isEnumerable = Object.prototype.propertyIsEnumerable; + +var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ( + [].__proto__ === Array.prototype // eslint-disable-line no-proto + ? function (O) { + return O.__proto__; // eslint-disable-line no-proto + } + : null +); + +function addNumericSeparator(num, str) { + if ( + num === Infinity + || num === -Infinity + || num !== num + || (num && num > -1000 && num < 1000) + || $test.call(/e/, str) + ) { + return str; + } + var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; + if (typeof num === 'number') { + var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) + if (int !== num) { + var intStr = String(int); + var dec = $slice.call(str, intStr.length + 1); + return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); + } + } + return $replace.call(str, sepRegex, '$&_'); +} + +var utilInspect = __webpack_require__(/*! ./util.inspect */ "?4f7e"); +var inspectCustom = utilInspect.custom; +var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; + +module.exports = function inspect_(obj, options, depth, seen) { + var opts = options || {}; + + if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) { + throw new TypeError('option "quoteStyle" must be "single" or "double"'); + } + if ( + has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' + ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity + : opts.maxStringLength !== null + ) + ) { + throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); + } + var customInspect = has(opts, 'customInspect') ? opts.customInspect : true; + if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { + throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); + } + + if ( + has(opts, 'indent') + && opts.indent !== null + && opts.indent !== '\t' + && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) + ) { + throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); + } + if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { + throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); + } + var numericSeparator = opts.numericSeparator; + + if (typeof obj === 'undefined') { + return 'undefined'; + } + if (obj === null) { + return 'null'; + } + if (typeof obj === 'boolean') { + return obj ? 'true' : 'false'; + } + + if (typeof obj === 'string') { + return inspectString(obj, opts); + } + if (typeof obj === 'number') { + if (obj === 0) { + return Infinity / obj > 0 ? '0' : '-0'; + } + var str = String(obj); + return numericSeparator ? addNumericSeparator(obj, str) : str; + } + if (typeof obj === 'bigint') { + var bigIntStr = String(obj) + 'n'; + return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; + } + + var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; + if (typeof depth === 'undefined') { depth = 0; } + if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { + return isArray(obj) ? '[Array]' : '[Object]'; + } + + var indent = getIndent(opts, depth); + + if (typeof seen === 'undefined') { + seen = []; + } else if (indexOf(seen, obj) >= 0) { + return '[Circular]'; + } + + function inspect(value, from, noIndent) { + if (from) { + seen = $arrSlice.call(seen); + seen.push(from); + } + if (noIndent) { + var newOpts = { + depth: opts.depth + }; + if (has(opts, 'quoteStyle')) { + newOpts.quoteStyle = opts.quoteStyle; + } + return inspect_(value, newOpts, depth + 1, seen); + } + return inspect_(value, opts, depth + 1, seen); + } + + if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable + var name = nameOf(obj); + var keys = arrObjKeys(obj, inspect); + return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); + } + if (isSymbol(obj)) { + var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); + return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; + } + if (isElement(obj)) { + var s = '<' + $toLowerCase.call(String(obj.nodeName)); + var attrs = obj.attributes || []; + for (var i = 0; i < attrs.length; i++) { + s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); + } + s += '>'; + if (obj.childNodes && obj.childNodes.length) { s += '...'; } + s += ''; + return s; + } + if (isArray(obj)) { + if (obj.length === 0) { return '[]'; } + var xs = arrObjKeys(obj, inspect); + if (indent && !singleLineValues(xs)) { + return '[' + indentedJoin(xs, indent) + ']'; + } + return '[ ' + $join.call(xs, ', ') + ' ]'; + } + if (isError(obj)) { + var parts = arrObjKeys(obj, inspect); + if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) { + return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; + } + if (parts.length === 0) { return '[' + String(obj) + ']'; } + return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; + } + if (typeof obj === 'object' && customInspect) { + if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) { + return utilInspect(obj, { depth: maxDepth - depth }); + } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { + return obj.inspect(); + } + } + if (isMap(obj)) { + var mapParts = []; + if (mapForEach) { + mapForEach.call(obj, function (value, key) { + mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); + }); + } + return collectionOf('Map', mapSize.call(obj), mapParts, indent); + } + if (isSet(obj)) { + var setParts = []; + if (setForEach) { + setForEach.call(obj, function (value) { + setParts.push(inspect(value, obj)); + }); + } + return collectionOf('Set', setSize.call(obj), setParts, indent); + } + if (isWeakMap(obj)) { + return weakCollectionOf('WeakMap'); + } + if (isWeakSet(obj)) { + return weakCollectionOf('WeakSet'); + } + if (isWeakRef(obj)) { + return weakCollectionOf('WeakRef'); + } + if (isNumber(obj)) { + return markBoxed(inspect(Number(obj))); + } + if (isBigInt(obj)) { + return markBoxed(inspect(bigIntValueOf.call(obj))); + } + if (isBoolean(obj)) { + return markBoxed(booleanValueOf.call(obj)); + } + if (isString(obj)) { + return markBoxed(inspect(String(obj))); + } + // note: in IE 8, sometimes `global !== window` but both are the prototypes of each other + /* eslint-env browser */ + if (typeof window !== 'undefined' && obj === window) { + return '{ [object Window] }'; + } + if ( + (typeof globalThis !== 'undefined' && obj === globalThis) + || (typeof __webpack_require__.g !== 'undefined' && obj === __webpack_require__.g) + ) { + return '{ [object globalThis] }'; + } + if (!isDate(obj) && !isRegExp(obj)) { + var ys = arrObjKeys(obj, inspect); + var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; + var protoTag = obj instanceof Object ? '' : 'null prototype'; + var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; + var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; + var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); + if (ys.length === 0) { return tag + '{}'; } + if (indent) { + return tag + '{' + indentedJoin(ys, indent) + '}'; + } + return tag + '{ ' + $join.call(ys, ', ') + ' }'; + } + return String(obj); +}; + +function wrapQuotes(s, defaultStyle, opts) { + var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; + return quoteChar + s + quoteChar; +} + +function quote(s) { + return $replace.call(String(s), /"/g, '"'); +} + +function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } + +// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives +function isSymbol(obj) { + if (hasShammedSymbols) { + return obj && typeof obj === 'object' && obj instanceof Symbol; + } + if (typeof obj === 'symbol') { + return true; + } + if (!obj || typeof obj !== 'object' || !symToString) { + return false; + } + try { + symToString.call(obj); + return true; + } catch (e) {} + return false; +} + +function isBigInt(obj) { + if (!obj || typeof obj !== 'object' || !bigIntValueOf) { + return false; + } + try { + bigIntValueOf.call(obj); + return true; + } catch (e) {} + return false; +} + +var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; +function has(obj, key) { + return hasOwn.call(obj, key); +} + +function toStr(obj) { + return objectToString.call(obj); +} + +function nameOf(f) { + if (f.name) { return f.name; } + var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); + if (m) { return m[1]; } + return null; +} + +function indexOf(xs, x) { + if (xs.indexOf) { return xs.indexOf(x); } + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) { return i; } + } + return -1; +} + +function isMap(x) { + if (!mapSize || !x || typeof x !== 'object') { + return false; + } + try { + mapSize.call(x); + try { + setSize.call(x); + } catch (s) { + return true; + } + return x instanceof Map; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakMap(x) { + if (!weakMapHas || !x || typeof x !== 'object') { + return false; + } + try { + weakMapHas.call(x, weakMapHas); + try { + weakSetHas.call(x, weakSetHas); + } catch (s) { + return true; + } + return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakRef(x) { + if (!weakRefDeref || !x || typeof x !== 'object') { + return false; + } + try { + weakRefDeref.call(x); + return true; + } catch (e) {} + return false; +} + +function isSet(x) { + if (!setSize || !x || typeof x !== 'object') { + return false; + } + try { + setSize.call(x); + try { + mapSize.call(x); + } catch (m) { + return true; + } + return x instanceof Set; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakSet(x) { + if (!weakSetHas || !x || typeof x !== 'object') { + return false; + } + try { + weakSetHas.call(x, weakSetHas); + try { + weakMapHas.call(x, weakMapHas); + } catch (s) { + return true; + } + return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isElement(x) { + if (!x || typeof x !== 'object') { return false; } + if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { + return true; + } + return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; +} + +function inspectString(str, opts) { + if (str.length > opts.maxStringLength) { + var remaining = str.length - opts.maxStringLength; + var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); + return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; + } + // eslint-disable-next-line no-control-regex + var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); + return wrapQuotes(s, 'single', opts); +} + +function lowbyte(c) { + var n = c.charCodeAt(0); + var x = { + 8: 'b', + 9: 't', + 10: 'n', + 12: 'f', + 13: 'r' + }[n]; + if (x) { return '\\' + x; } + return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); +} + +function markBoxed(str) { + return 'Object(' + str + ')'; +} + +function weakCollectionOf(type) { + return type + ' { ? }'; +} + +function collectionOf(type, size, entries, indent) { + var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); + return type + ' (' + size + ') {' + joinedEntries + '}'; +} + +function singleLineValues(xs) { + for (var i = 0; i < xs.length; i++) { + if (indexOf(xs[i], '\n') >= 0) { + return false; + } + } + return true; +} + +function getIndent(opts, depth) { + var baseIndent; + if (opts.indent === '\t') { + baseIndent = '\t'; + } else if (typeof opts.indent === 'number' && opts.indent > 0) { + baseIndent = $join.call(Array(opts.indent + 1), ' '); + } else { + return null; + } + return { + base: baseIndent, + prev: $join.call(Array(depth + 1), baseIndent) + }; +} + +function indentedJoin(xs, indent) { + if (xs.length === 0) { return ''; } + var lineJoiner = '\n' + indent.prev + indent.base; + return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; +} + +function arrObjKeys(obj, inspect) { + var isArr = isArray(obj); + var xs = []; + if (isArr) { + xs.length = obj.length; + for (var i = 0; i < obj.length; i++) { + xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; + } + } + var syms = typeof gOPS === 'function' ? gOPS(obj) : []; + var symMap; + if (hasShammedSymbols) { + symMap = {}; + for (var k = 0; k < syms.length; k++) { + symMap['$' + syms[k]] = syms[k]; + } + } + + for (var key in obj) { // eslint-disable-line no-restricted-syntax + if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { + // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section + continue; // eslint-disable-line no-restricted-syntax, no-continue + } else if ($test.call(/[^\w$]/, key)) { + xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); + } else { + xs.push(key + ': ' + inspect(obj[key], obj)); + } + } + if (typeof gOPS === 'function') { + for (var j = 0; j < syms.length; j++) { + if (isEnumerable.call(obj, syms[j])) { + xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); + } + } + } + return xs; +} + + /***/ }), /***/ "./node_modules/pause-stream/index.js": @@ -15803,110 +17865,1111 @@ function runClearTimeout(marker) { -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + +/***/ }), + +/***/ "./node_modules/qs/lib/formats.js": +/*!****************************************!*\ + !*** ./node_modules/qs/lib/formats.js ***! + \****************************************/ +/***/ ((module) => { + +"use strict"; + + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +var Format = { + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; + +module.exports = { + 'default': Format.RFC3986, + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return String(value); + } + }, + RFC1738: Format.RFC1738, + RFC3986: Format.RFC3986 +}; + + +/***/ }), + +/***/ "./node_modules/qs/lib/index.js": +/*!**************************************!*\ + !*** ./node_modules/qs/lib/index.js ***! + \**************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var stringify = __webpack_require__(/*! ./stringify */ "./node_modules/qs/lib/stringify.js"); +var parse = __webpack_require__(/*! ./parse */ "./node_modules/qs/lib/parse.js"); +var formats = __webpack_require__(/*! ./formats */ "./node_modules/qs/lib/formats.js"); + +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; + + +/***/ }), + +/***/ "./node_modules/qs/lib/parse.js": +/*!**************************************!*\ + !*** ./node_modules/qs/lib/parse.js ***! + \**************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/qs/lib/utils.js"); + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var defaults = { + allowDots: false, + allowEmptyArrays: false, + allowPrototypes: false, + allowSparse: false, + arrayLimit: 20, + charset: 'utf-8', + charsetSentinel: false, + comma: false, + decodeDotInKeys: false, + decoder: utils.decode, + delimiter: '&', + depth: 5, + duplicates: 'combine', + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1000, + parseArrays: true, + plainObjects: false, + strictDepth: false, + strictNullHandling: false +}; + +var interpretNumericEntities = function (str) { + return str.replace(/&#(\d+);/g, function ($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); +}; + +var parseArrayValue = function (val, options) { + if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { + return val.split(','); + } + + return val; +}; + +// This is what browsers will submit when the ✓ character occurs in an +// application/x-www-form-urlencoded body and the encoding of the page containing +// the form is iso-8859-1, or when the submitted form has an accept-charset +// attribute of iso-8859-1. Presumably also with other charsets that do not contain +// the ✓ character, such as us-ascii. +var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + +// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. +var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + +var parseValues = function parseQueryStringValues(str, options) { + var obj = { __proto__: null }; + + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + cleanStr = cleanStr.replace(/%5B/gi, '[').replace(/%5D/gi, ']'); + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder, charset, 'key'); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); + val = utils.maybeMap( + parseArrayValue(part.slice(pos + 1), options), + function (encodedVal) { + return options.decoder(encodedVal, defaults.decoder, charset, 'value'); + } + ); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (part.indexOf('[]=') > -1) { + val = isArray(val) ? [val] : val; + } + + var existing = has.call(obj, key); + if (existing && options.duplicates === 'combine') { + obj[key] = utils.combine(obj[key], val); + } else if (!existing || options.duplicates === 'last') { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options, valuesParsed) { + var leaf = valuesParsed ? val : parseArrayValue(val, options); + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = options.allowEmptyArrays && (leaf === '' || (options.strictNullHandling && leaf === null)) + ? [] + : [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, '.') : cleanRoot; + var index = parseInt(decodedRoot, 10); + if (!options.parseArrays && decodedRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== decodedRoot + && String(index) === decodedRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else if (decodedRoot !== '__proto__') { + obj[decodedRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = options.depth > 0 && brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, check strictDepth option for throw, else just add whatever is left + + if (segment) { + if (options.strictDepth === true) { + throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true'); + } + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options, valuesParsed); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') { + throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided'); + } + + if (typeof opts.decodeDotInKeys !== 'undefined' && typeof opts.decodeDotInKeys !== 'boolean') { + throw new TypeError('`decodeDotInKeys` option can only be `true` or `false`, when provided'); + } + + if (opts.decoder !== null && typeof opts.decoder !== 'undefined' && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + var duplicates = typeof opts.duplicates === 'undefined' ? defaults.duplicates : opts.duplicates; + + if (duplicates !== 'combine' && duplicates !== 'first' && duplicates !== 'last') { + throw new TypeError('The duplicates option must be either combine, first, or last'); + } + + var allowDots = typeof opts.allowDots === 'undefined' ? opts.decodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots; + + return { + allowDots: allowDots, + allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decodeDotInKeys: typeof opts.decodeDotInKeys === 'boolean' ? opts.decodeDotInKeys : defaults.decodeDotInKeys, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + // eslint-disable-next-line no-implicit-coercion, no-extra-parens + depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, + duplicates: duplicates, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictDepth: typeof opts.strictDepth === 'boolean' ? !!opts.strictDepth : defaults.strictDepth, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string'); + obj = utils.merge(obj, newObj, options); + } + + if (options.allowSparse === true) { + return obj; + } + + return utils.compact(obj); +}; + + +/***/ }), + +/***/ "./node_modules/qs/lib/stringify.js": +/*!******************************************!*\ + !*** ./node_modules/qs/lib/stringify.js ***! + \******************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var getSideChannel = __webpack_require__(/*! side-channel */ "./node_modules/side-channel/index.js"); +var utils = __webpack_require__(/*! ./utils */ "./node_modules/qs/lib/utils.js"); +var formats = __webpack_require__(/*! ./formats */ "./node_modules/qs/lib/formats.js"); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } +}; + +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaultFormat = formats['default']; +var defaults = { + addQueryPrefix: false, + allowDots: false, + allowEmptyArrays: false, + arrayFormat: 'indices', + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encodeDotInKeys: false, + encoder: utils.encode, + encodeValuesOnly: false, + format: defaultFormat, + formatter: formats.formatters[defaultFormat], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var isNonNullishPrimitive = function isNonNullishPrimitive(v) { + return typeof v === 'string' + || typeof v === 'number' + || typeof v === 'boolean' + || typeof v === 'symbol' + || typeof v === 'bigint'; +}; + +var sentinel = {}; + +var stringify = function stringify( + object, + prefix, + generateArrayPrefix, + commaRoundTrip, + allowEmptyArrays, + strictNullHandling, + skipNulls, + encodeDotInKeys, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + sideChannel +) { + var obj = object; + + var tmpSc = sideChannel; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { + // Where object last appeared in the ref tree + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== 'undefined') { + if (pos === step) { + throw new RangeError('Cyclic object value'); + } else { + findFlag = true; // Break while + } + } + if (typeof tmpSc.get(sentinel) === 'undefined') { + step = 0; + } + } + + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = utils.maybeMap(obj, function (value) { + if (value instanceof Date) { + return serializeDate(value); + } + return value; + }); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; + } + + obj = ''; + } + + if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (generateArrayPrefix === 'comma' && isArray(obj)) { + // we need to join elements in + if (encodeValuesOnly && encoder) { + obj = utils.maybeMap(obj, encoder); + } + objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; + } else if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + var encodedPrefix = encodeDotInKeys ? prefix.replace(/\./g, '%2E') : prefix; + + var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix; + + if (allowEmptyArrays && isArray(obj) && obj.length === 0) { + return adjustedPrefix + '[]'; + } + + for (var j = 0; j < objKeys.length; ++j) { + var key = objKeys[j]; + var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; + + if (skipNulls && value === null) { + continue; + } + + var encodedKey = allowDots && encodeDotInKeys ? key.replace(/\./g, '%2E') : key; + var keyPrefix = isArray(obj) + ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix + : adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']'); + + sideChannel.set(object, step); + var valueSideChannel = getSideChannel(); + valueSideChannel.set(sentinel, sideChannel); + pushToArray(values, stringify( + value, + keyPrefix, + generateArrayPrefix, + commaRoundTrip, + allowEmptyArrays, + strictNullHandling, + skipNulls, + encodeDotInKeys, + generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + valueSideChannel + )); + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') { + throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided'); + } + + if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') { + throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided'); + } + + if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + var arrayFormat; + if (opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if ('indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = defaults.arrayFormat; + } + + if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { + throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); + } + + var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots; + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: allowDots, + allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays, + arrayFormat: arrayFormat, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + commaRoundTrip: opts.commaRoundTrip, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + format: format, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat]; + var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + var sideChannel = getSideChannel(); + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + commaRoundTrip, + options.allowEmptyArrays, + options.strictNullHandling, + options.skipNulls, + options.encodeDotInKeys, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.format, + options.formatter, + options.encodeValuesOnly, + options.charset, + sideChannel + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; + + +/***/ }), + +/***/ "./node_modules/qs/lib/utils.js": +/*!**************************************!*\ + !*** ./node_modules/qs/lib/utils.js ***! + \**************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var formats = __webpack_require__(/*! ./formats */ "./node_modules/qs/lib/formats.js"); + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + /* eslint no-param-reassign: 0 */ + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var limit = 1024; -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; +/* eslint operator-linebreak: [2, "before"] */ + +var encode = function encode(str, defaultEncoder, charset, kind, format) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; } - if (queue.length) { - drainQueue(); + + var string = str; + if (typeof str === 'symbol') { + string = Symbol.prototype.toString.call(str); + } else if (typeof str !== 'string') { + string = String(str); } -} -function drainQueue() { - if (draining) { - return; + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); + var out = ''; + for (var j = 0; j < string.length; j += limit) { + var segment = string.length >= limit ? string.slice(j, j + limit) : string; + var arr = []; + + for (var i = 0; i < segment.length; ++i) { + var c = segment.charCodeAt(i); + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) + ) { + arr[arr.length] = segment.charAt(i); + continue; + } + + if (c < 0x80) { + arr[arr.length] = hexTable[c]; + continue; + } + + if (c < 0x800) { + arr[arr.length] = hexTable[0xC0 | (c >> 6)] + + hexTable[0x80 | (c & 0x3F)]; + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + arr[arr.length] = hexTable[0xE0 | (c >> 12)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + continue; } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (segment.charCodeAt(i) & 0x3FF)); + + arr[arr.length] = hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; } - queueIndex = -1; - len = queue.length; + + out += arr.join(''); } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } } } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } + + compactQueue(queue); + + return value; }; -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; }; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; -function noop() {} +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; -process.listeners = function (name) { return [] } +var combine = function combine(a, b) { + return [].concat(a, b); +}; -process.binding = function (name) { - throw new Error('process.binding is not supported'); +var maybeMap = function maybeMap(val, fn) { + if (isArray(val)) { + var mapped = []; + for (var i = 0; i < val.length; i += 1) { + mapped.push(fn(val[i])); + } + return mapped; + } + return fn(val); }; -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + maybeMap: maybeMap, + merge: merge }; -process.umask = function() { return 0; }; /***/ }), -/***/ "./node_modules/querystring/decode.js": -/*!********************************************!*\ - !*** ./node_modules/querystring/decode.js ***! - \********************************************/ +/***/ "./node_modules/querystring-es3/decode.js": +/*!************************************************!*\ + !*** ./node_modules/querystring-es3/decode.js ***! + \************************************************/ /***/ ((module) => { "use strict"; @@ -15981,7 +19044,7 @@ module.exports = function(qs, sep, eq, options) { if (!hasOwnProperty(obj, k)) { obj[k] = v; - } else if (Array.isArray(obj[k])) { + } else if (isArray(obj[k])) { obj[k].push(v); } else { obj[k] = [obj[k], v]; @@ -15991,13 +19054,17 @@ module.exports = function(qs, sep, eq, options) { return obj; }; +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + /***/ }), -/***/ "./node_modules/querystring/encode.js": -/*!********************************************!*\ - !*** ./node_modules/querystring/encode.js ***! - \********************************************/ +/***/ "./node_modules/querystring-es3/encode.js": +/*!************************************************!*\ + !*** ./node_modules/querystring-es3/encode.js ***! + \************************************************/ /***/ ((module) => { "use strict"; @@ -16048,10 +19115,10 @@ module.exports = function(obj, sep, eq, name) { } if (typeof obj === 'object') { - return Object.keys(obj).map(function(k) { + return map(objectKeys(obj), function(k) { var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; - if (Array.isArray(obj[k])) { - return obj[k].map(function(v) { + if (isArray(obj[k])) { + return map(obj[k], function(v) { return ks + encodeURIComponent(stringifyPrimitive(v)); }).join(sep); } else { @@ -16066,20 +19133,41 @@ module.exports = function(obj, sep, eq, name) { encodeURIComponent(stringifyPrimitive(obj)); }; +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +function map (xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; +} + +var objectKeys = Object.keys || function (obj) { + var res = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + return res; +}; + /***/ }), -/***/ "./node_modules/querystring/index.js": -/*!*******************************************!*\ - !*** ./node_modules/querystring/index.js ***! - \*******************************************/ +/***/ "./node_modules/querystring-es3/index.js": +/*!***********************************************!*\ + !*** ./node_modules/querystring-es3/index.js ***! + \***********************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -exports.decode = exports.parse = __webpack_require__(/*! ./decode */ "./node_modules/querystring/decode.js"); -exports.encode = exports.stringify = __webpack_require__(/*! ./encode */ "./node_modules/querystring/encode.js"); +exports.decode = exports.parse = __webpack_require__(/*! ./decode */ "./node_modules/querystring-es3/decode.js"); +exports.encode = exports.stringify = __webpack_require__(/*! ./encode */ "./node_modules/querystring-es3/encode.js"); /***/ }), @@ -16267,14 +19355,14 @@ var objectKeys = Object.keys || function (obj) { /**/ module.exports = Duplex; -const Readable = __webpack_require__(/*! ./_stream_readable */ "./node_modules/readable-stream/lib/_stream_readable.js"); -const Writable = __webpack_require__(/*! ./_stream_writable */ "./node_modules/readable-stream/lib/_stream_writable.js"); +var Readable = __webpack_require__(/*! ./_stream_readable */ "./node_modules/readable-stream/lib/_stream_readable.js"); +var Writable = __webpack_require__(/*! ./_stream_writable */ "./node_modules/readable-stream/lib/_stream_writable.js"); __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js")(Duplex, Readable); { // Allow the keys array to be GC'ed. - const keys = objectKeys(Writable.prototype); + var keys = objectKeys(Writable.prototype); for (var v = 0; v < keys.length; v++) { - const method = keys[v]; + var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } } @@ -16297,7 +19385,7 @@ Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get() { + get: function get() { return this._writableState.highWaterMark; } }); @@ -16315,7 +19403,7 @@ Object.defineProperty(Duplex.prototype, 'writableLength', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get() { + get: function get() { return this._writableState.length; } }); @@ -16337,13 +19425,13 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get() { + get: function get() { if (this._readableState === undefined || this._writableState === undefined) { return false; } return this._readableState.destroyed && this._writableState.destroyed; }, - set(value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (this._readableState === undefined || this._writableState === undefined) { @@ -16394,7 +19482,7 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { module.exports = PassThrough; -const Transform = __webpack_require__(/*! ./_stream_transform */ "./node_modules/readable-stream/lib/_stream_transform.js"); +var Transform = __webpack_require__(/*! ./_stream_transform */ "./node_modules/readable-stream/lib/_stream_transform.js"); __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js")(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); @@ -16446,7 +19534,7 @@ var Duplex; Readable.ReadableState = ReadableState; /**/ -const EE = (__webpack_require__(/*! events */ "./node_modules/events/events.js").EventEmitter); +var EE = (__webpack_require__(/*! events */ "./node_modules/events/events.js").EventEmitter); var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; }; @@ -16456,8 +19544,8 @@ var EElistenerCount = function EElistenerCount(emitter, type) { var Stream = __webpack_require__(/*! ./internal/streams/stream */ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js"); /**/ -const Buffer = (__webpack_require__(/*! buffer */ "./node_modules/buffer/index.js").Buffer); -const OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; +var Buffer = (__webpack_require__(/*! buffer */ "./node_modules/buffer/index.js").Buffer); +var OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } @@ -16466,8 +19554,8 @@ function _isUint8Array(obj) { } /**/ -const debugUtil = __webpack_require__(/*! util */ "?d17e"); -let debug; +var debugUtil = __webpack_require__(/*! util */ "?d17e"); +var debug; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { @@ -16475,23 +19563,23 @@ if (debugUtil && debugUtil.debuglog) { } /**/ -const BufferList = __webpack_require__(/*! ./internal/streams/buffer_list */ "./node_modules/readable-stream/lib/internal/streams/buffer_list.js"); -const destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js"); -const _require = __webpack_require__(/*! ./internal/streams/state */ "./node_modules/readable-stream/lib/internal/streams/state.js"), +var BufferList = __webpack_require__(/*! ./internal/streams/buffer_list */ "./node_modules/readable-stream/lib/internal/streams/buffer_list.js"); +var destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js"); +var _require = __webpack_require__(/*! ./internal/streams/state */ "./node_modules/readable-stream/lib/internal/streams/state.js"), getHighWaterMark = _require.getHighWaterMark; -const _require$codes = (__webpack_require__(/*! ../errors */ "./node_modules/readable-stream/errors-browser.js").codes), +var _require$codes = (__webpack_require__(/*! ../errors */ "./node_modules/readable-stream/errors-browser.js").codes), ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. -let StringDecoder; -let createReadableStreamAsyncIterator; -let from; +var StringDecoder; +var createReadableStreamAsyncIterator; +var from; __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js")(Readable, Stream); -const errorOrDestroy = destroyImpl.errorOrDestroy; -const kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; +var errorOrDestroy = destroyImpl.errorOrDestroy; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; function prependListener(emitter, event, fn) { // Sadly this is not cacheable as some libraries bundle their own // event emitter implementation with them. @@ -16582,7 +19670,7 @@ function Readable(options) { // Checking for a Stream.Duplex instance is faster here instead of inside // the ReadableState constructor, at least with V8 6.5 - const isDuplex = this instanceof Duplex; + var isDuplex = this instanceof Duplex; this._readableState = new ReadableState(options, this, isDuplex); // legacy @@ -16598,13 +19686,13 @@ Object.defineProperty(Readable.prototype, 'destroyed', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get() { + get: function get() { if (this._readableState === undefined) { return false; } return this._readableState.destroyed; }, - set(value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._readableState) { @@ -16715,14 +19803,14 @@ Readable.prototype.isPaused = function () { // backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = (__webpack_require__(/*! string_decoder/ */ "./node_modules/string_decoder/lib/string_decoder.js").StringDecoder); - const decoder = new StringDecoder(enc); + var decoder = new StringDecoder(enc); this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: - let p = this._readableState.buffer.head; - let content = ''; + var p = this._readableState.buffer.head; + var content = ''; while (p !== null) { content += decoder.write(p.data); p = p.next; @@ -16734,7 +19822,7 @@ Readable.prototype.setEncoding = function (enc) { }; // Don't raise the hwm > 1GB -const MAX_HWM = 0x40000000; +var MAX_HWM = 0x40000000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. @@ -16961,7 +20049,7 @@ function maybeReadMore_(stream, state) { // read()s. The execution ends in this method again after the _read() ends // up calling push() with more data. while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { - const len = state.length; + var len = state.length; debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) @@ -17158,8 +20246,8 @@ Readable.prototype.unpipe = function (dest) { // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { - const res = Stream.prototype.on.call(this, ev, fn); - const state = this._readableState; + var res = Stream.prototype.on.call(this, ev, fn); + var state = this._readableState; if (ev === 'data') { // update readableListening so that resume() may be a no-op // a few lines down. This is needed to support once('readable'). @@ -17184,7 +20272,7 @@ Readable.prototype.on = function (ev, fn) { }; Readable.prototype.addListener = Readable.prototype.on; Readable.prototype.removeListener = function (ev, fn) { - const res = Stream.prototype.removeListener.call(this, ev, fn); + var res = Stream.prototype.removeListener.call(this, ev, fn); if (ev === 'readable') { // We need to check if there is someone still listening to // readable and reset the state. However this needs to happen @@ -17197,7 +20285,7 @@ Readable.prototype.removeListener = function (ev, fn) { return res; }; Readable.prototype.removeAllListeners = function (ev) { - const res = Stream.prototype.removeAllListeners.apply(this, arguments); + var res = Stream.prototype.removeAllListeners.apply(this, arguments); if (ev === 'readable' || ev === undefined) { // We need to check if there is someone still listening to // readable and reset the state. However this needs to happen @@ -17210,7 +20298,7 @@ Readable.prototype.removeAllListeners = function (ev) { return res; }; function updateReadableListening(self) { - const state = self._readableState; + var state = self._readableState; state.readableListening = self.listenerCount('readable') > 0; if (state.resumeScheduled && !state.paused) { // flowing needs to be set to true now, otherwise @@ -17269,7 +20357,7 @@ Readable.prototype.pause = function () { return this; }; function flow(stream) { - const state = stream._readableState; + var state = stream._readableState; debug('flow', state.flowing); while (state.flowing && stream.read() !== null); } @@ -17278,23 +20366,24 @@ function flow(stream) { // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function (stream) { + var _this = this; var state = this._readableState; var paused = false; - stream.on('end', () => { + stream.on('end', function () { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); - if (chunk && chunk.length) this.push(chunk); + if (chunk && chunk.length) _this.push(chunk); } - this.push(null); + _this.push(null); }); - stream.on('data', chunk => { + stream.on('data', function (chunk) { debug('wrapped data'); if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - var ret = this.push(chunk); + var ret = _this.push(chunk); if (!ret) { paused = true; stream.pause(); @@ -17320,7 +20409,7 @@ Readable.prototype.wrap = function (stream) { // when we try to consume some more bytes, simply unpause the // underlying stream. - this._read = n => { + this._read = function (n) { debug('wrapped _read', n); if (paused) { paused = false; @@ -17377,7 +20466,7 @@ Object.defineProperty(Readable.prototype, 'readableLength', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get() { + get: function get() { return this._readableState.length; } }); @@ -17419,7 +20508,7 @@ function endReadableNT(state, stream) { if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the writable side is ready for autoDestroy as well - const wState = stream._writableState; + var wState = stream._writableState; if (!wState || wState.autoDestroy && wState.finished) { stream.destroy(); } @@ -17516,12 +20605,12 @@ function indexOf(xs, x) { module.exports = Transform; -const _require$codes = (__webpack_require__(/*! ../errors */ "./node_modules/readable-stream/errors-browser.js").codes), +var _require$codes = (__webpack_require__(/*! ../errors */ "./node_modules/readable-stream/errors-browser.js").codes), ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; -const Duplex = __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js"); +var Duplex = __webpack_require__(/*! ./_stream_duplex */ "./node_modules/readable-stream/lib/_stream_duplex.js"); __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js")(Transform, Duplex); function afterTransform(er, data) { var ts = this._transformState; @@ -17570,9 +20659,10 @@ function Transform(options) { this.on('prefinish', prefinish); } function prefinish() { + var _this = this; if (typeof this._flush === 'function' && !this._readableState.destroyed) { - this._flush((er, data) => { - done(this, er, data); + this._flush(function (er, data) { + done(_this, er, data); }); } else { done(this, null, null); @@ -17622,7 +20712,7 @@ Transform.prototype._read = function (n) { } }; Transform.prototype._destroy = function (err, cb) { - Duplex.prototype._destroy.call(this, err, err2 => { + Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); }); }; @@ -17690,10 +20780,11 @@ function WriteReq(chunk, encoding, cb) { // It seems a linked list but it is not // there will be only 2 of these for each stream function CorkedRequest(state) { + var _this = this; this.next = null; this.entry = null; - this.finish = () => { - onCorkedFinish(this, state); + this.finish = function () { + onCorkedFinish(_this, state); }; } /* */ @@ -17705,7 +20796,7 @@ var Duplex; Writable.WritableState = WritableState; /**/ -const internalUtil = { +var internalUtil = { deprecate: __webpack_require__(/*! util-deprecate */ "./node_modules/util-deprecate/browser.js") }; /**/ @@ -17714,18 +20805,18 @@ const internalUtil = { var Stream = __webpack_require__(/*! ./internal/streams/stream */ "./node_modules/readable-stream/lib/internal/streams/stream-browser.js"); /**/ -const Buffer = (__webpack_require__(/*! buffer */ "./node_modules/buffer/index.js").Buffer); -const OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; +var Buffer = (__webpack_require__(/*! buffer */ "./node_modules/buffer/index.js").Buffer); +var OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } -const destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js"); -const _require = __webpack_require__(/*! ./internal/streams/state */ "./node_modules/readable-stream/lib/internal/streams/state.js"), +var destroyImpl = __webpack_require__(/*! ./internal/streams/destroy */ "./node_modules/readable-stream/lib/internal/streams/destroy.js"); +var _require = __webpack_require__(/*! ./internal/streams/state */ "./node_modules/readable-stream/lib/internal/streams/state.js"), getHighWaterMark = _require.getHighWaterMark; -const _require$codes = (__webpack_require__(/*! ../errors */ "./node_modules/readable-stream/errors-browser.js").codes), +var _require$codes = (__webpack_require__(/*! ../errors */ "./node_modules/readable-stream/errors-browser.js").codes), ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, @@ -17734,7 +20825,7 @@ const _require$codes = (__webpack_require__(/*! ../errors */ "./node_modules/rea ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; -const errorOrDestroy = destroyImpl.errorOrDestroy; +var errorOrDestroy = destroyImpl.errorOrDestroy; __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js")(Writable, Stream); function nop() {} function WritableState(options, stream, isDuplex) { @@ -17892,7 +20983,7 @@ function Writable(options) { // Checking for a Stream.Duplex instance is faster here instead of inside // the WritableState constructor, at least with V8 6.5 - const isDuplex = this instanceof Duplex; + var isDuplex = this instanceof Duplex; if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); this._writableState = new WritableState(options, this, isDuplex); @@ -18016,9 +21107,9 @@ function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { if (state.writing || state.corked) { var last = state.lastBufferedRequest; state.lastBufferedRequest = { - chunk, - encoding, - isBuf, + chunk: chunk, + encoding: encoding, + isBuf: isBuf, callback: cb, next: null }; @@ -18191,7 +21282,7 @@ Object.defineProperty(Writable.prototype, 'writableLength', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get() { + get: function get() { return this._writableState.length; } }); @@ -18199,7 +21290,7 @@ function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } function callFinal(stream, state) { - stream._final(err => { + stream._final(function (err) { state.pendingcb--; if (err) { errorOrDestroy(stream, err); @@ -18231,7 +21322,7 @@ function finishMaybe(stream, state) { if (state.autoDestroy) { // In case of duplex streams we need a way to detect // if the readable side is ready for autoDestroy as well - const rState = stream._readableState; + var rState = stream._readableState; if (!rState || rState.autoDestroy && rState.endEmitted) { stream.destroy(); } @@ -18267,13 +21358,13 @@ Object.defineProperty(Writable.prototype, 'destroyed', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get() { + get: function get() { if (this._writableState === undefined) { return false; } return this._writableState.destroyed; }, - set(value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._writableState) { @@ -18303,24 +21394,28 @@ Writable.prototype._destroy = function (err, cb) { /* provided dependency */ var process = __webpack_require__(/*! ./node_modules/process/browser.js */ "./node_modules/process/browser.js"); -const finished = __webpack_require__(/*! ./end-of-stream */ "./node_modules/readable-stream/lib/internal/streams/end-of-stream.js"); -const kLastResolve = Symbol('lastResolve'); -const kLastReject = Symbol('lastReject'); -const kError = Symbol('error'); -const kEnded = Symbol('ended'); -const kLastPromise = Symbol('lastPromise'); -const kHandlePromise = Symbol('handlePromise'); -const kStream = Symbol('stream'); +var _Object$setPrototypeO; +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +var finished = __webpack_require__(/*! ./end-of-stream */ "./node_modules/readable-stream/lib/internal/streams/end-of-stream.js"); +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); function createIterResult(value, done) { return { - value, - done + value: value, + done: done }; } function readAndResolve(iter) { - const resolve = iter[kLastResolve]; + var resolve = iter[kLastResolve]; if (resolve !== null) { - const data = iter[kStream].read(); + var data = iter[kStream].read(); // we defer if data is null // we can be expecting either 'end' or // 'error' @@ -18338,8 +21433,8 @@ function onReadable(iter) { process.nextTick(readAndResolve, iter); } function wrapForNext(lastPromise, iter) { - return (resolve, reject) => { - lastPromise.then(() => { + return function (resolve, reject) { + lastPromise.then(function () { if (iter[kEnded]) { resolve(createIterResult(undefined, true)); return; @@ -18348,15 +21443,16 @@ function wrapForNext(lastPromise, iter) { }, reject); }; } -const AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); -const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { get stream() { return this[kStream]; }, - next() { + next: function next() { + var _this = this; // if we have detected an error in the meanwhile // reject straight away - const error = this[kError]; + var error = this[kError]; if (error !== null) { return Promise.reject(error); } @@ -18368,10 +21464,10 @@ const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ // called, the error will be emitted via nextTick, and // we cannot guarantee that there is no error lingering around // waiting to be emitted. - return new Promise((resolve, reject) => { - process.nextTick(() => { - if (this[kError]) { - reject(this[kError]); + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); } else { resolve(createIterResult(undefined, true)); } @@ -18383,14 +21479,14 @@ const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ // we will wait for the previous Promise to finish // this logic is optimized to support for await loops, // where next() is only called once at a time - const lastPromise = this[kLastPromise]; - let promise; + var lastPromise = this[kLastPromise]; + var promise; if (lastPromise) { promise = new Promise(wrapForNext(lastPromise, this)); } else { // fast path needed to support multiple this.push() // without triggering the next() queue - const data = this[kStream].read(); + var data = this[kStream].read(); if (data !== null) { return Promise.resolve(createIterResult(data, false)); } @@ -18398,70 +21494,60 @@ const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ } this[kLastPromise] = promise; return promise; - }, - [Symbol.asyncIterator]() { - return this; - }, - return() { - // destroy(err, cb) is a private API - // we can guarantee we have that here, because we control the - // Readable class this is attached to - return new Promise((resolve, reject) => { - this[kStream].destroy(null, err => { - if (err) { - reject(err); - return; - } - resolve(createIterResult(undefined, true)); - }); - }); } -}, AsyncIteratorPrototype); -const createReadableStreamAsyncIterator = stream => { - const iterator = Object.create(ReadableStreamAsyncIteratorPrototype, { - [kStream]: { - value: stream, - writable: true - }, - [kLastResolve]: { - value: null, - writable: true - }, - [kLastReject]: { - value: null, - writable: true - }, - [kError]: { - value: null, - writable: true - }, - [kEnded]: { - value: stream._readableState.endEmitted, - writable: true - }, - // the function passed to new Promise - // is cached so we avoid allocating a new - // closure at every run - [kHandlePromise]: { - value: (resolve, reject) => { - const data = iterator[kStream].read(); - if (data) { - iterator[kLastPromise] = null; - iterator[kLastResolve] = null; - iterator[kLastReject] = null; - resolve(createIterResult(data, false)); - } else { - iterator[kLastResolve] = resolve; - iterator[kLastReject] = reject; - } - }, - writable: true - } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + resolve(createIterResult(undefined, true)); + }); }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); iterator[kLastPromise] = null; - finished(stream, err => { + finished(stream, function (err) { if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { - const reject = iterator[kLastReject]; + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise // returned by next() and store the error if (reject !== null) { @@ -18473,7 +21559,7 @@ const createReadableStreamAsyncIterator = stream => { iterator[kError] = err; return; } - const resolve = iterator[kLastResolve]; + var resolve = iterator[kLastResolve]; if (resolve !== null) { iterator[kLastPromise] = null; iterator[kLastResolve] = null; @@ -18501,156 +21587,184 @@ module.exports = createReadableStreamAsyncIterator; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -const _require = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js"), +var _require = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js"), Buffer = _require.Buffer; -const _require2 = __webpack_require__(/*! util */ "?ed1b"), +var _require2 = __webpack_require__(/*! util */ "?ed1b"), inspect = _require2.inspect; -const custom = inspect && inspect.custom || 'inspect'; +var custom = inspect && inspect.custom || 'inspect'; function copyBuffer(src, target, offset) { Buffer.prototype.copy.call(src, target, offset); } -module.exports = class BufferList { - constructor() { +module.exports = /*#__PURE__*/function () { + function BufferList() { + _classCallCheck(this, BufferList); this.head = null; this.tail = null; this.length = 0; } - push(v) { - const entry = { - data: v, - next: null - }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - } - unshift(v) { - const entry = { - data: v, - next: this.head - }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - } - shift() { - if (this.length === 0) return; - const ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - } - clear() { - this.head = this.tail = null; - this.length = 0; - } - join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) ret += s + p.data; - return ret; - } - concat(n) { - if (this.length === 0) return Buffer.alloc(0); - const ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; - } - return ret; - } - - // Consumes a specified amount of bytes or characters from the buffered data. - consume(n, hasStrings) { - var ret; - if (n < this.head.data.length) { - // `slice` is the same for buffers and strings. - ret = this.head.data.slice(0, n); - this.head.data = this.head.data.slice(n); - } else if (n === this.head.data.length) { - // First chunk is a perfect match. - ret = this.shift(); - } else { - // Result spans more than one buffer. - ret = hasStrings ? this._getString(n) : this._getBuffer(n); - } - return ret; - } - first() { - return this.head.data; - } - - // Consumes a specified amount of characters from the buffered data. - _getString(n) { - var p = this.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - const str = p.data; - const nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) this.head = p.next;else this.head = this.tail = null; - } else { - this.head = p; - p.data = str.slice(nb); + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) ret += s + p.data; + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + } + + // Consumes a specified amount of bytes or characters from the buffered data. + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } + + // Consumes a specified amount of characters from the buffered data. + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + break; } - break; + ++c; } - ++c; - } - this.length -= c; - return ret; - } - - // Consumes a specified amount of bytes from the buffered data. - _getBuffer(n) { - const ret = Buffer.allocUnsafe(n); - var p = this.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - const buf = p.data; - const nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) this.head = p.next;else this.head = this.tail = null; - } else { - this.head = p; - p.data = buf.slice(nb); + this.length -= c; + return ret; + } + + // Consumes a specified amount of bytes from the buffered data. + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + break; } - break; + ++c; } - ++c; - } - this.length -= c; - return ret; - } - - // Make sure the linked list only shows the minimal necessary information. - [custom](_, options) { - return inspect(this, _objectSpread(_objectSpread({}, options), {}, { - // Only inspect one level. - depth: 0, - // It should not recurse. - customInspect: false - })); - } -}; + this.length -= c; + return ret; + } + + // Make sure the linked list only shows the minimal necessary information. + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread(_objectSpread({}, options), {}, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + return BufferList; +}(); /***/ }), @@ -18666,8 +21780,9 @@ module.exports = class BufferList { // undocumented cb() API, needed for core, not for public API function destroy(err, cb) { - const readableDestroyed = this._readableState && this._readableState.destroyed; - const writableDestroyed = this._writableState && this._writableState.destroyed; + var _this = this; + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; if (readableDestroyed || writableDestroyed) { if (cb) { cb(err); @@ -18693,21 +21808,21 @@ function destroy(err, cb) { if (this._writableState) { this._writableState.destroyed = true; } - this._destroy(err || null, err => { + this._destroy(err || null, function (err) { if (!cb && err) { - if (!this._writableState) { - process.nextTick(emitErrorAndCloseNT, this, err); - } else if (!this._writableState.errorEmitted) { - this._writableState.errorEmitted = true; - process.nextTick(emitErrorAndCloseNT, this, err); + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); } else { - process.nextTick(emitCloseNT, this); + process.nextTick(emitCloseNT, _this); } } else if (cb) { - process.nextTick(emitCloseNT, this); + process.nextTick(emitCloseNT, _this); cb(err); } else { - process.nextTick(emitCloseNT, this); + process.nextTick(emitCloseNT, _this); } }); return this; @@ -18748,14 +21863,14 @@ function errorOrDestroy(stream, err) { // the error to be emitted nextTick. In a future // semver major update we should change the default to this. - const rState = stream._readableState; - const wState = stream._writableState; + var rState = stream._readableState; + var wState = stream._writableState; if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); } module.exports = { - destroy, - undestroy, - errorOrDestroy + destroy: destroy, + undestroy: undestroy, + errorOrDestroy: errorOrDestroy }; /***/ }), @@ -18772,9 +21887,9 @@ module.exports = { -const ERR_STREAM_PREMATURE_CLOSE = (__webpack_require__(/*! ../../../errors */ "./node_modules/readable-stream/errors-browser.js").codes.ERR_STREAM_PREMATURE_CLOSE); +var ERR_STREAM_PREMATURE_CLOSE = (__webpack_require__(/*! ../../../errors */ "./node_modules/readable-stream/errors-browser.js").codes).ERR_STREAM_PREMATURE_CLOSE; function once(callback) { - let called = false; + var called = false; return function () { if (called) return; called = true; @@ -18792,28 +21907,28 @@ function eos(stream, opts, callback) { if (typeof opts === 'function') return eos(stream, null, opts); if (!opts) opts = {}; callback = once(callback || noop); - let readable = opts.readable || opts.readable !== false && stream.readable; - let writable = opts.writable || opts.writable !== false && stream.writable; - const onlegacyfinish = () => { + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + var onlegacyfinish = function onlegacyfinish() { if (!stream.writable) onfinish(); }; var writableEnded = stream._writableState && stream._writableState.finished; - const onfinish = () => { + var onfinish = function onfinish() { writable = false; writableEnded = true; if (!readable) callback.call(stream); }; var readableEnded = stream._readableState && stream._readableState.endEmitted; - const onend = () => { + var onend = function onend() { readable = false; readableEnded = true; if (!writable) callback.call(stream); }; - const onerror = err => { + var onerror = function onerror(err) { callback.call(stream, err); }; - const onclose = () => { - let err; + var onclose = function onclose() { + var err; if (readable && !readableEnded) { if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); return callback.call(stream, err); @@ -18823,7 +21938,7 @@ function eos(stream, opts, callback) { return callback.call(stream, err); } }; - const onrequest = () => { + var onrequest = function onrequest() { stream.req.on('finish', onfinish); }; if (isRequest(stream)) { @@ -18881,16 +21996,16 @@ module.exports = function () { -let eos; +var eos; function once(callback) { - let called = false; + var called = false; return function () { if (called) return; called = true; - callback(...arguments); + callback.apply(void 0, arguments); }; } -const _require$codes = (__webpack_require__(/*! ../../../errors */ "./node_modules/readable-stream/errors-browser.js").codes), +var _require$codes = (__webpack_require__(/*! ../../../errors */ "./node_modules/readable-stream/errors-browser.js").codes), ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; function noop(err) { @@ -18902,21 +22017,21 @@ function isRequest(stream) { } function destroyer(stream, reading, writing, callback) { callback = once(callback); - let closed = false; - stream.on('close', () => { + var closed = false; + stream.on('close', function () { closed = true; }); if (eos === undefined) eos = __webpack_require__(/*! ./end-of-stream */ "./node_modules/readable-stream/lib/internal/streams/end-of-stream.js"); eos(stream, { readable: reading, writable: writing - }, err => { + }, function (err) { if (err) return callback(err); closed = true; callback(); }); - let destroyed = false; - return err => { + var destroyed = false; + return function (err) { if (closed) return; if (destroyed) return; destroyed = true; @@ -18942,15 +22057,15 @@ function pipeline() { for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { streams[_key] = arguments[_key]; } - const callback = popCallback(streams); + var callback = popCallback(streams); if (Array.isArray(streams[0])) streams = streams[0]; if (streams.length < 2) { throw new ERR_MISSING_ARGS('streams'); } - let error; - const destroys = streams.map(function (stream, i) { - const reading = i < streams.length - 1; - const writing = i > 0; + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; return destroyer(stream, reading, writing, function (err) { if (!error) error = err; if (err) destroys.forEach(call); @@ -18974,15 +22089,15 @@ module.exports = pipeline; "use strict"; -const ERR_INVALID_OPT_VALUE = (__webpack_require__(/*! ../../../errors */ "./node_modules/readable-stream/errors-browser.js").codes.ERR_INVALID_OPT_VALUE); +var ERR_INVALID_OPT_VALUE = (__webpack_require__(/*! ../../../errors */ "./node_modules/readable-stream/errors-browser.js").codes).ERR_INVALID_OPT_VALUE; function highWaterMarkFrom(options, isDuplex, duplexKey) { return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; } function getHighWaterMark(state, options, duplexKey, isDuplex) { - const hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); if (hwm != null) { if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { - const name = isDuplex ? duplexKey : 'highWaterMark'; + var name = isDuplex ? duplexKey : 'highWaterMark'; throw new ERR_INVALID_OPT_VALUE(name, hwm); } return Math.floor(hwm); @@ -18992,7 +22107,7 @@ function getHighWaterMark(state, options, duplexKey, isDuplex) { return state.objectMode ? 16 : 16 * 1024; } module.exports = { - getHighWaterMark + getHighWaterMark: getHighWaterMark }; /***/ }), @@ -19008,77 +22123,195 @@ module.exports = __webpack_require__(/*! events */ "./node_modules/events/events /***/ }), -/***/ "./node_modules/safe-buffer/index.js": -/*!*******************************************!*\ - !*** ./node_modules/safe-buffer/index.js ***! - \*******************************************/ -/***/ ((module, exports, __webpack_require__) => { +/***/ "./node_modules/set-function-length/index.js": +/*!***************************************************!*\ + !*** ./node_modules/set-function-length/index.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -/*! safe-buffer. MIT License. Feross Aboukhadijeh */ -/* eslint-disable node/no-deprecated-api */ -var buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js") -var Buffer = buffer.Buffer +"use strict"; -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} +var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); +var define = __webpack_require__(/*! define-data-property */ "./node_modules/define-data-property/index.js"); +var hasDescriptors = __webpack_require__(/*! has-property-descriptors */ "./node_modules/has-property-descriptors/index.js")(); +var gOPD = __webpack_require__(/*! gopd */ "./node_modules/gopd/index.js"); + +var $TypeError = __webpack_require__(/*! es-errors/type */ "./node_modules/es-errors/type.js"); +var $floor = GetIntrinsic('%Math.floor%'); + +/** @type {import('.')} */ +module.exports = function setFunctionLength(fn, length) { + if (typeof fn !== 'function') { + throw new $TypeError('`fn` is not a function'); + } + if (typeof length !== 'number' || length < 0 || length > 0xFFFFFFFF || $floor(length) !== length) { + throw new $TypeError('`length` must be a positive 32-bit integer'); + } + + var loose = arguments.length > 2 && !!arguments[2]; + + var functionLengthIsConfigurable = true; + var functionLengthIsWritable = true; + if ('length' in fn && gOPD) { + var desc = gOPD(fn, 'length'); + if (desc && !desc.configurable) { + functionLengthIsConfigurable = false; + } + if (desc && !desc.writable) { + functionLengthIsWritable = false; + } + } + + if (functionLengthIsConfigurable || functionLengthIsWritable || !loose) { + if (hasDescriptors) { + define(/** @type {Parameters[0]} */ (fn), 'length', length, true, true); + } else { + define(/** @type {Parameters[0]} */ (fn), 'length', length); + } + } + return fn; +}; + + +/***/ }), + +/***/ "./node_modules/side-channel/index.js": +/*!********************************************!*\ + !*** ./node_modules/side-channel/index.js ***! + \********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; -SafeBuffer.prototype = Object.create(Buffer.prototype) -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) +var GetIntrinsic = __webpack_require__(/*! get-intrinsic */ "./node_modules/get-intrinsic/index.js"); +var callBound = __webpack_require__(/*! call-bind/callBound */ "./node_modules/call-bind/callBound.js"); +var inspect = __webpack_require__(/*! object-inspect */ "./node_modules/object-inspect/index.js"); -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} +var $TypeError = __webpack_require__(/*! es-errors/type */ "./node_modules/es-errors/type.js"); +var $WeakMap = GetIntrinsic('%WeakMap%', true); +var $Map = GetIntrinsic('%Map%', true); -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} +var $weakMapGet = callBound('WeakMap.prototype.get', true); +var $weakMapSet = callBound('WeakMap.prototype.set', true); +var $weakMapHas = callBound('WeakMap.prototype.has', true); +var $mapGet = callBound('Map.prototype.get', true); +var $mapSet = callBound('Map.prototype.set', true); +var $mapHas = callBound('Map.prototype.has', true); -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} +/* +* This function traverses the list returning the node corresponding to the given key. +* +* That node is also moved to the head of the list, so that if it's accessed again we don't need to traverse the whole list. By doing so, all the recently used nodes can be accessed relatively quickly. +*/ +/** @type {import('.').listGetNode} */ +var listGetNode = function (list, key) { // eslint-disable-line consistent-return + /** @type {typeof list | NonNullable<(typeof list)['next']>} */ + var prev = list; + /** @type {(typeof list)['next']} */ + var curr; + for (; (curr = prev.next) !== null; prev = curr) { + if (curr.key === key) { + prev.next = curr.next; + // eslint-disable-next-line no-extra-parens + curr.next = /** @type {NonNullable} */ (list.next); + list.next = curr; // eslint-disable-line no-param-reassign + return curr; + } + } +}; -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} +/** @type {import('.').listGet} */ +var listGet = function (objects, key) { + var node = listGetNode(objects, key); + return node && node.value; +}; +/** @type {import('.').listSet} */ +var listSet = function (objects, key, value) { + var node = listGetNode(objects, key); + if (node) { + node.value = value; + } else { + // Prepend the new node to the beginning of the list + objects.next = /** @type {import('.').ListNode} */ ({ // eslint-disable-line no-param-reassign, no-extra-parens + key: key, + next: objects.next, + value: value + }); + } +}; +/** @type {import('.').listHas} */ +var listHas = function (objects, key) { + return !!listGetNode(objects, key); +}; + +/** @type {import('.')} */ +module.exports = function getSideChannel() { + /** @type {WeakMap} */ var $wm; + /** @type {Map} */ var $m; + /** @type {import('.').RootNode} */ var $o; + + /** @type {import('.').Channel} */ + var channel = { + assert: function (key) { + if (!channel.has(key)) { + throw new $TypeError('Side channel does not contain ' + inspect(key)); + } + }, + get: function (key) { // eslint-disable-line consistent-return + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapGet($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapGet($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listGet($o, key); + } + } + }, + has: function (key) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapHas($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapHas($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listHas($o, key); + } + } + return false; + }, + set: function (key, value) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key, value); + } else if ($Map) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key, value); + } else { + if (!$o) { + // Initialize the linked list as an empty node, so that we don't have to special-case handling of the first node: we can always refer to it as (previous node).next, instead of something like (list).head + $o = { key: {}, next: null }; + } + listSet($o, key, value); + } + } + }; + return channel; +}; /***/ }), @@ -19382,7 +22615,7 @@ module.exports = function () { /**/ -var Buffer = (__webpack_require__(/*! safe-buffer */ "./node_modules/safe-buffer/index.js").Buffer); +var Buffer = (__webpack_require__(/*! safe-buffer */ "./node_modules/string_decoder/node_modules/safe-buffer/index.js").Buffer); /**/ var isEncoding = Buffer.isEncoding || function (encoding) { @@ -19654,6 +22887,81 @@ function simpleEnd(buf) { return buf && buf.length ? this.write(buf) : ''; } +/***/ }), + +/***/ "./node_modules/string_decoder/node_modules/safe-buffer/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/string_decoder/node_modules/safe-buffer/index.js ***! + \***********************************************************************/ +/***/ ((module, exports, __webpack_require__) => { + +/*! safe-buffer. MIT License. Feross Aboukhadijeh */ +/* eslint-disable node/no-deprecated-api */ +var buffer = __webpack_require__(/*! buffer */ "./node_modules/buffer/index.js") +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.prototype = Object.create(Buffer.prototype) + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + + /***/ }), /***/ "./node_modules/stringify-object/index.js": @@ -21376,7 +24684,7 @@ Object.defineProperty(exports, '__esModule', { value: true }); /***/ (function(module, exports, __webpack_require__) { /* module decorator */ module = __webpack_require__.nmd(module); -var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.3.2 by @mathias */ +var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */ ;(function(root) { /** Detect free variables */ @@ -21442,7 +24750,7 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.3.2 by @mathia * @returns {Error} Throws a `RangeError` with the applicable error message. */ function error(type) { - throw RangeError(errors[type]); + throw new RangeError(errors[type]); } /** @@ -21589,7 +24897,7 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.3.2 by @mathia /** * Bias adaptation function as per section 3.4 of RFC 3492. - * http://tools.ietf.org/html/rfc3492#section-3.4 + * https://tools.ietf.org/html/rfc3492#section-3.4 * @private */ function adapt(delta, numPoints, firstTime) { @@ -21864,7 +25172,7 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.3.2 by @mathia * @memberOf punycode * @type String */ - 'version': '1.3.2', + 'version': '1.4.1', /** * An object of methods to convert from JavaScript's internal character * representation (UCS-2) to Unicode code points, and back. @@ -21906,38 +25214,32 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.3.2 by @mathia /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - +/* + * Copyright Joyent, Inc. and other Node contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the + * following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ -var punycode = __webpack_require__(/*! punycode */ "./node_modules/url/node_modules/punycode/punycode.js"); -var util = __webpack_require__(/*! ./util */ "./node_modules/url/util.js"); -exports.parse = urlParse; -exports.resolve = urlResolve; -exports.resolveObject = urlResolveObject; -exports.format = urlFormat; -exports.Url = Url; +var punycode = __webpack_require__(/*! punycode/ */ "./node_modules/url/node_modules/punycode/punycode.js"); function Url() { this.protocol = null; @@ -21956,85 +25258,102 @@ function Url() { // Reference: RFC 3986, RFC 1808, RFC 2396 -// define these here so at least they only have to be -// compiled once on the first module load. +/* + * define these here so at least they only have to be + * compiled once on the first module load. + */ var protocolPattern = /^([a-z0-9.+-]+:)/i, - portPattern = /:[0-9]*$/, - - // Special case for a simple path URL - simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, - - // RFC 2396: characters reserved for delimiting URLs. - // We actually just auto-escape these. - delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], - - // RFC 2396: characters not allowed for various reasons. - unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), - - // Allowed by RFCs, but cause of XSS attacks. Always escape these. - autoEscape = ['\''].concat(unwise), - // Characters that are never ever allowed in a hostname. - // Note that any invalid chars are also handled, but these - // are the ones that are *expected* to be seen, so we fast-path - // them. - nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), - hostEndingChars = ['/', '?', '#'], - hostnameMaxLen = 255, - hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, - hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, - // protocols that can allow "unsafe" and "unwise" chars. - unsafeProtocol = { - 'javascript': true, - 'javascript:': true - }, - // protocols that never have a hostname. - hostlessProtocol = { - 'javascript': true, - 'javascript:': true - }, - // protocols that always contain a // bit. - slashedProtocol = { - 'http': true, - 'https': true, - 'ftp': true, - 'gopher': true, - 'file': true, - 'http:': true, - 'https:': true, - 'ftp:': true, - 'gopher:': true, - 'file:': true - }, - querystring = __webpack_require__(/*! querystring */ "./node_modules/querystring/index.js"); + portPattern = /:[0-9]*$/, + + // Special case for a simple path URL + simplePathPattern = /^(\/\/?(?!\/)[^?\s]*)(\?[^\s]*)?$/, + + /* + * RFC 2396: characters reserved for delimiting URLs. + * We actually just auto-escape these. + */ + delims = [ + '<', '>', '"', '`', ' ', '\r', '\n', '\t' + ], + + // RFC 2396: characters not allowed for various reasons. + unwise = [ + '{', '}', '|', '\\', '^', '`' + ].concat(delims), + + // Allowed by RFCs, but cause of XSS attacks. Always escape these. + autoEscape = ['\''].concat(unwise), + /* + * Characters that are never ever allowed in a hostname. + * Note that any invalid chars are also handled, but these + * are the ones that are *expected* to be seen, so we fast-path + * them. + */ + nonHostChars = [ + '%', '/', '?', ';', '#' + ].concat(autoEscape), + hostEndingChars = [ + '/', '?', '#' + ], + hostnameMaxLen = 255, + hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, + hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, + // protocols that can allow "unsafe" and "unwise" chars. + unsafeProtocol = { + javascript: true, + 'javascript:': true + }, + // protocols that never have a hostname. + hostlessProtocol = { + javascript: true, + 'javascript:': true + }, + // protocols that always contain a // bit. + slashedProtocol = { + http: true, + https: true, + ftp: true, + gopher: true, + file: true, + 'http:': true, + 'https:': true, + 'ftp:': true, + 'gopher:': true, + 'file:': true + }, + querystring = __webpack_require__(/*! qs */ "./node_modules/qs/lib/index.js"); function urlParse(url, parseQueryString, slashesDenoteHost) { - if (url && util.isObject(url) && url instanceof Url) return url; + if (url && typeof url === 'object' && url instanceof Url) { return url; } - var u = new Url; + var u = new Url(); u.parse(url, parseQueryString, slashesDenoteHost); return u; } -Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { - if (!util.isString(url)) { +Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) { + if (typeof url !== 'string') { throw new TypeError("Parameter 'url' must be a string, not " + typeof url); } - // Copy chrome, IE, opera backslash-handling behavior. - // Back slashes before the query string get converted to forward slashes - // See: https://code.google.com/p/chromium/issues/detail?id=25916 + /* + * Copy chrome, IE, opera backslash-handling behavior. + * Back slashes before the query string get converted to forward slashes + * See: https://code.google.com/p/chromium/issues/detail?id=25916 + */ var queryIndex = url.indexOf('?'), - splitter = - (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', - uSplit = url.split(splitter), - slashRegex = /\\/g; + splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#', + uSplit = url.split(splitter), + slashRegex = /\\/g; uSplit[0] = uSplit[0].replace(slashRegex, '/'); url = uSplit.join(splitter); var rest = url; - // trim before proceeding. - // This is to support parse stuff like " http://foo.com \n" + /* + * trim before proceeding. + * This is to support parse stuff like " http://foo.com \n" + */ rest = rest.trim(); if (!slashesDenoteHost && url.split('#').length === 1) { @@ -22067,11 +25386,13 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { rest = rest.substr(proto.length); } - // figure out if it's got a host - // user@server is *always* interpreted as a hostname, and url - // resolution will treat //foo/bar as host=foo,path=bar because that's - // how the browser resolves relative URLs. - if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { + /* + * figure out if it's got a host + * user@server is *always* interpreted as a hostname, and url + * resolution will treat //foo/bar as host=foo,path=bar because that's + * how the browser resolves relative URLs. + */ + if (slashesDenoteHost || proto || rest.match(/^\/\/[^@/]+@[^@/]+/)) { var slashes = rest.substr(0, 2) === '//'; if (slashes && !(proto && hostlessProtocol[proto])) { rest = rest.substr(2); @@ -22079,46 +25400,54 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } } - if (!hostlessProtocol[proto] && - (slashes || (proto && !slashedProtocol[proto]))) { + if (!hostlessProtocol[proto] && (slashes || (proto && !slashedProtocol[proto]))) { - // there's a hostname. - // the first instance of /, ?, ;, or # ends the host. - // - // If there is an @ in the hostname, then non-host chars *are* allowed - // to the left of the last @ sign, unless some host-ending character - // comes *before* the @-sign. - // URLs are obnoxious. - // - // ex: - // http://a@b@c/ => user:a@b host:c - // http://a@b?@c => user:a host:c path:/?@c + /* + * there's a hostname. + * the first instance of /, ?, ;, or # ends the host. + * + * If there is an @ in the hostname, then non-host chars *are* allowed + * to the left of the last @ sign, unless some host-ending character + * comes *before* the @-sign. + * URLs are obnoxious. + * + * ex: + * http://a@b@c/ => user:a@b host:c + * http://a@b?@c => user:a host:c path:/?@c + */ - // v0.12 TODO(isaacs): This is not quite how Chrome does things. - // Review our test case against browsers more comprehensively. + /* + * v0.12 TODO(isaacs): This is not quite how Chrome does things. + * Review our test case against browsers more comprehensively. + */ // find the first instance of any hostEndingChars var hostEnd = -1; for (var i = 0; i < hostEndingChars.length; i++) { var hec = rest.indexOf(hostEndingChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) - hostEnd = hec; + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { hostEnd = hec; } } - // at this point, either we have an explicit point where the - // auth portion cannot go past, or the last @ char is the decider. + /* + * at this point, either we have an explicit point where the + * auth portion cannot go past, or the last @ char is the decider. + */ var auth, atSign; if (hostEnd === -1) { // atSign can be anywhere. atSign = rest.lastIndexOf('@'); } else { - // atSign must be in auth portion. - // http://a@b/c@d => host:b auth:a path:/c@d + /* + * atSign must be in auth portion. + * http://a@b/c@d => host:b auth:a path:/c@d + */ atSign = rest.lastIndexOf('@', hostEnd); } - // Now we have a portion which is definitely the auth. - // Pull that off. + /* + * Now we have a portion which is definitely the auth. + * Pull that off. + */ if (atSign !== -1) { auth = rest.slice(0, atSign); rest = rest.slice(atSign + 1); @@ -22129,12 +25458,10 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { hostEnd = -1; for (var i = 0; i < nonHostChars.length; i++) { var hec = rest.indexOf(nonHostChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) - hostEnd = hec; + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { hostEnd = hec; } } // if we still have not hit it, then the entire thing is a host. - if (hostEnd === -1) - hostEnd = rest.length; + if (hostEnd === -1) { hostEnd = rest.length; } this.host = rest.slice(0, hostEnd); rest = rest.slice(hostEnd); @@ -22142,28 +25469,33 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { // pull out port. this.parseHost(); - // we've indicated that there is a hostname, - // so even if it's empty, it has to be present. + /* + * we've indicated that there is a hostname, + * so even if it's empty, it has to be present. + */ this.hostname = this.hostname || ''; - // if hostname begins with [ and ends with ] - // assume that it's an IPv6 address. - var ipv6Hostname = this.hostname[0] === '[' && - this.hostname[this.hostname.length - 1] === ']'; + /* + * if hostname begins with [ and ends with ] + * assume that it's an IPv6 address. + */ + var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; // validate a little. if (!ipv6Hostname) { var hostparts = this.hostname.split(/\./); for (var i = 0, l = hostparts.length; i < l; i++) { var part = hostparts[i]; - if (!part) continue; + if (!part) { continue; } if (!part.match(hostnamePartPattern)) { var newpart = ''; for (var j = 0, k = part.length; j < k; j++) { if (part.charCodeAt(j) > 127) { - // we replace non-ASCII char with a temporary placeholder - // we need this to make sure size of hostname is not - // broken by replacing non-ASCII by nothing + /* + * we replace non-ASCII char with a temporary placeholder + * we need this to make sure size of hostname is not + * broken by replacing non-ASCII by nothing + */ newpart += 'x'; } else { newpart += part[j]; @@ -22196,10 +25528,12 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } if (!ipv6Hostname) { - // IDNA Support: Returns a punycoded representation of "domain". - // It only converts parts of the domain name that - // have non-ASCII characters, i.e. it doesn't matter if - // you call it with a domain that already is ASCII-only. + /* + * IDNA Support: Returns a punycoded representation of "domain". + * It only converts parts of the domain name that + * have non-ASCII characters, i.e. it doesn't matter if + * you call it with a domain that already is ASCII-only. + */ this.hostname = punycode.toASCII(this.hostname); } @@ -22208,8 +25542,10 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { this.host = h + p; this.href += this.host; - // strip [ and ] from the hostname - // the host field still retains them, though + /* + * strip [ and ] from the hostname + * the host field still retains them, though + */ if (ipv6Hostname) { this.hostname = this.hostname.substr(1, this.hostname.length - 2); if (rest[0] !== '/') { @@ -22218,17 +25554,20 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } } - // now rest is set to the post-host stuff. - // chop off any delim chars. + /* + * now rest is set to the post-host stuff. + * chop off any delim chars. + */ if (!unsafeProtocol[lowerProto]) { - // First, make 100% sure that any "autoEscape" chars get - // escaped, even if encodeURIComponent doesn't think they - // need to be. + /* + * First, make 100% sure that any "autoEscape" chars get + * escaped, even if encodeURIComponent doesn't think they + * need to be. + */ for (var i = 0, l = autoEscape.length; i < l; i++) { var ae = autoEscape[i]; - if (rest.indexOf(ae) === -1) - continue; + if (rest.indexOf(ae) === -1) { continue; } var esc = encodeURIComponent(ae); if (esc === ae) { esc = escape(ae); @@ -22237,7 +25576,6 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } } - // chop off from the tail first. var hash = rest.indexOf('#'); if (hash !== -1) { @@ -22258,13 +25596,12 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { this.search = ''; this.query = {}; } - if (rest) this.pathname = rest; - if (slashedProtocol[lowerProto] && - this.hostname && !this.pathname) { + if (rest) { this.pathname = rest; } + if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) { this.pathname = '/'; } - //to support http.request + // to support http.request if (this.pathname || this.search) { var p = this.pathname || ''; var s = this.search || ''; @@ -22278,16 +25615,18 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { // format a parsed object into a url string function urlFormat(obj) { - // ensure it's an object, and not a string url. - // If it's an obj, this is a no-op. - // this way, you can call url_format() on strings - // to clean up potentially wonky urls. - if (util.isString(obj)) obj = urlParse(obj); - if (!(obj instanceof Url)) return Url.prototype.format.call(obj); + /* + * ensure it's an object, and not a string url. + * If it's an obj, this is a no-op. + * this way, you can call url_format() on strings + * to clean up potentially wonky urls. + */ + if (typeof obj === 'string') { obj = urlParse(obj); } + if (!(obj instanceof Url)) { return Url.prototype.format.call(obj); } return obj.format(); } -Url.prototype.format = function() { +Url.prototype.format = function () { var auth = this.auth || ''; if (auth) { auth = encodeURIComponent(auth); @@ -22296,46 +25635,46 @@ Url.prototype.format = function() { } var protocol = this.protocol || '', - pathname = this.pathname || '', - hash = this.hash || '', - host = false, - query = ''; + pathname = this.pathname || '', + hash = this.hash || '', + host = false, + query = ''; if (this.host) { host = auth + this.host; } else if (this.hostname) { - host = auth + (this.hostname.indexOf(':') === -1 ? - this.hostname : - '[' + this.hostname + ']'); + host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']'); if (this.port) { host += ':' + this.port; } } - if (this.query && - util.isObject(this.query) && - Object.keys(this.query).length) { - query = querystring.stringify(this.query); + if (this.query && typeof this.query === 'object' && Object.keys(this.query).length) { + query = querystring.stringify(this.query, { + arrayFormat: 'repeat', + addQueryPrefix: false + }); } var search = this.search || (query && ('?' + query)) || ''; - if (protocol && protocol.substr(-1) !== ':') protocol += ':'; + if (protocol && protocol.substr(-1) !== ':') { protocol += ':'; } - // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. - // unless they had them to begin with. - if (this.slashes || - (!protocol || slashedProtocol[protocol]) && host !== false) { + /* + * only the slashedProtocols get the //. Not mailto:, xmpp:, etc. + * unless they had them to begin with. + */ + if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) { host = '//' + (host || ''); - if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; + if (pathname && pathname.charAt(0) !== '/') { pathname = '/' + pathname; } } else if (!host) { host = ''; } - if (hash && hash.charAt(0) !== '#') hash = '#' + hash; - if (search && search.charAt(0) !== '?') search = '?' + search; + if (hash && hash.charAt(0) !== '#') { hash = '#' + hash; } + if (search && search.charAt(0) !== '?') { search = '?' + search; } - pathname = pathname.replace(/[?#]/g, function(match) { + pathname = pathname.replace(/[?#]/g, function (match) { return encodeURIComponent(match); }); search = search.replace('#', '%23'); @@ -22347,17 +25686,17 @@ function urlResolve(source, relative) { return urlParse(source, false, true).resolve(relative); } -Url.prototype.resolve = function(relative) { +Url.prototype.resolve = function (relative) { return this.resolveObject(urlParse(relative, false, true)).format(); }; function urlResolveObject(source, relative) { - if (!source) return relative; + if (!source) { return relative; } return urlParse(source, false, true).resolveObject(relative); } -Url.prototype.resolveObject = function(relative) { - if (util.isString(relative)) { +Url.prototype.resolveObject = function (relative) { + if (typeof relative === 'string') { var rel = new Url(); rel.parse(relative, false, true); relative = rel; @@ -22370,8 +25709,10 @@ Url.prototype.resolveObject = function(relative) { result[tkey] = this[tkey]; } - // hash is always overridden, no matter what. - // even href="" will remove it. + /* + * hash is always overridden, no matter what. + * even href="" will remove it. + */ result.hash = relative.hash; // if the relative url is empty, then there's nothing left to do here. @@ -22386,14 +25727,13 @@ Url.prototype.resolveObject = function(relative) { var rkeys = Object.keys(relative); for (var rk = 0; rk < rkeys.length; rk++) { var rkey = rkeys[rk]; - if (rkey !== 'protocol') - result[rkey] = relative[rkey]; + if (rkey !== 'protocol') { result[rkey] = relative[rkey]; } } - //urlParse appends trailing / to urls like http://www.example.com - if (slashedProtocol[result.protocol] && - result.hostname && !result.pathname) { - result.path = result.pathname = '/'; + // urlParse appends trailing / to urls like http://www.example.com + if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) { + result.pathname = '/'; + result.path = result.pathname; } result.href = result.format(); @@ -22401,14 +25741,16 @@ Url.prototype.resolveObject = function(relative) { } if (relative.protocol && relative.protocol !== result.protocol) { - // if it's a known url protocol, then changing - // the protocol does weird things - // first, if it's not file:, then we MUST have a host, - // and if there was a path - // to begin with, then we MUST have a path. - // if it is file:, then the host is dropped, - // because that's known to be hostless. - // anything else is assumed to be absolute. + /* + * if it's a known url protocol, then changing + * the protocol does weird things + * first, if it's not file:, then we MUST have a host, + * and if there was a path + * to begin with, then we MUST have a path. + * if it is file:, then the host is dropped, + * because that's known to be hostless. + * anything else is assumed to be absolute. + */ if (!slashedProtocol[relative.protocol]) { var keys = Object.keys(relative); for (var v = 0; v < keys.length; v++) { @@ -22422,11 +25764,11 @@ Url.prototype.resolveObject = function(relative) { result.protocol = relative.protocol; if (!relative.host && !hostlessProtocol[relative.protocol]) { var relPath = (relative.pathname || '').split('/'); - while (relPath.length && !(relative.host = relPath.shift())); - if (!relative.host) relative.host = ''; - if (!relative.hostname) relative.hostname = ''; - if (relPath[0] !== '') relPath.unshift(''); - if (relPath.length < 2) relPath.unshift(''); + while (relPath.length && !(relative.host = relPath.shift())) { } + if (!relative.host) { relative.host = ''; } + if (!relative.hostname) { relative.hostname = ''; } + if (relPath[0] !== '') { relPath.unshift(''); } + if (relPath.length < 2) { relPath.unshift(''); } result.pathname = relPath.join('/'); } else { result.pathname = relative.pathname; @@ -22448,37 +25790,33 @@ Url.prototype.resolveObject = function(relative) { return result; } - var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), - isRelAbs = ( - relative.host || - relative.pathname && relative.pathname.charAt(0) === '/' - ), - mustEndAbs = (isRelAbs || isSourceAbs || - (result.host && relative.pathname)), - removeAllDots = mustEndAbs, - srcPath = result.pathname && result.pathname.split('/') || [], - relPath = relative.pathname && relative.pathname.split('/') || [], - psychotic = result.protocol && !slashedProtocol[result.protocol]; - - // if the url is a non-slashed url, then relative - // links like ../.. should be able - // to crawl up to the hostname, as well. This is strange. - // result.protocol has already been set by now. - // Later on, put the first path part into the host field. + var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/', + isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/', + mustEndAbs = isRelAbs || isSourceAbs || (result.host && relative.pathname), + removeAllDots = mustEndAbs, + srcPath = result.pathname && result.pathname.split('/') || [], + relPath = relative.pathname && relative.pathname.split('/') || [], + psychotic = result.protocol && !slashedProtocol[result.protocol]; + + /* + * if the url is a non-slashed url, then relative + * links like ../.. should be able + * to crawl up to the hostname, as well. This is strange. + * result.protocol has already been set by now. + * Later on, put the first path part into the host field. + */ if (psychotic) { result.hostname = ''; result.port = null; if (result.host) { - if (srcPath[0] === '') srcPath[0] = result.host; - else srcPath.unshift(result.host); + if (srcPath[0] === '') { srcPath[0] = result.host; } else { srcPath.unshift(result.host); } } result.host = ''; if (relative.protocol) { relative.hostname = null; relative.port = null; if (relative.host) { - if (relPath[0] === '') relPath[0] = relative.host; - else relPath.unshift(relative.host); + if (relPath[0] === '') { relPath[0] = relative.host; } else { relPath.unshift(relative.host); } } relative.host = null; } @@ -22487,54 +25825,60 @@ Url.prototype.resolveObject = function(relative) { if (isRelAbs) { // it's absolute. - result.host = (relative.host || relative.host === '') ? - relative.host : result.host; - result.hostname = (relative.hostname || relative.hostname === '') ? - relative.hostname : result.hostname; + result.host = relative.host || relative.host === '' ? relative.host : result.host; + result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname; result.search = relative.search; result.query = relative.query; srcPath = relPath; // fall through to the dot-handling below. } else if (relPath.length) { - // it's relative - // throw away the existing file, and take the new path instead. - if (!srcPath) srcPath = []; + /* + * it's relative + * throw away the existing file, and take the new path instead. + */ + if (!srcPath) { srcPath = []; } srcPath.pop(); srcPath = srcPath.concat(relPath); result.search = relative.search; result.query = relative.query; - } else if (!util.isNullOrUndefined(relative.search)) { - // just pull out the search. - // like href='?foo'. - // Put this after the other two cases because it simplifies the booleans + } else if (relative.search != null) { + /* + * just pull out the search. + * like href='?foo'. + * Put this after the other two cases because it simplifies the booleans + */ if (psychotic) { - result.hostname = result.host = srcPath.shift(); - //occationaly the auth can get stuck only in host - //this especially happens in cases like - //url.resolveObject('mailto:local1@domain1', 'local2@domain2') - var authInHost = result.host && result.host.indexOf('@') > 0 ? - result.host.split('@') : false; + result.host = srcPath.shift(); + result.hostname = result.host; + /* + * occationaly the auth can get stuck only in host + * this especially happens in cases like + * url.resolveObject('mailto:local1@domain1', 'local2@domain2') + */ + var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; if (authInHost) { result.auth = authInHost.shift(); - result.host = result.hostname = authInHost.shift(); + result.hostname = authInHost.shift(); + result.host = result.hostname; } } result.search = relative.search; result.query = relative.query; - //to support http.request - if (!util.isNull(result.pathname) || !util.isNull(result.search)) { - result.path = (result.pathname ? result.pathname : '') + - (result.search ? result.search : ''); + // to support http.request + if (result.pathname !== null || result.search !== null) { + result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); } result.href = result.format(); return result; } if (!srcPath.length) { - // no path at all. easy. - // we've already handled the other stuff above. + /* + * no path at all. easy. + * we've already handled the other stuff above. + */ result.pathname = null; - //to support http.request + // to support http.request if (result.search) { result.path = '/' + result.search; } else { @@ -22544,16 +25888,18 @@ Url.prototype.resolveObject = function(relative) { return result; } - // if a url ENDs in . or .., then it must get a trailing slash. - // however, if it ends in anything else non-slashy, - // then it must NOT get a trailing slash. + /* + * if a url ENDs in . or .., then it must get a trailing slash. + * however, if it ends in anything else non-slashy, + * then it must NOT get a trailing slash. + */ var last = srcPath.slice(-1)[0]; - var hasTrailingSlash = ( - (result.host || relative.host || srcPath.length > 1) && - (last === '.' || last === '..') || last === ''); + var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === ''; - // strip single dots, resolve double dots to parent dir - // if the path tries to go above the root, `up` ends up > 0 + /* + * strip single dots, resolve double dots to parent dir + * if the path tries to go above the root, `up` ends up > 0 + */ var up = 0; for (var i = srcPath.length; i >= 0; i--) { last = srcPath[i]; @@ -22575,8 +25921,7 @@ Url.prototype.resolveObject = function(relative) { } } - if (mustEndAbs && srcPath[0] !== '' && - (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { + if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { srcPath.unshift(''); } @@ -22584,21 +25929,22 @@ Url.prototype.resolveObject = function(relative) { srcPath.push(''); } - var isAbsolute = srcPath[0] === '' || - (srcPath[0] && srcPath[0].charAt(0) === '/'); + var isAbsolute = srcPath[0] === '' || (srcPath[0] && srcPath[0].charAt(0) === '/'); // put the host back if (psychotic) { - result.hostname = result.host = isAbsolute ? '' : - srcPath.length ? srcPath.shift() : ''; - //occationaly the auth can get stuck only in host - //this especially happens in cases like - //url.resolveObject('mailto:local1@domain1', 'local2@domain2') - var authInHost = result.host && result.host.indexOf('@') > 0 ? - result.host.split('@') : false; + result.hostname = isAbsolute ? '' : srcPath.length ? srcPath.shift() : ''; + result.host = result.hostname; + /* + * occationaly the auth can get stuck only in host + * this especially happens in cases like + * url.resolveObject('mailto:local1@domain1', 'local2@domain2') + */ + var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; if (authInHost) { result.auth = authInHost.shift(); - result.host = result.hostname = authInHost.shift(); + result.hostname = authInHost.shift(); + result.host = result.hostname; } } @@ -22608,17 +25954,16 @@ Url.prototype.resolveObject = function(relative) { srcPath.unshift(''); } - if (!srcPath.length) { + if (srcPath.length > 0) { + result.pathname = srcPath.join('/'); + } else { result.pathname = null; result.path = null; - } else { - result.pathname = srcPath.join('/'); } - //to support request.http - if (!util.isNull(result.pathname) || !util.isNull(result.search)) { - result.path = (result.pathname ? result.pathname : '') + - (result.search ? result.search : ''); + // to support request.http + if (result.pathname !== null || result.search !== null) { + result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); } result.auth = relative.auth || result.auth; result.slashes = result.slashes || relative.slashes; @@ -22626,7 +25971,7 @@ Url.prototype.resolveObject = function(relative) { return result; }; -Url.prototype.parseHost = function() { +Url.prototype.parseHost = function () { var host = this.host; var port = portPattern.exec(host); if (port) { @@ -22636,35 +25981,15 @@ Url.prototype.parseHost = function() { } host = host.substr(0, host.length - port.length); } - if (host) this.hostname = host; + if (host) { this.hostname = host; } }; +exports.parse = urlParse; +exports.resolve = urlResolve; +exports.resolveObject = urlResolveObject; +exports.format = urlFormat; -/***/ }), - -/***/ "./node_modules/url/util.js": -/*!**********************************!*\ - !*** ./node_modules/url/util.js ***! - \**********************************/ -/***/ ((module) => { - -"use strict"; - - -module.exports = { - isString: function(arg) { - return typeof(arg) === 'string'; - }, - isObject: function(arg) { - return typeof(arg) === 'object' && arg !== null; - }, - isNull: function(arg) { - return arg === null; - }, - isNullOrUndefined: function(arg) { - return arg == null; - } -}; +exports.Url = Url; /***/ }), @@ -22744,6 +26069,16 @@ function config (name) { } +/***/ }), + +/***/ "?4f7e": +/*!********************************!*\ + !*** ./util.inspect (ignored) ***! + \********************************/ +/***/ (() => { + +/* (ignored) */ + /***/ }), /***/ "?ed1b": @@ -22773,7 +26108,7 @@ function config (name) { /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#","description":"Meta-schema for $data reference (JSON Schema extension proposal)","type":"object","required":["$data"],"properties":{"$data":{"type":"string","anyOf":[{"format":"relative-json-pointer"},{"format":"json-pointer"}]}},"additionalProperties":false}'); +module.exports = /*#__PURE__*/JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#","description":"Meta-schema for $data reference (JSON Schema extension proposal)","type":"object","required":["$data"],"properties":{"$data":{"type":"string","anyOf":[{"format":"relative-json-pointer"},{"format":"json-pointer"}]}},"additionalProperties":false}'); /***/ }), @@ -22784,7 +26119,7 @@ module.exports = JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema# /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}'); +module.exports = /*#__PURE__*/JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}'); /***/ }), @@ -22795,7 +26130,7 @@ module.exports = JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema# /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"afterRequest.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["lastAccess","eTag","hitCount"],"properties":{"expires":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"lastAccess":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"eTag":{"type":"string"},"hitCount":{"type":"integer"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"afterRequest.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["lastAccess","eTag","hitCount"],"properties":{"expires":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"lastAccess":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"eTag":{"type":"string"},"hitCount":{"type":"integer"},"comment":{"type":"string"}}}'); /***/ }), @@ -22806,7 +26141,7 @@ module.exports = JSON.parse('{"$id":"afterRequest.json#","$schema":"http://json- /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"beforeRequest.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["lastAccess","eTag","hitCount"],"properties":{"expires":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"lastAccess":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"eTag":{"type":"string"},"hitCount":{"type":"integer"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"beforeRequest.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["lastAccess","eTag","hitCount"],"properties":{"expires":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"lastAccess":{"type":"string","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?"},"eTag":{"type":"string"},"hitCount":{"type":"integer"},"comment":{"type":"string"}}}'); /***/ }), @@ -22817,7 +26152,7 @@ module.exports = JSON.parse('{"$id":"beforeRequest.json#","$schema":"http://json /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"browser.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","version"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"browser.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","version"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"comment":{"type":"string"}}}'); /***/ }), @@ -22828,7 +26163,7 @@ module.exports = JSON.parse('{"$id":"browser.json#","$schema":"http://json-schem /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"cache.json#","$schema":"http://json-schema.org/draft-06/schema#","properties":{"beforeRequest":{"oneOf":[{"type":"null"},{"$ref":"beforeRequest.json#"}]},"afterRequest":{"oneOf":[{"type":"null"},{"$ref":"afterRequest.json#"}]},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"cache.json#","$schema":"http://json-schema.org/draft-06/schema#","properties":{"beforeRequest":{"oneOf":[{"type":"null"},{"$ref":"beforeRequest.json#"}]},"afterRequest":{"oneOf":[{"type":"null"},{"$ref":"afterRequest.json#"}]},"comment":{"type":"string"}}}'); /***/ }), @@ -22839,7 +26174,7 @@ module.exports = JSON.parse('{"$id":"cache.json#","$schema":"http://json-schema. /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"content.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["size","mimeType"],"properties":{"size":{"type":"integer"},"compression":{"type":"integer"},"mimeType":{"type":"string"},"text":{"type":"string"},"encoding":{"type":"string"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"content.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["size","mimeType"],"properties":{"size":{"type":"integer"},"compression":{"type":"integer"},"mimeType":{"type":"string"},"text":{"type":"string"},"encoding":{"type":"string"},"comment":{"type":"string"}}}'); /***/ }), @@ -22850,7 +26185,7 @@ module.exports = JSON.parse('{"$id":"content.json#","$schema":"http://json-schem /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"cookie.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"path":{"type":"string"},"domain":{"type":"string"},"expires":{"type":["string","null"],"format":"date-time"},"httpOnly":{"type":"boolean"},"secure":{"type":"boolean"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"cookie.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"path":{"type":"string"},"domain":{"type":"string"},"expires":{"type":["string","null"],"format":"date-time"},"httpOnly":{"type":"boolean"},"secure":{"type":"boolean"},"comment":{"type":"string"}}}'); /***/ }), @@ -22861,7 +26196,7 @@ module.exports = JSON.parse('{"$id":"cookie.json#","$schema":"http://json-schema /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"creator.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","version"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"creator.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","version"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"comment":{"type":"string"}}}'); /***/ }), @@ -22872,7 +26207,7 @@ module.exports = JSON.parse('{"$id":"creator.json#","$schema":"http://json-schem /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"entry.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["startedDateTime","time","request","response","cache","timings"],"properties":{"pageref":{"type":"string"},"startedDateTime":{"type":"string","format":"date-time","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))"},"time":{"type":"number","min":0},"request":{"$ref":"request.json#"},"response":{"$ref":"response.json#"},"cache":{"$ref":"cache.json#"},"timings":{"$ref":"timings.json#"},"serverIPAddress":{"type":"string","oneOf":[{"format":"ipv4"},{"format":"ipv6"}]},"connection":{"type":"string"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"entry.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["startedDateTime","time","request","response","cache","timings"],"properties":{"pageref":{"type":"string"},"startedDateTime":{"type":"string","format":"date-time","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))"},"time":{"type":"number","min":0},"request":{"$ref":"request.json#"},"response":{"$ref":"response.json#"},"cache":{"$ref":"cache.json#"},"timings":{"$ref":"timings.json#"},"serverIPAddress":{"type":"string","oneOf":[{"format":"ipv4"},{"format":"ipv6"}]},"connection":{"type":"string"},"comment":{"type":"string"}}}'); /***/ }), @@ -22883,7 +26218,7 @@ module.exports = JSON.parse('{"$id":"entry.json#","$schema":"http://json-schema. /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"har.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["log"],"properties":{"log":{"$ref":"log.json#"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"har.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["log"],"properties":{"log":{"$ref":"log.json#"}}}'); /***/ }), @@ -22894,7 +26229,7 @@ module.exports = JSON.parse('{"$id":"har.json#","$schema":"http://json-schema.or /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"header.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"header.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"comment":{"type":"string"}}}'); /***/ }), @@ -22905,7 +26240,7 @@ module.exports = JSON.parse('{"$id":"header.json#","$schema":"http://json-schema /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"log.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["version","creator","entries"],"properties":{"version":{"type":"string"},"creator":{"$ref":"creator.json#"},"browser":{"$ref":"browser.json#"},"pages":{"type":"array","items":{"$ref":"page.json#"}},"entries":{"type":"array","items":{"$ref":"entry.json#"}},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"log.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["version","creator","entries"],"properties":{"version":{"type":"string"},"creator":{"$ref":"creator.json#"},"browser":{"$ref":"browser.json#"},"pages":{"type":"array","items":{"$ref":"page.json#"}},"entries":{"type":"array","items":{"$ref":"entry.json#"}},"comment":{"type":"string"}}}'); /***/ }), @@ -22916,7 +26251,7 @@ module.exports = JSON.parse('{"$id":"log.json#","$schema":"http://json-schema.or /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"page.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["startedDateTime","id","title","pageTimings"],"properties":{"startedDateTime":{"type":"string","format":"date-time","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))"},"id":{"type":"string","unique":true},"title":{"type":"string"},"pageTimings":{"$ref":"pageTimings.json#"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"page.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["startedDateTime","id","title","pageTimings"],"properties":{"startedDateTime":{"type":"string","format":"date-time","pattern":"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))"},"id":{"type":"string","unique":true},"title":{"type":"string"},"pageTimings":{"$ref":"pageTimings.json#"},"comment":{"type":"string"}}}'); /***/ }), @@ -22927,7 +26262,7 @@ module.exports = JSON.parse('{"$id":"page.json#","$schema":"http://json-schema.o /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"pageTimings.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","properties":{"onContentLoad":{"type":"number","min":-1},"onLoad":{"type":"number","min":-1},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"pageTimings.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","properties":{"onContentLoad":{"type":"number","min":-1},"onLoad":{"type":"number","min":-1},"comment":{"type":"string"}}}'); /***/ }), @@ -22938,7 +26273,7 @@ module.exports = JSON.parse('{"$id":"pageTimings.json#","$schema":"http://json-s /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"postData.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["mimeType"],"properties":{"mimeType":{"type":"string"},"text":{"type":"string"},"params":{"type":"array","required":["name"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"fileName":{"type":"string"},"contentType":{"type":"string"},"comment":{"type":"string"}}},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"postData.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","optional":true,"required":["mimeType"],"properties":{"mimeType":{"type":"string"},"text":{"type":"string"},"params":{"type":"array","required":["name"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"fileName":{"type":"string"},"contentType":{"type":"string"},"comment":{"type":"string"}}},"comment":{"type":"string"}}}'); /***/ }), @@ -22949,7 +26284,7 @@ module.exports = JSON.parse('{"$id":"postData.json#","$schema":"http://json-sche /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"query.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"query.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"},"comment":{"type":"string"}}}'); /***/ }), @@ -22960,7 +26295,7 @@ module.exports = JSON.parse('{"$id":"query.json#","$schema":"http://json-schema. /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"request.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["method","url","httpVersion","cookies","headers","queryString","headersSize","bodySize"],"properties":{"method":{"type":"string"},"url":{"type":"string","format":"uri"},"httpVersion":{"type":"string"},"cookies":{"type":"array","items":{"$ref":"cookie.json#"}},"headers":{"type":"array","items":{"$ref":"header.json#"}},"queryString":{"type":"array","items":{"$ref":"query.json#"}},"postData":{"$ref":"postData.json#"},"headersSize":{"type":"integer"},"bodySize":{"type":"integer"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"request.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["method","url","httpVersion","cookies","headers","queryString","headersSize","bodySize"],"properties":{"method":{"type":"string"},"url":{"type":"string","format":"uri"},"httpVersion":{"type":"string"},"cookies":{"type":"array","items":{"$ref":"cookie.json#"}},"headers":{"type":"array","items":{"$ref":"header.json#"}},"queryString":{"type":"array","items":{"$ref":"query.json#"}},"postData":{"$ref":"postData.json#"},"headersSize":{"type":"integer"},"bodySize":{"type":"integer"},"comment":{"type":"string"}}}'); /***/ }), @@ -22971,7 +26306,7 @@ module.exports = JSON.parse('{"$id":"request.json#","$schema":"http://json-schem /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"response.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["status","statusText","httpVersion","cookies","headers","content","redirectURL","headersSize","bodySize"],"properties":{"status":{"type":"integer"},"statusText":{"type":"string"},"httpVersion":{"type":"string"},"cookies":{"type":"array","items":{"$ref":"cookie.json#"}},"headers":{"type":"array","items":{"$ref":"header.json#"}},"content":{"$ref":"content.json#"},"redirectURL":{"type":"string"},"headersSize":{"type":"integer"},"bodySize":{"type":"integer"},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"response.json#","$schema":"http://json-schema.org/draft-06/schema#","type":"object","required":["status","statusText","httpVersion","cookies","headers","content","redirectURL","headersSize","bodySize"],"properties":{"status":{"type":"integer"},"statusText":{"type":"string"},"httpVersion":{"type":"string"},"cookies":{"type":"array","items":{"$ref":"cookie.json#"}},"headers":{"type":"array","items":{"$ref":"header.json#"}},"content":{"$ref":"content.json#"},"redirectURL":{"type":"string"},"headersSize":{"type":"integer"},"bodySize":{"type":"integer"},"comment":{"type":"string"}}}'); /***/ }), @@ -22982,7 +26317,7 @@ module.exports = JSON.parse('{"$id":"response.json#","$schema":"http://json-sche /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$id":"timings.json#","$schema":"http://json-schema.org/draft-06/schema#","required":["send","wait","receive"],"properties":{"dns":{"type":"number","min":-1},"connect":{"type":"number","min":-1},"blocked":{"type":"number","min":-1},"send":{"type":"number","min":-1},"wait":{"type":"number","min":-1},"receive":{"type":"number","min":-1},"ssl":{"type":"number","min":-1},"comment":{"type":"string"}}}'); +module.exports = /*#__PURE__*/JSON.parse('{"$id":"timings.json#","$schema":"http://json-schema.org/draft-06/schema#","required":["send","wait","receive"],"properties":{"dns":{"type":"number","min":-1},"connect":{"type":"number","min":-1},"blocked":{"type":"number","min":-1},"send":{"type":"number","min":-1},"wait":{"type":"number","min":-1},"receive":{"type":"number","min":-1},"ssl":{"type":"number","min":-1},"comment":{"type":"string"}}}'); /***/ }) @@ -23087,17 +26422,18 @@ var __webpack_exports__ = {}; \****************************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "HTTPSnippet": () => (/* binding */ HTTPSnippet), -/* harmony export */ "addTarget": () => (/* reexport safe */ _targets_targets__WEBPACK_IMPORTED_MODULE_8__.addTarget), -/* harmony export */ "addTargetClient": () => (/* reexport safe */ _targets_targets__WEBPACK_IMPORTED_MODULE_8__.addTargetClient), -/* harmony export */ "availableTargets": () => (/* reexport safe */ _helpers_utils__WEBPACK_IMPORTED_MODULE_9__.availableTargets), -/* harmony export */ "extname": () => (/* reexport safe */ _helpers_utils__WEBPACK_IMPORTED_MODULE_9__.extname) +/* harmony export */ HTTPSnippet: () => (/* binding */ HTTPSnippet), +/* harmony export */ addTarget: () => (/* reexport safe */ _targets_targets__WEBPACK_IMPORTED_MODULE_8__.addTarget), +/* harmony export */ addTargetClient: () => (/* reexport safe */ _targets_targets__WEBPACK_IMPORTED_MODULE_8__.addTargetClient), +/* harmony export */ availableTargets: () => (/* reexport safe */ _helpers_utils__WEBPACK_IMPORTED_MODULE_9__.availableTargets), +/* harmony export */ extname: () => (/* reexport safe */ _helpers_utils__WEBPACK_IMPORTED_MODULE_9__.extname), +/* harmony export */ isHarEntry: () => (/* binding */ isHarEntry) /* harmony export */ }); /* harmony import */ var event_stream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! event-stream */ "./node_modules/event-stream/index.js"); /* harmony import */ var event_stream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(event_stream__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var form_data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! form-data */ "./node_modules/form-data/lib/browser.js"); /* harmony import */ var form_data__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(form_data__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var querystring__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! querystring */ "./node_modules/querystring/index.js"); +/* harmony import */ var querystring__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! querystring */ "./node_modules/querystring-es3/index.js"); /* harmony import */ var url__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! url */ "./node_modules/url/url.js"); /* harmony import */ var _helpers_form_data__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers/form-data */ "./src/helpers/form-data.ts"); /* harmony import */ var _helpers_har_validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers/har-validator */ "./src/helpers/har-validator.ts"); @@ -23194,7 +26530,7 @@ var HTTPSnippet = /*#__PURE__*/_createClass(function HTTPSnippet(input) { if (cookies !== null && cookies !== void 0 && cookies.length) { request.allHeaders.cookie = cookies.join('; '); } - switch (request.postData.mimeType) { + switch (request === null || request === void 0 ? void 0 : request.postData.mimeType) { case 'multipart/mixed': case 'multipart/related': case 'multipart/form-data': @@ -23227,7 +26563,7 @@ var HTTPSnippet = /*#__PURE__*/_createClass(function HTTPSnippet(input) { // @ts-expect-error THIS IS WRONG. VERY WRONG. form._boundary = boundary; } - (_request$postData2 = request.postData) === null || _request$postData2 === void 0 ? void 0 : _request$postData2.params.forEach(function (param) { + (_request$postData2 = request.postData) === null || _request$postData2 === void 0 || _request$postData2.params.forEach(function (param) { var name = param.name; var value = param.value || ''; var filename = param.fileName || null; @@ -23364,17 +26700,18 @@ var HTTPSnippet = /*#__PURE__*/_createClass(function HTTPSnippet(input) { var _request$postData3; var request = _ref4.request; // add optional properties to make validation successful - var req = _objectSpread({ + var req = _objectSpread(_objectSpread({ bodySize: 0, headersSize: 0, headers: [], cookies: [], httpVersion: 'HTTP/1.1', - queryString: [], - postData: { + queryString: [] + }, request), {}, { + postData: (request === null || request === void 0 ? void 0 : request.postData) || { mimeType: ((_request$postData3 = request.postData) === null || _request$postData3 === void 0 ? void 0 : _request$postData3.mimeType) || 'application/octet-stream' } - }, request); + }); if ((0,_helpers_har_validator__WEBPACK_IMPORTED_MODULE_5__.validateHarRequest)(req)) { _this.requests.push(_this.prepare(req)); } @@ -23385,4 +26722,4 @@ window.HTTPSnippet = HTTPSnippet /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsd0NBQXdDLFNBQVM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsaUJBQWlCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaURBQWlELEVBQUU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsZUFBZTtBQUN4QztBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSx5QkFBeUIsUUFBUTtBQUNqQztBQUNBLHNCQUFzQixlQUFlO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFlBQVk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsU0FBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0IsU0FBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU87QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLDRFQUF3QjtBQUN2QztBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0MsZ0JBQWdCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUEsa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSx1Q0FBdUMsUUFBUTtBQUMvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDhCQUE4QjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPO0FBQ1g7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQzNJQTtBQUNBLHNGQUFtQzs7Ozs7Ozs7Ozs7O0FDRG5DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOzs7Ozs7Ozs7Ozs7QUN2TDdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7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O0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDLGlIQUF3QztBQUM5RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU87QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLE9BQU8sb0JBQW9CLE9BQU87QUFDbEc7QUFDQSx3QkFBd0IsT0FBTyxpQkFBaUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU87QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9B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QUFPO0FBQ1g7QUFDQTtBQUNBLElBQUksT0FBTztBQUNYO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxPQUFPO0FBQ2IsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLE9BQU87QUFDYixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTyxjQUFjO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMvbkJhOztBQUViLGlCQUFpQixtQkFBTyxDQUFDLDZGQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsT0FBTztBQUNmO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN4TGE7O0FBRWIsMkNBQTJDLGdDQUFnQyxvQ0FBb0Msb0RBQW9ELDZEQUE2RCxpRUFBaUUsc0NBQXNDO0FBQ3ZVLGlDQUFpQyxnQkFBZ0Isc0JBQXNCLE9BQU8sdURBQXVELDZEQUE2RCw0Q0FBNEMsb0tBQW9LLG1GQUFtRixLQUFLO0FBQzFlLDRDQUE0QywyQkFBMkIsa0JBQWtCLGtDQUFrQyxvRUFBb0UsS0FBSyxPQUFPLG9CQUFvQjtBQUMvTiwrQkFBK0IsdUNBQXVDO0FBQ3RFLHFDQUFxQywrREFBK0Qsc0NBQXNDLDBCQUEwQiwrQ0FBK0MseUNBQXlDLHVFQUF1RTtBQUNuVSxpQkFBaUIsbUJBQU8sQ0FBQyw4Q0FBUTtBQUNqQztBQUNBLGtCQUFrQixtQkFBTyxDQUFDLG1CQUFNO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QyxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxjQUFjO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFKYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLFFBQVEsT0FBTztBQUNmLFFBQVE7QUFDUjtBQUNBLFFBQVEsT0FBTztBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2YsUUFBUTtBQUNSO0FBQ0EsUUFBUSxPQUFPO0FBQ2YsUUFBUTtBQUNSLFFBQVEsT0FBTztBQUNmO0FBQ0EsTUFBTTtBQUNOLE1BQU0sT0FBTztBQUNiO0FBQ0EsTUFBTTtBQUNOLE1BQU0sT0FBTztBQUNiO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3RkFBd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzlGQTtBQUNBOztBQUVhOztBQUViLG1DQUFtQyxpSUFBMkQ7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxhQUFhO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDckZBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDRkE7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0dBQWdDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsK0JBQStCLG1CQUFPLENBQUMsNkZBQWlCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsYUFBYTtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDckZhOztBQUViLDhCQUE4Qiw0SEFBc0Q7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ3JCQSxrR0FBK0M7Ozs7Ozs7Ozs7O0FDQS9DO0FBQ0E7QUFDQSxhQUFhLG1CQUFPLENBQUMsOENBQVE7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRSxjQUFjO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNoRUE7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxjQUFjLG1CQUFPLENBQUMsZ0RBQVM7QUFDL0IsY0FBYyxnSEFBdUM7O0FBRXJEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUyxtRkFBOEI7QUFDdkMsZUFBZSxtQkFBTyxDQUFDLDZEQUFVOztBQUVqQztBQUNBLGtCQUFrQixtQkFBTyxDQUFDLHVHQUF5QztBQUNuRSxrQkFBa0IsbUJBQU8sQ0FBQyx1R0FBeUM7QUFDbkUsZ0JBQWdCLG1CQUFPLENBQUMsbUdBQXVDO0FBQy9ELG1CQUFtQixtQkFBTyxDQUFDLHlHQUEwQztBQUNyRSxxQkFBcUIsbUJBQU8sQ0FBQyw2R0FBNEM7QUFDekUsa0JBQWtCLG1CQUFPLENBQUMsbUlBQXVEO0FBQ2pGLGtCQUFrQixtQkFBTyxDQUFDLHlIQUFrRDs7QUFFNUU7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaElBLGVBQWUsbUJBQU8sQ0FBQyxrREFBVTtBQUNqQyxjQUFjLG1CQUFPLENBQUMsZ0RBQVM7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLHdCQUF3QjtBQUN6Qzs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjs7QUFFQSxhQUFhLHNGQUE2QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsc0NBQXNDLHNDQUFzQztBQUN6RztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsK0JBQStCLHlCQUF5QjtBQUN4RDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxFQUFFO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQjtBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFFBQVE7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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ZXMvYWp2L2xpYi9hanYuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9jYWNoZS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvYXN5bmMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL2Vycm9yX2NsYXNzZXMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL2Zvcm1hdHMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9yZXNvbHZlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9ydWxlcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvc2NoZW1hX29iai5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvdWNzMmxlbmd0aC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvdXRpbC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RhdGEuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kZWZpbml0aW9uX3NjaGVtYS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL19saW1pdC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL19saW1pdEl0ZW1zLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvX2xpbWl0TGVuZ3RoLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvX2xpbWl0UHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2FsbE9mLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvYW55T2YuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9jb21tZW50LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvY29uc3QuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9jb250YWlucy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2N1c3RvbS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2RlcGVuZGVuY2llcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2VudW0uanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9mb3JtYXQuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9pZi5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvaXRlbXMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9tdWx0aXBsZU9mLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvbm90LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvb25lT2YuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9wYXR0ZXJuLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL3Byb3BlcnR5TmFtZXMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9yZWYuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL3VuaXF1ZUl0ZW1zLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9rZXl3b3JkLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL2hlbHBlcnMvY29kZS1idWlsZGVyLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL2hlbHBlcnMvZXNjYXBlLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL2hlbHBlcnMvZm9ybS1kYXRhLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL2hlbHBlcnMvaGFyLXZhbGlkYXRvci50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy9oZWxwZXJzL2hlYWRlcnMudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaGVscGVycy9yZWR1Y2VyLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL2hlbHBlcnMvc2hlbGwudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaGVscGVycy91dGlscy50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2MvbGliY3VybC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9jL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2Nsb2p1cmUvY2xqX2h0dHAvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvY2xvanVyZS90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9jc2hhcnAvaHR0cGNsaWVudC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9jc2hhcnAvcmVzdHNoYXJwL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2NzaGFycC90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9nby9uYXRpdmUvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvZ28vdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvaHR0cC9odHRwMS4xL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2h0dHAvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvamF2YS9hc3luY2h0dHAvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvamF2YS9uZXRodHRwL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmEvb2todHRwL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmEvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvamF2YS91bmlyZXN0L2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmFzY3JpcHQvYXhpb3MvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvamF2YXNjcmlwdC9mZXRjaC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9qYXZhc2NyaXB0L2pxdWVyeS9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9qYXZhc2NyaXB0L3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmFzY3JpcHQveGhyL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2tvdGxpbi9va2h0dHAvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMva290bGluL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL25vZGUvYXhpb3MvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvbm9kZS9mZXRjaC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9ub2RlL25hdGl2ZS9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9ub2RlL3JlcXVlc3QvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvbm9kZS90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9ub2RlL3VuaXJlc3QvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvb2JqYy9oZWxwZXJzLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvb2JqYy9uc3VybHNlc3Npb24vY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvb2JqYy90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9vY2FtbC9jb2h0dHAvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvb2NhbWwvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcGhwL2N1cmwvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcGhwL2d1enpsZS9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9waHAvaGVscGVycy50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3BocC9odHRwMS9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9waHAvaHR0cDIvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcGhwL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3Bvd2Vyc2hlbGwvY29tbW9uLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcG93ZXJzaGVsbC9yZXN0bWV0aG9kL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3Bvd2Vyc2hlbGwvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcG93ZXJzaGVsbC93ZWJyZXF1ZXN0L2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3B5dGhvbi9oZWxwZXJzLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcHl0aG9uL3B5dGhvbjMvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcHl0aG9uL3JlcXVlc3RzL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3B5dGhvbi90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9yL2h0dHIvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvci90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9ydWJ5L25hdGl2ZS9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9ydWJ5L3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3NoZWxsL2N1cmwvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvc2hlbGwvaHR0cGllL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3NoZWxsL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3NoZWxsL3dnZXQvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvc3dpZnQvaGVscGVycy50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3N3aWZ0L25zdXJsc2Vzc2lvbi9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9zd2lmdC90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy90YXJnZXRzLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZHVwbGV4ZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZXZlbnQtc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5L2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9mcm9tL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2dldC1vd24tZW51bWVyYWJsZS1wcm9wZXJ0eS1zeW1ib2xzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9oYXItc2NoZW1hL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvaXMtb2JqL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2lzLXJlZ2V4cC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9qc29uLXNjaGVtYS10cmF2ZXJzZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9tYXAtc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3BhdXNlLXN0cmVhbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmcvZGVjb2RlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nL2VuY29kZS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hc3luY19pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYnVmZmVyX2xpc3QuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zcGxpdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zdHJlYW0tY29tYmluZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1vYmplY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvdGhyb3VnaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy91cmktanMvZGlzdC9lczUvdXJpLmFsbC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy91cmwvbm9kZV9tb2R1bGVzL3B1bnljb2RlL3B1bnljb2RlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvdXJsL3V0aWwuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC9pZ25vcmVkfC9ob21lL3J1bm5lci93b3JrL2h0dHBzbmlwcGV0L2h0dHBzbmlwcGV0L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXN8dXRpbCIsIndlYnBhY2s6Ly9odHRwc25pcHBldC9pZ25vcmVkfC9ob21lL3J1bm5lci93b3JrL2h0dHBzbmlwcGV0L2h0dHBzbmlwcGV0L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGlifHV0aWwiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2h0dHBzbmlwcGV0L3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9odHRwc25pcHBldC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2h0dHBzbmlwcGV0L3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaHR0cHNuaXBwZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tcGlsZVNjaGVtYSA9IHJlcXVpcmUoJy4vY29tcGlsZScpXG4gICwgcmVzb2x2ZSA9IHJlcXVpcmUoJy4vY29tcGlsZS9yZXNvbHZlJylcbiAgLCBDYWNoZSA9IHJlcXVpcmUoJy4vY2FjaGUnKVxuICAsIFNjaGVtYU9iamVjdCA9IHJlcXVpcmUoJy4vY29tcGlsZS9zY2hlbWFfb2JqJylcbiAgLCBzdGFibGVTdHJpbmdpZnkgPSByZXF1aXJlKCdmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeScpXG4gICwgZm9ybWF0cyA9IHJlcXVpcmUoJy4vY29tcGlsZS9mb3JtYXRzJylcbiAgLCBydWxlcyA9IHJlcXVpcmUoJy4vY29tcGlsZS9ydWxlcycpXG4gICwgJGRhdGFNZXRhU2NoZW1hID0gcmVxdWlyZSgnLi9kYXRhJylcbiAgLCB1dGlsID0gcmVxdWlyZSgnLi9jb21waWxlL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBBanY7XG5cbkFqdi5wcm90b3R5cGUudmFsaWRhdGUgPSB2YWxpZGF0ZTtcbkFqdi5wcm90b3R5cGUuY29tcGlsZSA9IGNvbXBpbGU7XG5BanYucHJvdG90eXBlLmFkZFNjaGVtYSA9IGFkZFNjaGVtYTtcbkFqdi5wcm90b3R5cGUuYWRkTWV0YVNjaGVtYSA9IGFkZE1ldGFTY2hlbWE7XG5BanYucHJvdG90eXBlLnZhbGlkYXRlU2NoZW1hID0gdmFsaWRhdGVTY2hlbWE7XG5BanYucHJvdG90eXBlLmdldFNjaGVtYSA9IGdldFNjaGVtYTtcbkFqdi5wcm90b3R5cGUucmVtb3ZlU2NoZW1hID0gcmVtb3ZlU2NoZW1hO1xuQWp2LnByb3RvdHlwZS5hZGRGb3JtYXQgPSBhZGRGb3JtYXQ7XG5BanYucHJvdG90eXBlLmVycm9yc1RleHQgPSBlcnJvcnNUZXh0O1xuXG5BanYucHJvdG90eXBlLl9hZGRTY2hlbWEgPSBfYWRkU2NoZW1hO1xuQWp2LnByb3RvdHlwZS5fY29tcGlsZSA9IF9jb21waWxlO1xuXG5BanYucHJvdG90eXBlLmNvbXBpbGVBc3luYyA9IHJlcXVpcmUoJy4vY29tcGlsZS9hc3luYycpO1xudmFyIGN1c3RvbUtleXdvcmQgPSByZXF1aXJlKCcuL2tleXdvcmQnKTtcbkFqdi5wcm90b3R5cGUuYWRkS2V5d29yZCA9IGN1c3RvbUtleXdvcmQuYWRkO1xuQWp2LnByb3RvdHlwZS5nZXRLZXl3b3JkID0gY3VzdG9tS2V5d29yZC5nZXQ7XG5BanYucHJvdG90eXBlLnJlbW92ZUtleXdvcmQgPSBjdXN0b21LZXl3b3JkLnJlbW92ZTtcbkFqdi5wcm90b3R5cGUudmFsaWRhdGVLZXl3b3JkID0gY3VzdG9tS2V5d29yZC52YWxpZGF0ZTtcblxudmFyIGVycm9yQ2xhc3NlcyA9IHJlcXVpcmUoJy4vY29tcGlsZS9lcnJvcl9jbGFzc2VzJyk7XG5BanYuVmFsaWRhdGlvbkVycm9yID0gZXJyb3JDbGFzc2VzLlZhbGlkYXRpb247XG5BanYuTWlzc2luZ1JlZkVycm9yID0gZXJyb3JDbGFzc2VzLk1pc3NpbmdSZWY7XG5BanYuJGRhdGFNZXRhU2NoZW1hID0gJGRhdGFNZXRhU2NoZW1hO1xuXG52YXIgTUVUQV9TQ0hFTUFfSUQgPSAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEnO1xuXG52YXIgTUVUQV9JR05PUkVfT1BUSU9OUyA9IFsgJ3JlbW92ZUFkZGl0aW9uYWwnLCAndXNlRGVmYXVsdHMnLCAnY29lcmNlVHlwZXMnLCAnc3RyaWN0RGVmYXVsdHMnIF07XG52YXIgTUVUQV9TVVBQT1JUX0RBVEEgPSBbJy9wcm9wZXJ0aWVzJ107XG5cbi8qKlxuICogQ3JlYXRlcyB2YWxpZGF0b3IgaW5zdGFuY2UuXG4gKiBVc2FnZTogYEFqdihvcHRzKWBcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIG9wdGlvbmFsIG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gYWp2IGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIEFqdihvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBanYpKSByZXR1cm4gbmV3IEFqdihvcHRzKTtcbiAgb3B0cyA9IHRoaXMuX29wdHMgPSB1dGlsLmNvcHkob3B0cykgfHwge307XG4gIHNldExvZ2dlcih0aGlzKTtcbiAgdGhpcy5fc2NoZW1hcyA9IHt9O1xuICB0aGlzLl9yZWZzID0ge307XG4gIHRoaXMuX2ZyYWdtZW50cyA9IHt9O1xuICB0aGlzLl9mb3JtYXRzID0gZm9ybWF0cyhvcHRzLmZvcm1hdCk7XG5cbiAgdGhpcy5fY2FjaGUgPSBvcHRzLmNhY2hlIHx8IG5ldyBDYWNoZTtcbiAgdGhpcy5fbG9hZGluZ1NjaGVtYXMgPSB7fTtcbiAgdGhpcy5fY29tcGlsYXRpb25zID0gW107XG4gIHRoaXMuUlVMRVMgPSBydWxlcygpO1xuICB0aGlzLl9nZXRJZCA9IGNob29zZUdldElkKG9wdHMpO1xuXG4gIG9wdHMubG9vcFJlcXVpcmVkID0gb3B0cy5sb29wUmVxdWlyZWQgfHwgSW5maW5pdHk7XG4gIGlmIChvcHRzLmVycm9yRGF0YVBhdGggPT0gJ3Byb3BlcnR5Jykgb3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5ID0gdHJ1ZTtcbiAgaWYgKG9wdHMuc2VyaWFsaXplID09PSB1bmRlZmluZWQpIG9wdHMuc2VyaWFsaXplID0gc3RhYmxlU3RyaW5naWZ5O1xuICB0aGlzLl9tZXRhT3B0cyA9IGdldE1ldGFTY2hlbWFPcHRpb25zKHRoaXMpO1xuXG4gIGlmIChvcHRzLmZvcm1hdHMpIGFkZEluaXRpYWxGb3JtYXRzKHRoaXMpO1xuICBpZiAob3B0cy5rZXl3b3JkcykgYWRkSW5pdGlhbEtleXdvcmRzKHRoaXMpO1xuICBhZGREZWZhdWx0TWV0YVNjaGVtYSh0aGlzKTtcbiAgaWYgKHR5cGVvZiBvcHRzLm1ldGEgPT0gJ29iamVjdCcpIHRoaXMuYWRkTWV0YVNjaGVtYShvcHRzLm1ldGEpO1xuICBpZiAob3B0cy5udWxsYWJsZSkgdGhpcy5hZGRLZXl3b3JkKCdudWxsYWJsZScsIHttZXRhU2NoZW1hOiB7dHlwZTogJ2Jvb2xlYW4nfX0pO1xuICBhZGRJbml0aWFsU2NoZW1hcyh0aGlzKTtcbn1cblxuXG5cbi8qKlxuICogVmFsaWRhdGUgZGF0YSB1c2luZyBzY2hlbWFcbiAqIFNjaGVtYSB3aWxsIGJlIGNvbXBpbGVkIGFuZCBjYWNoZWQgKHVzaW5nIHNlcmlhbGl6ZWQgSlNPTiBhcyBrZXkuIFtmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeV0oaHR0cHM6Ly9naXRodWIuY29tL2Vwb2JlcmV6a2luL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5KSBpcyB1c2VkIHRvIHNlcmlhbGl6ZS5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtTdHJpbmd8T2JqZWN0fSBzY2hlbWFLZXlSZWYga2V5LCByZWYgb3Igc2NoZW1hIG9iamVjdFxuICogQHBhcmFtICB7QW55fSBkYXRhIHRvIGJlIHZhbGlkYXRlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gdmFsaWRhdGlvbiByZXN1bHQuIEVycm9ycyBmcm9tIHRoZSBsYXN0IHZhbGlkYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gYGFqdi5lcnJvcnNgIChhbmQgYWxzbyBpbiBjb21waWxlZCBzY2hlbWE6IGBzY2hlbWEuZXJyb3JzYCkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlKHNjaGVtYUtleVJlZiwgZGF0YSkge1xuICB2YXIgdjtcbiAgaWYgKHR5cGVvZiBzY2hlbWFLZXlSZWYgPT0gJ3N0cmluZycpIHtcbiAgICB2ID0gdGhpcy5nZXRTY2hlbWEoc2NoZW1hS2V5UmVmKTtcbiAgICBpZiAoIXYpIHRocm93IG5ldyBFcnJvcignbm8gc2NoZW1hIHdpdGgga2V5IG9yIHJlZiBcIicgKyBzY2hlbWFLZXlSZWYgKyAnXCInKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZW1hT2JqID0gdGhpcy5fYWRkU2NoZW1hKHNjaGVtYUtleVJlZik7XG4gICAgdiA9IHNjaGVtYU9iai52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlKHNjaGVtYU9iaik7XG4gIH1cblxuICB2YXIgdmFsaWQgPSB2KGRhdGEpO1xuICBpZiAodi4kYXN5bmMgIT09IHRydWUpIHRoaXMuZXJyb3JzID0gdi5lcnJvcnM7XG4gIHJldHVybiB2YWxpZDtcbn1cblxuXG4vKipcbiAqIENyZWF0ZSB2YWxpZGF0aW5nIGZ1bmN0aW9uIGZvciBwYXNzZWQgc2NoZW1hLlxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSAge0Jvb2xlYW59IF9tZXRhIHRydWUgaWYgc2NoZW1hIGlzIGEgbWV0YS1zY2hlbWEuIFVzZWQgaW50ZXJuYWxseSB0byBjb21waWxlIG1ldGEgc2NoZW1hcyBvZiBjdXN0b20ga2V5d29yZHMuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gdmFsaWRhdGluZyBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBjb21waWxlKHNjaGVtYSwgX21ldGEpIHtcbiAgdmFyIHNjaGVtYU9iaiA9IHRoaXMuX2FkZFNjaGVtYShzY2hlbWEsIHVuZGVmaW5lZCwgX21ldGEpO1xuICByZXR1cm4gc2NoZW1hT2JqLnZhbGlkYXRlIHx8IHRoaXMuX2NvbXBpbGUoc2NoZW1hT2JqKTtcbn1cblxuXG4vKipcbiAqIEFkZHMgc2NoZW1hIHRvIHRoZSBpbnN0YW5jZS5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gc2NoZW1hIHNjaGVtYSBvciBhcnJheSBvZiBzY2hlbWFzLiBJZiBhcnJheSBpcyBwYXNzZWQsIGBrZXlgIGFuZCBvdGhlciBwYXJhbWV0ZXJzIHdpbGwgYmUgaWdub3JlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgT3B0aW9uYWwgc2NoZW1hIGtleS4gQ2FuIGJlIHBhc3NlZCB0byBgdmFsaWRhdGVgIG1ldGhvZCBpbnN0ZWFkIG9mIHNjaGVtYSBvYmplY3Qgb3IgaWQvcmVmLiBPbmUgc2NoZW1hIHBlciBpbnN0YW5jZSBjYW4gaGF2ZSBlbXB0eSBgaWRgIGFuZCBga2V5YC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gX3NraXBWYWxpZGF0aW9uIHRydWUgdG8gc2tpcCBzY2hlbWEgdmFsaWRhdGlvbi4gVXNlZCBpbnRlcm5hbGx5LCBvcHRpb24gdmFsaWRhdGVTY2hlbWEgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gX21ldGEgdHJ1ZSBpZiBzY2hlbWEgaXMgYSBtZXRhLXNjaGVtYS4gVXNlZCBpbnRlcm5hbGx5LCBhZGRNZXRhU2NoZW1hIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiBhZGRTY2hlbWEoc2NoZW1hLCBrZXksIF9za2lwVmFsaWRhdGlvbiwgX21ldGEpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSl7XG4gICAgZm9yICh2YXIgaT0wOyBpPHNjaGVtYS5sZW5ndGg7IGkrKykgdGhpcy5hZGRTY2hlbWEoc2NoZW1hW2ldLCB1bmRlZmluZWQsIF9za2lwVmFsaWRhdGlvbiwgX21ldGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHZhciBpZCA9IHRoaXMuX2dldElkKHNjaGVtYSk7XG4gIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpZCAhPSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjaGVtYSBpZCBtdXN0IGJlIHN0cmluZycpO1xuICBrZXkgPSByZXNvbHZlLm5vcm1hbGl6ZUlkKGtleSB8fCBpZCk7XG4gIGNoZWNrVW5pcXVlKHRoaXMsIGtleSk7XG4gIHRoaXMuX3NjaGVtYXNba2V5XSA9IHRoaXMuX2FkZFNjaGVtYShzY2hlbWEsIF9za2lwVmFsaWRhdGlvbiwgX21ldGEsIHRydWUpO1xuICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEFkZCBzY2hlbWEgdGhhdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgb3RoZXIgc2NoZW1hc1xuICogb3B0aW9ucyBpbiBNRVRBX0lHTk9SRV9PUFRJT05TIGFyZSBhbHdheSBzZXQgdG8gZmFsc2VcbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgb3B0aW9uYWwgc2NoZW1hIGtleVxuICogQHBhcmFtIHtCb29sZWFufSBza2lwVmFsaWRhdGlvbiB0cnVlIHRvIHNraXAgc2NoZW1hIHZhbGlkYXRpb24sIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHZhbGlkYXRlU2NoZW1hIG9wdGlvbiBmb3IgbWV0YS1zY2hlbWFcbiAqIEByZXR1cm4ge0Fqdn0gdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gKi9cbmZ1bmN0aW9uIGFkZE1ldGFTY2hlbWEoc2NoZW1hLCBrZXksIHNraXBWYWxpZGF0aW9uKSB7XG4gIHRoaXMuYWRkU2NoZW1hKHNjaGVtYSwga2V5LCBza2lwVmFsaWRhdGlvbiwgdHJ1ZSk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogVmFsaWRhdGUgc2NoZW1hXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPckxvZ0Vycm9yIHBhc3MgdHJ1ZSB0byB0aHJvdyAob3IgbG9nKSBhbiBlcnJvciBpZiBpbnZhbGlkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHNjaGVtYSBpcyB2YWxpZFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRocm93T3JMb2dFcnJvcikge1xuICB2YXIgJHNjaGVtYSA9IHNjaGVtYS4kc2NoZW1hO1xuICBpZiAoJHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAkc2NoZW1hICE9ICdzdHJpbmcnKVxuICAgIHRocm93IG5ldyBFcnJvcignJHNjaGVtYSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICRzY2hlbWEgPSAkc2NoZW1hIHx8IHRoaXMuX29wdHMuZGVmYXVsdE1ldGEgfHwgZGVmYXVsdE1ldGEodGhpcyk7XG4gIGlmICghJHNjaGVtYSkge1xuICAgIHRoaXMubG9nZ2VyLndhcm4oJ21ldGEtc2NoZW1hIG5vdCBhdmFpbGFibGUnKTtcbiAgICB0aGlzLmVycm9ycyA9IG51bGw7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHZhbGlkID0gdGhpcy52YWxpZGF0ZSgkc2NoZW1hLCBzY2hlbWEpO1xuICBpZiAoIXZhbGlkICYmIHRocm93T3JMb2dFcnJvcikge1xuICAgIHZhciBtZXNzYWdlID0gJ3NjaGVtYSBpcyBpbnZhbGlkOiAnICsgdGhpcy5lcnJvcnNUZXh0KCk7XG4gICAgaWYgKHRoaXMuX29wdHMudmFsaWRhdGVTY2hlbWEgPT0gJ2xvZycpIHRoaXMubG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuXG5mdW5jdGlvbiBkZWZhdWx0TWV0YShzZWxmKSB7XG4gIHZhciBtZXRhID0gc2VsZi5fb3B0cy5tZXRhO1xuICBzZWxmLl9vcHRzLmRlZmF1bHRNZXRhID0gdHlwZW9mIG1ldGEgPT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlbGYuX2dldElkKG1ldGEpIHx8IG1ldGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNlbGYuZ2V0U2NoZW1hKE1FVEFfU0NIRU1BX0lEKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNRVRBX1NDSEVNQV9JRFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBzZWxmLl9vcHRzLmRlZmF1bHRNZXRhO1xufVxuXG5cbi8qKlxuICogR2V0IGNvbXBpbGVkIHNjaGVtYSBmcm9tIHRoZSBpbnN0YW5jZSBieSBga2V5YCBvciBgcmVmYC5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtTdHJpbmd9IGtleVJlZiBga2V5YCB0aGF0IHdhcyBwYXNzZWQgdG8gYGFkZFNjaGVtYWAgb3IgZnVsbCBzY2hlbWEgcmVmZXJlbmNlIChgc2NoZW1hLmlkYCBvciByZXNvbHZlZCBpZCkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gc2NoZW1hIHZhbGlkYXRpbmcgZnVuY3Rpb24gKHdpdGggcHJvcGVydHkgYHNjaGVtYWApLlxuICovXG5mdW5jdGlvbiBnZXRTY2hlbWEoa2V5UmVmKSB7XG4gIHZhciBzY2hlbWFPYmogPSBfZ2V0U2NoZW1hT2JqKHRoaXMsIGtleVJlZik7XG4gIHN3aXRjaCAodHlwZW9mIHNjaGVtYU9iaikge1xuICAgIGNhc2UgJ29iamVjdCc6IHJldHVybiBzY2hlbWFPYmoudmFsaWRhdGUgfHwgdGhpcy5fY29tcGlsZShzY2hlbWFPYmopO1xuICAgIGNhc2UgJ3N0cmluZyc6IHJldHVybiB0aGlzLmdldFNjaGVtYShzY2hlbWFPYmopO1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHJldHVybiBfZ2V0U2NoZW1hRnJhZ21lbnQodGhpcywga2V5UmVmKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIF9nZXRTY2hlbWFGcmFnbWVudChzZWxmLCByZWYpIHtcbiAgdmFyIHJlcyA9IHJlc29sdmUuc2NoZW1hLmNhbGwoc2VsZiwgeyBzY2hlbWE6IHt9IH0sIHJlZik7XG4gIGlmIChyZXMpIHtcbiAgICB2YXIgc2NoZW1hID0gcmVzLnNjaGVtYVxuICAgICAgLCByb290ID0gcmVzLnJvb3RcbiAgICAgICwgYmFzZUlkID0gcmVzLmJhc2VJZDtcbiAgICB2YXIgdiA9IGNvbXBpbGVTY2hlbWEuY2FsbChzZWxmLCBzY2hlbWEsIHJvb3QsIHVuZGVmaW5lZCwgYmFzZUlkKTtcbiAgICBzZWxmLl9mcmFnbWVudHNbcmVmXSA9IG5ldyBTY2hlbWFPYmplY3Qoe1xuICAgICAgcmVmOiByZWYsXG4gICAgICBmcmFnbWVudDogdHJ1ZSxcbiAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgcm9vdDogcm9vdCxcbiAgICAgIGJhc2VJZDogYmFzZUlkLFxuICAgICAgdmFsaWRhdGU6IHZcbiAgICB9KTtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIF9nZXRTY2hlbWFPYmooc2VsZiwga2V5UmVmKSB7XG4gIGtleVJlZiA9IHJlc29sdmUubm9ybWFsaXplSWQoa2V5UmVmKTtcbiAgcmV0dXJuIHNlbGYuX3NjaGVtYXNba2V5UmVmXSB8fCBzZWxmLl9yZWZzW2tleVJlZl0gfHwgc2VsZi5fZnJhZ21lbnRzW2tleVJlZl07XG59XG5cblxuLyoqXG4gKiBSZW1vdmUgY2FjaGVkIHNjaGVtYShzKS5cbiAqIElmIG5vIHBhcmFtZXRlciBpcyBwYXNzZWQgYWxsIHNjaGVtYXMgYnV0IG1ldGEtc2NoZW1hcyBhcmUgcmVtb3ZlZC5cbiAqIElmIFJlZ0V4cCBpcyBwYXNzZWQgYWxsIHNjaGVtYXMgd2l0aCBrZXkvaWQgbWF0Y2hpbmcgcGF0dGVybiBidXQgbWV0YS1zY2hlbWFzIGFyZSByZW1vdmVkLlxuICogRXZlbiBpZiBzY2hlbWEgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBzY2hlbWFzIGl0IHN0aWxsIGNhbiBiZSByZW1vdmVkIGFzIG90aGVyIHNjaGVtYXMgaGF2ZSBsb2NhbCByZWZlcmVuY2VzLlxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge1N0cmluZ3xPYmplY3R8UmVnRXhwfSBzY2hlbWFLZXlSZWYga2V5LCByZWYsIHBhdHRlcm4gdG8gbWF0Y2gga2V5L3JlZiBvciBzY2hlbWEgb2JqZWN0XG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiByZW1vdmVTY2hlbWEoc2NoZW1hS2V5UmVmKSB7XG4gIGlmIChzY2hlbWFLZXlSZWYgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICBfcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLCB0aGlzLl9zY2hlbWFzLCBzY2hlbWFLZXlSZWYpO1xuICAgIF9yZW1vdmVBbGxTY2hlbWFzKHRoaXMsIHRoaXMuX3JlZnMsIHNjaGVtYUtleVJlZik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc3dpdGNoICh0eXBlb2Ygc2NoZW1hS2V5UmVmKSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIF9yZW1vdmVBbGxTY2hlbWFzKHRoaXMsIHRoaXMuX3NjaGVtYXMpO1xuICAgICAgX3JlbW92ZUFsbFNjaGVtYXModGhpcywgdGhpcy5fcmVmcyk7XG4gICAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHZhciBzY2hlbWFPYmogPSBfZ2V0U2NoZW1hT2JqKHRoaXMsIHNjaGVtYUtleVJlZik7XG4gICAgICBpZiAoc2NoZW1hT2JqKSB0aGlzLl9jYWNoZS5kZWwoc2NoZW1hT2JqLmNhY2hlS2V5KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zY2hlbWFzW3NjaGVtYUtleVJlZl07XG4gICAgICBkZWxldGUgdGhpcy5fcmVmc1tzY2hlbWFLZXlSZWZdO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHZhciBzZXJpYWxpemUgPSB0aGlzLl9vcHRzLnNlcmlhbGl6ZTtcbiAgICAgIHZhciBjYWNoZUtleSA9IHNlcmlhbGl6ZSA/IHNlcmlhbGl6ZShzY2hlbWFLZXlSZWYpIDogc2NoZW1hS2V5UmVmO1xuICAgICAgdGhpcy5fY2FjaGUuZGVsKGNhY2hlS2V5KTtcbiAgICAgIHZhciBpZCA9IHRoaXMuX2dldElkKHNjaGVtYUtleVJlZik7XG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgaWQgPSByZXNvbHZlLm5vcm1hbGl6ZUlkKGlkKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3NjaGVtYXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fcmVmc1tpZF07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuZnVuY3Rpb24gX3JlbW92ZUFsbFNjaGVtYXMoc2VsZiwgc2NoZW1hcywgcmVnZXgpIHtcbiAgZm9yICh2YXIga2V5UmVmIGluIHNjaGVtYXMpIHtcbiAgICB2YXIgc2NoZW1hT2JqID0gc2NoZW1hc1trZXlSZWZdO1xuICAgIGlmICghc2NoZW1hT2JqLm1ldGEgJiYgKCFyZWdleCB8fCByZWdleC50ZXN0KGtleVJlZikpKSB7XG4gICAgICBzZWxmLl9jYWNoZS5kZWwoc2NoZW1hT2JqLmNhY2hlS2V5KTtcbiAgICAgIGRlbGV0ZSBzY2hlbWFzW2tleVJlZl07XG4gICAgfVxuICB9XG59XG5cblxuLyogQHRoaXMgICBBanYgKi9cbmZ1bmN0aW9uIF9hZGRTY2hlbWEoc2NoZW1hLCBza2lwVmFsaWRhdGlvbiwgbWV0YSwgc2hvdWxkQWRkU2NoZW1hKSB7XG4gIGlmICh0eXBlb2Ygc2NoZW1hICE9ICdvYmplY3QnICYmIHR5cGVvZiBzY2hlbWEgIT0gJ2Jvb2xlYW4nKVxuICAgIHRocm93IG5ldyBFcnJvcignc2NoZW1hIHNob3VsZCBiZSBvYmplY3Qgb3IgYm9vbGVhbicpO1xuICB2YXIgc2VyaWFsaXplID0gdGhpcy5fb3B0cy5zZXJpYWxpemU7XG4gIHZhciBjYWNoZUtleSA9IHNlcmlhbGl6ZSA/IHNlcmlhbGl6ZShzY2hlbWEpIDogc2NoZW1hO1xuICB2YXIgY2FjaGVkID0gdGhpcy5fY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBzaG91bGRBZGRTY2hlbWEgPSBzaG91bGRBZGRTY2hlbWEgfHwgdGhpcy5fb3B0cy5hZGRVc2VkU2NoZW1hICE9PSBmYWxzZTtcblxuICB2YXIgaWQgPSByZXNvbHZlLm5vcm1hbGl6ZUlkKHRoaXMuX2dldElkKHNjaGVtYSkpO1xuICBpZiAoaWQgJiYgc2hvdWxkQWRkU2NoZW1hKSBjaGVja1VuaXF1ZSh0aGlzLCBpZCk7XG5cbiAgdmFyIHdpbGxWYWxpZGF0ZSA9IHRoaXMuX29wdHMudmFsaWRhdGVTY2hlbWEgIT09IGZhbHNlICYmICFza2lwVmFsaWRhdGlvbjtcbiAgdmFyIHJlY3Vyc2l2ZU1ldGE7XG4gIGlmICh3aWxsVmFsaWRhdGUgJiYgIShyZWN1cnNpdmVNZXRhID0gaWQgJiYgaWQgPT0gcmVzb2x2ZS5ub3JtYWxpemVJZChzY2hlbWEuJHNjaGVtYSkpKVxuICAgIHRoaXMudmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0cnVlKTtcblxuICB2YXIgbG9jYWxSZWZzID0gcmVzb2x2ZS5pZHMuY2FsbCh0aGlzLCBzY2hlbWEpO1xuXG4gIHZhciBzY2hlbWFPYmogPSBuZXcgU2NoZW1hT2JqZWN0KHtcbiAgICBpZDogaWQsXG4gICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgbG9jYWxSZWZzOiBsb2NhbFJlZnMsXG4gICAgY2FjaGVLZXk6IGNhY2hlS2V5LFxuICAgIG1ldGE6IG1ldGFcbiAgfSk7XG5cbiAgaWYgKGlkWzBdICE9ICcjJyAmJiBzaG91bGRBZGRTY2hlbWEpIHRoaXMuX3JlZnNbaWRdID0gc2NoZW1hT2JqO1xuICB0aGlzLl9jYWNoZS5wdXQoY2FjaGVLZXksIHNjaGVtYU9iaik7XG5cbiAgaWYgKHdpbGxWYWxpZGF0ZSAmJiByZWN1cnNpdmVNZXRhKSB0aGlzLnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG5cbiAgcmV0dXJuIHNjaGVtYU9iajtcbn1cblxuXG4vKiBAdGhpcyAgIEFqdiAqL1xuZnVuY3Rpb24gX2NvbXBpbGUoc2NoZW1hT2JqLCByb290KSB7XG4gIGlmIChzY2hlbWFPYmouY29tcGlsaW5nKSB7XG4gICAgc2NoZW1hT2JqLnZhbGlkYXRlID0gY2FsbFZhbGlkYXRlO1xuICAgIGNhbGxWYWxpZGF0ZS5zY2hlbWEgPSBzY2hlbWFPYmouc2NoZW1hO1xuICAgIGNhbGxWYWxpZGF0ZS5lcnJvcnMgPSBudWxsO1xuICAgIGNhbGxWYWxpZGF0ZS5yb290ID0gcm9vdCA/IHJvb3QgOiBjYWxsVmFsaWRhdGU7XG4gICAgaWYgKHNjaGVtYU9iai5zY2hlbWEuJGFzeW5jID09PSB0cnVlKVxuICAgICAgY2FsbFZhbGlkYXRlLiRhc3luYyA9IHRydWU7XG4gICAgcmV0dXJuIGNhbGxWYWxpZGF0ZTtcbiAgfVxuICBzY2hlbWFPYmouY29tcGlsaW5nID0gdHJ1ZTtcblxuICB2YXIgY3VycmVudE9wdHM7XG4gIGlmIChzY2hlbWFPYmoubWV0YSkge1xuICAgIGN1cnJlbnRPcHRzID0gdGhpcy5fb3B0cztcbiAgICB0aGlzLl9vcHRzID0gdGhpcy5fbWV0YU9wdHM7XG4gIH1cblxuICB2YXIgdjtcbiAgdHJ5IHsgdiA9IGNvbXBpbGVTY2hlbWEuY2FsbCh0aGlzLCBzY2hlbWFPYmouc2NoZW1hLCByb290LCBzY2hlbWFPYmoubG9jYWxSZWZzKTsgfVxuICBjYXRjaChlKSB7XG4gICAgZGVsZXRlIHNjaGVtYU9iai52YWxpZGF0ZTtcbiAgICB0aHJvdyBlO1xuICB9XG4gIGZpbmFsbHkge1xuICAgIHNjaGVtYU9iai5jb21waWxpbmcgPSBmYWxzZTtcbiAgICBpZiAoc2NoZW1hT2JqLm1ldGEpIHRoaXMuX29wdHMgPSBjdXJyZW50T3B0cztcbiAgfVxuXG4gIHNjaGVtYU9iai52YWxpZGF0ZSA9IHY7XG4gIHNjaGVtYU9iai5yZWZzID0gdi5yZWZzO1xuICBzY2hlbWFPYmoucmVmVmFsID0gdi5yZWZWYWw7XG4gIHNjaGVtYU9iai5yb290ID0gdi5yb290O1xuICByZXR1cm4gdjtcblxuXG4gIC8qIEB0aGlzICAgeyp9IC0gY3VzdG9tIGNvbnRleHQsIHNlZSBwYXNzQ29udGV4dCBvcHRpb24gKi9cbiAgZnVuY3Rpb24gY2FsbFZhbGlkYXRlKCkge1xuICAgIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgICB2YXIgX3ZhbGlkYXRlID0gc2NoZW1hT2JqLnZhbGlkYXRlO1xuICAgIHZhciByZXN1bHQgPSBfdmFsaWRhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBjYWxsVmFsaWRhdGUuZXJyb3JzID0gX3ZhbGlkYXRlLmVycm9ycztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cblxuZnVuY3Rpb24gY2hvb3NlR2V0SWQob3B0cykge1xuICBzd2l0Y2ggKG9wdHMuc2NoZW1hSWQpIHtcbiAgICBjYXNlICdhdXRvJzogcmV0dXJuIF9nZXQkSWRPcklkO1xuICAgIGNhc2UgJ2lkJzogcmV0dXJuIF9nZXRJZDtcbiAgICBkZWZhdWx0OiByZXR1cm4gX2dldCRJZDtcbiAgfVxufVxuXG4vKiBAdGhpcyAgIEFqdiAqL1xuZnVuY3Rpb24gX2dldElkKHNjaGVtYSkge1xuICBpZiAoc2NoZW1hLiRpZCkgdGhpcy5sb2dnZXIud2Fybignc2NoZW1hICRpZCBpZ25vcmVkJywgc2NoZW1hLiRpZCk7XG4gIHJldHVybiBzY2hlbWEuaWQ7XG59XG5cbi8qIEB0aGlzICAgQWp2ICovXG5mdW5jdGlvbiBfZ2V0JElkKHNjaGVtYSkge1xuICBpZiAoc2NoZW1hLmlkKSB0aGlzLmxvZ2dlci53YXJuKCdzY2hlbWEgaWQgaWdub3JlZCcsIHNjaGVtYS5pZCk7XG4gIHJldHVybiBzY2hlbWEuJGlkO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXQkSWRPcklkKHNjaGVtYSkge1xuICBpZiAoc2NoZW1hLiRpZCAmJiBzY2hlbWEuaWQgJiYgc2NoZW1hLiRpZCAhPSBzY2hlbWEuaWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2hlbWEgJGlkIGlzIGRpZmZlcmVudCBmcm9tIGlkJyk7XG4gIHJldHVybiBzY2hlbWEuJGlkIHx8IHNjaGVtYS5pZDtcbn1cblxuXG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgZXJyb3IgbWVzc2FnZSBvYmplY3RzIHRvIHN0cmluZ1xuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge0FycmF5PE9iamVjdD59IGVycm9ycyBvcHRpb25hbCBhcnJheSBvZiB2YWxpZGF0aW9uIGVycm9ycywgaWYgbm90IHBhc3NlZCBlcnJvcnMgZnJvbSB0aGUgaW5zdGFuY2UgYXJlIHVzZWQuXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgb3B0aW9uYWwgb3B0aW9ucyB3aXRoIHByb3BlcnRpZXMgYHNlcGFyYXRvcmAgYW5kIGBkYXRhVmFyYC5cbiAqIEByZXR1cm4ge1N0cmluZ30gaHVtYW4gcmVhZGFibGUgc3RyaW5nIHdpdGggYWxsIGVycm9ycyBkZXNjcmlwdGlvbnNcbiAqL1xuZnVuY3Rpb24gZXJyb3JzVGV4dChlcnJvcnMsIG9wdGlvbnMpIHtcbiAgZXJyb3JzID0gZXJyb3JzIHx8IHRoaXMuZXJyb3JzO1xuICBpZiAoIWVycm9ycykgcmV0dXJuICdObyBlcnJvcnMnO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHNlcGFyYXRvciA9IG9wdGlvbnMuc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnLCAnIDogb3B0aW9ucy5zZXBhcmF0b3I7XG4gIHZhciBkYXRhVmFyID0gb3B0aW9ucy5kYXRhVmFyID09PSB1bmRlZmluZWQgPyAnZGF0YScgOiBvcHRpb25zLmRhdGFWYXI7XG5cbiAgdmFyIHRleHQgPSAnJztcbiAgZm9yICh2YXIgaT0wOyBpPGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlID0gZXJyb3JzW2ldO1xuICAgIGlmIChlKSB0ZXh0ICs9IGRhdGFWYXIgKyBlLmRhdGFQYXRoICsgJyAnICsgZS5tZXNzYWdlICsgc2VwYXJhdG9yO1xuICB9XG4gIHJldHVybiB0ZXh0LnNsaWNlKDAsIC1zZXBhcmF0b3IubGVuZ3RoKTtcbn1cblxuXG4vKipcbiAqIEFkZCBjdXN0b20gZm9ybWF0XG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgZm9ybWF0IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cHxGdW5jdGlvbn0gZm9ybWF0IHN0cmluZyBpcyBjb252ZXJ0ZWQgdG8gUmVnRXhwOyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGJvb2xlYW4gKHRydWUgd2hlbiB2YWxpZClcbiAqIEByZXR1cm4ge0Fqdn0gdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gKi9cbmZ1bmN0aW9uIGFkZEZvcm1hdChuYW1lLCBmb3JtYXQpIHtcbiAgaWYgKHR5cGVvZiBmb3JtYXQgPT0gJ3N0cmluZycpIGZvcm1hdCA9IG5ldyBSZWdFeHAoZm9ybWF0KTtcbiAgdGhpcy5fZm9ybWF0c1tuYW1lXSA9IGZvcm1hdDtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuZnVuY3Rpb24gYWRkRGVmYXVsdE1ldGFTY2hlbWEoc2VsZikge1xuICB2YXIgJGRhdGFTY2hlbWE7XG4gIGlmIChzZWxmLl9vcHRzLiRkYXRhKSB7XG4gICAgJGRhdGFTY2hlbWEgPSByZXF1aXJlKCcuL3JlZnMvZGF0YS5qc29uJyk7XG4gICAgc2VsZi5hZGRNZXRhU2NoZW1hKCRkYXRhU2NoZW1hLCAkZGF0YVNjaGVtYS4kaWQsIHRydWUpO1xuICB9XG4gIGlmIChzZWxmLl9vcHRzLm1ldGEgPT09IGZhbHNlKSByZXR1cm47XG4gIHZhciBtZXRhU2NoZW1hID0gcmVxdWlyZSgnLi9yZWZzL2pzb24tc2NoZW1hLWRyYWZ0LTA3Lmpzb24nKTtcbiAgaWYgKHNlbGYuX29wdHMuJGRhdGEpIG1ldGFTY2hlbWEgPSAkZGF0YU1ldGFTY2hlbWEobWV0YVNjaGVtYSwgTUVUQV9TVVBQT1JUX0RBVEEpO1xuICBzZWxmLmFkZE1ldGFTY2hlbWEobWV0YVNjaGVtYSwgTUVUQV9TQ0hFTUFfSUQsIHRydWUpO1xuICBzZWxmLl9yZWZzWydodHRwOi8vanNvbi1zY2hlbWEub3JnL3NjaGVtYSddID0gTUVUQV9TQ0hFTUFfSUQ7XG59XG5cblxuZnVuY3Rpb24gYWRkSW5pdGlhbFNjaGVtYXMoc2VsZikge1xuICB2YXIgb3B0c1NjaGVtYXMgPSBzZWxmLl9vcHRzLnNjaGVtYXM7XG4gIGlmICghb3B0c1NjaGVtYXMpIHJldHVybjtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0c1NjaGVtYXMpKSBzZWxmLmFkZFNjaGVtYShvcHRzU2NoZW1hcyk7XG4gIGVsc2UgZm9yICh2YXIga2V5IGluIG9wdHNTY2hlbWFzKSBzZWxmLmFkZFNjaGVtYShvcHRzU2NoZW1hc1trZXldLCBrZXkpO1xufVxuXG5cbmZ1bmN0aW9uIGFkZEluaXRpYWxGb3JtYXRzKHNlbGYpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiBzZWxmLl9vcHRzLmZvcm1hdHMpIHtcbiAgICB2YXIgZm9ybWF0ID0gc2VsZi5fb3B0cy5mb3JtYXRzW25hbWVdO1xuICAgIHNlbGYuYWRkRm9ybWF0KG5hbWUsIGZvcm1hdCk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBhZGRJbml0aWFsS2V5d29yZHMoc2VsZikge1xuICBmb3IgKHZhciBuYW1lIGluIHNlbGYuX29wdHMua2V5d29yZHMpIHtcbiAgICB2YXIga2V5d29yZCA9IHNlbGYuX29wdHMua2V5d29yZHNbbmFtZV07XG4gICAgc2VsZi5hZGRLZXl3b3JkKG5hbWUsIGtleXdvcmQpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gY2hlY2tVbmlxdWUoc2VsZiwgaWQpIHtcbiAgaWYgKHNlbGYuX3NjaGVtYXNbaWRdIHx8IHNlbGYuX3JlZnNbaWRdKVxuICAgIHRocm93IG5ldyBFcnJvcignc2NoZW1hIHdpdGgga2V5IG9yIGlkIFwiJyArIGlkICsgJ1wiIGFscmVhZHkgZXhpc3RzJyk7XG59XG5cblxuZnVuY3Rpb24gZ2V0TWV0YVNjaGVtYU9wdGlvbnMoc2VsZikge1xuICB2YXIgbWV0YU9wdHMgPSB1dGlsLmNvcHkoc2VsZi5fb3B0cyk7XG4gIGZvciAodmFyIGk9MDsgaTxNRVRBX0lHTk9SRV9PUFRJT05TLmxlbmd0aDsgaSsrKVxuICAgIGRlbGV0ZSBtZXRhT3B0c1tNRVRBX0lHTk9SRV9PUFRJT05TW2ldXTtcbiAgcmV0dXJuIG1ldGFPcHRzO1xufVxuXG5cbmZ1bmN0aW9uIHNldExvZ2dlcihzZWxmKSB7XG4gIHZhciBsb2dnZXIgPSBzZWxmLl9vcHRzLmxvZ2dlcjtcbiAgaWYgKGxvZ2dlciA9PT0gZmFsc2UpIHtcbiAgICBzZWxmLmxvZ2dlciA9IHtsb2c6IG5vb3AsIHdhcm46IG5vb3AsIGVycm9yOiBub29wfTtcbiAgfSBlbHNlIHtcbiAgICBpZiAobG9nZ2VyID09PSB1bmRlZmluZWQpIGxvZ2dlciA9IGNvbnNvbGU7XG4gICAgaWYgKCEodHlwZW9mIGxvZ2dlciA9PSAnb2JqZWN0JyAmJiBsb2dnZXIubG9nICYmIGxvZ2dlci53YXJuICYmIGxvZ2dlci5lcnJvcikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvZ2dlciBtdXN0IGltcGxlbWVudCBsb2csIHdhcm4gYW5kIGVycm9yIG1ldGhvZHMnKTtcbiAgICBzZWxmLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDYWNoZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gQ2FjaGUoKSB7XG4gIHRoaXMuX2NhY2hlID0ge307XG59O1xuXG5cbkNhY2hlLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiBDYWNoZV9wdXQoa2V5LCB2YWx1ZSkge1xuICB0aGlzLl9jYWNoZVtrZXldID0gdmFsdWU7XG59O1xuXG5cbkNhY2hlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBDYWNoZV9nZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9jYWNoZVtrZXldO1xufTtcblxuXG5DYWNoZS5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24gQ2FjaGVfZGVsKGtleSkge1xuICBkZWxldGUgdGhpcy5fY2FjaGVba2V5XTtcbn07XG5cblxuQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gQ2FjaGVfY2xlYXIoKSB7XG4gIHRoaXMuX2NhY2hlID0ge307XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWlzc2luZ1JlZkVycm9yID0gcmVxdWlyZSgnLi9lcnJvcl9jbGFzc2VzJykuTWlzc2luZ1JlZjtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21waWxlQXN5bmM7XG5cblxuLyoqXG4gKiBDcmVhdGVzIHZhbGlkYXRpbmcgZnVuY3Rpb24gZm9yIHBhc3NlZCBzY2hlbWEgd2l0aCBhc3luY2hyb25vdXMgbG9hZGluZyBvZiBtaXNzaW5nIHNjaGVtYXMuXG4gKiBgbG9hZFNjaGVtYWAgb3B0aW9uIHNob3VsZCBiZSBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBzY2hlbWEgdXJpIGFuZCByZXR1cm5zIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzY2hlbWEuXG4gKiBAdGhpcyAgQWp2XG4gKiBAcGFyYW0ge09iamVjdH0gICBzY2hlbWEgc2NoZW1hIG9iamVjdFxuICogQHBhcmFtIHtCb29sZWFufSAgbWV0YSBvcHRpb25hbCB0cnVlIHRvIGNvbXBpbGUgbWV0YS1zY2hlbWE7IHRoaXMgcGFyYW1ldGVyIGNhbiBiZSBza2lwcGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhbiBvcHRpb25hbCBub2RlLXN0eWxlIGNhbGxiYWNrLCBpdCBpcyBjYWxsZWQgd2l0aCAyIHBhcmFtZXRlcnM6IGVycm9yIChvciBudWxsKSBhbmQgdmFsaWRhdGluZyBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgdmFsaWRhdGluZyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUFzeW5jKHNjaGVtYSwgbWV0YSwgY2FsbGJhY2spIHtcbiAgLyogZXNsaW50IG5vLXNoYWRvdzogMCAqL1xuICAvKiBnbG9iYWwgUHJvbWlzZSAqL1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHR5cGVvZiB0aGlzLl9vcHRzLmxvYWRTY2hlbWEgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMubG9hZFNjaGVtYSBzaG91bGQgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICh0eXBlb2YgbWV0YSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBtZXRhO1xuICAgIG1ldGEgPSB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgcCA9IGxvYWRNZXRhU2NoZW1hT2Yoc2NoZW1hKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NoZW1hT2JqID0gc2VsZi5fYWRkU2NoZW1hKHNjaGVtYSwgdW5kZWZpbmVkLCBtZXRhKTtcbiAgICByZXR1cm4gc2NoZW1hT2JqLnZhbGlkYXRlIHx8IF9jb21waWxlQXN5bmMoc2NoZW1hT2JqKTtcbiAgfSk7XG5cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgcC50aGVuKFxuICAgICAgZnVuY3Rpb24odikgeyBjYWxsYmFjayhudWxsLCB2KTsgfSxcbiAgICAgIGNhbGxiYWNrXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwO1xuXG5cbiAgZnVuY3Rpb24gbG9hZE1ldGFTY2hlbWFPZihzY2gpIHtcbiAgICB2YXIgJHNjaGVtYSA9IHNjaC4kc2NoZW1hO1xuICAgIHJldHVybiAkc2NoZW1hICYmICFzZWxmLmdldFNjaGVtYSgkc2NoZW1hKVxuICAgICAgICAgICAgPyBjb21waWxlQXN5bmMuY2FsbChzZWxmLCB7ICRyZWY6ICRzY2hlbWEgfSwgdHJ1ZSlcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIF9jb21waWxlQXN5bmMoc2NoZW1hT2JqKSB7XG4gICAgdHJ5IHsgcmV0dXJuIHNlbGYuX2NvbXBpbGUoc2NoZW1hT2JqKTsgfVxuICAgIGNhdGNoKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ1JlZkVycm9yKSByZXR1cm4gbG9hZE1pc3NpbmdTY2hlbWEoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gbG9hZE1pc3NpbmdTY2hlbWEoZSkge1xuICAgICAgdmFyIHJlZiA9IGUubWlzc2luZ1NjaGVtYTtcbiAgICAgIGlmIChhZGRlZChyZWYpKSB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVtYSAnICsgcmVmICsgJyBpcyBsb2FkZWQgYnV0ICcgKyBlLm1pc3NpbmdSZWYgKyAnIGNhbm5vdCBiZSByZXNvbHZlZCcpO1xuXG4gICAgICB2YXIgc2NoZW1hUHJvbWlzZSA9IHNlbGYuX2xvYWRpbmdTY2hlbWFzW3JlZl07XG4gICAgICBpZiAoIXNjaGVtYVByb21pc2UpIHtcbiAgICAgICAgc2NoZW1hUHJvbWlzZSA9IHNlbGYuX2xvYWRpbmdTY2hlbWFzW3JlZl0gPSBzZWxmLl9vcHRzLmxvYWRTY2hlbWEocmVmKTtcbiAgICAgICAgc2NoZW1hUHJvbWlzZS50aGVuKHJlbW92ZVByb21pc2UsIHJlbW92ZVByb21pc2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2NoZW1hUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChzY2gpIHtcbiAgICAgICAgaWYgKCFhZGRlZChyZWYpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvYWRNZXRhU2NoZW1hT2Yoc2NoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghYWRkZWQocmVmKSkgc2VsZi5hZGRTY2hlbWEoc2NoLCByZWYsIHVuZGVmaW5lZCwgbWV0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfY29tcGlsZUFzeW5jKHNjaGVtYU9iaik7XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gcmVtb3ZlUHJvbWlzZSgpIHtcbiAgICAgICAgZGVsZXRlIHNlbGYuX2xvYWRpbmdTY2hlbWFzW3JlZl07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFkZGVkKHJlZikge1xuICAgICAgICByZXR1cm4gc2VsZi5fcmVmc1tyZWZdIHx8IHNlbGYuX3NjaGVtYXNbcmVmXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlc29sdmUgPSByZXF1aXJlKCcuL3Jlc29sdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFZhbGlkYXRpb246IGVycm9yU3ViY2xhc3MoVmFsaWRhdGlvbkVycm9yKSxcbiAgTWlzc2luZ1JlZjogZXJyb3JTdWJjbGFzcyhNaXNzaW5nUmVmRXJyb3IpXG59O1xuXG5cbmZ1bmN0aW9uIFZhbGlkYXRpb25FcnJvcihlcnJvcnMpIHtcbiAgdGhpcy5tZXNzYWdlID0gJ3ZhbGlkYXRpb24gZmFpbGVkJztcbiAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gIHRoaXMuYWp2ID0gdGhpcy52YWxpZGF0aW9uID0gdHJ1ZTtcbn1cblxuXG5NaXNzaW5nUmVmRXJyb3IubWVzc2FnZSA9IGZ1bmN0aW9uIChiYXNlSWQsIHJlZikge1xuICByZXR1cm4gJ2NhblxcJ3QgcmVzb2x2ZSByZWZlcmVuY2UgJyArIHJlZiArICcgZnJvbSBpZCAnICsgYmFzZUlkO1xufTtcblxuXG5mdW5jdGlvbiBNaXNzaW5nUmVmRXJyb3IoYmFzZUlkLCByZWYsIG1lc3NhZ2UpIHtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCBNaXNzaW5nUmVmRXJyb3IubWVzc2FnZShiYXNlSWQsIHJlZik7XG4gIHRoaXMubWlzc2luZ1JlZiA9IHJlc29sdmUudXJsKGJhc2VJZCwgcmVmKTtcbiAgdGhpcy5taXNzaW5nU2NoZW1hID0gcmVzb2x2ZS5ub3JtYWxpemVJZChyZXNvbHZlLmZ1bGxQYXRoKHRoaXMubWlzc2luZ1JlZikpO1xufVxuXG5cbmZ1bmN0aW9uIGVycm9yU3ViY2xhc3MoU3ViY2xhc3MpIHtcbiAgU3ViY2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICBTdWJjbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTdWJjbGFzcztcbiAgcmV0dXJuIFN1YmNsYXNzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgREFURSA9IC9eKFxcZFxcZFxcZFxcZCktKFxcZFxcZCktKFxcZFxcZCkkLztcbnZhciBEQVlTID0gWzAsMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO1xudmFyIFRJTUUgPSAvXihcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpKFxcLlxcZCspPyh6fFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/KT8kL2k7XG52YXIgSE9TVE5BTUUgPSAvXig/PS57MSwyNTN9XFwuPyQpW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XFwuW2EtejAtOV0oPzpbLTAtOWEtel17MCw2MX1bMC05YS16XSk/KSpcXC4/JC9pO1xudmFyIFVSSSA9IC9eKD86W2Etel1bYS16MC05K1xcLS5dKjopKD86XFwvP1xcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdfCVbMC05YS1mXXsyfSkqQCk/KD86XFxbKD86KD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9fDo6KD86WzAtOWEtZl17MSw0fTopezV9fCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDF9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M318KD86KD86WzAtOWEtZl17MSw0fTopezAsMn1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXsyfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTp8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86OikoPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw1fVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw2fVswLTlhLWZdezEsNH0pPzo6KXxbVnZdWzAtOWEtZl0rXFwuW2EtejAtOVxcLS5ffiEkJicoKSorLDs9Ol0rKVxcXXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPyl8KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9XXwlWzAtOWEtZl17Mn0pKikoPzo6XFxkKik/KD86XFwvKD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSp8XFwvKD86KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSopP3woPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QF18JVswLTlhLWZdezJ9KSsoPzpcXC8oPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QF18JVswLTlhLWZdezJ9KSopKikoPzpcXD8oPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/KD86Iyg/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpALz9dfCVbMC05YS1mXXsyfSkqKT8kL2k7XG52YXIgVVJJUkVGID0gL14oPzpbYS16XVthLXowLTkrXFwtLl0qOik/KD86XFwvP1xcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdfCVbMC05YS1mXXsyfSkqQCk/KD86XFxbKD86KD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9fDo6KD86WzAtOWEtZl17MSw0fTopezV9fCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDF9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M318KD86KD86WzAtOWEtZl17MSw0fTopezAsMn1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXsyfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTp8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86OikoPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw1fVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw2fVswLTlhLWZdezEsNH0pPzo6KXxbVnZdWzAtOWEtZl0rXFwuW2EtejAtOVxcLS5ffiEkJicoKSorLDs9Ol0rKVxcXXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPyl8KD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz1dfCVbMC05YS1mXXsyfSkqKSg/OjpcXGQqKT8oPzpcXC8oPzpbYS16MC05XFwtLl9+ISQmJ1wiKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKikqfFxcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/fCg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/KD86XFw/KD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/KD86Iyg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkAvP118JVswLTlhLWZdezJ9KSopPyQvaTtcbi8vIHVyaS10ZW1wbGF0ZTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY1NzBcbnZhciBVUklURU1QTEFURSA9IC9eKD86KD86W15cXHgwMC1cXHgyMFwiJzw+JVxcXFxeYHt8fV18JVswLTlhLWZdezJ9KXxcXHtbKyMuLzs/Jj0sIUB8XT8oPzpbYS16MC05X118JVswLTlhLWZdezJ9KSsoPzo6WzEtOV1bMC05XXswLDN9fFxcKik/KD86LCg/OlthLXowLTlfXXwlWzAtOWEtZl17Mn0pKyg/OjpbMS05XVswLTldezAsM318XFwqKT8pKlxcfSkqJC9pO1xuLy8gRm9yIHRoZSBzb3VyY2U6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RwZXJpbmkvNzI5Mjk0XG4vLyBGb3IgdGVzdCBjYXNlczogaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL2RlbW8vdXJsLXJlZ2V4XG4vLyBAdG9kbyBEZWxldGUgY3VycmVudCBVUkwgaW4gZmF2b3VyIG9mIHRoZSBjb21tZW50ZWQgb3V0IFVSTCBydWxlIHdoZW4gdGhpcyBpc3N1ZSBpcyBmaXhlZCBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvNzk4My5cbi8vIHZhciBVUkwgPSAvXig/Oig/Omh0dHBzP3xmdHApOlxcL1xcLykoPzpcXFMrKD86OlxcUyopP0ApPyg/Oig/ITEwKD86XFwuXFxkezEsM30pezN9KSg/ITEyNyg/OlxcLlxcZHsxLDN9KXszfSkoPyExNjlcXC4yNTQoPzpcXC5cXGR7MSwzfSl7Mn0pKD8hMTkyXFwuMTY4KD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXpcXHV7MDBhMX0tXFx1e2ZmZmZ9MC05XSstKSpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rKSg/OlxcLig/OlthLXpcXHV7MDBhMX0tXFx1e2ZmZmZ9MC05XSstKSpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rKSooPzpcXC4oPzpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfV17Mix9KSkpKD86OlxcZHsyLDV9KT8oPzpcXC9bXlxcc10qKT8kL2l1O1xudmFyIFVSTCA9IC9eKD86KD86aHR0cFtzXFx1MDE3Rl0/fGZ0cCk6XFwvXFwvKSg/Oig/OltcXDAtXFx4MDhcXHgwRS1cXHgxRiEtXFx4OUZcXHhBMS1cXHUxNjdGXFx1MTY4MS1cXHUxRkZGXFx1MjAwQi1cXHUyMDI3XFx1MjAyQS1cXHUyMDJFXFx1MjAzMC1cXHUyMDVFXFx1MjA2MC1cXHUyRkZGXFx1MzAwMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRUZFXFx1RkYwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSsoPzo6KD86W1xcMC1cXHgwOFxceDBFLVxceDFGIS1cXHg5RlxceEExLVxcdTE2N0ZcXHUxNjgxLVxcdTFGRkZcXHUyMDBCLVxcdTIwMjdcXHUyMDJBLVxcdTIwMkVcXHUyMDMwLVxcdTIwNUVcXHUyMDYwLVxcdTJGRkZcXHUzMDAxLVxcdUQ3RkZcXHVFMDAwLVxcdUZFRkVcXHVGRjAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKik/QCk/KD86KD8hMTAoPzpcXC5bMC05XXsxLDN9KXszfSkoPyExMjcoPzpcXC5bMC05XXsxLDN9KXszfSkoPyExNjlcXC4yNTQoPzpcXC5bMC05XXsxLDN9KXsyfSkoPyExOTJcXC4xNjgoPzpcXC5bMC05XXsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlswLTldfDNbMDFdKSg/OlxcLlswLTldezEsM30pezJ9KSg/OlsxLTldWzAtOV0/fDFbMC05XVswLTldfDJbMDFdWzAtOV18MjJbMC0zXSkoPzpcXC4oPzoxP1swLTldezEsMn18MlswLTRdWzAtOV18MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1bMC05XT98MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC00XSkpfCg/Oig/Oig/OlswLTlhLXpcXHhBMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXSkrLSkqKD86WzAtOWEtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSspKD86XFwuKD86KD86WzAtOWEtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSstKSooPzpbMC05YS16XFx4QTEtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKykqKD86XFwuKD86KD86W2EtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKXsyLH0pKSkoPzo6WzAtOV17Miw1fSk/KD86XFwvKD86W1xcMC1cXHgwOFxceDBFLVxceDFGIS1cXHg5RlxceEExLVxcdTE2N0ZcXHUxNjgxLVxcdTFGRkZcXHUyMDBCLVxcdTIwMjdcXHUyMDJBLVxcdTIwMkVcXHUyMDMwLVxcdTIwNUVcXHUyMDYwLVxcdTJGRkZcXHUzMDAxLVxcdUQ3RkZcXHVFMDAwLVxcdUZFRkVcXHVGRjAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKik/JC9pO1xudmFyIFVVSUQgPSAvXig/OnVybjp1dWlkOik/WzAtOWEtZl17OH0tKD86WzAtOWEtZl17NH0tKXszfVswLTlhLWZdezEyfSQvaTtcbnZhciBKU09OX1BPSU5URVIgPSAvXig/OlxcLyg/Oltefi9dfH4wfH4xKSopKiQvO1xudmFyIEpTT05fUE9JTlRFUl9VUklfRlJBR01FTlQgPSAvXiMoPzpcXC8oPzpbYS16MC05X1xcLS4hJCYnKCkqKyw7Oj1AXXwlWzAtOWEtZl17Mn18fjB8fjEpKikqJC9pO1xudmFyIFJFTEFUSVZFX0pTT05fUE9JTlRFUiA9IC9eKD86MHxbMS05XVswLTldKikoPzojfCg/OlxcLyg/Oltefi9dfH4wfH4xKSopKikkLztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvcm1hdHM7XG5cbmZ1bmN0aW9uIGZvcm1hdHMobW9kZSkge1xuICBtb2RlID0gbW9kZSA9PSAnZnVsbCcgPyAnZnVsbCcgOiAnZmFzdCc7XG4gIHJldHVybiB1dGlsLmNvcHkoZm9ybWF0c1ttb2RlXSk7XG59XG5cblxuZm9ybWF0cy5mYXN0ID0ge1xuICAvLyBkYXRlOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I3NlY3Rpb24tNS42XG4gIGRhdGU6IC9eXFxkXFxkXFxkXFxkLVswLTFdXFxkLVswLTNdXFxkJC8sXG4gIC8vIGRhdGUtdGltZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICB0aW1lOiAvXig/OlswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkfDIzOjU5OjYwKSg/OlxcLlxcZCspPyg/Onp8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8pPyQvaSxcbiAgJ2RhdGUtdGltZSc6IC9eXFxkXFxkXFxkXFxkLVswLTFdXFxkLVswLTNdXFxkW3RcXHNdKD86WzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGR8MjM6NTk6NjApKD86XFwuXFxkKyk/KD86enxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPykkL2ksXG4gIC8vIHVyaTogaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9pcy1teS1qc29uLXZhbGlkL2Jsb2IvbWFzdGVyL2Zvcm1hdHMuanNcbiAgdXJpOiAvXig/OlthLXpdW2EtejAtOStcXC0uXSo6KSg/OlxcLz9cXC8pP1teXFxzXSokL2ksXG4gICd1cmktcmVmZXJlbmNlJzogL14oPzooPzpbYS16XVthLXowLTkrXFwtLl0qOik/XFwvP1xcLyk/KD86W15cXFxcXFxzI11bXlxccyNdKik/KD86I1teXFxcXFxcc10qKT8kL2ksXG4gICd1cmktdGVtcGxhdGUnOiBVUklURU1QTEFURSxcbiAgdXJsOiBVUkwsXG4gIC8vIGVtYWlsIChzb3VyY2VzIGZyb20ganNlbiB2YWxpZGF0b3IpOlxuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIwMTMyMy91c2luZy1hLXJlZ3VsYXItZXhwcmVzc2lvbi10by12YWxpZGF0ZS1hbi1lbWFpbC1hZGRyZXNzI2Fuc3dlci04ODI5MzYzXG4gIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2Zvcm1zLmh0bWwjdmFsaWQtZS1tYWlsLWFkZHJlc3MgKHNlYXJjaCBmb3IgJ3dpbGxmdWwgdmlvbGF0aW9uJylcbiAgZW1haWw6IC9eW2EtejAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XFwuW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KSokL2ksXG4gIGhvc3RuYW1lOiBIT1NUTkFNRSxcbiAgLy8gb3B0aW1pemVkIGh0dHBzOi8vd3d3LnNhZmFyaWJvb2tzb25saW5lLmNvbS9saWJyYXJ5L3ZpZXcvcmVndWxhci1leHByZXNzaW9ucy1jb29rYm9vay85NzgwNTk2ODAyODM3L2NoMDdzMTYuaHRtbFxuICBpcHY0OiAvXig/Oig/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSQvLFxuICAvLyBvcHRpbWl6ZWQgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81MzQ5Ny9yZWd1bGFyLWV4cHJlc3Npb24tdGhhdC1tYXRjaGVzLXZhbGlkLWlwdjYtYWRkcmVzc2VzXG4gIGlwdjY6IC9eXFxzKig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs3fSg/OlswLTlhLWZdezEsNH18OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXs2fSg/OjpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwyfSl8Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NH0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwzfSl8KD86KD86OlswLTlhLWZdezEsNH0pPzooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXszfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDR9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwyfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsyfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDV9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwzfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsxfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCw0fTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/OjooPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw3fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNX06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoPzolLispP1xccyokL2ksXG4gIHJlZ2V4OiByZWdleCxcbiAgLy8gdXVpZDogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDEyMlxuICB1dWlkOiBVVUlELFxuICAvLyBKU09OLXBvaW50ZXI6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxXG4gIC8vIHVyaSBmcmFnbWVudDogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQVxuICAnanNvbi1wb2ludGVyJzogSlNPTl9QT0lOVEVSLFxuICAnanNvbi1wb2ludGVyLXVyaS1mcmFnbWVudCc6IEpTT05fUE9JTlRFUl9VUklfRlJBR01FTlQsXG4gIC8vIHJlbGF0aXZlIEpTT04tcG9pbnRlcjogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbHVmZi1yZWxhdGl2ZS1qc29uLXBvaW50ZXItMDBcbiAgJ3JlbGF0aXZlLWpzb24tcG9pbnRlcic6IFJFTEFUSVZFX0pTT05fUE9JTlRFUlxufTtcblxuXG5mb3JtYXRzLmZ1bGwgPSB7XG4gIGRhdGU6IGRhdGUsXG4gIHRpbWU6IHRpbWUsXG4gICdkYXRlLXRpbWUnOiBkYXRlX3RpbWUsXG4gIHVyaTogdXJpLFxuICAndXJpLXJlZmVyZW5jZSc6IFVSSVJFRixcbiAgJ3VyaS10ZW1wbGF0ZSc6IFVSSVRFTVBMQVRFLFxuICB1cmw6IFVSTCxcbiAgZW1haWw6IC9eW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/JC9pLFxuICBob3N0bmFtZTogSE9TVE5BTUUsXG4gIGlwdjQ6IC9eKD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pJC8sXG4gIGlwdjY6IC9eXFxzKig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs3fSg/OlswLTlhLWZdezEsNH18OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXs2fSg/OjpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwyfSl8Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NH0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwzfSl8KD86KD86OlswLTlhLWZdezEsNH0pPzooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXszfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDR9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwyfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsyfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDV9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwzfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsxfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCw0fTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/OjooPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw3fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNX06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoPzolLispP1xccyokL2ksXG4gIHJlZ2V4OiByZWdleCxcbiAgdXVpZDogVVVJRCxcbiAgJ2pzb24tcG9pbnRlcic6IEpTT05fUE9JTlRFUixcbiAgJ2pzb24tcG9pbnRlci11cmktZnJhZ21lbnQnOiBKU09OX1BPSU5URVJfVVJJX0ZSQUdNRU5ULFxuICAncmVsYXRpdmUtanNvbi1wb2ludGVyJzogUkVMQVRJVkVfSlNPTl9QT0lOVEVSXG59O1xuXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNhcHBlbmRpeC1DXG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cblxuXG5mdW5jdGlvbiBkYXRlKHN0cikge1xuICAvLyBmdWxsLWRhdGUgZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I3NlY3Rpb24tNS42XG4gIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKERBVEUpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybiBmYWxzZTtcblxuICB2YXIgeWVhciA9ICttYXRjaGVzWzFdO1xuICB2YXIgbW9udGggPSArbWF0Y2hlc1syXTtcbiAgdmFyIGRheSA9ICttYXRjaGVzWzNdO1xuXG4gIHJldHVybiBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyICYmIGRheSA+PSAxICYmXG4gICAgICAgICAgZGF5IDw9IChtb250aCA9PSAyICYmIGlzTGVhcFllYXIoeWVhcikgPyAyOSA6IERBWVNbbW9udGhdKTtcbn1cblxuXG5mdW5jdGlvbiB0aW1lKHN0ciwgZnVsbCkge1xuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChUSU1FKTtcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGhvdXIgPSBtYXRjaGVzWzFdO1xuICB2YXIgbWludXRlID0gbWF0Y2hlc1syXTtcbiAgdmFyIHNlY29uZCA9IG1hdGNoZXNbM107XG4gIHZhciB0aW1lWm9uZSA9IG1hdGNoZXNbNV07XG4gIHJldHVybiAoKGhvdXIgPD0gMjMgJiYgbWludXRlIDw9IDU5ICYmIHNlY29uZCA8PSA1OSkgfHxcbiAgICAgICAgICAoaG91ciA9PSAyMyAmJiBtaW51dGUgPT0gNTkgJiYgc2Vjb25kID09IDYwKSkgJiZcbiAgICAgICAgICghZnVsbCB8fCB0aW1lWm9uZSk7XG59XG5cblxudmFyIERBVEVfVElNRV9TRVBBUkFUT1IgPSAvdHxcXHMvaTtcbmZ1bmN0aW9uIGRhdGVfdGltZShzdHIpIHtcbiAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICB2YXIgZGF0ZVRpbWUgPSBzdHIuc3BsaXQoREFURV9USU1FX1NFUEFSQVRPUik7XG4gIHJldHVybiBkYXRlVGltZS5sZW5ndGggPT0gMiAmJiBkYXRlKGRhdGVUaW1lWzBdKSAmJiB0aW1lKGRhdGVUaW1lWzFdLCB0cnVlKTtcbn1cblxuXG52YXIgTk9UX1VSSV9GUkFHTUVOVCA9IC9cXC98Oi87XG5mdW5jdGlvbiB1cmkoc3RyKSB7XG4gIC8vIGh0dHA6Ly9qbXJ3YXJlLmNvbS9hcnRpY2xlcy8yMDA5L3VyaV9yZWdleHAvVVJJX3JlZ2V4Lmh0bWwgKyBvcHRpb25hbCBwcm90b2NvbCArIHJlcXVpcmVkIFwiLlwiXG4gIHJldHVybiBOT1RfVVJJX0ZSQUdNRU5ULnRlc3Qoc3RyKSAmJiBVUkkudGVzdChzdHIpO1xufVxuXG5cbnZhciBaX0FOQ0hPUiA9IC9bXlxcXFxdXFxcXFovO1xuZnVuY3Rpb24gcmVnZXgoc3RyKSB7XG4gIGlmIChaX0FOQ0hPUi50ZXN0KHN0cikpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBuZXcgUmVnRXhwKHN0cik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVzb2x2ZSA9IHJlcXVpcmUoJy4vcmVzb2x2ZScpXG4gICwgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG4gICwgZXJyb3JDbGFzc2VzID0gcmVxdWlyZSgnLi9lcnJvcl9jbGFzc2VzJylcbiAgLCBzdGFibGVTdHJpbmdpZnkgPSByZXF1aXJlKCdmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeScpO1xuXG52YXIgdmFsaWRhdGVHZW5lcmF0b3IgPSByZXF1aXJlKCcuLi9kb3Rqcy92YWxpZGF0ZScpO1xuXG4vKipcbiAqIEZ1bmN0aW9ucyBiZWxvdyBhcmUgdXNlZCBpbnNpZGUgY29tcGlsZWQgdmFsaWRhdGlvbnMgZnVuY3Rpb25cbiAqL1xuXG52YXIgdWNzMmxlbmd0aCA9IHV0aWwudWNzMmxlbmd0aDtcbnZhciBlcXVhbCA9IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpO1xuXG4vLyB0aGlzIGVycm9yIGlzIHRocm93biBieSBhc3luYyBzY2hlbWFzIHRvIHJldHVybiB2YWxpZGF0aW9uIGVycm9ycyB2aWEgZXhjZXB0aW9uXG52YXIgVmFsaWRhdGlvbkVycm9yID0gZXJyb3JDbGFzc2VzLlZhbGlkYXRpb247XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZTtcblxuXG4vKipcbiAqIENvbXBpbGVzIHNjaGVtYSB0byB2YWxpZGF0aW9uIGZ1bmN0aW9uXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIG9iamVjdFxuICogQHBhcmFtICB7T2JqZWN0fSByb290IG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSByb290IHNjaGVtYSBmb3IgdGhpcyBzY2hlbWFcbiAqIEBwYXJhbSAge09iamVjdH0gbG9jYWxSZWZzIHRoZSBoYXNoIG9mIGxvY2FsIHJlZmVyZW5jZXMgaW5zaWRlIHRoZSBzY2hlbWEgKGNyZWF0ZWQgYnkgcmVzb2x2ZS5pZCksIHVzZWQgZm9yIGlubGluZSByZXNvbHV0aW9uXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGJhc2VJZCBiYXNlIElEIGZvciBJRHMgaW4gdGhlIHNjaGVtYVxuICogQHJldHVybiB7RnVuY3Rpb259IHZhbGlkYXRpb24gZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZShzY2hlbWEsIHJvb3QsIGxvY2FsUmVmcywgYmFzZUlkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUsIGV2aWw6IHRydWUgKi9cbiAgLyogZXNsaW50IG5vLXNoYWRvdzogMCAqL1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgICAsIG9wdHMgPSB0aGlzLl9vcHRzXG4gICAgLCByZWZWYWwgPSBbIHVuZGVmaW5lZCBdXG4gICAgLCByZWZzID0ge31cbiAgICAsIHBhdHRlcm5zID0gW11cbiAgICAsIHBhdHRlcm5zSGFzaCA9IHt9XG4gICAgLCBkZWZhdWx0cyA9IFtdXG4gICAgLCBkZWZhdWx0c0hhc2ggPSB7fVxuICAgICwgY3VzdG9tUnVsZXMgPSBbXTtcblxuICByb290ID0gcm9vdCB8fCB7IHNjaGVtYTogc2NoZW1hLCByZWZWYWw6IHJlZlZhbCwgcmVmczogcmVmcyB9O1xuXG4gIHZhciBjID0gY2hlY2tDb21waWxpbmcuY2FsbCh0aGlzLCBzY2hlbWEsIHJvb3QsIGJhc2VJZCk7XG4gIHZhciBjb21waWxhdGlvbiA9IHRoaXMuX2NvbXBpbGF0aW9uc1tjLmluZGV4XTtcbiAgaWYgKGMuY29tcGlsaW5nKSByZXR1cm4gKGNvbXBpbGF0aW9uLmNhbGxWYWxpZGF0ZSA9IGNhbGxWYWxpZGF0ZSk7XG5cbiAgdmFyIGZvcm1hdHMgPSB0aGlzLl9mb3JtYXRzO1xuICB2YXIgUlVMRVMgPSB0aGlzLlJVTEVTO1xuXG4gIHRyeSB7XG4gICAgdmFyIHYgPSBsb2NhbENvbXBpbGUoc2NoZW1hLCByb290LCBsb2NhbFJlZnMsIGJhc2VJZCk7XG4gICAgY29tcGlsYXRpb24udmFsaWRhdGUgPSB2O1xuICAgIHZhciBjdiA9IGNvbXBpbGF0aW9uLmNhbGxWYWxpZGF0ZTtcbiAgICBpZiAoY3YpIHtcbiAgICAgIGN2LnNjaGVtYSA9IHYuc2NoZW1hO1xuICAgICAgY3YuZXJyb3JzID0gbnVsbDtcbiAgICAgIGN2LnJlZnMgPSB2LnJlZnM7XG4gICAgICBjdi5yZWZWYWwgPSB2LnJlZlZhbDtcbiAgICAgIGN2LnJvb3QgPSB2LnJvb3Q7XG4gICAgICBjdi4kYXN5bmMgPSB2LiRhc3luYztcbiAgICAgIGlmIChvcHRzLnNvdXJjZUNvZGUpIGN2LnNvdXJjZSA9IHYuc291cmNlO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbiAgfSBmaW5hbGx5IHtcbiAgICBlbmRDb21waWxpbmcuY2FsbCh0aGlzLCBzY2hlbWEsIHJvb3QsIGJhc2VJZCk7XG4gIH1cblxuICAvKiBAdGhpcyAgIHsqfSAtIGN1c3RvbSBjb250ZXh0LCBzZWUgcGFzc0NvbnRleHQgb3B0aW9uICovXG4gIGZ1bmN0aW9uIGNhbGxWYWxpZGF0ZSgpIHtcbiAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gICAgdmFyIHZhbGlkYXRlID0gY29tcGlsYXRpb24udmFsaWRhdGU7XG4gICAgdmFyIHJlc3VsdCA9IHZhbGlkYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgY2FsbFZhbGlkYXRlLmVycm9ycyA9IHZhbGlkYXRlLmVycm9ycztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYWxDb21waWxlKF9zY2hlbWEsIF9yb290LCBsb2NhbFJlZnMsIGJhc2VJZCkge1xuICAgIHZhciBpc1Jvb3QgPSAhX3Jvb3QgfHwgKF9yb290ICYmIF9yb290LnNjaGVtYSA9PSBfc2NoZW1hKTtcbiAgICBpZiAoX3Jvb3Quc2NoZW1hICE9IHJvb3Quc2NoZW1hKVxuICAgICAgcmV0dXJuIGNvbXBpbGUuY2FsbChzZWxmLCBfc2NoZW1hLCBfcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpO1xuXG4gICAgdmFyICRhc3luYyA9IF9zY2hlbWEuJGFzeW5jID09PSB0cnVlO1xuXG4gICAgdmFyIHNvdXJjZUNvZGUgPSB2YWxpZGF0ZUdlbmVyYXRvcih7XG4gICAgICBpc1RvcDogdHJ1ZSxcbiAgICAgIHNjaGVtYTogX3NjaGVtYSxcbiAgICAgIGlzUm9vdDogaXNSb290LFxuICAgICAgYmFzZUlkOiBiYXNlSWQsXG4gICAgICByb290OiBfcm9vdCxcbiAgICAgIHNjaGVtYVBhdGg6ICcnLFxuICAgICAgZXJyU2NoZW1hUGF0aDogJyMnLFxuICAgICAgZXJyb3JQYXRoOiAnXCJcIicsXG4gICAgICBNaXNzaW5nUmVmRXJyb3I6IGVycm9yQ2xhc3Nlcy5NaXNzaW5nUmVmLFxuICAgICAgUlVMRVM6IFJVTEVTLFxuICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlR2VuZXJhdG9yLFxuICAgICAgdXRpbDogdXRpbCxcbiAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICByZXNvbHZlUmVmOiByZXNvbHZlUmVmLFxuICAgICAgdXNlUGF0dGVybjogdXNlUGF0dGVybixcbiAgICAgIHVzZURlZmF1bHQ6IHVzZURlZmF1bHQsXG4gICAgICB1c2VDdXN0b21SdWxlOiB1c2VDdXN0b21SdWxlLFxuICAgICAgb3B0czogb3B0cyxcbiAgICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgICBsb2dnZXI6IHNlbGYubG9nZ2VyLFxuICAgICAgc2VsZjogc2VsZlxuICAgIH0pO1xuXG4gICAgc291cmNlQ29kZSA9IHZhcnMocmVmVmFsLCByZWZWYWxDb2RlKSArIHZhcnMocGF0dGVybnMsIHBhdHRlcm5Db2RlKVxuICAgICAgICAgICAgICAgICAgICsgdmFycyhkZWZhdWx0cywgZGVmYXVsdENvZGUpICsgdmFycyhjdXN0b21SdWxlcywgY3VzdG9tUnVsZUNvZGUpXG4gICAgICAgICAgICAgICAgICAgKyBzb3VyY2VDb2RlO1xuXG4gICAgaWYgKG9wdHMucHJvY2Vzc0NvZGUpIHNvdXJjZUNvZGUgPSBvcHRzLnByb2Nlc3NDb2RlKHNvdXJjZUNvZGUsIF9zY2hlbWEpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdcXG5cXG5cXG4gKioqIFxcbicsIEpTT04uc3RyaW5naWZ5KHNvdXJjZUNvZGUpKTtcbiAgICB2YXIgdmFsaWRhdGU7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBtYWtlVmFsaWRhdGUgPSBuZXcgRnVuY3Rpb24oXG4gICAgICAgICdzZWxmJyxcbiAgICAgICAgJ1JVTEVTJyxcbiAgICAgICAgJ2Zvcm1hdHMnLFxuICAgICAgICAncm9vdCcsXG4gICAgICAgICdyZWZWYWwnLFxuICAgICAgICAnZGVmYXVsdHMnLFxuICAgICAgICAnY3VzdG9tUnVsZXMnLFxuICAgICAgICAnZXF1YWwnLFxuICAgICAgICAndWNzMmxlbmd0aCcsXG4gICAgICAgICdWYWxpZGF0aW9uRXJyb3InLFxuICAgICAgICBzb3VyY2VDb2RlXG4gICAgICApO1xuXG4gICAgICB2YWxpZGF0ZSA9IG1ha2VWYWxpZGF0ZShcbiAgICAgICAgc2VsZixcbiAgICAgICAgUlVMRVMsXG4gICAgICAgIGZvcm1hdHMsXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHJlZlZhbCxcbiAgICAgICAgZGVmYXVsdHMsXG4gICAgICAgIGN1c3RvbVJ1bGVzLFxuICAgICAgICBlcXVhbCxcbiAgICAgICAgdWNzMmxlbmd0aCxcbiAgICAgICAgVmFsaWRhdGlvbkVycm9yXG4gICAgICApO1xuXG4gICAgICByZWZWYWxbMF0gPSB2YWxpZGF0ZTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIHNlbGYubG9nZ2VyLmVycm9yKCdFcnJvciBjb21waWxpbmcgc2NoZW1hLCBmdW5jdGlvbiBjb2RlOicsIHNvdXJjZUNvZGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZS5zY2hlbWEgPSBfc2NoZW1hO1xuICAgIHZhbGlkYXRlLmVycm9ycyA9IG51bGw7XG4gICAgdmFsaWRhdGUucmVmcyA9IHJlZnM7XG4gICAgdmFsaWRhdGUucmVmVmFsID0gcmVmVmFsO1xuICAgIHZhbGlkYXRlLnJvb3QgPSBpc1Jvb3QgPyB2YWxpZGF0ZSA6IF9yb290O1xuICAgIGlmICgkYXN5bmMpIHZhbGlkYXRlLiRhc3luYyA9IHRydWU7XG4gICAgaWYgKG9wdHMuc291cmNlQ29kZSA9PT0gdHJ1ZSkge1xuICAgICAgdmFsaWRhdGUuc291cmNlID0ge1xuICAgICAgICBjb2RlOiBzb3VyY2VDb2RlLFxuICAgICAgICBwYXR0ZXJuczogcGF0dGVybnMsXG4gICAgICAgIGRlZmF1bHRzOiBkZWZhdWx0c1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGU7XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlUmVmKGJhc2VJZCwgcmVmLCBpc1Jvb3QpIHtcbiAgICByZWYgPSByZXNvbHZlLnVybChiYXNlSWQsIHJlZik7XG4gICAgdmFyIHJlZkluZGV4ID0gcmVmc1tyZWZdO1xuICAgIHZhciBfcmVmVmFsLCByZWZDb2RlO1xuICAgIGlmIChyZWZJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBfcmVmVmFsID0gcmVmVmFsW3JlZkluZGV4XTtcbiAgICAgIHJlZkNvZGUgPSAncmVmVmFsWycgKyByZWZJbmRleCArICddJztcbiAgICAgIHJldHVybiByZXNvbHZlZFJlZihfcmVmVmFsLCByZWZDb2RlKTtcbiAgICB9XG4gICAgaWYgKCFpc1Jvb3QgJiYgcm9vdC5yZWZzKSB7XG4gICAgICB2YXIgcm9vdFJlZklkID0gcm9vdC5yZWZzW3JlZl07XG4gICAgICBpZiAocm9vdFJlZklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX3JlZlZhbCA9IHJvb3QucmVmVmFsW3Jvb3RSZWZJZF07XG4gICAgICAgIHJlZkNvZGUgPSBhZGRMb2NhbFJlZihyZWYsIF9yZWZWYWwpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZWRSZWYoX3JlZlZhbCwgcmVmQ29kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVmQ29kZSA9IGFkZExvY2FsUmVmKHJlZik7XG4gICAgdmFyIHYgPSByZXNvbHZlLmNhbGwoc2VsZiwgbG9jYWxDb21waWxlLCByb290LCByZWYpO1xuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBsb2NhbFNjaGVtYSA9IGxvY2FsUmVmcyAmJiBsb2NhbFJlZnNbcmVmXTtcbiAgICAgIGlmIChsb2NhbFNjaGVtYSkge1xuICAgICAgICB2ID0gcmVzb2x2ZS5pbmxpbmVSZWYobG9jYWxTY2hlbWEsIG9wdHMuaW5saW5lUmVmcylcbiAgICAgICAgICAgID8gbG9jYWxTY2hlbWFcbiAgICAgICAgICAgIDogY29tcGlsZS5jYWxsKHNlbGYsIGxvY2FsU2NoZW1hLCByb290LCBsb2NhbFJlZnMsIGJhc2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVtb3ZlTG9jYWxSZWYocmVmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVwbGFjZUxvY2FsUmVmKHJlZiwgdik7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRSZWYodiwgcmVmQ29kZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkTG9jYWxSZWYocmVmLCB2KSB7XG4gICAgdmFyIHJlZklkID0gcmVmVmFsLmxlbmd0aDtcbiAgICByZWZWYWxbcmVmSWRdID0gdjtcbiAgICByZWZzW3JlZl0gPSByZWZJZDtcbiAgICByZXR1cm4gJ3JlZlZhbCcgKyByZWZJZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUxvY2FsUmVmKHJlZikge1xuICAgIGRlbGV0ZSByZWZzW3JlZl07XG4gIH1cblxuICBmdW5jdGlvbiByZXBsYWNlTG9jYWxSZWYocmVmLCB2KSB7XG4gICAgdmFyIHJlZklkID0gcmVmc1tyZWZdO1xuICAgIHJlZlZhbFtyZWZJZF0gPSB2O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZWRSZWYocmVmVmFsLCBjb2RlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZWZWYWwgPT0gJ29iamVjdCcgfHwgdHlwZW9mIHJlZlZhbCA9PSAnYm9vbGVhbidcbiAgICAgICAgICAgID8geyBjb2RlOiBjb2RlLCBzY2hlbWE6IHJlZlZhbCwgaW5saW5lOiB0cnVlIH1cbiAgICAgICAgICAgIDogeyBjb2RlOiBjb2RlLCAkYXN5bmM6IHJlZlZhbCAmJiAhIXJlZlZhbC4kYXN5bmMgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZVBhdHRlcm4ocmVnZXhTdHIpIHtcbiAgICB2YXIgaW5kZXggPSBwYXR0ZXJuc0hhc2hbcmVnZXhTdHJdO1xuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbmRleCA9IHBhdHRlcm5zSGFzaFtyZWdleFN0cl0gPSBwYXR0ZXJucy5sZW5ndGg7XG4gICAgICBwYXR0ZXJuc1tpbmRleF0gPSByZWdleFN0cjtcbiAgICB9XG4gICAgcmV0dXJuICdwYXR0ZXJuJyArIGluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRGVmYXVsdCh2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiAnJyArIHZhbHVlO1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcmV0dXJuIHV0aWwudG9RdW90ZWRTdHJpbmcodmFsdWUpO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICAgICAgICB2YXIgdmFsdWVTdHIgPSBzdGFibGVTdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB2YXIgaW5kZXggPSBkZWZhdWx0c0hhc2hbdmFsdWVTdHJdO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGluZGV4ID0gZGVmYXVsdHNIYXNoW3ZhbHVlU3RyXSA9IGRlZmF1bHRzLmxlbmd0aDtcbiAgICAgICAgICBkZWZhdWx0c1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2RlZmF1bHQnICsgaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlQ3VzdG9tUnVsZShydWxlLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpIHtcbiAgICBpZiAoc2VsZi5fb3B0cy52YWxpZGF0ZVNjaGVtYSAhPT0gZmFsc2UpIHtcbiAgICAgIHZhciBkZXBzID0gcnVsZS5kZWZpbml0aW9uLmRlcGVuZGVuY2llcztcbiAgICAgIGlmIChkZXBzICYmICFkZXBzLmV2ZXJ5KGZ1bmN0aW9uKGtleXdvcmQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJlbnRTY2hlbWEsIGtleXdvcmQpO1xuICAgICAgfSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGFyZW50IHNjaGVtYSBtdXN0IGhhdmUgYWxsIHJlcXVpcmVkIGtleXdvcmRzOiAnICsgZGVwcy5qb2luKCcsJykpO1xuXG4gICAgICB2YXIgdmFsaWRhdGVTY2hlbWEgPSBydWxlLmRlZmluaXRpb24udmFsaWRhdGVTY2hlbWE7XG4gICAgICBpZiAodmFsaWRhdGVTY2hlbWEpIHtcbiAgICAgICAgdmFyIHZhbGlkID0gdmFsaWRhdGVTY2hlbWEoc2NoZW1hKTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgIHZhciBtZXNzYWdlID0gJ2tleXdvcmQgc2NoZW1hIGlzIGludmFsaWQ6ICcgKyBzZWxmLmVycm9yc1RleHQodmFsaWRhdGVTY2hlbWEuZXJyb3JzKTtcbiAgICAgICAgICBpZiAoc2VsZi5fb3B0cy52YWxpZGF0ZVNjaGVtYSA9PSAnbG9nJykgc2VsZi5sb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY29tcGlsZSA9IHJ1bGUuZGVmaW5pdGlvbi5jb21waWxlXG4gICAgICAsIGlubGluZSA9IHJ1bGUuZGVmaW5pdGlvbi5pbmxpbmVcbiAgICAgICwgbWFjcm8gPSBydWxlLmRlZmluaXRpb24ubWFjcm87XG5cbiAgICB2YXIgdmFsaWRhdGU7XG4gICAgaWYgKGNvbXBpbGUpIHtcbiAgICAgIHZhbGlkYXRlID0gY29tcGlsZS5jYWxsKHNlbGYsIHNjaGVtYSwgcGFyZW50U2NoZW1hLCBpdCk7XG4gICAgfSBlbHNlIGlmIChtYWNybykge1xuICAgICAgdmFsaWRhdGUgPSBtYWNyby5jYWxsKHNlbGYsIHNjaGVtYSwgcGFyZW50U2NoZW1hLCBpdCk7XG4gICAgICBpZiAob3B0cy52YWxpZGF0ZVNjaGVtYSAhPT0gZmFsc2UpIHNlbGYudmFsaWRhdGVTY2hlbWEodmFsaWRhdGUsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoaW5saW5lKSB7XG4gICAgICB2YWxpZGF0ZSA9IGlubGluZS5jYWxsKHNlbGYsIGl0LCBydWxlLmtleXdvcmQsIHNjaGVtYSwgcGFyZW50U2NoZW1hKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGUgPSBydWxlLmRlZmluaXRpb24udmFsaWRhdGU7XG4gICAgICBpZiAoIXZhbGlkYXRlKSByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2N1c3RvbSBrZXl3b3JkIFwiJyArIHJ1bGUua2V5d29yZCArICdcImZhaWxlZCB0byBjb21waWxlJyk7XG5cbiAgICB2YXIgaW5kZXggPSBjdXN0b21SdWxlcy5sZW5ndGg7XG4gICAgY3VzdG9tUnVsZXNbaW5kZXhdID0gdmFsaWRhdGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogJ2N1c3RvbVJ1bGUnICsgaW5kZXgsXG4gICAgICB2YWxpZGF0ZTogdmFsaWRhdGVcbiAgICB9O1xuICB9XG59XG5cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHNjaGVtYSBpcyBjdXJyZW50bHkgY29tcGlsZWRcbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgdG8gY29tcGlsZVxuICogQHBhcmFtICB7T2JqZWN0fSByb290IHJvb3Qgb2JqZWN0XG4gKiBAcGFyYW0gIHtTdHJpbmd9IGJhc2VJZCBiYXNlIHNjaGVtYSBJRFxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIFwiaW5kZXhcIiAoY29tcGlsYXRpb24gaW5kZXgpIGFuZCBcImNvbXBpbGluZ1wiIChib29sZWFuKVxuICovXG5mdW5jdGlvbiBjaGVja0NvbXBpbGluZyhzY2hlbWEsIHJvb3QsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciBpbmRleCA9IGNvbXBJbmRleC5jYWxsKHRoaXMsIHNjaGVtYSwgcm9vdCwgYmFzZUlkKTtcbiAgaWYgKGluZGV4ID49IDApIHJldHVybiB7IGluZGV4OiBpbmRleCwgY29tcGlsaW5nOiB0cnVlIH07XG4gIGluZGV4ID0gdGhpcy5fY29tcGlsYXRpb25zLmxlbmd0aDtcbiAgdGhpcy5fY29tcGlsYXRpb25zW2luZGV4XSA9IHtcbiAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICByb290OiByb290LFxuICAgIGJhc2VJZDogYmFzZUlkXG4gIH07XG4gIHJldHVybiB7IGluZGV4OiBpbmRleCwgY29tcGlsaW5nOiBmYWxzZSB9O1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgc2NoZW1hIGZyb20gdGhlIGN1cnJlbnRseSBjb21waWxlZCBsaXN0XG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIGNvbXBpbGVcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdFxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBzY2hlbWEgSURcbiAqL1xuZnVuY3Rpb24gZW5kQ29tcGlsaW5nKHNjaGVtYSwgcm9vdCwgYmFzZUlkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIGkgPSBjb21wSW5kZXguY2FsbCh0aGlzLCBzY2hlbWEsIHJvb3QsIGJhc2VJZCk7XG4gIGlmIChpID49IDApIHRoaXMuX2NvbXBpbGF0aW9ucy5zcGxpY2UoaSwgMSk7XG59XG5cblxuLyoqXG4gKiBJbmRleCBvZiBzY2hlbWEgY29tcGlsYXRpb24gaW4gdGhlIGN1cnJlbnRseSBjb21waWxlZCBsaXN0XG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIGNvbXBpbGVcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdFxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBzY2hlbWEgSURcbiAqIEByZXR1cm4ge0ludGVnZXJ9IGNvbXBpbGF0aW9uIGluZGV4XG4gKi9cbmZ1bmN0aW9uIGNvbXBJbmRleChzY2hlbWEsIHJvb3QsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIGZvciAodmFyIGk9MDsgaTx0aGlzLl9jb21waWxhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYyA9IHRoaXMuX2NvbXBpbGF0aW9uc1tpXTtcbiAgICBpZiAoYy5zY2hlbWEgPT0gc2NoZW1hICYmIGMucm9vdCA9PSByb290ICYmIGMuYmFzZUlkID09IGJhc2VJZCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5cbmZ1bmN0aW9uIHBhdHRlcm5Db2RlKGksIHBhdHRlcm5zKSB7XG4gIHJldHVybiAndmFyIHBhdHRlcm4nICsgaSArICcgPSBuZXcgUmVnRXhwKCcgKyB1dGlsLnRvUXVvdGVkU3RyaW5nKHBhdHRlcm5zW2ldKSArICcpOyc7XG59XG5cblxuZnVuY3Rpb24gZGVmYXVsdENvZGUoaSkge1xuICByZXR1cm4gJ3ZhciBkZWZhdWx0JyArIGkgKyAnID0gZGVmYXVsdHNbJyArIGkgKyAnXTsnO1xufVxuXG5cbmZ1bmN0aW9uIHJlZlZhbENvZGUoaSwgcmVmVmFsKSB7XG4gIHJldHVybiByZWZWYWxbaV0gPT09IHVuZGVmaW5lZCA/ICcnIDogJ3ZhciByZWZWYWwnICsgaSArICcgPSByZWZWYWxbJyArIGkgKyAnXTsnO1xufVxuXG5cbmZ1bmN0aW9uIGN1c3RvbVJ1bGVDb2RlKGkpIHtcbiAgcmV0dXJuICd2YXIgY3VzdG9tUnVsZScgKyBpICsgJyA9IGN1c3RvbVJ1bGVzWycgKyBpICsgJ107Jztcbn1cblxuXG5mdW5jdGlvbiB2YXJzKGFyciwgc3RhdGVtZW50KSB7XG4gIGlmICghYXJyLmxlbmd0aCkgcmV0dXJuICcnO1xuICB2YXIgY29kZSA9ICcnO1xuICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKVxuICAgIGNvZGUgKz0gc3RhdGVtZW50KGksIGFycik7XG4gIHJldHVybiBjb2RlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVVJJID0gcmVxdWlyZSgndXJpLWpzJylcbiAgLCBlcXVhbCA9IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpXG4gICwgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG4gICwgU2NoZW1hT2JqZWN0ID0gcmVxdWlyZSgnLi9zY2hlbWFfb2JqJylcbiAgLCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ2pzb24tc2NoZW1hLXRyYXZlcnNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZTtcblxucmVzb2x2ZS5ub3JtYWxpemVJZCA9IG5vcm1hbGl6ZUlkO1xucmVzb2x2ZS5mdWxsUGF0aCA9IGdldEZ1bGxQYXRoO1xucmVzb2x2ZS51cmwgPSByZXNvbHZlVXJsO1xucmVzb2x2ZS5pZHMgPSByZXNvbHZlSWRzO1xucmVzb2x2ZS5pbmxpbmVSZWYgPSBpbmxpbmVSZWY7XG5yZXNvbHZlLnNjaGVtYSA9IHJlc29sdmVTY2hlbWE7XG5cbi8qKlxuICogW3Jlc29sdmUgYW5kIGNvbXBpbGUgdGhlIHJlZmVyZW5jZXMgKCRyZWYpXVxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjb21waWxlIHJlZmVyZW5jZSB0byBzY2hlbWEgY29tcGlsYXRpb24gZnVuY2l0b24gKGxvY2FsQ29tcGlsZSlcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9vdCBzY2hlbWEgZm9yIHRoZSBjdXJyZW50IHNjaGVtYVxuICogQHBhcmFtICB7U3RyaW5nfSByZWYgcmVmZXJlbmNlIHRvIHJlc29sdmVcbiAqIEByZXR1cm4ge09iamVjdHxGdW5jdGlvbn0gc2NoZW1hIG9iamVjdCAoaWYgdGhlIHNjaGVtYSBjYW4gYmUgaW5saW5lZCkgb3IgdmFsaWRhdGlvbiBmdW5jdGlvblxuICovXG5mdW5jdGlvbiByZXNvbHZlKGNvbXBpbGUsIHJvb3QsIHJlZikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciByZWZWYWwgPSB0aGlzLl9yZWZzW3JlZl07XG4gIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHRoaXMuX3JlZnNbcmVmVmFsXSkgcmVmVmFsID0gdGhpcy5fcmVmc1tyZWZWYWxdO1xuICAgIGVsc2UgcmV0dXJuIHJlc29sdmUuY2FsbCh0aGlzLCBjb21waWxlLCByb290LCByZWZWYWwpO1xuICB9XG5cbiAgcmVmVmFsID0gcmVmVmFsIHx8IHRoaXMuX3NjaGVtYXNbcmVmXTtcbiAgaWYgKHJlZlZhbCBpbnN0YW5jZW9mIFNjaGVtYU9iamVjdCkge1xuICAgIHJldHVybiBpbmxpbmVSZWYocmVmVmFsLnNjaGVtYSwgdGhpcy5fb3B0cy5pbmxpbmVSZWZzKVxuICAgICAgICAgICAgPyByZWZWYWwuc2NoZW1hXG4gICAgICAgICAgICA6IHJlZlZhbC52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlKHJlZlZhbCk7XG4gIH1cblxuICB2YXIgcmVzID0gcmVzb2x2ZVNjaGVtYS5jYWxsKHRoaXMsIHJvb3QsIHJlZik7XG4gIHZhciBzY2hlbWEsIHYsIGJhc2VJZDtcbiAgaWYgKHJlcykge1xuICAgIHNjaGVtYSA9IHJlcy5zY2hlbWE7XG4gICAgcm9vdCA9IHJlcy5yb290O1xuICAgIGJhc2VJZCA9IHJlcy5iYXNlSWQ7XG4gIH1cblxuICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hT2JqZWN0KSB7XG4gICAgdiA9IHNjaGVtYS52YWxpZGF0ZSB8fCBjb21waWxlLmNhbGwodGhpcywgc2NoZW1hLnNjaGVtYSwgcm9vdCwgdW5kZWZpbmVkLCBiYXNlSWQpO1xuICB9IGVsc2UgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdiA9IGlubGluZVJlZihzY2hlbWEsIHRoaXMuX29wdHMuaW5saW5lUmVmcylcbiAgICAgICAgPyBzY2hlbWFcbiAgICAgICAgOiBjb21waWxlLmNhbGwodGhpcywgc2NoZW1hLCByb290LCB1bmRlZmluZWQsIGJhc2VJZCk7XG4gIH1cblxuICByZXR1cm4gdjtcbn1cblxuXG4vKipcbiAqIFJlc29sdmUgc2NoZW1hLCBpdHMgcm9vdCBhbmQgYmFzZUlkXG4gKiBAdGhpcyBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgc2NoZW1hLCByZWZWYWwsIHJlZnNcbiAqIEBwYXJhbSAge1N0cmluZ30gcmVmICByZWZlcmVuY2UgdG8gcmVzb2x2ZVxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHNjaGVtYSwgcm9vdCwgYmFzZUlkXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY2hlbWEocm9vdCwgcmVmKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHAgPSBVUkkucGFyc2UocmVmKVxuICAgICwgcmVmUGF0aCA9IF9nZXRGdWxsUGF0aChwKVxuICAgICwgYmFzZUlkID0gZ2V0RnVsbFBhdGgodGhpcy5fZ2V0SWQocm9vdC5zY2hlbWEpKTtcbiAgaWYgKE9iamVjdC5rZXlzKHJvb3Quc2NoZW1hKS5sZW5ndGggPT09IDAgfHwgcmVmUGF0aCAhPT0gYmFzZUlkKSB7XG4gICAgdmFyIGlkID0gbm9ybWFsaXplSWQocmVmUGF0aCk7XG4gICAgdmFyIHJlZlZhbCA9IHRoaXMuX3JlZnNbaWRdO1xuICAgIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZVJlY3Vyc2l2ZS5jYWxsKHRoaXMsIHJvb3QsIHJlZlZhbCwgcCk7XG4gICAgfSBlbHNlIGlmIChyZWZWYWwgaW5zdGFuY2VvZiBTY2hlbWFPYmplY3QpIHtcbiAgICAgIGlmICghcmVmVmFsLnZhbGlkYXRlKSB0aGlzLl9jb21waWxlKHJlZlZhbCk7XG4gICAgICByb290ID0gcmVmVmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZWYWwgPSB0aGlzLl9zY2hlbWFzW2lkXTtcbiAgICAgIGlmIChyZWZWYWwgaW5zdGFuY2VvZiBTY2hlbWFPYmplY3QpIHtcbiAgICAgICAgaWYgKCFyZWZWYWwudmFsaWRhdGUpIHRoaXMuX2NvbXBpbGUocmVmVmFsKTtcbiAgICAgICAgaWYgKGlkID09IG5vcm1hbGl6ZUlkKHJlZikpXG4gICAgICAgICAgcmV0dXJuIHsgc2NoZW1hOiByZWZWYWwsIHJvb3Q6IHJvb3QsIGJhc2VJZDogYmFzZUlkIH07XG4gICAgICAgIHJvb3QgPSByZWZWYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcm9vdC5zY2hlbWEpIHJldHVybjtcbiAgICBiYXNlSWQgPSBnZXRGdWxsUGF0aCh0aGlzLl9nZXRJZChyb290LnNjaGVtYSkpO1xuICB9XG4gIHJldHVybiBnZXRKc29uUG9pbnRlci5jYWxsKHRoaXMsIHAsIGJhc2VJZCwgcm9vdC5zY2hlbWEsIHJvb3QpO1xufVxuXG5cbi8qIEB0aGlzIEFqdiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlY3Vyc2l2ZShyb290LCByZWYsIHBhcnNlZFJlZikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciByZXMgPSByZXNvbHZlU2NoZW1hLmNhbGwodGhpcywgcm9vdCwgcmVmKTtcbiAgaWYgKHJlcykge1xuICAgIHZhciBzY2hlbWEgPSByZXMuc2NoZW1hO1xuICAgIHZhciBiYXNlSWQgPSByZXMuYmFzZUlkO1xuICAgIHJvb3QgPSByZXMucm9vdDtcbiAgICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWEpO1xuICAgIGlmIChpZCkgYmFzZUlkID0gcmVzb2x2ZVVybChiYXNlSWQsIGlkKTtcbiAgICByZXR1cm4gZ2V0SnNvblBvaW50ZXIuY2FsbCh0aGlzLCBwYXJzZWRSZWYsIGJhc2VJZCwgc2NoZW1hLCByb290KTtcbiAgfVxufVxuXG5cbnZhciBQUkVWRU5UX1NDT1BFX0NIQU5HRSA9IHV0aWwudG9IYXNoKFsncHJvcGVydGllcycsICdwYXR0ZXJuUHJvcGVydGllcycsICdlbnVtJywgJ2RlcGVuZGVuY2llcycsICdkZWZpbml0aW9ucyddKTtcbi8qIEB0aGlzIEFqdiAqL1xuZnVuY3Rpb24gZ2V0SnNvblBvaW50ZXIocGFyc2VkUmVmLCBiYXNlSWQsIHNjaGVtYSwgcm9vdCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHBhcnNlZFJlZi5mcmFnbWVudCA9IHBhcnNlZFJlZi5mcmFnbWVudCB8fCAnJztcbiAgaWYgKHBhcnNlZFJlZi5mcmFnbWVudC5zbGljZSgwLDEpICE9ICcvJykgcmV0dXJuO1xuICB2YXIgcGFydHMgPSBwYXJzZWRSZWYuZnJhZ21lbnQuc3BsaXQoJy8nKTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAocGFydCkge1xuICAgICAgcGFydCA9IHV0aWwudW5lc2NhcGVGcmFnbWVudChwYXJ0KTtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYVtwYXJ0XTtcbiAgICAgIGlmIChzY2hlbWEgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICB2YXIgaWQ7XG4gICAgICBpZiAoIVBSRVZFTlRfU0NPUEVfQ0hBTkdFW3BhcnRdKSB7XG4gICAgICAgIGlkID0gdGhpcy5fZ2V0SWQoc2NoZW1hKTtcbiAgICAgICAgaWYgKGlkKSBiYXNlSWQgPSByZXNvbHZlVXJsKGJhc2VJZCwgaWQpO1xuICAgICAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgICAgICB2YXIgJHJlZiA9IHJlc29sdmVVcmwoYmFzZUlkLCBzY2hlbWEuJHJlZik7XG4gICAgICAgICAgdmFyIHJlcyA9IHJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLCByb290LCAkcmVmKTtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBzY2hlbWEgPSByZXMuc2NoZW1hO1xuICAgICAgICAgICAgcm9vdCA9IHJlcy5yb290O1xuICAgICAgICAgICAgYmFzZUlkID0gcmVzLmJhc2VJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYSAhPT0gcm9vdC5zY2hlbWEpXG4gICAgcmV0dXJuIHsgc2NoZW1hOiBzY2hlbWEsIHJvb3Q6IHJvb3QsIGJhc2VJZDogYmFzZUlkIH07XG59XG5cblxudmFyIFNJTVBMRV9JTkxJTkVEID0gdXRpbC50b0hhc2goW1xuICAndHlwZScsICdmb3JtYXQnLCAncGF0dGVybicsXG4gICdtYXhMZW5ndGgnLCAnbWluTGVuZ3RoJyxcbiAgJ21heFByb3BlcnRpZXMnLCAnbWluUHJvcGVydGllcycsXG4gICdtYXhJdGVtcycsICdtaW5JdGVtcycsXG4gICdtYXhpbXVtJywgJ21pbmltdW0nLFxuICAndW5pcXVlSXRlbXMnLCAnbXVsdGlwbGVPZicsXG4gICdyZXF1aXJlZCcsICdlbnVtJ1xuXSk7XG5mdW5jdGlvbiBpbmxpbmVSZWYoc2NoZW1hLCBsaW1pdCkge1xuICBpZiAobGltaXQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkIHx8IGxpbWl0ID09PSB0cnVlKSByZXR1cm4gY2hlY2tOb1JlZihzY2hlbWEpO1xuICBlbHNlIGlmIChsaW1pdCkgcmV0dXJuIGNvdW50S2V5cyhzY2hlbWEpIDw9IGxpbWl0O1xufVxuXG5cbmZ1bmN0aW9uIGNoZWNrTm9SZWYoc2NoZW1hKSB7XG4gIHZhciBpdGVtO1xuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgZm9yICh2YXIgaT0wOyBpPHNjaGVtYS5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PSAnb2JqZWN0JyAmJiAhY2hlY2tOb1JlZihpdGVtKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICBpZiAoa2V5ID09ICckcmVmJykgcmV0dXJuIGZhbHNlO1xuICAgICAgaXRlbSA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdvYmplY3QnICYmICFjaGVja05vUmVmKGl0ZW0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIGNvdW50S2V5cyhzY2hlbWEpIHtcbiAgdmFyIGNvdW50ID0gMCwgaXRlbTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGZvciAodmFyIGk9MDsgaTxzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBzY2hlbWFbaV07XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gJ29iamVjdCcpIGNvdW50ICs9IGNvdW50S2V5cyhpdGVtKTtcbiAgICAgIGlmIChjb3VudCA9PSBJbmZpbml0eSkgcmV0dXJuIEluZmluaXR5O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICBpZiAoa2V5ID09ICckcmVmJykgcmV0dXJuIEluZmluaXR5O1xuICAgICAgaWYgKFNJTVBMRV9JTkxJTkVEW2tleV0pIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0gPSBzY2hlbWFba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdvYmplY3QnKSBjb3VudCArPSBjb3VudEtleXMoaXRlbSkgKyAxO1xuICAgICAgICBpZiAoY291bnQgPT0gSW5maW5pdHkpIHJldHVybiBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvdW50O1xufVxuXG5cbmZ1bmN0aW9uIGdldEZ1bGxQYXRoKGlkLCBub3JtYWxpemUpIHtcbiAgaWYgKG5vcm1hbGl6ZSAhPT0gZmFsc2UpIGlkID0gbm9ybWFsaXplSWQoaWQpO1xuICB2YXIgcCA9IFVSSS5wYXJzZShpZCk7XG4gIHJldHVybiBfZ2V0RnVsbFBhdGgocCk7XG59XG5cblxuZnVuY3Rpb24gX2dldEZ1bGxQYXRoKHApIHtcbiAgcmV0dXJuIFVSSS5zZXJpYWxpemUocCkuc3BsaXQoJyMnKVswXSArICcjJztcbn1cblxuXG52YXIgVFJBSUxJTkdfU0xBU0hfSEFTSCA9IC8jXFwvPyQvO1xuZnVuY3Rpb24gbm9ybWFsaXplSWQoaWQpIHtcbiAgcmV0dXJuIGlkID8gaWQucmVwbGFjZShUUkFJTElOR19TTEFTSF9IQVNILCAnJykgOiAnJztcbn1cblxuXG5mdW5jdGlvbiByZXNvbHZlVXJsKGJhc2VJZCwgaWQpIHtcbiAgaWQgPSBub3JtYWxpemVJZChpZCk7XG4gIHJldHVybiBVUkkucmVzb2x2ZShiYXNlSWQsIGlkKTtcbn1cblxuXG4vKiBAdGhpcyBBanYgKi9cbmZ1bmN0aW9uIHJlc29sdmVJZHMoc2NoZW1hKSB7XG4gIHZhciBzY2hlbWFJZCA9IG5vcm1hbGl6ZUlkKHRoaXMuX2dldElkKHNjaGVtYSkpO1xuICB2YXIgYmFzZUlkcyA9IHsnJzogc2NoZW1hSWR9O1xuICB2YXIgZnVsbFBhdGhzID0geycnOiBnZXRGdWxsUGF0aChzY2hlbWFJZCwgZmFsc2UpfTtcbiAgdmFyIGxvY2FsUmVmcyA9IHt9O1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdHJhdmVyc2Uoc2NoZW1hLCB7YWxsS2V5czogdHJ1ZX0sIGZ1bmN0aW9uKHNjaCwganNvblB0ciwgcm9vdFNjaGVtYSwgcGFyZW50SnNvblB0ciwgcGFyZW50S2V5d29yZCwgcGFyZW50U2NoZW1hLCBrZXlJbmRleCkge1xuICAgIGlmIChqc29uUHRyID09PSAnJykgcmV0dXJuO1xuICAgIHZhciBpZCA9IHNlbGYuX2dldElkKHNjaCk7XG4gICAgdmFyIGJhc2VJZCA9IGJhc2VJZHNbcGFyZW50SnNvblB0cl07XG4gICAgdmFyIGZ1bGxQYXRoID0gZnVsbFBhdGhzW3BhcmVudEpzb25QdHJdICsgJy8nICsgcGFyZW50S2V5d29yZDtcbiAgICBpZiAoa2V5SW5kZXggIT09IHVuZGVmaW5lZClcbiAgICAgIGZ1bGxQYXRoICs9ICcvJyArICh0eXBlb2Yga2V5SW5kZXggPT0gJ251bWJlcicgPyBrZXlJbmRleCA6IHV0aWwuZXNjYXBlRnJhZ21lbnQoa2V5SW5kZXgpKTtcblxuICAgIGlmICh0eXBlb2YgaWQgPT0gJ3N0cmluZycpIHtcbiAgICAgIGlkID0gYmFzZUlkID0gbm9ybWFsaXplSWQoYmFzZUlkID8gVVJJLnJlc29sdmUoYmFzZUlkLCBpZCkgOiBpZCk7XG5cbiAgICAgIHZhciByZWZWYWwgPSBzZWxmLl9yZWZzW2lkXTtcbiAgICAgIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSByZWZWYWwgPSBzZWxmLl9yZWZzW3JlZlZhbF07XG4gICAgICBpZiAocmVmVmFsICYmIHJlZlZhbC5zY2hlbWEpIHtcbiAgICAgICAgaWYgKCFlcXVhbChzY2gsIHJlZlZhbC5zY2hlbWEpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaWQgXCInICsgaWQgKyAnXCIgcmVzb2x2ZXMgdG8gbW9yZSB0aGFuIG9uZSBzY2hlbWEnKTtcbiAgICAgIH0gZWxzZSBpZiAoaWQgIT0gbm9ybWFsaXplSWQoZnVsbFBhdGgpKSB7XG4gICAgICAgIGlmIChpZFswXSA9PSAnIycpIHtcbiAgICAgICAgICBpZiAobG9jYWxSZWZzW2lkXSAmJiAhZXF1YWwoc2NoLCBsb2NhbFJlZnNbaWRdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaWQgXCInICsgaWQgKyAnXCIgcmVzb2x2ZXMgdG8gbW9yZSB0aGFuIG9uZSBzY2hlbWEnKTtcbiAgICAgICAgICBsb2NhbFJlZnNbaWRdID0gc2NoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuX3JlZnNbaWRdID0gZnVsbFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYmFzZUlkc1tqc29uUHRyXSA9IGJhc2VJZDtcbiAgICBmdWxsUGF0aHNbanNvblB0cl0gPSBmdWxsUGF0aDtcbiAgfSk7XG5cbiAgcmV0dXJuIGxvY2FsUmVmcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJ1bGVNb2R1bGVzID0gcmVxdWlyZSgnLi4vZG90anMnKVxuICAsIHRvSGFzaCA9IHJlcXVpcmUoJy4vdXRpbCcpLnRvSGFzaDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBydWxlcygpIHtcbiAgdmFyIFJVTEVTID0gW1xuICAgIHsgdHlwZTogJ251bWJlcicsXG4gICAgICBydWxlczogWyB7ICdtYXhpbXVtJzogWydleGNsdXNpdmVNYXhpbXVtJ10gfSxcbiAgICAgICAgICAgICAgIHsgJ21pbmltdW0nOiBbJ2V4Y2x1c2l2ZU1pbmltdW0nXSB9LCAnbXVsdGlwbGVPZicsICdmb3JtYXQnXSB9LFxuICAgIHsgdHlwZTogJ3N0cmluZycsXG4gICAgICBydWxlczogWyAnbWF4TGVuZ3RoJywgJ21pbkxlbmd0aCcsICdwYXR0ZXJuJywgJ2Zvcm1hdCcgXSB9LFxuICAgIHsgdHlwZTogJ2FycmF5JyxcbiAgICAgIHJ1bGVzOiBbICdtYXhJdGVtcycsICdtaW5JdGVtcycsICdpdGVtcycsICdjb250YWlucycsICd1bmlxdWVJdGVtcycgXSB9LFxuICAgIHsgdHlwZTogJ29iamVjdCcsXG4gICAgICBydWxlczogWyAnbWF4UHJvcGVydGllcycsICdtaW5Qcm9wZXJ0aWVzJywgJ3JlcXVpcmVkJywgJ2RlcGVuZGVuY2llcycsICdwcm9wZXJ0eU5hbWVzJyxcbiAgICAgICAgICAgICAgIHsgJ3Byb3BlcnRpZXMnOiBbJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJywgJ3BhdHRlcm5Qcm9wZXJ0aWVzJ10gfSBdIH0sXG4gICAgeyBydWxlczogWyAnJHJlZicsICdjb25zdCcsICdlbnVtJywgJ25vdCcsICdhbnlPZicsICdvbmVPZicsICdhbGxPZicsICdpZicgXSB9XG4gIF07XG5cbiAgdmFyIEFMTCA9IFsgJ3R5cGUnLCAnJGNvbW1lbnQnIF07XG4gIHZhciBLRVlXT1JEUyA9IFtcbiAgICAnJHNjaGVtYScsICckaWQnLCAnaWQnLCAnJGRhdGEnLCAnJGFzeW5jJywgJ3RpdGxlJyxcbiAgICAnZGVzY3JpcHRpb24nLCAnZGVmYXVsdCcsICdkZWZpbml0aW9ucycsXG4gICAgJ2V4YW1wbGVzJywgJ3JlYWRPbmx5JywgJ3dyaXRlT25seScsXG4gICAgJ2NvbnRlbnRNZWRpYVR5cGUnLCAnY29udGVudEVuY29kaW5nJyxcbiAgICAnYWRkaXRpb25hbEl0ZW1zJywgJ3RoZW4nLCAnZWxzZSdcbiAgXTtcbiAgdmFyIFRZUEVTID0gWyAnbnVtYmVyJywgJ2ludGVnZXInLCAnc3RyaW5nJywgJ2FycmF5JywgJ29iamVjdCcsICdib29sZWFuJywgJ251bGwnIF07XG4gIFJVTEVTLmFsbCA9IHRvSGFzaChBTEwpO1xuICBSVUxFUy50eXBlcyA9IHRvSGFzaChUWVBFUyk7XG5cbiAgUlVMRVMuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICBncm91cC5ydWxlcyA9IGdyb3VwLnJ1bGVzLm1hcChmdW5jdGlvbiAoa2V5d29yZCkge1xuICAgICAgdmFyIGltcGxLZXl3b3JkcztcbiAgICAgIGlmICh0eXBlb2Yga2V5d29yZCA9PSAnb2JqZWN0Jykge1xuICAgICAgICB2YXIga2V5ID0gT2JqZWN0LmtleXMoa2V5d29yZClbMF07XG4gICAgICAgIGltcGxLZXl3b3JkcyA9IGtleXdvcmRba2V5XTtcbiAgICAgICAga2V5d29yZCA9IGtleTtcbiAgICAgICAgaW1wbEtleXdvcmRzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICBBTEwucHVzaChrKTtcbiAgICAgICAgICBSVUxFUy5hbGxba10gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIEFMTC5wdXNoKGtleXdvcmQpO1xuICAgICAgdmFyIHJ1bGUgPSBSVUxFUy5hbGxba2V5d29yZF0gPSB7XG4gICAgICAgIGtleXdvcmQ6IGtleXdvcmQsXG4gICAgICAgIGNvZGU6IHJ1bGVNb2R1bGVzW2tleXdvcmRdLFxuICAgICAgICBpbXBsZW1lbnRzOiBpbXBsS2V5d29yZHNcbiAgICAgIH07XG4gICAgICByZXR1cm4gcnVsZTtcbiAgICB9KTtcblxuICAgIFJVTEVTLmFsbC4kY29tbWVudCA9IHtcbiAgICAgIGtleXdvcmQ6ICckY29tbWVudCcsXG4gICAgICBjb2RlOiBydWxlTW9kdWxlcy4kY29tbWVudFxuICAgIH07XG5cbiAgICBpZiAoZ3JvdXAudHlwZSkgUlVMRVMudHlwZXNbZ3JvdXAudHlwZV0gPSBncm91cDtcbiAgfSk7XG5cbiAgUlVMRVMua2V5d29yZHMgPSB0b0hhc2goQUxMLmNvbmNhdChLRVlXT1JEUykpO1xuICBSVUxFUy5jdXN0b20gPSB7fTtcblxuICByZXR1cm4gUlVMRVM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYU9iamVjdDtcblxuZnVuY3Rpb24gU2NoZW1hT2JqZWN0KG9iaikge1xuICB1dGlsLmNvcHkob2JqLCB0aGlzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmdcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcyAtIHB1bnljb2RlLnVjczIuZGVjb2RlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHVjczJsZW5ndGgoc3RyKSB7XG4gIHZhciBsZW5ndGggPSAwXG4gICAgLCBsZW4gPSBzdHIubGVuZ3RoXG4gICAgLCBwb3MgPSAwXG4gICAgLCB2YWx1ZTtcbiAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgIGxlbmd0aCsrO1xuICAgIHZhbHVlID0gc3RyLmNoYXJDb2RlQXQocG9zKyspO1xuICAgIGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIHBvcyA8IGxlbikge1xuICAgICAgLy8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG4gICAgICB2YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoKHZhbHVlICYgMHhGQzAwKSA9PSAweERDMDApIHBvcysrOyAvLyBsb3cgc3Vycm9nYXRlXG4gICAgfVxuICB9XG4gIHJldHVybiBsZW5ndGg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb3B5OiBjb3B5LFxuICBjaGVja0RhdGFUeXBlOiBjaGVja0RhdGFUeXBlLFxuICBjaGVja0RhdGFUeXBlczogY2hlY2tEYXRhVHlwZXMsXG4gIGNvZXJjZVRvVHlwZXM6IGNvZXJjZVRvVHlwZXMsXG4gIHRvSGFzaDogdG9IYXNoLFxuICBnZXRQcm9wZXJ0eTogZ2V0UHJvcGVydHksXG4gIGVzY2FwZVF1b3RlczogZXNjYXBlUXVvdGVzLFxuICBlcXVhbDogcmVxdWlyZSgnZmFzdC1kZWVwLWVxdWFsJyksXG4gIHVjczJsZW5ndGg6IHJlcXVpcmUoJy4vdWNzMmxlbmd0aCcpLFxuICB2YXJPY2N1cmVuY2VzOiB2YXJPY2N1cmVuY2VzLFxuICB2YXJSZXBsYWNlOiB2YXJSZXBsYWNlLFxuICBzY2hlbWFIYXNSdWxlczogc2NoZW1hSGFzUnVsZXMsXG4gIHNjaGVtYUhhc1J1bGVzRXhjZXB0OiBzY2hlbWFIYXNSdWxlc0V4Y2VwdCxcbiAgc2NoZW1hVW5rbm93blJ1bGVzOiBzY2hlbWFVbmtub3duUnVsZXMsXG4gIHRvUXVvdGVkU3RyaW5nOiB0b1F1b3RlZFN0cmluZyxcbiAgZ2V0UGF0aEV4cHI6IGdldFBhdGhFeHByLFxuICBnZXRQYXRoOiBnZXRQYXRoLFxuICBnZXREYXRhOiBnZXREYXRhLFxuICB1bmVzY2FwZUZyYWdtZW50OiB1bmVzY2FwZUZyYWdtZW50LFxuICB1bmVzY2FwZUpzb25Qb2ludGVyOiB1bmVzY2FwZUpzb25Qb2ludGVyLFxuICBlc2NhcGVGcmFnbWVudDogZXNjYXBlRnJhZ21lbnQsXG4gIGVzY2FwZUpzb25Qb2ludGVyOiBlc2NhcGVKc29uUG9pbnRlclxufTtcblxuXG5mdW5jdGlvbiBjb3B5KG8sIHRvKSB7XG4gIHRvID0gdG8gfHwge307XG4gIGZvciAodmFyIGtleSBpbiBvKSB0b1trZXldID0gb1trZXldO1xuICByZXR1cm4gdG87XG59XG5cblxuZnVuY3Rpb24gY2hlY2tEYXRhVHlwZShkYXRhVHlwZSwgZGF0YSwgc3RyaWN0TnVtYmVycywgbmVnYXRlKSB7XG4gIHZhciBFUVVBTCA9IG5lZ2F0ZSA/ICcgIT09ICcgOiAnID09PSAnXG4gICAgLCBBTkQgPSBuZWdhdGUgPyAnIHx8ICcgOiAnICYmICdcbiAgICAsIE9LID0gbmVnYXRlID8gJyEnIDogJydcbiAgICAsIE5PVCA9IG5lZ2F0ZSA/ICcnIDogJyEnO1xuICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgY2FzZSAnbnVsbCc6IHJldHVybiBkYXRhICsgRVFVQUwgKyAnbnVsbCc7XG4gICAgY2FzZSAnYXJyYXknOiByZXR1cm4gT0sgKyAnQXJyYXkuaXNBcnJheSgnICsgZGF0YSArICcpJztcbiAgICBjYXNlICdvYmplY3QnOiByZXR1cm4gJygnICsgT0sgKyBkYXRhICsgQU5EICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGVvZiAnICsgZGF0YSArIEVRVUFMICsgJ1wib2JqZWN0XCInICsgQU5EICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UICsgJ0FycmF5LmlzQXJyYXkoJyArIGRhdGEgKyAnKSknO1xuICAgIGNhc2UgJ2ludGVnZXInOiByZXR1cm4gJyh0eXBlb2YgJyArIGRhdGEgKyBFUVVBTCArICdcIm51bWJlclwiJyArIEFORCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBOT1QgKyAnKCcgKyBkYXRhICsgJyAlIDEpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgKyBkYXRhICsgRVFVQUwgKyBkYXRhICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpY3ROdW1iZXJzID8gKEFORCArIE9LICsgJ2lzRmluaXRlKCcgKyBkYXRhICsgJyknKSA6ICcnKSArICcpJztcbiAgICBjYXNlICdudW1iZXInOiByZXR1cm4gJyh0eXBlb2YgJyArIGRhdGEgKyBFUVVBTCArICdcIicgKyBkYXRhVHlwZSArICdcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaWN0TnVtYmVycyA/IChBTkQgKyBPSyArICdpc0Zpbml0ZSgnICsgZGF0YSArICcpJykgOiAnJykgKyAnKSc7XG4gICAgZGVmYXVsdDogcmV0dXJuICd0eXBlb2YgJyArIGRhdGEgKyBFUVVBTCArICdcIicgKyBkYXRhVHlwZSArICdcIic7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBjaGVja0RhdGFUeXBlcyhkYXRhVHlwZXMsIGRhdGEsIHN0cmljdE51bWJlcnMpIHtcbiAgc3dpdGNoIChkYXRhVHlwZXMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gY2hlY2tEYXRhVHlwZShkYXRhVHlwZXNbMF0sIGRhdGEsIHN0cmljdE51bWJlcnMsIHRydWUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgY29kZSA9ICcnO1xuICAgICAgdmFyIHR5cGVzID0gdG9IYXNoKGRhdGFUeXBlcyk7XG4gICAgICBpZiAodHlwZXMuYXJyYXkgJiYgdHlwZXMub2JqZWN0KSB7XG4gICAgICAgIGNvZGUgPSB0eXBlcy5udWxsID8gJygnOiAnKCEnICsgZGF0YSArICcgfHwgJztcbiAgICAgICAgY29kZSArPSAndHlwZW9mICcgKyBkYXRhICsgJyAhPT0gXCJvYmplY3RcIiknO1xuICAgICAgICBkZWxldGUgdHlwZXMubnVsbDtcbiAgICAgICAgZGVsZXRlIHR5cGVzLmFycmF5O1xuICAgICAgICBkZWxldGUgdHlwZXMub2JqZWN0O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVzLm51bWJlcikgZGVsZXRlIHR5cGVzLmludGVnZXI7XG4gICAgICBmb3IgKHZhciB0IGluIHR5cGVzKVxuICAgICAgICBjb2RlICs9IChjb2RlID8gJyAmJiAnIDogJycgKSArIGNoZWNrRGF0YVR5cGUodCwgZGF0YSwgc3RyaWN0TnVtYmVycywgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiBjb2RlO1xuICB9XG59XG5cblxudmFyIENPRVJDRV9UT19UWVBFUyA9IHRvSGFzaChbICdzdHJpbmcnLCAnbnVtYmVyJywgJ2ludGVnZXInLCAnYm9vbGVhbicsICdudWxsJyBdKTtcbmZ1bmN0aW9uIGNvZXJjZVRvVHlwZXMob3B0aW9uQ29lcmNlVHlwZXMsIGRhdGFUeXBlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhVHlwZXMpKSB7XG4gICAgdmFyIHR5cGVzID0gW107XG4gICAgZm9yICh2YXIgaT0wOyBpPGRhdGFUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHQgPSBkYXRhVHlwZXNbaV07XG4gICAgICBpZiAoQ09FUkNFX1RPX1RZUEVTW3RdKSB0eXBlc1t0eXBlcy5sZW5ndGhdID0gdDtcbiAgICAgIGVsc2UgaWYgKG9wdGlvbkNvZXJjZVR5cGVzID09PSAnYXJyYXknICYmIHQgPT09ICdhcnJheScpIHR5cGVzW3R5cGVzLmxlbmd0aF0gPSB0O1xuICAgIH1cbiAgICBpZiAodHlwZXMubGVuZ3RoKSByZXR1cm4gdHlwZXM7XG4gIH0gZWxzZSBpZiAoQ09FUkNFX1RPX1RZUEVTW2RhdGFUeXBlc10pIHtcbiAgICByZXR1cm4gW2RhdGFUeXBlc107XG4gIH0gZWxzZSBpZiAob3B0aW9uQ29lcmNlVHlwZXMgPT09ICdhcnJheScgJiYgZGF0YVR5cGVzID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIFsnYXJyYXknXTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHRvSGFzaChhcnIpIHtcbiAgdmFyIGhhc2ggPSB7fTtcbiAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgaGFzaFthcnJbaV1dID0gdHJ1ZTtcbiAgcmV0dXJuIGhhc2g7XG59XG5cblxudmFyIElERU5USUZJRVIgPSAvXlthLXokX11bYS16JF8wLTldKiQvaTtcbnZhciBTSU5HTEVfUVVPVEUgPSAvJ3xcXFxcL2c7XG5mdW5jdGlvbiBnZXRQcm9wZXJ0eShrZXkpIHtcbiAgcmV0dXJuIHR5cGVvZiBrZXkgPT0gJ251bWJlcidcbiAgICAgICAgICA/ICdbJyArIGtleSArICddJ1xuICAgICAgICAgIDogSURFTlRJRklFUi50ZXN0KGtleSlcbiAgICAgICAgICAgID8gJy4nICsga2V5XG4gICAgICAgICAgICA6IFwiWydcIiArIGVzY2FwZVF1b3RlcyhrZXkpICsgXCInXVwiO1xufVxuXG5cbmZ1bmN0aW9uIGVzY2FwZVF1b3RlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFNJTkdMRV9RVU9URSwgJ1xcXFwkJicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxyL2csICdcXFxccicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxmL2csICdcXFxcZicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpO1xufVxuXG5cbmZ1bmN0aW9uIHZhck9jY3VyZW5jZXMoc3RyLCBkYXRhVmFyKSB7XG4gIGRhdGFWYXIgKz0gJ1teMC05XSc7XG4gIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKG5ldyBSZWdFeHAoZGF0YVZhciwgJ2cnKSk7XG4gIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlcy5sZW5ndGggOiAwO1xufVxuXG5cbmZ1bmN0aW9uIHZhclJlcGxhY2Uoc3RyLCBkYXRhVmFyLCBleHByKSB7XG4gIGRhdGFWYXIgKz0gJyhbXjAtOV0pJztcbiAgZXhwciA9IGV4cHIucmVwbGFjZSgvXFwkL2csICckJCQkJyk7XG4gIHJldHVybiBzdHIucmVwbGFjZShuZXcgUmVnRXhwKGRhdGFWYXIsICdnJyksIGV4cHIgKyAnJDEnKTtcbn1cblxuXG5mdW5jdGlvbiBzY2hlbWFIYXNSdWxlcyhzY2hlbWEsIHJ1bGVzKSB7XG4gIGlmICh0eXBlb2Ygc2NoZW1hID09ICdib29sZWFuJykgcmV0dXJuICFzY2hlbWE7XG4gIGZvciAodmFyIGtleSBpbiBzY2hlbWEpIGlmIChydWxlc1trZXldKSByZXR1cm4gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiBzY2hlbWFIYXNSdWxlc0V4Y2VwdChzY2hlbWEsIHJ1bGVzLCBleGNlcHRLZXl3b3JkKSB7XG4gIGlmICh0eXBlb2Ygc2NoZW1hID09ICdib29sZWFuJykgcmV0dXJuICFzY2hlbWEgJiYgZXhjZXB0S2V5d29yZCAhPSAnbm90JztcbiAgZm9yICh2YXIga2V5IGluIHNjaGVtYSkgaWYgKGtleSAhPSBleGNlcHRLZXl3b3JkICYmIHJ1bGVzW2tleV0pIHJldHVybiB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIHNjaGVtYVVua25vd25SdWxlcyhzY2hlbWEsIHJ1bGVzKSB7XG4gIGlmICh0eXBlb2Ygc2NoZW1hID09ICdib29sZWFuJykgcmV0dXJuO1xuICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSBpZiAoIXJ1bGVzW2tleV0pIHJldHVybiBrZXk7XG59XG5cblxuZnVuY3Rpb24gdG9RdW90ZWRTdHJpbmcoc3RyKSB7XG4gIHJldHVybiAnXFwnJyArIGVzY2FwZVF1b3RlcyhzdHIpICsgJ1xcJyc7XG59XG5cblxuZnVuY3Rpb24gZ2V0UGF0aEV4cHIoY3VycmVudFBhdGgsIGV4cHIsIGpzb25Qb2ludGVycywgaXNOdW1iZXIpIHtcbiAgdmFyIHBhdGggPSBqc29uUG9pbnRlcnMgLy8gZmFsc2UgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICA/ICdcXCcvXFwnICsgJyArIGV4cHIgKyAoaXNOdW1iZXIgPyAnJyA6ICcucmVwbGFjZSgvfi9nLCBcXCd+MFxcJykucmVwbGFjZSgvXFxcXC8vZywgXFwnfjFcXCcpJylcbiAgICAgICAgICAgICAgOiAoaXNOdW1iZXIgPyAnXFwnW1xcJyArICcgKyBleHByICsgJyArIFxcJ11cXCcnIDogJ1xcJ1tcXFxcXFwnXFwnICsgJyArIGV4cHIgKyAnICsgXFwnXFxcXFxcJ11cXCcnKTtcbiAgcmV0dXJuIGpvaW5QYXRocyhjdXJyZW50UGF0aCwgcGF0aCk7XG59XG5cblxuZnVuY3Rpb24gZ2V0UGF0aChjdXJyZW50UGF0aCwgcHJvcCwganNvblBvaW50ZXJzKSB7XG4gIHZhciBwYXRoID0ganNvblBvaW50ZXJzIC8vIGZhbHNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgPyB0b1F1b3RlZFN0cmluZygnLycgKyBlc2NhcGVKc29uUG9pbnRlcihwcm9wKSlcbiAgICAgICAgICAgICAgOiB0b1F1b3RlZFN0cmluZyhnZXRQcm9wZXJ0eShwcm9wKSk7XG4gIHJldHVybiBqb2luUGF0aHMoY3VycmVudFBhdGgsIHBhdGgpO1xufVxuXG5cbnZhciBKU09OX1BPSU5URVIgPSAvXlxcLyg/Oltefl18fjB8fjEpKiQvO1xudmFyIFJFTEFUSVZFX0pTT05fUE9JTlRFUiA9IC9eKFswLTldKykoI3xcXC8oPzpbXn5dfH4wfH4xKSopPyQvO1xuZnVuY3Rpb24gZ2V0RGF0YSgkZGF0YSwgbHZsLCBwYXRocykge1xuICB2YXIgdXAsIGpzb25Qb2ludGVyLCBkYXRhLCBtYXRjaGVzO1xuICBpZiAoJGRhdGEgPT09ICcnKSByZXR1cm4gJ3Jvb3REYXRhJztcbiAgaWYgKCRkYXRhWzBdID09ICcvJykge1xuICAgIGlmICghSlNPTl9QT0lOVEVSLnRlc3QoJGRhdGEpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlNPTi1wb2ludGVyOiAnICsgJGRhdGEpO1xuICAgIGpzb25Qb2ludGVyID0gJGRhdGE7XG4gICAgZGF0YSA9ICdyb290RGF0YSc7XG4gIH0gZWxzZSB7XG4gICAgbWF0Y2hlcyA9ICRkYXRhLm1hdGNoKFJFTEFUSVZFX0pTT05fUE9JTlRFUik7XG4gICAgaWYgKCFtYXRjaGVzKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlNPTi1wb2ludGVyOiAnICsgJGRhdGEpO1xuICAgIHVwID0gK21hdGNoZXNbMV07XG4gICAganNvblBvaW50ZXIgPSBtYXRjaGVzWzJdO1xuICAgIGlmIChqc29uUG9pbnRlciA9PSAnIycpIHtcbiAgICAgIGlmICh1cCA+PSBsdmwpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eS9pbmRleCAnICsgdXAgKyAnIGxldmVscyB1cCwgY3VycmVudCBsZXZlbCBpcyAnICsgbHZsKTtcbiAgICAgIHJldHVybiBwYXRoc1tsdmwgLSB1cF07XG4gICAgfVxuXG4gICAgaWYgKHVwID4gbHZsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3MgZGF0YSAnICsgdXAgKyAnIGxldmVscyB1cCwgY3VycmVudCBsZXZlbCBpcyAnICsgbHZsKTtcbiAgICBkYXRhID0gJ2RhdGEnICsgKChsdmwgLSB1cCkgfHwgJycpO1xuICAgIGlmICghanNvblBvaW50ZXIpIHJldHVybiBkYXRhO1xuICB9XG5cbiAgdmFyIGV4cHIgPSBkYXRhO1xuICB2YXIgc2VnbWVudHMgPSBqc29uUG9pbnRlci5zcGxpdCgnLycpO1xuICBmb3IgKHZhciBpPTA7IGk8c2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgIGlmIChzZWdtZW50KSB7XG4gICAgICBkYXRhICs9IGdldFByb3BlcnR5KHVuZXNjYXBlSnNvblBvaW50ZXIoc2VnbWVudCkpO1xuICAgICAgZXhwciArPSAnICYmICcgKyBkYXRhO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhwcjtcbn1cblxuXG5mdW5jdGlvbiBqb2luUGF0aHMgKGEsIGIpIHtcbiAgaWYgKGEgPT0gJ1wiXCInKSByZXR1cm4gYjtcbiAgcmV0dXJuIChhICsgJyArICcgKyBiKS5yZXBsYWNlKC8oW15cXFxcXSknIFxcKyAnL2csICckMScpO1xufVxuXG5cbmZ1bmN0aW9uIHVuZXNjYXBlRnJhZ21lbnQoc3RyKSB7XG4gIHJldHVybiB1bmVzY2FwZUpzb25Qb2ludGVyKGRlY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbn1cblxuXG5mdW5jdGlvbiBlc2NhcGVGcmFnbWVudChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlc2NhcGVKc29uUG9pbnRlcihzdHIpKTtcbn1cblxuXG5mdW5jdGlvbiBlc2NhcGVKc29uUG9pbnRlcihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9+L2csICd+MCcpLnJlcGxhY2UoL1xcLy9nLCAnfjEnKTtcbn1cblxuXG5mdW5jdGlvbiB1bmVzY2FwZUpzb25Qb2ludGVyKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL34xL2csICcvJykucmVwbGFjZSgvfjAvZywgJ34nKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEtFWVdPUkRTID0gW1xuICAnbXVsdGlwbGVPZicsXG4gICdtYXhpbXVtJyxcbiAgJ2V4Y2x1c2l2ZU1heGltdW0nLFxuICAnbWluaW11bScsXG4gICdleGNsdXNpdmVNaW5pbXVtJyxcbiAgJ21heExlbmd0aCcsXG4gICdtaW5MZW5ndGgnLFxuICAncGF0dGVybicsXG4gICdhZGRpdGlvbmFsSXRlbXMnLFxuICAnbWF4SXRlbXMnLFxuICAnbWluSXRlbXMnLFxuICAndW5pcXVlSXRlbXMnLFxuICAnbWF4UHJvcGVydGllcycsXG4gICdtaW5Qcm9wZXJ0aWVzJyxcbiAgJ3JlcXVpcmVkJyxcbiAgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgJ2VudW0nLFxuICAnZm9ybWF0JyxcbiAgJ2NvbnN0J1xuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0YVNjaGVtYSwga2V5d29yZHNKc29uUG9pbnRlcnMpIHtcbiAgZm9yICh2YXIgaT0wOyBpPGtleXdvcmRzSnNvblBvaW50ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbWV0YVNjaGVtYSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWV0YVNjaGVtYSkpO1xuICAgIHZhciBzZWdtZW50cyA9IGtleXdvcmRzSnNvblBvaW50ZXJzW2ldLnNwbGl0KCcvJyk7XG4gICAgdmFyIGtleXdvcmRzID0gbWV0YVNjaGVtYTtcbiAgICB2YXIgajtcbiAgICBmb3IgKGo9MTsgajxzZWdtZW50cy5sZW5ndGg7IGorKylcbiAgICAgIGtleXdvcmRzID0ga2V5d29yZHNbc2VnbWVudHNbal1dO1xuXG4gICAgZm9yIChqPTA7IGo8S0VZV09SRFMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrZXkgPSBLRVlXT1JEU1tqXTtcbiAgICAgIHZhciBzY2hlbWEgPSBrZXl3b3Jkc1trZXldO1xuICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICBrZXl3b3Jkc1trZXldID0ge1xuICAgICAgICAgIGFueU9mOiBbXG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICB7ICRyZWY6ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWp2LXZhbGlkYXRvci9hanYvbWFzdGVyL2xpYi9yZWZzL2RhdGEuanNvbiMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1ldGFTY2hlbWE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWV0YVNjaGVtYSA9IHJlcXVpcmUoJy4vcmVmcy9qc29uLXNjaGVtYS1kcmFmdC0wNy5qc29uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAkaWQ6ICdodHRwczovL2dpdGh1Yi5jb20vYWp2LXZhbGlkYXRvci9hanYvYmxvYi9tYXN0ZXIvbGliL2RlZmluaXRpb25fc2NoZW1hLmpzJyxcbiAgZGVmaW5pdGlvbnM6IHtcbiAgICBzaW1wbGVUeXBlczogbWV0YVNjaGVtYS5kZWZpbml0aW9ucy5zaW1wbGVUeXBlc1xuICB9LFxuICB0eXBlOiAnb2JqZWN0JyxcbiAgZGVwZW5kZW5jaWVzOiB7XG4gICAgc2NoZW1hOiBbJ3ZhbGlkYXRlJ10sXG4gICAgJGRhdGE6IFsndmFsaWRhdGUnXSxcbiAgICBzdGF0ZW1lbnRzOiBbJ2lubGluZSddLFxuICAgIHZhbGlkOiB7bm90OiB7cmVxdWlyZWQ6IFsnbWFjcm8nXX19XG4gIH0sXG4gIHByb3BlcnRpZXM6IHtcbiAgICB0eXBlOiBtZXRhU2NoZW1hLnByb3BlcnRpZXMudHlwZSxcbiAgICBzY2hlbWE6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIHN0YXRlbWVudHM6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIGRlcGVuZGVuY2llczoge1xuICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgIGl0ZW1zOiB7dHlwZTogJ3N0cmluZyd9XG4gICAgfSxcbiAgICBtZXRhU2NoZW1hOiB7dHlwZTogJ29iamVjdCd9LFxuICAgIG1vZGlmeWluZzoge3R5cGU6ICdib29sZWFuJ30sXG4gICAgdmFsaWQ6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgICRkYXRhOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICBhc3luYzoge3R5cGU6ICdib29sZWFuJ30sXG4gICAgZXJyb3JzOiB7XG4gICAgICBhbnlPZjogW1xuICAgICAgICB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICAgICAge2NvbnN0OiAnZnVsbCd9XG4gICAgICBdXG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9fbGltaXQoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICB2YXIgJGlzTWF4ID0gJGtleXdvcmQgPT0gJ21heGltdW0nLFxuICAgICRleGNsdXNpdmVLZXl3b3JkID0gJGlzTWF4ID8gJ2V4Y2x1c2l2ZU1heGltdW0nIDogJ2V4Y2x1c2l2ZU1pbmltdW0nLFxuICAgICRzY2hlbWFFeGNsID0gaXQuc2NoZW1hWyRleGNsdXNpdmVLZXl3b3JkXSxcbiAgICAkaXNEYXRhRXhjbCA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYUV4Y2wgJiYgJHNjaGVtYUV4Y2wuJGRhdGEsXG4gICAgJG9wID0gJGlzTWF4ID8gJzwnIDogJz4nLFxuICAgICRub3RPcCA9ICRpc01heCA/ICc+JyA6ICc8JyxcbiAgICAkZXJyb3JLZXl3b3JkID0gdW5kZWZpbmVkO1xuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInIHx8ICRzY2hlbWEgPT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJGtleXdvcmQgKyAnIG11c3QgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCEoJGlzRGF0YUV4Y2wgfHwgJHNjaGVtYUV4Y2wgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgJHNjaGVtYUV4Y2wgPT0gJ251bWJlcicgfHwgdHlwZW9mICRzY2hlbWFFeGNsID09ICdib29sZWFuJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJGV4Y2x1c2l2ZUtleXdvcmQgKyAnIG11c3QgYmUgbnVtYmVyIG9yIGJvb2xlYW4nKTtcbiAgfVxuICBpZiAoJGlzRGF0YUV4Y2wpIHtcbiAgICB2YXIgJHNjaGVtYVZhbHVlRXhjbCA9IGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hRXhjbC4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSxcbiAgICAgICRleGNsdXNpdmUgPSAnZXhjbHVzaXZlJyArICRsdmwsXG4gICAgICAkZXhjbFR5cGUgPSAnZXhjbFR5cGUnICsgJGx2bCxcbiAgICAgICRleGNsSXNOdW1iZXIgPSAnZXhjbElzTnVtYmVyJyArICRsdmwsXG4gICAgICAkb3BFeHByID0gJ29wJyArICRsdmwsXG4gICAgICAkb3BTdHIgPSAnXFwnICsgJyArICRvcEV4cHIgKyAnICsgXFwnJztcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hRXhjbCcgKyAoJGx2bCkgKyAnID0gJyArICgkc2NoZW1hVmFsdWVFeGNsKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlRXhjbCA9ICdzY2hlbWFFeGNsJyArICRsdmw7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJGV4Y2x1c2l2ZSkgKyAnOyB2YXIgJyArICgkZXhjbFR5cGUpICsgJyA9IHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJzsgaWYgKCcgKyAoJGV4Y2xUeXBlKSArICcgIT0gXFwnYm9vbGVhblxcJyAmJiAnICsgKCRleGNsVHlwZSkgKyAnICE9IFxcJ3VuZGVmaW5lZFxcJyAmJiAnICsgKCRleGNsVHlwZSkgKyAnICE9IFxcJ251bWJlclxcJykgeyAnO1xuICAgIHZhciAkZXJyb3JLZXl3b3JkID0gJGV4Y2x1c2l2ZUtleXdvcmQ7XG4gICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnX2V4Y2x1c2l2ZUxpbWl0JykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczoge30gJztcbiAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJycgKyAoJGV4Y2x1c2l2ZUtleXdvcmQpICsgJyBzaG91bGQgYmUgYm9vbGVhblxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gZWxzZSBpZiAoICc7XG4gICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAnICsgKCRleGNsVHlwZSkgKyAnID09IFxcJ251bWJlclxcJyA/ICggKCcgKyAoJGV4Y2x1c2l2ZSkgKyAnID0gJyArICgkc2NoZW1hVmFsdWUpICsgJyA9PT0gdW5kZWZpbmVkIHx8ICcgKyAoJHNjaGVtYVZhbHVlRXhjbCkgKyAnICcgKyAoJG9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcpID8gJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlRXhjbCkgKyAnIDogJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJyApIDogKCAoJyArICgkZXhjbHVzaXZlKSArICcgPSAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJyA9PT0gdHJ1ZSkgPyAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJz0gJyArICgkc2NoZW1hVmFsdWUpICsgJyA6ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKSB8fCAnICsgKCRkYXRhKSArICcgIT09ICcgKyAoJGRhdGEpICsgJykgeyB2YXIgb3AnICsgKCRsdmwpICsgJyA9ICcgKyAoJGV4Y2x1c2l2ZSkgKyAnID8gXFwnJyArICgkb3ApICsgJ1xcJyA6IFxcJycgKyAoJG9wKSArICc9XFwnOyAnO1xuICAgIGlmICgkc2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICRlcnJvcktleXdvcmQgPSAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRleGNsdXNpdmVLZXl3b3JkO1xuICAgICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYVZhbHVlRXhjbDtcbiAgICAgICRpc0RhdGEgPSAkaXNEYXRhRXhjbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyICRleGNsSXNOdW1iZXIgPSB0eXBlb2YgJHNjaGVtYUV4Y2wgPT0gJ251bWJlcicsXG4gICAgICAkb3BTdHIgPSAkb3A7XG4gICAgaWYgKCRleGNsSXNOdW1iZXIgJiYgJGlzRGF0YSkge1xuICAgICAgdmFyICRvcEV4cHIgPSAnXFwnJyArICRvcFN0ciArICdcXCcnO1xuICAgICAgb3V0ICs9ICcgaWYgKCAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICcgKCcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPSBcXCdudW1iZXJcXCcpIHx8ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAoICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPT09IHVuZGVmaW5lZCB8fCAnICsgKCRzY2hlbWFFeGNsKSArICcgJyArICgkb3ApICsgJz0gJyArICgkc2NoZW1hVmFsdWUpICsgJyA/ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnPSAnICsgKCRzY2hlbWFFeGNsKSArICcgOiAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICkgfHwgJyArICgkZGF0YSkgKyAnICE9PSAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCRleGNsSXNOdW1iZXIgJiYgJHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICRleGNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAkZXJyb3JLZXl3b3JkID0gJGV4Y2x1c2l2ZUtleXdvcmQ7XG4gICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRleGNsdXNpdmVLZXl3b3JkO1xuICAgICAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hRXhjbDtcbiAgICAgICAgJG5vdE9wICs9ICc9JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgkZXhjbElzTnVtYmVyKSAkc2NoZW1hVmFsdWUgPSBNYXRoWyRpc01heCA/ICdtaW4nIDogJ21heCddKCRzY2hlbWFFeGNsLCAkc2NoZW1hKTtcbiAgICAgICAgaWYgKCRzY2hlbWFFeGNsID09PSAoJGV4Y2xJc051bWJlciA/ICRzY2hlbWFWYWx1ZSA6IHRydWUpKSB7XG4gICAgICAgICAgJGV4Y2x1c2l2ZSA9IHRydWU7XG4gICAgICAgICAgJGVycm9yS2V5d29yZCA9ICRleGNsdXNpdmVLZXl3b3JkO1xuICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRleGNsdXNpdmVLZXl3b3JkO1xuICAgICAgICAgICRub3RPcCArPSAnPSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGV4Y2x1c2l2ZSA9IGZhbHNlO1xuICAgICAgICAgICRvcFN0ciArPSAnPSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciAkb3BFeHByID0gJ1xcJycgKyAkb3BTdHIgKyAnXFwnJztcbiAgICAgIG91dCArPSAnIGlmICggJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJyB8fCAnICsgKCRkYXRhKSArICcgIT09ICcgKyAoJGRhdGEpICsgJykgeyAnO1xuICAgIH1cbiAgfVxuICAkZXJyb3JLZXl3b3JkID0gJGVycm9yS2V5d29yZCB8fCAka2V5d29yZDtcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19saW1pdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgY29tcGFyaXNvbjogJyArICgkb3BFeHByKSArICcsIGxpbWl0OiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnLCBleGNsdXNpdmU6ICcgKyAoJGV4Y2x1c2l2ZSkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlICcgKyAoJG9wU3RyKSArICcgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSkgKyAnXFwnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX19saW1pdEl0ZW1zKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgaWYgKCEoJGlzRGF0YSB8fCB0eXBlb2YgJHNjaGVtYSA9PSAnbnVtYmVyJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJGtleXdvcmQgKyAnIG11c3QgYmUgbnVtYmVyJyk7XG4gIH1cbiAgdmFyICRvcCA9ICRrZXl3b3JkID09ICdtYXhJdGVtcycgPyAnPicgOiAnPCc7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICB9XG4gIG91dCArPSAnICcgKyAoJGRhdGEpICsgJy5sZW5ndGggJyArICgkb3ApICsgJyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnKSB7ICc7XG4gIHZhciAkZXJyb3JLZXl3b3JkID0gJGtleXdvcmQ7XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICdfbGltaXRJdGVtcycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgbGltaXQ6ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGhhdmUgJztcbiAgICAgIGlmICgka2V5d29yZCA9PSAnbWF4SXRlbXMnKSB7XG4gICAgICAgIG91dCArPSAnbW9yZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ2Zld2VyJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRoYW4gJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpICsgJyArIFxcJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyBpdGVtc1xcJyAnO1xuICAgIH1cbiAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICBvdXQgKz0gJyAsIHNjaGVtYTogICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ3ZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWEpO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgICAgICAgICAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHt9ICc7XG4gIH1cbiAgdmFyIF9fZXJyID0gb3V0O1xuICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgfVxuICBvdXQgKz0gJ30gJztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9fbGltaXRMZW5ndGgoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heExlbmd0aCcgPyAnPicgOiAnPCc7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICB9XG4gIGlmIChpdC5vcHRzLnVuaWNvZGUgPT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnLmxlbmd0aCAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHVjczJsZW5ndGgoJyArICgkZGF0YSkgKyAnKSAnO1xuICB9XG4gIG91dCArPSAnICcgKyAoJG9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJykgeyAnO1xuICB2YXIgJGVycm9yS2V5d29yZCA9ICRrZXl3b3JkO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnX2xpbWl0TGVuZ3RoJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgYmUgJztcbiAgICAgIGlmICgka2V5d29yZCA9PSAnbWF4TGVuZ3RoJykge1xuICAgICAgICBvdXQgKz0gJ2xvbmdlcic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ3Nob3J0ZXInO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgdGhhbiAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGNoYXJhY3RlcnNcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfX2xpbWl0UHJvcGVydGllcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGVycm9yS2V5d29yZDtcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIGlmICghKCRpc0RhdGEgfHwgdHlwZW9mICRzY2hlbWEgPT0gJ251bWJlcicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRrZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlcicpO1xuICB9XG4gIHZhciAkb3AgPSAka2V5d29yZCA9PSAnbWF4UHJvcGVydGllcycgPyAnPicgOiAnPCc7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICB9XG4gIG91dCArPSAnIE9iamVjdC5rZXlzKCcgKyAoJGRhdGEpICsgJykubGVuZ3RoICcgKyAoJG9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJykgeyAnO1xuICB2YXIgJGVycm9yS2V5d29yZCA9ICRrZXl3b3JkO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnX2xpbWl0UHJvcGVydGllcycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgbGltaXQ6ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGhhdmUgJztcbiAgICAgIGlmICgka2V5d29yZCA9PSAnbWF4UHJvcGVydGllcycpIHtcbiAgICAgICAgb3V0ICs9ICdtb3JlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnZmV3ZXInO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgdGhhbiAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHByb3BlcnRpZXNcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfYWxsT2YoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgdmFyICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZCxcbiAgICAkYWxsU2NoZW1hc0VtcHR5ID0gdHJ1ZTtcbiAgdmFyIGFycjEgPSAkc2NoZW1hO1xuICBpZiAoYXJyMSkge1xuICAgIHZhciAkc2NoLCAkaSA9IC0xLFxuICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICRzY2ggPSBhcnIxWyRpICs9IDFdO1xuICAgICAgaWYgKChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2gpLmxlbmd0aCA+IDApIHx8ICRzY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoLCBpdC5SVUxFUy5hbGwpKSkge1xuICAgICAgICAkYWxsU2NoZW1hc0VtcHR5ID0gZmFsc2U7XG4gICAgICAgICRpdC5zY2hlbWEgPSAkc2NoO1xuICAgICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyAkaTtcbiAgICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgJztcbiAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBpZiAoJGFsbFNjaGVtYXNFbXB0eSkge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcy5zbGljZSgwLCAtMSkpICsgJyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9hbnlPZihpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJG5vRW1wdHlTY2hlbWEgPSAkc2NoZW1hLmV2ZXJ5KGZ1bmN0aW9uKCRzY2gpIHtcbiAgICByZXR1cm4gKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaCkubGVuZ3RoID4gMCkgfHwgJHNjaCA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2gsIGl0LlJVTEVTLmFsbCkpO1xuICB9KTtcbiAgaWYgKCRub0VtcHR5U2NoZW1hKSB7XG4gICAgdmFyICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZDtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzOyB2YXIgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyAgJztcbiAgICB2YXIgJHdhc0NvbXBvc2l0ZSA9IGl0LmNvbXBvc2l0ZVJ1bGU7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgICB2YXIgYXJyMSA9ICRzY2hlbWE7XG4gICAgaWYgKGFycjEpIHtcbiAgICAgIHZhciAkc2NoLCAkaSA9IC0xLFxuICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAgICRzY2ggPSBhcnIxWyRpICs9IDFdO1xuICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgJGk7XG4gICAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCR2YWxpZCkgKyAnIHx8ICcgKyAoJG5leHRWYWxpZCkgKyAnOyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgJztcbiAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgfVxuICAgIH1cbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMpICsgJyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2FueU9mJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczoge30gJztcbiAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBtYXRjaCBzb21lIHNjaGVtYSBpbiBhbnlPZlxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICBvdXQgKz0gJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gdkVycm9yczsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXQgKz0gJyB9IGVsc2UgeyAgZXJyb3JzID0gJyArICgkZXJycykgKyAnOyBpZiAodkVycm9ycyAhPT0gbnVsbCkgeyBpZiAoJyArICgkZXJycykgKyAnKSB2RXJyb3JzLmxlbmd0aCA9ICcgKyAoJGVycnMpICsgJzsgZWxzZSB2RXJyb3JzID0gbnVsbDsgfSAnO1xuICAgIGlmIChpdC5vcHRzLmFsbEVycm9ycykge1xuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY29tbWVudChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkY29tbWVudCA9IGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHNjaGVtYSk7XG4gIGlmIChpdC5vcHRzLiRjb21tZW50ID09PSB0cnVlKSB7XG4gICAgb3V0ICs9ICcgY29uc29sZS5sb2coJyArICgkY29tbWVudCkgKyAnKTsnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpdC5vcHRzLiRjb21tZW50ID09ICdmdW5jdGlvbicpIHtcbiAgICBvdXQgKz0gJyBzZWxmLl9vcHRzLiRjb21tZW50KCcgKyAoJGNvbW1lbnQpICsgJywgJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnLCB2YWxpZGF0ZS5yb290LnNjaGVtYSk7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9jb25zdChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7JztcbiAgfVxuICBvdXQgKz0gJ3ZhciAnICsgKCR2YWxpZCkgKyAnID0gZXF1YWwoJyArICgkZGF0YSkgKyAnLCBzY2hlbWEnICsgKCRsdmwpICsgJyk7IGlmICghJyArICgkdmFsaWQpICsgJykgeyAgICc7XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnY29uc3QnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGFsbG93ZWRWYWx1ZTogc2NoZW1hJyArICgkbHZsKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgZXF1YWwgdG8gY29uc3RhbnRcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHt9ICc7XG4gIH1cbiAgdmFyIF9fZXJyID0gb3V0O1xuICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgfVxuICBvdXQgKz0gJyB9JztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9jb250YWlucyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGlkeCA9ICdpJyArICRsdmwsXG4gICAgJGRhdGFOeHQgPSAkaXQuZGF0YUxldmVsID0gaXQuZGF0YUxldmVsICsgMSxcbiAgICAkbmV4dERhdGEgPSAnZGF0YScgKyAkZGF0YU54dCxcbiAgICAkY3VycmVudEJhc2VJZCA9IGl0LmJhc2VJZCxcbiAgICAkbm9uRW1wdHlTY2hlbWEgPSAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaGVtYSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoZW1hKS5sZW5ndGggPiAwKSB8fCAkc2NoZW1hID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaGVtYSwgaXQuUlVMRVMuYWxsKSk7XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczt2YXIgJyArICgkdmFsaWQpICsgJzsnO1xuICBpZiAoJG5vbkVtcHR5U2NoZW1hKSB7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0VmFsaWQpICsgJyA9IGZhbHNlOyBmb3IgKHZhciAnICsgKCRpZHgpICsgJyA9IDA7ICcgKyAoJGlkeCkgKyAnIDwgJyArICgkZGF0YSkgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyAnO1xuICAgICRpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGhFeHByKGl0LmVycm9yUGF0aCwgJGlkeCwgaXQub3B0cy5qc29uUG9pbnRlcnMsIHRydWUpO1xuICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArICdbJyArICRpZHggKyAnXSc7XG4gICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpZHg7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgIG91dCArPSAnICcgKyAoaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSkpICsgJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIGJyZWFrOyB9ICAnO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIHsnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIGlmICgnICsgKCRkYXRhKSArICcubGVuZ3RoID09IDApIHsnO1xuICB9XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnY29udGFpbnMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgY29udGFpbiBhIHZhbGlkIGl0ZW1cXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHt9ICc7XG4gIH1cbiAgdmFyIF9fZXJyID0gb3V0O1xuICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgfVxuICBvdXQgKz0gJyB9IGVsc2UgeyAnO1xuICBpZiAoJG5vbkVtcHR5U2NoZW1hKSB7XG4gICAgb3V0ICs9ICcgIGVycm9ycyA9ICcgKyAoJGVycnMpICsgJzsgaWYgKHZFcnJvcnMgIT09IG51bGwpIHsgaWYgKCcgKyAoJGVycnMpICsgJykgdkVycm9ycy5sZW5ndGggPSAnICsgKCRlcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IG51bGw7IH0gJztcbiAgfVxuICBpZiAoaXQub3B0cy5hbGxFcnJvcnMpIHtcbiAgICBvdXQgKz0gJyB9ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY3VzdG9tKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkcnVsZSA9IHRoaXMsXG4gICAgJGRlZmluaXRpb24gPSAnZGVmaW5pdGlvbicgKyAkbHZsLFxuICAgICRyRGVmID0gJHJ1bGUuZGVmaW5pdGlvbixcbiAgICAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICB2YXIgJGNvbXBpbGUsICRpbmxpbmUsICRtYWNybywgJHJ1bGVWYWxpZGF0ZSwgJHZhbGlkYXRlQ29kZTtcbiAgaWYgKCRpc0RhdGEgJiYgJHJEZWYuJGRhdGEpIHtcbiAgICAkdmFsaWRhdGVDb2RlID0gJ2tleXdvcmRWYWxpZGF0ZScgKyAkbHZsO1xuICAgIHZhciAkdmFsaWRhdGVTY2hlbWEgPSAkckRlZi52YWxpZGF0ZVNjaGVtYTtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZGVmaW5pdGlvbikgKyAnID0gUlVMRVMuY3VzdG9tW1xcJycgKyAoJGtleXdvcmQpICsgJ1xcJ10uZGVmaW5pdGlvbjsgdmFyICcgKyAoJHZhbGlkYXRlQ29kZSkgKyAnID0gJyArICgkZGVmaW5pdGlvbikgKyAnLnZhbGlkYXRlOyc7XG4gIH0gZWxzZSB7XG4gICAgJHJ1bGVWYWxpZGF0ZSA9IGl0LnVzZUN1c3RvbVJ1bGUoJHJ1bGUsICRzY2hlbWEsIGl0LnNjaGVtYSwgaXQpO1xuICAgIGlmICghJHJ1bGVWYWxpZGF0ZSkgcmV0dXJuO1xuICAgICRzY2hlbWFWYWx1ZSA9ICd2YWxpZGF0ZS5zY2hlbWEnICsgJHNjaGVtYVBhdGg7XG4gICAgJHZhbGlkYXRlQ29kZSA9ICRydWxlVmFsaWRhdGUuY29kZTtcbiAgICAkY29tcGlsZSA9ICRyRGVmLmNvbXBpbGU7XG4gICAgJGlubGluZSA9ICRyRGVmLmlubGluZTtcbiAgICAkbWFjcm8gPSAkckRlZi5tYWNybztcbiAgfVxuICB2YXIgJHJ1bGVFcnJzID0gJHZhbGlkYXRlQ29kZSArICcuZXJyb3JzJyxcbiAgICAkaSA9ICdpJyArICRsdmwsXG4gICAgJHJ1bGVFcnIgPSAncnVsZUVycicgKyAkbHZsLFxuICAgICRhc3luY0tleXdvcmQgPSAkckRlZi5hc3luYztcbiAgaWYgKCRhc3luY0tleXdvcmQgJiYgIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIGtleXdvcmQgaW4gc3luYyBzY2hlbWEnKTtcbiAgaWYgKCEoJGlubGluZSB8fCAkbWFjcm8pKSB7XG4gICAgb3V0ICs9ICcnICsgKCRydWxlRXJycykgKyAnID0gbnVsbDsnO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczt2YXIgJyArICgkdmFsaWQpICsgJzsnO1xuICBpZiAoJGlzRGF0YSAmJiAkckRlZi4kZGF0YSkge1xuICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkc2NoZW1hVmFsdWUpICsgJyA9PT0gdW5kZWZpbmVkKSB7ICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyB9IGVsc2UgeyAnO1xuICAgIGlmICgkdmFsaWRhdGVTY2hlbWEpIHtcbiAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRkZWZpbml0aW9uKSArICcudmFsaWRhdGVTY2hlbWEoJyArICgkc2NoZW1hVmFsdWUpICsgJyk7IGlmICgnICsgKCR2YWxpZCkgKyAnKSB7ICc7XG4gICAgfVxuICB9XG4gIGlmICgkaW5saW5lKSB7XG4gICAgaWYgKCRyRGVmLnN0YXRlbWVudHMpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVWYWxpZGF0ZS52YWxpZGF0ZSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRydWxlVmFsaWRhdGUudmFsaWRhdGUpICsgJzsgJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoJG1hY3JvKSB7XG4gICAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICAgJGl0LmxldmVsKys7XG4gICAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICAgICRpdC5zY2hlbWEgPSAkcnVsZVZhbGlkYXRlLnZhbGlkYXRlO1xuICAgICRpdC5zY2hlbWFQYXRoID0gJyc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KS5yZXBsYWNlKC92YWxpZGF0ZVxcLnNjaGVtYS9nLCAkdmFsaWRhdGVDb2RlKTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgIG91dCArPSAnICcgKyAoJGNvZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJztcbiAgICBvdXQgKz0gJyAgJyArICgkdmFsaWRhdGVDb2RlKSArICcuY2FsbCggJztcbiAgICBpZiAoaXQub3B0cy5wYXNzQ29udGV4dCkge1xuICAgICAgb3V0ICs9ICd0aGlzJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICdzZWxmJztcbiAgICB9XG4gICAgaWYgKCRjb21waWxlIHx8ICRyRGVmLnNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgJyArICgkZGF0YSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICwgJyArICgkc2NoZW1hVmFsdWUpICsgJyAsICcgKyAoJGRhdGEpICsgJyAsIHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnICwgKGRhdGFQYXRoIHx8IFxcJ1xcJyknO1xuICAgIGlmIChpdC5lcnJvclBhdGggIT0gJ1wiXCInKSB7XG4gICAgICBvdXQgKz0gJyArICcgKyAoaXQuZXJyb3JQYXRoKTtcbiAgICB9XG4gICAgdmFyICRwYXJlbnREYXRhID0gJGRhdGFMdmwgPyAnZGF0YScgKyAoKCRkYXRhTHZsIC0gMSkgfHwgJycpIDogJ3BhcmVudERhdGEnLFxuICAgICAgJHBhcmVudERhdGFQcm9wZXJ0eSA9ICRkYXRhTHZsID8gaXQuZGF0YVBhdGhBcnJbJGRhdGFMdmxdIDogJ3BhcmVudERhdGFQcm9wZXJ0eSc7XG4gICAgb3V0ICs9ICcgLCAnICsgKCRwYXJlbnREYXRhKSArICcgLCAnICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJyAsIHJvb3REYXRhICkgICc7XG4gICAgdmFyIGRlZl9jYWxsUnVsZVZhbGlkYXRlID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCRyRGVmLmVycm9ycyA9PT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnO1xuICAgICAgaWYgKCRhc3luY0tleXdvcmQpIHtcbiAgICAgICAgb3V0ICs9ICdhd2FpdCAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcnICsgKGRlZl9jYWxsUnVsZVZhbGlkYXRlKSArICc7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkYXN5bmNLZXl3b3JkKSB7XG4gICAgICAgICRydWxlRXJycyA9ICdjdXN0b21FcnJvcnMnICsgJGx2bDtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHJ1bGVFcnJzKSArICcgPSBudWxsOyB0cnkgeyAnICsgKCR2YWxpZCkgKyAnID0gYXdhaXQgJyArIChkZWZfY2FsbFJ1bGVWYWxpZGF0ZSkgKyAnOyB9IGNhdGNoIChlKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgaWYgKGUgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpICcgKyAoJHJ1bGVFcnJzKSArICcgPSBlLmVycm9yczsgZWxzZSB0aHJvdyBlOyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJycykgKyAnID0gbnVsbDsgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoZGVmX2NhbGxSdWxlVmFsaWRhdGUpICsgJzsgJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRyRGVmLm1vZGlmeWluZykge1xuICAgIG91dCArPSAnIGlmICgnICsgKCRwYXJlbnREYXRhKSArICcpICcgKyAoJGRhdGEpICsgJyA9ICcgKyAoJHBhcmVudERhdGEpICsgJ1snICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJ107JztcbiAgfVxuICBvdXQgKz0gJycgKyAoJGNsb3NpbmdCcmFjZXMpO1xuICBpZiAoJHJEZWYudmFsaWQpIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgaWYgKCAnO1xuICAgIGlmICgkckRlZi52YWxpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvdXQgKz0gJyAhJztcbiAgICAgIGlmICgkbWFjcm8pIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRuZXh0VmFsaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCR2YWxpZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoISRyRGVmLnZhbGlkKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcpIHsgJztcbiAgICAkZXJyb3JLZXl3b3JkID0gJHJ1bGUua2V5d29yZDtcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7XG4gICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnY3VzdG9tJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBrZXl3b3JkOiBcXCcnICsgKCRydWxlLmtleXdvcmQpICsgJ1xcJyB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgcGFzcyBcIicgKyAoJHJ1bGUua2V5d29yZCkgKyAnXCIga2V5d29yZCB2YWxpZGF0aW9uXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIHZhciBfX2VyciA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICB9XG4gICAgdmFyIGRlZl9jdXN0b21FcnJvciA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICgkaW5saW5lKSB7XG4gICAgICBpZiAoJHJEZWYuZXJyb3JzKSB7XG4gICAgICAgIGlmICgkckRlZi5lcnJvcnMgIT0gJ2Z1bGwnKSB7XG4gICAgICAgICAgb3V0ICs9ICcgIGZvciAodmFyICcgKyAoJGkpICsgJz0nICsgKCRlcnJzKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZhciAnICsgKCRydWxlRXJyKSArICcgPSB2RXJyb3JzWycgKyAoJGkpICsgJ107IGlmICgnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPT09IHVuZGVmaW5lZCkgJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID0gKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnOyBpZiAoJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPT09IHVuZGVmaW5lZCkgeyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hUGF0aCA9IFwiJyArICgkZXJyU2NoZW1hUGF0aCkgKyAnXCI7IH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hID0gJyArICgkc2NoZW1hVmFsdWUpICsgJzsgJyArICgkcnVsZUVycikgKyAnLmRhdGEgPSAnICsgKCRkYXRhKSArICc7ICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCRyRGVmLmVycm9ycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKGRlZl9jdXN0b21FcnJvcikgKyAnICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsgJyArIChkZWZfY3VzdG9tRXJyb3IpICsgJyB9IGVsc2UgeyAgZm9yICh2YXIgJyArICgkaSkgKyAnPScgKyAoJGVycnMpICsgJzsgJyArICgkaSkgKyAnPGVycm9yczsgJyArICgkaSkgKyAnKyspIHsgdmFyICcgKyAoJHJ1bGVFcnIpICsgJyA9IHZFcnJvcnNbJyArICgkaSkgKyAnXTsgaWYgKCcgKyAoJHJ1bGVFcnIpICsgJy5kYXRhUGF0aCA9PT0gdW5kZWZpbmVkKSAnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPSAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICc7IGlmICgnICsgKCRydWxlRXJyKSArICcuc2NoZW1hUGF0aCA9PT0gdW5kZWZpbmVkKSB7ICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWFQYXRoID0gXCInICsgKCRlcnJTY2hlbWFQYXRoKSArICdcIjsgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWEgPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnOyAnICsgKCRydWxlRXJyKSArICcuZGF0YSA9ICcgKyAoJGRhdGEpICsgJzsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSB9ICc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCRtYWNybykge1xuICAgICAgb3V0ICs9ICcgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ2N1c3RvbScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsga2V5d29yZDogXFwnJyArICgkcnVsZS5rZXl3b3JkKSArICdcXCcgfSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBwYXNzIFwiJyArICgkcnVsZS5rZXl3b3JkKSArICdcIiBrZXl3b3JkIHZhbGlkYXRpb25cXCcgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoJHJEZWYuZXJyb3JzID09PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAnICsgKGRlZl9jdXN0b21FcnJvcikgKyAnICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyBpZiAoQXJyYXkuaXNBcnJheSgnICsgKCRydWxlRXJycykgKyAnKSkgeyBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9ICcgKyAoJHJ1bGVFcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IHZFcnJvcnMuY29uY2F0KCcgKyAoJHJ1bGVFcnJzKSArICcpOyBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsgIGZvciAodmFyICcgKyAoJGkpICsgJz0nICsgKCRlcnJzKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZhciAnICsgKCRydWxlRXJyKSArICcgPSB2RXJyb3JzWycgKyAoJGkpICsgJ107IGlmICgnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPT09IHVuZGVmaW5lZCkgJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID0gKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnOyAgJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPSBcIicgKyAoJGVyclNjaGVtYVBhdGgpICsgJ1wiOyAgJztcbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWEgPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnOyAnICsgKCRydWxlRXJyKSArICcuZGF0YSA9ICcgKyAoJGRhdGEpICsgJzsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9IH0gZWxzZSB7ICcgKyAoZGVmX2N1c3RvbUVycm9yKSArICcgfSAnO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9kZXBlbmRlbmNpZXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkc2NoZW1hRGVwcyA9IHt9LFxuICAgICRwcm9wZXJ0eURlcHMgPSB7fSxcbiAgICAkb3duUHJvcGVydGllcyA9IGl0Lm9wdHMub3duUHJvcGVydGllcztcbiAgZm9yICgkcHJvcGVydHkgaW4gJHNjaGVtYSkge1xuICAgIGlmICgkcHJvcGVydHkgPT0gJ19fcHJvdG9fXycpIGNvbnRpbnVlO1xuICAgIHZhciAkc2NoID0gJHNjaGVtYVskcHJvcGVydHldO1xuICAgIHZhciAkZGVwcyA9IEFycmF5LmlzQXJyYXkoJHNjaCkgPyAkcHJvcGVydHlEZXBzIDogJHNjaGVtYURlcHM7XG4gICAgJGRlcHNbJHByb3BlcnR5XSA9ICRzY2g7XG4gIH1cbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzOyc7XG4gIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aDtcbiAgb3V0ICs9ICd2YXIgbWlzc2luZycgKyAoJGx2bCkgKyAnOyc7XG4gIGZvciAodmFyICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlEZXBzKSB7XG4gICAgJGRlcHMgPSAkcHJvcGVydHlEZXBzWyRwcm9wZXJ0eV07XG4gICAgaWYgKCRkZXBzLmxlbmd0aCkge1xuICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCRkYXRhKSArIChpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eSkpICsgJyAhPT0gdW5kZWZpbmVkICc7XG4gICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgb3V0ICs9ICcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICdcXCcpICc7XG4gICAgICB9XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyAmJiAoICc7XG4gICAgICAgIHZhciBhcnIxID0gJGRlcHM7XG4gICAgICAgIGlmIChhcnIxKSB7XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgJGkgPSAtMSxcbiAgICAgICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIxWyRpICs9IDFdO1xuICAgICAgICAgICAgaWYgKCRpKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgJHByb3AgPSBpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eUtleSksXG4gICAgICAgICAgICAgICR1c2VEYXRhID0gJGRhdGEgKyAkcHJvcDtcbiAgICAgICAgICAgIG91dCArPSAnICggKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpKSArICdcXCcpICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgJiYgKG1pc3NpbmcnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZyhpdC5vcHRzLmpzb25Qb2ludGVycyA/ICRwcm9wZXJ0eUtleSA6ICRwcm9wKSkgKyAnKSApICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnKSkgeyAgJztcbiAgICAgICAgdmFyICRwcm9wZXJ0eVBhdGggPSAnbWlzc2luZycgKyAkbHZsLFxuICAgICAgICAgICRtaXNzaW5nUHJvcGVydHkgPSAnXFwnICsgJyArICRwcm9wZXJ0eVBhdGggKyAnICsgXFwnJztcbiAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuanNvblBvaW50ZXJzID8gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgdHJ1ZSkgOiAkY3VycmVudEVycm9yUGF0aCArICcgKyAnICsgJHByb3BlcnR5UGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2RlcGVuZGVuY2llcycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcHJvcGVydHk6IFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnXFwnLCBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnLCBkZXBzQ291bnQ6ICcgKyAoJGRlcHMubGVuZ3RoKSArICcsIGRlcHM6IFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJGRlcHMubGVuZ3RoID09IDEgPyAkZGVwc1swXSA6ICRkZXBzLmpvaW4oXCIsIFwiKSkpICsgJ1xcJyB9ICc7XG4gICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBoYXZlICc7XG4gICAgICAgICAgICBpZiAoJGRlcHMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0eSAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzWzBdKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJ3Byb3BlcnRpZXMgJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkZGVwcy5qb2luKFwiLCBcIikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIHdoZW4gcHJvcGVydHkgJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICcgaXMgcHJlc2VudFxcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyApIHsgJztcbiAgICAgICAgdmFyIGFycjIgPSAkZGVwcztcbiAgICAgICAgaWYgKGFycjIpIHtcbiAgICAgICAgICB2YXIgJHByb3BlcnR5S2V5LCBpMiA9IC0xLFxuICAgICAgICAgICAgbDIgPSBhcnIyLmxlbmd0aCAtIDE7XG4gICAgICAgICAgd2hpbGUgKGkyIDwgbDIpIHtcbiAgICAgICAgICAgICRwcm9wZXJ0eUtleSA9IGFycjJbaTIgKz0gMV07XG4gICAgICAgICAgICB2YXIgJHByb3AgPSBpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eUtleSksXG4gICAgICAgICAgICAgICRtaXNzaW5nUHJvcGVydHkgPSBpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkdXNlRGF0YSA9ICRkYXRhICsgJHByb3A7XG4gICAgICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aCgkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5S2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoICcgKyAoJHVzZURhdGEpICsgJyA9PT0gdW5kZWZpbmVkICc7XG4gICAgICAgICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnKSB7ICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdkZXBlbmRlbmNpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHByb3BlcnR5OiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eSkpICsgJ1xcJywgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJywgZGVwc0NvdW50OiAnICsgKCRkZXBzLmxlbmd0aCkgKyAnLCBkZXBzOiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzLmxlbmd0aCA9PSAxID8gJGRlcHNbMF0gOiAkZGVwcy5qb2luKFwiLCBcIikpKSArICdcXCcgfSAnO1xuICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBoYXZlICc7XG4gICAgICAgICAgICAgICAgaWYgKCRkZXBzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJ3Byb3BlcnR5ICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJGRlcHNbMF0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0aWVzICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJGRlcHMuam9pbihcIiwgXCIpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dCArPSAnIHdoZW4gcHJvcGVydHkgJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICcgaXMgcHJlc2VudFxcJyAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyB9ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICAgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGl0LmVycm9yUGF0aCA9ICRjdXJyZW50RXJyb3JQYXRoO1xuICB2YXIgJGN1cnJlbnRCYXNlSWQgPSAkaXQuYmFzZUlkO1xuICBmb3IgKHZhciAkcHJvcGVydHkgaW4gJHNjaGVtYURlcHMpIHtcbiAgICB2YXIgJHNjaCA9ICRzY2hlbWFEZXBzWyRwcm9wZXJ0eV07XG4gICAgaWYgKChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2gpLmxlbmd0aCA+IDApIHx8ICRzY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoLCBpdC5SVUxFUy5hbGwpKSkge1xuICAgICAgb3V0ICs9ICcgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyBpZiAoICcgKyAoJGRhdGEpICsgKGl0LnV0aWwuZ2V0UHJvcGVydHkoJHByb3BlcnR5KSkgKyAnICE9PSB1bmRlZmluZWQgJztcbiAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICBvdXQgKz0gJyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eSkpICsgJ1xcJykgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnKSB7ICc7XG4gICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICRpdC5zY2hlbWFQYXRoID0gJHNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eSk7XG4gICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgaXQudXRpbC5lc2NhcGVGcmFnbWVudCgkcHJvcGVydHkpO1xuICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICBvdXQgKz0gJyB9ICAnO1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyAgICcgKyAoJGNsb3NpbmdCcmFjZXMpICsgJyBpZiAoJyArICgkZXJycykgKyAnID09IGVycm9ycykgeyc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfZW51bShpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICB2YXIgJGkgPSAnaScgKyAkbHZsLFxuICAgICR2U2NoZW1hID0gJ3NjaGVtYScgKyAkbHZsO1xuICBpZiAoISRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkdlNjaGVtYSkgKyAnID0gdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnOyc7XG4gIH1cbiAgb3V0ICs9ICd2YXIgJyArICgkdmFsaWQpICsgJzsnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIGlmIChzY2hlbWEnICsgKCRsdmwpICsgJyA9PT0gdW5kZWZpbmVkKSAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hJyArICgkbHZsKSArICcpKSAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7IGVsc2Ugeyc7XG4gIH1cbiAgb3V0ICs9ICcnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7Zm9yICh2YXIgJyArICgkaSkgKyAnPTA7ICcgKyAoJGkpICsgJzwnICsgKCR2U2NoZW1hKSArICcubGVuZ3RoOyAnICsgKCRpKSArICcrKykgaWYgKGVxdWFsKCcgKyAoJGRhdGEpICsgJywgJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ10pKSB7ICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyBicmVhazsgfSc7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgIH0gICc7XG4gIH1cbiAgb3V0ICs9ICcgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICAgJztcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdlbnVtJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBhbGxvd2VkVmFsdWVzOiBzY2hlbWEnICsgKCRsdmwpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfZm9ybWF0KGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIGlmIChpdC5vcHRzLmZvcm1hdCA9PT0gZmFsc2UpIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICR1bmtub3duRm9ybWF0cyA9IGl0Lm9wdHMudW5rbm93bkZvcm1hdHMsXG4gICAgJGFsbG93VW5rbm93biA9IEFycmF5LmlzQXJyYXkoJHVua25vd25Gb3JtYXRzKTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICB2YXIgJGZvcm1hdCA9ICdmb3JtYXQnICsgJGx2bCxcbiAgICAgICRpc09iamVjdCA9ICdpc09iamVjdCcgKyAkbHZsLFxuICAgICAgJGZvcm1hdFR5cGUgPSAnZm9ybWF0VHlwZScgKyAkbHZsO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRmb3JtYXQpICsgJyA9IGZvcm1hdHNbJyArICgkc2NoZW1hVmFsdWUpICsgJ107IHZhciAnICsgKCRpc09iamVjdCkgKyAnID0gdHlwZW9mICcgKyAoJGZvcm1hdCkgKyAnID09IFxcJ29iamVjdFxcJyAmJiAhKCcgKyAoJGZvcm1hdCkgKyAnIGluc3RhbmNlb2YgUmVnRXhwKSAmJiAnICsgKCRmb3JtYXQpICsgJy52YWxpZGF0ZTsgdmFyICcgKyAoJGZvcm1hdFR5cGUpICsgJyA9ICcgKyAoJGlzT2JqZWN0KSArICcgJiYgJyArICgkZm9ybWF0KSArICcudHlwZSB8fCBcXCdzdHJpbmdcXCc7IGlmICgnICsgKCRpc09iamVjdCkgKyAnKSB7ICc7XG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB2YXIgYXN5bmMnICsgKCRsdmwpICsgJyA9ICcgKyAoJGZvcm1hdCkgKyAnLmFzeW5jOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAnICsgKCRmb3JtYXQpICsgJyA9ICcgKyAoJGZvcm1hdCkgKyAnLnZhbGlkYXRlOyB9IGlmICggICc7XG4gICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnc3RyaW5nXFwnKSB8fCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAoJztcbiAgICBpZiAoJHVua25vd25Gb3JtYXRzICE9ICdpZ25vcmUnKSB7XG4gICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAmJiAhJyArICgkZm9ybWF0KSArICcgJztcbiAgICAgIGlmICgkYWxsb3dVbmtub3duKSB7XG4gICAgICAgIG91dCArPSAnICYmIHNlbGYuX29wdHMudW5rbm93bkZvcm1hdHMuaW5kZXhPZignICsgKCRzY2hlbWFWYWx1ZSkgKyAnKSA9PSAtMSAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcpIHx8ICc7XG4gICAgfVxuICAgIG91dCArPSAnICgnICsgKCRmb3JtYXQpICsgJyAmJiAnICsgKCRmb3JtYXRUeXBlKSArICcgPT0gXFwnJyArICgkcnVsZVR5cGUpICsgJ1xcJyAmJiAhKHR5cGVvZiAnICsgKCRmb3JtYXQpICsgJyA9PSBcXCdmdW5jdGlvblxcJyA/ICc7XG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyAoYXN5bmMnICsgKCRsdmwpICsgJyA/IGF3YWl0ICcgKyAoJGZvcm1hdCkgKyAnKCcgKyAoJGRhdGEpICsgJykgOiAnICsgKCRmb3JtYXQpICsgJygnICsgKCRkYXRhKSArICcpKSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRmb3JtYXQpICsgJygnICsgKCRkYXRhKSArICcpICc7XG4gICAgfVxuICAgIG91dCArPSAnIDogJyArICgkZm9ybWF0KSArICcudGVzdCgnICsgKCRkYXRhKSArICcpKSkpKSB7JztcbiAgfSBlbHNlIHtcbiAgICB2YXIgJGZvcm1hdCA9IGl0LmZvcm1hdHNbJHNjaGVtYV07XG4gICAgaWYgKCEkZm9ybWF0KSB7XG4gICAgICBpZiAoJHVua25vd25Gb3JtYXRzID09ICdpZ25vcmUnKSB7XG4gICAgICAgIGl0LmxvZ2dlci53YXJuKCd1bmtub3duIGZvcm1hdCBcIicgKyAkc2NoZW1hICsgJ1wiIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIicpO1xuICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH0gZWxzZSBpZiAoJGFsbG93VW5rbm93biAmJiAkdW5rbm93bkZvcm1hdHMuaW5kZXhPZigkc2NoZW1hKSA+PSAwKSB7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGZvcm1hdCBcIicgKyAkc2NoZW1hICsgJ1wiIGlzIHVzZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIicpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgJGlzT2JqZWN0ID0gdHlwZW9mICRmb3JtYXQgPT0gJ29iamVjdCcgJiYgISgkZm9ybWF0IGluc3RhbmNlb2YgUmVnRXhwKSAmJiAkZm9ybWF0LnZhbGlkYXRlO1xuICAgIHZhciAkZm9ybWF0VHlwZSA9ICRpc09iamVjdCAmJiAkZm9ybWF0LnR5cGUgfHwgJ3N0cmluZyc7XG4gICAgaWYgKCRpc09iamVjdCkge1xuICAgICAgdmFyICRhc3luYyA9ICRmb3JtYXQuYXN5bmMgPT09IHRydWU7XG4gICAgICAkZm9ybWF0ID0gJGZvcm1hdC52YWxpZGF0ZTtcbiAgICB9XG4gICAgaWYgKCRmb3JtYXRUeXBlICE9ICRydWxlVHlwZSkge1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGlmICgkYXN5bmMpIHtcbiAgICAgIGlmICghaXQuYXN5bmMpIHRocm93IG5ldyBFcnJvcignYXN5bmMgZm9ybWF0IGluIHN5bmMgc2NoZW1hJyk7XG4gICAgICB2YXIgJGZvcm1hdFJlZiA9ICdmb3JtYXRzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHNjaGVtYSkgKyAnLnZhbGlkYXRlJztcbiAgICAgIG91dCArPSAnIGlmICghKGF3YWl0ICcgKyAoJGZvcm1hdFJlZikgKyAnKCcgKyAoJGRhdGEpICsgJykpKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGlmICghICc7XG4gICAgICB2YXIgJGZvcm1hdFJlZiA9ICdmb3JtYXRzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHNjaGVtYSk7XG4gICAgICBpZiAoJGlzT2JqZWN0KSAkZm9ybWF0UmVmICs9ICcudmFsaWRhdGUnO1xuICAgICAgaWYgKHR5cGVvZiAkZm9ybWF0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkZm9ybWF0UmVmKSArICcoJyArICgkZGF0YSkgKyAnKSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkZm9ybWF0UmVmKSArICcudGVzdCgnICsgKCRkYXRhKSArICcpICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJykgeyAnO1xuICAgIH1cbiAgfVxuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2Zvcm1hdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgZm9ybWF0OiAgJztcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIGZvcm1hdCBcIic7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKyBcXCcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnXCJcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2lmKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgdmFyICR0aGVuU2NoID0gaXQuc2NoZW1hWyd0aGVuJ10sXG4gICAgJGVsc2VTY2ggPSBpdC5zY2hlbWFbJ2Vsc2UnXSxcbiAgICAkdGhlblByZXNlbnQgPSAkdGhlblNjaCAhPT0gdW5kZWZpbmVkICYmIChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkdGhlblNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkdGhlblNjaCkubGVuZ3RoID4gMCkgfHwgJHRoZW5TY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkdGhlblNjaCwgaXQuUlVMRVMuYWxsKSksXG4gICAgJGVsc2VQcmVzZW50ID0gJGVsc2VTY2ggIT09IHVuZGVmaW5lZCAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJGVsc2VTY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJGVsc2VTY2gpLmxlbmd0aCA+IDApIHx8ICRlbHNlU2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJGVsc2VTY2gsIGl0LlJVTEVTLmFsbCkpLFxuICAgICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZDtcbiAgaWYgKCR0aGVuUHJlc2VudCB8fCAkZWxzZVByZXNlbnQpIHtcbiAgICB2YXIgJGlmQ2xhdXNlO1xuICAgICRpdC5jcmVhdGVFcnJvcnMgPSBmYWxzZTtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsgdmFyICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyAgJztcbiAgICB2YXIgJHdhc0NvbXBvc2l0ZSA9IGl0LmNvbXBvc2l0ZVJ1bGU7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgICBvdXQgKz0gJyAgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgJGl0LmNyZWF0ZUVycm9ycyA9IHRydWU7XG4gICAgb3V0ICs9ICcgIGVycm9ycyA9ICcgKyAoJGVycnMpICsgJzsgaWYgKHZFcnJvcnMgIT09IG51bGwpIHsgaWYgKCcgKyAoJGVycnMpICsgJykgdkVycm9ycy5sZW5ndGggPSAnICsgKCRlcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IG51bGw7IH0gICc7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBpZiAoJHRoZW5QcmVzZW50KSB7XG4gICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgICc7XG4gICAgICAkaXQuc2NoZW1hID0gaXQuc2NoZW1hWyd0aGVuJ107XG4gICAgICAkaXQuc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnRoZW4nO1xuICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy90aGVuJztcbiAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgb3V0ICs9ICcgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoJG5leHRWYWxpZCkgKyAnOyAnO1xuICAgICAgaWYgKCR0aGVuUHJlc2VudCAmJiAkZWxzZVByZXNlbnQpIHtcbiAgICAgICAgJGlmQ2xhdXNlID0gJ2lmQ2xhdXNlJyArICRsdmw7XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCRpZkNsYXVzZSkgKyAnID0gXFwndGhlblxcJzsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRpZkNsYXVzZSA9ICdcXCd0aGVuXFwnJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICAgIGlmICgkZWxzZVByZXNlbnQpIHtcbiAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIHsgJztcbiAgICB9XG4gICAgaWYgKCRlbHNlUHJlc2VudCkge1xuICAgICAgJGl0LnNjaGVtYSA9IGl0LnNjaGVtYVsnZWxzZSddO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5lbHNlJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvZWxzZSc7XG4gICAgICBvdXQgKz0gJyAgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRuZXh0VmFsaWQpICsgJzsgJztcbiAgICAgIGlmICgkdGhlblByZXNlbnQgJiYgJGVsc2VQcmVzZW50KSB7XG4gICAgICAgICRpZkNsYXVzZSA9ICdpZkNsYXVzZScgKyAkbHZsO1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkaWZDbGF1c2UpICsgJyA9IFxcJ2Vsc2VcXCc7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkaWZDbGF1c2UgPSAnXFwnZWxzZVxcJyc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICAgIG91dCArPSAnIGlmICghJyArICgkdmFsaWQpICsgJykgeyAgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnaWYnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGZhaWxpbmdLZXl3b3JkOiAnICsgKCRpZkNsYXVzZSkgKyAnIH0gJztcbiAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBtYXRjaCBcIlxcJyArICcgKyAoJGlmQ2xhdXNlKSArICcgKyBcXCdcIiBzY2hlbWFcXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0ICs9ICcgfSAgICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy9hbGwgcmVxdWlyZXMgbXVzdCBiZSBleHBsaWNpdCBiZWNhdXNlIGJyb3dzZXJpZnkgd29uJ3Qgd29yayB3aXRoIGR5bmFtaWMgcmVxdWlyZXNcbm1vZHVsZS5leHBvcnRzID0ge1xuICAnJHJlZic6IHJlcXVpcmUoJy4vcmVmJyksXG4gIGFsbE9mOiByZXF1aXJlKCcuL2FsbE9mJyksXG4gIGFueU9mOiByZXF1aXJlKCcuL2FueU9mJyksXG4gICckY29tbWVudCc6IHJlcXVpcmUoJy4vY29tbWVudCcpLFxuICBjb25zdDogcmVxdWlyZSgnLi9jb25zdCcpLFxuICBjb250YWluczogcmVxdWlyZSgnLi9jb250YWlucycpLFxuICBkZXBlbmRlbmNpZXM6IHJlcXVpcmUoJy4vZGVwZW5kZW5jaWVzJyksXG4gICdlbnVtJzogcmVxdWlyZSgnLi9lbnVtJyksXG4gIGZvcm1hdDogcmVxdWlyZSgnLi9mb3JtYXQnKSxcbiAgJ2lmJzogcmVxdWlyZSgnLi9pZicpLFxuICBpdGVtczogcmVxdWlyZSgnLi9pdGVtcycpLFxuICBtYXhpbXVtOiByZXF1aXJlKCcuL19saW1pdCcpLFxuICBtaW5pbXVtOiByZXF1aXJlKCcuL19saW1pdCcpLFxuICBtYXhJdGVtczogcmVxdWlyZSgnLi9fbGltaXRJdGVtcycpLFxuICBtaW5JdGVtczogcmVxdWlyZSgnLi9fbGltaXRJdGVtcycpLFxuICBtYXhMZW5ndGg6IHJlcXVpcmUoJy4vX2xpbWl0TGVuZ3RoJyksXG4gIG1pbkxlbmd0aDogcmVxdWlyZSgnLi9fbGltaXRMZW5ndGgnKSxcbiAgbWF4UHJvcGVydGllczogcmVxdWlyZSgnLi9fbGltaXRQcm9wZXJ0aWVzJyksXG4gIG1pblByb3BlcnRpZXM6IHJlcXVpcmUoJy4vX2xpbWl0UHJvcGVydGllcycpLFxuICBtdWx0aXBsZU9mOiByZXF1aXJlKCcuL211bHRpcGxlT2YnKSxcbiAgbm90OiByZXF1aXJlKCcuL25vdCcpLFxuICBvbmVPZjogcmVxdWlyZSgnLi9vbmVPZicpLFxuICBwYXR0ZXJuOiByZXF1aXJlKCcuL3BhdHRlcm4nKSxcbiAgcHJvcGVydGllczogcmVxdWlyZSgnLi9wcm9wZXJ0aWVzJyksXG4gIHByb3BlcnR5TmFtZXM6IHJlcXVpcmUoJy4vcHJvcGVydHlOYW1lcycpLFxuICByZXF1aXJlZDogcmVxdWlyZSgnLi9yZXF1aXJlZCcpLFxuICB1bmlxdWVJdGVtczogcmVxdWlyZSgnLi91bmlxdWVJdGVtcycpLFxuICB2YWxpZGF0ZTogcmVxdWlyZSgnLi92YWxpZGF0ZScpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9pdGVtcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGlkeCA9ICdpJyArICRsdmwsXG4gICAgJGRhdGFOeHQgPSAkaXQuZGF0YUxldmVsID0gaXQuZGF0YUxldmVsICsgMSxcbiAgICAkbmV4dERhdGEgPSAnZGF0YScgKyAkZGF0YU54dCxcbiAgICAkY3VycmVudEJhc2VJZCA9IGl0LmJhc2VJZDtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzO3ZhciAnICsgKCR2YWxpZCkgKyAnOyc7XG4gIGlmIChBcnJheS5pc0FycmF5KCRzY2hlbWEpKSB7XG4gICAgdmFyICRhZGRpdGlvbmFsSXRlbXMgPSBpdC5zY2hlbWEuYWRkaXRpb25hbEl0ZW1zO1xuICAgIGlmICgkYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoJGRhdGEpICsgJy5sZW5ndGggPD0gJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnOyAnO1xuICAgICAgdmFyICRjdXJyRXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgb3V0ICs9ICcgIGlmICghJyArICgkdmFsaWQpICsgJykgeyAgICc7XG4gICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdhZGRpdGlvbmFsSXRlbXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGxpbWl0OiAnICsgKCRzY2hlbWEubGVuZ3RoKSArICcgfSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgaGF2ZSBtb3JlIHRoYW4gJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnIGl0ZW1zXFwnICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAkZXJyU2NoZW1hUGF0aCA9ICRjdXJyRXJyU2NoZW1hUGF0aDtcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgICBpZiAoYXJyMSkge1xuICAgICAgdmFyICRzY2gsICRpID0gLTEsXG4gICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICAgJHNjaCA9IGFycjFbJGkgKz0gMV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IHRydWU7IGlmICgnICsgKCRkYXRhKSArICcubGVuZ3RoID4gJyArICgkaSkgKyAnKSB7ICc7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyAkaTtcbiAgICAgICAgICAkaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRpLCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgICAgICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpO1xuICAgICAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgJGFkZGl0aW9uYWxJdGVtcyA9PSAnb2JqZWN0JyAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJGFkZGl0aW9uYWxJdGVtcyA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkYWRkaXRpb25hbEl0ZW1zKS5sZW5ndGggPiAwKSB8fCAkYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJGFkZGl0aW9uYWxJdGVtcywgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICRpdC5zY2hlbWEgPSAkYWRkaXRpb25hbEl0ZW1zO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgb3V0ICs9ICcgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyBpZiAoJyArICgkZGF0YSkgKyAnLmxlbmd0aCA+ICcgKyAoJHNjaGVtYS5sZW5ndGgpICsgJykgeyAgZm9yICh2YXIgJyArICgkaWR4KSArICcgPSAnICsgKCRzY2hlbWEubGVuZ3RoKSArICc7ICcgKyAoJGlkeCkgKyAnIDwgJyArICgkZGF0YSkgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyAnO1xuICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAkaWR4LCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAkaWR4ICsgJ10nO1xuICAgICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpZHg7XG4gICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgfVxuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9IH0gICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgJztcbiAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaGVtYSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoZW1hKS5sZW5ndGggPiAwKSB8fCAkc2NoZW1hID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaGVtYSwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgb3V0ICs9ICcgIGZvciAodmFyICcgKyAoJGlkeCkgKyAnID0gJyArICgwKSArICc7ICcgKyAoJGlkeCkgKyAnIDwgJyArICgkZGF0YSkgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyAnO1xuICAgICRpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGhFeHByKGl0LmVycm9yUGF0aCwgJGlkeCwgaXQub3B0cy5qc29uUG9pbnRlcnMsIHRydWUpO1xuICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArICdbJyArICRpZHggKyAnXSc7XG4gICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpZHg7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgIG91dCArPSAnICcgKyAoaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSkpICsgJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgIH1cbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0nO1xuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9tdWx0aXBsZU9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICBvdXQgKz0gJ3ZhciBkaXZpc2lvbicgKyAoJGx2bCkgKyAnO2lmICgnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT09IHVuZGVmaW5lZCAmJiAoIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJyB8fCAnO1xuICB9XG4gIG91dCArPSAnIChkaXZpc2lvbicgKyAoJGx2bCkgKyAnID0gJyArICgkZGF0YSkgKyAnIC8gJyArICgkc2NoZW1hVmFsdWUpICsgJywgJztcbiAgaWYgKGl0Lm9wdHMubXVsdGlwbGVPZlByZWNpc2lvbikge1xuICAgIG91dCArPSAnIE1hdGguYWJzKE1hdGgucm91bmQoZGl2aXNpb24nICsgKCRsdmwpICsgJykgLSBkaXZpc2lvbicgKyAoJGx2bCkgKyAnKSA+IDFlLScgKyAoaXQub3B0cy5tdWx0aXBsZU9mUHJlY2lzaW9uKSArICcgJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyBkaXZpc2lvbicgKyAoJGx2bCkgKyAnICE9PSBwYXJzZUludChkaXZpc2lvbicgKyAoJGx2bCkgKyAnKSAnO1xuICB9XG4gIG91dCArPSAnICkgJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAgKSAgJztcbiAgfVxuICBvdXQgKz0gJyApIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ211bHRpcGxlT2YnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IG11bHRpcGxlT2Y6ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgbXVsdGlwbGUgb2YgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSkgKyAnXFwnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfbm90KGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaGVtYSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoZW1hKS5sZW5ndGggPiAwKSB8fCAkc2NoZW1hID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaGVtYSwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsgICc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgJGl0LmNyZWF0ZUVycm9ycyA9IGZhbHNlO1xuICAgIHZhciAkYWxsRXJyb3JzT3B0aW9uO1xuICAgIGlmICgkaXQub3B0cy5hbGxFcnJvcnMpIHtcbiAgICAgICRhbGxFcnJvcnNPcHRpb24gPSAkaXQub3B0cy5hbGxFcnJvcnM7XG4gICAgICAkaXQub3B0cy5hbGxFcnJvcnMgPSBmYWxzZTtcbiAgICB9XG4gICAgb3V0ICs9ICcgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAkaXQuY3JlYXRlRXJyb3JzID0gdHJ1ZTtcbiAgICBpZiAoJGFsbEVycm9yc09wdGlvbikgJGl0Lm9wdHMuYWxsRXJyb3JzID0gJGFsbEVycm9yc09wdGlvbjtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAgICc7XG4gICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ25vdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGJlIHZhbGlkXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIHZhciBfX2VyciA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSBlbHNlIHsgIGVycm9ycyA9ICcgKyAoJGVycnMpICsgJzsgaWYgKHZFcnJvcnMgIT09IG51bGwpIHsgaWYgKCcgKyAoJGVycnMpICsgJykgdkVycm9ycy5sZW5ndGggPSAnICsgKCRlcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IG51bGw7IH0gJztcbiAgICBpZiAoaXQub3B0cy5hbGxFcnJvcnMpIHtcbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnbm90JykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczoge30gJztcbiAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgYmUgdmFsaWRcXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKGZhbHNlKSB7ICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX29uZU9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQsXG4gICAgJHByZXZWYWxpZCA9ICdwcmV2VmFsaWQnICsgJGx2bCxcbiAgICAkcGFzc2luZ1NjaGVtYXMgPSAncGFzc2luZ1NjaGVtYXMnICsgJGx2bDtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzICwgJyArICgkcHJldlZhbGlkKSArICcgPSBmYWxzZSAsICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZSAsICcgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcgPSBudWxsOyAnO1xuICB2YXIgJHdhc0NvbXBvc2l0ZSA9IGl0LmNvbXBvc2l0ZVJ1bGU7XG4gIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgaWYgKGFycjEpIHtcbiAgICB2YXIgJHNjaCwgJGkgPSAtMSxcbiAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAkc2NoID0gYXJyMVskaSArPSAxXTtcbiAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICRpdC5zY2hlbWFQYXRoID0gJHNjaGVtYVBhdGggKyAnWycgKyAkaSArICddJztcbiAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aCArICcvJyArICRpO1xuICAgICAgICBvdXQgKz0gJyAgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgIH1cbiAgICAgIGlmICgkaSkge1xuICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcgJiYgJyArICgkcHJldlZhbGlkKSArICcpIHsgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyAnICsgKCRwYXNzaW5nU2NoZW1hcykgKyAnID0gWycgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcsICcgKyAoJGkpICsgJ107IH0gZWxzZSB7ICc7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkcHJldlZhbGlkKSArICcgPSB0cnVlOyAnICsgKCRwYXNzaW5nU2NoZW1hcykgKyAnID0gJyArICgkaSkgKyAnOyB9JztcbiAgICB9XG4gIH1cbiAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgb3V0ICs9ICcnICsgKCRjbG9zaW5nQnJhY2VzKSArICdpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnb25lT2YnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHBhc3NpbmdTY2hlbWFzOiAnICsgKCRwYXNzaW5nU2NoZW1hcykgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIGV4YWN0bHkgb25lIHNjaGVtYSBpbiBvbmVPZlxcJyAnO1xuICAgIH1cbiAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICBvdXQgKz0gJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gdkVycm9yczsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfVxuICBvdXQgKz0gJ30gZWxzZSB7ICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9JztcbiAgaWYgKGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3BhdHRlcm4oaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkcmVnZXhwID0gJGlzRGF0YSA/ICcobmV3IFJlZ0V4cCgnICsgJHNjaGVtYVZhbHVlICsgJykpJyA6IGl0LnVzZVBhdHRlcm4oJHNjaGVtYSk7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnc3RyaW5nXFwnKSB8fCAnO1xuICB9XG4gIG91dCArPSAnICEnICsgKCRyZWdleHApICsgJy50ZXN0KCcgKyAoJGRhdGEpICsgJykgKSB7ICAgJztcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdwYXR0ZXJuJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwYXR0ZXJuOiAgJztcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIHBhdHRlcm4gXCInO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArIChpdC51dGlsLmVzY2FwZVF1b3Rlcygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJ1wiXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3Byb3BlcnRpZXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAka2V5ID0gJ2tleScgKyAkbHZsLFxuICAgICRpZHggPSAnaWR4JyArICRsdmwsXG4gICAgJGRhdGFOeHQgPSAkaXQuZGF0YUxldmVsID0gaXQuZGF0YUxldmVsICsgMSxcbiAgICAkbmV4dERhdGEgPSAnZGF0YScgKyAkZGF0YU54dCxcbiAgICAkZGF0YVByb3BlcnRpZXMgPSAnZGF0YVByb3BlcnRpZXMnICsgJGx2bDtcbiAgdmFyICRzY2hlbWFLZXlzID0gT2JqZWN0LmtleXMoJHNjaGVtYSB8fCB7fSkuZmlsdGVyKG5vdFByb3RvKSxcbiAgICAkcFByb3BlcnRpZXMgPSBpdC5zY2hlbWEucGF0dGVyblByb3BlcnRpZXMgfHwge30sXG4gICAgJHBQcm9wZXJ0eUtleXMgPSBPYmplY3Qua2V5cygkcFByb3BlcnRpZXMpLmZpbHRlcihub3RQcm90byksXG4gICAgJGFQcm9wZXJ0aWVzID0gaXQuc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLFxuICAgICRzb21lUHJvcGVydGllcyA9ICRzY2hlbWFLZXlzLmxlbmd0aCB8fCAkcFByb3BlcnR5S2V5cy5sZW5ndGgsXG4gICAgJG5vQWRkaXRpb25hbCA9ICRhUHJvcGVydGllcyA9PT0gZmFsc2UsXG4gICAgJGFkZGl0aW9uYWxJc1NjaGVtYSA9IHR5cGVvZiAkYVByb3BlcnRpZXMgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJGFQcm9wZXJ0aWVzKS5sZW5ndGgsXG4gICAgJHJlbW92ZUFkZGl0aW9uYWwgPSBpdC5vcHRzLnJlbW92ZUFkZGl0aW9uYWwsXG4gICAgJGNoZWNrQWRkaXRpb25hbCA9ICRub0FkZGl0aW9uYWwgfHwgJGFkZGl0aW9uYWxJc1NjaGVtYSB8fCAkcmVtb3ZlQWRkaXRpb25hbCxcbiAgICAkb3duUHJvcGVydGllcyA9IGl0Lm9wdHMub3duUHJvcGVydGllcyxcbiAgICAkY3VycmVudEJhc2VJZCA9IGl0LmJhc2VJZDtcbiAgdmFyICRyZXF1aXJlZCA9IGl0LnNjaGVtYS5yZXF1aXJlZDtcbiAgaWYgKCRyZXF1aXJlZCAmJiAhKGl0Lm9wdHMuJGRhdGEgJiYgJHJlcXVpcmVkLiRkYXRhKSAmJiAkcmVxdWlyZWQubGVuZ3RoIDwgaXQub3B0cy5sb29wUmVxdWlyZWQpIHtcbiAgICB2YXIgJHJlcXVpcmVkSGFzaCA9IGl0LnV0aWwudG9IYXNoKCRyZXF1aXJlZCk7XG4gIH1cblxuICBmdW5jdGlvbiBub3RQcm90byhwKSB7XG4gICAgcmV0dXJuIHAgIT09ICdfX3Byb3RvX18nO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczt2YXIgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyc7XG4gIGlmICgkb3duUHJvcGVydGllcykge1xuICAgIG91dCArPSAnIHZhciAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnID0gdW5kZWZpbmVkOyc7XG4gIH1cbiAgaWYgKCRjaGVja0FkZGl0aW9uYWwpIHtcbiAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnIHx8IE9iamVjdC5rZXlzKCcgKyAoJGRhdGEpICsgJyk7IGZvciAodmFyICcgKyAoJGlkeCkgKyAnPTA7ICcgKyAoJGlkeCkgKyAnPCcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcubGVuZ3RoOyAnICsgKCRpZHgpICsgJysrKSB7IHZhciAnICsgKCRrZXkpICsgJyA9ICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICdbJyArICgkaWR4KSArICddOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyBmb3IgKHZhciAnICsgKCRrZXkpICsgJyBpbiAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICB9XG4gICAgaWYgKCRzb21lUHJvcGVydGllcykge1xuICAgICAgb3V0ICs9ICcgdmFyIGlzQWRkaXRpb25hbCcgKyAoJGx2bCkgKyAnID0gIShmYWxzZSAnO1xuICAgICAgaWYgKCRzY2hlbWFLZXlzLmxlbmd0aCkge1xuICAgICAgICBpZiAoJHNjaGVtYUtleXMubGVuZ3RoID4gOCkge1xuICAgICAgICAgIG91dCArPSAnIHx8IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJy5oYXNPd25Qcm9wZXJ0eSgnICsgKCRrZXkpICsgJykgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYXJyMSA9ICRzY2hlbWFLZXlzO1xuICAgICAgICAgIGlmIChhcnIxKSB7XG4gICAgICAgICAgICB2YXIgJHByb3BlcnR5S2V5LCBpMSA9IC0xLFxuICAgICAgICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHdoaWxlIChpMSA8IGwxKSB7XG4gICAgICAgICAgICAgICRwcm9wZXJ0eUtleSA9IGFycjFbaTEgKz0gMV07XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICcgKyAoJGtleSkgKyAnID09ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkcHJvcGVydHlLZXkpKSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICgkcFByb3BlcnR5S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGFycjIgPSAkcFByb3BlcnR5S2V5cztcbiAgICAgICAgaWYgKGFycjIpIHtcbiAgICAgICAgICB2YXIgJHBQcm9wZXJ0eSwgJGkgPSAtMSxcbiAgICAgICAgICAgIGwyID0gYXJyMi5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlICgkaSA8IGwyKSB7XG4gICAgICAgICAgICAkcFByb3BlcnR5ID0gYXJyMlskaSArPSAxXTtcbiAgICAgICAgICAgIG91dCArPSAnIHx8ICcgKyAoaXQudXNlUGF0dGVybigkcFByb3BlcnR5KSkgKyAnLnRlc3QoJyArICgka2V5KSArICcpICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyApOyBpZiAoaXNBZGRpdGlvbmFsJyArICgkbHZsKSArICcpIHsgJztcbiAgICB9XG4gICAgaWYgKCRyZW1vdmVBZGRpdGlvbmFsID09ICdhbGwnKSB7XG4gICAgICBvdXQgKz0gJyBkZWxldGUgJyArICgkZGF0YSkgKyAnWycgKyAoJGtleSkgKyAnXTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyICRjdXJyZW50RXJyb3JQYXRoID0gaXQuZXJyb3JQYXRoO1xuICAgICAgdmFyICRhZGRpdGlvbmFsUHJvcGVydHkgPSAnXFwnICsgJyArICRrZXkgKyAnICsgXFwnJztcbiAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRrZXksIGl0Lm9wdHMuanNvblBvaW50ZXJzKTtcbiAgICAgIH1cbiAgICAgIGlmICgkbm9BZGRpdGlvbmFsKSB7XG4gICAgICAgIGlmICgkcmVtb3ZlQWRkaXRpb25hbCkge1xuICAgICAgICAgIG91dCArPSAnIGRlbGV0ZSAnICsgKCRkYXRhKSArICdbJyArICgka2V5KSArICddOyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnICcgKyAoJG5leHRWYWxpZCkgKyAnID0gZmFsc2U7ICc7XG4gICAgICAgICAgdmFyICRjdXJyRXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvYWRkaXRpb25hbFByb3BlcnRpZXMnO1xuICAgICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdhZGRpdGlvbmFsUHJvcGVydGllcycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgYWRkaXRpb25hbFByb3BlcnR5OiBcXCcnICsgKCRhZGRpdGlvbmFsUHJvcGVydHkpICsgJ1xcJyB9ICc7XG4gICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCcnO1xuICAgICAgICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhbiBpbnZhbGlkIGFkZGl0aW9uYWwgcHJvcGVydHknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IGZhbHNlICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICAgICAgfVxuICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gJGN1cnJFcnJTY2hlbWFQYXRoO1xuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBicmVhazsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoJGFkZGl0aW9uYWxJc1NjaGVtYSkge1xuICAgICAgICBpZiAoJHJlbW92ZUFkZGl0aW9uYWwgPT0gJ2ZhaWxpbmcnKSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsgICc7XG4gICAgICAgICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgICAgICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRhUHJvcGVydGllcztcbiAgICAgICAgICAkaXQuc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLmFkZGl0aW9uYWxQcm9wZXJ0aWVzJztcbiAgICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJztcbiAgICAgICAgICAkaXQuZXJyb3JQYXRoID0gaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5ID8gaXQuZXJyb3JQYXRoIDogaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRrZXksIGl0Lm9wdHMuanNvblBvaW50ZXJzKTtcbiAgICAgICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAka2V5ICsgJ10nO1xuICAgICAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSAka2V5O1xuICAgICAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgeyBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2YWxpZGF0ZS5lcnJvcnMgIT09IG51bGwpIHsgaWYgKGVycm9ycykgdmFsaWRhdGUuZXJyb3JzLmxlbmd0aCA9IGVycm9yczsgZWxzZSB2YWxpZGF0ZS5lcnJvcnMgPSBudWxsOyB9IGRlbGV0ZSAnICsgKCRkYXRhKSArICdbJyArICgka2V5KSArICddOyB9ICAnO1xuICAgICAgICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRhUHJvcGVydGllcztcbiAgICAgICAgICAkaXQuc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLmFkZGl0aW9uYWxQcm9wZXJ0aWVzJztcbiAgICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJztcbiAgICAgICAgICAkaXQuZXJyb3JQYXRoID0gaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5ID8gaXQuZXJyb3JQYXRoIDogaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRrZXksIGl0Lm9wdHMuanNvblBvaW50ZXJzKTtcbiAgICAgICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAka2V5ICsgJ10nO1xuICAgICAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSAka2V5O1xuICAgICAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIGJyZWFrOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaXQuZXJyb3JQYXRoID0gJGN1cnJlbnRFcnJvclBhdGg7XG4gICAgfVxuICAgIGlmICgkc29tZVByb3BlcnRpZXMpIHtcbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAgJztcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgfVxuICB9XG4gIHZhciAkdXNlRGVmYXVsdHMgPSBpdC5vcHRzLnVzZURlZmF1bHRzICYmICFpdC5jb21wb3NpdGVSdWxlO1xuICBpZiAoJHNjaGVtYUtleXMubGVuZ3RoKSB7XG4gICAgdmFyIGFycjMgPSAkc2NoZW1hS2V5cztcbiAgICBpZiAoYXJyMykge1xuICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTMgPSAtMSxcbiAgICAgICAgbDMgPSBhcnIzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaTMgPCBsMykge1xuICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIzW2kzICs9IDFdO1xuICAgICAgICB2YXIgJHNjaCA9ICRzY2hlbWFbJHByb3BlcnR5S2V5XTtcbiAgICAgICAgaWYgKChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2gpLmxlbmd0aCA+IDApIHx8ICRzY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoLCBpdC5SVUxFUy5hbGwpKSkge1xuICAgICAgICAgIHZhciAkcHJvcCA9IGl0LnV0aWwuZ2V0UHJvcGVydHkoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICRwYXNzRGF0YSA9ICRkYXRhICsgJHByb3AsXG4gICAgICAgICAgICAkaGFzRGVmYXVsdCA9ICR1c2VEZWZhdWx0cyAmJiAkc2NoLmRlZmF1bHQgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgJHByb3A7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aCArICcvJyArIGl0LnV0aWwuZXNjYXBlRnJhZ21lbnQoJHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAkaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoKGl0LmVycm9yUGF0aCwgJHByb3BlcnR5S2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9IGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHByb3BlcnR5S2V5KTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgJGNvZGUgPSBpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKTtcbiAgICAgICAgICAgIHZhciAkdXNlRGF0YSA9ICRwYXNzRGF0YTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyICR1c2VEYXRhID0gJG5leHREYXRhO1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJGhhc0RlZmF1bHQpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoJHJlcXVpcmVkSGFzaCAmJiAkcmVxdWlyZWRIYXNoWyRwcm9wZXJ0eUtleV0pIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnKSB7ICcgKyAoJG5leHRWYWxpZCkgKyAnID0gZmFsc2U7ICc7XG4gICAgICAgICAgICAgIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aCxcbiAgICAgICAgICAgICAgICAkY3VyckVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aCgkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5S2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9yZXF1aXJlZCc7XG4gICAgICAgICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgncmVxdWlyZWQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IG1pc3NpbmdQcm9wZXJ0eTogXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXCcgfSAnO1xuICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCcnO1xuICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJ2lzIGEgcmVxdWlyZWQgcHJvcGVydHknO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdzaG91bGQgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSBcXFxcXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXFxcXFwnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBfX2VyciA9IG91dDtcbiAgICAgICAgICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgJGVyclNjaGVtYVBhdGggPSAkY3VyckVyclNjaGVtYVBhdGg7XG4gICAgICAgICAgICAgIGl0LmVycm9yUGF0aCA9ICRjdXJyZW50RXJyb3JQYXRoO1xuICAgICAgICAgICAgICBvdXQgKz0gJyB9IGVsc2UgeyAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyBpZiAoICcgKyAoJHVzZURhdGEpICsgJyA9PT0gdW5kZWZpbmVkICc7XG4gICAgICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJykgeyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IHRydWU7IH0gZWxzZSB7ICc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHVzZURhdGEpICsgJyAhPT0gdW5kZWZpbmVkICc7XG4gICAgICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAmJiAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyApIHsgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgJyArICgkY29kZSkgKyAnIH0gJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgJztcbiAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRwUHJvcGVydHlLZXlzLmxlbmd0aCkge1xuICAgIHZhciBhcnI0ID0gJHBQcm9wZXJ0eUtleXM7XG4gICAgaWYgKGFycjQpIHtcbiAgICAgIHZhciAkcFByb3BlcnR5LCBpNCA9IC0xLFxuICAgICAgICBsNCA9IGFycjQubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpNCA8IGw0KSB7XG4gICAgICAgICRwUHJvcGVydHkgPSBhcnI0W2k0ICs9IDFdO1xuICAgICAgICB2YXIgJHNjaCA9ICRwUHJvcGVydGllc1skcFByb3BlcnR5XTtcbiAgICAgICAgaWYgKChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2gpLmxlbmd0aCA+IDApIHx8ICRzY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoLCBpdC5SVUxFUy5hbGwpKSkge1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkc2NoO1xuICAgICAgICAgICRpdC5zY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcucGF0dGVyblByb3BlcnRpZXMnICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgkcFByb3BlcnR5KTtcbiAgICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL3BhdHRlcm5Qcm9wZXJ0aWVzLycgKyBpdC51dGlsLmVzY2FwZUZyYWdtZW50KCRwUHJvcGVydHkpO1xuICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyA9ICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgfHwgT2JqZWN0LmtleXMoJyArICgkZGF0YSkgKyAnKTsgZm9yICh2YXIgJyArICgkaWR4KSArICc9MDsgJyArICgkaWR4KSArICc8JyArICgkZGF0YVByb3BlcnRpZXMpICsgJy5sZW5ndGg7ICcgKyAoJGlkeCkgKyAnKyspIHsgdmFyICcgKyAoJGtleSkgKyAnID0gJyArICgkZGF0YVByb3BlcnRpZXMpICsgJ1snICsgKCRpZHgpICsgJ107ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGtleSkgKyAnIGluICcgKyAoJGRhdGEpICsgJykgeyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArIChpdC51c2VQYXR0ZXJuKCRwUHJvcGVydHkpKSArICcudGVzdCgnICsgKCRrZXkpICsgJykpIHsgJztcbiAgICAgICAgICAkaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRrZXksIGl0Lm9wdHMuanNvblBvaW50ZXJzKTtcbiAgICAgICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAka2V5ICsgJ10nO1xuICAgICAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSAka2V5O1xuICAgICAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIGJyZWFrOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIG91dCArPSAnIGVsc2UgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICAnO1xuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgJztcbiAgICAgICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3Byb3BlcnR5TmFtZXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsnO1xuICBpZiAoKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2hlbWEgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaGVtYSkubGVuZ3RoID4gMCkgfHwgJHNjaGVtYSA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2hlbWEsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIHZhciAka2V5ID0gJ2tleScgKyAkbHZsLFxuICAgICAgJGlkeCA9ICdpZHgnICsgJGx2bCxcbiAgICAgICRpID0gJ2knICsgJGx2bCxcbiAgICAgICRpbnZhbGlkTmFtZSA9ICdcXCcgKyAnICsgJGtleSArICcgKyBcXCcnLFxuICAgICAgJGRhdGFOeHQgPSAkaXQuZGF0YUxldmVsID0gaXQuZGF0YUxldmVsICsgMSxcbiAgICAgICRuZXh0RGF0YSA9ICdkYXRhJyArICRkYXRhTnh0LFxuICAgICAgJGRhdGFQcm9wZXJ0aWVzID0gJ2RhdGFQcm9wZXJ0aWVzJyArICRsdmwsXG4gICAgICAkb3duUHJvcGVydGllcyA9IGl0Lm9wdHMub3duUHJvcGVydGllcyxcbiAgICAgICRjdXJyZW50QmFzZUlkID0gaXQuYmFzZUlkO1xuICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgPSB1bmRlZmluZWQ7ICc7XG4gICAgfVxuICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgb3V0ICs9ICcgJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyA9ICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgfHwgT2JqZWN0LmtleXMoJyArICgkZGF0YSkgKyAnKTsgZm9yICh2YXIgJyArICgkaWR4KSArICc9MDsgJyArICgkaWR4KSArICc8JyArICgkZGF0YVByb3BlcnRpZXMpICsgJy5sZW5ndGg7ICcgKyAoJGlkeCkgKyAnKyspIHsgdmFyICcgKyAoJGtleSkgKyAnID0gJyArICgkZGF0YVByb3BlcnRpZXMpICsgJ1snICsgKCRpZHgpICsgJ107ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGtleSkgKyAnIGluICcgKyAoJGRhdGEpICsgJykgeyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB2YXIgc3RhcnRFcnJzJyArICgkbHZsKSArICcgPSBlcnJvcnM7ICc7XG4gICAgdmFyICRwYXNzRGF0YSA9ICRrZXk7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgIG91dCArPSAnICcgKyAoaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSkpICsgJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgIH1cbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIHsgZm9yICh2YXIgJyArICgkaSkgKyAnPXN0YXJ0RXJycycgKyAoJGx2bCkgKyAnOyAnICsgKCRpKSArICc8ZXJyb3JzOyAnICsgKCRpKSArICcrKykgeyB2RXJyb3JzWycgKyAoJGkpICsgJ10ucHJvcGVydHlOYW1lID0gJyArICgka2V5KSArICc7IH0gICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3Byb3BlcnR5TmFtZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHByb3BlcnR5TmFtZTogXFwnJyArICgkaW52YWxpZE5hbWUpICsgJ1xcJyB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdwcm9wZXJ0eSBuYW1lIFxcXFxcXCcnICsgKCRpbnZhbGlkTmFtZSkgKyAnXFxcXFxcJyBpcyBpbnZhbGlkXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBicmVhazsgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSB9JztcbiAgfVxuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMpICsgJyBpZiAoJyArICgkZXJycykgKyAnID09IGVycm9ycykgeyc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcmVmKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkYXN5bmMsICRyZWZDb2RlO1xuICBpZiAoJHNjaGVtYSA9PSAnIycgfHwgJHNjaGVtYSA9PSAnIy8nKSB7XG4gICAgaWYgKGl0LmlzUm9vdCkge1xuICAgICAgJGFzeW5jID0gaXQuYXN5bmM7XG4gICAgICAkcmVmQ29kZSA9ICd2YWxpZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgICRhc3luYyA9IGl0LnJvb3Quc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZTtcbiAgICAgICRyZWZDb2RlID0gJ3Jvb3QucmVmVmFsWzBdJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyICRyZWZWYWwgPSBpdC5yZXNvbHZlUmVmKGl0LmJhc2VJZCwgJHNjaGVtYSwgaXQuaXNSb290KTtcbiAgICBpZiAoJHJlZlZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgJG1lc3NhZ2UgPSBpdC5NaXNzaW5nUmVmRXJyb3IubWVzc2FnZShpdC5iYXNlSWQsICRzY2hlbWEpO1xuICAgICAgaWYgKGl0Lm9wdHMubWlzc2luZ1JlZnMgPT0gJ2ZhaWwnKSB7XG4gICAgICAgIGl0LmxvZ2dlci5lcnJvcigkbWVzc2FnZSk7XG4gICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnJHJlZicpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcmVmOiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKSArICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdjYW5cXFxcXFwndCByZXNvbHZlIHJlZmVyZW5jZSAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKSArICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKGZhbHNlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXQub3B0cy5taXNzaW5nUmVmcyA9PSAnaWdub3JlJykge1xuICAgICAgICBpdC5sb2dnZXIud2FybigkbWVzc2FnZSk7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IGl0Lk1pc3NpbmdSZWZFcnJvcihpdC5iYXNlSWQsICRzY2hlbWEsICRtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCRyZWZWYWwuaW5saW5lKSB7XG4gICAgICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgICAgICRpdC5sZXZlbCsrO1xuICAgICAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICAgICAgJGl0LnNjaGVtYSA9ICRyZWZWYWwuc2NoZW1hO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSAnJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJHNjaGVtYTtcbiAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCkucmVwbGFjZSgvdmFsaWRhdGVcXC5zY2hlbWEvZywgJHJlZlZhbC5jb2RlKTtcbiAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICRhc3luYyA9ICRyZWZWYWwuJGFzeW5jID09PSB0cnVlIHx8IChpdC5hc3luYyAmJiAkcmVmVmFsLiRhc3luYyAhPT0gZmFsc2UpO1xuICAgICAgJHJlZkNvZGUgPSAkcmVmVmFsLmNvZGU7XG4gICAgfVxuICB9XG4gIGlmICgkcmVmQ29kZSkge1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJztcbiAgICBpZiAoaXQub3B0cy5wYXNzQ29udGV4dCkge1xuICAgICAgb3V0ICs9ICcgJyArICgkcmVmQ29kZSkgKyAnLmNhbGwodGhpcywgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgJyArICgkcmVmQ29kZSkgKyAnKCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAnICsgKCRkYXRhKSArICcsIChkYXRhUGF0aCB8fCBcXCdcXCcpJztcbiAgICBpZiAoaXQuZXJyb3JQYXRoICE9ICdcIlwiJykge1xuICAgICAgb3V0ICs9ICcgKyAnICsgKGl0LmVycm9yUGF0aCk7XG4gICAgfVxuICAgIHZhciAkcGFyZW50RGF0YSA9ICRkYXRhTHZsID8gJ2RhdGEnICsgKCgkZGF0YUx2bCAtIDEpIHx8ICcnKSA6ICdwYXJlbnREYXRhJyxcbiAgICAgICRwYXJlbnREYXRhUHJvcGVydHkgPSAkZGF0YUx2bCA/IGl0LmRhdGFQYXRoQXJyWyRkYXRhTHZsXSA6ICdwYXJlbnREYXRhUHJvcGVydHknO1xuICAgIG91dCArPSAnICwgJyArICgkcGFyZW50RGF0YSkgKyAnICwgJyArICgkcGFyZW50RGF0YVByb3BlcnR5KSArICcsIHJvb3REYXRhKSAgJztcbiAgICB2YXIgX19jYWxsVmFsaWRhdGUgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoJGFzeW5jKSB7XG4gICAgICBpZiAoIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIHNjaGVtYSByZWZlcmVuY2VkIGJ5IHN5bmMgc2NoZW1hJyk7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJzsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRyeSB7IGF3YWl0ICcgKyAoX19jYWxsVmFsaWRhdGUpICsgJzsgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSBjYXRjaCAoZSkgeyBpZiAoIShlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkgdGhyb3cgZTsgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBlLmVycm9yczsgZWxzZSB2RXJyb3JzID0gdkVycm9ycy5jb25jYXQoZS5lcnJvcnMpOyBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCR2YWxpZCkgKyAnKSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGlmICghJyArIChfX2NhbGxWYWxpZGF0ZSkgKyAnKSB7IGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gJyArICgkcmVmQ29kZSkgKyAnLmVycm9yczsgZWxzZSB2RXJyb3JzID0gdkVycm9ycy5jb25jYXQoJyArICgkcmVmQ29kZSkgKyAnLmVycm9ycyk7IGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOyB9ICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcmVxdWlyZWQoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICR2U2NoZW1hID0gJ3NjaGVtYScgKyAkbHZsO1xuICBpZiAoISRpc0RhdGEpIHtcbiAgICBpZiAoJHNjaGVtYS5sZW5ndGggPCBpdC5vcHRzLmxvb3BSZXF1aXJlZCAmJiBpdC5zY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhpdC5zY2hlbWEucHJvcGVydGllcykubGVuZ3RoKSB7XG4gICAgICB2YXIgJHJlcXVpcmVkID0gW107XG4gICAgICB2YXIgYXJyMSA9ICRzY2hlbWE7XG4gICAgICBpZiAoYXJyMSkge1xuICAgICAgICB2YXIgJHByb3BlcnR5LCBpMSA9IC0xLFxuICAgICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoaTEgPCBsMSkge1xuICAgICAgICAgICRwcm9wZXJ0eSA9IGFycjFbaTEgKz0gMV07XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eVNjaCA9IGl0LnNjaGVtYS5wcm9wZXJ0aWVzWyRwcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKCEoJHByb3BlcnR5U2NoICYmIChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkcHJvcGVydHlTY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHByb3BlcnR5U2NoKS5sZW5ndGggPiAwKSB8fCAkcHJvcGVydHlTY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkcHJvcGVydHlTY2gsIGl0LlJVTEVTLmFsbCkpKSkge1xuICAgICAgICAgICAgJHJlcXVpcmVkWyRyZXF1aXJlZC5sZW5ndGhdID0gJHByb3BlcnR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgJHJlcXVpcmVkID0gJHNjaGVtYTtcbiAgICB9XG4gIH1cbiAgaWYgKCRpc0RhdGEgfHwgJHJlcXVpcmVkLmxlbmd0aCkge1xuICAgIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aCxcbiAgICAgICRsb29wUmVxdWlyZWQgPSAkaXNEYXRhIHx8ICRyZXF1aXJlZC5sZW5ndGggPj0gaXQub3B0cy5sb29wUmVxdWlyZWQsXG4gICAgICAkb3duUHJvcGVydGllcyA9IGl0Lm9wdHMub3duUHJvcGVydGllcztcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgdmFyIG1pc3NpbmcnICsgKCRsdmwpICsgJzsgJztcbiAgICAgIGlmICgkbG9vcFJlcXVpcmVkKSB7XG4gICAgICAgIGlmICghJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICRpID0gJ2knICsgJGx2bCxcbiAgICAgICAgICAkcHJvcGVydHlQYXRoID0gJ3NjaGVtYScgKyAkbHZsICsgJ1snICsgJGkgKyAnXScsXG4gICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9ICdcXCcgKyAnICsgJHByb3BlcnR5UGF0aCArICcgKyBcXCcnO1xuICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAoc2NoZW1hJyArICgkbHZsKSArICcgPT09IHVuZGVmaW5lZCkgJyArICgkdmFsaWQpICsgJyA9IHRydWU7IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYScgKyAoJGx2bCkgKyAnKSkgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyBlbHNlIHsnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGkpICsgJyA9IDA7ICcgKyAoJGkpICsgJyA8ICcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSB7ICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRkYXRhKSArICdbJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ11dICE9PSB1bmRlZmluZWQgJztcbiAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgb3V0ICs9ICcgJiYgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJzsgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSBicmVhazsgfSAnO1xuICAgICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnICB9ICAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnICBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyBpZiAoICc7XG4gICAgICAgIHZhciBhcnIyID0gJHJlcXVpcmVkO1xuICAgICAgICBpZiAoYXJyMikge1xuICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksICRpID0gLTEsXG4gICAgICAgICAgICBsMiA9IGFycjIubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMikge1xuICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyMlskaSArPSAxXTtcbiAgICAgICAgICAgIGlmICgkaSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkdXNlRGF0YSA9ICRkYXRhICsgJHByb3A7XG4gICAgICAgICAgICBvdXQgKz0gJyAoICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpICYmIChtaXNzaW5nJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoaXQub3B0cy5qc29uUG9pbnRlcnMgPyAkcHJvcGVydHlLZXkgOiAkcHJvcCkpICsgJykgKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykgeyAgJztcbiAgICAgICAgdmFyICRwcm9wZXJ0eVBhdGggPSAnbWlzc2luZycgKyAkbHZsLFxuICAgICAgICAgICRtaXNzaW5nUHJvcGVydHkgPSAnXFwnICsgJyArICRwcm9wZXJ0eVBhdGggKyAnICsgXFwnJztcbiAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuanNvblBvaW50ZXJzID8gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgdHJ1ZSkgOiAkY3VycmVudEVycm9yUGF0aCArICcgKyAnICsgJHByb3BlcnR5UGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkbG9vcFJlcXVpcmVkKSB7XG4gICAgICAgIGlmICghJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICRpID0gJ2knICsgJGx2bCxcbiAgICAgICAgICAkcHJvcGVydHlQYXRoID0gJ3NjaGVtYScgKyAkbHZsICsgJ1snICsgJGkgKyAnXScsXG4gICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9ICdcXCcgKyAnICsgJHByb3BlcnR5UGF0aCArICcgKyBcXCcnO1xuICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHZTY2hlbWEpICsgJyAmJiAhQXJyYXkuaXNBcnJheSgnICsgKCR2U2NoZW1hKSArICcpKSB7ICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJ2lzIGEgcmVxdWlyZWQgcHJvcGVydHknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSBlbHNlIGlmICgnICsgKCR2U2NoZW1hKSArICcgIT09IHVuZGVmaW5lZCkgeyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGkpICsgJyA9IDA7ICcgKyAoJGkpICsgJyA8ICcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSB7IGlmICgnICsgKCRkYXRhKSArICdbJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ11dID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyB9IH0gJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyAgfSAgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycjMgPSAkcmVxdWlyZWQ7XG4gICAgICAgIGlmIChhcnIzKSB7XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTMgPSAtMSxcbiAgICAgICAgICAgIGwzID0gYXJyMy5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlIChpMyA8IGwzKSB7XG4gICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIzW2kzICs9IDFdO1xuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJHVzZURhdGEgPSAkZGF0YSArICRwcm9wO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpKSArICdcXCcpICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgncmVxdWlyZWQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IG1pc3NpbmdQcm9wZXJ0eTogXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXCcgfSAnO1xuICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdzaG91bGQgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSBcXFxcXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXFxcXFwnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgfSBlbHNlIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgaWYgKHRydWUpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3VuaXF1ZUl0ZW1zKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIGlmICgoJHNjaGVtYSB8fCAkaXNEYXRhKSAmJiBpdC5vcHRzLnVuaXF1ZUl0ZW1zICE9PSBmYWxzZSkge1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJzsgaWYgKCcgKyAoJHNjaGVtYVZhbHVlKSArICcgPT09IGZhbHNlIHx8ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPT09IHVuZGVmaW5lZCkgJyArICgkdmFsaWQpICsgJyA9IHRydWU7IGVsc2UgaWYgKHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ2Jvb2xlYW5cXCcpICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgZWxzZSB7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIHZhciBpID0gJyArICgkZGF0YSkgKyAnLmxlbmd0aCAsICcgKyAoJHZhbGlkKSArICcgPSB0cnVlICwgajsgaWYgKGkgPiAxKSB7ICc7XG4gICAgdmFyICRpdGVtVHlwZSA9IGl0LnNjaGVtYS5pdGVtcyAmJiBpdC5zY2hlbWEuaXRlbXMudHlwZSxcbiAgICAgICR0eXBlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoJGl0ZW1UeXBlKTtcbiAgICBpZiAoISRpdGVtVHlwZSB8fCAkaXRlbVR5cGUgPT0gJ29iamVjdCcgfHwgJGl0ZW1UeXBlID09ICdhcnJheScgfHwgKCR0eXBlSXNBcnJheSAmJiAoJGl0ZW1UeXBlLmluZGV4T2YoJ29iamVjdCcpID49IDAgfHwgJGl0ZW1UeXBlLmluZGV4T2YoJ2FycmF5JykgPj0gMCkpKSB7XG4gICAgICBvdXQgKz0gJyBvdXRlcjogZm9yICg7aS0tOykgeyBmb3IgKGogPSBpOyBqLS07KSB7IGlmIChlcXVhbCgnICsgKCRkYXRhKSArICdbaV0sICcgKyAoJGRhdGEpICsgJ1tqXSkpIHsgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyBicmVhayBvdXRlcjsgfSB9IH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyIGl0ZW1JbmRpY2VzID0ge30sIGl0ZW07IGZvciAoO2ktLTspIHsgdmFyIGl0ZW0gPSAnICsgKCRkYXRhKSArICdbaV07ICc7XG4gICAgICB2YXIgJG1ldGhvZCA9ICdjaGVja0RhdGFUeXBlJyArICgkdHlwZUlzQXJyYXkgPyAncycgOiAnJyk7XG4gICAgICBvdXQgKz0gJyBpZiAoJyArIChpdC51dGlsWyRtZXRob2RdKCRpdGVtVHlwZSwgJ2l0ZW0nLCBpdC5vcHRzLnN0cmljdE51bWJlcnMsIHRydWUpKSArICcpIGNvbnRpbnVlOyAnO1xuICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICBvdXQgKz0gJyBpZiAodHlwZW9mIGl0ZW0gPT0gXFwnc3RyaW5nXFwnKSBpdGVtID0gXFwnXCJcXCcgKyBpdGVtOyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgaWYgKHR5cGVvZiBpdGVtSW5kaWNlc1tpdGVtXSA9PSBcXCdudW1iZXJcXCcpIHsgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyBqID0gaXRlbUluZGljZXNbaXRlbV07IGJyZWFrOyB9IGl0ZW1JbmRpY2VzW2l0ZW1dID0gaTsgfSAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgIG91dCArPSAnICB9ICAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCd1bmlxdWVJdGVtcycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgaTogaSwgajogaiB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGhhdmUgZHVwbGljYXRlIGl0ZW1zIChpdGVtcyAjIyBcXCcgKyBqICsgXFwnIGFuZCBcXCcgKyBpICsgXFwnIGFyZSBpZGVudGljYWwpXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJ3ZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBpZiAodHJ1ZSkgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV92YWxpZGF0ZShpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyc7XG4gIHZhciAkYXN5bmMgPSBpdC5zY2hlbWEuJGFzeW5jID09PSB0cnVlLFxuICAgICRyZWZLZXl3b3JkcyA9IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXNFeGNlcHQoaXQuc2NoZW1hLCBpdC5SVUxFUy5hbGwsICckcmVmJyksXG4gICAgJGlkID0gaXQuc2VsZi5fZ2V0SWQoaXQuc2NoZW1hKTtcbiAgaWYgKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMpIHtcbiAgICB2YXIgJHVua25vd25Ld2QgPSBpdC51dGlsLnNjaGVtYVVua25vd25SdWxlcyhpdC5zY2hlbWEsIGl0LlJVTEVTLmtleXdvcmRzKTtcbiAgICBpZiAoJHVua25vd25Ld2QpIHtcbiAgICAgIHZhciAka2V5d29yZHNNc2cgPSAndW5rbm93biBrZXl3b3JkOiAnICsgJHVua25vd25Ld2Q7XG4gICAgICBpZiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA9PT0gJ2xvZycpIGl0LmxvZ2dlci53YXJuKCRrZXl3b3Jkc01zZyk7XG4gICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigka2V5d29yZHNNc2cpO1xuICAgIH1cbiAgfVxuICBpZiAoaXQuaXNUb3ApIHtcbiAgICBvdXQgKz0gJyB2YXIgdmFsaWRhdGUgPSAnO1xuICAgIGlmICgkYXN5bmMpIHtcbiAgICAgIGl0LmFzeW5jID0gdHJ1ZTtcbiAgICAgIG91dCArPSAnYXN5bmMgJztcbiAgICB9XG4gICAgb3V0ICs9ICdmdW5jdGlvbihkYXRhLCBkYXRhUGF0aCwgcGFyZW50RGF0YSwgcGFyZW50RGF0YVByb3BlcnR5LCByb290RGF0YSkgeyBcXCd1c2Ugc3RyaWN0XFwnOyAnO1xuICAgIGlmICgkaWQgJiYgKGl0Lm9wdHMuc291cmNlQ29kZSB8fCBpdC5vcHRzLnByb2Nlc3NDb2RlKSkge1xuICAgICAgb3V0ICs9ICcgJyArICgnL1xcKiMgc291cmNlVVJMPScgKyAkaWQgKyAnICovJykgKyAnICc7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgaXQuc2NoZW1hID09ICdib29sZWFuJyB8fCAhKCRyZWZLZXl3b3JkcyB8fCBpdC5zY2hlbWEuJHJlZikpIHtcbiAgICB2YXIgJGtleXdvcmQgPSAnZmFsc2Ugc2NoZW1hJztcbiAgICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICAgIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gICAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICAgIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgICB2YXIgJGVycm9yS2V5d29yZDtcbiAgICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICAgIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgICBpZiAoaXQuc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgaWYgKGl0LmlzVG9wKSB7XG4gICAgICAgICRicmVha09uRXJyb3IgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgJztcbiAgICAgIH1cbiAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnZmFsc2Ugc2NoZW1hJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczoge30gJztcbiAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdib29sZWFuIHNjaGVtYSBpcyBmYWxzZVxcJyAnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogZmFsc2UgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgIH1cbiAgICAgIHZhciBfX2VyciA9IG91dDtcbiAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXQuaXNUb3ApIHtcbiAgICAgICAgaWYgKCRhc3luYykge1xuICAgICAgICAgIG91dCArPSAnIHJldHVybiBkYXRhOyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IG51bGw7IHJldHVybiB0cnVlOyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJyA9IHRydWU7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdC5pc1RvcCkge1xuICAgICAgb3V0ICs9ICcgfTsgcmV0dXJuIHZhbGlkYXRlOyAnO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIGlmIChpdC5pc1RvcCkge1xuICAgIHZhciAkdG9wID0gaXQuaXNUb3AsXG4gICAgICAkbHZsID0gaXQubGV2ZWwgPSAwLFxuICAgICAgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWwgPSAwLFxuICAgICAgJGRhdGEgPSAnZGF0YSc7XG4gICAgaXQucm9vdElkID0gaXQucmVzb2x2ZS5mdWxsUGF0aChpdC5zZWxmLl9nZXRJZChpdC5yb290LnNjaGVtYSkpO1xuICAgIGl0LmJhc2VJZCA9IGl0LmJhc2VJZCB8fCBpdC5yb290SWQ7XG4gICAgZGVsZXRlIGl0LmlzVG9wO1xuICAgIGl0LmRhdGFQYXRoQXJyID0gW1wiXCJdO1xuICAgIGlmIChpdC5zY2hlbWEuZGVmYXVsdCAhPT0gdW5kZWZpbmVkICYmIGl0Lm9wdHMudXNlRGVmYXVsdHMgJiYgaXQub3B0cy5zdHJpY3REZWZhdWx0cykge1xuICAgICAgdmFyICRkZWZhdWx0TXNnID0gJ2RlZmF1bHQgaXMgaWdub3JlZCBpbiB0aGUgc2NoZW1hIHJvb3QnO1xuICAgICAgaWYgKGl0Lm9wdHMuc3RyaWN0RGVmYXVsdHMgPT09ICdsb2cnKSBpdC5sb2dnZXIud2FybigkZGVmYXVsdE1zZyk7XG4gICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigkZGVmYXVsdE1zZyk7XG4gICAgfVxuICAgIG91dCArPSAnIHZhciB2RXJyb3JzID0gbnVsbDsgJztcbiAgICBvdXQgKz0gJyB2YXIgZXJyb3JzID0gMDsgICAgICc7XG4gICAgb3V0ICs9ICcgaWYgKHJvb3REYXRhID09PSB1bmRlZmluZWQpIHJvb3REYXRhID0gZGF0YTsgJztcbiAgfSBlbHNlIHtcbiAgICB2YXIgJGx2bCA9IGl0LmxldmVsLFxuICAgICAgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWwsXG4gICAgICAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gICAgaWYgKCRpZCkgaXQuYmFzZUlkID0gaXQucmVzb2x2ZS51cmwoaXQuYmFzZUlkLCAkaWQpO1xuICAgIGlmICgkYXN5bmMgJiYgIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIHNjaGVtYSBpbiBzeW5jIHNjaGVtYScpO1xuICAgIG91dCArPSAnIHZhciBlcnJzXycgKyAoJGx2bCkgKyAnID0gZXJyb3JzOyc7XG4gIH1cbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsLFxuICAgICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnMsXG4gICAgJGNsb3NpbmdCcmFjZXMxID0gJycsXG4gICAgJGNsb3NpbmdCcmFjZXMyID0gJyc7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJHR5cGVTY2hlbWEgPSBpdC5zY2hlbWEudHlwZSxcbiAgICAkdHlwZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCR0eXBlU2NoZW1hKTtcbiAgaWYgKCR0eXBlU2NoZW1hICYmIGl0Lm9wdHMubnVsbGFibGUgJiYgaXQuc2NoZW1hLm51bGxhYmxlID09PSB0cnVlKSB7XG4gICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgaWYgKCR0eXBlU2NoZW1hLmluZGV4T2YoJ251bGwnKSA9PSAtMSkgJHR5cGVTY2hlbWEgPSAkdHlwZVNjaGVtYS5jb25jYXQoJ251bGwnKTtcbiAgICB9IGVsc2UgaWYgKCR0eXBlU2NoZW1hICE9ICdudWxsJykge1xuICAgICAgJHR5cGVTY2hlbWEgPSBbJHR5cGVTY2hlbWEsICdudWxsJ107XG4gICAgICAkdHlwZUlzQXJyYXkgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoJHR5cGVJc0FycmF5ICYmICR0eXBlU2NoZW1hLmxlbmd0aCA9PSAxKSB7XG4gICAgJHR5cGVTY2hlbWEgPSAkdHlwZVNjaGVtYVswXTtcbiAgICAkdHlwZUlzQXJyYXkgPSBmYWxzZTtcbiAgfVxuICBpZiAoaXQuc2NoZW1hLiRyZWYgJiYgJHJlZktleXdvcmRzKSB7XG4gICAgaWYgKGl0Lm9wdHMuZXh0ZW5kUmVmcyA9PSAnZmFpbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignJHJlZjogdmFsaWRhdGlvbiBrZXl3b3JkcyB1c2VkIGluIHNjaGVtYSBhdCBwYXRoIFwiJyArIGl0LmVyclNjaGVtYVBhdGggKyAnXCIgKHNlZSBvcHRpb24gZXh0ZW5kUmVmcyknKTtcbiAgICB9IGVsc2UgaWYgKGl0Lm9wdHMuZXh0ZW5kUmVmcyAhPT0gdHJ1ZSkge1xuICAgICAgJHJlZktleXdvcmRzID0gZmFsc2U7XG4gICAgICBpdC5sb2dnZXIud2FybignJHJlZjoga2V5d29yZHMgaWdub3JlZCBpbiBzY2hlbWEgYXQgcGF0aCBcIicgKyBpdC5lcnJTY2hlbWFQYXRoICsgJ1wiJyk7XG4gICAgfVxuICB9XG4gIGlmIChpdC5zY2hlbWEuJGNvbW1lbnQgJiYgaXQub3B0cy4kY29tbWVudCkge1xuICAgIG91dCArPSAnICcgKyAoaXQuUlVMRVMuYWxsLiRjb21tZW50LmNvZGUoaXQsICckY29tbWVudCcpKTtcbiAgfVxuICBpZiAoJHR5cGVTY2hlbWEpIHtcbiAgICBpZiAoaXQub3B0cy5jb2VyY2VUeXBlcykge1xuICAgICAgdmFyICRjb2VyY2VUb1R5cGVzID0gaXQudXRpbC5jb2VyY2VUb1R5cGVzKGl0Lm9wdHMuY29lcmNlVHlwZXMsICR0eXBlU2NoZW1hKTtcbiAgICB9XG4gICAgdmFyICRydWxlc0dyb3VwID0gaXQuUlVMRVMudHlwZXNbJHR5cGVTY2hlbWFdO1xuICAgIGlmICgkY29lcmNlVG9UeXBlcyB8fCAkdHlwZUlzQXJyYXkgfHwgJHJ1bGVzR3JvdXAgPT09IHRydWUgfHwgKCRydWxlc0dyb3VwICYmICEkc2hvdWxkVXNlR3JvdXAoJHJ1bGVzR3JvdXApKSkge1xuICAgICAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcudHlwZScsXG4gICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvdHlwZSc7XG4gICAgICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50eXBlJyxcbiAgICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy90eXBlJyxcbiAgICAgICAgJG1ldGhvZCA9ICR0eXBlSXNBcnJheSA/ICdjaGVja0RhdGFUeXBlcycgOiAnY2hlY2tEYXRhVHlwZSc7XG4gICAgICBvdXQgKz0gJyBpZiAoJyArIChpdC51dGlsWyRtZXRob2RdKCR0eXBlU2NoZW1hLCAkZGF0YSwgaXQub3B0cy5zdHJpY3ROdW1iZXJzLCB0cnVlKSkgKyAnKSB7ICc7XG4gICAgICBpZiAoJGNvZXJjZVRvVHlwZXMpIHtcbiAgICAgICAgdmFyICRkYXRhVHlwZSA9ICdkYXRhVHlwZScgKyAkbHZsLFxuICAgICAgICAgICRjb2VyY2VkID0gJ2NvZXJjZWQnICsgJGx2bDtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJGRhdGFUeXBlKSArICcgPSB0eXBlb2YgJyArICgkZGF0YSkgKyAnOyB2YXIgJyArICgkY29lcmNlZCkgKyAnID0gdW5kZWZpbmVkOyAnO1xuICAgICAgICBpZiAoaXQub3B0cy5jb2VyY2VUeXBlcyA9PSAnYXJyYXknKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnb2JqZWN0XFwnICYmIEFycmF5LmlzQXJyYXkoJyArICgkZGF0YSkgKyAnKSAmJiAnICsgKCRkYXRhKSArICcubGVuZ3RoID09IDEpIHsgJyArICgkZGF0YSkgKyAnID0gJyArICgkZGF0YSkgKyAnWzBdOyAnICsgKCRkYXRhVHlwZSkgKyAnID0gdHlwZW9mICcgKyAoJGRhdGEpICsgJzsgaWYgKCcgKyAoaXQudXRpbC5jaGVja0RhdGFUeXBlKGl0LnNjaGVtYS50eXBlLCAkZGF0YSwgaXQub3B0cy5zdHJpY3ROdW1iZXJzKSkgKyAnKSAnICsgKCRjb2VyY2VkKSArICcgPSAnICsgKCRkYXRhKSArICc7IH0gJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkY29lcmNlZCkgKyAnICE9PSB1bmRlZmluZWQpIDsgJztcbiAgICAgICAgdmFyIGFycjEgPSAkY29lcmNlVG9UeXBlcztcbiAgICAgICAgaWYgKGFycjEpIHtcbiAgICAgICAgICB2YXIgJHR5cGUsICRpID0gLTEsXG4gICAgICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMSkge1xuICAgICAgICAgICAgJHR5cGUgPSBhcnIxWyRpICs9IDFdO1xuICAgICAgICAgICAgaWYgKCR0eXBlID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgaWYgKCcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnbnVtYmVyXFwnIHx8ICcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnYm9vbGVhblxcJykgJyArICgkY29lcmNlZCkgKyAnID0gXFwnXFwnICsgJyArICgkZGF0YSkgKyAnOyBlbHNlIGlmICgnICsgKCRkYXRhKSArICcgPT09IG51bGwpICcgKyAoJGNvZXJjZWQpICsgJyA9IFxcJ1xcJzsgJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHR5cGUgPT0gJ251bWJlcicgfHwgJHR5cGUgPT0gJ2ludGVnZXInKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgaWYgKCcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnYm9vbGVhblxcJyB8fCAnICsgKCRkYXRhKSArICcgPT09IG51bGwgfHwgKCcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnc3RyaW5nXFwnICYmICcgKyAoJGRhdGEpICsgJyAmJiAnICsgKCRkYXRhKSArICcgPT0gKycgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgICAgICBpZiAoJHR5cGUgPT0gJ2ludGVnZXInKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgJiYgISgnICsgKCRkYXRhKSArICcgJSAxKSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICcpKSAnICsgKCRjb2VyY2VkKSArICcgPSArJyArICgkZGF0YSkgKyAnOyAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkdHlwZSA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YSkgKyAnID09PSBcXCdmYWxzZVxcJyB8fCAnICsgKCRkYXRhKSArICcgPT09IDAgfHwgJyArICgkZGF0YSkgKyAnID09PSBudWxsKSAnICsgKCRjb2VyY2VkKSArICcgPSBmYWxzZTsgZWxzZSBpZiAoJyArICgkZGF0YSkgKyAnID09PSBcXCd0cnVlXFwnIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gMSkgJyArICgkY29lcmNlZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHR5cGUgPT0gJ251bGwnKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgaWYgKCcgKyAoJGRhdGEpICsgJyA9PT0gXFwnXFwnIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gMCB8fCAnICsgKCRkYXRhKSArICcgPT09IGZhbHNlKSAnICsgKCRjb2VyY2VkKSArICcgPSBudWxsOyAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdC5vcHRzLmNvZXJjZVR5cGVzID09ICdhcnJheScgJiYgJHR5cGUgPT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyBlbHNlIGlmICgnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ3N0cmluZ1xcJyB8fCAnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ251bWJlclxcJyB8fCAnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ2Jvb2xlYW5cXCcgfHwgJyArICgkZGF0YSkgKyAnID09IG51bGwpICcgKyAoJGNvZXJjZWQpICsgJyA9IFsnICsgKCRkYXRhKSArICddOyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyBlbHNlIHsgICAnO1xuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAndHlwZScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgdHlwZTogXFwnJztcbiAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJ1xcJyB9ICc7XG4gICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSAnO1xuICAgICAgICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfX2VyciA9IG91dDtcbiAgICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgfSBpZiAoJyArICgkY29lcmNlZCkgKyAnICE9PSB1bmRlZmluZWQpIHsgICc7XG4gICAgICAgIHZhciAkcGFyZW50RGF0YSA9ICRkYXRhTHZsID8gJ2RhdGEnICsgKCgkZGF0YUx2bCAtIDEpIHx8ICcnKSA6ICdwYXJlbnREYXRhJyxcbiAgICAgICAgICAkcGFyZW50RGF0YVByb3BlcnR5ID0gJGRhdGFMdmwgPyBpdC5kYXRhUGF0aEFyclskZGF0YUx2bF0gOiAncGFyZW50RGF0YVByb3BlcnR5JztcbiAgICAgICAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnID0gJyArICgkY29lcmNlZCkgKyAnOyAnO1xuICAgICAgICBpZiAoISRkYXRhTHZsKSB7XG4gICAgICAgICAgb3V0ICs9ICdpZiAoJyArICgkcGFyZW50RGF0YSkgKyAnICE9PSB1bmRlZmluZWQpJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyAnICsgKCRwYXJlbnREYXRhKSArICdbJyArICgkcGFyZW50RGF0YVByb3BlcnR5KSArICddID0gJyArICgkY29lcmNlZCkgKyAnOyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAndHlwZScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgdHlwZTogXFwnJztcbiAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJ1xcJyB9ICc7XG4gICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSAnO1xuICAgICAgICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfX2VyciA9IG91dDtcbiAgICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9XG4gIH1cbiAgaWYgKGl0LnNjaGVtYS4kcmVmICYmICEkcmVmS2V5d29yZHMpIHtcbiAgICBvdXQgKz0gJyAnICsgKGl0LlJVTEVTLmFsbC4kcmVmLmNvZGUoaXQsICckcmVmJykpICsgJyAnO1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyB9IGlmIChlcnJvcnMgPT09ICc7XG4gICAgICBpZiAoJHRvcCkge1xuICAgICAgICBvdXQgKz0gJzAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICdlcnJzXycgKyAoJGx2bCk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJykgeyAnO1xuICAgICAgJGNsb3NpbmdCcmFjZXMyICs9ICd9JztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFycjIgPSBpdC5SVUxFUztcbiAgICBpZiAoYXJyMikge1xuICAgICAgdmFyICRydWxlc0dyb3VwLCBpMiA9IC0xLFxuICAgICAgICBsMiA9IGFycjIubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpMiA8IGwyKSB7XG4gICAgICAgICRydWxlc0dyb3VwID0gYXJyMltpMiArPSAxXTtcbiAgICAgICAgaWYgKCRzaG91bGRVc2VHcm91cCgkcnVsZXNHcm91cCkpIHtcbiAgICAgICAgICBpZiAoJHJ1bGVzR3JvdXAudHlwZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXRpbC5jaGVja0RhdGFUeXBlKCRydWxlc0dyb3VwLnR5cGUsICRkYXRhLCBpdC5vcHRzLnN0cmljdE51bWJlcnMpKSArICcpIHsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudXNlRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIGlmICgkcnVsZXNHcm91cC50eXBlID09ICdvYmplY3QnICYmIGl0LnNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgJHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cygkc2NoZW1hKTtcbiAgICAgICAgICAgICAgdmFyIGFycjMgPSAkc2NoZW1hS2V5cztcbiAgICAgICAgICAgICAgaWYgKGFycjMpIHtcbiAgICAgICAgICAgICAgICB2YXIgJHByb3BlcnR5S2V5LCBpMyA9IC0xLFxuICAgICAgICAgICAgICAgICAgbDMgPSBhcnIzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGkzIDwgbDMpIHtcbiAgICAgICAgICAgICAgICAgICRwcm9wZXJ0eUtleSA9IGFycjNbaTMgKz0gMV07XG4gICAgICAgICAgICAgICAgICB2YXIgJHNjaCA9ICRzY2hlbWFbJHByb3BlcnR5S2V5XTtcbiAgICAgICAgICAgICAgICAgIGlmICgkc2NoLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyBpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5jb21wb3NpdGVSdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuc3RyaWN0RGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZGVmYXVsdE1zZyA9ICdkZWZhdWx0IGlzIGlnbm9yZWQgZm9yOiAnICsgJHBhc3NEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuc3RyaWN0RGVmYXVsdHMgPT09ICdsb2cnKSBpdC5sb2dnZXIud2FybigkZGVmYXVsdE1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigkZGVmYXVsdE1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCRwYXNzRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy51c2VEZWZhdWx0cyA9PSAnZW1wdHknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKCRwYXNzRGF0YSkgKyAnID09PSBudWxsIHx8ICcgKyAoJHBhc3NEYXRhKSArICcgPT09IFxcJ1xcJyAnO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyApICcgKyAoJHBhc3NEYXRhKSArICcgPSAnO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnVzZURlZmF1bHRzID09ICdzaGFyZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnVzZURlZmF1bHQoJHNjaC5kZWZhdWx0KSkgKyAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICcgKyAoSlNPTi5zdHJpbmdpZnkoJHNjaC5kZWZhdWx0KSkgKyAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnOyAnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCRydWxlc0dyb3VwLnR5cGUgPT0gJ2FycmF5JyAmJiBBcnJheS5pc0FycmF5KGl0LnNjaGVtYS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgdmFyIGFycjQgPSBpdC5zY2hlbWEuaXRlbXM7XG4gICAgICAgICAgICAgIGlmIChhcnI0KSB7XG4gICAgICAgICAgICAgICAgdmFyICRzY2gsICRpID0gLTEsXG4gICAgICAgICAgICAgICAgICBsNCA9IGFycjQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoJGkgPCBsNCkge1xuICAgICAgICAgICAgICAgICAgJHNjaCA9IGFycjRbJGkgKz0gMV07XG4gICAgICAgICAgICAgICAgICBpZiAoJHNjaC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5jb21wb3NpdGVSdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuc3RyaWN0RGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkZGVmYXVsdE1zZyA9ICdkZWZhdWx0IGlzIGlnbm9yZWQgZm9yOiAnICsgJHBhc3NEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuc3RyaWN0RGVmYXVsdHMgPT09ICdsb2cnKSBpdC5sb2dnZXIud2FybigkZGVmYXVsdE1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigkZGVmYXVsdE1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCRwYXNzRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy51c2VEZWZhdWx0cyA9PSAnZW1wdHknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKCRwYXNzRGF0YSkgKyAnID09PSBudWxsIHx8ICcgKyAoJHBhc3NEYXRhKSArICcgPT09IFxcJ1xcJyAnO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyApICcgKyAoJHBhc3NEYXRhKSArICcgPSAnO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnVzZURlZmF1bHRzID09ICdzaGFyZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnVzZURlZmF1bHQoJHNjaC5kZWZhdWx0KSkgKyAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICcgKyAoSlNPTi5zdHJpbmdpZnkoJHNjaC5kZWZhdWx0KSkgKyAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnOyAnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhcnI1ID0gJHJ1bGVzR3JvdXAucnVsZXM7XG4gICAgICAgICAgaWYgKGFycjUpIHtcbiAgICAgICAgICAgIHZhciAkcnVsZSwgaTUgPSAtMSxcbiAgICAgICAgICAgICAgbDUgPSBhcnI1Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoaTUgPCBsNSkge1xuICAgICAgICAgICAgICAkcnVsZSA9IGFycjVbaTUgKz0gMV07XG4gICAgICAgICAgICAgIGlmICgkc2hvdWxkVXNlUnVsZSgkcnVsZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgJGNvZGUgPSAkcnVsZS5jb2RlKGl0LCAkcnVsZS5rZXl3b3JkLCAkcnVsZXNHcm91cC50eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoJGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgICAgICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgJGNsb3NpbmdCcmFjZXMxICs9ICd9JztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMxKSArICcgJztcbiAgICAgICAgICAgICRjbG9zaW5nQnJhY2VzMSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJHJ1bGVzR3JvdXAudHlwZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgICAgaWYgKCR0eXBlU2NoZW1hICYmICR0eXBlU2NoZW1hID09PSAkcnVsZXNHcm91cC50eXBlICYmICEkY29lcmNlVG9UeXBlcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICAgICAgICAgICAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcudHlwZScsXG4gICAgICAgICAgICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy90eXBlJztcbiAgICAgICAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ3R5cGUnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHR5cGU6IFxcJyc7XG4gICAgICAgICAgICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgfSAnO1xuICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgJztcbiAgICAgICAgICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIG91dCArPSAnIGlmIChlcnJvcnMgPT09ICc7XG4gICAgICAgICAgICBpZiAoJHRvcCkge1xuICAgICAgICAgICAgICBvdXQgKz0gJzAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdlcnJzXycgKyAoJGx2bCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgeyAnO1xuICAgICAgICAgICAgJGNsb3NpbmdCcmFjZXMyICs9ICd9JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyAnICsgKCRjbG9zaW5nQnJhY2VzMikgKyAnICc7XG4gIH1cbiAgaWYgKCR0b3ApIHtcbiAgICBpZiAoJGFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyBpZiAoZXJyb3JzID09PSAwKSByZXR1cm4gZGF0YTsgICAgICAgICAgICc7XG4gICAgICBvdXQgKz0gJyBlbHNlIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7ICc7XG4gICAgICBvdXQgKz0gJyByZXR1cm4gZXJyb3JzID09PSAwOyAgICAgICAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9OyByZXR1cm4gdmFsaWRhdGU7JztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJyA9IGVycm9ycyA9PT0gZXJyc18nICsgKCRsdmwpICsgJzsnO1xuICB9XG5cbiAgZnVuY3Rpb24gJHNob3VsZFVzZUdyb3VwKCRydWxlc0dyb3VwKSB7XG4gICAgdmFyIHJ1bGVzID0gJHJ1bGVzR3JvdXAucnVsZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKylcbiAgICAgIGlmICgkc2hvdWxkVXNlUnVsZShydWxlc1tpXSkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gJHNob3VsZFVzZVJ1bGUoJHJ1bGUpIHtcbiAgICByZXR1cm4gaXQuc2NoZW1hWyRydWxlLmtleXdvcmRdICE9PSB1bmRlZmluZWQgfHwgKCRydWxlLmltcGxlbWVudHMgJiYgJHJ1bGVJbXBsZW1lbnRzU29tZUtleXdvcmQoJHJ1bGUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRydWxlSW1wbGVtZW50c1NvbWVLZXl3b3JkKCRydWxlKSB7XG4gICAgdmFyIGltcGwgPSAkcnVsZS5pbXBsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1wbC5sZW5ndGg7IGkrKylcbiAgICAgIGlmIChpdC5zY2hlbWFbaW1wbFtpXV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIElERU5USUZJRVIgPSAvXlthLXpfJF1bYS16MC05XyQtXSokL2k7XG52YXIgY3VzdG9tUnVsZUNvZGUgPSByZXF1aXJlKCcuL2RvdGpzL2N1c3RvbScpO1xudmFyIGRlZmluaXRpb25TY2hlbWEgPSByZXF1aXJlKCcuL2RlZmluaXRpb25fc2NoZW1hJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGQ6IGFkZEtleXdvcmQsXG4gIGdldDogZ2V0S2V5d29yZCxcbiAgcmVtb3ZlOiByZW1vdmVLZXl3b3JkLFxuICB2YWxpZGF0ZTogdmFsaWRhdGVLZXl3b3JkXG59O1xuXG5cbi8qKlxuICogRGVmaW5lIGN1c3RvbSBrZXl3b3JkXG4gKiBAdGhpcyAgQWp2XG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5d29yZCBjdXN0b20ga2V5d29yZCwgc2hvdWxkIGJlIHVuaXF1ZSAoaW5jbHVkaW5nIGRpZmZlcmVudCBmcm9tIGFsbCBzdGFuZGFyZCwgY3VzdG9tIGFuZCBtYWNybyBrZXl3b3JkcykuXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmaW5pdGlvbiBrZXl3b3JkIGRlZmluaXRpb24gb2JqZWN0IHdpdGggcHJvcGVydGllcyBgdHlwZWAgKHR5cGUocykgd2hpY2ggdGhlIGtleXdvcmQgYXBwbGllcyB0byksIGB2YWxpZGF0ZWAgb3IgYGNvbXBpbGVgLlxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gYWRkS2V5d29yZChrZXl3b3JkLCBkZWZpbml0aW9uKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgLyogZXNsaW50IG5vLXNoYWRvdzogMCAqL1xuICB2YXIgUlVMRVMgPSB0aGlzLlJVTEVTO1xuICBpZiAoUlVMRVMua2V5d29yZHNba2V5d29yZF0pXG4gICAgdGhyb3cgbmV3IEVycm9yKCdLZXl3b3JkICcgKyBrZXl3b3JkICsgJyBpcyBhbHJlYWR5IGRlZmluZWQnKTtcblxuICBpZiAoIUlERU5USUZJRVIudGVzdChrZXl3b3JkKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleXdvcmQgJyArIGtleXdvcmQgKyAnIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXInKTtcblxuICBpZiAoZGVmaW5pdGlvbikge1xuICAgIHRoaXMudmFsaWRhdGVLZXl3b3JkKGRlZmluaXRpb24sIHRydWUpO1xuXG4gICAgdmFyIGRhdGFUeXBlID0gZGVmaW5pdGlvbi50eXBlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFUeXBlKSkge1xuICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGFUeXBlLmxlbmd0aDsgaSsrKVxuICAgICAgICBfYWRkUnVsZShrZXl3b3JkLCBkYXRhVHlwZVtpXSwgZGVmaW5pdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9hZGRSdWxlKGtleXdvcmQsIGRhdGFUeXBlLCBkZWZpbml0aW9uKTtcbiAgICB9XG5cbiAgICB2YXIgbWV0YVNjaGVtYSA9IGRlZmluaXRpb24ubWV0YVNjaGVtYTtcbiAgICBpZiAobWV0YVNjaGVtYSkge1xuICAgICAgaWYgKGRlZmluaXRpb24uJGRhdGEgJiYgdGhpcy5fb3B0cy4kZGF0YSkge1xuICAgICAgICBtZXRhU2NoZW1hID0ge1xuICAgICAgICAgIGFueU9mOiBbXG4gICAgICAgICAgICBtZXRhU2NoZW1hLFxuICAgICAgICAgICAgeyAnJHJlZic6ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWp2LXZhbGlkYXRvci9hanYvbWFzdGVyL2xpYi9yZWZzL2RhdGEuanNvbiMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBkZWZpbml0aW9uLnZhbGlkYXRlU2NoZW1hID0gdGhpcy5jb21waWxlKG1ldGFTY2hlbWEsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIFJVTEVTLmtleXdvcmRzW2tleXdvcmRdID0gUlVMRVMuYWxsW2tleXdvcmRdID0gdHJ1ZTtcblxuXG4gIGZ1bmN0aW9uIF9hZGRSdWxlKGtleXdvcmQsIGRhdGFUeXBlLCBkZWZpbml0aW9uKSB7XG4gICAgdmFyIHJ1bGVHcm91cDtcbiAgICBmb3IgKHZhciBpPTA7IGk8UlVMRVMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZyA9IFJVTEVTW2ldO1xuICAgICAgaWYgKHJnLnR5cGUgPT0gZGF0YVR5cGUpIHtcbiAgICAgICAgcnVsZUdyb3VwID0gcmc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcnVsZUdyb3VwKSB7XG4gICAgICBydWxlR3JvdXAgPSB7IHR5cGU6IGRhdGFUeXBlLCBydWxlczogW10gfTtcbiAgICAgIFJVTEVTLnB1c2gocnVsZUdyb3VwKTtcbiAgICB9XG5cbiAgICB2YXIgcnVsZSA9IHtcbiAgICAgIGtleXdvcmQ6IGtleXdvcmQsXG4gICAgICBkZWZpbml0aW9uOiBkZWZpbml0aW9uLFxuICAgICAgY3VzdG9tOiB0cnVlLFxuICAgICAgY29kZTogY3VzdG9tUnVsZUNvZGUsXG4gICAgICBpbXBsZW1lbnRzOiBkZWZpbml0aW9uLmltcGxlbWVudHNcbiAgICB9O1xuICAgIHJ1bGVHcm91cC5ydWxlcy5wdXNoKHJ1bGUpO1xuICAgIFJVTEVTLmN1c3RvbVtrZXl3b3JkXSA9IHJ1bGU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEdldCBrZXl3b3JkXG4gKiBAdGhpcyAgQWp2XG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5d29yZCBwcmUtZGVmaW5lZCBvciBjdXN0b20ga2V5d29yZC5cbiAqIEByZXR1cm4ge09iamVjdHxCb29sZWFufSBjdXN0b20ga2V5d29yZCBkZWZpbml0aW9uLCBgdHJ1ZWAgaWYgaXQgaXMgYSBwcmVkZWZpbmVkIGtleXdvcmQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBnZXRLZXl3b3JkKGtleXdvcmQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgcnVsZSA9IHRoaXMuUlVMRVMuY3VzdG9tW2tleXdvcmRdO1xuICByZXR1cm4gcnVsZSA/IHJ1bGUuZGVmaW5pdGlvbiA6IHRoaXMuUlVMRVMua2V5d29yZHNba2V5d29yZF0gfHwgZmFsc2U7XG59XG5cblxuLyoqXG4gKiBSZW1vdmUga2V5d29yZFxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IGtleXdvcmQgcHJlLWRlZmluZWQgb3IgY3VzdG9tIGtleXdvcmQuXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiByZW1vdmVLZXl3b3JkKGtleXdvcmQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgUlVMRVMgPSB0aGlzLlJVTEVTO1xuICBkZWxldGUgUlVMRVMua2V5d29yZHNba2V5d29yZF07XG4gIGRlbGV0ZSBSVUxFUy5hbGxba2V5d29yZF07XG4gIGRlbGV0ZSBSVUxFUy5jdXN0b21ba2V5d29yZF07XG4gIGZvciAodmFyIGk9MDsgaTxSVUxFUy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBydWxlcyA9IFJVTEVTW2ldLnJ1bGVzO1xuICAgIGZvciAodmFyIGo9MDsgajxydWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKHJ1bGVzW2pdLmtleXdvcmQgPT0ga2V5d29yZCkge1xuICAgICAgICBydWxlcy5zcGxpY2UoaiwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFZhbGlkYXRlIGtleXdvcmQgZGVmaW5pdGlvblxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmluaXRpb24ga2V5d29yZCBkZWZpbml0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dFcnJvciB0cnVlIHRvIHRocm93IGV4Y2VwdGlvbiBpZiBkZWZpbml0aW9uIGlzIGludmFsaWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlS2V5d29yZChkZWZpbml0aW9uLCB0aHJvd0Vycm9yKSB7XG4gIHZhbGlkYXRlS2V5d29yZC5lcnJvcnMgPSBudWxsO1xuICB2YXIgdiA9IHRoaXMuX3ZhbGlkYXRlS2V5d29yZCA9IHRoaXMuX3ZhbGlkYXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRoaXMuY29tcGlsZShkZWZpbml0aW9uU2NoZW1hLCB0cnVlKTtcblxuICBpZiAodihkZWZpbml0aW9uKSkgcmV0dXJuIHRydWU7XG4gIHZhbGlkYXRlS2V5d29yZC5lcnJvcnMgPSB2LmVycm9ycztcbiAgaWYgKHRocm93RXJyb3IpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjdXN0b20ga2V5d29yZCBkZWZpbml0aW9uIGlzIGludmFsaWQ6ICcgICsgdGhpcy5lcnJvcnNUZXh0KHYuZXJyb3JzKSk7XG4gIGVsc2VcbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCJjb25zdCBERUZBVUxUX0lOREVOVEFUSU9OX0NIQVJBQ1RFUiA9ICcnO1xuY29uc3QgREVGQVVMVF9MSU5FX0pPSU4gPSAnXFxuJztcblxuZXhwb3J0IHR5cGUgUG9zdFByb2Nlc3NvciA9ICh1bnJlcGxhY2VkQ29kZTogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJ1aWxkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlc2lyZWQgaW5kZW50YXRpb24gY2hhcmFjdGVyIGZvciBhZ2dyZWdhdGVkIGxpbmVzIG9mIGNvZGVcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIGluZGVudD86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzaXJlZCBjaGFyYWN0ZXIgdG8gam9pbiBlYWNoIGxpbmUgb2YgY29kZVxuICAgKiBAZGVmYXVsdCBcXG5cbiAgICovXG4gIGpvaW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBDb2RlQnVpbGRlciB7XG4gIHBvc3RQcm9jZXNzb3JzOiBQb3N0UHJvY2Vzc29yW10gPSBbXTtcbiAgY29kZTogc3RyaW5nW10gPSBbXTtcbiAgaW5kZW50YXRpb25DaGFyYWN0ZXI6IHN0cmluZyA9IERFRkFVTFRfSU5ERU5UQVRJT05fQ0hBUkFDVEVSO1xuICBsaW5lSm9pbiA9IERFRkFVTFRfTElORV9KT0lOO1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgb2JqZWN0IHRvIGZvcm1hdCBhbmQgYWdncmFnYXRlIGxpbmVzIG9mIGNvZGUuXG4gICAqIExpbmVzIGFyZSBhZ2dyZWdhdGVkIGluIGEgYGNvZGVgIGFycmF5LCBhbmQgbmVlZCB0byBiZSBqb2luZWQgdG8gb2J0YWluIGEgcHJvcGVyIGNvZGUgc25pcHBldC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHsgaW5kZW50LCBqb2luIH06IENvZGVCdWlsZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pbmRlbnRhdGlvbkNoYXJhY3RlciA9IGluZGVudCB8fCBERUZBVUxUX0lOREVOVEFUSU9OX0NIQVJBQ1RFUjtcbiAgICB0aGlzLmxpbmVKb2luID0gam9pbiA/PyBERUZBVUxUX0xJTkVfSk9JTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZ2l2ZW4gaW5kZW50YXRpb24gbGV2ZWwgdG8gZ2l2ZW4gbGluZSBvZiBjb2RlXG4gICAqL1xuICBpbmRlbnRMaW5lID0gKGxpbmU6IHN0cmluZywgaW5kZW50YXRpb25MZXZlbCA9IDApID0+IHtcbiAgICBjb25zdCBpbmRlbnQgPSB0aGlzLmluZGVudGF0aW9uQ2hhcmFjdGVyLnJlcGVhdChpbmRlbnRhdGlvbkxldmVsKTtcbiAgICByZXR1cm4gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxpbmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBsaW5lc1xuICAgKi9cbiAgdW5zaGlmdCA9IChsaW5lOiBzdHJpbmcsIGluZGVudGF0aW9uTGV2ZWw/OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBuZXdMaW5lID0gdGhpcy5pbmRlbnRMaW5lKGxpbmUsIGluZGVudGF0aW9uTGV2ZWwpO1xuICAgIHRoaXMuY29kZS51bnNoaWZ0KG5ld0xpbmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lc1xuICAgKi9cbiAgcHVzaCA9IChsaW5lOiBzdHJpbmcsIGluZGVudGF0aW9uTGV2ZWw/OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBuZXdMaW5lID0gdGhpcy5pbmRlbnRMaW5lKGxpbmUsIGluZGVudGF0aW9uTGV2ZWwpO1xuICAgIHRoaXMuY29kZS5wdXNoKG5ld0xpbmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gZW1wdHkgbGluZSBhdCB0aGUgZW5kIG9mIGN1cnJlbnQgbGluZXNcbiAgICovXG4gIGJsYW5rID0gKCkgPT4ge1xuICAgIHRoaXMuY29kZS5wdXNoKCcnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGUgYWxsIGN1cnJlbnQgbGluZXMgdXNpbmcgdGhlIGdpdmVuIGxpbmVKb2luLCB0aGVuIGFwcGx5IGFueSByZXBsYWNlcnMgdGhhdCBtYXkgaGF2ZSBiZWVuIGFkZGVkXG4gICAqL1xuICBqb2luID0gKCkgPT4ge1xuICAgIGNvbnN0IHVucmVwbGFjZWRDb2RlID0gdGhpcy5jb2RlLmpvaW4odGhpcy5saW5lSm9pbik7XG4gICAgY29uc3QgcmVwbGFjZWRPdXRwdXQgPSB0aGlzLnBvc3RQcm9jZXNzb3JzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgcmVwbGFjZXIpID0+IHJlcGxhY2VyKGFjY3VtdWxhdG9yKSxcbiAgICAgIHVucmVwbGFjZWRDb2RlLFxuICAgICk7XG4gICAgcmV0dXJuIHJlcGxhY2VkT3V0cHV0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBPZnRlbiB3aGVuIHdyaXRpbmcgbW9kdWxlcyB5b3UgbWF5IHdpc2ggdG8gYWRkIGEgbGl0ZXJhbCB0YWcgb3IgYml0IG9mIG1ldGFkYXRhIHRoYXQgeW91IHdpc2ggdG8gdHJhbnNmb3JtIGFmdGVyIG90aGVyIHByb2Nlc3NpbmcgYXMgYSBmaW5hbCBzdGVwLlxuICAgKiBUbyBkbyBzbywgeW91IGNhbiBwcm92aWRlIGEgUG9zdFByb2Nlc3NvciBmdW5jdGlvbiBhbmQgaXQgd2lsbCBiZSBydW4gYXV0b21hdGljYWxseSBmb3IgeW91IHdoZW4geW91IGNhbGwgYGpvaW4oKWAgbGF0ZXIgb24uXG4gICAqL1xuICBhZGRQb3N0UHJvY2Vzc29yID0gKHBvc3RQcm9jZXNzb3I6IFBvc3RQcm9jZXNzb3IpID0+IHtcbiAgICB0aGlzLnBvc3RQcm9jZXNzb3JzID0gWy4uLnRoaXMucG9zdFByb2Nlc3NvcnMsIHBvc3RQcm9jZXNzb3JdO1xuICB9O1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBFc2NhcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkZWxpbWl0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gd3JhcCB0aGUgc3RyaW5nIChhbmQgc28gbXVzdCBiZSBlc2NhcGVkXG4gICAqIHdoZW4gdXNlZCB3aXRoaW4gdGhlIHN0cmluZykuXG4gICAqIERlZmF1bHRzIHRvIFwiXG4gICAqL1xuICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFyIHRvIHVzZSB0byBlc2NhcGUgdGhlIGRlbGltaXRlciBhbmQgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgKiBEZWZhdWx0cyB0byBcXFxuICAgKi9cbiAgZXNjYXBlQ2hhcj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBuZXdsaW5lcyAoXFxuIGFuZCBcXHIpIHNob3VsZCBiZSBlc2NhcGVkIHdpdGhpbiB0aGUgc3RyaW5nLlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgZXNjYXBlTmV3bGluZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVzY2FwZSBjaGFyYWN0ZXJzIHdpdGhpbiBhIHZhbHVlIHRvIG1ha2UgaXQgc2FmZSB0byBpbnNlcnQgZGlyZWN0bHkgaW50byBhXG4gKiBzbmlwcGV0LiBUYWtlcyBvcHRpb25zIHdoaWNoIGRlZmluZSB0aGUgZXNjYXBlIHJlcXVpcmVtZW50cy5cbiAqXG4gKiBUaGlzIGlzIGNsb3NlbHkgYmFzZWQgb24gdGhlIEpTT04tc3RyaW5naWZ5IHN0cmluZyBzZXJpYWxpemF0aW9uIGFsZ29yaXRobSxcbiAqIGJ1dCBnZW5lcmFsaXplZCBmb3Igb3RoZXIgc3RyaW5nIGRlbGltaXRlcnMgKGUuZy4gXCIgb3IgJykgYW5kIGRpZmZlcmVudCBlc2NhcGVcbiAqIGNoYXJhY3RlcnMgKGUuZy4gUG93ZXJzaGVsbCB1c2VzIGApXG4gKlxuICogU2VlIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyL211bHRpcGFnZS9zdHJ1Y3R1cmVkLWRhdGEuaHRtbCNzZWMtcXVvdGVqc29uc3RyaW5nXG4gKiBmb3IgdGhlIGNvbXBsZXRlIG9yaWdpbmFsIGFsZ29yaXRobS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhyYXdWYWx1ZTogYW55LCBvcHRpb25zOiBFc2NhcGVPcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGRlbGltaXRlciA9ICdcIicsXG4gICAgZXNjYXBlQ2hhciA9ICdcXFxcJyxcbiAgICBlc2NhcGVOZXdsaW5lcyA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc3RyaW5nVmFsdWUgPSByYXdWYWx1ZS50b1N0cmluZygpO1xuXG4gIHJldHVybiBbLi4uc3RyaW5nVmFsdWVdLm1hcCgoYykgPT4ge1xuICAgIGlmIChjID09PSAnXFxiJykge1xuICAgICAgcmV0dXJuIGVzY2FwZUNoYXIgKyAnYic7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx0Jykge1xuICAgICAgcmV0dXJuIGVzY2FwZUNoYXIgKyAndCc7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFxuJykge1xuICAgICAgaWYgKGVzY2FwZU5ld2xpbmVzKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGVDaGFyICsgJ24nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGM7IC8vIERvbid0IGp1c3QgY29udGludWUsIG9yIHRoaXMgaXMgY2F1Z2h0IGJ5IDwgXFx1MDAyMFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcZicpIHtcbiAgICAgIHJldHVybiBlc2NhcGVDaGFyICsgJ2YnO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xccicpIHtcbiAgICAgIGlmIChlc2NhcGVOZXdsaW5lcykge1xuICAgICAgICByZXR1cm4gZXNjYXBlQ2hhciArICdyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjOyAvLyBEb24ndCBqdXN0IGNvbnRpbnVlLCBvciB0aGlzIGlzIGNhdWdodCBieSA8IFxcdTAwMjBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGMgPT09IGVzY2FwZUNoYXIpIHtcbiAgICAgIHJldHVybiBlc2NhcGVDaGFyICsgZXNjYXBlQ2hhcjtcbiAgICB9IGVsc2UgaWYgKGMgPT09IGRlbGltaXRlcikge1xuICAgICAgcmV0dXJuIGVzY2FwZUNoYXIgKyBkZWxpbWl0ZXI7XG4gICAgfSBlbHNlIGlmIChjIDwgJ1xcdTAwMjAnIHx8IGMgPiAnXFx1MDA3RScpIHtcbiAgICAgIC8vIERlbGVnYXRlIHRoZSB0cmlja2llciBub24tQVNDSUkgY2FzZXMgdG8gdGhlIG5vcm1hbCBhbGdvcml0aG0uIFNvbWUgb2YgdGhlc2VcbiAgICAgIC8vIGFyZSBlc2NhcGVkIGFzIFxcdVhYWFgsIHdoaWxzdCBvdGhlcnMgYXJlIHJlcHJlc2VudGVkIGxpdGVyYWxseS4gU2luY2Ugd2UncmVcbiAgICAgIC8vIHVzaW5nIHRoaXMgcHJpbWFyaWx5IGZvciBoZWFkZXIgdmFsdWVzIHRoYXQgYXJlIGdlbmVyYWxseSAodGhvdWdoIG5vdCAxMDAlXG4gICAgICAvLyBzdHJpY3RseT8pIEFTQ0lJLW9ubHksIHRoaXMgc2hvdWxkIGFsbW9zdCBuZXZlciBoYXBwZW4uXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYykuc2xpY2UoMSwgLTEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gIH0pLmpvaW4oJycpO1xufVxuXG4vKipcbiAqIE1ha2UgYSBzdHJpbmcgdmFsdWUgc2FmZSB0byBpbnNlcnQgbGl0ZXJhbGx5IGludG8gYSBzbmlwcGV0IHdpdGhpbiBzaW5nbGUgcXVvdGVzLFxuICogYnkgZXNjYXBpbmcgcHJvYmxlbWF0aWMgY2hhcmFjdGVycywgaW5jbHVkaW5nIHNpbmdsZSBxdW90ZXMgaW5zaWRlIHRoZSBzdHJpbmcsXG4gKiBiYWNrc2xhc2hlcywgbmV3bGluZXMsIGFuZCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gKlxuICogSWYgdmFsdWUgaXMgbm90IGEgc3RyaW5nLCBpdCB3aWxsIGJlIHN0cmluZ2lmaWVkIHdpdGggLnRvU3RyaW5nKCkgZmlyc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGVGb3JTaW5nbGVRdW90ZXMgPSAodmFsdWU6IGFueSkgPT5cbiAgZXNjYXBlU3RyaW5nKHZhbHVlLCB7IGRlbGltaXRlcjogXCInXCIgfSk7XG5cbi8qKlxuICogTWFrZSBhIHN0cmluZyB2YWx1ZSBzYWZlIHRvIGluc2VydCBsaXRlcmFsbHkgaW50byBhIHNuaXBwZXQgd2l0aGluIGRvdWJsZSBxdW90ZXMsXG4gKiBieSBlc2NhcGluZyBwcm9ibGVtYXRpYyBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgZG91YmxlIHF1b3RlcyBpbnNpZGUgdGhlIHN0cmluZyxcbiAqIGJhY2tzbGFzaGVzLCBuZXdsaW5lcywgYW5kIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAqXG4gKiBJZiB2YWx1ZSBpcyBub3QgYSBzdHJpbmcsIGl0IHdpbGwgYmUgc3RyaW5naWZpZWQgd2l0aCAudG9TdHJpbmcoKSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZUZvckRvdWJsZVF1b3RlcyA9ICh2YWx1ZTogYW55KSA9PlxuICBlc2NhcGVTdHJpbmcodmFsdWUsIHsgZGVsaW1pdGVyOiAnXCInIH0pO1xuIiwiLyoqXG4gKiBAbGljZW5zZSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL21hc3Rlci9MSUNFTlNFLm1kXG4gKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IC0gMjAyMCBOb2RlIEZldGNoIFRlYW1cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICpcbiAqIEV4dHJhY3RlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL25vZGUtZmV0Y2gvYmxvYi82NGM1YzI5NmEwMjUwYjg1MjAxMDc0NmM3NjE0NGNiOWUxNDY5OGQ5L3NyYy91dGlscy9mb3JtLWRhdGEuanNcbiAqL1xuXG5pbXBvcnQgdHlwZSBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuXG5jb25zdCBjYXJyaWFnZSA9ICdcXHJcXG4nO1xuY29uc3QgZGFzaGVzID0gJy0nLnJlcGVhdCgyKTtcblxuY29uc3QgTkFNRSA9IFN5bWJvbC50b1N0cmluZ1RhZztcblxuZXhwb3J0IGNvbnN0IGlzQmxvYiA9IChvYmplY3Q6IGFueSkgPT5cbiAgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiZcbiAgdHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2Ygb2JqZWN0LnR5cGUgPT09ICdzdHJpbmcnICYmXG4gIHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiZcbiAgL14oQmxvYnxGaWxlKSQvLnRlc3Qob2JqZWN0W05BTUVdKTtcblxuY29uc3QgZ2V0Rm9vdGVyID0gKGJvdW5kYXJ5OiBzdHJpbmcpID0+IGAke2Rhc2hlc30ke2JvdW5kYXJ5fSR7ZGFzaGVzfSR7Y2FycmlhZ2UucmVwZWF0KDIpfWA7XG5cbmNvbnN0IGdldEhlYWRlciA9IChib3VuZGFyeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGZpZWxkOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0pID0+IHtcbiAgbGV0IGhlYWRlciA9ICcnO1xuXG4gIGhlYWRlciArPSBgJHtkYXNoZXN9JHtib3VuZGFyeX0ke2NhcnJpYWdlfWA7XG4gIGhlYWRlciArPSBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiJHtuYW1lfVwiYDtcblxuICBpZiAoaXNCbG9iKGZpZWxkKSkge1xuICAgIGhlYWRlciArPSBgOyBmaWxlbmFtZT1cIiR7ZmllbGQubmFtZX1cIiR7Y2FycmlhZ2V9YDtcbiAgICBoZWFkZXIgKz0gYENvbnRlbnQtVHlwZTogJHtmaWVsZC50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfWA7XG4gIH1cblxuICByZXR1cm4gYCR7aGVhZGVyfSR7Y2FycmlhZ2UucmVwZWF0KDIpfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybURhdGFJdGVyYXRvciA9IGZ1bmN0aW9uKiAoZm9ybTogRm9ybURhdGEsIGJvdW5kYXJ5OiBzdHJpbmcpIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBub3Qgc3VyZSBob3cgdGhpcyBldmVyIHdvcmtlZFxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZm9ybSkge1xuICAgIHlpZWxkIGdldEhlYWRlcihib3VuZGFyeSwgbmFtZSwgdmFsdWUpO1xuXG4gICAgaWYgKGlzQmxvYih2YWx1ZSkpIHtcbiAgICAgIHlpZWxkKiB2YWx1ZS5zdHJlYW0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQgdmFsdWU7XG4gICAgfVxuXG4gICAgeWllbGQgY2FycmlhZ2U7XG4gIH1cblxuICB5aWVsZCBnZXRGb290ZXIoYm91bmRhcnkpO1xufTtcbiIsImltcG9ydCBBanYsIHsgRXJyb3JPYmplY3QgfSBmcm9tICdhanYnO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJ2hhci1mb3JtYXQnO1xuaW1wb3J0ICogYXMgc2NoZW1hIGZyb20gJ2hhci1zY2hlbWEnO1xuXG5leHBvcnQgY2xhc3MgSEFSRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG5hbWUgPSAnSEFSRXJyb3InO1xuICBtZXNzYWdlID0gJ3ZhbGlkYXRpb24gZmFpbGVkJztcbiAgZXJyb3JzOiBFcnJvck9iamVjdFtdID0gW107XG4gIGNvbnN0cnVjdG9yKGVycm9yczogRXJyb3JPYmplY3RbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuY29uc3QgYWp2ID0gbmV3IEFqdih7XG4gIGFsbEVycm9yczogdHJ1ZSxcbn0pO1xuYWp2LmFkZFNjaGVtYShzY2hlbWEpO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVIYXJSZXF1ZXN0ID0gKHJlcXVlc3Q6IGFueSk6IHJlcXVlc3QgaXMgUmVxdWVzdCA9PiB7XG4gIGNvbnN0IHZhbGlkYXRlID0gYWp2LmdldFNjaGVtYSgncmVxdWVzdC5qc29uJyk7XG4gIGlmICghdmFsaWRhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBmaW5kIEhBUiByZXF1ZXN0IHNjaGVtYScpO1xuICB9XG4gIGNvbnN0IHZhbGlkID0gdmFsaWRhdGUocmVxdWVzdCk7XG4gIGlmICghdmFsaWQgJiYgdmFsaWRhdGUuZXJyb3JzKSB7XG4gICAgdGhyb3cgbmV3IEhBUkVycm9yKHZhbGlkYXRlLmVycm9ycyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IHsgVmFsdWVPZiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbnR5cGUgSGVhZGVyczxUPiA9IFJlY29yZDxzdHJpbmcsIFQ+O1xuXG4vKipcbiAqIEdpdmVuIGEgaGVhZGVycyBvYmplY3QgcmV0cmlldmUgYSBzcGVjaWZpYyBoZWFkZXIgb3V0IG9mIGl0IHZpYSBhIGNhc2UtaW5zZW5zaXRpdmUga2V5LlxuICovXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyTmFtZSA9IDxUPihoZWFkZXJzOiBIZWFkZXJzPFQ+LCBuYW1lOiBzdHJpbmcpID0+XG4gIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZpbmQoaGVhZGVyID0+IGhlYWRlci50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4vKipcbiAqIEdpdmVuIGEgaGVhZGVycyBvYmplY3QgcmV0cmlldmUgdGhlIGNvbnRlbnRzIG9mIGEgaGVhZGVyIG91dCBvZiBpdCB2aWEgYSBjYXNlLWluc2Vuc2l0aXZlIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEhlYWRlciA9IDxUPihoZWFkZXJzOiBIZWFkZXJzPFQ+LCBuYW1lOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgaGVhZGVyTmFtZSA9IGdldEhlYWRlck5hbWUoaGVhZGVycywgbmFtZSk7XG4gIGlmICghaGVhZGVyTmFtZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnNbaGVhZGVyTmFtZV07XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIGdpdmVuIGNhc2UtaW5zZW5zaXRpdmUgaGVhZGVyIGV4aXN0cyB3aXRoaW4gYSBoZWFkZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgaGFzSGVhZGVyID0gPFQ+KGhlYWRlcnM6IEhlYWRlcnM8VD4sIG5hbWU6IHN0cmluZykgPT5cbiAgQm9vbGVhbihnZXRIZWFkZXJOYW1lKGhlYWRlcnMsIG5hbWUpKTtcblxuY29uc3QgbWltZVR5cGVKc29uID0gW1xuICAnYXBwbGljYXRpb24vanNvbicsXG4gICdhcHBsaWNhdGlvbi94LWpzb24nLFxuICAndGV4dC9qc29uJyxcbiAgJ3RleHQveC1qc29uJyxcbiAgJytqc29uJyxcbl0gYXMgY29uc3Q7XG5cbnR5cGUgTWltZVR5cGVKc29uID0gYCR7c3RyaW5nfSR7dHlwZW9mIG1pbWVUeXBlSnNvbltudW1iZXJdfSR7c3RyaW5nfWA7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIG1pbWV0eXBlIGlzIEpTT04sIG9yIGEgdmFyaWFudCBvZiBzdWNoLlxuICovXG5leHBvcnQgY29uc3QgaXNNaW1lVHlwZUpTT04gPSAobWltZVR5cGU6IHN0cmluZyk6IG1pbWVUeXBlIGlzIE1pbWVUeXBlSnNvbiA9PlxuICBtaW1lVHlwZUpzb24uc29tZSh0eXBlID0+IG1pbWVUeXBlLmluY2x1ZGVzKHR5cGUpKTtcbiIsImV4cG9ydCB0eXBlIFJlZHVjZWRIZWxwZXJPYmplY3QgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHN0cmluZz47XG5cbmV4cG9ydCBjb25zdCByZWR1Y2VyID0gPFQgZXh0ZW5kcyB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PihcbiAgYWNjdW11bGF0b3I6IFJlZHVjZWRIZWxwZXJPYmplY3QsXG4gIHBhaXI6IFQsXG4pID0+IHtcbiAgY29uc3QgY3VycmVudFZhbHVlID0gYWNjdW11bGF0b3JbcGFpci5uYW1lXTtcbiAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYWNjdW11bGF0b3JbcGFpci5uYW1lXSA9IHBhaXIudmFsdWU7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGl0IGFzIGFycmF5IGp1c3QgcHVzaCB0aGUgdmFsdWVcbiAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkge1xuICAgIGN1cnJlbnRWYWx1ZS5wdXNoKHBhaXIudmFsdWUpO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgdG8gYXJyYXkgc2luY2Ugbm93IHdlIGhhdmUgbW9yZSB0aGFuIG9uZSB2YWx1ZSBmb3IgdGhpcyBrZXlcbiAgYWNjdW11bGF0b3JbcGFpci5uYW1lXSA9IFtjdXJyZW50VmFsdWUsIHBhaXIudmFsdWVdO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59O1xuIiwiLyoqXG4gKiBVc2UgJ3N0cm9uZyBxdW90aW5nJyB1c2luZyBzaW5nbGUgcXVvdGVzIHNvIHRoYXQgd2Ugb25seSBuZWVkIHRvIGRlYWwgd2l0aCBuZXN0ZWQgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMuXG4gKiBzZWU6IGh0dHA6Ly93aWtpLmJhc2gtaGFja2Vycy5vcmcvc3ludGF4L3F1b3Rpbmcjc3Ryb25nX3F1b3RpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHF1b3RlID0gKHZhbHVlID0gJycpID0+IHtcbiAgY29uc3Qgc2FmZSA9IC9eW2EtejAtOS1fLy5AJV49Ol0rJC9pO1xuXG4gIGNvbnN0IGlzU2hlbGxTYWZlID0gc2FmZS50ZXN0KHZhbHVlKTtcblxuICBpZiAoaXNTaGVsbFNhZmUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBpZiB0aGUgdmFsdWUgaXMgbm90IHNoZWxsIHNhZmUsIHRoZW4gcXVvdGUgaXRcbiAgcmV0dXJuIGAnJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbn07XG5cbmV4cG9ydCBjb25zdCBlc2NhcGUgPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUucmVwbGFjZSgvXFxyL2csICdcXFxccicpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKTtcbiIsImltcG9ydCB7IENsaWVudEluZm8sIFRhcmdldElkLCBUYXJnZXRJbmZvLCB0YXJnZXRzIH0gZnJvbSAnLi4vdGFyZ2V0cy90YXJnZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBBdmFpbGFibGVUYXJnZXQgZXh0ZW5kcyBUYXJnZXRJbmZvIHtcbiAgY2xpZW50czogQ2xpZW50SW5mb1tdO1xufVxuXG5leHBvcnQgY29uc3QgYXZhaWxhYmxlVGFyZ2V0cyA9ICgpID0+XG4gIE9iamVjdC5rZXlzKHRhcmdldHMpLm1hcDxBdmFpbGFibGVUYXJnZXQ+KHRhcmdldElkID0+ICh7XG4gICAgLi4udGFyZ2V0c1t0YXJnZXRJZCBhcyBUYXJnZXRJZF0uaW5mbyxcbiAgICBjbGllbnRzOiBPYmplY3Qua2V5cyh0YXJnZXRzW3RhcmdldElkIGFzIFRhcmdldElkXS5jbGllbnRzQnlJZCkubWFwKFxuICAgICAgY2xpZW50SWQgPT4gdGFyZ2V0c1t0YXJnZXRJZCBhcyBUYXJnZXRJZF0uY2xpZW50c0J5SWRbY2xpZW50SWRdLmluZm8sXG4gICAgKSxcbiAgfSkpO1xuXG5leHBvcnQgY29uc3QgZXh0bmFtZSA9ICh0YXJnZXRJZDogVGFyZ2V0SWQpID0+IHRhcmdldHNbdGFyZ2V0SWRdPy5pbmZvLmV4dG5hbWUgfHwgJyc7XG4iLCJpbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgbGliY3VybDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnbGliY3VybCcsXG4gICAgdGl0bGU6ICdMaWJjdXJsJyxcbiAgICBsaW5rOiAnaHR0cDovL2N1cmwuaGF4eC5zZS9saWJjdXJsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbXBsZSBSRVNUIGFuZCBIVFRQIEFQSSBDbGllbnQgZm9yIEMnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBtZXRob2QsIGZ1bGxVcmwsIGhlYWRlcnNPYmosIGFsbEhlYWRlcnMsIHBvc3REYXRhIH0pID0+IHtcbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoKTtcblxuICAgIHB1c2goJ0NVUkwgKmhuZCA9IGN1cmxfZWFzeV9pbml0KCk7Jyk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKGBjdXJsX2Vhc3lfc2V0b3B0KGhuZCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCIpO2ApO1xuICAgIHB1c2goYGN1cmxfZWFzeV9zZXRvcHQoaG5kLCBDVVJMT1BUX1VSTCwgXCIke2Z1bGxVcmx9XCIpO2ApO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMsIGluY2x1ZGluZyB0aGUgY29va2llc1xuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyhoZWFkZXJzT2JqKTtcblxuICAgIC8vIGNvbnN0cnVjdCBoZWFkZXJzXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaCgnc3RydWN0IGN1cmxfc2xpc3QgKmhlYWRlcnMgPSBOVUxMOycpO1xuXG4gICAgICBoZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHtcbiAgICAgICAgcHVzaChgaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGhlYWRlcnMsIFwiJHtoZWFkZXJ9OiAke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhoZWFkZXJzT2JqW2hlYWRlcl0pfVwiKTtgKTtcbiAgICAgIH0pO1xuXG4gICAgICBwdXNoKCdjdXJsX2Vhc3lfc2V0b3B0KGhuZCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBoZWFkZXJzKTsnKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29va2llc1xuICAgIGlmIChhbGxIZWFkZXJzLmNvb2tpZSkge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goYGN1cmxfZWFzeV9zZXRvcHQoaG5kLCBDVVJMT1BUX0NPT0tJRSwgXCIke2FsbEhlYWRlcnMuY29va2llfVwiKTtgKTtcbiAgICB9XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goYGN1cmxfZWFzeV9zZXRvcHQoaG5kLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR7SlNPTi5zdHJpbmdpZnkocG9zdERhdGEudGV4dCl9KTtgKTtcbiAgICB9XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goJ0NVUkxjb2RlIHJldCA9IGN1cmxfZWFzeV9wZXJmb3JtKGhuZCk7Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbGliY3VybCB9IGZyb20gJy4vbGliY3VybC9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgYzogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnYycsXG4gICAgdGl0bGU6ICdDJyxcbiAgICBleHRuYW1lOiAnLmMnLFxuICAgIGRlZmF1bHQ6ICdsaWJjdXJsJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBsaWJjdXJsLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIENsb2p1cmUgdXNpbmcgY2xqLWh0dHAuXG4gKlxuICogQGF1dGhvclxuICogQHRnZ3JlZW5lXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGVyLCBnZXRIZWFkZXJOYW1lIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5jbGFzcyBLZXl3b3JkIHtcbiAgbmFtZSA9ICcnO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgdG9TdHJpbmcgPSAoKSA9PiBgOiR7dGhpcy5uYW1lfWA7XG59XG5cbmNsYXNzIEZpbGUge1xuICBwYXRoID0gJyc7XG4gIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gIH1cblxuICB0b1N0cmluZyA9ICgpID0+IGAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgXCIke3RoaXMucGF0aH1cIilgO1xufVxuXG5jb25zdCBqc1R5cGUgPSAoaW5wdXQ/OiBhbnkpID0+IHtcbiAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cblxuICByZXR1cm4gaW5wdXQuY29uc3RydWN0b3IubmFtZS50b0xvd2VyQ2FzZSgpO1xufTtcblxuY29uc3Qgb2JqRW1wdHkgPSAoaW5wdXQ/OiBhbnkpID0+IHtcbiAgaWYgKGpzVHlwZShpbnB1dCkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGlucHV0KS5sZW5ndGggPT09IDA7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgZmlsdGVyRW1wdHkgPSAoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgT2JqZWN0LmtleXMoaW5wdXQpXG4gICAgLmZpbHRlcih4ID0+IG9iakVtcHR5KGlucHV0W3hdKSlcbiAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgIGRlbGV0ZSBpbnB1dFt4XTtcbiAgICB9KTtcbiAgcmV0dXJuIGlucHV0O1xufTtcblxuY29uc3QgcGFkQmxvY2sgPSAocGFkU2l6ZTogbnVtYmVyLCBpbnB1dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KHBhZFNpemUpO1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxuL2csIGBcXG4ke3BhZGRpbmd9YCk7XG59O1xuXG5jb25zdCBqc1RvRWRuID0gKGpzOiBhbnkpID0+IHtcbiAgc3dpdGNoIChqc1R5cGUoanMpKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiBgXCIke2pzLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cImA7XG5cbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIHJldHVybiBqcy50b1N0cmluZygpO1xuXG4gICAgY2FzZSAna2V5d29yZCc6XG4gICAgICByZXR1cm4ganMudG9TdHJpbmcoKTtcblxuICAgIGNhc2UgJ251bGwnOlxuICAgICAgcmV0dXJuICduaWwnO1xuXG4gICAgY2FzZSAncmVnZXhwJzpcbiAgICAgIHJldHVybiBgI1wiJHtqcy5zb3VyY2V9XCJgO1xuXG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgLy8gc2ltcGxlIHZlcnRpY2FsIGZvcm1hdFxuICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmtleXMoanMpXG4gICAgICAgIC5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSBwYWRCbG9jayhrZXkubGVuZ3RoICsgMiwganNUb0Vkbihqc1trZXldKSk7XG4gICAgICAgICAgcmV0dXJuIGAke2FjY3VtdWxhdG9yfToke2tleX0gJHt2YWx9XFxuIGA7XG4gICAgICAgIH0sICcnKVxuICAgICAgICAudHJpbSgpO1xuICAgICAgcmV0dXJuIGB7JHtwYWRCbG9jaygxLCBvYmopfX1gO1xuICAgIH1cblxuICAgIGNhc2UgJ2FycmF5Jzoge1xuICAgICAgLy8gc2ltcGxlIGhvcml6b250YWwgZm9ybWF0XG4gICAgICBjb25zdCBhcnIgPSBqc1xuICAgICAgICAucmVkdWNlKChhY2N1bXVsYXRvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBgJHthY2N1bXVsYXRvcn0gJHtqc1RvRWRuKHZhbHVlKX1gLCAnJylcbiAgICAgICAgLnRyaW0oKTtcbiAgICAgIHJldHVybiBgWyR7cGFkQmxvY2soMSwgYXJyKX1dYDtcbiAgICB9XG5cbiAgICBkZWZhdWx0OiAvLyAnbnVtYmVyJyAnYm9vbGVhbidcbiAgICAgIHJldHVybiBqcy50b1N0cmluZygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2xqX2h0dHA6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2Nsal9odHRwJyxcbiAgICB0aXRsZTogJ2Nsai1odHRwJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL2Rha3JvbmUvY2xqLWh0dHAnLFxuICAgIGRlc2NyaXB0aW9uOiAnQW4gaWRpb21hdGljIGNsb2p1cmUgaHR0cCBjbGllbnQgd3JhcHBpbmcgdGhlIGFwYWNoZSBjbGllbnQuJyxcbiAgfSxcbiAgY29udmVydDogKHsgcXVlcnlPYmosIG1ldGhvZCwgcG9zdERhdGEsIHVybCwgYWxsSGVhZGVycyB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdGlvbnM/LmluZGVudCB9KTtcbiAgICBjb25zdCBtZXRob2RzID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJywgJ2hlYWQnLCAnb3B0aW9ucyddO1xuICAgIG1ldGhvZCA9IG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFtZXRob2RzLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgIHB1c2goJ01ldGhvZCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICByZXR1cm4gam9pbigpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGhlYWRlcnM6IGFsbEhlYWRlcnMsXG4gICAgICAncXVlcnktcGFyYW1zJzogcXVlcnlPYmosXG4gICAgfTtcblxuICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zWydjb250ZW50LXR5cGUnXSA9IG5ldyBLZXl3b3JkKCdqc29uJyk7XG4gICAgICAgICAgcGFyYW1zWydmb3JtLXBhcmFtcyddID0gcG9zdERhdGEuanNvbk9iajtcbiAgICAgICAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJOYW1lKHBhcmFtcy5oZWFkZXJzLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zWydmb3JtLXBhcmFtcyddID0gcG9zdERhdGEucGFyYW1zT2JqO1xuICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGdldEhlYWRlck5hbWUocGFyYW1zLmhlYWRlcnMsICdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RleHQvcGxhaW4nOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zLmJvZHkgPSBwb3N0RGF0YS50ZXh0O1xuICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGdldEhlYWRlck5hbWUocGFyYW1zLmhlYWRlcnMsICdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOiB7XG4gICAgICAgIGlmIChwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBwYXJhbXMubXVsdGlwYXJ0ID0gcG9zdERhdGEucGFyYW1zLm1hcChwYXJhbSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0uZmlsZU5hbWUgJiYgIXBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogcGFyYW0ubmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBuZXcgRmlsZShwYXJhbS5maWxlTmFtZSksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgICAgICAgICBjb250ZW50OiBwYXJhbS52YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJOYW1lKHBhcmFtcy5oZWFkZXJzLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoZ2V0SGVhZGVyKHBhcmFtcy5oZWFkZXJzLCAnYWNjZXB0JykpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zLmFjY2VwdCA9IG5ldyBLZXl3b3JkKCdqc29uJyk7XG5cbiAgICAgICAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJOYW1lKHBhcmFtcy5oZWFkZXJzLCAnYWNjZXB0Jyk7XG4gICAgICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHB1c2goXCIocmVxdWlyZSAnW2Nsai1odHRwLmNsaWVudCA6YXMgY2xpZW50XSlcXG5cIik7XG5cbiAgICBpZiAob2JqRW1wdHkoZmlsdGVyRW1wdHkocGFyYW1zKSkpIHtcbiAgICAgIHB1c2goYChjbGllbnQvJHttZXRob2R9IFwiJHt1cmx9XCIpYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAxMSArIG1ldGhvZC5sZW5ndGggKyB1cmwubGVuZ3RoO1xuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0gcGFkQmxvY2socGFkZGluZywganNUb0VkbihmaWx0ZXJFbXB0eShwYXJhbXMpKSk7XG4gICAgICBwdXNoKGAoY2xpZW50LyR7bWV0aG9kfSBcIiR7dXJsfVwiICR7Zm9ybWF0dGVkUGFyYW1zfSlgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgY2xqX2h0dHAgfSBmcm9tICcuL2Nsal9odHRwL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBjbG9qdXJlOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdjbG9qdXJlJyxcbiAgICB0aXRsZTogJ0Nsb2p1cmUnLFxuICAgIGV4dG5hbWU6ICcuY2xqJyxcbiAgICBkZWZhdWx0OiAnY2xqX2h0dHAnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIGNsal9odHRwLFxuICB9LFxufTtcbiIsImltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9odHRwc25pcHBldCc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuY29uc3QgZ2V0RGVjb21wcmVzc2lvbk1ldGhvZHMgPSAoYWxsSGVhZGVyczogUmVxdWVzdFsnYWxsSGVhZGVycyddKSA9PiB7XG4gIGxldCBhY2NlcHRFbmNvZGluZ3MgPSBnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2FjY2VwdC1lbmNvZGluZycpO1xuICBpZiAoIWFjY2VwdEVuY29kaW5ncykge1xuICAgIHJldHVybiBbXTsgLy8gbm8gZGVjb21wcmVzc2lvblxuICB9XG5cbiAgY29uc3Qgc3VwcG9ydGVkTWV0aG9kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBnemlwOiAnRGVjb21wcmVzc2lvbk1ldGhvZHMuR1ppcCcsXG4gICAgZGVmbGF0ZTogJ0RlY29tcHJlc3Npb25NZXRob2RzLkRlZmxhdGUnLFxuICB9O1xuXG4gIGNvbnN0IG1ldGhvZHM6IHN0cmluZ1tdID0gW107XG4gIGlmICh0eXBlb2YgYWNjZXB0RW5jb2RpbmdzID09PSAnc3RyaW5nJykge1xuICAgIGFjY2VwdEVuY29kaW5ncyA9IFthY2NlcHRFbmNvZGluZ3NdO1xuICB9XG4gIGFjY2VwdEVuY29kaW5ncy5mb3JFYWNoKGFjY2VwdEVuY29kaW5nID0+IHtcbiAgICBhY2NlcHRFbmNvZGluZy5zcGxpdCgnLCcpLmZvckVhY2goZW5jb2RpbmcgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXFxzKihbXjtcXHNdKykvLmV4ZWMoZW5jb2RpbmcpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHN1cHBvcnRlZE1ldGhvZHNbbWF0Y2hbMV1dO1xuICAgICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgICAgbWV0aG9kcy5wdXNoKG1ldGhvZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuXG5leHBvcnQgY29uc3QgaHR0cGNsaWVudDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnaHR0cGNsaWVudCcsXG4gICAgdGl0bGU6ICdIdHRwQ2xpZW50JyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2FwaS9zeXN0ZW0ubmV0Lmh0dHAuaHR0cGNsaWVudCcsXG4gICAgZGVzY3JpcHRpb246ICcuTkVUIFN0YW5kYXJkIEhUVFAgQ2xpZW50JyxcbiAgfSxcbiAgY29udmVydDogKHsgYWxsSGVhZGVycywgcG9zdERhdGEsIG1ldGhvZCwgZnVsbFVybCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgcHVzaCgndXNpbmcgU3lzdGVtLk5ldC5IdHRwLkhlYWRlcnM7Jyk7XG4gICAgbGV0IGNsaWVudGhhbmRsZXIgPSAnJztcbiAgICBjb25zdCBjb29raWVzID0gQm9vbGVhbihhbGxIZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgZGVjb21wcmVzc2lvbk1ldGhvZHMgPSBnZXREZWNvbXByZXNzaW9uTWV0aG9kcyhhbGxIZWFkZXJzKTtcbiAgICBpZiAoY29va2llcyB8fCBkZWNvbXByZXNzaW9uTWV0aG9kcy5sZW5ndGgpIHtcbiAgICAgIGNsaWVudGhhbmRsZXIgPSAnY2xpZW50SGFuZGxlcic7XG4gICAgICBwdXNoKCd2YXIgY2xpZW50SGFuZGxlciA9IG5ldyBIdHRwQ2xpZW50SGFuZGxlcicpO1xuICAgICAgcHVzaCgneycpO1xuICAgICAgaWYgKGNvb2tpZXMpIHtcbiAgICAgICAgLy8gZW5hYmxlIHNldHRpbmcgdGhlIGNvb2tpZSBoZWFkZXJcbiAgICAgICAgcHVzaCgnVXNlQ29va2llcyA9IGZhbHNlLCcsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKGRlY29tcHJlc3Npb25NZXRob2RzLmxlbmd0aCkge1xuICAgICAgICAvLyBlbmFibGUgZGVjb21wcmVzc2lvbiBmb3Igc3VwcG9ydGVkIG1ldGhvZHNcbiAgICAgICAgcHVzaChgQXV0b21hdGljRGVjb21wcmVzc2lvbiA9ICR7ZGVjb21wcmVzc2lvbk1ldGhvZHMuam9pbignIHwgJyl9LGAsIDEpO1xuICAgICAgfVxuICAgICAgcHVzaCgnfTsnKTtcbiAgICB9XG5cbiAgICBwdXNoKGB2YXIgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoJHtjbGllbnRoYW5kbGVyfSk7YCk7XG5cbiAgICBwdXNoKCd2YXIgcmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdE1lc3NhZ2UnKTtcbiAgICBwdXNoKCd7Jyk7XG5cbiAgICBjb25zdCBtZXRob2RzID0gWydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ1BBVENIJywgJ0hFQUQnLCAnT1BUSU9OUycsICdUUkFDRSddO1xuICAgIG1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChtZXRob2QgJiYgbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICAvLyBidWlsZGluIG1ldGhvZFxuICAgICAgbWV0aG9kID0gYEh0dHBNZXRob2QuJHttZXRob2RbMF19JHttZXRob2Quc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY3VzdG9tIG1ldGhvZFxuICAgICAgbWV0aG9kID0gYG5ldyBIdHRwTWV0aG9kKFwiJHttZXRob2R9XCIpYDtcbiAgICB9XG4gICAgcHVzaChgTWV0aG9kID0gJHttZXRob2R9LGAsIDEpO1xuXG4gICAgcHVzaChgUmVxdWVzdFVyaSA9IG5ldyBVcmkoXCIke2Z1bGxVcmx9XCIpLGAsIDEpO1xuXG4gICAgY29uc3QgaGVhZGVyczogKGtleW9mIHR5cGVvZiBhbGxIZWFkZXJzKVtdID0gT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZmlsdGVyKGhlYWRlciA9PiB7XG4gICAgICBzd2l0Y2ggKGhlYWRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ2NvbnRlbnQtdHlwZSc6XG4gICAgICAgIGNhc2UgJ2NvbnRlbnQtbGVuZ3RoJzpcbiAgICAgICAgY2FzZSAnYWNjZXB0LWVuY29kaW5nJzpcbiAgICAgICAgICAvLyBza2lwIHRoZXNlIGhlYWRlcnNcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChoZWFkZXJzLmxlbmd0aCkge1xuICAgICAgcHVzaCgnSGVhZGVycyA9JywgMSk7XG4gICAgICBwdXNoKCd7JywgMSk7XG4gICAgICBoZWFkZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgcHVzaChgeyBcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIgfSxgLCAyKTtcbiAgICAgIH0pO1xuICAgICAgcHVzaCgnfSwnLCAxKTtcbiAgICB9XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBwb3N0RGF0YS5taW1lVHlwZTtcbiAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgICBwdXNoKCdDb250ZW50ID0gbmV3IEZvcm1VcmxFbmNvZGVkQ29udGVudChuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4nLCAxKTtcbiAgICAgICAgICBwdXNoKCd7JywgMSk7XG4gICAgICAgICAgcG9zdERhdGEucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgIHB1c2goYHsgXCIke3BhcmFtLm5hbWV9XCIsIFwiJHtwYXJhbS52YWx1ZX1cIiB9LGAsIDIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHB1c2goJ30pLCcsIDEpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgICAgIHB1c2goJ0NvbnRlbnQgPSBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFDb250ZW50JywgMSk7XG4gICAgICAgICAgcHVzaCgneycsIDEpO1xuICAgICAgICAgIHBvc3REYXRhLnBhcmFtcz8uZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICBwdXNoKGBuZXcgU3RyaW5nQ29udGVudCgke0pTT04uc3RyaW5naWZ5KHBhcmFtLnZhbHVlIHx8ICcnKX0pYCwgMik7XG4gICAgICAgICAgICBwdXNoKCd7JywgMik7XG4gICAgICAgICAgICBwdXNoKCdIZWFkZXJzID0nLCAzKTtcbiAgICAgICAgICAgIHB1c2goJ3snLCAzKTtcbiAgICAgICAgICAgIGlmIChwYXJhbS5jb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICBwdXNoKGBDb250ZW50VHlwZSA9IG5ldyBNZWRpYVR5cGVIZWFkZXJWYWx1ZShcIiR7cGFyYW0uY29udGVudFR5cGV9XCIpLGAsIDQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHVzaCgnQ29udGVudERpc3Bvc2l0aW9uID0gbmV3IENvbnRlbnREaXNwb3NpdGlvbkhlYWRlclZhbHVlKFwiZm9ybS1kYXRhXCIpJywgNCk7XG4gICAgICAgICAgICBwdXNoKCd7JywgNCk7XG4gICAgICAgICAgICBwdXNoKGBOYW1lID0gXCIke3BhcmFtLm5hbWV9XCIsYCwgNSk7XG4gICAgICAgICAgICBpZiAocGFyYW0uZmlsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcHVzaChgRmlsZU5hbWUgPSBcIiR7cGFyYW0uZmlsZU5hbWV9XCIsYCwgNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwdXNoKCd9JywgNCk7XG4gICAgICAgICAgICBwdXNoKCd9JywgMyk7XG4gICAgICAgICAgICBwdXNoKCd9LCcsIDIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcHVzaCgnfSwnLCAxKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHB1c2goYENvbnRlbnQgPSBuZXcgU3RyaW5nQ29udGVudCgke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQgfHwgJycpfSlgLCAxKTtcbiAgICAgICAgICBwdXNoKCd7JywgMSk7XG4gICAgICAgICAgcHVzaCgnSGVhZGVycyA9JywgMik7XG4gICAgICAgICAgcHVzaCgneycsIDIpO1xuICAgICAgICAgIHB1c2goYENvbnRlbnRUeXBlID0gbmV3IE1lZGlhVHlwZUhlYWRlclZhbHVlKFwiJHtjb250ZW50VHlwZX1cIilgLCAzKTtcbiAgICAgICAgICBwdXNoKCd9JywgMik7XG4gICAgICAgICAgcHVzaCgnfScsIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwdXNoKCd9OycpO1xuXG4gICAgLy8gc2VuZCBhbmQgcmVhZCByZXNwb25zZVxuICAgIHB1c2goJ3VzaW5nICh2YXIgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuU2VuZEFzeW5jKHJlcXVlc3QpKScpO1xuICAgIHB1c2goJ3snKTtcbiAgICBwdXNoKCdyZXNwb25zZS5FbnN1cmVTdWNjZXNzU3RhdHVzQ29kZSgpOycsIDEpO1xuICAgIHB1c2goJ3ZhciBib2R5ID0gYXdhaXQgcmVzcG9uc2UuQ29udGVudC5SZWFkQXNTdHJpbmdBc3luYygpOycsIDEpO1xuICAgIHB1c2goJ0NvbnNvbGUuV3JpdGVMaW5lKGJvZHkpOycsIDEpO1xuICAgIHB1c2goJ30nKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBnZXRIZWFkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCByZXN0c2hhcnA6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3Jlc3RzaGFycCcsXG4gICAgdGl0bGU6ICdSZXN0U2hhcnAnLFxuICAgIGxpbms6ICdodHRwOi8vcmVzdHNoYXJwLm9yZy8nLFxuICAgIGRlc2NyaXB0aW9uOiAnU2ltcGxlIFJFU1QgYW5kIEhUVFAgQVBJIENsaWVudCBmb3IgLk5FVCcsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IGFsbEhlYWRlcnMsIG1ldGhvZCwgZnVsbFVybCwgaGVhZGVyc09iaiwgY29va2llcywgcG9zdERhdGEgfSkgPT4ge1xuICAgIGNvbnN0IHsgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKCk7XG4gICAgY29uc3QgaXNTdXBwb3J0ZWRNZXRob2QgPSBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnLCAnUEFUQ0gnLCAnSEVBRCcsICdPUFRJT05TJ10uaW5jbHVkZXMoXG4gICAgICBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICApO1xuXG4gICAgaWYgKCFpc1N1cHBvcnRlZE1ldGhvZCkge1xuICAgICAgcmV0dXJuICdNZXRob2Qgbm90IHN1cHBvcnRlZCc7XG4gICAgfVxuXG4gICAgcHVzaChgdmFyIGNsaWVudCA9IG5ldyBSZXN0Q2xpZW50KFwiJHtmdWxsVXJsfVwiKTtgKTtcbiAgICBwdXNoKGB2YXIgcmVxdWVzdCA9IG5ldyBSZXN0UmVxdWVzdChNZXRob2QuJHttZXRob2QudG9VcHBlckNhc2UoKX0pO2ApO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMsIGluY2x1ZGluZyB0aGUgY29va2llc1xuXG4gICAgT2JqZWN0LmtleXMoaGVhZGVyc09iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgcHVzaChgcmVxdWVzdC5BZGRIZWFkZXIoXCIke2tleX1cIiwgXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhoZWFkZXJzT2JqW2tleV0pfVwiKTtgKTtcbiAgICB9KTtcblxuICAgIGNvb2tpZXMuZm9yRWFjaCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBwdXNoKGByZXF1ZXN0LkFkZENvb2tpZShcIiR7bmFtZX1cIiwgXCIke3ZhbHVlfVwiKTtgKTtcbiAgICB9KTtcblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgY29uc3QgdGV4dCA9IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpO1xuICAgICAgcHVzaChgcmVxdWVzdC5BZGRQYXJhbWV0ZXIoXCIke2hlYWRlcn1cIiwgJHt0ZXh0fSwgUGFyYW1ldGVyVHlwZS5SZXF1ZXN0Qm9keSk7YCk7XG4gICAgfVxuXG4gICAgcHVzaCgnSVJlc3RSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC5FeGVjdXRlKHJlcXVlc3QpOycpO1xuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBodHRwY2xpZW50IH0gZnJvbSAnLi9odHRwY2xpZW50L2NsaWVudCc7XG5pbXBvcnQgeyByZXN0c2hhcnAgfSBmcm9tICcuL3Jlc3RzaGFycC9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgY3NoYXJwOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdjc2hhcnAnLFxuICAgIHRpdGxlOiAnQyMnLFxuICAgIGV4dG5hbWU6ICcuY3MnLFxuICAgIGRlZmF1bHQ6ICdyZXN0c2hhcnAnLFxuICB9LFxuXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgaHR0cGNsaWVudCxcbiAgICByZXN0c2hhcnAsXG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgbmF0aXZlIEdvLlxuICpcbiAqIEBhdXRob3JcbiAqIEBtb250YW5hZmx5bm5cbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBHb05hdGl2ZU9wdGlvbnMge1xuICBzaG93Qm9pbGVycGxhdGU/OiBib29sZWFuO1xuICBjaGVja0Vycm9ycz86IGJvb2xlYW47XG4gIHByaW50Qm9keT86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBuYXRpdmU6IENsaWVudDxHb05hdGl2ZU9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnbmF0aXZlJyxcbiAgICB0aXRsZTogJ05ld1JlcXVlc3QnLFxuICAgIGxpbms6ICdodHRwOi8vZ29sYW5nLm9yZy9wa2cvbmV0L2h0dHAvI05ld1JlcXVlc3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnR29sYW5nIEhUVFAgY2xpZW50IHJlcXVlc3QnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBwb3N0RGF0YSwgbWV0aG9kLCBhbGxIZWFkZXJzLCBmdWxsVXJsIH0sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgYmxhbmssIHB1c2gsIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogJ1xcdCcgfSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzaG93Qm9pbGVycGxhdGUgPSB0cnVlLFxuICAgICAgY2hlY2tFcnJvcnMgPSBmYWxzZSxcbiAgICAgIHByaW50Qm9keSA9IHRydWUsXG4gICAgICB0aW1lb3V0ID0gLTEsXG4gICAgICBpbnNlY3VyZVNraXBWZXJpZnkgPSBmYWxzZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGVycm9yUGxhY2Vob2xkZXIgPSBjaGVja0Vycm9ycyA/ICdlcnInIDogJ18nO1xuXG4gICAgY29uc3QgaW5kZW50ID0gc2hvd0JvaWxlcnBsYXRlID8gMSA6IDA7XG5cbiAgICBjb25zdCBlcnJvckNoZWNrID0gKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrRXJyb3JzKSB7XG4gICAgICAgIHB1c2goJ2lmIGVyciAhPSBuaWwgeycsIGluZGVudCk7XG4gICAgICAgIHB1c2goJ3BhbmljKGVyciknLCBpbmRlbnQgKyAxKTtcbiAgICAgICAgcHVzaCgnfScsIGluZGVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBib2lsZXJwbGF0ZVxuICAgIGlmIChzaG93Qm9pbGVycGxhdGUpIHtcbiAgICAgIHB1c2goJ3BhY2thZ2UgbWFpbicpO1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJ2ltcG9ydCAoJyk7XG4gICAgICBwdXNoKCdcImZtdFwiJywgaW5kZW50KTtcblxuICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgIHB1c2goJ1widGltZVwiJywgaW5kZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc2VjdXJlU2tpcFZlcmlmeSkge1xuICAgICAgICBwdXNoKCdcImNyeXB0by90bHNcIicsIGluZGVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgIHB1c2goJ1wic3RyaW5nc1wiJywgaW5kZW50KTtcbiAgICAgIH1cblxuICAgICAgcHVzaCgnXCJuZXQvaHR0cFwiJywgaW5kZW50KTtcblxuICAgICAgaWYgKHByaW50Qm9keSkge1xuICAgICAgICBwdXNoKCdcImlvXCInLCBpbmRlbnQpO1xuICAgICAgfVxuXG4gICAgICBwdXNoKCcpJyk7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaCgnZnVuYyBtYWluKCkgeycpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYW4gaW5zZWN1cmUgdHJhbnNwb3J0IGZvciB0aGUgY2xpZW50XG4gICAgaWYgKGluc2VjdXJlU2tpcFZlcmlmeSkge1xuICAgICAgcHVzaCgnaW5zZWN1cmVUcmFuc3BvcnQgOj0gaHR0cC5EZWZhdWx0VHJhbnNwb3J0LigqaHR0cC5UcmFuc3BvcnQpLkNsb25lKCknLCBpbmRlbnQpO1xuICAgICAgcHVzaCgnaW5zZWN1cmVUcmFuc3BvcnQuVExTQ2xpZW50Q29uZmlnID0gJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfScsIGluZGVudCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNsaWVudFxuICAgIGNvbnN0IGhhc1RpbWVvdXQgPSB0aW1lb3V0ID4gMDtcbiAgICBjb25zdCBoYXNDbGllbnQgPSBoYXNUaW1lb3V0IHx8IGluc2VjdXJlU2tpcFZlcmlmeTtcbiAgICBjb25zdCBjbGllbnQgPSBoYXNDbGllbnQgPyAnY2xpZW50JyA6ICdodHRwLkRlZmF1bHRDbGllbnQnO1xuXG4gICAgaWYgKGhhc0NsaWVudCkge1xuICAgICAgcHVzaCgnY2xpZW50IDo9IGh0dHAuQ2xpZW50eycsIGluZGVudCk7XG5cbiAgICAgIGlmIChoYXNUaW1lb3V0KSB7XG4gICAgICAgIHB1c2goYFRpbWVvdXQ6IHRpbWUuRHVyYXRpb24oJHt0aW1lb3V0fSAqIHRpbWUuU2Vjb25kKSxgLCBpbmRlbnQgKyAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc2VjdXJlU2tpcFZlcmlmeSkge1xuICAgICAgICBwdXNoKCdUcmFuc3BvcnQ6IGluc2VjdXJlVHJhbnNwb3J0LCcsIGluZGVudCArIDEpO1xuICAgICAgfVxuXG4gICAgICBwdXNoKCd9JywgaW5kZW50KTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgcHVzaChgdXJsIDo9IFwiJHtmdWxsVXJsfVwiYCwgaW5kZW50KTtcbiAgICBibGFuaygpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBib2R5IGNvbnRlbnQgb3Igbm90IGNyZWF0ZSB0aGUgdmFyIGFuZCByZWFkZXIgb3IgbmlsXG4gICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgIHB1c2goYHBheWxvYWQgOj0gc3RyaW5ncy5OZXdSZWFkZXIoJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX0pYCwgaW5kZW50KTtcbiAgICAgIGJsYW5rKCk7XG4gICAgICBwdXNoKGByZXEsICR7ZXJyb3JQbGFjZWhvbGRlcn0gOj0gaHR0cC5OZXdSZXF1ZXN0KFwiJHttZXRob2R9XCIsIHVybCwgcGF5bG9hZClgLCBpbmRlbnQpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChgcmVxLCAke2Vycm9yUGxhY2Vob2xkZXJ9IDo9IGh0dHAuTmV3UmVxdWVzdChcIiR7bWV0aG9kfVwiLCB1cmwsIG5pbClgLCBpbmRlbnQpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBlcnJvckNoZWNrKCk7XG5cbiAgICAvLyBBZGQgaGVhZGVyc1xuICAgIGlmIChPYmplY3Qua2V5cyhhbGxIZWFkZXJzKS5sZW5ndGgpIHtcbiAgICAgIE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgcHVzaChgcmVxLkhlYWRlci5BZGQoXCIke2tleX1cIiwgXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhhbGxIZWFkZXJzW2tleV0pfVwiKWAsIGluZGVudCk7XG4gICAgICB9KTtcblxuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHJlcXVlc3RcbiAgICBwdXNoKGByZXMsICR7ZXJyb3JQbGFjZWhvbGRlcn0gOj0gJHtjbGllbnR9LkRvKHJlcSlgLCBpbmRlbnQpO1xuICAgIGVycm9yQ2hlY2soKTtcblxuICAgIC8vIEdldCBCb2R5XG4gICAgaWYgKHByaW50Qm9keSkge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJ2RlZmVyIHJlcy5Cb2R5LkNsb3NlKCknLCBpbmRlbnQpO1xuICAgICAgcHVzaChgYm9keSwgJHtlcnJvclBsYWNlaG9sZGVyfSA6PSBpby5SZWFkQWxsKHJlcy5Cb2R5KWAsIGluZGVudCk7XG4gICAgICBlcnJvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLy8gUHJpbnQgaXRcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ2ZtdC5QcmludGxuKHJlcyknLCBpbmRlbnQpO1xuXG4gICAgaWYgKHByaW50Qm9keSkge1xuICAgICAgcHVzaCgnZm10LlByaW50bG4oc3RyaW5nKGJvZHkpKScsIGluZGVudCk7XG4gICAgfVxuXG4gICAgLy8gRW5kIG1haW4gYmxvY2tcbiAgICBpZiAoc2hvd0JvaWxlcnBsYXRlKSB7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaCgnfScpO1xuICAgIH1cblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBuYXRpdmUgfSBmcm9tICcuL25hdGl2ZS9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgZ286IFRhcmdldCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2dvJyxcbiAgICB0aXRsZTogJ0dvJyxcbiAgICBleHRuYW1lOiAnLmdvJyxcbiAgICBkZWZhdWx0OiAnbmF0aXZlJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBuYXRpdmUsXG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciB0byBnZW5lcmF0ZSByYXcgSFRUUC8xLjEgcmVxdWVzdCBzdHJpbmdzLFxuICogaW4gYWNjb3JkYW5jZSB0byB0aGUgUkZDIDcyMzAgKGFuZCBSRkMgNzIzMSkgc3BlY2lmaWNhdGlvbnMuXG4gKlxuICogQGF1dGhvclxuICogQGlydmlubGltXG4gKlxuICogRm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmNvbnN0IENSTEYgPSAnXFxyXFxuJztcblxuaW50ZXJmYWNlIEh0dHAxMU9wdGlvbnMge1xuICBhYnNvbHV0ZVVSST86IGJvb2xlYW47XG4gIGF1dG9Db250ZW50TGVuZ3RoPzogYm9vbGVhbjtcbiAgYXV0b0hvc3Q/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgZm9sbG93cyB0aGUgcmVxdWVzdCBtZXNzYWdlIGZvcm1hdCBpbiBhY2NvcmRhbmNlIHRvIFJGQyA3MjMwLCBTZWN0aW9uIDMuXG4gKiBFYWNoIHNlY3Rpb24gaXMgcHJlcGVuZGVkIHdpdGggdGhlIFJGQyBhbmQgc2VjdGlvbiBudW1iZXIuXG4gKiBTZWUgbW9yZSBhdCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuXG4gKi9cbmV4cG9ydCBjb25zdCBodHRwMTE6IENsaWVudDxIdHRwMTFPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2h0dHAxLjEnLFxuICAgIHRpdGxlOiAnSFRUUC8xLjEnLFxuICAgIGxpbms6ICdodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCcsXG4gICAgZGVzY3JpcHRpb246ICdIVFRQLzEuMSByZXF1ZXN0IHN0cmluZyBpbiBhY2NvcmRhbmNlIHdpdGggUkZDIDcyMzAnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBtZXRob2QsIGZ1bGxVcmwsIHVyaU9iaiwgaHR0cFZlcnNpb24sIGFsbEhlYWRlcnMsIHBvc3REYXRhIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgYWJzb2x1dGVVUkk6IGZhbHNlLFxuICAgICAgYXV0b0NvbnRlbnRMZW5ndGg6IHRydWUsXG4gICAgICBhdXRvSG9zdDogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIFJGQyA3MjMwIFNlY3Rpb24gMy4gTWVzc2FnZSBGb3JtYXRcbiAgICAvLyBBbGwgbGluZXMgaGF2ZSBubyBpbmRlbnRhdGlvbiwgYW5kIHNob3VsZCBiZSB0ZXJtaW5hdGVkIHdpdGggQ1JMRi5cbiAgICBjb25zdCB7IGJsYW5rLCBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6ICcnLCBqb2luOiBDUkxGIH0pO1xuXG4gICAgLy8gUkZDIDcyMzAgU2VjdGlvbiA1LjMuIFJlcXVlc3QgVGFyZ2V0XG4gICAgLy8gRGV0ZXJtaW5lcyBpZiB0aGUgUmVxdWVzdC1MaW5lIHNob3VsZCB1c2UgJ2Fic29sdXRlLWZvcm0nIG9yICdvcmlnaW4tZm9ybScuXG4gICAgLy8gQmFzaWNhbGx5IGl0IG1lYW5zIHdoZXRoZXIgdGhlIFwiaHR0cDovL2RvbWFpbi5jb21cIiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgdXJsLlxuICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBvcHRzLmFic29sdXRlVVJJID8gZnVsbFVybCA6IHVyaU9iai5wYXRoO1xuXG4gICAgLy8gUkZDIDcyMzAgU2VjdGlvbiAzLjEuMS4gUmVxdWVzdC1MaW5lXG4gICAgcHVzaChgJHttZXRob2R9ICR7cmVxdWVzdFVybH0gJHtodHRwVmVyc2lvbn1gKTtcblxuICAgIGNvbnN0IGhlYWRlcktleXMgPSBPYmplY3Qua2V5cyhhbGxIZWFkZXJzKTtcbiAgICAvLyBSRkMgNzIzMSBTZWN0aW9uIDUuIEhlYWRlciBGaWVsZHNcbiAgICBoZWFkZXJLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIC8vIENhcGl0YWxpemUgaGVhZGVyIGtleXMsIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IHJlcXVpcmVkIGJ5IHRoZSBzcGVjLlxuICAgICAgY29uc3Qga2V5Q2FwaXRhbGl6ZWQgPSBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oXnwtKShcXHcpL2csIGlucHV0ID0+IGlucHV0LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgcHVzaChgJHtrZXlDYXBpdGFsaXplZH06ICR7YWxsSGVhZGVyc1trZXldfWApO1xuICAgIH0pO1xuXG4gICAgLy8gUkZDIDcyMzAgU2VjdGlvbiA1LjQuIEhvc3RcbiAgICAvLyBBdXRvbWF0aWNhbGx5IHNldCBIb3N0IGhlYWRlciBpZiBvcHRpb24gaXMgb24gYW5kIG9uIGhlYWRlciBhbHJlYWR5IGV4aXN0cy5cbiAgICBpZiAob3B0cy5hdXRvSG9zdCAmJiAhaGVhZGVyS2V5cy5pbmNsdWRlcygnaG9zdCcpKSB7XG4gICAgICBwdXNoKGBIb3N0OiAke3VyaU9iai5ob3N0fWApO1xuICAgIH1cblxuICAgIC8vIFJGQyA3MjMwIFNlY3Rpb24gMy4zLjMuIE1lc3NhZ2UgQm9keSBMZW5ndGhcbiAgICAvLyBBdXRvbWF0aWNhbGx5IHNldCBDb250ZW50LUxlbmd0aCBoZWFkZXIgaWYgb3B0aW9uIGlzIG9uLCBwb3N0RGF0YSBpcyBwcmVzZW50IGFuZCBubyBoZWFkZXIgYWxyZWFkeSBleGlzdHMuXG4gICAgaWYgKG9wdHMuYXV0b0NvbnRlbnRMZW5ndGggJiYgcG9zdERhdGEudGV4dCAmJiAhaGVhZGVyS2V5cy5pbmNsdWRlcygnY29udGVudC1sZW5ndGgnKSkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgocG9zdERhdGEudGV4dCwgJ2FzY2lpJykudG9TdHJpbmcoKTtcbiAgICAgIHB1c2goYENvbnRlbnQtTGVuZ3RoOiAke2xlbmd0aH1gKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZXh0cmEgbGluZSBhZnRlciBoZWFkZXIgc2VjdGlvbi5cbiAgICBibGFuaygpO1xuXG4gICAgLy8gU2VwYXJhdGUgaGVhZGVyIHNlY3Rpb24gYW5kIG1lc3NhZ2UgYm9keSBzZWN0aW9uLlxuICAgIGNvbnN0IGhlYWRlclNlY3Rpb24gPSBqb2luKCk7XG5cbiAgICAvLyBSRkMgNzIzMCBTZWN0aW9uIDMuMy4gTWVzc2FnZSBCb2R5XG4gICAgY29uc3QgbWVzc2FnZUJvZHkgPSBwb3N0RGF0YS50ZXh0IHx8ICcnO1xuXG4gICAgLy8gUkZDIDcyMzAgU2VjdGlvbiAzLiBNZXNzYWdlIEZvcm1hdFxuICAgIC8vIEV4dHJhIENSTEYgc2VwYXJhdGluZyB0aGUgaGVhZGVycyBmcm9tIHRoZSBib2R5LlxuICAgIHJldHVybiBgJHtoZWFkZXJTZWN0aW9ufSR7Q1JMRn0ke21lc3NhZ2VCb2R5fWA7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBodHRwMTEgfSBmcm9tICcuL2h0dHAxLjEvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGh0dHA6IFRhcmdldCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2h0dHAnLFxuICAgIHRpdGxlOiAnSFRUUCcsXG4gICAgZXh0bmFtZTogbnVsbCxcbiAgICBkZWZhdWx0OiAnMS4xJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICAnaHR0cDEuMSc6IGh0dHAxMSxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogQXN5bmNocm9ub3VzIEh0dHAgYW5kIFdlYlNvY2tldCBDbGllbnQgbGlicmFyeSBmb3IgSmF2YVxuICpcbiAqIEBhdXRob3JcbiAqIEB3aW5kYXJkXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCBhc3luY2h0dHA6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2FzeW5jaHR0cCcsXG4gICAgdGl0bGU6ICdBc3luY0h0dHAnLFxuICAgIGxpbms6ICdodHRwczovL2dpdGh1Yi5jb20vQXN5bmNIdHRwQ2xpZW50L2FzeW5jLWh0dHAtY2xpZW50JyxcbiAgICBkZXNjcmlwdGlvbjogJ0FzeW5jaHJvbm91cyBIdHRwIGFuZCBXZWJTb2NrZXQgQ2xpZW50IGxpYnJhcnkgZm9yIEphdmEnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBtZXRob2QsIGFsbEhlYWRlcnMsIHBvc3REYXRhLCBmdWxsVXJsIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IHsgYmxhbmssIHB1c2gsIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBwdXNoKCdBc3luY0h0dHBDbGllbnQgY2xpZW50ID0gbmV3IERlZmF1bHRBc3luY0h0dHBDbGllbnQoKTsnKTtcblxuICAgIHB1c2goYGNsaWVudC5wcmVwYXJlKFwiJHttZXRob2QudG9VcHBlckNhc2UoKX1cIiwgXCIke2Z1bGxVcmx9XCIpYCk7XG5cbiAgICAvLyBBZGQgaGVhZGVycywgaW5jbHVkaW5nIHRoZSBjb29raWVzXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgcHVzaChgLnNldEhlYWRlcihcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIpYCwgMSk7XG4gICAgfSk7XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgcHVzaChgLnNldEJvZHkoJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX0pYCwgMSk7XG4gICAgfVxuXG4gICAgcHVzaCgnLmV4ZWN1dGUoKScsIDEpO1xuICAgIHB1c2goJy50b0NvbXBsZXRhYmxlRnV0dXJlKCknLCAxKTtcbiAgICBwdXNoKCcudGhlbkFjY2VwdChTeXN0ZW0ub3V0OjpwcmludGxuKScsIDEpO1xuICAgIHB1c2goJy5qb2luKCk7JywgMSk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdjbGllbnQuY2xvc2UoKTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgSmF2YSB1c2luZyBqYXZhLm5ldC5odHRwLlxuICpcbiAqIEBhdXRob3JcbiAqIEB3dGV0c3VcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBOZXRIdHRwT3B0aW9ucyB7XG4gIGluZGVudD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IG5ldGh0dHA6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ25ldGh0dHAnLFxuICAgIHRpdGxlOiAnamF2YS5uZXQuaHR0cCcsXG4gICAgbGluazogJ2h0dHBzOi8vb3Blbmpkay5qYXZhLm5ldC9ncm91cHMvbmV0L2h0dHBjbGllbnQvaW50cm8uaHRtbCcsXG4gICAgZGVzY3JpcHRpb246ICdKYXZhIFN0YW5kYXJkaXplZCBIVFRQIENsaWVudCBBUEknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBhbGxIZWFkZXJzLCBmdWxsVXJsLCBtZXRob2QsIHBvc3REYXRhIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgcHVzaCgnSHR0cFJlcXVlc3QgcmVxdWVzdCA9IEh0dHBSZXF1ZXN0Lm5ld0J1aWxkZXIoKScpO1xuICAgIHB1c2goYC51cmkoVVJJLmNyZWF0ZShcIiR7ZnVsbFVybH1cIikpYCwgMik7XG5cbiAgICBPYmplY3Qua2V5cyhhbGxIZWFkZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBwdXNoKGAuaGVhZGVyKFwiJHtrZXl9XCIsIFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoYWxsSGVhZGVyc1trZXldKX1cIilgLCAyKTtcbiAgICB9KTtcblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBwdXNoKFxuICAgICAgICBgLm1ldGhvZChcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCIsIEh0dHBSZXF1ZXN0LkJvZHlQdWJsaXNoZXJzLm9mU3RyaW5nKCR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcG9zdERhdGEudGV4dCxcbiAgICAgICAgKX0pKWAsXG4gICAgICAgIDIsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKGAubWV0aG9kKFwiJHttZXRob2QudG9VcHBlckNhc2UoKX1cIiwgSHR0cFJlcXVlc3QuQm9keVB1Ymxpc2hlcnMubm9Cb2R5KCkpYCwgMik7XG4gICAgfVxuXG4gICAgcHVzaCgnLmJ1aWxkKCk7JywgMik7XG5cbiAgICBwdXNoKFxuICAgICAgJ0h0dHBSZXNwb25zZTxTdHJpbmc+IHJlc3BvbnNlID0gSHR0cENsaWVudC5uZXdIdHRwQ2xpZW50KCkuc2VuZChyZXF1ZXN0LCBIdHRwUmVzcG9uc2UuQm9keUhhbmRsZXJzLm9mU3RyaW5nKCkpOycsXG4gICAgKTtcbiAgICBwdXNoKCdTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuYm9keSgpKTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgSmF2YSB1c2luZyBPa0h0dHAuXG4gKlxuICogQGF1dGhvclxuICogQHNoYXNoaXJhbmphbjg0XG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCBva2h0dHA6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ29raHR0cCcsXG4gICAgdGl0bGU6ICdPa0h0dHAnLFxuICAgIGxpbms6ICdodHRwOi8vc3F1YXJlLmdpdGh1Yi5pby9va2h0dHAvJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FuIEhUVFAgUmVxdWVzdCBDbGllbnQgTGlicmFyeScsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IHBvc3REYXRhLCBtZXRob2QsIGZ1bGxVcmwsIGFsbEhlYWRlcnMgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIGNvbnN0IG1ldGhvZHMgPSBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnLCAnUEFUQ0gnLCAnSEVBRCddO1xuICAgIGNvbnN0IG1ldGhvZHNXaXRoQm9keSA9IFsnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ1BBVENIJ107XG5cbiAgICBwdXNoKCdPa0h0dHBDbGllbnQgY2xpZW50ID0gbmV3IE9rSHR0cENsaWVudCgpOycpO1xuICAgIGJsYW5rKCk7XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgaWYgKHBvc3REYXRhLmJvdW5kYXJ5KSB7XG4gICAgICAgIHB1c2goXG4gICAgICAgICAgYE1lZGlhVHlwZSBtZWRpYVR5cGUgPSBNZWRpYVR5cGUucGFyc2UoXCIke3Bvc3REYXRhLm1pbWVUeXBlfTsgYm91bmRhcnk9JHtwb3N0RGF0YS5ib3VuZGFyeX1cIik7YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2goYE1lZGlhVHlwZSBtZWRpYVR5cGUgPSBNZWRpYVR5cGUucGFyc2UoXCIke3Bvc3REYXRhLm1pbWVUeXBlfVwiKTtgKTtcbiAgICAgIH1cbiAgICAgIHB1c2goYFJlcXVlc3RCb2R5IGJvZHkgPSBSZXF1ZXN0Qm9keS5jcmVhdGUobWVkaWFUeXBlLCAke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpfSk7YCk7XG4gICAgfVxuXG4gICAgcHVzaCgnUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QuQnVpbGRlcigpJyk7XG4gICAgcHVzaChgLnVybChcIiR7ZnVsbFVybH1cIilgLCAxKTtcbiAgICBpZiAoIW1ldGhvZHMuaW5jbHVkZXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICBwdXNoKGAubWV0aG9kKFwiJHttZXRob2QudG9VcHBlckNhc2UoKX1cIiwgYm9keSlgLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2goYC5tZXRob2QoXCIke21ldGhvZC50b1VwcGVyQ2FzZSgpfVwiLCBudWxsKWAsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWV0aG9kc1dpdGhCb2R5LmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgcHVzaChgLiR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9KGJvZHkpYCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKGAuJHttZXRob2QudG9Mb3dlckNhc2UoKX0obnVsbClgLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChgLiR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9KClgLCAxKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycywgaW5jbHVkaW5nIHRoZSBjb29raWVzXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgcHVzaChgLmFkZEhlYWRlcihcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIpYCwgMSk7XG4gICAgfSk7XG5cbiAgICBwdXNoKCcuYnVpbGQoKTsnLCAxKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ1Jlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50Lm5ld0NhbGwocmVxdWVzdCkuZXhlY3V0ZSgpOycpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IGFzeW5jaHR0cCB9IGZyb20gJy4vYXN5bmNodHRwL2NsaWVudCc7XG5pbXBvcnQgeyBuZXRodHRwIH0gZnJvbSAnLi9uZXRodHRwL2NsaWVudCc7XG5pbXBvcnQgeyBva2h0dHAgfSBmcm9tICcuL29raHR0cC9jbGllbnQnO1xuaW1wb3J0IHsgdW5pcmVzdCB9IGZyb20gJy4vdW5pcmVzdC9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgamF2YTogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnamF2YScsXG4gICAgdGl0bGU6ICdKYXZhJyxcbiAgICBleHRuYW1lOiAnLmphdmEnLFxuICAgIGRlZmF1bHQ6ICd1bmlyZXN0JyxcbiAgfSxcblxuICBjbGllbnRzQnlJZDoge1xuICAgIGFzeW5jaHR0cCxcbiAgICBuZXRodHRwLFxuICAgIG9raHR0cCxcbiAgICB1bmlyZXN0LFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIEphdmEgdXNpbmcgVW5pcmVzdC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAc2hhc2hpcmFuamFuODRcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IHVuaXJlc3Q6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3VuaXJlc3QnLFxuICAgIHRpdGxlOiAnVW5pcmVzdCcsXG4gICAgbGluazogJ2h0dHA6Ly91bmlyZXN0LmlvL2phdmEuaHRtbCcsXG4gICAgZGVzY3JpcHRpb246ICdMaWdodHdlaWdodCBIVFRQIFJlcXVlc3QgQ2xpZW50IExpYnJhcnknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBtZXRob2QsIGFsbEhlYWRlcnMsIHBvc3REYXRhLCBmdWxsVXJsIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBqb2luLCBwdXNoIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgY29uc3QgbWV0aG9kcyA9IFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdQQVRDSCcsICdIRUFEJywgJ09QVElPTlMnXTtcblxuICAgIGlmICghbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGBIdHRwUmVzcG9uc2U8U3RyaW5nPiByZXNwb25zZSA9IFVuaXJlc3QuY3VzdG9tTWV0aG9kKFwiJHttZXRob2QudG9VcHBlckNhc2UoKX1cIixcIiR7ZnVsbFVybH1cIilgLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChgSHR0cFJlc3BvbnNlPFN0cmluZz4gcmVzcG9uc2UgPSBVbmlyZXN0LiR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9KFwiJHtmdWxsVXJsfVwiKWApO1xuICAgIH1cblxuICAgIC8vIEFkZCBoZWFkZXJzLCBpbmNsdWRpbmcgdGhlIGNvb2tpZXNcbiAgICBPYmplY3Qua2V5cyhhbGxIZWFkZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBwdXNoKGAuaGVhZGVyKFwiJHtrZXl9XCIsIFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoYWxsSGVhZGVyc1trZXldKX1cIilgLCAxKTtcbiAgICB9KTtcblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBwdXNoKGAuYm9keSgke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpfSlgLCAxKTtcbiAgICB9XG5cbiAgICBwdXNoKCcuYXNTdHJpbmcoKTsnLCAxKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgSmF2YXNjcmlwdCAmIE5vZGUuanMgdXNpbmcgQXhpb3MuXG4gKlxuICogQGF1dGhvclxuICogQHJvaGl0LWdvaHJpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCBzdHJpbmdpZnlPYmplY3QgZnJvbSAnc3RyaW5naWZ5LW9iamVjdCc7XG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCBheGlvczogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnYXhpb3MnLFxuICAgIHRpdGxlOiAnQXhpb3MnLFxuICAgIGxpbms6ICdodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnUHJvbWlzZSBiYXNlZCBIVFRQIGNsaWVudCBmb3IgdGhlIGJyb3dzZXIgYW5kIG5vZGUuanMnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBhbGxIZWFkZXJzLCBtZXRob2QsIHVybCwgcXVlcnlPYmosIHBvc3REYXRhIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBibGFuaywgcHVzaCwgam9pbiwgYWRkUG9zdFByb2Nlc3NvciB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIHB1c2goXCJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1wiKTtcbiAgICBibGFuaygpO1xuXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgfTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeU9iaikubGVuZ3RoKSB7XG4gICAgICByZXF1ZXN0T3B0aW9ucy5wYXJhbXMgPSBxdWVyeU9iajtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYWxsSGVhZGVycykubGVuZ3RoKSB7XG4gICAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gYWxsSGVhZGVycztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICBpZiAocG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgcHVzaCgnY29uc3QgZW5jb2RlZFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsnKTtcbiAgICAgICAgICBwb3N0RGF0YS5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICBwdXNoKGBlbmNvZGVkUGFyYW1zLnNldCgnJHtwYXJhbS5uYW1lfScsICcke3BhcmFtLnZhbHVlfScpO2ApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYmxhbmsoKTtcblxuICAgICAgICAgIHJlcXVlc3RPcHRpb25zLmRhdGEgPSAnZW5jb2RlZFBhcmFtcywnO1xuICAgICAgICAgIGFkZFBvc3RQcm9jZXNzb3IoY29kZSA9PiBjb2RlLnJlcGxhY2UoLydlbmNvZGVkUGFyYW1zLCcvLCAnZW5jb2RlZFBhcmFtcywnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIGlmIChwb3N0RGF0YS5qc29uT2JqKSB7XG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnMuZGF0YSA9IHBvc3REYXRhLmpzb25PYmo7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgICBpZiAoIXBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaCgnY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpOycpO1xuXG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBwdXNoKGBmb3JtLmFwcGVuZCgnJHtwYXJhbS5uYW1lfScsICcke3BhcmFtLnZhbHVlIHx8IHBhcmFtLmZpbGVOYW1lIHx8ICcnfScpO2ApO1xuICAgICAgICB9KTtcblxuICAgICAgICBibGFuaygpO1xuXG4gICAgICAgIHJlcXVlc3RPcHRpb25zLmRhdGEgPSAnW2Zvcm1dJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnMuZGF0YSA9IHBvc3REYXRhLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25TdHJpbmcgPSBzdHJpbmdpZnlPYmplY3QocmVxdWVzdE9wdGlvbnMsIHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIGlubGluZUNoYXJhY3RlckxpbWl0OiA4MCxcbiAgICB9KS5yZXBsYWNlKCdcIltmb3JtXVwiJywgJ2Zvcm0nKTtcbiAgICBwdXNoKGBjb25zdCBvcHRpb25zID0gJHtvcHRpb25TdHJpbmd9O2ApO1xuICAgIGJsYW5rKCk7XG5cbiAgICBwdXNoKCd0cnkgeycpO1xuICAgIHB1c2goJ2NvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXhpb3MucmVxdWVzdChvcHRpb25zKTsnLCAxKTtcbiAgICBwdXNoKCdjb25zb2xlLmxvZyhkYXRhKTsnLCAxKTtcbiAgICBwdXNoKCd9IGNhdGNoIChlcnJvcikgeycpO1xuICAgIHB1c2goJ2NvbnNvbGUuZXJyb3IoZXJyb3IpOycsIDEpO1xuICAgIHB1c2goJ30nKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgZmV0Y2hcbiAqXG4gKiBAYXV0aG9yXG4gKiBAcG1kcm9pZFxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgc3RyaW5naWZ5T2JqZWN0IGZyb20gJ3N0cmluZ2lmeS1vYmplY3QnO1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGdldEhlYWRlck5hbWUgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmludGVyZmFjZSBGZXRjaE9wdGlvbnMge1xuICBjcmVkZW50aWFscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsO1xufVxuXG5leHBvcnQgY29uc3QgZmV0Y2g6IENsaWVudDxGZXRjaE9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnZmV0Y2gnLFxuICAgIHRpdGxlOiAnZmV0Y2gnLFxuICAgIGxpbms6ICdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJL1VzaW5nX0ZldGNoJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BlcmZvcm0gYXN5bmNocm9ub3VzIEhUVFAgcmVxdWVzdHMgd2l0aCB0aGUgRmV0Y2ggQVBJJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSwgZnVsbFVybCB9LCBpbnB1dE9wdHMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgY3JlZGVudGlhbHM6IG51bGwsXG4gICAgICAuLi5pbnB1dE9wdHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgYmxhbmssIGpvaW4sIHB1c2ggfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgbWV0aG9kLFxuICAgIH07XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYWxsSGVhZGVycykubGVuZ3RoKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMgPSBhbGxIZWFkZXJzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmNyZWRlbnRpYWxzICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gb3B0cy5jcmVkZW50aWFscztcbiAgICB9XG5cbiAgICBwdXNoKGBjb25zdCB1cmwgPSAnJHtmdWxsVXJsfSc7YCk7XG5cbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICBvcHRpb25zLmJvZHkgPSBwb3N0RGF0YS5wYXJhbXNPYmogPyBwb3N0RGF0YS5wYXJhbXNPYmogOiBwb3N0RGF0YS50ZXh0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhLmpzb25PYmopO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgIGlmICghcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgRm9ybURhdGEgQVBJIGF1dG9tYXRpY2FsbHkgYWRkcyBhIGBDb250ZW50LVR5cGVgIGhlYWRlciBmb3IgYG11bHRpcGFydC9mb3JtLWRhdGFgIGNvbnRlbnQgYW5kIGlmIHdlIGFkZCBvdXIgb3duIGhlcmUgZGF0YSB3b24ndCBiZSBjb3JyZWN0bHkgdHJhbnNtaXR0ZWQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9ucyAtLSBXZSdyZSBvbmx5IHVzaW5nIGBjb250ZW50VHlwZUhlYWRlcmAgd2l0aGluIHRoaXMgYmxvY2suXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyID0gZ2V0SGVhZGVyTmFtZShhbGxIZWFkZXJzLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgIGlmIChjb250ZW50VHlwZUhlYWRlcikge1xuICAgICAgICAgIGRlbGV0ZSBhbGxIZWFkZXJzW2NvbnRlbnRUeXBlSGVhZGVyXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goJ2NvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTsnKTtcblxuICAgICAgICBwb3N0RGF0YS5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgcHVzaChgZm9ybS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCAnJHtwYXJhbS52YWx1ZSB8fCBwYXJhbS5maWxlTmFtZSB8fCAnJ30nKTtgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgb3B0aW9ucy5ib2R5ID0gcG9zdERhdGEudGV4dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIHVsdGltYXRlbHkgZG9uJ3QgaGF2ZSBhbnkgaGVhZGVycyB0byBzZW5kIHRoZW4gd2Ugc2hvdWxkbid0IGFkZCBhbiBlbXB0eSBvYmplY3QgaW50byB0aGUgcmVxdWVzdCBvcHRpb25zLlxuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgJiYgIU9iamVjdC5rZXlzKG9wdGlvbnMuaGVhZGVycykubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgb3B0aW9ucy5oZWFkZXJzO1xuICAgIH1cblxuICAgIHB1c2goXG4gICAgICBgY29uc3Qgb3B0aW9ucyA9ICR7c3RyaW5naWZ5T2JqZWN0KG9wdGlvbnMsIHtcbiAgICAgICAgaW5kZW50OiBvcHRzLmluZGVudCxcbiAgICAgICAgaW5saW5lQ2hhcmFjdGVyTGltaXQ6IDgwLFxuICAgICAgICB0cmFuc2Zvcm06IChfLCBwcm9wZXJ0eSwgb3JpZ2luYWxSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocHJvcGVydHkgPT09ICdib2R5JyAmJiBwb3N0RGF0YS5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBgbmV3IFVSTFNlYXJjaFBhcmFtcygke29yaWdpbmFsUmVzdWx0fSlgO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KX07YCxcbiAgICApO1xuICAgIGJsYW5rKCk7XG5cbiAgICBpZiAocG9zdERhdGEucGFyYW1zICYmIHBvc3REYXRhLm1pbWVUeXBlID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpIHtcbiAgICAgIHB1c2goJ29wdGlvbnMuYm9keSA9IGZvcm07Jyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHB1c2goJ3RyeSB7Jyk7XG4gICAgcHVzaChgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO2AsIDEpO1xuICAgIHB1c2goJ2NvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7JywgMSk7XG4gICAgcHVzaCgnY29uc29sZS5sb2coZGF0YSk7JywgMSk7XG4gICAgcHVzaCgnfSBjYXRjaCAoZXJyb3IpIHsnKTtcbiAgICBwdXNoKCdjb25zb2xlLmVycm9yKGVycm9yKTsnLCAxKTtcbiAgICBwdXNoKCd9Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIG5hdGl2ZSBYTUxIdHRwUmVxdWVzdFxuICpcbiAqIEBhdXRob3JcbiAqIEBBaG1hZE5hc3NyaVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgc3RyaW5naWZ5T2JqZWN0IGZyb20gJ3N0cmluZ2lmeS1vYmplY3QnO1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGdldEhlYWRlciwgZ2V0SGVhZGVyTmFtZSwgaGFzSGVhZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QganF1ZXJ5OiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdqcXVlcnknLFxuICAgIHRpdGxlOiAnalF1ZXJ5JyxcbiAgICBsaW5rOiAnaHR0cDovL2FwaS5qcXVlcnkuY29tL2pxdWVyeS5hamF4LycsXG4gICAgZGVzY3JpcHRpb246ICdQZXJmb3JtIGFuIGFzeW5jaHJvbm91cyBIVFRQIChBamF4KSByZXF1ZXN0cyB3aXRoIGpRdWVyeScsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IGZ1bGxVcmwsIG1ldGhvZCwgYWxsSGVhZGVycywgcG9zdERhdGEgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCB7IGJsYW5rLCBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgY29uc3Qgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBhc3luYzogdHJ1ZSxcbiAgICAgIGNyb3NzRG9tYWluOiB0cnVlLFxuICAgICAgdXJsOiBmdWxsVXJsLFxuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVyczogYWxsSGVhZGVycyxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgc2V0dGluZ3MuZGF0YSA9IHBvc3REYXRhLnBhcmFtc09iaiA/IHBvc3REYXRhLnBhcmFtc09iaiA6IHBvc3REYXRhLnRleHQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgc2V0dGluZ3MucHJvY2Vzc0RhdGEgPSBmYWxzZTtcbiAgICAgICAgc2V0dGluZ3MuZGF0YSA9IHBvc3REYXRhLnRleHQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgaWYgKCFwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goJ2NvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTsnKTtcblxuICAgICAgICBwb3N0RGF0YS5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgcHVzaChgZm9ybS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCAnJHtwYXJhbS52YWx1ZSB8fCBwYXJhbS5maWxlTmFtZSB8fCAnJ30nKTtgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0dGluZ3MucHJvY2Vzc0RhdGEgPSBmYWxzZTtcbiAgICAgICAgc2V0dGluZ3MuY29udGVudFR5cGUgPSBmYWxzZTtcbiAgICAgICAgc2V0dGluZ3MubWltZVR5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc7XG4gICAgICAgIHNldHRpbmdzLmRhdGEgPSAnW2Zvcm1dJztcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGNvbnRlbnRUeXBlIGhlYWRlclxuICAgICAgICBpZiAoaGFzSGVhZGVyKGFsbEhlYWRlcnMsICdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICAgIGlmIChnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpPy5pbmNsdWRlcygnYm91bmRhcnknKSkge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyTmFtZSA9IGdldEhlYWRlck5hbWUoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHNldHRpbmdzLmhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgc2V0dGluZ3MuZGF0YSA9IHBvc3REYXRhLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdHJpbmdpZmllZFNldHRpbmdzID0gc3RyaW5naWZ5T2JqZWN0KHNldHRpbmdzLCB7IGluZGVudDogb3B0cy5pbmRlbnQgfSkucmVwbGFjZShcbiAgICAgIFwiJ1tmb3JtXSdcIixcbiAgICAgICdmb3JtJyxcbiAgICApO1xuXG4gICAgcHVzaChgY29uc3Qgc2V0dGluZ3MgPSAke3N0cmluZ2lmaWVkU2V0dGluZ3N9O2ApO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnJC5hamF4KHNldHRpbmdzKS5kb25lKGZ1bmN0aW9uIChyZXNwb25zZSkgeycpO1xuICAgIHB1c2goJ2NvbnNvbGUubG9nKHJlc3BvbnNlKTsnLCAxKTtcbiAgICBwdXNoKCd9KTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBheGlvcyB9IGZyb20gJy4vYXhpb3MvY2xpZW50JztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAnLi9mZXRjaC9jbGllbnQnO1xuaW1wb3J0IHsganF1ZXJ5IH0gZnJvbSAnLi9qcXVlcnkvY2xpZW50JztcbmltcG9ydCB7IHhociB9IGZyb20gJy4veGhyL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBqYXZhc2NyaXB0OiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdqYXZhc2NyaXB0JyxcbiAgICB0aXRsZTogJ0phdmFTY3JpcHQnLFxuICAgIGV4dG5hbWU6ICcuanMnLFxuICAgIGRlZmF1bHQ6ICd4aHInLFxuICB9LFxuXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgeGhyLFxuICAgIGF4aW9zLFxuICAgIGZldGNoLFxuICAgIGpxdWVyeSxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBuYXRpdmUgWE1MSHR0cFJlcXVlc3RcbiAqXG4gKiBAYXV0aG9yXG4gKiBAQWhtYWROYXNzcmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JTaW5nbGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBnZXRIZWFkZXIsIGdldEhlYWRlck5hbWUsIGhhc0hlYWRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBYaHJPcHRpb25zIHtcbiAgY29ycz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB4aHI6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3hocicsXG4gICAgdGl0bGU6ICdYTUxIdHRwUmVxdWVzdCcsXG4gICAgbGluazogJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdCcsXG4gICAgZGVzY3JpcHRpb246ICdXM0MgU3RhbmRhcmQgQVBJIHRoYXQgcHJvdmlkZXMgc2NyaXB0ZWQgY2xpZW50IGZ1bmN0aW9uYWxpdHknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBwb3N0RGF0YSwgYWxsSGVhZGVycywgbWV0aG9kLCBmdWxsVXJsIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgY29yczogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgYmxhbmssIHB1c2gsIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgcHVzaChcbiAgICAgICAgICBgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KCR7c3RyaW5naWZ5T2JqZWN0KHBvc3REYXRhLmpzb25PYmosIHtcbiAgICAgICAgICAgIGluZGVudDogb3B0cy5pbmRlbnQsXG4gICAgICAgICAgfSl9KTtgLFxuICAgICAgICApO1xuICAgICAgICBibGFuaygpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgIGlmICghcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKCdjb25zdCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Jyk7XG5cbiAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgIHB1c2goYGRhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgJyR7cGFyYW0udmFsdWUgfHwgcGFyYW0uZmlsZU5hbWUgfHwgJyd9Jyk7YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgY29udGVudFR5cGUgaGVhZGVyXG4gICAgICAgIGlmIChoYXNIZWFkZXIoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgICAgaWYgKGdldEhlYWRlcihhbGxIZWFkZXJzLCAnY29udGVudC10eXBlJyk/LmluY2x1ZGVzKCdib3VuZGFyeScpKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gZ2V0SGVhZGVyTmFtZShhbGxIZWFkZXJzLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgICAgICBkZWxldGUgYWxsSGVhZGVyc1toZWFkZXJOYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBibGFuaygpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcHVzaChgY29uc3QgZGF0YSA9ICR7cG9zdERhdGEudGV4dCA/IGAnJHtwb3N0RGF0YS50ZXh0fSdgIDogJ251bGwnfTtgKTtcbiAgICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBwdXNoKCdjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsnKTtcblxuICAgIGlmIChvcHRzLmNvcnMpIHtcbiAgICAgIHB1c2goJ3hoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOycpO1xuICAgIH1cblxuICAgIGJsYW5rKCk7XG4gICAgcHVzaChcInhoci5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgZnVuY3Rpb24gKCkge1wiKTtcbiAgICBwdXNoKCdpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHsnLCAxKTtcbiAgICBwdXNoKCdjb25zb2xlLmxvZyh0aGlzLnJlc3BvbnNlVGV4dCk7JywgMik7XG4gICAgcHVzaCgnfScsIDEpO1xuICAgIHB1c2goJ30pOycpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaChgeGhyLm9wZW4oJyR7bWV0aG9kfScsICcke2Z1bGxVcmx9Jyk7YCk7XG5cbiAgICBPYmplY3Qua2V5cyhhbGxIZWFkZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBwdXNoKGB4aHIuc2V0UmVxdWVzdEhlYWRlcignJHtrZXl9JywgJyR7ZXNjYXBlRm9yU2luZ2xlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9Jyk7YCk7XG4gICAgfSk7XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goJ3hoci5zZW5kKGRhdGEpOycpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBLb3RsaW4gdXNpbmcgT2tIdHRwLlxuICpcbiAqIEBhdXRob3JcbiAqIEBzZWFuZ2hheVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3Qgb2todHRwOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdva2h0dHAnLFxuICAgIHRpdGxlOiAnT2tIdHRwJyxcbiAgICBsaW5rOiAnaHR0cDovL3NxdWFyZS5naXRodWIuaW8vb2todHRwLycsXG4gICAgZGVzY3JpcHRpb246ICdBbiBIVFRQIFJlcXVlc3QgQ2xpZW50IExpYnJhcnknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBwb3N0RGF0YSwgZnVsbFVybCwgbWV0aG9kLCBhbGxIZWFkZXJzIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IHsgYmxhbmssIGpvaW4sIHB1c2ggfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBjb25zdCBtZXRob2RzID0gWydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ1BBVENIJywgJ0hFQUQnXTtcblxuICAgIGNvbnN0IG1ldGhvZHNXaXRoQm9keSA9IFsnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ1BBVENIJ107XG5cbiAgICBwdXNoKCd2YWwgY2xpZW50ID0gT2tIdHRwQ2xpZW50KCknKTtcbiAgICBibGFuaygpO1xuXG4gICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgIGlmIChwb3N0RGF0YS5ib3VuZGFyeSkge1xuICAgICAgICBwdXNoKFxuICAgICAgICAgIGB2YWwgbWVkaWFUeXBlID0gTWVkaWFUeXBlLnBhcnNlKFwiJHtwb3N0RGF0YS5taW1lVHlwZX07IGJvdW5kYXJ5PSR7cG9zdERhdGEuYm91bmRhcnl9XCIpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2goYHZhbCBtZWRpYVR5cGUgPSBNZWRpYVR5cGUucGFyc2UoXCIke3Bvc3REYXRhLm1pbWVUeXBlfVwiKWApO1xuICAgICAgfVxuICAgICAgcHVzaChgdmFsIGJvZHkgPSBSZXF1ZXN0Qm9keS5jcmVhdGUobWVkaWFUeXBlLCAke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpfSlgKTtcbiAgICB9XG5cbiAgICBwdXNoKCd2YWwgcmVxdWVzdCA9IFJlcXVlc3QuQnVpbGRlcigpJyk7XG4gICAgcHVzaChgLnVybChcIiR7ZnVsbFVybH1cIilgLCAxKTtcbiAgICBpZiAoIW1ldGhvZHMuaW5jbHVkZXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICBwdXNoKGAubWV0aG9kKFwiJHttZXRob2QudG9VcHBlckNhc2UoKX1cIiwgYm9keSlgLCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2goYC5tZXRob2QoXCIke21ldGhvZC50b1VwcGVyQ2FzZSgpfVwiLCBudWxsKWAsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWV0aG9kc1dpdGhCb2R5LmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgcHVzaChgLiR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9KGJvZHkpYCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKGAuJHttZXRob2QudG9Mb3dlckNhc2UoKX0obnVsbClgLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChgLiR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9KClgLCAxKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycywgaW5jbHVkaW5nIHRoZSBjb29raWVzXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgcHVzaChgLmFkZEhlYWRlcihcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIpYCwgMSk7XG4gICAgfSk7XG5cbiAgICBwdXNoKCcuYnVpbGQoKScsIDEpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgndmFsIHJlc3BvbnNlID0gY2xpZW50Lm5ld0NhbGwocmVxdWVzdCkuZXhlY3V0ZSgpJyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgb2todHRwIH0gZnJvbSAnLi9va2h0dHAvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGtvdGxpbjogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAna290bGluJyxcbiAgICB0aXRsZTogJ0tvdGxpbicsXG4gICAgZXh0bmFtZTogJy5rdCcsXG4gICAgZGVmYXVsdDogJ29raHR0cCcsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgb2todHRwLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIEphdmFzY3JpcHQgJiBOb2RlLmpzIHVzaW5nIEF4aW9zLlxuICpcbiAqIEBhdXRob3JcbiAqIEByb2hpdC1nb2hyaVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgc3RyaW5naWZ5T2JqZWN0IGZyb20gJ3N0cmluZ2lmeS1vYmplY3QnO1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgYXhpb3M6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2F4aW9zJyxcbiAgICB0aXRsZTogJ0F4aW9zJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Byb21pc2UgYmFzZWQgSFRUUCBjbGllbnQgZm9yIHRoZSBicm93c2VyIGFuZCBub2RlLmpzJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCB1cmwsIHF1ZXJ5T2JqLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICBjb25zdCB7IGJsYW5rLCBqb2luLCBwdXNoLCBhZGRQb3N0UHJvY2Vzc29yIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgcHVzaChcImNvbnN0IGF4aW9zID0gcmVxdWlyZSgnYXhpb3MnKS5kZWZhdWx0O1wiKTtcblxuICAgIGNvbnN0IHJlcU9wdHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgfTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeU9iaikubGVuZ3RoKSB7XG4gICAgICByZXFPcHRzLnBhcmFtcyA9IHF1ZXJ5T2JqO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhhbGxIZWFkZXJzKS5sZW5ndGgpIHtcbiAgICAgIHJlcU9wdHMuaGVhZGVycyA9IGFsbEhlYWRlcnM7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIHB1c2goXCJjb25zdCB7IFVSTFNlYXJjaFBhcmFtcyB9ID0gcmVxdWlyZSgndXJsJyk7XCIpO1xuICAgICAgICAgIGJsYW5rKCk7XG5cbiAgICAgICAgICBwdXNoKCdjb25zdCBlbmNvZGVkUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOycpO1xuICAgICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgIHB1c2goYGVuY29kZWRQYXJhbXMuc2V0KCcke3BhcmFtLm5hbWV9JywgJyR7cGFyYW0udmFsdWV9Jyk7YCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBibGFuaygpO1xuXG4gICAgICAgICAgcmVxT3B0cy5kYXRhID0gJ2VuY29kZWRQYXJhbXMsJztcbiAgICAgICAgICBhZGRQb3N0UHJvY2Vzc29yKGNvZGUgPT4gY29kZS5yZXBsYWNlKC8nZW5jb2RlZFBhcmFtcywnLywgJ2VuY29kZWRQYXJhbXMsJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBibGFuaygpO1xuICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgIHJlcU9wdHMuZGF0YSA9IHBvc3REYXRhLmpzb25PYmo7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcmVxT3B0cy5kYXRhID0gcG9zdERhdGEudGV4dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0cmluZ2lmaWVkT3B0aW9ucyA9IHN0cmluZ2lmeU9iamVjdChyZXFPcHRzLCB7IGluZGVudDogJyAgJywgaW5saW5lQ2hhcmFjdGVyTGltaXQ6IDgwIH0pO1xuICAgIHB1c2goYGNvbnN0IG9wdGlvbnMgPSAke3N0cmluZ2lmaWVkT3B0aW9uc307YCk7XG4gICAgYmxhbmsoKTtcblxuICAgIHB1c2goJ3RyeSB7Jyk7XG4gICAgcHVzaCgnY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBheGlvcy5yZXF1ZXN0KG9wdGlvbnMpOycsIDEpO1xuICAgIHB1c2goJ2NvbnNvbGUubG9nKGRhdGEpOycsIDEpO1xuICAgIHB1c2goJ30gY2F0Y2ggKGVycm9yKSB7Jyk7XG4gICAgcHVzaCgnY29uc29sZS5lcnJvcihlcnJvcik7JywgMSk7XG4gICAgcHVzaCgnfScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBOb2RlLmpzIHVzaW5nIG5vZGUtZmV0Y2guXG4gKlxuICogQGF1dGhvclxuICogQGhpcmVub2JsZVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgc3RyaW5naWZ5T2JqZWN0IGZyb20gJ3N0cmluZ2lmeS1vYmplY3QnO1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGdldEhlYWRlck5hbWUgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCBmZXRjaDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnZmV0Y2gnLFxuICAgIHRpdGxlOiAnRmV0Y2gnLFxuICAgIGxpbms6ICdodHRwczovL2dpdGh1Yi5jb20vYml0aW5uL25vZGUtZmV0Y2gnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2ltcGxpZmllZCBIVFRQIG5vZGUtZmV0Y2ggY2xpZW50JyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBmdWxsVXJsLCBwb3N0RGF0YSwgaGVhZGVyc09iaiwgY29va2llcyB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGxldCBpbmNsdWRlRlMgPSBmYWxzZTtcbiAgICBjb25zdCB7IGJsYW5rLCBwdXNoLCBqb2luLCB1bnNoaWZ0IH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgcHVzaChcImNvbnN0IGZldGNoID0gcmVxdWlyZSgnbm9kZS1mZXRjaCcpO1wiKTtcbiAgICBibGFuaygpO1xuXG4gICAgY29uc3QgcmVxT3B0czogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICB9O1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGhlYWRlcnNPYmopLmxlbmd0aCkge1xuICAgICAgcmVxT3B0cy5oZWFkZXJzID0gaGVhZGVyc09iajtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICB1bnNoaWZ0KFwiY29uc3QgeyBVUkxTZWFyY2hQYXJhbXMgfSA9IHJlcXVpcmUoJ3VybCcpO1wiKTtcbiAgICAgICAgcHVzaCgnY29uc3QgZW5jb2RlZFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsnKTtcbiAgICAgICAgcG9zdERhdGEucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBwdXNoKGBlbmNvZGVkUGFyYW1zLnNldCgnJHtwYXJhbS5uYW1lfScsICcke3BhcmFtLnZhbHVlfScpO2ApO1xuICAgICAgICB9KTtcbiAgICAgICAgYmxhbmsoKTtcblxuICAgICAgICByZXFPcHRzLmJvZHkgPSAnZW5jb2RlZFBhcmFtcyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgICAgICByZXFPcHRzLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwb3N0RGF0YS5qc29uT2JqKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgIGlmICghcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgYGZvcm0tZGF0YWAgbW9kdWxlIGF1dG9tYXRpY2FsbHkgYWRkcyBhIGBDb250ZW50LVR5cGVgIGhlYWRlciBmb3IgYG11bHRpcGFydC9mb3JtLWRhdGFgIGNvbnRlbnQgYW5kIGlmIHdlIGFkZCBvdXIgb3duIGhlcmUgZGF0YSB3b24ndCBiZSBjb3JyZWN0bHkgdHJhbnNtaXR0ZWQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9ucyAtLSBXZSdyZSBvbmx5IHVzaW5nIGBjb250ZW50VHlwZUhlYWRlcmAgd2l0aGluIHRoaXMgYmxvY2suXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyID0gZ2V0SGVhZGVyTmFtZShoZWFkZXJzT2JqLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgIGlmIChjb250ZW50VHlwZUhlYWRlcikge1xuICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzT2JqW2NvbnRlbnRUeXBlSGVhZGVyXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2hpZnQoXCJjb25zdCBGb3JtRGF0YSA9IHJlcXVpcmUoJ2Zvcm0tZGF0YScpO1wiKTtcbiAgICAgICAgcHVzaCgnY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsnKTtcbiAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgIGlmICghcGFyYW0uZmlsZU5hbWUgJiYgIXBhcmFtLmZpbGVOYW1lICYmICFwYXJhbS5jb250ZW50VHlwZSkge1xuICAgICAgICAgICAgcHVzaChgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgJyR7cGFyYW0udmFsdWV9Jyk7YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcmFtLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICBpbmNsdWRlRlMgPSB0cnVlO1xuICAgICAgICAgICAgcHVzaChgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgZnMuY3JlYXRlUmVhZFN0cmVhbSgnJHtwYXJhbS5maWxlTmFtZX0nKSk7YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcmVxT3B0cy5ib2R5ID0gcG9zdERhdGEudGV4dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBjb29raWVzIGFyZ3VtZW50XG4gICAgaWYgKGNvb2tpZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjb29raWVzU3RyaW5nID0gY29va2llc1xuICAgICAgICAubWFwKGNvb2tpZSA9PiBgJHtlbmNvZGVVUklDb21wb25lbnQoY29va2llLm5hbWUpfT0ke2VuY29kZVVSSUNvbXBvbmVudChjb29raWUudmFsdWUpfWApXG4gICAgICAgIC5qb2luKCc7ICcpO1xuICAgICAgaWYgKHJlcU9wdHMuaGVhZGVycykge1xuICAgICAgICByZXFPcHRzLmhlYWRlcnMuY29va2llID0gY29va2llc1N0cmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcU9wdHMuaGVhZGVycyA9IHt9O1xuICAgICAgICByZXFPcHRzLmhlYWRlcnMuY29va2llID0gY29va2llc1N0cmluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGBjb25zdCB1cmwgPSAnJHtmdWxsVXJsfSc7YCk7XG5cbiAgICAvLyBJZiB3ZSB1bHRpbWF0ZWx5IGRvbid0IGhhdmUgYW55IGhlYWRlcnMgdG8gc2VuZCB0aGVuIHdlIHNob3VsZG4ndCBhZGQgYW4gZW1wdHkgb2JqZWN0IGludG8gdGhlIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICBpZiAocmVxT3B0cy5oZWFkZXJzICYmICFPYmplY3Qua2V5cyhyZXFPcHRzLmhlYWRlcnMpLmxlbmd0aCkge1xuICAgICAgZGVsZXRlIHJlcU9wdHMuaGVhZGVycztcbiAgICB9XG5cbiAgICBjb25zdCBzdHJpbmdpZmllZE9wdGlvbnMgPSBzdHJpbmdpZnlPYmplY3QocmVxT3B0cywgeyBpbmRlbnQ6ICcgICcsIGlubGluZUNoYXJhY3RlckxpbWl0OiA4MCB9KTtcbiAgICBwdXNoKGBjb25zdCBvcHRpb25zID0gJHtzdHJpbmdpZmllZE9wdGlvbnN9O2ApO1xuXG4gICAgaWYgKGluY2x1ZGVGUykge1xuICAgICAgdW5zaGlmdChcImNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcIik7XG4gICAgfVxuICAgIGlmIChwb3N0RGF0YS5wYXJhbXMgJiYgcG9zdERhdGEubWltZVR5cGUgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJykge1xuICAgICAgcHVzaCgnb3B0aW9ucy5ib2R5ID0gZm9ybURhdGE7Jyk7XG4gICAgfVxuICAgIGJsYW5rKCk7XG5cbiAgICBwdXNoKCd0cnkgeycpO1xuICAgIHB1c2goYGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtgLCAxKTtcbiAgICBwdXNoKCdjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOycsIDEpO1xuICAgIHB1c2goJ2NvbnNvbGUubG9nKGRhdGEpOycsIDEpO1xuICAgIHB1c2goJ30gY2F0Y2ggKGVycm9yKSB7Jyk7XG4gICAgcHVzaCgnY29uc29sZS5lcnJvcihlcnJvcik7JywgMSk7XG4gICAgcHVzaCgnfScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKVxuICAgICAgLnJlcGxhY2UoLydlbmNvZGVkUGFyYW1zJy8sICdlbmNvZGVkUGFyYW1zJylcbiAgICAgIC5yZXBsYWNlKC9cImZzXFwuY3JlYXRlUmVhZFN0cmVhbVxcKFxcXFxcIiguKylcXFxcXCJcXClcIi8sICdmcy5jcmVhdGVSZWFkU3RyZWFtKFwiJDFcIiknKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBuYXRpdmUgTm9kZS5qcy5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAQWhtYWROYXNzcmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBOb2RlTmF0aXZlT3B0aW9ucyB7XG4gIGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBuYXRpdmU6IENsaWVudDxOb2RlTmF0aXZlT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICduYXRpdmUnLFxuICAgIHRpdGxlOiAnSFRUUCcsXG4gICAgbGluazogJ2h0dHA6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9odHRwX3JlcXVlc3Rfb3B0aW9uc19jYWxsYmFjaycsXG4gICAgZGVzY3JpcHRpb246ICdOb2RlLmpzIG5hdGl2ZSBIVFRQIGludGVyZmFjZScsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IHVyaU9iaiwgbWV0aG9kLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGluZGVudCA9ICcgICcsIGluc2VjdXJlU2tpcFZlcmlmeSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgYmxhbmssIGpvaW4sIHB1c2gsIHVuc2hpZnQgfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudCB9KTtcblxuICAgIGNvbnN0IHJlcU9wdHMgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBob3N0bmFtZTogdXJpT2JqLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdXJpT2JqLnBvcnQsXG4gICAgICBwYXRoOiB1cmlPYmoucGF0aCxcbiAgICAgIGhlYWRlcnM6IGFsbEhlYWRlcnMsXG4gICAgICAuLi4oaW5zZWN1cmVTa2lwVmVyaWZ5ID8geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH0gOiB7fSksXG4gICAgfTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBzZWVtcyBsaWtlIGEgbGVnaXQgZXJyb3JcbiAgICBwdXNoKGBjb25zdCBodHRwID0gcmVxdWlyZSgnJHt1cmlPYmoucHJvdG9jb2wucmVwbGFjZSgnOicsICcnKX0nKTtgKTtcblxuICAgIGJsYW5rKCk7XG4gICAgcHVzaChgY29uc3Qgb3B0aW9ucyA9ICR7c3RyaW5naWZ5T2JqZWN0KHJlcU9wdHMsIHsgaW5kZW50IH0pfTtgKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ2NvbnN0IHJlcSA9IGh0dHAucmVxdWVzdChvcHRpb25zLCBmdW5jdGlvbiAocmVzKSB7Jyk7XG4gICAgcHVzaCgnY29uc3QgY2h1bmtzID0gW107JywgMSk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKFwicmVzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XCIsIDEpO1xuICAgIHB1c2goJ2NodW5rcy5wdXNoKGNodW5rKTsnLCAyKTtcbiAgICBwdXNoKCd9KTsnLCAxKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goXCJyZXMub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcIiwgMSk7XG4gICAgcHVzaCgnY29uc3QgYm9keSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKTsnLCAyKTtcbiAgICBwdXNoKCdjb25zb2xlLmxvZyhib2R5LnRvU3RyaW5nKCkpOycsIDIpO1xuICAgIHB1c2goJ30pOycsIDEpO1xuICAgIHB1c2goJ30pOycpO1xuICAgIGJsYW5rKCk7XG5cbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICBpZiAocG9zdERhdGEucGFyYW1zT2JqKSB7XG4gICAgICAgICAgdW5zaGlmdChcImNvbnN0IHFzID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcIik7XG4gICAgICAgICAgcHVzaChcbiAgICAgICAgICAgIGByZXEud3JpdGUocXMuc3RyaW5naWZ5KCR7c3RyaW5naWZ5T2JqZWN0KHBvc3REYXRhLnBhcmFtc09iaiwge1xuICAgICAgICAgICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAgICAgICAgIGlubGluZUNoYXJhY3RlckxpbWl0OiA4MCxcbiAgICAgICAgICAgIH0pfSkpO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIGlmIChwb3N0RGF0YS5qc29uT2JqKSB7XG4gICAgICAgICAgcHVzaChcbiAgICAgICAgICAgIGByZXEud3JpdGUoSlNPTi5zdHJpbmdpZnkoJHtzdHJpbmdpZnlPYmplY3QocG9zdERhdGEuanNvbk9iaiwge1xuICAgICAgICAgICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAgICAgICAgIGlubGluZUNoYXJhY3RlckxpbWl0OiA4MCxcbiAgICAgICAgICAgIH0pfSkpO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgICBwdXNoKGByZXEud3JpdGUoJHtzdHJpbmdpZnlPYmplY3QocG9zdERhdGEudGV4dCwgeyBpbmRlbnQgfSl9KTtgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goJ3JlcS5lbmQoKTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgTm9kZS5qcyB1c2luZyBSZXF1ZXN0LlxuICpcbiAqIEBhdXRob3JcbiAqIEBBaG1hZE5hc3NyaVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgc3RyaW5naWZ5T2JqZWN0IGZyb20gJ3N0cmluZ2lmeS1vYmplY3QnO1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgcmVxdWVzdDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncmVxdWVzdCcsXG4gICAgdGl0bGU6ICdSZXF1ZXN0JyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3QvcmVxdWVzdCcsXG4gICAgZGVzY3JpcHRpb246ICdTaW1wbGlmaWVkIEhUVFAgcmVxdWVzdCBjbGllbnQnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBtZXRob2QsIHVybCwgcXVlcnlPYmosIHBvc3REYXRhLCBoZWFkZXJzT2JqLCBjb29raWVzIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgbGV0IGluY2x1ZGVGUyA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4sIHVuc2hpZnQgfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBwdXNoKFwiY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoJ3JlcXVlc3QnKTtcIik7XG4gICAgYmxhbmsoKTtcblxuICAgIGNvbnN0IHJlcU9wdHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgfTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeU9iaikubGVuZ3RoKSB7XG4gICAgICByZXFPcHRzLnFzID0gcXVlcnlPYmo7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGhlYWRlcnNPYmopLmxlbmd0aCkge1xuICAgICAgcmVxT3B0cy5oZWFkZXJzID0gaGVhZGVyc09iajtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICByZXFPcHRzLmZvcm0gPSBwb3N0RGF0YS5wYXJhbXNPYmo7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgICAgICByZXFPcHRzLmJvZHkgPSBwb3N0RGF0YS5qc29uT2JqO1xuICAgICAgICAgIHJlcU9wdHMuanNvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgICBpZiAoIXBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxT3B0cy5mb3JtRGF0YSA9IHt9O1xuXG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBpZiAoIXBhcmFtLmZpbGVOYW1lICYmICFwYXJhbS5maWxlTmFtZSAmJiAhcGFyYW0uY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgIHJlcU9wdHMuZm9ybURhdGFbcGFyYW0ubmFtZV0gPSBwYXJhbS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgYXR0YWNobWVudDoge1xuICAgICAgICAgICAgdmFsdWU/OiBzdHJpbmc7XG4gICAgICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgICAgaWYgKHBhcmFtLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICBpbmNsdWRlRlMgPSB0cnVlO1xuICAgICAgICAgICAgYXR0YWNobWVudCA9IHtcbiAgICAgICAgICAgICAgdmFsdWU6IGBmcy5jcmVhdGVSZWFkU3RyZWFtKCR7cGFyYW0uZmlsZU5hbWV9KWAsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFyYW0uZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHBhcmFtLmNvbnRlbnRUeXBlID8gcGFyYW0uY29udGVudFR5cGUgOiBudWxsLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICBhdHRhY2htZW50LnZhbHVlID0gcGFyYW0udmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVxT3B0cy5mb3JtRGF0YVtwYXJhbS5uYW1lXSA9IGF0dGFjaG1lbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgICByZXFPcHRzLmJvZHkgPSBwb3N0RGF0YS50ZXh0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGNvb2tpZXMgYXJndW1lbnRcbiAgICBpZiAoY29va2llcy5sZW5ndGgpIHtcbiAgICAgIHJlcU9wdHMuamFyID0gJ0pBUic7XG5cbiAgICAgIHB1c2goJ2NvbnN0IGphciA9IHJlcXVlc3QuamFyKCk7Jyk7XG5cbiAgICAgIGNvb2tpZXMuZm9yRWFjaChjb29raWUgPT4ge1xuICAgICAgICBwdXNoKFxuICAgICAgICAgIGBqYXIuc2V0Q29va2llKHJlcXVlc3QuY29va2llKCcke2VuY29kZVVSSUNvbXBvbmVudChjb29raWUubmFtZSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgICAgY29va2llLnZhbHVlLFxuICAgICAgICAgICl9JyksICcke3VybH0nKTtgLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIGlmIChpbmNsdWRlRlMpIHtcbiAgICAgIHVuc2hpZnQoXCJjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XCIpO1xuICAgIH1cblxuICAgIHB1c2goXG4gICAgICBgY29uc3Qgb3B0aW9ucyA9ICR7c3RyaW5naWZ5T2JqZWN0KHJlcU9wdHMsIHsgaW5kZW50OiAnICAnLCBpbmxpbmVDaGFyYWN0ZXJMaW1pdDogODAgfSl9O2AsXG4gICAgKTtcbiAgICBibGFuaygpO1xuXG4gICAgcHVzaCgncmVxdWVzdChvcHRpb25zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlLCBib2R5KSB7Jyk7XG4gICAgcHVzaCgnaWYgKGVycm9yKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpOycsIDEpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnY29uc29sZS5sb2coYm9keSk7JywgMSk7XG4gICAgcHVzaCgnfSk7Jyk7XG5cbiAgICByZXR1cm4gam9pbigpXG4gICAgICAucmVwbGFjZShcIidKQVInXCIsICdqYXInKVxuICAgICAgLnJlcGxhY2UoLydmc1xcLmNyZWF0ZVJlYWRTdHJlYW1cXCgoLiopXFwpJy8sIFwiZnMuY3JlYXRlUmVhZFN0cmVhbSgnJDEnKVwiKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IGF4aW9zIH0gZnJvbSAnLi9heGlvcy9jbGllbnQnO1xuaW1wb3J0IHsgZmV0Y2ggfSBmcm9tICcuL2ZldGNoL2NsaWVudCc7XG5pbXBvcnQgeyBuYXRpdmUgfSBmcm9tICcuL25hdGl2ZS9jbGllbnQnO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdC9jbGllbnQnO1xuaW1wb3J0IHsgdW5pcmVzdCB9IGZyb20gJy4vdW5pcmVzdC9jbGllbnQnO1xuXG5leHBvcnQgY29uc3Qgbm9kZTogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnbm9kZScsXG4gICAgdGl0bGU6ICdOb2RlLmpzJyxcbiAgICBleHRuYW1lOiAnLmpzJyxcbiAgICBkZWZhdWx0OiAnbmF0aXZlJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBuYXRpdmUsXG4gICAgcmVxdWVzdCxcbiAgICB1bmlyZXN0LFxuICAgIGF4aW9zLFxuICAgIGZldGNoLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIE5vZGUuanMgdXNpbmcgVW5pcmVzdC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAQWhtYWROYXNzcmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IHVuaXJlc3Q6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3VuaXJlc3QnLFxuICAgIHRpdGxlOiAnVW5pcmVzdCcsXG4gICAgbGluazogJ2h0dHA6Ly91bmlyZXN0LmlvL25vZGVqcy5odG1sJyxcbiAgICBkZXNjcmlwdGlvbjogJ0xpZ2h0d2VpZ2h0IEhUVFAgUmVxdWVzdCBDbGllbnQgTGlicmFyeScsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IG1ldGhvZCwgdXJsLCBjb29raWVzLCBxdWVyeU9iaiwgcG9zdERhdGEsIGhlYWRlcnNPYmogfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBsZXQgaW5jbHVkZUZTID0gZmFsc2U7XG4gICAgY29uc3QgeyBhZGRQb3N0UHJvY2Vzc29yLCBibGFuaywgam9pbiwgcHVzaCwgdW5zaGlmdCB9ID0gbmV3IENvZGVCdWlsZGVyKHtcbiAgICAgIGluZGVudDogb3B0cy5pbmRlbnQsXG4gICAgfSk7XG5cbiAgICBwdXNoKFwiY29uc3QgdW5pcmVzdCA9IHJlcXVpcmUoJ3VuaXJlc3QnKTtcIik7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKGBjb25zdCByZXEgPSB1bmlyZXN0KCcke21ldGhvZH0nLCAnJHt1cmx9Jyk7YCk7XG4gICAgYmxhbmsoKTtcblxuICAgIGlmIChjb29raWVzLmxlbmd0aCkge1xuICAgICAgcHVzaCgnY29uc3QgQ29va2llSmFyID0gdW5pcmVzdC5qYXIoKTsnKTtcblxuICAgICAgY29va2llcy5mb3JFYWNoKGNvb2tpZSA9PiB7XG4gICAgICAgIHB1c2goXG4gICAgICAgICAgYENvb2tpZUphci5hZGQoJyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5uYW1lKX09JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICAgICAgICBjb29raWUudmFsdWUsXG4gICAgICAgICAgKX0nLCAnJHt1cmx9Jyk7YCxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBwdXNoKCdyZXEuamFyKENvb2tpZUphcik7Jyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeU9iaikubGVuZ3RoKSB7XG4gICAgICBwdXNoKGByZXEucXVlcnkoJHtzdHJpbmdpZnlPYmplY3QocXVlcnlPYmosIHsgaW5kZW50OiBvcHRzLmluZGVudCB9KX0pO2ApO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVyc09iaikubGVuZ3RoKSB7XG4gICAgICBwdXNoKGByZXEuaGVhZGVycygke3N0cmluZ2lmeU9iamVjdChoZWFkZXJzT2JqLCB7IGluZGVudDogb3B0cy5pbmRlbnQgfSl9KTtgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtc09iaikge1xuICAgICAgICAgIHB1c2goYHJlcS5mb3JtKCR7c3RyaW5naWZ5T2JqZWN0KHBvc3REYXRhLnBhcmFtc09iaiwgeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pfSk7YCk7XG4gICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIGlmIChwb3N0RGF0YS5qc29uT2JqKSB7XG4gICAgICAgICAgcHVzaChcInJlcS50eXBlKCdqc29uJyk7XCIpO1xuICAgICAgICAgIHB1c2goYHJlcS5zZW5kKCR7c3RyaW5naWZ5T2JqZWN0KHBvc3REYXRhLmpzb25PYmosIHsgaW5kZW50OiBvcHRzLmluZGVudCB9KX0pO2ApO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOiB7XG4gICAgICAgIGlmICghcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtdWx0aXBhcnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXSA9IFtdO1xuXG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJ0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAgICAgICBpZiAocGFyYW0uZmlsZU5hbWUgJiYgIXBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICBpbmNsdWRlRlMgPSB0cnVlO1xuXG4gICAgICAgICAgICBwYXJ0LmJvZHkgPSBgZnMuY3JlYXRlUmVhZFN0cmVhbSgnJHtwYXJhbS5maWxlTmFtZX0nKWA7XG4gICAgICAgICAgICBhZGRQb3N0UHJvY2Vzc29yKGNvZGUgPT5cbiAgICAgICAgICAgICAgY29kZS5yZXBsYWNlKC8nZnNcXC5jcmVhdGVSZWFkU3RyZWFtXFwoXFxcXCcoLispXFxcXCdcXCknLywgXCJmcy5jcmVhdGVSZWFkU3RyZWFtKCckMScpXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICBwYXJ0LmJvZHkgPSBwYXJhbS52YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocGFydC5ib2R5KSB7XG4gICAgICAgICAgICBpZiAocGFyYW0uY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgcGFydFsnY29udGVudC10eXBlJ10gPSBwYXJhbS5jb250ZW50VHlwZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXVsdGlwYXJ0LnB1c2gocGFydCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBwdXNoKGByZXEubXVsdGlwYXJ0KCR7c3RyaW5naWZ5T2JqZWN0KG11bHRpcGFydCwgeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pfSk7YCk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIHB1c2goYHJlcS5zZW5kKCR7c3RyaW5naWZ5T2JqZWN0KHBvc3REYXRhLnRleHQsIHsgaW5kZW50OiBvcHRzLmluZGVudCB9KX0pO2ApO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZUZTKSB7XG4gICAgICB1bnNoaWZ0KFwiY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1wiKTtcbiAgICB9XG5cbiAgICBwdXNoKCdyZXEuZW5kKGZ1bmN0aW9uIChyZXMpIHsnKTtcbiAgICBwdXNoKCdpZiAocmVzLmVycm9yKSB0aHJvdyBuZXcgRXJyb3IocmVzLmVycm9yKTsnLCAxKTtcbiAgICBibGFuaygpO1xuXG4gICAgcHVzaCgnY29uc29sZS5sb2cocmVzLmJvZHkpOycsIDEpO1xuICAgIHB1c2goJ30pOycpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIENyZWF0ZSBhIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIGEgdmFsaWQgZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIG9mIGFuIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBuc0NsYXNzIENsYXNzIG9mIHRoZSBsaXR0ZXJhbFxuICogQHBhcmFtIG5hbWUgRGVzaXJlZCBuYW1lIG9mIHRoZSBpbnN0YW5jZVxuICogQHBhcmFtIHBhcmFtZXRlcnMgS2V5LXZhbHVlIG9iamVjdCBvZiBwYXJhbWV0ZXJzIHRvIHRyYW5zbGF0ZSB0byBhbiBPYmplY3RpdmUtQyBvYmplY3QgbGl0ZWFyYWxcbiAqIEBwYXJhbSBpbmRlbnQgSWYgdHJ1ZSwgd2lsbCBkZWNsYXJlIHRoZSBsaXR0ZXJhbCBieSBpbmRlbnRpbmcgZWFjaCBuZXcga2V5L3ZhbHVlIHBhaXIuXG4gKiBAcmV0dXJuIEEgdmFsaWQgT2JqZWN0aXZlLUMgZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIG9mIGFuIE9iamVjdGl2ZS1DIG9iamVjdCBsaXR0ZXJhbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBuc0RlY2xhcmF0aW9uKCdOU0RpY3Rpb25hcnknLCAncGFyYW1zJywge2E6ICdiJywgYzogJ2QnfSwgdHJ1ZSlcbiAqICAgLy8gcmV0dXJuczpcbiAqICAgTlNEaWN0aW9uYXJ5ICpwYXJhbXMgPSBAeyBAXCJhXCI6IEBcImJcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAXCJjXCI6IEBcImRcIiB9O1xuICpcbiAqICAgbnNEZWNsYXJhdGlvbignTlNEaWN0aW9uYXJ5JywgJ3BhcmFtcycsIHthOiAnYicsIGM6ICdkJ30pXG4gKiAgIC8vIHJldHVybnM6XG4gKiAgIE5TRGljdGlvbmFyeSAqcGFyYW1zID0gQHsgQFwiYVwiOiBAXCJiXCIsIEBcImNcIjogQFwiZFwiIH07XG4gKi9cbmV4cG9ydCBjb25zdCBuc0RlY2xhcmF0aW9uID0gKFxuICBuc0NsYXNzOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgaW5kZW50PzogYm9vbGVhbixcbikgPT4ge1xuICBjb25zdCBvcGVuaW5nID0gYCR7bnNDbGFzc30gKiR7bmFtZX0gPSBgO1xuICBjb25zdCBsaXRlcmFsID0gbGl0ZXJhbFJlcHJlc2VudGF0aW9uKHBhcmFtZXRlcnMsIGluZGVudCA/IG9wZW5pbmcubGVuZ3RoIDogdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGAke29wZW5pbmd9JHtsaXRlcmFsfTtgO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSB2YWxpZCBPYmplY3RpdmUtQyBzdHJpbmcgb2YgYSBsaXRlcmFsIHZhbHVlIGFjY29yZGluZyB0byBpdHMgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgQW55IEphdmFTY3JpcHQgbGl0ZXJhbFxuICovXG5leHBvcnQgY29uc3QgbGl0ZXJhbFJlcHJlc2VudGF0aW9uID0gKHZhbHVlOiBhbnksIGluZGVudGF0aW9uPzogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgam9pbiA9IGluZGVudGF0aW9uID09PSB1bmRlZmluZWQgPyAnLCAnIDogYCxcXG4gICAkeycgJy5yZXBlYXQoaW5kZW50YXRpb24pfWA7XG5cbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpKSB7XG4gICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIHJldHVybiBgQCR7dmFsdWV9YDtcblxuICAgIGNhc2UgJ1tvYmplY3QgQXJyYXldJzoge1xuICAgICAgY29uc3QgdmFsdWVzUmVwcmVzZW50YXRpb24gPSB2YWx1ZS5tYXAoKHZhbHVlOiBhbnkpID0+IGxpdGVyYWxSZXByZXNlbnRhdGlvbih2YWx1ZSkpO1xuICAgICAgcmV0dXJuIGBAWyAke3ZhbHVlc1JlcHJlc2VudGF0aW9uLmpvaW4oam9pbil9IF1gO1xuICAgIH1cblxuICAgIGNhc2UgJ1tvYmplY3QgT2JqZWN0XSc6IHtcbiAgICAgIGNvbnN0IGtleVZhbHVlUGFpcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGtleVZhbHVlUGFpcnMucHVzaChgQFwiJHtrZXl9XCI6ICR7bGl0ZXJhbFJlcHJlc2VudGF0aW9uKHZhbHVlW2tleV0pfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBAeyAke2tleVZhbHVlUGFpcnMuam9pbihqb2luKX0gfWA7XG4gICAgfVxuXG4gICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG4gICAgICByZXR1cm4gdmFsdWUgPyAnQFlFUycgOiAnQE5PJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYEBcIiR7dmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyl9XCJgO1xuICB9XG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgT2JqZWN0aXZlLUMgdXNpbmcgTlNVUkxTZXNzaW9uLlxuICpcbiAqIEBhdXRob3JcbiAqIEB0aGliYXVsdENoYVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbnNEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5zdXJsc2Vzc2lvbk9wdGlvbnMge1xuICBwcmV0dHk/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgbnN1cmxzZXNzaW9uOiBDbGllbnQ8TnN1cmxzZXNzaW9uT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICduc3VybHNlc3Npb24nLFxuICAgIHRpdGxlOiAnTlNVUkxTZXNzaW9uJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjL2RvY3VtZW50YXRpb24vRm91bmRhdGlvbi9SZWZlcmVuY2UvTlNVUkxTZXNzaW9uX2NsYXNzL2luZGV4Lmh0bWwnLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZvdW5kYXRpb24ncyBOU1VSTFNlc3Npb24gcmVxdWVzdFwiLFxuICB9LFxuICBjb252ZXJ0OiAoeyBhbGxIZWFkZXJzLCBwb3N0RGF0YSwgbWV0aG9kLCBmdWxsVXJsIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAgICcsXG4gICAgICBwcmV0dHk6IHRydWUsXG4gICAgICB0aW1lb3V0OiAxMCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgcHVzaCwgam9pbiwgYmxhbmsgfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG4gICAgLy8gTWFya2VycyBmb3IgaGVhZGVycyB0byBiZSBjcmVhdGVkIGFzIGxpdGVyYWwgb2JqZWN0cyBhbmQgbGF0ZXIgYmUgc2V0IG9uIHRoZSBOU1VSTFJlcXVlc3QgaWYgZXhpc3RcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBoYXNIZWFkZXJzOiBmYWxzZSxcbiAgICAgIGhhc0JvZHk6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBXZSBqdXN0IHdhbnQgdG8gbWFrZSBzdXJlIHBlb3BsZSB1bmRlcnN0YW5kIHRoYXQgaXMgdGhlIG9ubHkgZGVwZW5kZW5jeVxuICAgIHB1c2goJyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPicpO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmxlbmd0aCkge1xuICAgICAgcmVxLmhhc0hlYWRlcnMgPSB0cnVlO1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2gobnNEZWNsYXJhdGlvbignTlNEaWN0aW9uYXJ5JywgJ2hlYWRlcnMnLCBhbGxIZWFkZXJzLCBvcHRzLnByZXR0eSkpO1xuICAgIH1cblxuICAgIGlmIChwb3N0RGF0YS50ZXh0IHx8IHBvc3REYXRhLmpzb25PYmogfHwgcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICByZXEuaGFzQm9keSA9IHRydWU7XG5cbiAgICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgICBpZiAocG9zdERhdGEucGFyYW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEJ5IGFwcGVuZGluZyBwYXJhbWV0ZXJzIG9uZSBieSBvbmUgaW4gdGhlIHJlc3VsdGluZyBzbmlwcGV0LFxuICAgICAgICAgICAgLy8gd2UgbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSB1c2VyIHRvIGVkaXQgaXQgYWNjb3JkaW5nIHRvIGhpcyBvciBoZXIgbmVlZHMgYWZ0ZXIgcGFzdGluZy5cbiAgICAgICAgICAgIC8vIFRoZSB1c2VyIGNhbiBqdXN0IGFkZC9yZW1vdmUgbGluZXMgYWRkaW5nL3JlbW92aW5nIGJvZHkgcGFyYW1ldGVycy5cbiAgICAgICAgICAgIGJsYW5rKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IFtoZWFkLCAuLi50YWlsXSA9IHBvc3REYXRhLnBhcmFtcztcbiAgICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAgIGBOU011dGFibGVEYXRhICpwb3N0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhEYXRhOltAXCIke2hlYWQubmFtZX09JHtoZWFkLnZhbHVlfVwiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXV07YCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRhaWwuZm9yRWFjaCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAgICAgYFtwb3N0RGF0YSBhcHBlbmREYXRhOltAXCImJHtuYW1lfT0ke3ZhbHVlfVwiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXV07YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXEuaGFzQm9keSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgICAgcHVzaChuc0RlY2xhcmF0aW9uKCdOU0RpY3Rpb25hcnknLCAncGFyYW1ldGVycycsIHBvc3REYXRhLmpzb25PYmosIG9wdHMucHJldHR5KSk7XG4gICAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgICAgcHVzaChcbiAgICAgICAgICAgICAgJ05TRGF0YSAqcG9zdERhdGEgPSBbTlNKU09OU2VyaWFsaXphdGlvbiBkYXRhV2l0aEpTT05PYmplY3Q6cGFyYW1ldGVycyBvcHRpb25zOjAgZXJyb3I6bmlsXTsnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgICAgLy8gQnkgYXBwZW5kaW5nIG11bHRpcGFydCBwYXJhbWV0ZXJzIG9uZSBieSBvbmUgaW4gdGhlIHJlc3VsdGluZyBzbmlwcGV0LFxuICAgICAgICAgIC8vIHdlIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgdXNlciB0byBlZGl0IGl0IGFjY29yZGluZyB0byBoaXMgb3IgaGVyIG5lZWRzIGFmdGVyIHBhc3RpbmcuXG4gICAgICAgICAgLy8gVGhlIHVzZXIgY2FuIGp1c3QgZWRpdCB0aGUgcGFyYW1ldGVycyBOU0RpY3Rpb25hcnkgb3IgcHV0IHRoaXMgcGFydCBvZiBhIHNuaXBwZXQgaW4gYSBtdWx0aXBhcnQgYnVpbGRlciBtZXRob2QuXG4gICAgICAgICAgcHVzaChuc0RlY2xhcmF0aW9uKCdOU0FycmF5JywgJ3BhcmFtZXRlcnMnLCBwb3N0RGF0YS5wYXJhbXMgfHwgW10sIG9wdHMucHJldHR5KSk7XG4gICAgICAgICAgcHVzaChgTlNTdHJpbmcgKmJvdW5kYXJ5ID0gQFwiJHtwb3N0RGF0YS5ib3VuZGFyeX1cIjtgKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIHB1c2goJ05TRXJyb3IgKmVycm9yOycpO1xuICAgICAgICAgIHB1c2goJ05TTXV0YWJsZVN0cmluZyAqYm9keSA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nXTsnKTtcbiAgICAgICAgICBwdXNoKCdmb3IgKE5TRGljdGlvbmFyeSAqcGFyYW0gaW4gcGFyYW1ldGVycykgeycpO1xuICAgICAgICAgIHB1c2goJ1tib2R5IGFwcGVuZEZvcm1hdDpAXCItLSVAXFxcXHJcXFxcblwiLCBib3VuZGFyeV07JywgMSk7XG4gICAgICAgICAgcHVzaCgnaWYgKHBhcmFtW0BcImZpbGVOYW1lXCJdKSB7JywgMSk7XG4gICAgICAgICAgcHVzaChcbiAgICAgICAgICAgICdbYm9keSBhcHBlbmRGb3JtYXQ6QFwiQ29udGVudC1EaXNwb3NpdGlvbjpmb3JtLWRhdGE7IG5hbWU9XFxcXFwiJUBcXFxcXCI7IGZpbGVuYW1lPVxcXFxcIiVAXFxcXFwiXFxcXHJcXFxcblwiLCBwYXJhbVtAXCJuYW1lXCJdLCBwYXJhbVtAXCJmaWxlTmFtZVwiXV07JyxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwdXNoKCdbYm9keSBhcHBlbmRGb3JtYXQ6QFwiQ29udGVudC1UeXBlOiAlQFxcXFxyXFxcXG5cXFxcclxcXFxuXCIsIHBhcmFtW0BcImNvbnRlbnRUeXBlXCJdXTsnLCAyKTtcbiAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgJ1tib2R5IGFwcGVuZEZvcm1hdDpAXCIlQFwiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aENvbnRlbnRzT2ZGaWxlOnBhcmFtW0BcImZpbGVOYW1lXCJdIGVuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nIGVycm9yOiZlcnJvcl1dOycsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcHVzaCgnaWYgKGVycm9yKSB7JywgMik7XG4gICAgICAgICAgcHVzaCgnTlNMb2coQFwiJUBcIiwgZXJyb3IpOycsIDMpO1xuICAgICAgICAgIHB1c2goJ30nLCAyKTtcbiAgICAgICAgICBwdXNoKCd9IGVsc2UgeycsIDEpO1xuICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAnW2JvZHkgYXBwZW5kRm9ybWF0OkBcIkNvbnRlbnQtRGlzcG9zaXRpb246Zm9ybS1kYXRhOyBuYW1lPVxcXFxcIiVAXFxcXFwiXFxcXHJcXFxcblxcXFxyXFxcXG5cIiwgcGFyYW1bQFwibmFtZVwiXV07JyxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwdXNoKCdbYm9keSBhcHBlbmRGb3JtYXQ6QFwiJUBcIiwgcGFyYW1bQFwidmFsdWVcIl1dOycsIDIpO1xuICAgICAgICAgIHB1c2goJ30nLCAxKTtcbiAgICAgICAgICBwdXNoKCd9Jyk7XG4gICAgICAgICAgcHVzaCgnW2JvZHkgYXBwZW5kRm9ybWF0OkBcIlxcXFxyXFxcXG4tLSVALS1cXFxcclxcXFxuXCIsIGJvdW5kYXJ5XTsnKTtcbiAgICAgICAgICBwdXNoKCdOU0RhdGEgKnBvc3REYXRhID0gW2JvZHkgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOycpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgYE5TRGF0YSAqcG9zdERhdGEgPSBbW05TRGF0YSBhbGxvY10gaW5pdFdpdGhEYXRhOltAXCIke3Bvc3REYXRhLnRleHR9XCIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddXTtgLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKFxuICAgICAgYE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3QgPSBbTlNNdXRhYmxlVVJMUmVxdWVzdCByZXF1ZXN0V2l0aFVSTDpbTlNVUkwgVVJMV2l0aFN0cmluZzpAXCIke2Z1bGxVcmx9XCJdYCxcbiAgICApO1xuXG4gICAgLy8gTlNVUkxSZXF1ZXN0VXNlUHJvdG9jb2xDYWNoZVBvbGljeSBpcyB0aGUgZGVmYXVsdCBwb2xpY3ksIGxldCdzIGp1c3QgYWx3YXlzIHNldCBpdCB0byBhdm9pZCBjb25mdXNpb24uXG4gICAgcHVzaChcbiAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVQb2xpY3k6TlNVUkxSZXF1ZXN0VXNlUHJvdG9jb2xDYWNoZVBvbGljeScsXG4gICAgKTtcbiAgICBwdXNoKFxuICAgICAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRJbnRlcnZhbDoke29wdHMudGltZW91dC50b0ZpeGVkKFxuICAgICAgICAxLFxuICAgICAgKX1dO2AsXG4gICAgKTtcbiAgICBwdXNoKGBbcmVxdWVzdCBzZXRIVFRQTWV0aG9kOkBcIiR7bWV0aG9kfVwiXTtgKTtcblxuICAgIGlmIChyZXEuaGFzSGVhZGVycykge1xuICAgICAgcHVzaCgnW3JlcXVlc3Qgc2V0QWxsSFRUUEhlYWRlckZpZWxkczpoZWFkZXJzXTsnKTtcbiAgICB9XG5cbiAgICBpZiAocmVxLmhhc0JvZHkpIHtcbiAgICAgIHB1c2goJ1tyZXF1ZXN0IHNldEhUVFBCb2R5OnBvc3REYXRhXTsnKTtcbiAgICB9XG5cbiAgICBibGFuaygpO1xuXG4gICAgLy8gUmV0cmlldmluZyB0aGUgc2hhcmVkIHNlc3Npb24gd2lsbCBiZSBsZXNzIHZlcmJvc2UgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgcHVzaCgnTlNVUkxTZXNzaW9uICpzZXNzaW9uID0gW05TVVJMU2Vzc2lvbiBzaGFyZWRTZXNzaW9uXTsnKTtcbiAgICBwdXNoKCdOU1VSTFNlc3Npb25EYXRhVGFzayAqZGF0YVRhc2sgPSBbc2Vzc2lvbiBkYXRhVGFza1dpdGhSZXF1ZXN0OnJlcXVlc3QnKTtcbiAgICBwdXNoKFxuICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXI6XihOU0RhdGEgKmRhdGEsIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0Vycm9yICplcnJvcikgeycsXG4gICAgKTtcbiAgICBwdXNoKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgeycsIDEpO1xuICAgIHB1c2goJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNMb2coQFwiJUBcIiwgZXJyb3IpOycsIDIpO1xuICAgIHB1c2goJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsnLCAxKTtcblxuICAgIC8vIENhc3RpbmcgdGhlIE5TVVJMUmVzcG9uc2UgdG8gTlNIVFRQVVJMUmVzcG9uc2Ugc28gdGhlIHVzZXIgY2FuIHNlZSB0aGUgc3RhdHVzICAgICAuXG4gICAgcHVzaChcbiAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoTlNIVFRQVVJMUmVzcG9uc2UgKikgcmVzcG9uc2U7JyxcbiAgICAgIDIsXG4gICAgKTtcbiAgICBwdXNoKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTG9nKEBcIiVAXCIsIGh0dHBSZXNwb25zZSk7JywgMik7XG4gICAgcHVzaCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9JywgMSk7XG4gICAgcHVzaCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTsnKTtcbiAgICBwdXNoKCdbZGF0YVRhc2sgcmVzdW1lXTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBuc3VybHNlc3Npb24gfSBmcm9tICcuL25zdXJsc2Vzc2lvbi9jbGllbnQnO1xuXG5leHBvcnQgY29uc3Qgb2JqYzogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnb2JqYycsXG4gICAgdGl0bGU6ICdPYmplY3RpdmUtQycsXG4gICAgZXh0bmFtZTogJy5tJyxcbiAgICBkZWZhdWx0OiAnbnN1cmxzZXNzaW9uJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBuc3VybHNlc3Npb24sXG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgT0NhbWwgdXNpbmcgQ29IVFRQLlxuICpcbiAqIEBhdXRob3JcbiAqIEBTR3JvbmRpblxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgY29odHRwOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdjb2h0dHAnLFxuICAgIHRpdGxlOiAnQ29IVFRQJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9vY2FtbC1jb2h0dHAnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29odHRwIGlzIGEgdmVyeSBsaWdodHdlaWdodCBIVFRQIHNlcnZlciB1c2luZyBMd3Qgb3IgQXN5bmMgZm9yIE9DYW1sJyxcbiAgfSxcbiAgY29udmVydDogKHsgZnVsbFVybCwgYWxsSGVhZGVycywgcG9zdERhdGEsIG1ldGhvZCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IG1ldGhvZHMgPSBbJ2dldCcsICdwb3N0JywgJ2hlYWQnLCAnZGVsZXRlJywgJ3BhdGNoJywgJ3B1dCcsICdvcHRpb25zJ107XG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIHB1c2goJ29wZW4gQ29odHRwX2x3dF91bml4Jyk7XG4gICAgcHVzaCgnb3BlbiBDb2h0dHAnKTtcbiAgICBwdXNoKCdvcGVuIEx3dCcpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaChgbGV0IHVyaSA9IFVyaS5vZl9zdHJpbmcgXCIke2Z1bGxVcmx9XCIgaW5gKTtcblxuICAgIC8vIEFkZCBoZWFkZXJzLCBpbmNsdWRpbmcgdGhlIGNvb2tpZXNcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoYWxsSGVhZGVycyk7XG5cbiAgICBpZiAoaGVhZGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGBsZXQgaGVhZGVycyA9IEhlYWRlci5hZGQgKEhlYWRlci5pbml0ICgpKSBcIiR7aGVhZGVyc1swXX1cIiBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNbaGVhZGVyc1swXV0pfVwiIGluYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHB1c2goJ2xldCBoZWFkZXJzID0gSGVhZGVyLmFkZF9saXN0IChIZWFkZXIuaW5pdCAoKSkgWycpO1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHB1c2goYChcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIpO2AsIDEpO1xuICAgICAgfSk7XG4gICAgICBwdXNoKCddIGluJyk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJvZHlcbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgLy8gSnVzdCB0ZXh0XG4gICAgICBwdXNoKGBsZXQgYm9keSA9IENvaHR0cF9sd3RfYm9keS5vZl9zdHJpbmcgJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX0gaW5gKTtcbiAgICB9XG5cbiAgICAvLyBEbyB0aGUgcmVxdWVzdFxuICAgIGJsYW5rKCk7XG5cbiAgICBjb25zdCBoID0gaGVhZGVycy5sZW5ndGggPyAnfmhlYWRlcnMgJyA6ICcnO1xuICAgIGNvbnN0IGIgPSBwb3N0RGF0YS50ZXh0ID8gJ35ib2R5ICcgOiAnJztcbiAgICBjb25zdCBtID0gbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QudG9Mb3dlckNhc2UoKSlcbiAgICAgID8gYFxcYCR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9YFxuICAgICAgOiBgKENvZGUubWV0aG9kX29mX3N0cmluZyBcIiR7bWV0aG9kfVwiKWA7XG5cbiAgICBwdXNoKGBDbGllbnQuY2FsbCAke2h9JHtifSR7bX0gdXJpYCk7XG5cbiAgICAvLyBDYXRjaCByZXN1bHRcbiAgICBwdXNoKCc+Pj0gZnVuIChyZXMsIGJvZHlfc3RyZWFtKSAtPicpO1xuICAgIHB1c2goJygqIERvIHN0dWZmIHdpdGggdGhlIHJlc3VsdCAqKScsIDEpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IGNvaHR0cCB9IGZyb20gJy4vY29odHRwL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBvY2FtbDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnb2NhbWwnLFxuICAgIHRpdGxlOiAnT0NhbWwnLFxuICAgIGV4dG5hbWU6ICcubWwnLFxuICAgIGRlZmF1bHQ6ICdjb2h0dHAnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIGNvaHR0cCxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBQSFAgdXNpbmcgY3VybC1leHQuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1cmxPcHRpb25zIHtcbiAgY2xvc2luZ1RhZz86IGJvb2xlYW47XG4gIG1heFJlZGlyZWN0cz86IG51bWJlcjtcbiAgbmFtZWRFcnJvcnM/OiBib29sZWFuO1xuICBub1RhZ3M/OiBib29sZWFuO1xuICBzaG9ydFRhZ3M/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgY3VybDogQ2xpZW50PEN1cmxPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2N1cmwnLFxuICAgIHRpdGxlOiAnY1VSTCcsXG4gICAgbGluazogJ2h0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9ib29rLmN1cmwucGhwJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BIUCB3aXRoIGV4dC1jdXJsJyxcbiAgfSxcbiAgY29udmVydDogKFxuICAgIHsgdXJpT2JqLCBwb3N0RGF0YSwgZnVsbFVybCwgbWV0aG9kLCBodHRwVmVyc2lvbiwgY29va2llcywgaGVhZGVyc09iaiB9LFxuICAgIG9wdGlvbnMgPSB7fSxcbiAgKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY2xvc2luZ1RhZyA9IGZhbHNlLFxuICAgICAgaW5kZW50ID0gJyAgJyxcbiAgICAgIG1heFJlZGlyZWN0cyA9IDEwLFxuICAgICAgbmFtZWRFcnJvcnMgPSBmYWxzZSxcbiAgICAgIG5vVGFncyA9IGZhbHNlLFxuICAgICAgc2hvcnRUYWdzID0gZmFsc2UsXG4gICAgICB0aW1lb3V0ID0gMzAsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQgfSk7XG5cbiAgICBpZiAoIW5vVGFncykge1xuICAgICAgcHVzaChzaG9ydFRhZ3MgPyAnPD8nIDogJzw/cGhwJyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHB1c2goJyRjdXJsID0gY3VybF9pbml0KCk7Jyk7XG4gICAgYmxhbmsoKTtcblxuICAgIGNvbnN0IGN1cmxPcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlc2NhcGU6IHRydWUsXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX1BPUlQnLFxuICAgICAgICB2YWx1ZTogdXJpT2JqLnBvcnQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlc2NhcGU6IHRydWUsXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX1VSTCcsXG4gICAgICAgIHZhbHVlOiBmdWxsVXJsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXNjYXBlOiBmYWxzZSxcbiAgICAgICAgbmFtZTogJ0NVUkxPUFRfUkVUVVJOVFJBTlNGRVInLFxuICAgICAgICB2YWx1ZTogJ3RydWUnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXNjYXBlOiB0cnVlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9FTkNPRElORycsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVzY2FwZTogZmFsc2UsXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX01BWFJFRElSUycsXG4gICAgICAgIHZhbHVlOiBtYXhSZWRpcmVjdHMsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlc2NhcGU6IGZhbHNlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9USU1FT1VUJyxcbiAgICAgICAgdmFsdWU6IHRpbWVvdXQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlc2NhcGU6IGZhbHNlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9IVFRQX1ZFUlNJT04nLFxuICAgICAgICB2YWx1ZTogaHR0cFZlcnNpb24gPT09ICdIVFRQLzEuMCcgPyAnQ1VSTF9IVFRQX1ZFUlNJT05fMV8wJyA6ICdDVVJMX0hUVFBfVkVSU0lPTl8xXzEnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXNjYXBlOiB0cnVlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9DVVNUT01SRVFVRVNUJyxcbiAgICAgICAgdmFsdWU6IG1ldGhvZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVzY2FwZTogIXBvc3REYXRhLmpzb25PYmosXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX1BPU1RGSUVMRFMnLFxuICAgICAgICB2YWx1ZTogcG9zdERhdGFcbiAgICAgICAgICA/IHBvc3REYXRhLmpzb25PYmpcbiAgICAgICAgICAgID8gYGpzb25fZW5jb2RlKCR7Y29udmVydFR5cGUocG9zdERhdGEuanNvbk9iaiwgaW5kZW50LnJlcGVhdCgyKSwgaW5kZW50KX0pYFxuICAgICAgICAgICAgOiBwb3N0RGF0YS50ZXh0XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBwdXNoKCdjdXJsX3NldG9wdF9hcnJheSgkY3VybCwgWycpO1xuXG4gICAgY29uc3QgY3VybG9wdHMgPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQsIGpvaW46IGBcXG4ke2luZGVudH1gIH0pO1xuXG4gICAgY3VybE9wdGlvbnMuZm9yRWFjaCgoeyB2YWx1ZSwgbmFtZSwgZXNjYXBlIH0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGN1cmxvcHRzLnB1c2goYCR7bmFtZX0gPT4gJHtlc2NhcGUgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiB2YWx1ZX0sYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29va2llc1xuICAgIGNvbnN0IGN1cmxDb29raWVzID0gY29va2llcy5tYXAoXG4gICAgICBjb29raWUgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5uYW1lKX09JHtlbmNvZGVVUklDb21wb25lbnQoY29va2llLnZhbHVlKX1gLFxuICAgICk7XG4gICAgaWYgKGN1cmxDb29raWVzLmxlbmd0aCkge1xuICAgICAgY3VybG9wdHMucHVzaChgQ1VSTE9QVF9DT09LSUUgPT4gXCIke2N1cmxDb29raWVzLmpvaW4oJzsgJyl9XCIsYCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGNvb2tpZXNcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoaGVhZGVyc09iailcbiAgICAgIC5zb3J0KClcbiAgICAgIC5tYXAoa2V5ID0+IGBcIiR7a2V5fTogJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoaGVhZGVyc09ialtrZXldKX1cImApO1xuXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICBjdXJsb3B0cy5wdXNoKCdDVVJMT1BUX0hUVFBIRUFERVIgPT4gWycpO1xuICAgICAgY3VybG9wdHMucHVzaChoZWFkZXJzLmpvaW4oYCxcXG4ke2luZGVudH0ke2luZGVudH1gKSwgMSk7XG4gICAgICBjdXJsb3B0cy5wdXNoKCddLCcpO1xuICAgIH1cblxuICAgIHB1c2goY3VybG9wdHMuam9pbigpLCAxKTtcbiAgICBwdXNoKCddKTsnKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJyRyZXNwb25zZSA9IGN1cmxfZXhlYygkY3VybCk7Jyk7XG4gICAgcHVzaCgnJGVyciA9IGN1cmxfZXJyb3IoJGN1cmwpOycpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnY3VybF9jbG9zZSgkY3VybCk7Jyk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdpZiAoJGVycikgeycpO1xuXG4gICAgaWYgKG5hbWVkRXJyb3JzKSB7XG4gICAgICBwdXNoKCdlY2hvIGFycmF5X2ZsaXAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpW1wiY3VybFwiXSlbJGVycl07JywgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goJ2VjaG8gXCJjVVJMIEVycm9yICM6XCIgLiAkZXJyOycsIDEpO1xuICAgIH1cblxuICAgIHB1c2goJ30gZWxzZSB7Jyk7XG4gICAgcHVzaCgnZWNobyAkcmVzcG9uc2U7JywgMSk7XG4gICAgcHVzaCgnfScpO1xuXG4gICAgaWYgKCFub1RhZ3MgJiYgY2xvc2luZ1RhZykge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJz8+Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBQSFAgdXNpbmcgR3V6emxlLlxuICpcbiAqIEBhdXRob3IgQFJvYmVydG9BcnJ1ZGFcbiAqIEBhdXRob3IgQGVydW5pb25cbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JTaW5nbGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBnZXRIZWFkZXIsIGdldEhlYWRlck5hbWUsIGhhc0hlYWRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGNvbnZlcnRUeXBlIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3V6emxlT3B0aW9ucyB7XG4gIGNsb3NpbmdUYWc/OiBib29sZWFuO1xuICBpbmRlbnQ/OiBzdHJpbmc7XG4gIG5vVGFncz86IGJvb2xlYW47XG4gIHNob3J0VGFncz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBndXp6bGU6IENsaWVudDxHdXp6bGVPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2d1enpsZScsXG4gICAgdGl0bGU6ICdHdXp6bGUnLFxuICAgIGxpbms6ICdodHRwOi8vZG9jcy5ndXp6bGVwaHAub3JnL2VuL3N0YWJsZS8nLFxuICAgIGRlc2NyaXB0aW9uOiAnUEhQIHdpdGggR3V6emxlJyxcbiAgfSxcbiAgY29udmVydDogKHsgcG9zdERhdGEsIGZ1bGxVcmwsIG1ldGhvZCwgY29va2llcywgaGVhZGVyc09iaiB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGNsb3NpbmdUYWc6IGZhbHNlLFxuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgbm9UYWdzOiBmYWxzZSxcbiAgICAgIHNob3J0VGFnczogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvZGU6IHJlcXVlc3RDb2RlLFxuICAgICAgcHVzaDogcmVxdWVzdFB1c2gsXG4gICAgICBqb2luOiByZXF1ZXN0Sm9pbixcbiAgICB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIGlmICghb3B0cy5ub1RhZ3MpIHtcbiAgICAgIHB1c2gob3B0cy5zaG9ydFRhZ3MgPyAnPD8nIDogJzw/cGhwJyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgIHJlcXVlc3RQdXNoKFxuICAgICAgICAgIGAnZm9ybV9wYXJhbXMnID0+ICR7Y29udmVydFR5cGUoXG4gICAgICAgICAgICBwb3N0RGF0YS5wYXJhbXNPYmosXG4gICAgICAgICAgICBvcHRzLmluZGVudCArIG9wdHMuaW5kZW50LFxuICAgICAgICAgICAgb3B0cy5pbmRlbnQsXG4gICAgICAgICAgKX0sYCxcbiAgICAgICAgICAxLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6IHtcbiAgICAgICAgdHlwZSBNdWx0aXBhcnRGaWVsZCA9IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgY29udGVudHM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaWVsZHM6IE11bHRpcGFydEZpZWxkW10gPSBbXTtcblxuICAgICAgICBpZiAocG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICBpZiAocGFyYW0uZmlsZU5hbWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZmllbGQ6IE11bHRpcGFydEZpZWxkID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcmFtLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBwYXJhbS52YWx1ZSxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAocGFyYW0uY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5oZWFkZXJzID0geyAnQ29udGVudC1UeXBlJzogcGFyYW0uY29udGVudFR5cGUgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudHM6IHBhcmFtLnZhbHVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgcmVxdWVzdFB1c2goXG4gICAgICAgICAgICBgJ211bHRpcGFydCcgPT4gJHtjb252ZXJ0VHlwZShmaWVsZHMsIG9wdHMuaW5kZW50ICsgb3B0cy5pbmRlbnQsIG9wdHMuaW5kZW50KX1gLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gR3V6emxlIGFkZHMgaXRzIG93biBib3VuZGFyeSBmb3IgbXVsdGlwYXJ0IHJlcXVlc3RzLlxuICAgICAgICAgIGlmIChoYXNIZWFkZXIoaGVhZGVyc09iaiwgJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgICAgICBpZiAoZ2V0SGVhZGVyKGhlYWRlcnNPYmosICdjb250ZW50LXR5cGUnKT8uaW5kZXhPZignYm91bmRhcnknKSkge1xuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gZ2V0SGVhZGVyTmFtZShoZWFkZXJzT2JqLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNPYmpbaGVhZGVyTmFtZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcmVxdWVzdFB1c2goYCdib2R5JyA9PiAke2NvbnZlcnRUeXBlKHBvc3REYXRhLnRleHQpfSxgLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBoZWFkZXJzXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGhlYWRlcnNPYmopXG4gICAgICAuc29ydCgpXG4gICAgICAubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGAke29wdHMuaW5kZW50fSR7b3B0cy5pbmRlbnR9JyR7a2V5fScgPT4gJyR7ZXNjYXBlRm9yU2luZ2xlUXVvdGVzKGhlYWRlcnNPYmpba2V5XSl9JyxgO1xuICAgICAgfSk7XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29va2llc1xuICAgIGNvbnN0IGNvb2tpZVN0cmluZyA9IGNvb2tpZXNcbiAgICAgIC5tYXAoY29va2llID0+IGAke2VuY29kZVVSSUNvbXBvbmVudChjb29raWUubmFtZSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZS52YWx1ZSl9YClcbiAgICAgIC5qb2luKCc7ICcpO1xuICAgIGlmIChjb29raWVTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoZWFkZXJzLnB1c2goYCR7b3B0cy5pbmRlbnR9JHtvcHRzLmluZGVudH0nY29va2llJyA9PiAnJHtlc2NhcGVGb3JTaW5nbGVRdW90ZXMoY29va2llU3RyaW5nKX0nLGApO1xuICAgIH1cblxuICAgIGlmIChoZWFkZXJzLmxlbmd0aCkge1xuICAgICAgcmVxdWVzdFB1c2goXCInaGVhZGVycycgPT4gW1wiLCAxKTtcbiAgICAgIHJlcXVlc3RQdXNoKGhlYWRlcnMuam9pbignXFxuJykpO1xuICAgICAgcmVxdWVzdFB1c2goJ10sJywgMSk7XG4gICAgfVxuXG4gICAgcHVzaCgnJGNsaWVudCA9IG5ldyBcXFxcR3V6emxlSHR0cFxcXFxDbGllbnQoKTsnKTtcbiAgICBibGFuaygpO1xuXG4gICAgaWYgKHJlcXVlc3RDb2RlLmxlbmd0aCkge1xuICAgICAgcHVzaChgJHJlc3BvbnNlID0gJGNsaWVudC0+cmVxdWVzdCgnJHttZXRob2R9JywgJyR7ZnVsbFVybH0nLCBbYCk7XG4gICAgICBwdXNoKHJlcXVlc3RKb2luKCkpO1xuICAgICAgcHVzaCgnXSk7Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goYCRyZXNwb25zZSA9ICRjbGllbnQtPnJlcXVlc3QoJyR7bWV0aG9kfScsICcke2Z1bGxVcmx9Jyk7YCk7XG4gICAgfVxuXG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdlY2hvICRyZXNwb25zZS0+Z2V0Qm9keSgpOycpO1xuXG4gICAgaWYgKCFvcHRzLm5vVGFncyAmJiBvcHRzLmNsb3NpbmdUYWcpIHtcbiAgICAgIGJsYW5rKCk7XG4gICAgICBwdXNoKCc/PicpO1xuICAgIH1cblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgZXNjYXBlU3RyaW5nIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvZXNjYXBlXCI7XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0VHlwZSA9IChvYmo6IGFueVtdIHwgYW55LCBpbmRlbnQ/OiBzdHJpbmcsIGxhc3RJbmRlbnQ/OiBzdHJpbmcpID0+IHtcbiAgbGFzdEluZGVudCA9IGxhc3RJbmRlbnQgfHwgJyc7XG4gIGluZGVudCA9IGluZGVudCB8fCAnJztcblxuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgY2FzZSAnW29iamVjdCBOdWxsXSc6XG4gICAgICByZXR1cm4gJ251bGwnO1xuXG4gICAgY2FzZSAnW29iamVjdCBVbmRlZmluZWRdJzpcbiAgICAgIHJldHVybiAnbnVsbCc7XG5cbiAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgcmV0dXJuIGAnJHtlc2NhcGVTdHJpbmcob2JqLCB7IGRlbGltaXRlcjogXCInXCIsIGVzY2FwZU5ld2xpbmVzOiBmYWxzZSB9KX0nYDtcblxuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG5cbiAgICBjYXNlICdbb2JqZWN0IEFycmF5XSc6IHtcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gb2JqXG4gICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gY29udmVydFR5cGUoaXRlbSwgYCR7aW5kZW50fSR7aW5kZW50fWAsIGluZGVudCkpXG4gICAgICAgIC5qb2luKGAsXFxuJHtpbmRlbnR9YCk7XG4gICAgICByZXR1cm4gYFtcXG4ke2luZGVudH0ke2NvbnRlbnRzfVxcbiR7bGFzdEluZGVudH1dYDtcbiAgICB9XG5cbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOiB7XG4gICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgYCR7Y29udmVydFR5cGUoaSwgaW5kZW50KX0gPT4gJHtjb252ZXJ0VHlwZShvYmpbaV0sIGAke2luZGVudH0ke2luZGVudH1gLCBpbmRlbnQpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGBbXFxuJHtpbmRlbnR9JHtyZXN1bHQuam9pbihgLFxcbiR7aW5kZW50fWApfVxcbiR7bGFzdEluZGVudH1dYDtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdudWxsJztcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRlZE1ldGhvZHMgPSBbXG4gICdBQ0wnLFxuICAnQkFTRUxJTkVfQ09OVFJPTCcsXG4gICdDSEVDS0lOJyxcbiAgJ0NIRUNLT1VUJyxcbiAgJ0NPTk5FQ1QnLFxuICAnQ09QWScsXG4gICdERUxFVEUnLFxuICAnR0VUJyxcbiAgJ0hFQUQnLFxuICAnTEFCRUwnLFxuICAnTE9DSycsXG4gICdNRVJHRScsXG4gICdNS0FDVElWSVRZJyxcbiAgJ01LQ09MJyxcbiAgJ01LV09SS1NQQUNFJyxcbiAgJ01PVkUnLFxuICAnT1BUSU9OUycsXG4gICdQT1NUJyxcbiAgJ1BST1BGSU5EJyxcbiAgJ1BST1BQQVRDSCcsXG4gICdQVVQnLFxuICAnUkVQT1JUJyxcbiAgJ1RSQUNFJyxcbiAgJ1VOQ0hFQ0tPVVQnLFxuICAnVU5MT0NLJyxcbiAgJ1VQREFURScsXG4gICdWRVJTSU9OX0NPTlRST0wnLFxuXTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIFBIUCB1c2luZyBjdXJsLWV4dC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAQWhtYWROYXNzcmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGNvbnZlcnRUeXBlLCBzdXBwb3J0ZWRNZXRob2RzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cDFPcHRpb25zIHtcbiAgY2xvc2luZ1RhZz86IGJvb2xlYW47XG4gIG5vVGFncz86IGJvb2xlYW47XG4gIHNob3J0VGFncz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBodHRwMTogQ2xpZW50PEh0dHAxT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdodHRwMScsXG4gICAgdGl0bGU6ICdIVFRQIHYxJyxcbiAgICBsaW5rOiAnaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Jvb2suaHR0cC5waHAnLFxuICAgIGRlc2NyaXB0aW9uOiAnUEhQIHdpdGggcGVjbC9odHRwIHYxJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCB1cmwsIHBvc3REYXRhLCBxdWVyeU9iaiwgaGVhZGVyc09iaiwgY29va2llc09iaiB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNsb3NpbmdUYWcgPSBmYWxzZSwgaW5kZW50ID0gJyAgJywgbm9UYWdzID0gZmFsc2UsIHNob3J0VGFncyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50IH0pO1xuXG4gICAgaWYgKCFub1RhZ3MpIHtcbiAgICAgIHB1c2goc2hvcnRUYWdzID8gJzw/JyA6ICc8P3BocCcpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoIXN1cHBvcnRlZE1ldGhvZHMuaW5jbHVkZXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICBwdXNoKGBIdHRwUmVxdWVzdDo6bWV0aG9kUmVnaXN0ZXIoJyR7bWV0aG9kfScpO2ApO1xuICAgIH1cblxuICAgIHB1c2goJyRyZXF1ZXN0ID0gbmV3IEh0dHBSZXF1ZXN0KCk7Jyk7XG4gICAgcHVzaChgJHJlcXVlc3QtPnNldFVybCgke2NvbnZlcnRUeXBlKHVybCl9KTtgKTtcblxuICAgIGlmIChzdXBwb3J0ZWRNZXRob2RzLmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgcHVzaChgJHJlcXVlc3QtPnNldE1ldGhvZChIVFRQX01FVEhfJHttZXRob2QudG9VcHBlckNhc2UoKX0pO2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKGAkcmVxdWVzdC0+c2V0TWV0aG9kKEh0dHBSZXF1ZXN0OjpIVFRQX01FVEhfJHttZXRob2QudG9VcHBlckNhc2UoKX0pO2ApO1xuICAgIH1cblxuICAgIGJsYW5rKCk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcHVzaChgJHJlcXVlc3QtPnNldFF1ZXJ5RGF0YSgke2NvbnZlcnRUeXBlKHF1ZXJ5T2JqLCBpbmRlbnQpfSk7YCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRIZWFkZXJzKCR7Y29udmVydFR5cGUoaGVhZGVyc09iaiwgaW5kZW50KX0pO2ApO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY29va2llc09iaikubGVuZ3RoKSB7XG4gICAgICBwdXNoKGAkcmVxdWVzdC0+c2V0Q29va2llcygke2NvbnZlcnRUeXBlKGNvb2tpZXNPYmosIGluZGVudCl9KTtgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgcHVzaChgJHJlcXVlc3QtPnNldENvbnRlbnRUeXBlKCR7Y29udmVydFR5cGUocG9zdERhdGEubWltZVR5cGUpfSk7YCk7XG4gICAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRQb3N0RmllbGRzKCR7Y29udmVydFR5cGUocG9zdERhdGEucGFyYW1zT2JqLCBpbmRlbnQpfSk7YCk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgcHVzaChgJHJlcXVlc3QtPnNldENvbnRlbnRUeXBlKCR7Y29udmVydFR5cGUocG9zdERhdGEubWltZVR5cGUpfSk7YCk7XG4gICAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRCb2R5KGpzb25fZW5jb2RlKCR7Y29udmVydFR5cGUocG9zdERhdGEuanNvbk9iaiwgaW5kZW50KX0pKTtgKTtcbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcHVzaChgJHJlcXVlc3QtPnNldEJvZHkoJHtjb252ZXJ0VHlwZShwb3N0RGF0YS50ZXh0KX0pO2ApO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKCd0cnkgeycpO1xuICAgIHB1c2goJyRyZXNwb25zZSA9ICRyZXF1ZXN0LT5zZW5kKCk7JywgMSk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdlY2hvICRyZXNwb25zZS0+Z2V0Qm9keSgpOycsIDEpO1xuICAgIHB1c2goJ30gY2F0Y2ggKEh0dHBFeGNlcHRpb24gJGV4KSB7Jyk7XG4gICAgcHVzaCgnZWNobyAkZXg7JywgMSk7XG4gICAgcHVzaCgnfScpO1xuXG4gICAgaWYgKCFub1RhZ3MgJiYgY2xvc2luZ1RhZykge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJz8+Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBQSFAgdXNpbmcgY3VybC1leHQuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGVyLCBnZXRIZWFkZXJOYW1lLCBoYXNIZWFkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHAyT3B0aW9ucyB7XG4gIGNsb3NpbmdUYWc/OiBib29sZWFuO1xuICBub1RhZ3M/OiBib29sZWFuO1xuICBzaG9ydFRhZ3M/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgaHR0cDI6IENsaWVudDxIdHRwMk9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnaHR0cDInLFxuICAgIHRpdGxlOiAnSFRUUCB2MicsXG4gICAgbGluazogJ2h0dHA6Ly9kZXZlbC1tNnc2LnJoY2xvdWQuY29tL21kcmVmL2h0dHAnLFxuICAgIGRlc2NyaXB0aW9uOiAnUEhQIHdpdGggcGVjbC9odHRwIHYyJyxcbiAgfSxcbiAgY29udmVydDogKHsgcG9zdERhdGEsIGhlYWRlcnNPYmosIG1ldGhvZCwgcXVlcnlPYmosIGNvb2tpZXNPYmosIHVybCB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNsb3NpbmdUYWcgPSBmYWxzZSwgaW5kZW50ID0gJyAgJywgbm9UYWdzID0gZmFsc2UsIHNob3J0VGFncyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50IH0pO1xuICAgIGxldCBoYXNCb2R5ID0gZmFsc2U7XG5cbiAgICBpZiAoIW5vVGFncykge1xuICAgICAgcHVzaChzaG9ydFRhZ3MgPyAnPD8nIDogJzw/cGhwJyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHB1c2goJyRjbGllbnQgPSBuZXcgaHR0cFxcXFxDbGllbnQ7Jyk7XG4gICAgcHVzaCgnJHJlcXVlc3QgPSBuZXcgaHR0cFxcXFxDbGllbnRcXFxcUmVxdWVzdDsnKTtcbiAgICBibGFuaygpO1xuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgcHVzaCgnJGJvZHkgPSBuZXcgaHR0cFxcXFxNZXNzYWdlXFxcXEJvZHk7Jyk7XG4gICAgICAgIHB1c2goYCRib2R5LT5hcHBlbmQobmV3IGh0dHBcXFxcUXVlcnlTdHJpbmcoJHtjb252ZXJ0VHlwZShwb3N0RGF0YS5wYXJhbXNPYmosIGluZGVudCl9KSk7YCk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6IHtcbiAgICAgICAgaWYgKCFwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmaWxlOiBzdHJpbmc7XG4gICAgICAgICAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIFthbnl0aGluZzogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKCh7IG5hbWUsIGZpbGVOYW1lLCB2YWx1ZSwgY29udGVudFR5cGUgfSkgPT4ge1xuICAgICAgICAgIGlmIChmaWxlTmFtZSkge1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHR5cGU6IGNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICBmaWxlOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBmaWVsZHNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZpZWxkID0gT2JqZWN0LmtleXMoZmllbGRzKS5sZW5ndGggPyBjb252ZXJ0VHlwZShmaWVsZHMsIGluZGVudCkgOiAnbnVsbCc7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZpbGVzLmxlbmd0aCA/IGNvbnZlcnRUeXBlKGZpbGVzLCBpbmRlbnQpIDogJ251bGwnO1xuXG4gICAgICAgIHB1c2goJyRib2R5ID0gbmV3IGh0dHBcXFxcTWVzc2FnZVxcXFxCb2R5OycpO1xuICAgICAgICBwdXNoKGAkYm9keS0+YWRkRm9ybSgke2ZpZWxkfSwgJHtmb3JtVmFsdWV9KTtgKTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGNvbnRlbnRUeXBlIGhlYWRlclxuICAgICAgICBpZiAoaGFzSGVhZGVyKGhlYWRlcnNPYmosICdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICAgIGlmIChnZXRIZWFkZXIoaGVhZGVyc09iaiwgJ2NvbnRlbnQtdHlwZScpPy5pbmRleE9mKCdib3VuZGFyeScpKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gZ2V0SGVhZGVyTmFtZShoZWFkZXJzT2JqLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc09ialtoZWFkZXJOYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBibGFuaygpO1xuXG4gICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBwdXNoKCckYm9keSA9IG5ldyBodHRwXFxcXE1lc3NhZ2VcXFxcQm9keTsnKTtcbiAgICAgICAgcHVzaChgJGJvZHktPmFwcGVuZChqc29uX2VuY29kZSgke2NvbnZlcnRUeXBlKHBvc3REYXRhLmpzb25PYmosIGluZGVudCl9KSk7YCk7XG4gICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgICBwdXNoKCckYm9keSA9IG5ldyBodHRwXFxcXE1lc3NhZ2VcXFxcQm9keTsnKTtcbiAgICAgICAgICBwdXNoKGAkYm9keS0+YXBwZW5kKCR7Y29udmVydFR5cGUocG9zdERhdGEudGV4dCl9KTtgKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChgJHJlcXVlc3QtPnNldFJlcXVlc3RVcmwoJHtjb252ZXJ0VHlwZSh1cmwpfSk7YCk7XG4gICAgcHVzaChgJHJlcXVlc3QtPnNldFJlcXVlc3RNZXRob2QoJHtjb252ZXJ0VHlwZShtZXRob2QpfSk7YCk7XG5cbiAgICBpZiAoaGFzQm9keSkge1xuICAgICAgcHVzaCgnJHJlcXVlc3QtPnNldEJvZHkoJGJvZHkpOycpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcHVzaChgJHJlcXVlc3QtPnNldFF1ZXJ5KG5ldyBodHRwXFxcXFF1ZXJ5U3RyaW5nKCR7Y29udmVydFR5cGUocXVlcnlPYmosIGluZGVudCl9KSk7YCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRIZWFkZXJzKCR7Y29udmVydFR5cGUoaGVhZGVyc09iaiwgaW5kZW50KX0pO2ApO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY29va2llc09iaikubGVuZ3RoKSB7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaChgJGNsaWVudC0+c2V0Q29va2llcygke2NvbnZlcnRUeXBlKGNvb2tpZXNPYmosIGluZGVudCl9KTtgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgcHVzaCgnJGNsaWVudC0+ZW5xdWV1ZSgkcmVxdWVzdCktPnNlbmQoKTsnKTtcbiAgICBwdXNoKCckcmVzcG9uc2UgPSAkY2xpZW50LT5nZXRSZXNwb25zZSgpOycpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnZWNobyAkcmVzcG9uc2UtPmdldEJvZHkoKTsnKTtcblxuICAgIGlmICghbm9UYWdzICYmIGNsb3NpbmdUYWcpIHtcbiAgICAgIGJsYW5rKCk7XG4gICAgICBwdXNoKCc/PicpO1xuICAgIH1cblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBjdXJsIH0gZnJvbSAnLi9jdXJsL2NsaWVudCc7XG5pbXBvcnQgeyBndXp6bGUgfSBmcm9tICcuL2d1enpsZS9jbGllbnQnO1xuaW1wb3J0IHsgaHR0cDEgfSBmcm9tICcuL2h0dHAxL2NsaWVudCc7XG5pbXBvcnQgeyBodHRwMiB9IGZyb20gJy4vaHR0cDIvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IHBocDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncGhwJyxcbiAgICB0aXRsZTogJ1BIUCcsXG4gICAgZXh0bmFtZTogJy5waHAnLFxuICAgIGRlZmF1bHQ6ICdjdXJsJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBjdXJsLFxuICAgIGd1enpsZSxcbiAgICBodHRwMSxcbiAgICBodHRwMixcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZVN0cmluZyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IGdldEhlYWRlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBDb252ZXJ0ZXIgfSBmcm9tICcuLi90YXJnZXRzJztcblxuZXhwb3J0IHR5cGUgUG93ZXJzaGVsbENvbW1hbmQgPSAnSW52b2tlLVJlc3RNZXRob2QnIHwgJ0ludm9rZS1XZWJSZXF1ZXN0JztcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUG93ZXJzaGVsbENvbnZlcnQgPSAoY29tbWFuZDogUG93ZXJzaGVsbENvbW1hbmQpID0+IHtcbiAgY29uc3QgY29udmVydDogQ29udmVydGVyPGFueT4gPSAoe1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzT2JqLFxuICAgIGNvb2tpZXMsXG4gICAgdXJpT2JqLFxuICAgIGZ1bGxVcmwsXG4gICAgcG9zdERhdGEsXG4gICAgYWxsSGVhZGVycyxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHsgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKCk7XG4gICAgY29uc3QgbWV0aG9kcyA9IFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdQQVRDSCcsICdIRUFEJywgJ09QVElPTlMnXTtcblxuICAgIGlmICghbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgIHJldHVybiAnTWV0aG9kIG5vdCBzdXBwb3J0ZWQnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRPcHRpb25zID0gW107XG5cbiAgICAvLyBBZGQgaGVhZGVycywgaW5jbHVkaW5nIHRoZSBjb29raWVzXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGhlYWRlcnNPYmopO1xuXG4gICAgLy8gY29uc3RydWN0IGhlYWRlcnNcbiAgICBpZiAoaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgIHB1c2goJyRoZWFkZXJzPUB7fScpO1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkgIT09ICdjb25uZWN0aW9uJykge1xuICAgICAgICAgIC8vIE5vdCBhbGxvd2VkXG4gICAgICAgICAgcHVzaChgJGhlYWRlcnMuQWRkKFwiJHtrZXl9XCIsIFwiJHtlc2NhcGVTdHJpbmcoaGVhZGVyc09ialtrZXldLCB7IGVzY2FwZUNoYXI6ICdgJyB9KX1cIilgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb21tYW5kT3B0aW9ucy5wdXNoKCctSGVhZGVycyAkaGVhZGVycycpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBjb29raWVzXG4gICAgaWYgKGNvb2tpZXMubGVuZ3RoKSB7XG4gICAgICBwdXNoKCckc2Vzc2lvbiA9IE5ldy1PYmplY3QgTWljcm9zb2Z0LlBvd2VyU2hlbGwuQ29tbWFuZHMuV2ViUmVxdWVzdFNlc3Npb24nKTtcblxuICAgICAgY29va2llcy5mb3JFYWNoKGNvb2tpZSA9PiB7XG4gICAgICAgIHB1c2goJyRjb29raWUgPSBOZXctT2JqZWN0IFN5c3RlbS5OZXQuQ29va2llJyk7XG5cbiAgICAgICAgcHVzaChgJGNvb2tpZS5OYW1lID0gJyR7Y29va2llLm5hbWV9J2ApO1xuICAgICAgICBwdXNoKGAkY29va2llLlZhbHVlID0gJyR7Y29va2llLnZhbHVlfSdgKTtcbiAgICAgICAgcHVzaChgJGNvb2tpZS5Eb21haW4gPSAnJHt1cmlPYmouaG9zdH0nYCk7XG5cbiAgICAgICAgcHVzaCgnJHNlc3Npb24uQ29va2llcy5BZGQoJGNvb2tpZSknKTtcbiAgICAgIH0pO1xuICAgICAgY29tbWFuZE9wdGlvbnMucHVzaCgnLVdlYlNlc3Npb24gJHNlc3Npb24nKTtcbiAgICB9XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgY29tbWFuZE9wdGlvbnMucHVzaChgLUNvbnRlbnRUeXBlICcke1xuICAgICAgICBlc2NhcGVTdHJpbmcoZ2V0SGVhZGVyKGFsbEhlYWRlcnMsICdjb250ZW50LXR5cGUnKSwgeyBkZWxpbWl0ZXI6IFwiJ1wiLCBlc2NhcGVDaGFyOiAnYCcgfSlcbiAgICAgIH0nYCk7XG4gICAgICBjb21tYW5kT3B0aW9ucy5wdXNoKGAtQm9keSAnJHtwb3N0RGF0YS50ZXh0fSdgKTtcbiAgICB9XG5cbiAgICBwdXNoKGAkcmVzcG9uc2UgPSAke2NvbW1hbmR9IC1VcmkgJyR7ZnVsbFVybH0nIC1NZXRob2QgJHttZXRob2R9ICR7Y29tbWFuZE9wdGlvbnMuam9pbignICcpfWApO1xuICAgIHJldHVybiBqb2luKCk7XG4gIH07XG4gIHJldHVybiBjb252ZXJ0O1xufTtcbiIsImltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQb3dlcnNoZWxsQ29udmVydCB9IGZyb20gJy4uL2NvbW1vbic7XG5cbmV4cG9ydCBjb25zdCByZXN0bWV0aG9kOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdyZXN0bWV0aG9kJyxcbiAgICB0aXRsZTogJ0ludm9rZS1SZXN0TWV0aG9kJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJzaGVsbC9tb2R1bGUvTWljcm9zb2Z0LlBvd2VyU2hlbGwuVXRpbGl0eS9JbnZva2UtUmVzdE1ldGhvZCcsXG4gICAgZGVzY3JpcHRpb246ICdQb3dlcnNoZWxsIEludm9rZS1SZXN0TWV0aG9kIGNsaWVudCcsXG4gIH0sXG4gIGNvbnZlcnQ6IGdlbmVyYXRlUG93ZXJzaGVsbENvbnZlcnQoJ0ludm9rZS1SZXN0TWV0aG9kJyksXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyByZXN0bWV0aG9kIH0gZnJvbSAnLi9yZXN0bWV0aG9kL2NsaWVudCc7XG5pbXBvcnQgeyB3ZWJyZXF1ZXN0IH0gZnJvbSAnLi93ZWJyZXF1ZXN0L2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBwb3dlcnNoZWxsOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdwb3dlcnNoZWxsJyxcbiAgICB0aXRsZTogJ1Bvd2Vyc2hlbGwnLFxuICAgIGV4dG5hbWU6ICcucHMxJyxcbiAgICBkZWZhdWx0OiAnd2VicmVxdWVzdCcsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgd2VicmVxdWVzdCxcbiAgICByZXN0bWV0aG9kLFxuICB9LFxufTtcbiIsImltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQb3dlcnNoZWxsQ29udmVydCB9IGZyb20gJy4uL2NvbW1vbic7XG5cbmV4cG9ydCBjb25zdCB3ZWJyZXF1ZXN0OiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICd3ZWJyZXF1ZXN0JyxcbiAgICB0aXRsZTogJ0ludm9rZS1XZWJSZXF1ZXN0JyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJzaGVsbC9tb2R1bGUvTWljcm9zb2Z0LlBvd2VyU2hlbGwuVXRpbGl0eS9JbnZva2UtV2ViUmVxdWVzdCcsXG4gICAgZGVzY3JpcHRpb246ICdQb3dlcnNoZWxsIEludm9rZS1XZWJSZXF1ZXN0IGNsaWVudCcsXG4gIH0sXG4gIGNvbnZlcnQ6IGdlbmVyYXRlUG93ZXJzaGVsbENvbnZlcnQoJ0ludm9rZS1XZWJSZXF1ZXN0JyksXG59O1xuIiwiLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBhIERpY3Rpb25hcnkgb3IgQXJyYXkgbGl0ZXJhbCByZXByZXNlbnRhdGlvbiB3aXRoIHByZXR0eSBvcHRpb25cbiAqIGFuZCBpbmRlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29uY2F0VmFsdWVzKFxuICBjb25jYXRUeXBlOiAnYXJyYXknIHwgJ29iamVjdCcsXG4gIHZhbHVlczogYW55LFxuICBwcmV0dHk6IGJvb2xlYW4sXG4gIGluZGVudGF0aW9uOiBzdHJpbmcsXG4gIGluZGVudExldmVsOiBudW1iZXIsXG4pIHtcbiAgY29uc3QgY3VycmVudEluZGVudCA9IGluZGVudGF0aW9uLnJlcGVhdChpbmRlbnRMZXZlbCk7XG4gIGNvbnN0IGNsb3NpbmdCcmFjZUluZGVudCA9IGluZGVudGF0aW9uLnJlcGVhdChpbmRlbnRMZXZlbCAtIDEpO1xuICBjb25zdCBqb2luID0gcHJldHR5ID8gYCxcXG4ke2N1cnJlbnRJbmRlbnR9YCA6ICcsICc7XG4gIGNvbnN0IG9wZW5pbmdCcmFjZSA9IGNvbmNhdFR5cGUgPT09ICdvYmplY3QnID8gJ3snIDogJ1snO1xuICBjb25zdCBjbG9zaW5nQnJhY2UgPSBjb25jYXRUeXBlID09PSAnb2JqZWN0JyA/ICd9JyA6ICddJztcblxuICBpZiAocHJldHR5KSB7XG4gICAgcmV0dXJuIGAke29wZW5pbmdCcmFjZX1cXG4ke2N1cnJlbnRJbmRlbnR9JHt2YWx1ZXMuam9pbihcbiAgICAgIGpvaW4sXG4gICAgKX1cXG4ke2Nsb3NpbmdCcmFjZUluZGVudH0ke2Nsb3NpbmdCcmFjZX1gO1xuICB9XG5cbiAgaWYgKGNvbmNhdFR5cGUgPT09ICdvYmplY3QnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke29wZW5pbmdCcmFjZX0gJHt2YWx1ZXMuam9pbihqb2luKX0gJHtjbG9zaW5nQnJhY2V9YDtcbiAgfVxuXG4gIHJldHVybiBgJHtvcGVuaW5nQnJhY2V9JHt2YWx1ZXMuam9pbihqb2luKX0ke2Nsb3NpbmdCcmFjZX1gO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHZhbGlkIFB5dGhvbiBzdHJpbmcgb2YgYSBsaXRlcmFsIHZhbHVlIGFjY29yZGluZyB0byBpdHMgdHlwZS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSBKYXZhU2NyaXB0IGxpdGVyYWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRhcmdldCBvcHRpb25zXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBsaXRlcmFsUmVwcmVzZW50YXRpb24gPSAoXG4gIHZhbHVlOiBhbnksXG4gIG9wdHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGluZGVudExldmVsPzogbnVtYmVyLFxuKTogYW55ID0+IHtcbiAgaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbCA9PT0gdW5kZWZpbmVkID8gMSA6IGluZGVudExldmVsICsgMTtcblxuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpIHtcbiAgICBjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgY2FzZSAnW29iamVjdCBBcnJheV0nOiB7XG4gICAgICBsZXQgcHJldHR5ID0gZmFsc2U7XG4gICAgICBjb25zdCB2YWx1ZXNSZXByZXNlbnRhdGlvbjogYW55ID0gKHZhbHVlIGFzIGFueVtdKS5tYXAodiA9PiB7XG4gICAgICAgIC8vIFN3aXRjaCB0byBwcmV0dGlmeSBpZiB0aGUgdmFsdWUgaXMgYSBkaWN0aW9uYXJ5IHdpdGggbXVsdGlwbGUga2V5c1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgIHByZXR0eSA9IE9iamVjdC5rZXlzKHYpLmxlbmd0aCA+IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpdGVyYWxSZXByZXNlbnRhdGlvbih2LCBvcHRzLCBpbmRlbnRMZXZlbCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb25jYXRWYWx1ZXMoJ2FycmF5JywgdmFsdWVzUmVwcmVzZW50YXRpb24sIHByZXR0eSwgb3B0cy5pbmRlbnQsIGluZGVudExldmVsKTtcbiAgICB9XG5cbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOiB7XG4gICAgICBjb25zdCBrZXlWYWx1ZVBhaXJzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBrZXlWYWx1ZVBhaXJzLnB1c2goYFwiJHtrZXl9XCI6ICR7bGl0ZXJhbFJlcHJlc2VudGF0aW9uKHZhbHVlW2tleV0sIG9wdHMsIGluZGVudExldmVsKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25jYXRWYWx1ZXMoXG4gICAgICAgICdvYmplY3QnLFxuICAgICAgICBrZXlWYWx1ZVBhaXJzLFxuICAgICAgICBvcHRzLnByZXR0eSAmJiBrZXlWYWx1ZVBhaXJzLmxlbmd0aCA+IDEsXG4gICAgICAgIG9wdHMuaW5kZW50LFxuICAgICAgICBpbmRlbnRMZXZlbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY2FzZSAnW29iamVjdCBOdWxsXSc6XG4gICAgICByZXR1cm4gJ05vbmUnO1xuXG4gICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG4gICAgICByZXR1cm4gdmFsdWUgPyAnVHJ1ZScgOiAnRmFsc2UnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgXCIke3ZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIG5hdGl2ZSBQeXRob24zLlxuICpcbiAqIEBhdXRob3JcbiAqIEBtb250YW5hZmx5bm5cbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBQeXRob24zT3B0aW9ucyB7XG4gIGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBweXRob24zOiBDbGllbnQ8UHl0aG9uM09wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncHl0aG9uMycsXG4gICAgdGl0bGU6ICdodHRwLmNsaWVudCcsXG4gICAgbGluazogJ2h0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9odHRwLmNsaWVudC5odG1sJyxcbiAgICBkZXNjcmlwdGlvbjogJ1B5dGhvbjMgSFRUUCBDbGllbnQnLFxuICB9LFxuICBjb252ZXJ0OiAoeyB1cmlPYmo6IHsgcGF0aCwgcHJvdG9jb2wsIGhvc3QgfSwgcG9zdERhdGEsIGFsbEhlYWRlcnMsIG1ldGhvZCB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGluc2VjdXJlU2tpcFZlcmlmeSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKCk7XG4gICAgLy8gU3RhcnQgUmVxdWVzdFxuICAgIHB1c2goJ2ltcG9ydCBodHRwLmNsaWVudCcpO1xuICAgIGlmIChpbnNlY3VyZVNraXBWZXJpZnkpIHtcbiAgICAgIHB1c2goJ2ltcG9ydCBzc2wnKTtcbiAgICB9XG4gICAgYmxhbmsoKTtcblxuICAgIC8vIENoZWNrIHdoaWNoIHByb3RvY29sIHRvIGJlIHVzZWQgZm9yIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgIGlmIChwcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgIGNvbnN0IHNzbENvbnRleHQgPSBpbnNlY3VyZVNraXBWZXJpZnkgPyAnLCBjb250ZXh0ID0gc3NsLl9jcmVhdGVfdW52ZXJpZmllZF9jb250ZXh0KCknIDogJyc7XG4gICAgICBwdXNoKGBjb25uID0gaHR0cC5jbGllbnQuSFRUUFNDb25uZWN0aW9uKFwiJHtob3N0fVwiJHtzc2xDb250ZXh0fSlgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goYGNvbm4gPSBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbihcIiR7aG9zdH1cIilgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHBheWxvYWQgc3RyaW5nIGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KTtcbiAgICBpZiAocGF5bG9hZCkge1xuICAgICAgcHVzaChgcGF5bG9hZCA9ICR7cGF5bG9hZH1gKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIEhlYWRlcnNcbiAgICBjb25zdCBoZWFkZXJzID0gYWxsSGVhZGVycztcbiAgICBjb25zdCBoZWFkZXJDb3VudCA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLmxlbmd0aDtcbiAgICBpZiAoaGVhZGVyQ291bnQgPT09IDEpIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgcHVzaChgaGVhZGVycyA9IHsgJyR7aGVhZGVyfSc6IFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoaGVhZGVyc1toZWFkZXJdKX1cIiB9YCk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkZXJDb3VudCA+IDEpIHtcbiAgICAgIGxldCBjb3VudCA9IDE7XG5cbiAgICAgIHB1c2goJ2hlYWRlcnMgPSB7Jyk7XG5cbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGNvdW50KysgIT09IGhlYWRlckNvdW50KSB7XG4gICAgICAgICAgcHVzaChgICAgICcke2hlYWRlcn0nOiBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGhlYWRlcnNbaGVhZGVyXSl9XCIsYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaChgICAgICcke2hlYWRlcn0nOiBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGhlYWRlcnNbaGVhZGVyXSl9XCJgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdXNoKCd9Jyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgUmVxdWVzdFxuICAgIGlmIChwYXlsb2FkICYmIGhlYWRlckNvdW50KSB7XG4gICAgICBwdXNoKGBjb25uLnJlcXVlc3QoXCIke21ldGhvZH1cIiwgXCIke3BhdGh9XCIsIHBheWxvYWQsIGhlYWRlcnMpYCk7XG4gICAgfSBlbHNlIGlmIChwYXlsb2FkICYmICFoZWFkZXJDb3VudCkge1xuICAgICAgcHVzaChgY29ubi5yZXF1ZXN0KFwiJHttZXRob2R9XCIsIFwiJHtwYXRofVwiLCBwYXlsb2FkKWApO1xuICAgIH0gZWxzZSBpZiAoIXBheWxvYWQgJiYgaGVhZGVyQ291bnQpIHtcbiAgICAgIHB1c2goYGNvbm4ucmVxdWVzdChcIiR7bWV0aG9kfVwiLCBcIiR7cGF0aH1cIiwgaGVhZGVycz1oZWFkZXJzKWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKGBjb25uLnJlcXVlc3QoXCIke21ldGhvZH1cIiwgXCIke3BhdGh9XCIpYCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IFJlc3BvbnNlXG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdyZXMgPSBjb25uLmdldHJlc3BvbnNlKCknKTtcbiAgICBwdXNoKCdkYXRhID0gcmVzLnJlYWQoKScpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgncHJpbnQoZGF0YS5kZWNvZGUoXCJ1dGYtOFwiKSknKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgUHl0aG9uIHVzaW5nIFJlcXVlc3RzXG4gKlxuICogQGF1dGhvclxuICogQG1vbnRhbmFmbHlublxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IGdldEhlYWRlck5hbWUgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBsaXRlcmFsUmVwcmVzZW50YXRpb24gfSBmcm9tICcuLi9oZWxwZXJzJztcblxuY29uc3QgYnVpbHRJbk1ldGhvZHMgPSBbJ0hFQUQnLCAnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURScsICdPUFRJT05TJ107XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdHNPcHRpb25zIHtcbiAgcHJldHR5PzogdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlcXVlc3RzOiBDbGllbnQ8UmVxdWVzdHNPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3JlcXVlc3RzJyxcbiAgICB0aXRsZTogJ1JlcXVlc3RzJyxcbiAgICBsaW5rOiAnaHR0cDovL2RvY3MucHl0aG9uLXJlcXVlc3RzLm9yZy9lbi9sYXRlc3QvYXBpLyNyZXF1ZXN0cy5yZXF1ZXN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIEhUVFAgbGlicmFyeScsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IHF1ZXJ5T2JqLCB1cmwsIHBvc3REYXRhLCBhbGxIZWFkZXJzLCBtZXRob2QgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICAgJyxcbiAgICAgIHByZXR0eTogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICAvLyBTdGFydCBzbmlwcGV0XG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIC8vIEltcG9ydCByZXF1ZXN0c1xuICAgIHB1c2goJ2ltcG9ydCByZXF1ZXN0cycpO1xuICAgIGJsYW5rKCk7XG5cbiAgICAvLyBTZXQgVVJMXG4gICAgcHVzaChgdXJsID0gXCIke3VybH1cImApO1xuICAgIGJsYW5rKCk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgcXVlcnkgc3RyaW5nXG4gICAgbGV0IHFzO1xuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeU9iaikubGVuZ3RoKSB7XG4gICAgICBxcyA9IGBxdWVyeXN0cmluZyA9ICR7SlNPTi5zdHJpbmdpZnkocXVlcnlPYmopfWA7XG5cbiAgICAgIHB1c2gocXMpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gYWxsSGVhZGVycztcblxuICAgIC8vIENvbnN0cnVjdCBwYXlsb2FkXG4gICAgbGV0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBmaWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgbGV0IGhhc0ZpbGVzID0gZmFsc2U7XG4gICAgbGV0IGhhc1BheWxvYWQgPSBmYWxzZTtcbiAgICBsZXQganNvblBheWxvYWQgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgICAgICBwdXNoKGBwYXlsb2FkID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24ocG9zdERhdGEuanNvbk9iaiwgb3B0cyl9YCk7XG4gICAgICAgICAganNvblBheWxvYWQgPSB0cnVlO1xuICAgICAgICAgIGhhc1BheWxvYWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgaWYgKCFwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7fTtcbiAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgaWYgKHAuZmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGZpbGVzW3AubmFtZV0gPSBgb3BlbignJHtwLmZpbGVOYW1lfScsICdyYicpYDtcbiAgICAgICAgICAgIGhhc0ZpbGVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZFtwLm5hbWVdID0gcC52YWx1ZTtcbiAgICAgICAgICAgIGhhc1BheWxvYWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGhhc0ZpbGVzKSB7XG4gICAgICAgICAgcHVzaChgZmlsZXMgPSAke2xpdGVyYWxSZXByZXNlbnRhdGlvbihmaWxlcywgb3B0cyl9YCk7XG5cbiAgICAgICAgICBpZiAoaGFzUGF5bG9hZCkge1xuICAgICAgICAgICAgcHVzaChgcGF5bG9hZCA9ICR7bGl0ZXJhbFJlcHJlc2VudGF0aW9uKHBheWxvYWQsIG9wdHMpfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRoZSByZXF1ZXN0cyBsaWJyYXJ5IHdpbGwgb25seSBhdXRvbWF0aWNhbGx5IGFkZCBhIGBtdWx0aXBhcnQvZm9ybS1kYXRhYCBoZWFkZXIgaWYgdGhlcmUgYXJlIGZpbGVzIGJlaW5nIHNlbnQuIElmIHdlJ3JlICoqb25seSoqIHNlbmRpbmcgZm9ybSBkYXRhIHdlIHN0aWxsIG5lZWQgdG8gc2VuZCB0aGUgYm91bmRhcnkgb3Vyc2VsdmVzLlxuICAgICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBnZXRIZWFkZXJOYW1lKGhlYWRlcnMsICdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vbkZpbGVQYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkocG9zdERhdGEudGV4dCk7XG4gICAgICAgICAgaWYgKG5vbkZpbGVQYXlsb2FkKSB7XG4gICAgICAgICAgICBwdXNoKGBwYXlsb2FkID0gJHtub25GaWxlUGF5bG9hZH1gKTtcbiAgICAgICAgICAgIGhhc1BheWxvYWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAocG9zdERhdGEubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnICYmIHBvc3REYXRhLnBhcmFtc09iaikge1xuICAgICAgICAgIHB1c2goYHBheWxvYWQgPSAke2xpdGVyYWxSZXByZXNlbnRhdGlvbihwb3N0RGF0YS5wYXJhbXNPYmosIG9wdHMpfWApO1xuICAgICAgICAgIGhhc1BheWxvYWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpO1xuICAgICAgICBpZiAocGF5bG9hZCkge1xuICAgICAgICAgIHB1c2goYHBheWxvYWQgPSAke3BheWxvYWR9YCk7XG4gICAgICAgICAgaGFzUGF5bG9hZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgaGVhZGVyc1xuICAgIGNvbnN0IGhlYWRlckNvdW50ID0gT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoO1xuXG4gICAgaWYgKGhlYWRlckNvdW50ID09PSAwICYmIChoYXNQYXlsb2FkIHx8IGhhc0ZpbGVzKSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgaGVhZHMgYnV0IHdlIGRvIGhhdmUgYSBwYXlsb2FkIHdlIHNob3VsZCBwdXQgYSBibGFuayBsaW5lIGhlcmUgYmV0d2VlbiB0aGF0IHBheWxvYWQgY29uc3R1cmN0aW9uIGFuZCBvdXIgZXhlY3V0aW9uIG9mIHRoZSByZXF1ZXN0cyBsaWJyYXJ5LlxuICAgICAgYmxhbmsoKTtcbiAgICB9IGVsc2UgaWYgKGhlYWRlckNvdW50ID09PSAxKSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIHB1c2goYGhlYWRlcnMgPSB7XCIke2hlYWRlcn1cIjogXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhoZWFkZXJzW2hlYWRlcl0pfVwifWApO1xuICAgICAgICBibGFuaygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVyQ291bnQgPiAxKSB7XG4gICAgICBsZXQgY291bnQgPSAxO1xuXG4gICAgICBwdXNoKCdoZWFkZXJzID0geycpO1xuXG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChjb3VudCAhPT0gaGVhZGVyQ291bnQpIHtcbiAgICAgICAgICBwdXNoKGBcIiR7aGVhZGVyfVwiOiBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGhlYWRlcnNbaGVhZGVyXSl9XCIsYCwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaChgXCIke2hlYWRlcn1cIjogXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhoZWFkZXJzW2hlYWRlcl0pfVwiYCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQgKz0gMTtcbiAgICAgIH1cblxuICAgICAgcHVzaCgnfScpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgcmVxdWVzdFxuICAgIGxldCByZXF1ZXN0ID0gYnVpbHRJbk1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKVxuICAgICAgPyBgcmVzcG9uc2UgPSByZXF1ZXN0cy4ke21ldGhvZC50b0xvd2VyQ2FzZSgpfSh1cmxgXG4gICAgICA6IGByZXNwb25zZSA9IHJlcXVlc3RzLnJlcXVlc3QoXCIke21ldGhvZH1cIiwgdXJsYDtcblxuICAgIGlmIChoYXNQYXlsb2FkKSB7XG4gICAgICBpZiAoanNvblBheWxvYWQpIHtcbiAgICAgICAgcmVxdWVzdCArPSAnLCBqc29uPXBheWxvYWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWVzdCArPSAnLCBkYXRhPXBheWxvYWQnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNGaWxlcykge1xuICAgICAgcmVxdWVzdCArPSAnLCBmaWxlcz1maWxlcyc7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlckNvdW50ID4gMCkge1xuICAgICAgcmVxdWVzdCArPSAnLCBoZWFkZXJzPWhlYWRlcnMnO1xuICAgIH1cblxuICAgIGlmIChxcykge1xuICAgICAgcmVxdWVzdCArPSAnLCBwYXJhbXM9cXVlcnlzdHJpbmcnO1xuICAgIH1cblxuICAgIHJlcXVlc3QgKz0gJyknO1xuXG4gICAgcHVzaChyZXF1ZXN0KTtcbiAgICBibGFuaygpO1xuXG4gICAgLy8gUHJpbnQgcmVzcG9uc2VcbiAgICBwdXNoKCdwcmludChyZXNwb25zZS5qc29uKCkpJyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgcHl0aG9uMyB9IGZyb20gJy4vcHl0aG9uMy9jbGllbnQnO1xuaW1wb3J0IHsgcmVxdWVzdHMgfSBmcm9tICcuL3JlcXVlc3RzL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBweXRob246IFRhcmdldCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3B5dGhvbicsXG4gICAgdGl0bGU6ICdQeXRob24nLFxuICAgIGV4dG5hbWU6ICcucHknLFxuICAgIGRlZmF1bHQ6ICdweXRob24zJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBweXRob24zLFxuICAgIHJlcXVlc3RzLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIFIgdXNpbmcgaHR0clxuICpcbiAqIEBhdXRob3JcbiAqIEBnYWJyaWVsYWtvcmVlZGFcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBIdHRyT3B0aW9ucyB7XG4gIC8qKiBAZGVmYXVsdCAnICAnICovXG4gIGluZGVudD86IHN0cmluZztcbn1cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMsIGVzY2FwZUZvclNpbmdsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IGdldEhlYWRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IGh0dHI6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2h0dHInLFxuICAgIHRpdGxlOiAnaHR0cicsXG4gICAgbGluazogJ2h0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9odHRyL3ZpZ25ldHRlcy9xdWlja3N0YXJ0Lmh0bWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnaHR0cjogVG9vbHMgZm9yIFdvcmtpbmcgd2l0aCBVUkxzIGFuZCBIVFRQJyxcbiAgfSxcbiAgY29udmVydDogKHsgdXJsLCBxdWVyeU9iaiwgcXVlcnlTdHJpbmcsIHBvc3REYXRhLCBhbGxIZWFkZXJzLCBtZXRob2QgfSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLy8gU3RhcnQgc25pcHBldFxuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7XG4gICAgICBpbmRlbnQ6IG9wdGlvbnMuaW5kZW50ID8/ICcgICcsXG4gICAgfSk7XG5cbiAgICAvLyBJbXBvcnQgaHR0clxuICAgIHB1c2goJ2xpYnJhcnkoaHR0ciknKTtcbiAgICBibGFuaygpO1xuXG4gICAgLy8gU2V0IFVSTFxuICAgIHB1c2goYHVybCA8LSBcIiR7dXJsfVwiYCk7XG4gICAgYmxhbmsoKTtcblxuICAgIC8vIENvbnN0cnVjdCBxdWVyeSBzdHJpbmdcbiAgICBjb25zdCBxcyA9IHF1ZXJ5T2JqO1xuICAgIGRlbGV0ZSBxdWVyeU9iai5rZXk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocXMpO1xuICAgIGNvbnN0IGVudHJpZXNDb3VudCA9IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgaWYgKGVudHJpZXNDb3VudCA9PT0gMSkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgcHVzaChgcXVlcnlTdHJpbmcgPC0gbGlzdCgke2VudHJ5WzBdfSA9IFwiJHtlbnRyeVsxXX1cIilgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfSBlbHNlIGlmIChlbnRyaWVzQ291bnQgPiAxKSB7XG4gICAgICBwdXNoKCdxdWVyeVN0cmluZyA8LSBsaXN0KCcpO1xuXG4gICAgICBlbnRyaWVzLmZvckVhY2goKFtrZXksIHZhbHVlXSwgaSkgPT4ge1xuICAgICAgICBjb25zdCBpc0xhc3RJdGVtID0gaSAhPT0gZW50cmllc0NvdW50IC0gMTtcbiAgICAgICAgY29uc3QgbWF5YmVDb21tYSA9IGlzTGFzdEl0ZW0gPyAnLCcgOiAnJztcbiAgICAgICAgcHVzaChgJHtrZXl9ID0gXCIke3ZhbHVlfVwiJHttYXliZUNvbW1hfWAsIDEpO1xuICAgICAgfSk7XG5cbiAgICAgIHB1c2goJyknKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHBheWxvYWRcbiAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkocG9zdERhdGEudGV4dCk7XG5cbiAgICBpZiAocGF5bG9hZCkge1xuICAgICAgcHVzaChgcGF5bG9hZCA8LSAke3BheWxvYWR9YCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSBlbmNvZGVcbiAgICBpZiAocG9zdERhdGEudGV4dCB8fCBwb3N0RGF0YS5qc29uT2JqIHx8IHBvc3REYXRhLnBhcmFtcykge1xuICAgICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICAgIHB1c2goJ2VuY29kZSA8LSBcImZvcm1cIicpO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgICAgcHVzaCgnZW5jb2RlIDwtIFwianNvblwiJyk7XG4gICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgICBwdXNoKCdlbmNvZGUgPC0gXCJtdWx0aXBhcnRcIicpO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBwdXNoKCdlbmNvZGUgPC0gXCJyYXdcIicpO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IGhlYWRlcnNcbiAgICBjb25zdCBjb29raWVIZWFkZXIgPSBnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2Nvb2tpZScpO1xuICAgIGxldCBhY2NlcHRIZWFkZXIgPSBnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2FjY2VwdCcpO1xuXG4gICAgY29uc3Qgc2V0Q29va2llcyA9IGNvb2tpZUhlYWRlclxuICAgICAgPyBgc2V0X2Nvb2tpZXMoXFxgJHtTdHJpbmcoY29va2llSGVhZGVyKVxuICAgICAgICAgIC5yZXBsYWNlKC87L2csICdcIiwgYCcpXG4gICAgICAgICAgLnJlcGxhY2UoL2AgL2csICdgJylcbiAgICAgICAgICAucmVwbGFjZSgvWz1dL2csICdgID0gXCInKVxuICAgICAgICB9XCIpYFxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGNvbnN0IHNldEFjY2VwdCA9IGFjY2VwdEhlYWRlclxuICAgICAgPyBgYWNjZXB0KFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoYWNjZXB0SGVhZGVyKX1cIilgXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3Qgc2V0Q29udGVudFR5cGUgPSBgY29udGVudF90eXBlKFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMocG9zdERhdGEubWltZVR5cGUpfVwiKWBcblxuICAgIGNvbnN0IG90aGVySGVhZGVycyA9IE9iamVjdC5lbnRyaWVzKGFsbEhlYWRlcnMpXG4gICAgICAvLyBUaGVzZSBoZWFkZXJzIGFyZSBhbGwgaGFuZGxlZCBzZXBhcmF0ZWx5OlxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFbJ2Nvb2tpZScsICdhY2NlcHQnLCAnY29udGVudC10eXBlJ10uaW5jbHVkZXMoa2V5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJyR7a2V5fScgPSAnJHtlc2NhcGVGb3JTaW5nbGVRdW90ZXModmFsdWUpfSdgKVxuICAgICAgLmpvaW4oJywgJylcblxuICAgIGNvbnN0IHNldEhlYWRlcnMgPSBvdGhlckhlYWRlcnNcbiAgICAgID8gYGFkZF9oZWFkZXJzKCR7b3RoZXJIZWFkZXJzfSlgXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgLy8gQ29uc3RydWN0IHJlcXVlc3RcbiAgICBsZXQgcmVxdWVzdCA9IGByZXNwb25zZSA8LSBWRVJCKFwiJHttZXRob2R9XCIsIHVybGA7XG5cbiAgICBpZiAocGF5bG9hZCkge1xuICAgICAgcmVxdWVzdCArPSAnLCBib2R5ID0gcGF5bG9hZCc7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5U3RyaW5nLmxlbmd0aCkge1xuICAgICAgcmVxdWVzdCArPSAnLCBxdWVyeSA9IHF1ZXJ5U3RyaW5nJztcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJBZGRpdGlvbnMgPSBbc2V0SGVhZGVycywgc2V0Q29udGVudFR5cGUsIHNldEFjY2VwdCwgc2V0Q29va2llc10uZmlsdGVyKHggPT4gISF4KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKGhlYWRlckFkZGl0aW9ucykge1xuICAgICAgcmVxdWVzdCArPSAnLCAnICsgaGVhZGVyQWRkaXRpb25zXG4gICAgfVxuXG4gICAgaWYgKHBvc3REYXRhLnRleHQgfHwgcG9zdERhdGEuanNvbk9iaiB8fCBwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgIHJlcXVlc3QgKz0gJywgZW5jb2RlID0gZW5jb2RlJztcbiAgICB9XG5cbiAgICByZXF1ZXN0ICs9ICcpJztcblxuICAgIHB1c2gocmVxdWVzdCk7XG5cbiAgICBibGFuaygpO1xuICAgIC8vIFByaW50IHJlc3BvbnNlXG4gICAgcHVzaCgnY29udGVudChyZXNwb25zZSwgXCJ0ZXh0XCIpJyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgaHR0ciB9IGZyb20gJy4vaHR0ci9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgcjogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncicsXG4gICAgdGl0bGU6ICdSJyxcbiAgICBleHRuYW1lOiAnLnInLFxuICAgIGRlZmF1bHQ6ICdodHRyJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBodHRyLFxuICB9LFxufTtcbiIsImltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yU2luZ2xlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVieU5hdGl2ZU9wdGlvbnMge1xuICBpbnNlY3VyZVNraXBWZXJpZnk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgbmF0aXZlOiBDbGllbnQ8UnVieU5hdGl2ZU9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnbmF0aXZlJyxcbiAgICB0aXRsZTogJ25ldDo6aHR0cCcsXG4gICAgbGluazogJ2h0dHA6Ly9ydWJ5LWRvYy5vcmcvc3RkbGliLTIuMi4xL2xpYmRvYy9uZXQvaHR0cC9yZG9jL05ldC9IVFRQLmh0bWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnUnVieSBIVFRQIGNsaWVudCcsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IHVyaU9iaiwgbWV0aG9kOiByYXdNZXRob2QsIGZ1bGxVcmwsIHBvc3REYXRhLCBhbGxIZWFkZXJzIH0sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgaW5zZWN1cmVTa2lwVmVyaWZ5ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoKTtcblxuICAgIHB1c2goXCJyZXF1aXJlICd1cmknXCIpO1xuICAgIHB1c2goXCJyZXF1aXJlICduZXQvaHR0cCdcIik7XG4gICAgYmxhbmsoKTtcblxuICAgIC8vIFRvIHN1cHBvcnQgY3VzdG9tIG1ldGhvZHMgd2UgY2hlY2sgZm9yIHRoZSBzdXBwb3J0ZWQgbWV0aG9kc1xuICAgIC8vIGFuZCBpZiBkb2Vzbid0IGV4aXN0IHRoZW4gd2UgYnVpbGQgYSBjdXN0b20gY2xhc3MgZm9yIGl0XG4gICAgY29uc3QgbWV0aG9kID0gcmF3TWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgbWV0aG9kcyA9IFtcbiAgICAgICdHRVQnLFxuICAgICAgJ1BPU1QnLFxuICAgICAgJ0hFQUQnLFxuICAgICAgJ0RFTEVURScsXG4gICAgICAnUEFUQ0gnLFxuICAgICAgJ1BVVCcsXG4gICAgICAnT1BUSU9OUycsXG4gICAgICAnQ09QWScsXG4gICAgICAnTE9DSycsXG4gICAgICAnVU5MT0NLJyxcbiAgICAgICdNT1ZFJyxcbiAgICAgICdUUkFDRScsXG4gICAgXTtcbiAgICBjb25zdCBjYXBNZXRob2QgPSBtZXRob2QuY2hhckF0KDApICsgbWV0aG9kLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICBwdXNoKGBjbGFzcyBOZXQ6OkhUVFA6OiR7Y2FwTWV0aG9kfSA8IE5ldDo6SFRUUFJlcXVlc3RgKTtcbiAgICAgIHB1c2goYCAgTUVUSE9EID0gJyR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9J2ApO1xuICAgICAgcHVzaChgICBSRVFVRVNUX0hBU19CT0RZID0gJyR7cG9zdERhdGEudGV4dCA/ICd0cnVlJyA6ICdmYWxzZSd9J2ApO1xuICAgICAgcHVzaCgnICBSRVNQT05TRV9IQVNfQk9EWSA9IHRydWUnKTtcbiAgICAgIHB1c2goJ2VuZCcpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBwdXNoKGB1cmwgPSBVUkkoXCIke2Z1bGxVcmx9XCIpYCk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdodHRwID0gTmV0OjpIVFRQLm5ldyh1cmwuaG9zdCwgdXJsLnBvcnQpJyk7XG5cbiAgICBpZiAodXJpT2JqLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgcHVzaCgnaHR0cC51c2Vfc3NsID0gdHJ1ZScpO1xuICAgICAgaWYgKGluc2VjdXJlU2tpcFZlcmlmeSkge1xuICAgICAgICBwdXNoKCdodHRwLnZlcmlmeV9tb2RlID0gT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGJsYW5rKCk7XG4gICAgcHVzaChgcmVxdWVzdCA9IE5ldDo6SFRUUDo6JHtjYXBNZXRob2R9Lm5ldyh1cmwpYCk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoYWxsSGVhZGVycyk7XG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgcHVzaChgcmVxdWVzdFtcIiR7a2V5fVwiXSA9ICcke2VzY2FwZUZvclNpbmdsZVF1b3RlcyhhbGxIZWFkZXJzW2tleV0pfSdgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBwdXNoKGByZXF1ZXN0LmJvZHkgPSAke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpfWApO1xuICAgIH1cblxuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgncmVzcG9uc2UgPSBodHRwLnJlcXVlc3QocmVxdWVzdCknKTtcbiAgICBwdXNoKCdwdXRzIHJlc3BvbnNlLnJlYWRfYm9keScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IG5hdGl2ZSB9IGZyb20gJy4vbmF0aXZlL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBydWJ5OiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdydWJ5JyxcbiAgICB0aXRsZTogJ1J1YnknLFxuICAgIGV4dG5hbWU6ICcucmInLFxuICAgIGRlZmF1bHQ6ICduYXRpdmUnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIG5hdGl2ZSxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgdGhlIFNoZWxsIHVzaW5nIGNVUkwuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGVyLCBnZXRIZWFkZXJOYW1lLCBpc01pbWVUeXBlSlNPTiB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBxdW90ZSB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvc2hlbGwnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VybE9wdGlvbnMge1xuICBiaW5hcnk/OiBib29sZWFuO1xuICBnbG9iT2ZmPzogYm9vbGVhbjtcbiAgaW5kZW50Pzogc3RyaW5nIHwgZmFsc2U7XG4gIGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG4gIHByZXR0aWZ5SnNvbj86IGJvb2xlYW47XG4gIHNob3J0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGEgY29uc3QgcmVjb3JkIHdpdGgga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGxvbmcgbmFtZXMgYW5kIHZhbHVlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNob3J0IG5hbWVzIGZvciBjVVJMIGFyZ3VtZW50cy5cbiAqL1xuY29uc3QgcGFyYW1zID0ge1xuICAnaHR0cDEuMCc6ICcwJyxcbiAgJ3VybCAnOiAnJyxcbiAgY29va2llOiAnYicsXG4gIGRhdGE6ICdkJyxcbiAgZm9ybTogJ0YnLFxuICBnbG9ib2ZmOiAnZycsXG4gIGhlYWRlcjogJ0gnLFxuICBpbnNlY3VyZTogJ2snLFxuICByZXF1ZXN0OiAnWCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBnZXRBcmcgPSAoc2hvcnQ6IGJvb2xlYW4pID0+IChsb25nTmFtZToga2V5b2YgdHlwZW9mIHBhcmFtcykgPT4ge1xuICBpZiAoc2hvcnQpIHtcbiAgICBjb25zdCBzaG9ydE5hbWUgPSBwYXJhbXNbbG9uZ05hbWVdO1xuICAgIGlmICghc2hvcnROYW1lKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgLSR7c2hvcnROYW1lfWA7XG4gIH1cbiAgcmV0dXJuIGAtLSR7bG9uZ05hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBjdXJsOiBDbGllbnQ8Q3VybE9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnY3VybCcsXG4gICAgdGl0bGU6ICdjVVJMJyxcbiAgICBsaW5rOiAnaHR0cDovL2N1cmwuaGF4eC5zZS8nLFxuICAgIGRlc2NyaXB0aW9uOiAnY1VSTCBpcyBhIGNvbW1hbmQgbGluZSB0b29sIGFuZCBsaWJyYXJ5IGZvciB0cmFuc2ZlcnJpbmcgZGF0YSB3aXRoIFVSTCBzeW50YXgnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBmdWxsVXJsLCBtZXRob2QsIGh0dHBWZXJzaW9uLCBoZWFkZXJzT2JqLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBiaW5hcnkgPSBmYWxzZSxcbiAgICAgIGdsb2JPZmYgPSBmYWxzZSxcbiAgICAgIGluZGVudCA9ICcgICcsXG4gICAgICBpbnNlY3VyZVNraXBWZXJpZnkgPSBmYWxzZSxcbiAgICAgIHByZXR0aWZ5SnNvbiA9IGZhbHNlLFxuICAgICAgc2hvcnQgPSBmYWxzZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHsgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHtcbiAgICAgIC4uLih0eXBlb2YgaW5kZW50ID09PSAnc3RyaW5nJyA/IHsgaW5kZW50OiBpbmRlbnQgfSA6IHt9KSxcbiAgICAgIGpvaW46IGluZGVudCAhPT0gZmFsc2UgPyBgIFxcXFxcXG4ke2luZGVudH1gIDogJyAnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXJnID0gZ2V0QXJnKHNob3J0KTtcblxuICAgIGxldCBmb3JtYXR0ZWRVcmwgPSBxdW90ZShmdWxsVXJsKTtcblxuICAgIHB1c2goYGN1cmwgJHthcmcoJ3JlcXVlc3QnKX0gJHttZXRob2R9YCk7XG4gICAgaWYgKGdsb2JPZmYpIHtcbiAgICAgIGZvcm1hdHRlZFVybCA9IHVuZXNjYXBlKGZvcm1hdHRlZFVybCk7XG4gICAgICBwdXNoKGFyZygnZ2xvYm9mZicpKTtcbiAgICB9XG4gICAgcHVzaChgJHthcmcoJ3VybCAnKX0ke2Zvcm1hdHRlZFVybH1gKTtcblxuICAgIGlmIChpbnNlY3VyZVNraXBWZXJpZnkpIHtcbiAgICAgIHB1c2goYXJnKCdpbnNlY3VyZScpKTtcbiAgICB9XG5cbiAgICBpZiAoaHR0cFZlcnNpb24gPT09ICdIVFRQLzEuMCcpIHtcbiAgICAgIHB1c2goYXJnKCdodHRwMS4wJykpO1xuICAgIH1cblxuICAgIGlmIChnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2FjY2VwdC1lbmNvZGluZycpKSB7XG4gICAgICAvLyBub3RlOiB0aGVyZSBpcyBubyBzaG9ydGhhbmQgZm9yIHRoaXMgY1VSTCBvcHRpb25cbiAgICAgIHB1c2goJy0tY29tcHJlc3NlZCcpO1xuICAgIH1cblxuICAgIC8vIGlmIG11bHRpcGFydCBmb3JtIGRhdGEsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBib3VuZGFyeVxuICAgIGlmIChwb3N0RGF0YS5taW1lVHlwZSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKSB7XG4gICAgICBjb25zdCBjb250ZW50VHlwZUhlYWRlck5hbWUgPSBnZXRIZWFkZXJOYW1lKGhlYWRlcnNPYmosICdjb250ZW50LXR5cGUnKTtcbiAgICAgIGlmIChjb250ZW50VHlwZUhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGVIZWFkZXIgPSBoZWFkZXJzT2JqW2NvbnRlbnRUeXBlSGVhZGVyTmFtZV07XG4gICAgICAgIGlmIChjb250ZW50VHlwZUhlYWRlck5hbWUgJiYgY29udGVudFR5cGVIZWFkZXIpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGxlYWRpbmcgc2VtaSBjb2xvbiBhbmQgYm91bmRhcnlcbiAgICAgICAgICAvLyB1cCB0byB0aGUgbmV4dCBzZW1pIGNvbG9uIG9yIHRoZSBlbmQgb2Ygc3RyaW5nXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpdCBpcyBhIHJlYWxpdHkgdGhhdCB0aGUgaGVhZGVyc09iaiBjYW4gaGF2ZSB2YWx1ZXMgd2hpY2ggYXJlIHN0cmluZyBhcnJheXMuICBUaGlzIGlzIGEgZ2VudWluZSBidWcgdGhhdCB0aGlzIGNhc2UgaXNuJ3QgaGFuZGxlZCBvciB0ZXN0ZWQuICBJdCBpcywgaG93ZXZlciB0ZXN0ZWQgaW4gYHJlZHVjZXIudGVzdC50c2AuICBHbyBjaGVjayB0aGF0IG91dCB0byBzZWUgbW9yZS5cbiAgICAgICAgICBjb25zdCBub0JvdW5kYXJ5ID0gY29udGVudFR5cGVIZWFkZXIucmVwbGFjZSgvOyBib3VuZGFyeS4rPyg/PSg7fCQpKS8sICcnKTtcblxuICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIgd2l0aCBubyBib3VuZGFyeSBpbiBib3RoIGhlYWRlcnNPYmogYW5kIGFsbEhlYWRlcnNcbiAgICAgICAgICBoZWFkZXJzT2JqW2NvbnRlbnRUeXBlSGVhZGVyTmFtZV0gPSBub0JvdW5kYXJ5O1xuICAgICAgICAgIGFsbEhlYWRlcnNbY29udGVudFR5cGVIZWFkZXJOYW1lXSA9IG5vQm91bmRhcnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgaGVhZGVyc1xuICAgIE9iamVjdC5rZXlzKGhlYWRlcnNPYmopXG4gICAgICAuc29ydCgpXG4gICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBgJHtrZXl9OiAke2hlYWRlcnNPYmpba2V5XX1gO1xuICAgICAgICBwdXNoKGAke2FyZygnaGVhZGVyJyl9ICR7cXVvdGUoaGVhZGVyKX1gKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGFsbEhlYWRlcnMuY29va2llKSB7XG4gICAgICBwdXNoKGAke2FyZygnY29va2llJyl9ICR7cXVvdGUoYWxsSGVhZGVycy5jb29raWUgYXMgc3RyaW5nKX1gKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgcG9zdCBwYXJhbXNcbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgcG9zdERhdGEucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBsZXQgcG9zdCA9ICcnO1xuICAgICAgICAgIGlmIChwYXJhbS5maWxlTmFtZSkge1xuICAgICAgICAgICAgcG9zdCA9IGAke3BhcmFtLm5hbWV9PUAke3BhcmFtLmZpbGVOYW1lfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc3QgPSBgJHtwYXJhbS5uYW1lfT0ke3BhcmFtLnZhbHVlfWA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaChgJHthcmcoJ2Zvcm0nKX0gJHtxdW90ZShwb3N0KX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICBpZiAocG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5lbmNvZGVkID0gcGFyYW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBuZWVkc0VuY29kaW5nID0gZW5jb2RlZCAhPT0gdW5lbmNvZGVkO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5lZWRzRW5jb2RpbmcgPyBlbmNvZGVkIDogdW5lbmNvZGVkO1xuICAgICAgICAgICAgY29uc3QgZmxhZyA9IGJpbmFyeSA/ICctLWRhdGEtYmluYXJ5JyA6IGAtLWRhdGEke25lZWRzRW5jb2RpbmcgPyAnLXVybGVuY29kZScgOiAnJ31gO1xuICAgICAgICAgICAgcHVzaChgJHtmbGFnfSAke3F1b3RlKGAke25hbWV9PSR7cGFyYW0udmFsdWV9YCl9YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaChgJHtiaW5hcnkgPyAnLS1kYXRhLWJpbmFyeScgOiBhcmcoJ2RhdGEnKX0gJHtxdW90ZShwb3N0RGF0YS50ZXh0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyByYXcgcmVxdWVzdCBib2R5XG4gICAgICAgIGlmICghcG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmxhZyA9IGJpbmFyeSA/ICctLWRhdGEtYmluYXJ5JyA6IGFyZygnZGF0YScpO1xuXG4gICAgICAgIGxldCBidWlsdFBheWxvYWQgPSBmYWxzZTtcbiAgICAgICAgLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgSlNPTiB2YXJpYW50LCBhbmQgb3VyIHBheWxvYWQgaXMgSlNPTiBsZXQncyBtYWtlIGl0IGxvb2sgYSBsaXR0bGUgbmljZXIuXG4gICAgICAgIGlmIChpc01pbWVUeXBlSlNPTihwb3N0RGF0YS5taW1lVHlwZSkpIHtcbiAgICAgICAgICAvLyBJZiBvdXIgcG9zdERhdGEgaXMgbGVzcyB0aGFuIDIwIGNoYXJhY3RlcnMsIGxldCdzIGtlZXAgaXQgYWxsIG9uIG9uZSBsaW5lIHNvIGFzIHRvIG5vdCBtYWtlIHRoZSBzbmlwcGV0IG92ZXJseSBsZW5ndGh5LlxuICAgICAgICAgIGNvbnN0IGNvdWxkQmVKU09OID0gcG9zdERhdGEudGV4dC5sZW5ndGggPiAyO1xuICAgICAgICAgIGlmIChjb3VsZEJlSlNPTiAmJiBwcmV0dGlmeUpzb24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGpzb25QYXlsb2FkID0gSlNPTi5wYXJzZShwb3N0RGF0YS50ZXh0KTtcblxuICAgICAgICAgICAgICAvLyBJZiB0aGUgSlNPTiBvYmplY3QgaGFzIGEgc2luZ2xlIHF1b3RlIHdlIHNob3VsZCBwcmVwYXJlIGl0IGluc2lkZSBvZiBhIEhFUkVET0MgYmVjYXVzZSB0aGUgc2luZ2xlIHF1b3RlIGluIHNvbWV0aGluZyBsaWtlIGBzdHJpbmcnc2AgY2FuJ3QgYmUgZXNjYXBlZCB3aGVuIHVzZWQgd2l0aCBgLS1kYXRhYC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gQmFzaWNhbGx5IHRoaXMgYm9pbHMgZG93biB0byBgLS1kYXRhIEAtIDw8RU9GLi4uRU9GYCB2cyBgLS1kYXRhICcuLi4nYC5cbiAgICAgICAgICAgICAgYnVpbHRQYXlsb2FkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoanNvblBheWxvYWQsIHVuZGVmaW5lZCwgaW5kZW50IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgIGlmIChwb3N0RGF0YS50ZXh0LmluZGV4T2YoXCInXCIpID4gMCkge1xuICAgICAgICAgICAgICAgIHB1c2goYCR7ZmxhZ30gQC0gPDxFT0ZcXG4ke3BheWxvYWR9XFxuRU9GYCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaChgJHtmbGFnfSAnXFxuJHtwYXlsb2FkfVxcbidgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIG5vLW9wXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFidWlsdFBheWxvYWQpIHtcbiAgICAgICAgICBwdXNoKGAke2ZsYWd9ICR7cXVvdGUocG9zdERhdGEudGV4dCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIHRoZSBTaGVsbCB1c2luZyBIVFRQaWUuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgcXVvdGUgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL3NoZWxsJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBpZU9wdGlvbnMge1xuICBib2R5PzogYm9vbGVhbjtcbiAgY2VydD86IGJvb2xlYW47XG4gIGhlYWRlcnM/OiBib29sZWFuO1xuICBwcmV0dHk/OiBib29sZWFuO1xuICBwcmludD86IGJvb2xlYW47XG4gIHF1ZXJ5UGFyYW1zPzogYm9vbGVhbjtcbiAgc2hvcnQ/OiBib29sZWFuO1xuICBzdHlsZT86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgdmVyaWZ5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBpZTogQ2xpZW50PEh0dHBpZU9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnaHR0cGllJyxcbiAgICB0aXRsZTogJ0hUVFBpZScsXG4gICAgbGluazogJ2h0dHA6Ly9odHRwaWUub3JnLycsXG4gICAgZGVzY3JpcHRpb246ICdhIENMSSwgY1VSTC1saWtlIHRvb2wgZm9yIGh1bWFucycsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IGFsbEhlYWRlcnMsIHBvc3REYXRhLCBxdWVyeU9iaiwgZnVsbFVybCwgbWV0aG9kLCB1cmwgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBib2R5OiBmYWxzZSxcbiAgICAgIGNlcnQ6IGZhbHNlLFxuICAgICAgaGVhZGVyczogZmFsc2UsXG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICBwcmV0dHk6IGZhbHNlLFxuICAgICAgcHJpbnQ6IGZhbHNlLFxuICAgICAgcXVlcnlQYXJhbXM6IGZhbHNlLFxuICAgICAgc2hvcnQ6IGZhbHNlLFxuICAgICAgc3R5bGU6IGZhbHNlLFxuICAgICAgdGltZW91dDogZmFsc2UsXG4gICAgICB2ZXJib3NlOiBmYWxzZSxcbiAgICAgIHZlcmlmeTogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCB7IHB1c2gsIGpvaW4sIHVuc2hpZnQgfSA9IG5ldyBDb2RlQnVpbGRlcih7XG4gICAgICBpbmRlbnQ6IG9wdHMuaW5kZW50LFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBTRUVNUyBMRUdJVFxuICAgICAgam9pbjogb3B0cy5pbmRlbnQgIT09IGZhbHNlID8gYCBcXFxcXFxuJHtvcHRzLmluZGVudH1gIDogJyAnLFxuICAgIH0pO1xuXG4gICAgbGV0IHJhdyA9IGZhbHNlO1xuICAgIGNvbnN0IGZsYWdzID0gW107XG5cbiAgICBpZiAob3B0cy5oZWFkZXJzKSB7XG4gICAgICBmbGFncy5wdXNoKG9wdHMuc2hvcnQgPyAnLWgnIDogJy0taGVhZGVycycpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmJvZHkpIHtcbiAgICAgIGZsYWdzLnB1c2gob3B0cy5zaG9ydCA/ICctYicgOiAnLS1ib2R5Jyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMudmVyYm9zZSkge1xuICAgICAgZmxhZ3MucHVzaChvcHRzLnNob3J0ID8gJy12JyA6ICctLXZlcmJvc2UnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5wcmludCkge1xuICAgICAgZmxhZ3MucHVzaChgJHtvcHRzLnNob3J0ID8gJy1wJyA6ICctLXByaW50J309JHtvcHRzLnByaW50fWApO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnZlcmlmeSkge1xuICAgICAgZmxhZ3MucHVzaChgLS12ZXJpZnk9JHtvcHRzLnZlcmlmeX1gKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jZXJ0KSB7XG4gICAgICBmbGFncy5wdXNoKGAtLWNlcnQ9JHtvcHRzLmNlcnR9YCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucHJldHR5KSB7XG4gICAgICBmbGFncy5wdXNoKGAtLXByZXR0eT0ke29wdHMucHJldHR5fWApO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnN0eWxlKSB7XG4gICAgICBmbGFncy5wdXNoKGAtLXN0eWxlPSR7b3B0cy5zdHlsZX1gKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy50aW1lb3V0KSB7XG4gICAgICBmbGFncy5wdXNoKGAtLXRpbWVvdXQ9JHtvcHRzLnRpbWVvdXR9YCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IHF1ZXJ5IHBhcmFtc1xuICAgIGlmIChvcHRzLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICBPYmplY3Qua2V5cyhxdWVyeU9iaikuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBxdWVyeU9ialtuYW1lXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICBwdXNoKGAke25hbWV9PT0ke3F1b3RlKHZhbCl9YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaChgJHtuYW1lfT09JHtxdW90ZSh2YWx1ZSl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBoZWFkZXJzXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycylcbiAgICAgIC5zb3J0KClcbiAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHB1c2goYCR7a2V5fToke3F1b3RlKGFsbEhlYWRlcnNba2V5XSBhcyBzdHJpbmcpfWApO1xuICAgICAgfSk7XG5cbiAgICBpZiAocG9zdERhdGEubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICAvLyBjb25zdHJ1Y3QgcG9zdCBwYXJhbXNcbiAgICAgIGlmIChwb3N0RGF0YS5wYXJhbXMgJiYgcG9zdERhdGEucGFyYW1zLmxlbmd0aCkge1xuICAgICAgICBmbGFncy5wdXNoKG9wdHMuc2hvcnQgPyAnLWYnIDogJy0tZm9ybScpO1xuXG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBwdXNoKGAke3BhcmFtLm5hbWV9PSR7cXVvdGUocGFyYW0udmFsdWUpfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmF3ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjbGlGbGFncyA9IGZsYWdzLmxlbmd0aCA/IGAke2ZsYWdzLmpvaW4oJyAnKX0gYCA6ICcnO1xuICAgIHVybCA9IHF1b3RlKG9wdHMucXVlcnlQYXJhbXMgPyB1cmwgOiBmdWxsVXJsKTtcbiAgICB1bnNoaWZ0KGBodHRwICR7Y2xpRmxhZ3N9JHttZXRob2R9ICR7dXJsfWApO1xuXG4gICAgaWYgKHJhdyAmJiBwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBjb25zdCBwb3N0RGF0YVRleHQgPSBxdW90ZShwb3N0RGF0YS50ZXh0KTtcbiAgICAgIHVuc2hpZnQoYGVjaG8gJHtwb3N0RGF0YVRleHR9IHwgYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IGN1cmwgfSBmcm9tICcuL2N1cmwvY2xpZW50JztcbmltcG9ydCB7IGh0dHBpZSB9IGZyb20gJy4vaHR0cGllL2NsaWVudCc7XG5pbXBvcnQgeyB3Z2V0IH0gZnJvbSAnLi93Z2V0L2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBzaGVsbDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnc2hlbGwnLFxuICAgIHRpdGxlOiAnU2hlbGwnLFxuICAgIGV4dG5hbWU6ICcuc2gnLFxuICAgIGRlZmF1bHQ6ICdjdXJsJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBjdXJsLFxuICAgIGh0dHBpZSxcbiAgICB3Z2V0LFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIHRoZSBTaGVsbCB1c2luZyBXZ2V0LlxuICpcbiAqIEBhdXRob3JcbiAqIEBBaG1hZE5hc3NyaVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZSwgcXVvdGUgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL3NoZWxsJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdnZXRPcHRpb25zIHtcbiAgc2hvcnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHdnZXQ6IENsaWVudDxXZ2V0T3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICd3Z2V0JyxcbiAgICB0aXRsZTogJ1dnZXQnLFxuICAgIGxpbms6ICdodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3dnZXQvJyxcbiAgICBkZXNjcmlwdGlvbjogJ2EgZnJlZSBzb2Z0d2FyZSBwYWNrYWdlIGZvciByZXRyaWV2aW5nIGZpbGVzIHVzaW5nIEhUVFAsIEhUVFBTJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBwb3N0RGF0YSwgYWxsSGVhZGVycywgZnVsbFVybCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIHNob3J0OiBmYWxzZSxcbiAgICAgIHZlcmJvc2U6IGZhbHNlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoe1xuICAgICAgaW5kZW50OiBvcHRzLmluZGVudCxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgU0VFTVMgTEVHSVRcbiAgICAgIGpvaW46IG9wdHMuaW5kZW50ICE9PSBmYWxzZSA/IGAgXFxcXFxcbiR7b3B0cy5pbmRlbnR9YCA6ICcgJyxcbiAgICB9KTtcblxuICAgIGlmIChvcHRzLnZlcmJvc2UpIHtcbiAgICAgIHB1c2goYHdnZXQgJHtvcHRzLnNob3J0ID8gJy12JyA6ICctLXZlcmJvc2UnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKGB3Z2V0ICR7b3B0cy5zaG9ydCA/ICctcScgOiAnLS1xdWlldCd9YCk7XG4gICAgfVxuXG4gICAgcHVzaChgLS1tZXRob2QgJHtxdW90ZShtZXRob2QpfWApO1xuXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyID0gYCR7a2V5fTogJHthbGxIZWFkZXJzW2tleV19YDtcbiAgICAgIHB1c2goYC0taGVhZGVyICR7cXVvdGUoaGVhZGVyKX1gKTtcbiAgICB9KTtcblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBwdXNoKGAtLWJvZHktZGF0YSAke2VzY2FwZShxdW90ZShwb3N0RGF0YS50ZXh0KSl9YCk7XG4gICAgfVxuXG4gICAgcHVzaChvcHRzLnNob3J0ID8gJy1PJyA6ICctLW91dHB1dC1kb2N1bWVudCcpO1xuICAgIHB1c2goYC0gJHtxdW90ZShmdWxsVXJsKX1gKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBDcmVhdGUgYW4gc3RyaW5nIG9mIGdpdmVuIGxlbmd0aCBmaWxsZWQgd2l0aCBibGFuayBzcGFjZXNcbiAqXG4gKiBAcGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgYXJyYXkgdG8gcmV0dXJuXG4gKiBAcGFyYW0gc3RyIFN0cmluZyB0byBwYWQgb3V0IHdpdGhcbiAqL1xuY29uc3QgYnVpbGRTdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIsIHN0cjogc3RyaW5nKSA9PiBzdHIucmVwZWF0KGxlbmd0aCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSBEaWN0aW9uYXJ5IG9yIEFycmF5IGxpdGVyYWwgcmVwcmVzZW50YXRpb24gd2l0aCBwcmV0dHkgb3B0aW9uIGFuZCBpbmRlbnRhdGlvbi5cbiAqL1xuY29uc3QgY29uY2F0QXJyYXkgPSA8VD4oYXJyOiBUW10sIHByZXR0eTogYm9vbGVhbiwgaW5kZW50YXRpb246IHN0cmluZywgaW5kZW50TGV2ZWw6IG51bWJlcikgPT4ge1xuICBjb25zdCBjdXJyZW50SW5kZW50ID0gYnVpbGRTdHJpbmcoaW5kZW50TGV2ZWwsIGluZGVudGF0aW9uKTtcbiAgY29uc3QgY2xvc2luZ0JyYWNlSW5kZW50ID0gYnVpbGRTdHJpbmcoaW5kZW50TGV2ZWwgLSAxLCBpbmRlbnRhdGlvbik7XG4gIGNvbnN0IGpvaW4gPSBwcmV0dHkgPyBgLFxcbiR7Y3VycmVudEluZGVudH1gIDogJywgJztcblxuICBpZiAocHJldHR5KSB7XG4gICAgcmV0dXJuIGBbXFxuJHtjdXJyZW50SW5kZW50fSR7YXJyLmpvaW4oam9pbil9XFxuJHtjbG9zaW5nQnJhY2VJbmRlbnR9XWA7XG4gIH1cbiAgcmV0dXJuIGBbJHthcnIuam9pbihqb2luKX1dYDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSB2YWxpZCBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgYSBTd2lmdCBhcnJheSBvciBkaWN0aW9uYXJ5IGxpdGVyYWxcbiAqXG4gKiBAcGFyYW0gbmFtZSBEZXNpcmVkIG5hbWUgb2YgdGhlIGluc3RhbmNlXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBLZXktdmFsdWUgb2JqZWN0IG9mIHBhcmFtZXRlcnMgdG8gdHJhbnNsYXRlIHRvIGEgU3dpZnQgb2JqZWN0IGxpdGVhcmFsXG4gKiBAcGFyYW0gb3B0cyBUYXJnZXQgb3B0aW9uc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgbGl0ZXJhbERlY2xhcmF0aW9uID0gPFQsIFU+KG5hbWU6IHN0cmluZywgcGFyYW1ldGVyczogVCwgb3B0czogVSkgPT5cbiAgYGxldCAke25hbWV9ID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24ocGFyYW1ldGVycywgb3B0cyl9YDtcblxuLyoqXG4gKiBDcmVhdGUgYSB2YWxpZCBTd2lmdCBzdHJpbmcgb2YgYSBsaXRlcmFsIHZhbHVlIGFjY29yZGluZyB0byBpdHMgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgQW55IEphdmFTY3JpcHQgbGl0ZXJhbFxuICogQHBhcmFtIG9wdHMgVGFyZ2V0IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGxpdGVyYWxSZXByZXNlbnRhdGlvbiA9IDxULCBVPihcbiAgdmFsdWU6IFQsXG4gIG9wdHM6IFUsXG4gIGluZGVudExldmVsPzogbnVtYmVyLFxuKTogbnVtYmVyIHwgc3RyaW5nID0+IHtcbiAgaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbCA9PT0gdW5kZWZpbmVkID8gMSA6IGluZGVudExldmVsICsgMTtcblxuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpIHtcbiAgICBjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuICAgICAgcmV0dXJuIHZhbHVlIGFzIHVua25vd24gYXMgbnVtYmVyO1xuXG4gICAgY2FzZSAnW29iamVjdCBBcnJheV0nOiB7XG4gICAgICAvLyBEb24ndCBwcmV0dGlmeSBhcnJheXMgbnRvIG5vdCB0YWtlIHRvbyBtdWNoIHNwYWNlXG4gICAgICBsZXQgcHJldHR5ID0gZmFsc2U7XG4gICAgICBjb25zdCB2YWx1ZXNSZXByZXNlbnRhdGlvbiA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIGFueVtdKS5tYXAoKHY6IGFueSkgPT4ge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gcHJldHRpZnkgaWYgdGhlIHZhbHVlIGlzIGEgZGljdGlvbmFyeSB3aXRoIG11bHRpcGxlIGtleXNcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgICBwcmV0dHkgPSBPYmplY3Qua2V5cyh2KS5sZW5ndGggPiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXRlcmFsUmVwcmVzZW50YXRpb24odiwgb3B0cywgaW5kZW50TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lZWRzIGJldHRlciB0eXBlc1xuICAgICAgcmV0dXJuIGNvbmNhdEFycmF5KHZhbHVlc1JlcHJlc2VudGF0aW9uLCBwcmV0dHksIG9wdHMuaW5kZW50LCBpbmRlbnRMZXZlbCk7XG4gICAgfVxuXG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzoge1xuICAgICAgY29uc3Qga2V5VmFsdWVQYWlycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAga2V5VmFsdWVQYWlycy5wdXNoKGBcIiR7a2V5fVwiOiAke2xpdGVyYWxSZXByZXNlbnRhdGlvbih2YWx1ZVtrZXldLCBvcHRzLCBpbmRlbnRMZXZlbCl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uY2F0QXJyYXkoXG4gICAgICAgIGtleVZhbHVlUGFpcnMsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVlZHMgYmV0dGVyIHR5cGVzXG4gICAgICAgIG9wdHMucHJldHR5ICYmIGtleVZhbHVlUGFpcnMubGVuZ3RoID4gMSxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkcyBiZXR0ZXIgdHlwZXNcbiAgICAgICAgb3B0cy5pbmRlbnQsXG4gICAgICAgIGluZGVudExldmVsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgIHJldHVybiAodmFsdWUgYXMgdW5rbm93biBhcyBib29sZWFuKS50b1N0cmluZygpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgXCIkeyh2YWx1ZSBhcyBhbnkpLnRvU3RyaW5nKCkucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIFN3aWZ0IHVzaW5nIE5TVVJMU2Vzc2lvbi5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAdGhpYmF1bHRDaGFcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGxpdGVyYWxEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5zdXJsc2Vzc2lvbk9wdGlvbnMge1xuICBwcmV0dHk/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgbnN1cmxzZXNzaW9uOiBDbGllbnQ8TnN1cmxzZXNzaW9uT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICduc3VybHNlc3Npb24nLFxuICAgIHRpdGxlOiAnTlNVUkxTZXNzaW9uJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjL2RvY3VtZW50YXRpb24vRm91bmRhdGlvbi9SZWZlcmVuY2UvTlNVUkxTZXNzaW9uX2NsYXNzL2luZGV4Lmh0bWwnLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZvdW5kYXRpb24ncyBOU1VSTFNlc3Npb24gcmVxdWVzdFwiLFxuICB9LFxuICBjb252ZXJ0OiAoeyBhbGxIZWFkZXJzLCBwb3N0RGF0YSwgZnVsbFVybCwgbWV0aG9kIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgcHJldHR5OiB0cnVlLFxuICAgICAgdGltZW91dDogJzEwJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICAvLyBNYXJrZXJzIGZvciBoZWFkZXJzIHRvIGJlIGNyZWF0ZWQgYXMgbGl0dGVyYWwgb2JqZWN0cyBhbmQgbGF0ZXIgYmUgc2V0IG9uIHRoZSBOU1VSTFJlcXVlc3QgaWYgZXhpc3RcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBoYXNIZWFkZXJzOiBmYWxzZSxcbiAgICAgIGhhc0JvZHk6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBXZSBqdXN0IHdhbnQgdG8gbWFrZSBzdXJlIHBlb3BsZSB1bmRlcnN0YW5kIHRoYXQgaXMgdGhlIG9ubHkgZGVwZW5kZW5jeVxuICAgIHB1c2goJ2ltcG9ydCBGb3VuZGF0aW9uJyk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYWxsSGVhZGVycykubGVuZ3RoKSB7XG4gICAgICByZXEuaGFzSGVhZGVycyA9IHRydWU7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaChsaXRlcmFsRGVjbGFyYXRpb24oJ2hlYWRlcnMnLCBhbGxIZWFkZXJzLCBvcHRzKSk7XG4gICAgfVxuXG4gICAgaWYgKHBvc3REYXRhLnRleHQgfHwgcG9zdERhdGEuanNvbk9iaiB8fCBwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgIHJlcS5oYXNCb2R5ID0gdHJ1ZTtcblxuICAgICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICAgIC8vIEJ5IGFwcGVuZGluZyBwYXJhbWV0ZXJzIG9uZSBieSBvbmUgaW4gdGhlIHJlc3VsdGluZyBzbmlwcGV0LFxuICAgICAgICAgIC8vIHdlIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgdXNlciB0byBlZGl0IGl0IGFjY29yZGluZyB0byBoaXMgb3IgaGVyIG5lZWRzIGFmdGVyIHBhc3RpbmcuXG4gICAgICAgICAgLy8gVGhlIHVzZXIgY2FuIGp1c3QgYWRkL3JlbW92ZSBsaW5lcyBhZGRpbmcvcmVtb3ZpbmcgYm9keSBwYXJhbWV0ZXJzLlxuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBwb3N0RGF0YS5wYXJhbXM7XG4gICAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgICBgbGV0IHBvc3REYXRhID0gTlNNdXRhYmxlRGF0YShkYXRhOiBcIiR7aGVhZC5uYW1lfT0ke2hlYWQudmFsdWV9XCIuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRhaWwuZm9yRWFjaCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgIHB1c2goYHBvc3REYXRhLmFwcGVuZChcIiYke25hbWV9PSR7dmFsdWV9XCIuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISlgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXEuaGFzQm9keSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgICAgcHVzaChgJHtsaXRlcmFsRGVjbGFyYXRpb24oJ3BhcmFtZXRlcnMnLCBwb3N0RGF0YS5qc29uT2JqLCBvcHRzKX0gYXMgW1N0cmluZyA6IEFueV1gKTtcbiAgICAgICAgICAgIGJsYW5rKCk7XG5cbiAgICAgICAgICAgIHB1c2goJ2xldCBwb3N0RGF0YSA9IEpTT05TZXJpYWxpemF0aW9uLmRhdGEod2l0aEpTT05PYmplY3Q6IHBhcmFtZXRlcnMsIG9wdGlvbnM6IFtdKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBCeSBhcHBlbmRpbmcgbXVsdGlwYXJ0IHBhcmFtZXRlcnMgb25lIGJ5IG9uZSBpbiB0aGUgcmVzdWx0aW5nIHNuaXBwZXQsXG4gICAgICAgICAgICogd2UgbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSB1c2VyIHRvIGVkaXQgaXQgYWNjb3JkaW5nIHRvIGhpcyBvciBoZXIgbmVlZHMgYWZ0ZXIgcGFzdGluZy5cbiAgICAgICAgICAgKiBUaGUgdXNlciBjYW4ganVzdCBlZGl0IHRoZSBwYXJhbWV0ZXJzIE5TRGljdGlvbmFyeSBvciBwdXQgdGhpcyBwYXJ0IG9mIGEgc25pcHBldCBpbiBhIG11bHRpcGFydCBidWlsZGVyIG1ldGhvZC5cbiAgICAgICAgICAgKi9cblxuICAgICAgICAgIHB1c2gobGl0ZXJhbERlY2xhcmF0aW9uKCdwYXJhbWV0ZXJzJywgcG9zdERhdGEucGFyYW1zLCBvcHRzKSk7XG4gICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgICBwdXNoKGBsZXQgYm91bmRhcnkgPSBcIiR7cG9zdERhdGEuYm91bmRhcnl9XCJgKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIHB1c2goJ3ZhciBib2R5ID0gXCJcIicpO1xuICAgICAgICAgIHB1c2goJ3ZhciBlcnJvcjogTlNFcnJvcj8gPSBuaWwnKTtcbiAgICAgICAgICBwdXNoKCdmb3IgcGFyYW0gaW4gcGFyYW1ldGVycyB7Jyk7XG4gICAgICAgICAgcHVzaCgnbGV0IHBhcmFtTmFtZSA9IHBhcmFtW1wibmFtZVwiXSEnLCAxKTtcbiAgICAgICAgICBwdXNoKCdib2R5ICs9IFwiLS1cXFxcKGJvdW5kYXJ5KVxcXFxyXFxcXG5cIicsIDEpO1xuICAgICAgICAgIHB1c2goJ2JvZHkgKz0gXCJDb250ZW50LURpc3Bvc2l0aW9uOmZvcm0tZGF0YTsgbmFtZT1cXFxcXCJcXFxcKHBhcmFtTmFtZSlcXFxcXCJcIicsIDEpO1xuICAgICAgICAgIHB1c2goJ2lmIGxldCBmaWxlbmFtZSA9IHBhcmFtW1wiZmlsZU5hbWVcIl0geycsIDEpO1xuICAgICAgICAgIHB1c2goJ2xldCBjb250ZW50VHlwZSA9IHBhcmFtW1wiY29udGVudC10eXBlXCJdIScsIDIpO1xuICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAnbGV0IGZpbGVDb250ZW50ID0gU3RyaW5nKGNvbnRlbnRzT2ZGaWxlOiBmaWxlbmFtZSwgZW5jb2Rpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KScsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcHVzaCgnaWYgKGVycm9yICE9IG5pbCkgeycsIDIpO1xuICAgICAgICAgIHB1c2goJ3ByaW50KGVycm9yIGFzIEFueSknLCAzKTtcbiAgICAgICAgICBwdXNoKCd9JywgMik7XG4gICAgICAgICAgcHVzaCgnYm9keSArPSBcIjsgZmlsZW5hbWU9XFxcXFwiXFxcXChmaWxlbmFtZSlcXFxcXCJcXFxcclxcXFxuXCInLCAyKTtcbiAgICAgICAgICBwdXNoKCdib2R5ICs9IFwiQ29udGVudC1UeXBlOiBcXFxcKGNvbnRlbnRUeXBlKVxcXFxyXFxcXG5cXFxcclxcXFxuXCInLCAyKTtcbiAgICAgICAgICBwdXNoKCdib2R5ICs9IGZpbGVDb250ZW50JywgMik7XG4gICAgICAgICAgcHVzaCgnfSBlbHNlIGlmIGxldCBwYXJhbVZhbHVlID0gcGFyYW1bXCJ2YWx1ZVwiXSB7JywgMSk7XG4gICAgICAgICAgcHVzaCgnYm9keSArPSBcIlxcXFxyXFxcXG5cXFxcclxcXFxuXFxcXChwYXJhbVZhbHVlKVwiJywgMik7XG4gICAgICAgICAgcHVzaCgnfScsIDEpO1xuICAgICAgICAgIHB1c2goJ30nKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgcHVzaChcbiAgICAgICAgICAgIGBsZXQgcG9zdERhdGEgPSBOU0RhdGEoZGF0YTogXCIke3Bvc3REYXRhLnRleHR9XCIuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISlgLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmxhbmsoKTtcblxuICAgIC8vIE5TVVJMUmVxdWVzdFVzZVByb3RvY29sQ2FjaGVQb2xpY3kgaXMgdGhlIGRlZmF1bHQgcG9saWN5LCBsZXQncyBqdXN0IGFsd2F5cyBzZXQgaXQgdG8gYXZvaWQgY29uZnVzaW9uLlxuICAgIHB1c2goYGxldCByZXF1ZXN0ID0gTlNNdXRhYmxlVVJMUmVxdWVzdCh1cmw6IE5TVVJMKHN0cmluZzogXCIke2Z1bGxVcmx9XCIpISBhcyBVUkwsYCk7XG4gICAgcHVzaCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlUG9saWN5OiAudXNlUHJvdG9jb2xDYWNoZVBvbGljeSwnKTtcbiAgICBwdXNoKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkcyBiZXR0ZXIgdHlwZXNcbiAgICAgIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SW50ZXJ2YWw6ICR7cGFyc2VJbnQob3B0cy50aW1lb3V0LCAxMCkudG9GaXhlZChcbiAgICAgICAgMSxcbiAgICAgICl9KWAsXG4gICAgKTtcbiAgICBwdXNoKGByZXF1ZXN0Lmh0dHBNZXRob2QgPSBcIiR7bWV0aG9kfVwiYCk7XG5cbiAgICBpZiAocmVxLmhhc0hlYWRlcnMpIHtcbiAgICAgIHB1c2goJ3JlcXVlc3QuYWxsSFRUUEhlYWRlckZpZWxkcyA9IGhlYWRlcnMnKTtcbiAgICB9XG5cbiAgICBpZiAocmVxLmhhc0JvZHkpIHtcbiAgICAgIHB1c2goJ3JlcXVlc3QuaHR0cEJvZHkgPSBwb3N0RGF0YSBhcyBEYXRhJyk7XG4gICAgfVxuXG4gICAgYmxhbmsoKTtcbiAgICAvLyBSZXRyaWV2aW5nIHRoZSBzaGFyZWQgc2Vzc2lvbiB3aWxsIGJlIGxlc3MgdmVyYm9zZSB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS5cblxuICAgIHB1c2goJ2xldCBzZXNzaW9uID0gVVJMU2Vzc2lvbi5zaGFyZWQnKTtcbiAgICBwdXNoKFxuICAgICAgJ2xldCBkYXRhVGFzayA9IHNlc3Npb24uZGF0YVRhc2sod2l0aDogcmVxdWVzdCBhcyBVUkxSZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogeyAoZGF0YSwgcmVzcG9uc2UsIGVycm9yKSAtPiBWb2lkIGluJyxcbiAgICApO1xuICAgIHB1c2goJ2lmIChlcnJvciAhPSBuaWwpIHsnLCAxKTtcbiAgICBwdXNoKCdwcmludChlcnJvciBhcyBBbnkpJywgMik7XG4gICAgcHVzaCgnfSBlbHNlIHsnLCAxKTsgLy8gQ2FzdGluZyB0aGUgTlNVUkxSZXNwb25zZSB0byBOU0hUVFBVUkxSZXNwb25zZSBzbyB0aGUgdXNlciBjYW4gc2VlIHRoZSBzdGF0dXMgICAgIC5cbiAgICBwdXNoKCdsZXQgaHR0cFJlc3BvbnNlID0gcmVzcG9uc2UgYXM/IEhUVFBVUkxSZXNwb25zZScsIDIpO1xuICAgIHB1c2goJ3ByaW50KGh0dHBSZXNwb25zZSknLCAyKTtcbiAgICBwdXNoKCd9JywgMSk7XG4gICAgcHVzaCgnfSknKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ2RhdGFUYXNrLnJlc3VtZSgpJyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbnN1cmxzZXNzaW9uIH0gZnJvbSAnLi9uc3VybHNlc3Npb24vY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IHN3aWZ0OiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdzd2lmdCcsXG4gICAgdGl0bGU6ICdTd2lmdCcsXG4gICAgZXh0bmFtZTogJy5zd2lmdCcsXG4gICAgZGVmYXVsdDogJ25zdXJsc2Vzc2lvbicsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgbnN1cmxzZXNzaW9uLFxuICB9LFxufTtcbiIsImltcG9ydCB7IE1lcmdlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXJPcHRpb25zIH0gZnJvbSAnLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4uL2h0dHBzbmlwcGV0JztcbmltcG9ydCB7IGMgfSBmcm9tICcuL2MvdGFyZ2V0JztcbmltcG9ydCB7IGNsb2p1cmUgfSBmcm9tICcuL2Nsb2p1cmUvdGFyZ2V0JztcbmltcG9ydCB7IGNzaGFycCB9IGZyb20gJy4vY3NoYXJwL3RhcmdldCc7XG5pbXBvcnQgeyBnbyB9IGZyb20gJy4vZ28vdGFyZ2V0JztcbmltcG9ydCB7IGh0dHAgfSBmcm9tICcuL2h0dHAvdGFyZ2V0JztcbmltcG9ydCB7IGphdmEgfSBmcm9tICcuL2phdmEvdGFyZ2V0JztcbmltcG9ydCB7IGphdmFzY3JpcHQgfSBmcm9tICcuL2phdmFzY3JpcHQvdGFyZ2V0JztcbmltcG9ydCB7IGtvdGxpbiB9IGZyb20gJy4va290bGluL3RhcmdldCc7XG5pbXBvcnQgeyBub2RlIH0gZnJvbSAnLi9ub2RlL3RhcmdldCc7XG5pbXBvcnQgeyBvYmpjIH0gZnJvbSAnLi9vYmpjL3RhcmdldCc7XG5pbXBvcnQgeyBvY2FtbCB9IGZyb20gJy4vb2NhbWwvdGFyZ2V0JztcbmltcG9ydCB7IHBocCB9IGZyb20gJy4vcGhwL3RhcmdldCc7XG5pbXBvcnQgeyBwb3dlcnNoZWxsIH0gZnJvbSAnLi9wb3dlcnNoZWxsL3RhcmdldCc7XG5pbXBvcnQgeyBweXRob24gfSBmcm9tICcuL3B5dGhvbi90YXJnZXQnO1xuaW1wb3J0IHsgciB9IGZyb20gJy4vci90YXJnZXQnO1xuaW1wb3J0IHsgcnVieSB9IGZyb20gJy4vcnVieS90YXJnZXQnO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuL3NoZWxsL3RhcmdldCc7XG5pbXBvcnQgeyBzd2lmdCB9IGZyb20gJy4vc3dpZnQvdGFyZ2V0JztcblxuZXhwb3J0IHR5cGUgVGFyZ2V0SWQgPSBrZXlvZiB0eXBlb2YgdGFyZ2V0cztcblxuZXhwb3J0IHR5cGUgQ2xpZW50SWQgPSBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50SW5mbyB7XG4gIGtleTogQ2xpZW50SWQ7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGxpbms6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ29udmVydGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgb3B0aW9ucz86IE1lcmdlPENvZGVCdWlsZGVyT3B0aW9ucywgVD4sXG4pID0+IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIGluZm86IENsaWVudEluZm87XG4gIGNvbnZlcnQ6IENvbnZlcnRlcjxUPjtcbn1cblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uID0gYC4ke3N0cmluZ31gIHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRJbmZvIHtcbiAga2V5OiBUYXJnZXRJZDtcbiAgdGl0bGU6IHN0cmluZztcbiAgZXh0bmFtZTogRXh0ZW5zaW9uO1xuICBkZWZhdWx0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0IHtcbiAgaW5mbzogVGFyZ2V0SW5mbztcbiAgY2xpZW50c0J5SWQ6IFJlY29yZDxDbGllbnRJZCwgQ2xpZW50Pjtcbn1cblxuZXhwb3J0IGNvbnN0IHRhcmdldHMgPSB7XG4gIGMsXG4gIGNsb2p1cmUsXG4gIGNzaGFycCxcbiAgZ28sXG4gIGh0dHAsXG4gIGphdmEsXG4gIGphdmFzY3JpcHQsXG4gIGtvdGxpbixcbiAgbm9kZSxcbiAgb2JqYyxcbiAgb2NhbWwsXG4gIHBocCxcbiAgcG93ZXJzaGVsbCxcbiAgcHl0aG9uLFxuICByLFxuICBydWJ5LFxuICBzaGVsbCxcbiAgc3dpZnQsXG59O1xuXG5leHBvcnQgY29uc3QgaXNUYXJnZXQgPSAodGFyZ2V0OiBUYXJnZXQpOiB0YXJnZXQgaXMgVGFyZ2V0ID0+IHtcbiAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnIHx8IHRhcmdldCA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICBjb25zdCBnb3QgPSB0YXJnZXQgPT09IG51bGwgPyAnbnVsbCcgOiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyAnYXJyYXknIDogdHlwZW9mIHRhcmdldDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHlvdSB0cmllZCB0byBhZGQgYSB0YXJnZXQgd2hpY2ggaXMgbm90IGFuIG9iamVjdCwgZ290IHR5cGU6IFwiJHtnb3R9XCJgKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgJ2luZm8nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGNvbnRhaW4gYW4gYGluZm9gIG9iamVjdCcpO1xuICB9XG5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LmluZm8sICdrZXknKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSBga2V5YCcpO1xuICB9XG5cbiAgaWYgKCF0YXJnZXQuaW5mby5rZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldCBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0cywgdGFyZ2V0LmluZm8ua2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYSB0YXJnZXQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGlzIGtleSwgXFxgJHt0YXJnZXQuaW5mby5rZXl9XFxgYCk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQuaW5mbywgJ3RpdGxlJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldHMgbXVzdCBoYXZlIGFuIGBpbmZvYCBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydHkgYHRpdGxlYCcpO1xuICB9XG5cbiAgaWYgKCF0YXJnZXQuaW5mby50aXRsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0IHRpdGxlIG11c3QgYmUgYSBub24temVyby1sZW5ndGggc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQuaW5mbywgJ2V4dG5hbWUnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSBgZXh0bmFtZWAnKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgJ2NsaWVudHNCeUlkJykgfHxcbiAgICAhdGFyZ2V0LmNsaWVudHNCeUlkIHx8XG4gICAgT2JqZWN0LmtleXModGFyZ2V0LmNsaWVudHNCeUlkKS5sZW5ndGggPT09IDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIGNsaWVudHMgcHJvdmlkZWQgaW4gdGFyZ2V0ICR7dGFyZ2V0LmluZm8ua2V5fS4gIFlvdSBtdXN0IHByb3ZpZGUgdGhlIHByb3BlcnR5IFxcYGNsaWVudHNCeUlkXFxgIGNvbnRhaW5nIHlvdXIgY2xpZW50cy5gLFxuICAgICk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQuaW5mbywgJ2RlZmF1bHQnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSBgZGVmYXVsdGAnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldC5jbGllbnRzQnlJZCwgdGFyZ2V0LmluZm8uZGVmYXVsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgdGFyZ2V0ICR7dGFyZ2V0LmluZm8ua2V5fSBpcyBjb25maWd1cmVkIHdpdGggYSBkZWZhdWx0IGNsaWVudCAke1xuICAgICAgICB0YXJnZXQuaW5mby5kZWZhdWx0XG4gICAgICB9LCBidXQgbm8gc3VjaCBjbGllbnQgd2FzIGZvdW5kIGluIHRoZSBwcm9wZXJ0eSBcXGBjbGllbnRzQnlJZFxcYCAoZm91bmQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgT2JqZWN0LmtleXModGFyZ2V0LmNsaWVudHNCeUlkKSxcbiAgICAgICl9KWAsXG4gICAgKTtcbiAgfVxuXG4gIE9iamVjdC52YWx1ZXModGFyZ2V0LmNsaWVudHNCeUlkKS5mb3JFYWNoKGlzQ2xpZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYXJnZXQgPSAodGFyZ2V0OiBUYXJnZXQpID0+IHtcbiAgaWYgKCFpc1RhcmdldCh0YXJnZXQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRhcmdldHNbdGFyZ2V0LmluZm8ua2V5XSA9IHRhcmdldDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NsaWVudCA9IChjbGllbnQ6IENsaWVudCk6IGNsaWVudCBpcyBDbGllbnQgPT4ge1xuICBpZiAoIWNsaWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xpZW50cyBtdXN0IGJlIG9iamVjdHMnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNsaWVudCwgJ2luZm8nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBjbGllbnQgbXVzdCBjb250YWluIGFuIGBpbmZvYCBvYmplY3QnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNsaWVudC5pbmZvLCAna2V5JykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldHMgY2xpZW50IG11c3QgaGF2ZSBhbiBgaW5mb2Agb2JqZWN0IHdpdGggcHJvcGVydHkgYGtleWAnKTtcbiAgfVxuXG4gIGlmICghY2xpZW50LmluZm8ua2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnQuaW5mby5rZXkgbXVzdCBjb250YWluIGFuIGlkZW50aWZpZXIgdW5pcXVlIHRvIHRoaXMgdGFyZ2V0Jyk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjbGllbnQuaW5mbywgJ3RpdGxlJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldHMgY2xpZW50IG11c3QgaGF2ZSBhbiBgaW5mb2Agb2JqZWN0IHdpdGggcHJvcGVydHkgYHRpdGxlYCcpO1xuICB9XG5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2xpZW50LmluZm8sICdkZXNjcmlwdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRzIGNsaWVudCBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHByb3BlcnR5IGBkZXNjcmlwdGlvbmAnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNsaWVudC5pbmZvLCAnbGluaycpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRzIGNsaWVudCBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHByb3BlcnR5IGBsaW5rYCcpO1xuICB9XG5cbiAgaWYgKFxuICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2xpZW50LCAnY29udmVydCcpIHx8XG4gICAgdHlwZW9mIGNsaWVudC5jb252ZXJ0ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd0YXJnZXRzIGNsaWVudCBtdXN0IGhhdmUgYSBgY29udmVydGAgcHJvcGVydHkgY29udGFpbmluZyBhIGNvbnZlcnNpb24gZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYXJnZXRDbGllbnQgPSAodGFyZ2V0SWQ6IFRhcmdldElkLCBjbGllbnQ6IENsaWVudCkgPT4ge1xuICBpZiAoIWlzQ2xpZW50KGNsaWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXRzLCB0YXJnZXRJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvcnJ5LCBidXQgbm8gJHt0YXJnZXRJZH0gdGFyZ2V0IGV4aXN0cyB0byBhZGQgY2xpZW50cyB0b2ApO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXRzW3RhcmdldElkXSwgY2xpZW50LmluZm8ua2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB0aGUgdGFyZ2V0ICR7dGFyZ2V0SWR9IGFscmVhZHkgaGFzIGEgY2xpZW50IHdpdGggdGhlIGtleSAke2NsaWVudC5pbmZvLmtleX0sIHBsZWFzZSB1c2UgYSBkaWZmZXJlbnQga2V5YCxcbiAgICApO1xuICB9XG5cbiAgdGFyZ2V0c1t0YXJnZXRJZF0uY2xpZW50c0J5SWRbY2xpZW50LmluZm8ua2V5XSA9IGNsaWVudDtcbn07XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG5jb25zdCBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5jb25zdCBjdXN0b21JbnNwZWN0U3ltYm9sID1cbiAgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbFsnZm9yJ10gPT09ICdmdW5jdGlvbicpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgPyBTeW1ib2xbJ2ZvciddKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgOiBudWxsXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuY29uc3QgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBjb25zdCBwcm90byA9IHsgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH1cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihhcnIsIHByb3RvKVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlWaWV3KHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKVxuICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGNvbnN0IGIgPSBmcm9tT2JqZWN0KHZhbHVlKVxuICBpZiAoYikgcmV0dXJuIGJcblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gIClcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlci5wcm90b3R5cGUsIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlciwgVWludDhBcnJheSlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgbGV0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgY29uc3QgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlWaWV3IChhcnJheVZpZXcpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYXJyYXlWaWV3LCBVaW50OEFycmF5KSkge1xuICAgIGNvbnN0IGNvcHkgPSBuZXcgVWludDhBcnJheShhcnJheVZpZXcpXG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihjb3B5LmJ1ZmZlciwgY29weS5ieXRlT2Zmc2V0LCBjb3B5LmJ5dGVMZW5ndGgpXG4gIH1cbiAgcmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KVxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgbGV0IGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICBjb25zdCBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIGNvbnN0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICBsZXQgeCA9IGEubGVuZ3RoXG4gIGxldCB5ID0gYi5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIGxldCBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGlmIChwb3MgKyBidWYubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBwb3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICB9XG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICBjb25zdCBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGNvbnN0IG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2VyY2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIGNvbnN0IGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIGxldCBzdHIgPSAnJ1xuICBjb25zdCBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuaWYgKGN1c3RvbUluc3BlY3RTeW1ib2wpIHtcbiAgQnVmZmVyLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IEJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICBsZXQgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgbGV0IHkgPSBlbmQgLSBzdGFydFxuICBjb25zdCBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIGNvbnN0IHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIGNvbnN0IHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFt2YWxdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICBsZXQgaW5kZXhTaXplID0gMVxuICBsZXQgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICBsZXQgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICBsZXQgaVxuICBpZiAoZGlyKSB7XG4gICAgbGV0IGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICBjb25zdCByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgbGV0IGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIGNvbnN0IHJlcyA9IFtdXG5cbiAgbGV0IGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIGxldCBjb2RlUG9pbnQgPSBudWxsXG4gICAgbGV0IGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRilcbiAgICAgID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERilcbiAgICAgICAgICA/IDNcbiAgICAgICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKVxuICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICBsZXQgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG5jb25zdCBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgY29uc3QgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGxldCByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBsZXQgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgbGV0IG91dCA9ICcnXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2ldXVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgbGV0IHJlcyA9ICcnXG4gIC8vIElmIGJ5dGVzLmxlbmd0aCBpcyBvZGQsIHRoZSBsYXN0IDggYml0cyBtdXN0IGJlIGlnbm9yZWQgKHNhbWUgYXMgbm9kZS5qcylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgY29uc3QgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldF1cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICBsZXQgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4ID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRMRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IGxvID0gZmlyc3QgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAyNFxuXG4gIGNvbnN0IGhpID0gdGhpc1srK29mZnNldF0gK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIGxhc3QgKiAyICoqIDI0XG5cbiAgcmV0dXJuIEJpZ0ludChsbykgKyAoQmlnSW50KGhpKSA8PCBCaWdJbnQoMzIpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgaGkgPSBmaXJzdCAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdXG5cbiAgY29uc3QgbG8gPSB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIGxhc3RcblxuICByZXR1cm4gKEJpZ0ludChoaSkgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQobG8pXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXRdXG4gIGxldCBtdWwgPSAxXG4gIGxldCBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoXG4gIGxldCBtdWwgPSAxXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0TEUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDRdICtcbiAgICB0aGlzW29mZnNldCArIDVdICogMiAqKiA4ICtcbiAgICB0aGlzW29mZnNldCArIDZdICogMiAqKiAxNiArXG4gICAgKGxhc3QgPDwgMjQpIC8vIE92ZXJmbG93XG5cbiAgcmV0dXJuIChCaWdJbnQodmFsKSA8PCBCaWdJbnQoMzIpKSArXG4gICAgQmlnSW50KGZpcnN0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgdmFsID0gKGZpcnN0IDw8IDI0KSArIC8vIE92ZXJmbG93XG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF1cblxuICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICtcbiAgICBCaWdJbnQodGhpc1srK29mZnNldF0gKiAyICoqIDI0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICBsYXN0KVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50TEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICBsZXQgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIGxldCBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiB3cnRCaWdVSW50NjRMRSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBtaW4sIG1heCkge1xuICBjaGVja0ludEJJKHZhbHVlLCBtaW4sIG1heCwgYnVmLCBvZmZzZXQsIDcpXG5cbiAgbGV0IGxvID0gTnVtYmVyKHZhbHVlICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICByZXR1cm4gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHdydEJpZ1VJbnQ2NEJFIChidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7XG4gIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNylcblxuICBsZXQgbG8gPSBOdW1iZXIodmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQgKyA3XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNl0gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDVdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA0XSA9IGxvXG4gIGxldCBoaSA9IE51bWJlcih2YWx1ZSA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0ICsgM10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCArIDJdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQgKyAxXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0XSA9IGhpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NExFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcywgdmFsdWUsIG9mZnNldCwgQmlnSW50KDApLCBCaWdJbnQoJzB4ZmZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0QkUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gMFxuICBsZXQgbXVsID0gMVxuICBsZXQgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnSW50NjRMRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NExFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIC1CaWdJbnQoJzB4ODAwMDAwMDAwMDAwMDAwMCcpLCBCaWdJbnQoJzB4N2ZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NEJFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0QkUodGhpcywgdmFsdWUsIG9mZnNldCwgLUJpZ0ludCgnMHg4MDAwMDAwMDAwMDAwMDAwJyksIEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgY29uc3QgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgdmFsID0gTnVtYmVyKHZhbClcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICBsZXQgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBDVVNUT00gRVJST1JTXG4vLyA9PT09PT09PT09PT09XG5cbi8vIFNpbXBsaWZpZWQgdmVyc2lvbnMgZnJvbSBOb2RlLCBjaGFuZ2VkIGZvciBCdWZmZXItb25seSB1c2FnZVxuY29uc3QgZXJyb3JzID0ge31cbmZ1bmN0aW9uIEUgKHN5bSwgZ2V0TWVzc2FnZSwgQmFzZSkge1xuICBlcnJvcnNbc3ltXSA9IGNsYXNzIE5vZGVFcnJvciBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgIHN1cGVyKClcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzYWdlJywge1xuICAgICAgICB2YWx1ZTogZ2V0TWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KVxuXG4gICAgICAvLyBBZGQgdGhlIGVycm9yIGNvZGUgdG8gdGhlIG5hbWUgdG8gaW5jbHVkZSBpdCBpbiB0aGUgc3RhY2sgdHJhY2UuXG4gICAgICB0aGlzLm5hbWUgPSBgJHt0aGlzLm5hbWV9IFske3N5bX1dYFxuICAgICAgLy8gQWNjZXNzIHRoZSBzdGFjayB0byBnZW5lcmF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIGVycm9yIGNvZGVcbiAgICAgIC8vIGZyb20gdGhlIG5hbWUuXG4gICAgICB0aGlzLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAvLyBSZXNldCB0aGUgbmFtZSB0byB0aGUgYWN0dWFsIG5hbWUuXG4gICAgICBkZWxldGUgdGhpcy5uYW1lXG4gICAgfVxuXG4gICAgZ2V0IGNvZGUgKCkge1xuICAgICAgcmV0dXJuIHN5bVxuICAgIH1cblxuICAgIHNldCBjb2RlICh2YWx1ZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2RlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtzeW19XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgIH1cbiAgfVxufVxuXG5FKCdFUlJfQlVGRkVSX09VVF9PRl9CT1VORFMnLFxuICBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gYCR7bmFtZX0gaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzYFxuICAgIH1cblxuICAgIHJldHVybiAnQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kcydcbiAgfSwgUmFuZ2VFcnJvcilcbkUoJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgZnVuY3Rpb24gKG5hbWUsIGFjdHVhbCkge1xuICAgIHJldHVybiBgVGhlIFwiJHtuYW1lfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWBcbiAgfSwgVHlwZUVycm9yKVxuRSgnRVJSX09VVF9PRl9SQU5HRScsXG4gIGZ1bmN0aW9uIChzdHIsIHJhbmdlLCBpbnB1dCkge1xuICAgIGxldCBtc2cgPSBgVGhlIHZhbHVlIG9mIFwiJHtzdHJ9XCIgaXMgb3V0IG9mIHJhbmdlLmBcbiAgICBsZXQgcmVjZWl2ZWQgPSBpbnB1dFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiBCaWdJbnQoMikgKiogQmlnSW50KDMyKSB8fCBpbnB1dCA8IC0oQmlnSW50KDIpICoqIEJpZ0ludCgzMikpKSB7XG4gICAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHJlY2VpdmVkKVxuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gJ24nXG4gICAgfVxuICAgIG1zZyArPSBgIEl0IG11c3QgYmUgJHtyYW5nZX0uIFJlY2VpdmVkICR7cmVjZWl2ZWR9YFxuICAgIHJldHVybiBtc2dcbiAgfSwgUmFuZ2VFcnJvcilcblxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yICh2YWwpIHtcbiAgbGV0IHJlcyA9ICcnXG4gIGxldCBpID0gdmFsLmxlbmd0aFxuICBjb25zdCBzdGFydCA9IHZhbFswXSA9PT0gJy0nID8gMSA6IDBcbiAgZm9yICg7IGkgPj0gc3RhcnQgKyA0OyBpIC09IDMpIHtcbiAgICByZXMgPSBgXyR7dmFsLnNsaWNlKGkgLSAzLCBpKX0ke3Jlc31gXG4gIH1cbiAgcmV0dXJuIGAke3ZhbC5zbGljZSgwLCBpKX0ke3Jlc31gXG59XG5cbi8vIENIRUNLIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNoZWNrQm91bmRzIChidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBpZiAoYnVmW29mZnNldF0gPT09IHVuZGVmaW5lZCB8fCBidWZbb2Zmc2V0ICsgYnl0ZUxlbmd0aF0gPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgYnVmLmxlbmd0aCAtIChieXRlTGVuZ3RoICsgMSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tJbnRCSSAodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHtcbiAgICBjb25zdCBuID0gdHlwZW9mIG1pbiA9PT0gJ2JpZ2ludCcgPyAnbicgOiAnJ1xuICAgIGxldCByYW5nZVxuICAgIGlmIChieXRlTGVuZ3RoID4gMykge1xuICAgICAgaWYgKG1pbiA9PT0gMCB8fCBtaW4gPT09IEJpZ0ludCgwKSkge1xuICAgICAgICByYW5nZSA9IGA+PSAwJHtufSBhbmQgPCAyJHtufSAqKiAkeyhieXRlTGVuZ3RoICsgMSkgKiA4fSR7bn1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9IGA+PSAtKDIke259ICoqICR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn0pIGFuZCA8IDIgKiogYCArXG4gICAgICAgICAgICAgICAgYCR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlID0gYD49ICR7bWlufSR7bn0gYW5kIDw9ICR7bWF4fSR7bn1gXG4gICAgfVxuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSgndmFsdWUnLCByYW5nZSwgdmFsdWUpXG4gIH1cbiAgY2hlY2tCb3VuZHMoYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyICh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvdW5kc0Vycm9yICh2YWx1ZSwgbGVuZ3RoLCB0eXBlKSB7XG4gIGlmIChNYXRoLmZsb29yKHZhbHVlKSAhPT0gdmFsdWUpIHtcbiAgICB2YWxpZGF0ZU51bWJlcih2YWx1ZSwgdHlwZSlcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UodHlwZSB8fCAnb2Zmc2V0JywgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgfVxuXG4gIGlmIChsZW5ndGggPCAwKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKVxuICB9XG5cbiAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKHR5cGUgfHwgJ29mZnNldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPj0gJHt0eXBlID8gMSA6IDB9IGFuZCA8PSAke2xlbmd0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxuY29uc3QgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIGxldCBjb2RlUG9pbnRcbiAgY29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICBsZXQgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICBjb25zdCBieXRlQXJyYXkgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIGxldCBjLCBoaSwgbG9cbiAgY29uc3QgYnl0ZUFycmF5ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBsZXQgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3IgYHRvU3RyaW5nKCdoZXgnKWBcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzIxOVxuY29uc3QgaGV4U2xpY2VMb29rdXBUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWYnXG4gIGNvbnN0IHRhYmxlID0gbmV3IEFycmF5KDI1NilcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgY29uc3QgaTE2ID0gaSAqIDE2XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICB0YWJsZVtpMTYgKyBqXSA9IGFscGhhYmV0W2ldICsgYWxwaGFiZXRbal1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhYmxlXG59KSgpXG5cbi8vIFJldHVybiBub3QgZnVuY3Rpb24gd2l0aCBFcnJvciBpZiBCaWdJbnQgbm90IHN1cHBvcnRlZFxuZnVuY3Rpb24gZGVmaW5lQmlnSW50TWV0aG9kIChmbikge1xuICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyBCdWZmZXJCaWdJbnROb3REZWZpbmVkIDogZm5cbn1cblxuZnVuY3Rpb24gQnVmZmVyQmlnSW50Tm90RGVmaW5lZCAoKSB7XG4gIHRocm93IG5ldyBFcnJvcignQmlnSW50IG5vdCBzdXBwb3J0ZWQnKVxufVxuIiwidmFyIFN0cmVhbSA9IHJlcXVpcmUoXCJzdHJlYW1cIilcbnZhciB3cml0ZU1ldGhvZHMgPSBbXCJ3cml0ZVwiLCBcImVuZFwiLCBcImRlc3Ryb3lcIl1cbnZhciByZWFkTWV0aG9kcyA9IFtcInJlc3VtZVwiLCBcInBhdXNlXCJdXG52YXIgcmVhZEV2ZW50cyA9IFtcImRhdGFcIiwgXCJjbG9zZVwiXVxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5cbm1vZHVsZS5leHBvcnRzID0gZHVwbGV4XG5cbmZ1bmN0aW9uIGZvckVhY2ggKGFyciwgZm4pIHtcbiAgICBpZiAoYXJyLmZvckVhY2gpIHtcbiAgICAgICAgcmV0dXJuIGFyci5mb3JFYWNoKGZuKVxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZuKGFycltpXSwgaSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGR1cGxleCh3cml0ZXIsIHJlYWRlcikge1xuICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgICB2YXIgZW5kZWQgPSBmYWxzZVxuXG4gICAgZm9yRWFjaCh3cml0ZU1ldGhvZHMsIHByb3h5V3JpdGVyKVxuXG4gICAgZm9yRWFjaChyZWFkTWV0aG9kcywgcHJveHlSZWFkZXIpXG5cbiAgICBmb3JFYWNoKHJlYWRFdmVudHMsIHByb3h5U3RyZWFtKVxuXG4gICAgcmVhZGVyLm9uKFwiZW5kXCIsIGhhbmRsZUVuZClcblxuICAgIHdyaXRlci5vbihcImRyYWluXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc3RyZWFtLmVtaXQoXCJkcmFpblwiKVxuICAgIH0pXG5cbiAgICB3cml0ZXIub24oXCJlcnJvclwiLCByZWVtaXQpXG4gICAgcmVhZGVyLm9uKFwiZXJyb3JcIiwgcmVlbWl0KVxuXG4gICAgc3RyZWFtLndyaXRhYmxlID0gd3JpdGVyLndyaXRhYmxlXG4gICAgc3RyZWFtLnJlYWRhYmxlID0gcmVhZGVyLnJlYWRhYmxlXG5cbiAgICByZXR1cm4gc3RyZWFtXG5cbiAgICBmdW5jdGlvbiBwcm94eVdyaXRlcihtZXRob2ROYW1lKSB7XG4gICAgICAgIHN0cmVhbVttZXRob2ROYW1lXSA9IG1ldGhvZFxuXG4gICAgICAgIGZ1bmN0aW9uIG1ldGhvZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB3cml0ZXJbbWV0aG9kTmFtZV0uYXBwbHkod3JpdGVyLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm94eVJlYWRlcihtZXRob2ROYW1lKSB7XG4gICAgICAgIHN0cmVhbVttZXRob2ROYW1lXSA9IG1ldGhvZFxuXG4gICAgICAgIGZ1bmN0aW9uIG1ldGhvZCgpIHtcbiAgICAgICAgICAgIHN0cmVhbS5lbWl0KG1ldGhvZE5hbWUpXG4gICAgICAgICAgICB2YXIgZnVuYyA9IHJlYWRlclttZXRob2ROYW1lXVxuICAgICAgICAgICAgaWYgKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShyZWFkZXIsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5lbWl0KG1ldGhvZE5hbWUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm94eVN0cmVhbShtZXRob2ROYW1lKSB7XG4gICAgICAgIHJlYWRlci5vbihtZXRob2ROYW1lLCByZWVtaXQpXG5cbiAgICAgICAgZnVuY3Rpb24gcmVlbWl0KCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICAgICAgICAgIGFyZ3MudW5zaGlmdChtZXRob2ROYW1lKVxuICAgICAgICAgICAgc3RyZWFtLmVtaXQuYXBwbHkoc3RyZWFtLCBhcmdzKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlRW5kKCkge1xuICAgICAgICBpZiAoZW5kZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgICBhcmdzLnVuc2hpZnQoXCJlbmRcIilcbiAgICAgICAgc3RyZWFtLmVtaXQuYXBwbHkoc3RyZWFtLCBhcmdzKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlZW1pdChlcnIpIHtcbiAgICAgICAgc3RyZWFtLmVtaXQoXCJlcnJvclwiLCBlcnIpXG4gICAgfVxufVxuIiwiLy9maWx0ZXIgd2lsbCByZWVtaXQgdGhlIGRhdGEgaWYgY2IoZXJyLHBhc3MpIHBhc3MgaXMgdHJ1dGh5XG5cbi8vIHJlZHVjZSBpcyBtb3JlIHRyaWNreVxuLy8gbWF5YmUgd2Ugd2FudCB0byBncm91cCB0aGUgcmVkdWN0aW9ucyBvciBlbWl0IHByb2dyZXNzIHVwZGF0ZXMgb2NjYXNpb25hbGx5XG4vLyB0aGUgbW9zdCBiYXNpYyByZWR1Y2UganVzdCBlbWl0cyBvbmUgJ2RhdGEnIGV2ZW50IGFmdGVyIGl0IGhhcyByZWNpZXZlZCAnZW5kJ1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtXG4gICwgZXMgPSBleHBvcnRzXG4gICwgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKVxuICAsIGZyb20gPSByZXF1aXJlKCdmcm9tJylcbiAgLCBkdXBsZXggPSByZXF1aXJlKCdkdXBsZXhlcicpXG4gICwgbWFwID0gcmVxdWlyZSgnbWFwLXN0cmVhbScpXG4gICwgcGF1c2UgPSByZXF1aXJlKCdwYXVzZS1zdHJlYW0nKVxuICAsIHNwbGl0ID0gcmVxdWlyZSgnc3BsaXQnKVxuICAsIHBpcGVsaW5lID0gcmVxdWlyZSgnc3RyZWFtLWNvbWJpbmVyJylcbiAgLCBpbW1lZGlhdGVseSA9IGdsb2JhbC5zZXRJbW1lZGlhdGUgfHwgcHJvY2Vzcy5uZXh0VGljaztcblxuZXMuU3RyZWFtID0gU3RyZWFtIC8vcmUtZXhwb3J0IFN0cmVhbSBmcm9tIGNvcmVcbmVzLnRocm91Z2ggPSB0aHJvdWdoXG5lcy5mcm9tID0gZnJvbVxuZXMuZHVwbGV4ID0gZHVwbGV4XG5lcy5tYXAgPSBtYXBcbmVzLnBhdXNlID0gcGF1c2VcbmVzLnNwbGl0ID0gc3BsaXRcbmVzLnBpcGVsaW5lID0gZXMuY29ubmVjdCA9IGVzLnBpcGUgPSBwaXBlbGluZVxuLy8gbWVyZ2UgLyBjb25jYXRcbi8vXG4vLyBjb21iaW5lIG11bHRpcGxlIHN0cmVhbXMgaW50byBhIHNpbmdsZSBzdHJlYW0uXG4vLyB3aWxsIGVtaXQgZW5kIG9ubHkgb25jZVxuXG5lcy5jb25jYXQgPSAvL2FjdHVhbGx5IHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBjb25jYXRcbmVzLm1lcmdlID0gZnVuY3Rpb24gKC8qc3RyZWFtcy4uLiovKSB7XG4gIHZhciB0b01lcmdlID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIGlmICh0b01lcmdlLmxlbmd0aCA9PT0gMSAmJiAodG9NZXJnZVswXSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgIHRvTWVyZ2UgPSB0b01lcmdlWzBdIC8vaGFuZGxlIGFycmF5IGFzIGFyZ3VtZW50cyBvYmplY3RcbiAgfVxuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gIHN0cmVhbS5zZXRNYXhMaXN0ZW5lcnMoMCkgLy8gYWxsb3cgYWRkaW5nIG1vcmUgdGhhbiAxMSBzdHJlYW1zXG4gIHZhciBlbmRDb3VudCA9IDBcbiAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZVxuXG4gIGlmICh0b01lcmdlLmxlbmd0aCkge1xuICAgIHRvTWVyZ2UuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgZS5waXBlKHN0cmVhbSwge2VuZDogZmFsc2V9KVxuICAgICAgdmFyIGVuZGVkID0gZmFsc2VcbiAgICAgIGUub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoZW5kZWQpIHJldHVyblxuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgZW5kQ291bnQgKytcbiAgICAgICAgaWYoZW5kQ291bnQgPT0gdG9NZXJnZS5sZW5ndGgpXG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgICB9KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICB9KVxuICB9XG4gIFxuICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpXG4gIH1cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdG9NZXJnZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZihlLmRlc3Ryb3kpIGUuZGVzdHJveSgpXG4gICAgfSlcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cblxuLy8gd3JpdGFibGUgc3RyZWFtLCBjb2xsZWN0cyBhbGwgZXZlbnRzIGludG8gYW4gYXJyYXlcbi8vIGFuZCBjYWxscyBiYWNrIHdoZW4gJ2VuZCcgb2NjdXJzXG4vLyBtYWlubHkgSSdtIHVzaW5nIHRoaXMgdG8gdGVzdCB0aGUgb3RoZXIgZnVuY3Rpb25zXG5cbmVzLmNvbGxlY3QgPVxuZXMud3JpdGVBcnJheSA9IGZ1bmN0aW9uIChkb25lKSB7XG4gIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgZG9uZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Z1bmN0aW9uIHdyaXRlQXJyYXkgKGRvbmUpOiBkb25lIG11c3QgYmUgZnVuY3Rpb24nKVxuXG4gIHZhciBhID0gbmV3IFN0cmVhbSAoKVxuICAgICwgYXJyYXkgPSBbXSwgaXNEb25lID0gZmFsc2VcbiAgYS53cml0ZSA9IGZ1bmN0aW9uIChsKSB7XG4gICAgYXJyYXkucHVzaChsKVxuICB9XG4gIGEuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgIGlzRG9uZSA9IHRydWVcbiAgICBkb25lKG51bGwsIGFycmF5KVxuICB9XG4gIGEud3JpdGFibGUgPSB0cnVlXG4gIGEucmVhZGFibGUgPSBmYWxzZVxuICBhLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgYS53cml0YWJsZSA9IGEucmVhZGFibGUgPSBmYWxzZVxuICAgIGlmKGlzRG9uZSkgcmV0dXJuXG4gICAgZG9uZShuZXcgRXJyb3IoJ2Rlc3Ryb3llZCBiZWZvcmUgZW5kJyksIGFycmF5KVxuICB9XG4gIHJldHVybiBhXG59XG5cbi8vcmV0dXJuIGEgU3RyZWFtIHRoYXQgcmVhZHMgdGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0XG4vL3Jlc3BlY3RpbmcgcGF1c2UoKSBhbmQgcmVzdW1lKClcblxuZXMucmVhZEFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgICAsIGkgPSAwXG4gICAgLCBwYXVzZWQgPSBmYWxzZVxuICAgICwgZW5kZWQgPSBmYWxzZVxuXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWVcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcblxuICBpZighQXJyYXkuaXNBcnJheShhcnJheSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdldmVudC1zdHJlYW0ucmVhZCBleHBlY3RzIGFuIGFycmF5JylcblxuICBzdHJlYW0ucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICBwYXVzZWQgPSBmYWxzZVxuICAgIHZhciBsID0gYXJyYXkubGVuZ3RoXG4gICAgd2hpbGUoaSA8IGwgJiYgIXBhdXNlZCAmJiAhZW5kZWQpIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgYXJyYXlbaSsrXSlcbiAgICB9XG4gICAgaWYoaSA9PSBsICYmICFlbmRlZClcbiAgICAgIGVuZGVkID0gdHJ1ZSwgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2UsIHN0cmVhbS5lbWl0KCdlbmQnKVxuICB9XG4gIHByb2Nlc3MubmV4dFRpY2soc3RyZWFtLnJlc3VtZSlcbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICBwYXVzZWQgPSB0cnVlXG4gIH1cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgZW5kZWQgPSB0cnVlXG4gICAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cbi8vXG4vLyByZWFkYWJsZSAoYXN5bmNGdW5jdGlvbilcbi8vIHJldHVybiBhIHN0cmVhbSB0aGF0IGNhbGxzIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWxlIHRoZSBzdHJlYW0gaXMgbm90IHBhdXNlZC5cbi8vXG4vLyB0aGUgZnVuY3Rpb24gbXVzdCB0YWtlOiAoY291bnQsIGNhbGxiYWNrKSB7Li4uXG4vL1xuXG5lcy5yZWFkYWJsZSA9XG5mdW5jdGlvbiAoZnVuYywgY29udGludWVPbkVycm9yKSB7XG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgICAsIGkgPSAwXG4gICAgLCBwYXVzZWQgPSBmYWxzZVxuICAgICwgZW5kZWQgPSBmYWxzZVxuICAgICwgcmVhZGluZyA9IGZhbHNlXG5cbiAgc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZVxuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZVxuXG4gIGlmKCdmdW5jdGlvbicgIT09IHR5cGVvZiBmdW5jKVxuICAgIHRocm93IG5ldyBFcnJvcignZXZlbnQtc3RyZWFtLnJlYWRhYmxlIGV4cGVjdHMgYXN5bmMgZnVuY3Rpb24nKVxuXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBlbmRlZCA9IHRydWUgfSlcblxuICBmdW5jdGlvbiBnZXQgKGVyciwgZGF0YSkge1xuXG4gICAgaWYoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICBpZighY29udGludWVPbkVycm9yKSBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKVxuICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBkYXRhKVxuXG4gICAgaW1tZWRpYXRlbHkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYoZW5kZWQgfHwgcGF1c2VkIHx8IHJlYWRpbmcpIHJldHVyblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhZGluZyA9IHRydWVcbiAgICAgICAgZnVuYy5jYWxsKHN0cmVhbSwgaSsrLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgICAgZ2V0LmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBzdHJlYW0ucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIHBhdXNlZCA9IGZhbHNlXG4gICAgZ2V0KClcbiAgfVxuICBwcm9jZXNzLm5leHRUaWNrKGdldClcbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICBwYXVzZWQgPSB0cnVlXG4gIH1cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbiAgICBlbmRlZCA9IHRydWVcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cblxuLy9cbi8vIG1hcCBzeW5jXG4vL1xuXG5lcy5tYXBTeW5jID0gZnVuY3Rpb24gKHN5bmMpIHtcbiAgcmV0dXJuIGVzLnRocm91Z2goZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICAgIHZhciBtYXBwZWREYXRhXG4gICAgdHJ5IHtcbiAgICAgIG1hcHBlZERhdGEgPSBzeW5jKGRhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICB9XG4gICAgaWYgKG1hcHBlZERhdGEgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZW1pdCgnZGF0YScsIG1hcHBlZERhdGEpXG4gIH0pXG59XG5cbi8vXG4vLyBmaWx0ZXJTeW5jXG4vL1xuXG5lcy5maWx0ZXJTeW5jID0gZnVuY3Rpb24gKHRlc3QpIHtcbiAgcmV0dXJuIGVzLnRocm91Z2goZnVuY3Rpb24oZGF0YSl7XG4gICAgdmFyIHMgPSB0aGlzXG4gICAgaWYgKHRlc3QoZGF0YSkpIHtcbiAgICAgIHMucXVldWUoZGF0YSlcbiAgICB9XG4gIH0pO1xufVxuXG4vL1xuLy8gZmxhdG1hcFN5bmNcbi8vXG5cbmVzLmZsYXRtYXBTeW5jID0gZnVuY3Rpb24gKG1hcHBlcikge1xuICByZXR1cm4gZXMudGhyb3VnaChmdW5jdGlvbihkYXRhKSB7XG4gICAgdmFyIHMgPSB0aGlzXG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgIHMucXVldWUobWFwcGVyKGUpKVxuICAgIH0pXG4gIH0pXG59XG5cbi8vXG4vLyBsb2cganVzdCBwcmludCBvdXQgd2hhdCBpcyBjb21pbmcgdGhyb3VnaCB0aGUgc3RyZWFtLCBmb3IgZGVidWdnaW5nXG4vL1xuXG5lcy5sb2cgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gZXMudGhyb3VnaChmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgaWYobmFtZSkgY29uc29sZS5lcnJvcihuYW1lLCBkYXRhKVxuICAgIGVsc2UgICAgIGNvbnNvbGUuZXJyb3IoZGF0YSlcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICB9KVxufVxuXG5cbi8vXG4vLyBjaGlsZCAtLSBwaXBlIHRocm91Z2ggYSBjaGlsZCBwcm9jZXNzXG4vL1xuXG5lcy5jaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuXG4gIHJldHVybiBlcy5kdXBsZXgoY2hpbGQuc3RkaW4sIGNoaWxkLnN0ZG91dClcblxufVxuXG4vL1xuLy8gcGFyc2Vcbi8vXG4vLyBtdXN0IGJlIHVzZWQgYWZ0ZXIgZXMuc3BsaXQoKSB0byBlbnN1cmUgdGhhdCBlYWNoIGNodW5rIHJlcHJlc2VudHMgYSBsaW5lXG4vLyBzb3VyY2UucGlwZShlcy5zcGxpdCgpKS5waXBlKGVzLnBhcnNlKCkpXG5cbmVzLnBhcnNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIGVtaXRFcnJvciA9ICEhKG9wdGlvbnMgPyBvcHRpb25zLmVycm9yIDogZmFsc2UpXG4gIHJldHVybiBlcy50aHJvdWdoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIG9ialxuICAgIHRyeSB7XG4gICAgICBpZihkYXRhKSAvL2lnbm9yZSBlbXB0eSBsaW5lc1xuICAgICAgICBvYmogPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlbWl0RXJyb3IpXG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyLCAnYXR0ZW1wdGluZyB0byBwYXJzZTonLCBkYXRhKVxuICAgIH1cbiAgICAvL2lnbm9yZSBsaW5lcyB0aGF0IHdoZXJlIG9ubHkgd2hpdGVzcGFjZS5cbiAgICBpZihvYmogIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZW1pdCgnZGF0YScsIG9iailcbiAgfSlcbn1cbi8vXG4vLyBzdHJpbmdpZnlcbi8vXG5cbmVzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlclxuICByZXR1cm4gZXMubWFwU3luYyhmdW5jdGlvbiAoZSl7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJ1ZmZlci5pc0J1ZmZlcihlKSA/IGUudG9TdHJpbmcoKSA6IGUpICsgJ1xcbidcbiAgfSlcbn1cblxuLy9cbi8vIHJlcGxhY2UgYSBzdHJpbmcgd2l0aGluIGEgc3RyZWFtLlxuLy9cbi8vIHdhcm46IGp1c3QgY29uY2F0ZW5hdGVzIHRoZSBzdHJpbmcgYW5kIHRoZW4gZG9lcyBzdHIuc3BsaXQoKS5qb2luKCkuXG4vLyBwcm9iYWJseSBub3Qgb3B0aW1hbC5cbi8vIGZvciBzbWFsbGlzaCByZXNwb25zZXMsIHdobyBjYXJlcz9cbi8vIEkgbmVlZCB0aGlzIGZvciBzaGFkb3ctbnBtIHNvIGl0J3Mgb25seSByZWxhdGl2ZWx5IHNtYWxsIGpzb24gZmlsZXMuXG5cbmVzLnJlcGxhY2UgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGVzLnBpcGVsaW5lKGVzLnNwbGl0KGZyb20pLCBlcy5qb2luKHRvKSlcbn1cblxuLy9cbi8vIGpvaW4gY2h1bmtzIHdpdGggYSBqb2luZXIuIGp1c3QgbGlrZSBBcnJheSNqb2luXG4vLyBhbHNvIGFjY2VwdHMgYSBjYWxsYmFjayB0aGF0IGlzIHBhc3NlZCB0aGUgY2h1bmtzIGFwcGVuZGVkIHRvZ2V0aGVyXG4vLyB0aGlzIGlzIHN0aWxsIHN1cHBvcnRlZCBmb3IgbGVnYWN5IHJlYXNvbnMuXG4vL1xuXG5lcy5qb2luID0gZnVuY3Rpb24gKHN0cikge1xuXG4gIC8vbGVnYWN5IGFwaVxuICBpZignZnVuY3Rpb24nID09PSB0eXBlb2Ygc3RyKVxuICAgIHJldHVybiBlcy53YWl0KHN0cilcblxuICB2YXIgZmlyc3QgPSB0cnVlXG4gIHJldHVybiBlcy50aHJvdWdoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoIWZpcnN0KVxuICAgICAgdGhpcy5lbWl0KCdkYXRhJywgc3RyKVxuICAgIGZpcnN0ID0gZmFsc2VcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIHJldHVybiB0cnVlXG4gIH0pXG59XG5cblxuLy9cbi8vIHdhaXQuIGNhbGxiYWNrIHdoZW4gJ2VuZCcgaXMgZW1pdHRlZCwgd2l0aCBhbGwgY2h1bmtzIGFwcGVuZGVkIGFzIHN0cmluZy5cbi8vXG5cbmVzLndhaXQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIGFyciA9IFtdXG4gIHJldHVybiBlcy50aHJvdWdoKGZ1bmN0aW9uIChkYXRhKSB7IGFyci5wdXNoKGRhdGEpIH0sXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGJvZHkgPSBCdWZmZXIuaXNCdWZmZXIoYXJyWzBdKSA/IEJ1ZmZlci5jb25jYXQoYXJyKVxuICAgICAgICA6IGFyci5qb2luKCcnKVxuICAgICAgdGhpcy5lbWl0KCdkYXRhJywgYm9keSlcbiAgICAgIHRoaXMuZW1pdCgnZW5kJylcbiAgICAgIGlmKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCBib2R5KVxuICAgIH0pXG59XG5cbmVzLnBpcGVhYmxlID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1tFVkVOVC1TVFJFQU1dIGVzLnBpcGVhYmxlIGlzIGRlcHJlY2F0ZWQnKVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFlcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgYm90aCBOYU4sIGZhbHNlIG90aGVyd2lzZVxuICByZXR1cm4gYSE9PWEgJiYgYiE9PWI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkYXRhLCBvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSBvcHRzID0geyBjbXA6IG9wdHMgfTtcbiAgICB2YXIgY3ljbGVzID0gKHR5cGVvZiBvcHRzLmN5Y2xlcyA9PT0gJ2Jvb2xlYW4nKSA/IG9wdHMuY3ljbGVzIDogZmFsc2U7XG5cbiAgICB2YXIgY21wID0gb3B0cy5jbXAgJiYgKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFvYmogPSB7IGtleTogYSwgdmFsdWU6IG5vZGVbYV0gfTtcbiAgICAgICAgICAgICAgICB2YXIgYm9iaiA9IHsga2V5OiBiLCB2YWx1ZTogbm9kZVtiXSB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBmKGFvYmosIGJvYmopO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9KShvcHRzLmNtcCk7XG5cbiAgICB2YXIgc2VlbiA9IFtdO1xuICAgIHJldHVybiAoZnVuY3Rpb24gc3RyaW5naWZ5IChub2RlKSB7XG4gICAgICAgIGlmIChub2RlICYmIG5vZGUudG9KU09OICYmIHR5cGVvZiBub2RlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUudG9KU09OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PSAnbnVtYmVyJykgcmV0dXJuIGlzRmluaXRlKG5vZGUpID8gJycgKyBub2RlIDogJ251bGwnO1xuICAgICAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9kZSk7XG5cbiAgICAgICAgdmFyIGksIG91dDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgICAgICAgIG91dCA9ICdbJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkpIG91dCArPSAnLCc7XG4gICAgICAgICAgICAgICAgb3V0ICs9IHN0cmluZ2lmeShub2RlW2ldKSB8fCAnbnVsbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0ICsgJ10nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG5cbiAgICAgICAgaWYgKHNlZW4uaW5kZXhPZihub2RlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChjeWNsZXMpIHJldHVybiBKU09OLnN0cmluZ2lmeSgnX19jeWNsZV9fJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5wdXNoKG5vZGUpIC0gMTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhub2RlKS5zb3J0KGNtcCAmJiBjbXAobm9kZSkpO1xuICAgICAgICBvdXQgPSAnJztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gc3RyaW5naWZ5KG5vZGVba2V5XSk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG91dCkgb3V0ICs9ICcsJztcbiAgICAgICAgICAgIG91dCArPSBKU09OLnN0cmluZ2lmeShrZXkpICsgJzonICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5zcGxpY2Uoc2VlbkluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuICd7JyArIG91dCArICd9JztcbiAgICB9KShkYXRhKTtcbn07XG4iLCIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwiXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG4vLyBmcm9tXG4vL1xuLy8gYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIGFuIHNvdXJjZS5cbi8vIHNvdXJjZSBtYXkgYmUgYW4gYXJyYXksIG9yIGEgZnVuY3Rpb24uXG4vLyBmcm9tIGhhbmRsZXMgcGF1c2UgYmVoYXZpb3VyIGZvciB5b3UuXG5cbm1vZHVsZS5leHBvcnRzID1cbmZ1bmN0aW9uIGZyb20gKHNvdXJjZSkge1xuICBpZihBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcblx0XHR2YXIgc291cmNlX2luZGV4ID0gMCwgc291cmNlX2xlbiA9IHNvdXJjZS5sZW5ndGg7XG4gICAgcmV0dXJuIGZyb20gKGZ1bmN0aW9uIChpKSB7XG4gICAgICBpZihzb3VyY2VfaW5kZXggPCBzb3VyY2VfbGVuKVxuICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBzb3VyY2Vbc291cmNlX2luZGV4KytdKVxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pXG4gIH1cbiAgdmFyIHMgPSBuZXcgU3RyZWFtKCksIGkgPSAwXG4gIHMuZW5kZWQgPSBmYWxzZVxuICBzLnN0YXJ0ZWQgPSBmYWxzZVxuICBzLnJlYWRhYmxlID0gdHJ1ZVxuICBzLndyaXRhYmxlID0gZmFsc2VcbiAgcy5wYXVzZWQgPSBmYWxzZVxuICBzLmVuZGVkID0gZmFsc2VcbiAgcy5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgcy5wYXVzZWQgPSB0cnVlXG4gIH1cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgcy5zdGFydGVkID0gdHJ1ZVxuICAgIGlmKHMuZW5kZWQpIHJldHVyblxuICAgIHdoaWxlKCFzLmVuZGVkICYmICFzLnBhdXNlZCAmJiBzb3VyY2UuY2FsbChzLCBpKyssIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKCFzLmVuZGVkICYmICFzLnBhdXNlZClcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKG5leHQpO1xuICAgIH0pKVxuICAgICAgO1xuICB9XG4gIHMucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIHMuc3RhcnRlZCA9IHRydWVcbiAgICBzLnBhdXNlZCA9IGZhbHNlXG4gICAgbmV4dCgpXG4gIH1cbiAgcy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHMuZW5kZWQgPSB0cnVlXG4gICAgcy5yZWFkYWJsZSA9IGZhbHNlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhzLmRlc3Ryb3kpXG4gIH0pXG4gIHMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBzLmVuZGVkID0gdHJ1ZVxuICAgIHMuZW1pdCgnY2xvc2UnKSBcbiAgfVxuICAvKlxuICAgIGJ5IGRlZmF1bHQsIHRoZSBzdHJlYW0gd2lsbCBzdGFydCBlbWl0dGluZyBhdCBuZXh0VGlja1xuICAgIGlmIHlvdSB3YW50LCB5b3UgY2FuIHBhdXNlIGl0LCBhZnRlciBwaXBlaW5nLlxuICAgIHlvdSBjYW4gYWxzbyByZXN1bWUgYmVmb3JlIG5leHQgdGljaywgYW5kIHRoYXQgd2lsbCBhbHNvXG4gICAgd29yay5cbiAgKi9cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgaWYoIXMuc3RhcnRlZCkgcy5yZXN1bWUoKVxuICB9KVxuICByZXR1cm4gc1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSAob2JqZWN0KSA9PiBPYmplY3RcbiAgICAuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdClcbiAgICAuZmlsdGVyKChrZXlTeW1ib2wpID0+IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIGtleVN5bWJvbCkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZnRlclJlcXVlc3Q6IHJlcXVpcmUoJy4vYWZ0ZXJSZXF1ZXN0Lmpzb24nKSxcbiAgYmVmb3JlUmVxdWVzdDogcmVxdWlyZSgnLi9iZWZvcmVSZXF1ZXN0Lmpzb24nKSxcbiAgYnJvd3NlcjogcmVxdWlyZSgnLi9icm93c2VyLmpzb24nKSxcbiAgY2FjaGU6IHJlcXVpcmUoJy4vY2FjaGUuanNvbicpLFxuICBjb250ZW50OiByZXF1aXJlKCcuL2NvbnRlbnQuanNvbicpLFxuICBjb29raWU6IHJlcXVpcmUoJy4vY29va2llLmpzb24nKSxcbiAgY3JlYXRvcjogcmVxdWlyZSgnLi9jcmVhdG9yLmpzb24nKSxcbiAgZW50cnk6IHJlcXVpcmUoJy4vZW50cnkuanNvbicpLFxuICBoYXI6IHJlcXVpcmUoJy4vaGFyLmpzb24nKSxcbiAgaGVhZGVyOiByZXF1aXJlKCcuL2hlYWRlci5qc29uJyksXG4gIGxvZzogcmVxdWlyZSgnLi9sb2cuanNvbicpLFxuICBwYWdlOiByZXF1aXJlKCcuL3BhZ2UuanNvbicpLFxuICBwYWdlVGltaW5nczogcmVxdWlyZSgnLi9wYWdlVGltaW5ncy5qc29uJyksXG4gIHBvc3REYXRhOiByZXF1aXJlKCcuL3Bvc3REYXRhLmpzb24nKSxcbiAgcXVlcnk6IHJlcXVpcmUoJy4vcXVlcnkuanNvbicpLFxuICByZXF1ZXN0OiByZXF1aXJlKCcuL3JlcXVlc3QuanNvbicpLFxuICByZXNwb25zZTogcmVxdWlyZSgnLi9yZXNwb25zZS5qc29uJyksXG4gIHRpbWluZ3M6IHJlcXVpcmUoJy4vdGltaW5ncy5qc29uJylcbn1cbiIsIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh4KSB7XG5cdHZhciB0eXBlID0gdHlwZW9mIHg7XG5cdHJldHVybiB4ICE9PSBudWxsICYmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZSkge1xuXHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHJhdmVyc2UgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzY2hlbWEsIG9wdHMsIGNiKSB7XG4gIC8vIExlZ2FjeSBzdXBwb3J0IGZvciB2MC4zLjEgYW5kIGVhcmxpZXIuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIGNiID0gb3B0cy5jYiB8fCBjYjtcbiAgdmFyIHByZSA9ICh0eXBlb2YgY2IgPT0gJ2Z1bmN0aW9uJykgPyBjYiA6IGNiLnByZSB8fCBmdW5jdGlvbigpIHt9O1xuICB2YXIgcG9zdCA9IGNiLnBvc3QgfHwgZnVuY3Rpb24oKSB7fTtcblxuICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hlbWEsICcnLCBzY2hlbWEpO1xufTtcblxuXG50cmF2ZXJzZS5rZXl3b3JkcyA9IHtcbiAgYWRkaXRpb25hbEl0ZW1zOiB0cnVlLFxuICBpdGVtczogdHJ1ZSxcbiAgY29udGFpbnM6IHRydWUsXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICBwcm9wZXJ0eU5hbWVzOiB0cnVlLFxuICBub3Q6IHRydWVcbn07XG5cbnRyYXZlcnNlLmFycmF5S2V5d29yZHMgPSB7XG4gIGl0ZW1zOiB0cnVlLFxuICBhbGxPZjogdHJ1ZSxcbiAgYW55T2Y6IHRydWUsXG4gIG9uZU9mOiB0cnVlXG59O1xuXG50cmF2ZXJzZS5wcm9wc0tleXdvcmRzID0ge1xuICBkZWZpbml0aW9uczogdHJ1ZSxcbiAgcHJvcGVydGllczogdHJ1ZSxcbiAgcGF0dGVyblByb3BlcnRpZXM6IHRydWUsXG4gIGRlcGVuZGVuY2llczogdHJ1ZVxufTtcblxudHJhdmVyc2Uuc2tpcEtleXdvcmRzID0ge1xuICBkZWZhdWx0OiB0cnVlLFxuICBlbnVtOiB0cnVlLFxuICBjb25zdDogdHJ1ZSxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIG1heGltdW06IHRydWUsXG4gIG1pbmltdW06IHRydWUsXG4gIGV4Y2x1c2l2ZU1heGltdW06IHRydWUsXG4gIGV4Y2x1c2l2ZU1pbmltdW06IHRydWUsXG4gIG11bHRpcGxlT2Y6IHRydWUsXG4gIG1heExlbmd0aDogdHJ1ZSxcbiAgbWluTGVuZ3RoOiB0cnVlLFxuICBwYXR0ZXJuOiB0cnVlLFxuICBmb3JtYXQ6IHRydWUsXG4gIG1heEl0ZW1zOiB0cnVlLFxuICBtaW5JdGVtczogdHJ1ZSxcbiAgdW5pcXVlSXRlbXM6IHRydWUsXG4gIG1heFByb3BlcnRpZXM6IHRydWUsXG4gIG1pblByb3BlcnRpZXM6IHRydWVcbn07XG5cblxuZnVuY3Rpb24gX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KSB7XG4gIGlmIChzY2hlbWEgJiYgdHlwZW9mIHNjaGVtYSA9PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgcHJlKHNjaGVtYSwganNvblB0ciwgcm9vdFNjaGVtYSwgcGFyZW50SnNvblB0ciwgcGFyZW50S2V5d29yZCwgcGFyZW50U2NoZW1hLCBrZXlJbmRleCk7XG4gICAgZm9yICh2YXIga2V5IGluIHNjaGVtYSkge1xuICAgICAgdmFyIHNjaCA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoKSkge1xuICAgICAgICBpZiAoa2V5IGluIHRyYXZlcnNlLmFycmF5S2V5d29yZHMpIHtcbiAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2NoLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoW2ldLCBqc29uUHRyICsgJy8nICsga2V5ICsgJy8nICsgaSwgcm9vdFNjaGVtYSwganNvblB0ciwga2V5LCBzY2hlbWEsIGkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSBpbiB0cmF2ZXJzZS5wcm9wc0tleXdvcmRzKSB7XG4gICAgICAgIGlmIChzY2ggJiYgdHlwZW9mIHNjaCA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gc2NoKVxuICAgICAgICAgICAgX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoW3Byb3BdLCBqc29uUHRyICsgJy8nICsga2V5ICsgJy8nICsgZXNjYXBlSnNvblB0cihwcm9wKSwgcm9vdFNjaGVtYSwganNvblB0ciwga2V5LCBzY2hlbWEsIHByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSBpbiB0cmF2ZXJzZS5rZXl3b3JkcyB8fCAob3B0cy5hbGxLZXlzICYmICEoa2V5IGluIHRyYXZlcnNlLnNraXBLZXl3b3JkcykpKSB7XG4gICAgICAgIF90cmF2ZXJzZShvcHRzLCBwcmUsIHBvc3QsIHNjaCwganNvblB0ciArICcvJyArIGtleSwgcm9vdFNjaGVtYSwganNvblB0ciwga2V5LCBzY2hlbWEpO1xuICAgICAgfVxuICAgIH1cbiAgICBwb3N0KHNjaGVtYSwganNvblB0ciwgcm9vdFNjaGVtYSwgcGFyZW50SnNvblB0ciwgcGFyZW50S2V5d29yZCwgcGFyZW50U2NoZW1hLCBrZXlJbmRleCk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBlc2NhcGVKc29uUHRyKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL34vZywgJ34wJykucmVwbGFjZSgvXFwvL2csICd+MScpO1xufVxuIiwiLy9maWx0ZXIgd2lsbCByZWVtaXQgdGhlIGRhdGEgaWYgY2IoZXJyLHBhc3MpIHBhc3MgaXMgdHJ1dGh5XG5cbi8vIHJlZHVjZSBpcyBtb3JlIHRyaWNreVxuLy8gbWF5YmUgd2Ugd2FudCB0byBncm91cCB0aGUgcmVkdWN0aW9ucyBvciBlbWl0IHByb2dyZXNzIHVwZGF0ZXMgb2NjYXNpb25hbGx5XG4vLyB0aGUgbW9zdCBiYXNpYyByZWR1Y2UganVzdCBlbWl0cyBvbmUgJ2RhdGEnIGV2ZW50IGFmdGVyIGl0IGhhcyByZWNpZXZlZCAnZW5kJ1xuXG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW1cblxuXG4vL2NyZWF0ZSBhbiBldmVudCBzdHJlYW0gYW5kIGFwcGx5IGZ1bmN0aW9uIHRvIGVhY2ggLndyaXRlXG4vL2VtaXR0aW5nIGVhY2ggcmVzcG9uc2UgYXMgZGF0YVxuLy91bmxlc3MgaXQncyBhbiBlbXB0eSBjYWxsYmFja1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtYXBwZXIsIG9wdHMpIHtcblxuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gICAgLCBpbnB1dHMgPSAwXG4gICAgLCBvdXRwdXRzID0gMFxuICAgICwgZW5kZWQgPSBmYWxzZVxuICAgICwgcGF1c2VkID0gZmFsc2VcbiAgICAsIGRlc3Ryb3llZCA9IGZhbHNlXG4gICAgLCBsYXN0V3JpdHRlbiA9IDBcbiAgICAsIGluTmV4dCA9IGZhbHNlXG5cbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciBlcnJvckV2ZW50TmFtZSA9IG9wdHMuZmFpbHVyZXMgPyAnZmFpbHVyZScgOiAnZXJyb3InO1xuXG4gIC8vIEl0ZW1zIHRoYXQgYXJlIG5vdCByZWFkeSB0byBiZSB3cml0dGVuIHlldCAoYmVjYXVzZSB0aGV5IHdvdWxkIGNvbWUgb3V0IG9mXG4gIC8vIG9yZGVyKSBnZXQgc3R1Y2sgaW4gYSBxdWV1ZSBmb3IgbGF0ZXIuXG4gIHZhciB3cml0ZVF1ZXVlID0ge31cblxuICBzdHJlYW0ud3JpdGFibGUgPSB0cnVlXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWVcblxuICBmdW5jdGlvbiBxdWV1ZURhdGEgKGRhdGEsIG51bWJlcikge1xuICAgIHZhciBuZXh0VG9Xcml0ZSA9IGxhc3RXcml0dGVuICsgMVxuXG4gICAgaWYgKG51bWJlciA9PT0gbmV4dFRvV3JpdGUpIHtcbiAgICAgIC8vIElmIGl0J3MgbmV4dCwgYW5kIGl0cyBub3QgdW5kZWZpbmVkIHdyaXRlIGl0XG4gICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0LmFwcGx5KHN0cmVhbSwgWydkYXRhJywgZGF0YV0pXG4gICAgICB9XG4gICAgICBsYXN0V3JpdHRlbiArK1xuICAgICAgbmV4dFRvV3JpdGUgKytcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIHF1ZXVlIGl0IGZvciBsYXRlci5cbiAgICAgIHdyaXRlUXVldWVbbnVtYmVyXSA9IGRhdGFcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV4dCB2YWx1ZSBpcyBpbiB0aGUgcXVldWUsIHdyaXRlIGl0XG4gICAgaWYgKHdyaXRlUXVldWUuaGFzT3duUHJvcGVydHkobmV4dFRvV3JpdGUpKSB7XG4gICAgICB2YXIgZGF0YVRvV3JpdGUgPSB3cml0ZVF1ZXVlW25leHRUb1dyaXRlXVxuICAgICAgZGVsZXRlIHdyaXRlUXVldWVbbmV4dFRvV3JpdGVdXG4gICAgICByZXR1cm4gcXVldWVEYXRhKGRhdGFUb1dyaXRlLCBuZXh0VG9Xcml0ZSlcbiAgICB9XG5cbiAgICBvdXRwdXRzICsrXG4gICAgaWYoaW5wdXRzID09PSBvdXRwdXRzKSB7XG4gICAgICBpZihwYXVzZWQpIHBhdXNlZCA9IGZhbHNlLCBzdHJlYW0uZW1pdCgnZHJhaW4nKSAvL3dyaXR0ZW4gYWxsIHRoZSBpbmNvbWluZyBldmVudHNcbiAgICAgIGlmKGVuZGVkKSBlbmQoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQgKGVyciwgZGF0YSwgbnVtYmVyKSB7XG4gICAgaWYoZGVzdHJveWVkKSByZXR1cm5cbiAgICBpbk5leHQgPSB0cnVlXG5cbiAgICBpZiAoIWVyciB8fCBvcHRzLmZhaWx1cmVzKSB7XG4gICAgICBxdWV1ZURhdGEoZGF0YSwgbnVtYmVyKVxuICAgIH1cblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHN0cmVhbS5lbWl0LmFwcGx5KHN0cmVhbSwgWyBlcnJvckV2ZW50TmFtZSwgZXJyIF0pO1xuICAgIH1cblxuICAgIGluTmV4dCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gV3JhcCB0aGUgbWFwcGVyIGZ1bmN0aW9uIGJ5IGNhbGxpbmcgaXRzIGNhbGxiYWNrIHdpdGggdGhlIG9yZGVyIG51bWJlciBvZlxuICAvLyB0aGUgaXRlbSBpbiB0aGUgc3RyZWFtLlxuICBmdW5jdGlvbiB3cmFwcGVkTWFwcGVyIChpbnB1dCwgbnVtYmVyLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBtYXBwZXIuY2FsbChudWxsLCBpbnB1dCwgZnVuY3Rpb24oZXJyLCBkYXRhKXtcbiAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSwgbnVtYmVyKVxuICAgIH0pXG4gIH1cblxuICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKGVuZGVkKSB0aHJvdyBuZXcgRXJyb3IoJ21hcCBzdHJlYW0gaXMgbm90IHdyaXRhYmxlJylcbiAgICBpbk5leHQgPSBmYWxzZVxuICAgIGlucHV0cyArK1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vY2F0Y2ggc3luYyBlcnJvcnMgYW5kIGhhbmRsZSB0aGVtIGxpa2UgYXN5bmMgZXJyb3JzXG4gICAgICB2YXIgd3JpdHRlbiA9IHdyYXBwZWRNYXBwZXIoZGF0YSwgaW5wdXRzLCBuZXh0KVxuICAgICAgcGF1c2VkID0gKHdyaXR0ZW4gPT09IGZhbHNlKVxuICAgICAgcmV0dXJuICFwYXVzZWRcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vaWYgdGhlIGNhbGxiYWNrIGhhcyBiZWVuIGNhbGxlZCBzeW5jcm9ub3VzbHksIGFuZCB0aGUgZXJyb3JcbiAgICAgIC8vaGFzIG9jY3VyZWQgaW4gYW4gbGlzdGVuZXIsIHRocm93IGl0IGFnYWluLlxuICAgICAgaWYoaW5OZXh0KVxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIG5leHQoZXJyKVxuICAgICAgcmV0dXJuICFwYXVzZWRcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmQgKGRhdGEpIHtcbiAgICAvL2lmIGVuZCB3YXMgY2FsbGVkIHdpdGggYXJncywgd3JpdGUgaXQsIFxuICAgIGVuZGVkID0gdHJ1ZSAvL3dyaXRlIHdpbGwgZW1pdCAnZW5kJyBpZiBlbmRlZCBpcyB0cnVlXG4gICAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcbiAgICBpZihkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBxdWV1ZURhdGEoZGF0YSwgaW5wdXRzKVxuICAgIH0gZWxzZSBpZiAoaW5wdXRzID09IG91dHB1dHMpIHsgLy93YWl0IGZvciBwcm9jZXNzaW5nIFxuICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2UsIHN0cmVhbS5lbWl0KCdlbmQnKSwgc3RyZWFtLmRlc3Ryb3koKSBcbiAgICB9XG4gIH1cblxuICBzdHJlYW0uZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuXG4gICAgZW5kKGRhdGEpXG4gIH1cblxuICBzdHJlYW0uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBlbmRlZCA9IGRlc3Ryb3llZCA9IHRydWVcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBzdHJlYW0ucmVhZGFibGUgPSBwYXVzZWQgPSBmYWxzZVxuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbiAgICB9KVxuICB9XG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwYXVzZWQgPSB0cnVlXG4gIH1cblxuICBzdHJlYW0ucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIHBhdXNlZCA9IGZhbHNlXG4gIH1cblxuICByZXR1cm4gc3RyZWFtXG59XG5cblxuXG5cbiIsIi8vdGhyb3VnaEAyIGhhbmRsZXMgdGhpcyBieSBkZWZhdWx0IVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCd0aHJvdWdoJylcblxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8vIElmIG9iai5oYXNPd25Qcm9wZXJ0eSBoYXMgYmVlbiBvdmVycmlkZGVuLCB0aGVuIGNhbGxpbmdcbi8vIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSB3aWxsIGJyZWFrLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MDdcbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocXMsIHNlcCwgZXEsIG9wdGlvbnMpIHtcbiAgc2VwID0gc2VwIHx8ICcmJztcbiAgZXEgPSBlcSB8fCAnPSc7XG4gIHZhciBvYmogPSB7fTtcblxuICBpZiAodHlwZW9mIHFzICE9PSAnc3RyaW5nJyB8fCBxcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgdmFyIHJlZ2V4cCA9IC9cXCsvZztcbiAgcXMgPSBxcy5zcGxpdChzZXApO1xuXG4gIHZhciBtYXhLZXlzID0gMTAwMDtcbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMubWF4S2V5cyA9PT0gJ251bWJlcicpIHtcbiAgICBtYXhLZXlzID0gb3B0aW9ucy5tYXhLZXlzO1xuICB9XG5cbiAgdmFyIGxlbiA9IHFzLmxlbmd0aDtcbiAgLy8gbWF4S2V5cyA8PSAwIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIG5vdCBsaW1pdCBrZXlzIGNvdW50XG4gIGlmIChtYXhLZXlzID4gMCAmJiBsZW4gPiBtYXhLZXlzKSB7XG4gICAgbGVuID0gbWF4S2V5cztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICB2YXIgeCA9IHFzW2ldLnJlcGxhY2UocmVnZXhwLCAnJTIwJyksXG4gICAgICAgIGlkeCA9IHguaW5kZXhPZihlcSksXG4gICAgICAgIGtzdHIsIHZzdHIsIGssIHY7XG5cbiAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgIGtzdHIgPSB4LnN1YnN0cigwLCBpZHgpO1xuICAgICAgdnN0ciA9IHguc3Vic3RyKGlkeCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrc3RyID0geDtcbiAgICAgIHZzdHIgPSAnJztcbiAgICB9XG5cbiAgICBrID0gZGVjb2RlVVJJQ29tcG9uZW50KGtzdHIpO1xuICAgIHYgPSBkZWNvZGVVUklDb21wb25lbnQodnN0cik7XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5KG9iaiwgaykpIHtcbiAgICAgIG9ialtrXSA9IHY7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9ialtrXSkpIHtcbiAgICAgIG9ialtrXS5wdXNoKHYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba10gPSBbb2JqW2tdLCB2XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gb2JqW2tdLm1hcChmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5leHBvcnRzLmVuY29kZSA9IGV4cG9ydHMuc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBjb2RlcyA9IHt9O1xuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclR5cGUoY29kZSwgbWVzc2FnZSwgQmFzZSkge1xuICBpZiAoIUJhc2UpIHtcbiAgICBCYXNlID0gRXJyb3I7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXNzYWdlKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1lc3NhZ2UoYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIE5vZGVFcnJvciA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKF9CYXNlKSB7XG4gICAgX2luaGVyaXRzTG9vc2UoTm9kZUVycm9yLCBfQmFzZSk7XG5cbiAgICBmdW5jdGlvbiBOb2RlRXJyb3IoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgcmV0dXJuIF9CYXNlLmNhbGwodGhpcywgZ2V0TWVzc2FnZShhcmcxLCBhcmcyLCBhcmczKSkgfHwgdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gTm9kZUVycm9yO1xuICB9KEJhc2UpO1xuXG4gIE5vZGVFcnJvci5wcm90b3R5cGUubmFtZSA9IEJhc2UubmFtZTtcbiAgTm9kZUVycm9yLnByb3RvdHlwZS5jb2RlID0gY29kZTtcbiAgY29kZXNbY29kZV0gPSBOb2RlRXJyb3I7XG59IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL3YxMC44LjAvbGliL2ludGVybmFsL2Vycm9ycy5qc1xuXG5cbmZ1bmN0aW9uIG9uZU9mKGV4cGVjdGVkLCB0aGluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICB2YXIgbGVuID0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGkpO1xuICAgIH0pO1xuXG4gICAgaWYgKGxlbiA+IDIpIHtcbiAgICAgIHJldHVybiBcIm9uZSBvZiBcIi5jb25jYXQodGhpbmcsIFwiIFwiKS5jb25jYXQoZXhwZWN0ZWQuc2xpY2UoMCwgbGVuIC0gMSkuam9pbignLCAnKSwgXCIsIG9yIFwiKSArIGV4cGVjdGVkW2xlbiAtIDFdO1xuICAgIH0gZWxzZSBpZiAobGVuID09PSAyKSB7XG4gICAgICByZXR1cm4gXCJvbmUgb2YgXCIuY29uY2F0KHRoaW5nLCBcIiBcIikuY29uY2F0KGV4cGVjdGVkWzBdLCBcIiBvciBcIikuY29uY2F0KGV4cGVjdGVkWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwib2YgXCIuY29uY2F0KHRoaW5nLCBcIiBcIikuY29uY2F0KGV4cGVjdGVkWzBdKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwib2YgXCIuY29uY2F0KHRoaW5nLCBcIiBcIikuY29uY2F0KFN0cmluZyhleHBlY3RlZCkpO1xuICB9XG59IC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9zdGFydHNXaXRoXG5cblxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHNlYXJjaCwgcG9zKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyKCFwb3MgfHwgcG9zIDwgMCA/IDAgOiArcG9zLCBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xufSAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvZW5kc1dpdGhcblxuXG5mdW5jdGlvbiBlbmRzV2l0aChzdHIsIHNlYXJjaCwgdGhpc19sZW4pIHtcbiAgaWYgKHRoaXNfbGVuID09PSB1bmRlZmluZWQgfHwgdGhpc19sZW4gPiBzdHIubGVuZ3RoKSB7XG4gICAgdGhpc19sZW4gPSBzdHIubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcodGhpc19sZW4gLSBzZWFyY2gubGVuZ3RoLCB0aGlzX2xlbikgPT09IHNlYXJjaDtcbn0gLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2luY2x1ZGVzXG5cblxuZnVuY3Rpb24gaW5jbHVkZXMoc3RyLCBzZWFyY2gsIHN0YXJ0KSB7XG4gIGlmICh0eXBlb2Ygc3RhcnQgIT09ICdudW1iZXInKSB7XG4gICAgc3RhcnQgPSAwO1xuICB9XG5cbiAgaWYgKHN0YXJ0ICsgc2VhcmNoLmxlbmd0aCA+IHN0ci5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5pbmRleE9mKHNlYXJjaCwgc3RhcnQpICE9PSAtMTtcbiAgfVxufVxuXG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9JTlZBTElEX09QVF9WQUxVRScsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gJ1RoZSB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCInICsgbmFtZSArICdcIic7XG59LCBUeXBlRXJyb3IpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfSU5WQUxJRF9BUkdfVFlQRScsIGZ1bmN0aW9uIChuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSB7XG4gIC8vIGRldGVybWluZXI6ICdtdXN0IGJlJyBvciAnbXVzdCBub3QgYmUnXG4gIHZhciBkZXRlcm1pbmVyO1xuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnICYmIHN0YXJ0c1dpdGgoZXhwZWN0ZWQsICdub3QgJykpIHtcbiAgICBkZXRlcm1pbmVyID0gJ211c3Qgbm90IGJlJztcbiAgICBleHBlY3RlZCA9IGV4cGVjdGVkLnJlcGxhY2UoL15ub3QgLywgJycpO1xuICB9IGVsc2Uge1xuICAgIGRldGVybWluZXIgPSAnbXVzdCBiZSc7XG4gIH1cblxuICB2YXIgbXNnO1xuXG4gIGlmIChlbmRzV2l0aChuYW1lLCAnIGFyZ3VtZW50JykpIHtcbiAgICAvLyBGb3IgY2FzZXMgbGlrZSAnZmlyc3QgYXJndW1lbnQnXG4gICAgbXNnID0gXCJUaGUgXCIuY29uY2F0KG5hbWUsIFwiIFwiKS5jb25jYXQoZGV0ZXJtaW5lciwgXCIgXCIpLmNvbmNhdChvbmVPZihleHBlY3RlZCwgJ3R5cGUnKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHR5cGUgPSBpbmNsdWRlcyhuYW1lLCAnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCc7XG4gICAgbXNnID0gXCJUaGUgXFxcIlwiLmNvbmNhdChuYW1lLCBcIlxcXCIgXCIpLmNvbmNhdCh0eXBlLCBcIiBcIikuY29uY2F0KGRldGVybWluZXIsIFwiIFwiKS5jb25jYXQob25lT2YoZXhwZWN0ZWQsICd0eXBlJykpO1xuICB9XG5cbiAgbXNnICs9IFwiLiBSZWNlaXZlZCB0eXBlIFwiLmNvbmNhdCh0eXBlb2YgYWN0dWFsKTtcbiAgcmV0dXJuIG1zZztcbn0sIFR5cGVFcnJvcik7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YnLCAnc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQnLCBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gJ1RoZSAnICsgbmFtZSArICcgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCc7XG59KTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnLCAnUHJlbWF0dXJlIGNsb3NlJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fREVTVFJPWUVEJywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuICdDYW5ub3QgY2FsbCAnICsgbmFtZSArICcgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZCc7XG59KTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX01VTFRJUExFX0NBTExCQUNLJywgJ0NhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcycpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX0NBTk5PVF9QSVBFJywgJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQnLCAnd3JpdGUgYWZ0ZXIgZW5kJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fTlVMTF9WQUxVRVMnLCAnTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nLCBUeXBlRXJyb3IpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfVU5LTk9XTl9FTkNPRElORycsIGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuICdVbmtub3duIGVuY29kaW5nOiAnICsgYXJnO1xufSwgVHlwZUVycm9yKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCcsICdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xubW9kdWxlLmV4cG9ydHMuY29kZXMgPSBjb2RlcztcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikga2V5cy5wdXNoKGtleSk7XG4gIHJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG5jb25zdCBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xucmVxdWlyZSgnaW5oZXJpdHMnKShEdXBsZXgsIFJlYWRhYmxlKTtcbntcbiAgLy8gQWxsb3cgdGhlIGtleXMgYXJyYXkgdG8gYmUgR0MnZWQuXG4gIGNvbnN0IGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG4gIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgIGNvbnN0IG1ldGhvZCA9IGtleXNbdl07XG4gICAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xuICB9XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG4gICAgfVxuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoO1xuICB9XG59KTtcblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIElmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLCB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3MubmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuY29uc3QgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gRUVsaXN0ZW5lckNvdW50KGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuY29uc3QgT3VyVWludDhBcnJheSA9ICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9KS5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xufVxuZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXk7XG59XG5cbi8qPHJlcGxhY2VtZW50PiovXG5jb25zdCBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5sZXQgZGVidWc7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uIGRlYnVnKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuY29uc3QgQnVmZmVyTGlzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9idWZmZXJfbGlzdCcpO1xuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpO1xuY29uc3QgX3JlcXVpcmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RhdGUnKSxcbiAgZ2V0SGlnaFdhdGVyTWFyayA9IF9yZXF1aXJlLmdldEhpZ2hXYXRlck1hcms7XG5jb25zdCBfcmVxdWlyZSRjb2RlcyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpLmNvZGVzLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFLFxuICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxcbiAgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ7XG5cbi8vIExhenkgbG9hZGVkIHRvIGltcHJvdmUgdGhlIHN0YXJ0dXAgcGVyZm9ybWFuY2UuXG5sZXQgU3RyaW5nRGVjb2RlcjtcbmxldCBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3I7XG5sZXQgZnJvbTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoUmVhZGFibGUsIFN0cmVhbSk7XG5jb25zdCBlcnJvck9yRGVzdHJveSA9IGRlc3Ryb3lJbXBsLmVycm9yT3JEZXN0cm95O1xuY29uc3Qga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG5cbiAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGdldEhpZ2hXYXRlck1hcmsodGhpcywgb3B0aW9ucywgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIGlzRHVwbGV4KTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gIHRoaXMucGF1c2VkID0gdHJ1ZTtcblxuICAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuICB0aGlzLmVtaXRDbG9zZSA9IG9wdGlvbnMuZW1pdENsb3NlICE9PSBmYWxzZTtcblxuICAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2VuZCcgKGFuZCBwb3RlbnRpYWxseSAnZmluaXNoJylcbiAgdGhpcy5hdXRvRGVzdHJveSA9ICEhb3B0aW9ucy5hdXRvRGVzdHJveTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgUmVhZGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjVcbiAgY29uc3QgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgRHVwbGV4O1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldCgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0KHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKTtcbn07XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgc2tpcENodW5rQ2hlY2s7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBlbmNvZGluZyA9ICcnO1xuICAgICAgfVxuICAgICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCwgc2tpcENodW5rQ2hlY2spIHtcbiAgZGVidWcoJ3JlYWRhYmxlQWRkQ2h1bmsnLCBjaHVuayk7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGVyO1xuICAgIGlmICghc2tpcENodW5rQ2hlY2spIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gICAgaWYgKGVyKSB7XG4gICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgIXN0YXRlLm9iamVjdE1vZGUgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGNodW5rKSAhPT0gQnVmZmVyLnByb3RvdHlwZSkge1xuICAgICAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICAgICAgfVxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQoKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YoKSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO2Vsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cblxuICAvLyBXZSBjYW4gcHVzaCBtb3JlIGRhdGEgaWYgd2UgYXJlIGJlbG93IHRoZSBoaWdoV2F0ZXJNYXJrLlxuICAvLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZSBtb3JlIGJ5dGVzLlxuICAvLyBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLCBzdWNoIGFzIHRoZSByZXBsLlxuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlcjtcbiAgaWYgKCFfaXNVaW50OEFycmF5KGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInLCAnVWludDhBcnJheSddLCBjaHVuayk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gZGVjb2RlcjtcbiAgLy8gSWYgc2V0RW5jb2RpbmcobnVsbCksIGRlY29kZXIuZW5jb2RpbmcgZXF1YWxzIHV0ZjhcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZztcblxuICAvLyBJdGVyYXRlIG92ZXIgY3VycmVudCBidWZmZXIgdG8gY29udmVydCBhbHJlYWR5IHN0b3JlZCBCdWZmZXJzOlxuICBsZXQgcCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmhlYWQ7XG4gIGxldCBjb250ZW50ID0gJyc7XG4gIHdoaWxlIChwICE9PSBudWxsKSB7XG4gICAgY29udGVudCArPSBkZWNvZGVyLndyaXRlKHAuZGF0YSk7XG4gICAgcCA9IHAubmV4dDtcbiAgfVxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICBpZiAoY29udGVudCAhPT0gJycpIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLnB1c2goY29udGVudCk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoID0gY29udGVudC5sZW5ndGg7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDFHQlxuY29uc3QgTUFYX0hXTSA9IDB4NDAwMDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICAvLyBUT0RPKHJvbmFnKTogVGhyb3cgRVJSX1ZBTFVFX09VVF9PRl9SQU5HRS5cbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmICgoc3RhdGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIDogc3RhdGUubGVuZ3RoID4gMCkgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICAgIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGRlYnVnKCdvbkVvZkNodW5rJyk7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIGlmIChzdGF0ZS5zeW5jKSB7XG4gICAgLy8gaWYgd2UgYXJlIHN5bmMsIHdhaXQgdW50aWwgbmV4dCB0aWNrIHRvIGVtaXQgdGhlIGRhdGEuXG4gICAgLy8gT3RoZXJ3aXNlIHdlIHJpc2sgZW1pdHRpbmcgZGF0YSBpbiB0aGUgZmxvdygpXG4gICAgLy8gdGhlIHJlYWRhYmxlIGNvZGUgdHJpZ2dlcnMgZHVyaW5nIGEgcmVhZCgpIGNhbGxcbiAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2VtaXRSZWFkYWJsZV8nLCBzdGF0ZS5kZXN0cm95ZWQsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICBpZiAoIXN0YXRlLmRlc3Ryb3llZCAmJiAoc3RhdGUubGVuZ3RoIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gVGhlIHN0cmVhbSBuZWVkcyBhbm90aGVyIHJlYWRhYmxlIGV2ZW50IGlmXG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICAvLyBBdHRlbXB0IHRvIHJlYWQgbW9yZSBkYXRhIGlmIHdlIHNob3VsZC5cbiAgLy9cbiAgLy8gVGhlIGNvbmRpdGlvbnMgZm9yIHJlYWRpbmcgbW9yZSBkYXRhIGFyZSAob25lIG9mKTpcbiAgLy8gLSBOb3QgZW5vdWdoIGRhdGEgYnVmZmVyZWQgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspLiBUaGUgbG9vcFxuICAvLyAgIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIHRoZSBidWZmZXIgd2l0aCBlbm91Z2ggZGF0YSBpZiBzdWNoIGRhdGFcbiAgLy8gICBpcyBhdmFpbGFibGUuIElmIGhpZ2hXYXRlck1hcmsgaXMgMCBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgZmxvd2luZyBtb2RlXG4gIC8vICAgd2Ugc2hvdWxkIF9ub3RfIGF0dGVtcHQgdG8gYnVmZmVyIGFueSBleHRyYSBkYXRhLiBXZSdsbCBnZXQgbW9yZSBkYXRhXG4gIC8vICAgd2hlbiB0aGUgc3RyZWFtIGNvbnN1bWVyIGNhbGxzIHJlYWQoKSBpbnN0ZWFkLlxuICAvLyAtIE5vIGRhdGEgaW4gdGhlIGJ1ZmZlciwgYW5kIHRoZSBzdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLiBJbiB0aGlzIG1vZGVcbiAgLy8gICB0aGUgbG9vcCBiZWxvdyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgcmVhZCgpIGlzIGNhbGxlZC4gRmFpbGluZyB0b1xuICAvLyAgIGNhbGwgcmVhZCBoZXJlIHdvdWxkIGFib3J0IHRoZSBmbG93IGFuZCB0aGVyZSdzIG5vIG90aGVyIG1lY2hhbmlzbSBmb3JcbiAgLy8gICBjb250aW51aW5nIHRoZSBmbG93IGlmIHRoZSBzdHJlYW0gY29uc3VtZXIgaGFzIGp1c3Qgc3Vic2NyaWJlZCB0byB0aGVcbiAgLy8gICAnZGF0YScgZXZlbnQuXG4gIC8vXG4gIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBjb25kaXRpb25zIHRvIGtlZXAgcmVhZGluZyBkYXRhLCB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHJlYWQ6XG4gIC8vIC0gVGhlIHN0cmVhbSBoYXMgZW5kZWQgKHN0YXRlLmVuZGVkKS5cbiAgLy8gLSBUaGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyAncmVhZCcgb3BlcmF0aW9uIChzdGF0ZS5yZWFkaW5nKS4gVGhpcyBpcyBhXG4gIC8vICAgY2FzZSB3aGVyZSB0aGUgdGhlIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIF9yZWFkKClcbiAgLy8gICBtZXRob2QsIGJ1dCB0aGV5IGFyZSBwcm9jZXNzaW5nIHRoZSBjYWxsIGFzeW5jaHJvbm91c2x5IGFuZCBoYXZlIF9ub3RfXG4gIC8vICAgY2FsbGVkIHB1c2goKSB3aXRoIG5ldyBkYXRhLiBJbiB0aGlzIGNhc2Ugd2Ugc2tpcCBwZXJmb3JtaW5nIG1vcmVcbiAgLy8gICByZWFkKClzLiBUaGUgZXhlY3V0aW9uIGVuZHMgaW4gdGhpcyBtZXRob2QgYWdhaW4gYWZ0ZXIgdGhlIF9yZWFkKCkgZW5kc1xuICAvLyAgIHVwIGNhbGxpbmcgcHVzaCgpIHdpdGggbW9yZSBkYXRhLlxuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSkge1xuICAgIGNvbnN0IGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICBlcnJvck9yRGVzdHJveSh0aGlzLCBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ19yZWFkKCknKSk7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcHJvY2Vzcy5uZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlLCB1bnBpcGVJbmZvKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGlmICh1bnBpcGVJbmZvICYmIHVucGlwZUluZm8uaGFzVW5waXBlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdW5waXBlSW5mby5oYXNVbnBpcGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgY2xlYW5lZFVwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpO1xuICB9XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgZGVidWcoJ2Rlc3Qud3JpdGUnLCByZXQpO1xuICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3RhdGUuYXdhaXREcmFpbisrO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZXJyb3JPckRlc3Ryb3koZGVzdCwgZXIpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG4gIHJldHVybiBkZXN0O1xufTtcbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gcGlwZU9uRHJhaW5GdW5jdGlvblJlc3VsdCgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHVucGlwZUluZm8gPSB7XG4gICAgaGFzVW5waXBlZDogZmFsc2VcbiAgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMsIHtcbiAgICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG4gIHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgY29uc3QgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyB1cGRhdGUgcmVhZGFibGVMaXN0ZW5pbmcgc28gdGhhdCByZXN1bWUoKSBtYXkgYmUgYSBuby1vcFxuICAgIC8vIGEgZmV3IGxpbmVzIGRvd24uIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgb25jZSgncmVhZGFibGUnKS5cbiAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRoaXMubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG5cbiAgICAvLyBUcnkgc3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBkZWJ1Zygnb24gcmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLnJlYWRpbmcpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICBjb25zdCByZXMgPSBTdHJlYW0ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLmNhbGwodGhpcywgZXYsIGZuKTtcbiAgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldikge1xuICBjb25zdCByZXMgPSBTdHJlYW0ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgfHwgZXYgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmZ1bmN0aW9uIHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nKHNlbGYpIHtcbiAgY29uc3Qgc3RhdGUgPSBzZWxmLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHNlbGYubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgIXN0YXRlLnBhdXNlZCkge1xuICAgIC8vIGZsb3dpbmcgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgbm93LCBvdGhlcndpc2VcbiAgICAvLyB0aGUgdXBjb21pbmcgcmVzdW1lIHdpbGwgbm90IGZsb3cuXG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG5cbiAgICAvLyBjcnVkZSB3YXkgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIHJlc3VtZVxuICB9IGVsc2UgaWYgKHNlbGYubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIHNlbGYucmVzdW1lKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIC8vIHdlIGZsb3cgb25seSBpZiB0aGVyZSBpcyBubyBvbmUgbGlzdGVuaW5nXG4gICAgLy8gZm9yIHJlYWRhYmxlLCBidXQgd2Ugc3RpbGwgaGF2ZSB0byBjYWxsXG4gICAgLy8gcmVzdW1lKClcbiAgICBzdGF0ZS5mbG93aW5nID0gIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpO1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpO1xufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB0aGlzLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICB0aGlzLnB1c2gobnVsbCk7XG4gIH0pO1xuICBzdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuICAgIHZhciByZXQgPSB0aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIG1ldGhvZFdyYXAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtZXRob2RXcmFwUmV0dXJuRnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICBmb3IgKHZhciBuID0gMDsgbiA8IGtQcm94eUV2ZW50cy5sZW5ndGg7IG4rKykge1xuICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpO1xuICB9XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgdGhpcy5fcmVhZCA9IG4gPT4ge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdGhpcztcbn07XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWFkYWJsZS5wcm90b3R5cGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2FzeW5jX2l0ZXJhdG9yJyk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodGhpcyk7XG4gIH07XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUJ1ZmZlcicsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXI7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlRmxvd2luZycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQoc3RhdGUpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gc3RhdGU7XG4gICAgfVxuICB9XG59KTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVMZW5ndGgnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pO1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICB2YXIgcmV0O1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0ID0gc3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZS5sZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGxpc3RcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYgKHN0YXRlLmJ1ZmZlci5sZW5ndGggPT09IDEpIHJldCA9IHN0YXRlLmJ1ZmZlci5maXJzdCgpO2Vsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO1xuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgcGFydCBvZiBsaXN0XG4gICAgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbnN1bWUobiwgc3RhdGUuZGVjb2Rlcik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdlbmRSZWFkYWJsZScsIHN0YXRlLmVuZEVtaXR0ZWQpO1xuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIGRlYnVnKCdlbmRSZWFkYWJsZU5UJywgc3RhdGUuZW5kRW1pdHRlZCwgc3RhdGUubGVuZ3RoKTtcblxuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgICBpZiAoc3RhdGUuYXV0b0Rlc3Ryb3kpIHtcbiAgICAgIC8vIEluIGNhc2Ugb2YgZHVwbGV4IHN0cmVhbXMgd2UgbmVlZCBhIHdheSB0byBkZXRlY3RcbiAgICAgIC8vIGlmIHRoZSB3cml0YWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsXG4gICAgICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gICAgICBpZiAoIXdTdGF0ZSB8fCB3U3RhdGUuYXV0b0Rlc3Ryb3kgJiYgd1N0YXRlLmZpbmlzaGVkKSB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWFkYWJsZS5mcm9tID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBvcHRzKSB7XG4gICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJvbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9mcm9tJyk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tKFJlYWRhYmxlLCBpdGVyYWJsZSwgb3B0cyk7XG4gIH07XG59XG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcbmNvbnN0IF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gX3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcsXG4gIEVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMDtcbmNvbnN0IER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoVHJhbnNmb3JtLCBEdXBsZXgpO1xuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB2YXIgY2IgPSB0cy53cml0ZWNiO1xuICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKSk7XG4gIH1cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuICBpZiAoZGF0YSAhPSBudWxsKVxuICAgIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHRoaXMucHVzaChkYXRhKTtcbiAgY2IoZXIpO1xuICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtcbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0ge1xuICAgIGFmdGVyVHJhbnNmb3JtOiBhZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLFxuICAgIG5lZWRUcmFuc2Zvcm06IGZhbHNlLFxuICAgIHRyYW5zZm9ybWluZzogZmFsc2UsXG4gICAgd3JpdGVjYjogbnVsbCxcbiAgICB3cml0ZWNodW5rOiBudWxsLFxuICAgIHdyaXRlZW5jb2Rpbmc6IG51bGxcbiAgfTtcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaCk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goKSB7XG4gIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkKSB7XG4gICAgdGhpcy5fZmx1c2goKGVyLCBkYXRhKSA9PiB7XG4gICAgICBkb25lKHRoaXMsIGVyLCBkYXRhKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBkb25lKHRoaXMsIG51bGwsIG51bGwpO1xuICB9XG59XG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfdHJhbnNmb3JtKCknKSk7XG59O1xuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGVycjIgPT4ge1xuICAgIGNiKGVycjIpO1xuICB9KTtcbn07XG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBpZiAoZGF0YSAhPSBudWxsKVxuICAgIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIC8vIFRPRE8oQnJpZGdlQVIpOiBXcml0ZSBhIHRlc3QgZm9yIHRoZXNlIHR3byBlcnJvciBjYXNlc1xuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlLmxlbmd0aCkgdGhyb3cgbmV3IEVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCgpO1xuICBpZiAoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HKCk7XG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qIDxyZXBsYWNlbWVudD4gKi9cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gKCkgPT4ge1xuICAgIG9uQ29ya2VkRmluaXNoKHRoaXMsIHN0YXRlKTtcbiAgfTtcbn1cbi8qIDwvcmVwbGFjZW1lbnQ+ICovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuY29uc3QgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuY29uc3QgT3VyVWludDhBcnJheSA9ICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9KS5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xufVxuZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXk7XG59XG5jb25zdCBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5jb25zdCBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZScpLFxuICBnZXRIaWdoV2F0ZXJNYXJrID0gX3JlcXVpcmUuZ2V0SGlnaFdhdGVyTWFyaztcbmNvbnN0IF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFID0gX3JlcXVpcmUkY29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gX3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVEID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX05VTExfVkFMVUVTLFxuICBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELFxuICBFUlJfVU5LTk9XTl9FTkNPRElORyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9VTktOT1dOX0VOQ09ESU5HO1xuY29uc3QgZXJyb3JPckRlc3Ryb3kgPSBkZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoV3JpdGFibGUsIFN0cmVhbSk7XG5mdW5jdGlvbiBub3AoKSB7fVxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLFxuICAvLyBlLmcuIG9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlIHZzLiBvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZSwgZXRjLlxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleCk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlO1xuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZmluaXNoJyAoYW5kIHBvdGVudGlhbGx5ICdlbmQnKVxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95O1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVCdWZmZXJHZXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nLCAnREVQMDAwMycpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG4vLyBUZXN0IF93cml0YWJsZVN0YXRlIGZvciBpbmhlcml0YW5jZSB0byBhY2NvdW50IGZvciBEdXBsZXggc3RyZWFtcyxcbi8vIHdob3NlIHByb3RvdHlwZSBjaGFpbiBvbmx5IHBvaW50cyB0byBSZWFkYWJsZS5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICByZWFsSGFzSW5zdGFuY2UgPSBmdW5jdGlvbiByZWFsSGFzSW5zdGFuY2Uob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgV3JpdGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjVcbiAgY29uc3QgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgRHVwbGV4O1xuICBpZiAoIWlzRHVwbGV4ICYmICFyZWFsSGFzSW5zdGFuY2UuY2FsbChXcml0YWJsZSwgdGhpcykpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzLCBpc0R1cGxleCk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIGVycm9yT3JEZXN0cm95KHRoaXMsIG5ldyBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFKCkpO1xufTtcbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQoKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gIHByb2Nlc3MubmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIGVyO1xuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBFUlJfU1RSRUFNX05VTExfVkFMVUVTKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdjaHVuaycsIFsnc3RyaW5nJywgJ0J1ZmZlciddLCBjaHVuayk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcbiAgdmFyIGlzQnVmID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgX2lzVWludDhBcnJheShjaHVuayk7XG4gIGlmIChpc0J1ZiAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG4gIGlmIChpc0J1ZikgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcbiAgaWYgKHN0YXRlLmVuZGluZykgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAoaXNCdWYgfHwgdmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrO1xufTtcbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBFUlJfVU5LTk9XTl9FTkNPRElORyhlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKTtcbiAgfVxufSk7XG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBpZiAoIWlzQnVmKSB7XG4gICAgdmFyIG5ld0NodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gICAgaWYgKGNodW5rICE9PSBuZXdDaHVuaykge1xuICAgICAgaXNCdWYgPSB0cnVlO1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgICAgIGNodW5rID0gbmV3Q2h1bms7XG4gICAgfVxuICB9XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSB7XG4gICAgICBjaHVuayxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgaXNCdWYsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHN0YXRlLmRlc3Ryb3llZCkgc3RhdGUub253cml0ZShuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3dyaXRlJykpO2Vsc2UgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYW5kIGl0IHdpbGwgYWx3YXlzIGhhcHBlblxuICAgIC8vIGFmdGVyIGVycm9yXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2hNYXliZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gdGhlIGNhbGxlciBleHBlY3QgdGhpcyB0byBoYXBwZW4gYmVmb3JlIGlmXG4gICAgLy8gaXQgaXMgYXN5bmNcbiAgICBjYihlcik7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCk7XG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKSB8fCBzdHJlYW0uZGVzdHJveWVkO1xuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGFsbEJ1ZmZlcnMgPSB0cnVlO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgaWYgKCFlbnRyeS5pc0J1ZikgYWxsQnVmZmVycyA9IGZhbHNlO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgYnVmZmVyLmFsbEJ1ZmZlcnMgPSBhbGxCdWZmZXJzO1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS07XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ193cml0ZSgpJykpO1xufTtcbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG4gIHJldHVybiB0aGlzO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUxlbmd0aCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aDtcbiAgfVxufSk7XG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGVyciA9PiB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nICYmICFzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgICAgc3RhdGUuZmluYWxDYWxsZWQgPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICAgIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAgIC8vIGlmIHRoZSByZWFkYWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsXG4gICAgICAgIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgICAgICAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmF1dG9EZXN0cm95ICYmIHJTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3MubmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cblxuICAvLyByZXVzZSB0aGUgZnJlZSBjb3JrUmVxLlxuICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycik7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZmluaXNoZWQgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKTtcbmNvbnN0IGtMYXN0UmVzb2x2ZSA9IFN5bWJvbCgnbGFzdFJlc29sdmUnKTtcbmNvbnN0IGtMYXN0UmVqZWN0ID0gU3ltYm9sKCdsYXN0UmVqZWN0Jyk7XG5jb25zdCBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG5jb25zdCBrRW5kZWQgPSBTeW1ib2woJ2VuZGVkJyk7XG5jb25zdCBrTGFzdFByb21pc2UgPSBTeW1ib2woJ2xhc3RQcm9taXNlJyk7XG5jb25zdCBrSGFuZGxlUHJvbWlzZSA9IFN5bWJvbCgnaGFuZGxlUHJvbWlzZScpO1xuY29uc3Qga1N0cmVhbSA9IFN5bWJvbCgnc3RyZWFtJyk7XG5mdW5jdGlvbiBjcmVhdGVJdGVyUmVzdWx0KHZhbHVlLCBkb25lKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgZG9uZVxuICB9O1xufVxuZnVuY3Rpb24gcmVhZEFuZFJlc29sdmUoaXRlcikge1xuICBjb25zdCByZXNvbHZlID0gaXRlcltrTGFzdFJlc29sdmVdO1xuICBpZiAocmVzb2x2ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGRhdGEgPSBpdGVyW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAvLyB3ZSBkZWZlciBpZiBkYXRhIGlzIG51bGxcbiAgICAvLyB3ZSBjYW4gYmUgZXhwZWN0aW5nIGVpdGhlciAnZW5kJyBvclxuICAgIC8vICdlcnJvcidcbiAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgaXRlcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgIGl0ZXJba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICBpdGVyW2tMYXN0UmVqZWN0XSA9IG51bGw7XG4gICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQoZGF0YSwgZmFsc2UpKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uUmVhZGFibGUoaXRlcikge1xuICAvLyB3ZSB3YWl0IGZvciB0aGUgbmV4dCB0aWNrLCBiZWNhdXNlIGl0IG1pZ2h0XG4gIC8vIGVtaXQgYW4gZXJyb3Igd2l0aCBwcm9jZXNzLm5leHRUaWNrXG4gIHByb2Nlc3MubmV4dFRpY2socmVhZEFuZFJlc29sdmUsIGl0ZXIpO1xufVxuZnVuY3Rpb24gd3JhcEZvck5leHQobGFzdFByb21pc2UsIGl0ZXIpIHtcbiAgcmV0dXJuIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsYXN0UHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChpdGVyW2tFbmRlZF0pIHtcbiAgICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KHVuZGVmaW5lZCwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVyW2tIYW5kbGVQcm9taXNlXShyZXNvbHZlLCByZWplY3QpO1xuICAgIH0sIHJlamVjdCk7XG4gIH07XG59XG5jb25zdCBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmN0aW9uICgpIHt9KTtcbmNvbnN0IFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZih7XG4gIGdldCBzdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXNba1N0cmVhbV07XG4gIH0sXG4gIG5leHQoKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvciBpbiB0aGUgbWVhbndoaWxlXG4gICAgLy8gcmVqZWN0IHN0cmFpZ2h0IGF3YXlcbiAgICBjb25zdCBlcnJvciA9IHRoaXNba0Vycm9yXTtcbiAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICAgIGlmICh0aGlzW2tFbmRlZF0pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXNba1N0cmVhbV0uZGVzdHJveWVkKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHZpYSBuZXh0VGljayBiZWNhdXNlIGlmIC5kZXN0cm95KGVycikgaXNcbiAgICAgIC8vIGNhbGxlZCwgdGhlIGVycm9yIHdpbGwgYmUgZW1pdHRlZCB2aWEgbmV4dFRpY2ssIGFuZFxuICAgICAgLy8gd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IHRoZXJlIGlzIG5vIGVycm9yIGxpbmdlcmluZyBhcm91bmRcbiAgICAgIC8vIHdhaXRpbmcgdG8gYmUgZW1pdHRlZC5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzW2tFcnJvcl0pIHtcbiAgICAgICAgICAgIHJlamVjdCh0aGlzW2tFcnJvcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbXVsdGlwbGUgbmV4dCgpIGNhbGxzXG4gICAgLy8gd2Ugd2lsbCB3YWl0IGZvciB0aGUgcHJldmlvdXMgUHJvbWlzZSB0byBmaW5pc2hcbiAgICAvLyB0aGlzIGxvZ2ljIGlzIG9wdGltaXplZCB0byBzdXBwb3J0IGZvciBhd2FpdCBsb29wcyxcbiAgICAvLyB3aGVyZSBuZXh0KCkgaXMgb25seSBjYWxsZWQgb25jZSBhdCBhIHRpbWVcbiAgICBjb25zdCBsYXN0UHJvbWlzZSA9IHRoaXNba0xhc3RQcm9taXNlXTtcbiAgICBsZXQgcHJvbWlzZTtcbiAgICBpZiAobGFzdFByb21pc2UpIHtcbiAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSh3cmFwRm9yTmV4dChsYXN0UHJvbWlzZSwgdGhpcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmYXN0IHBhdGggbmVlZGVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGhpcy5wdXNoKClcbiAgICAgIC8vIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgbmV4dCgpIHF1ZXVlXG4gICAgICBjb25zdCBkYXRhID0gdGhpc1trU3RyZWFtXS5yZWFkKCk7XG4gICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQoZGF0YSwgZmFsc2UpKTtcbiAgICAgIH1cbiAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSh0aGlzW2tIYW5kbGVQcm9taXNlXSk7XG4gICAgfVxuICAgIHRoaXNba0xhc3RQcm9taXNlXSA9IHByb21pc2U7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJldHVybigpIHtcbiAgICAvLyBkZXN0cm95KGVyciwgY2IpIGlzIGEgcHJpdmF0ZSBBUElcbiAgICAvLyB3ZSBjYW4gZ3VhcmFudGVlIHdlIGhhdmUgdGhhdCBoZXJlLCBiZWNhdXNlIHdlIGNvbnRyb2wgdGhlXG4gICAgLy8gUmVhZGFibGUgY2xhc3MgdGhpcyBpcyBhdHRhY2hlZCB0b1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzW2tTdHJlYW1dLmRlc3Ryb3kobnVsbCwgZXJyID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufSwgQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7XG5jb25zdCBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IgPSBzdHJlYW0gPT4ge1xuICBjb25zdCBpdGVyYXRvciA9IE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlLCB7XG4gICAgW2tTdHJlYW1dOiB7XG4gICAgICB2YWx1ZTogc3RyZWFtLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9LFxuICAgIFtrTGFzdFJlc29sdmVdOiB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSxcbiAgICBba0xhc3RSZWplY3RdOiB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSxcbiAgICBba0Vycm9yXToge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0sXG4gICAgW2tFbmRlZF06IHtcbiAgICAgIHZhbHVlOiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSxcbiAgICAvLyB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIG5ldyBQcm9taXNlXG4gICAgLy8gaXMgY2FjaGVkIHNvIHdlIGF2b2lkIGFsbG9jYXRpbmcgYSBuZXdcbiAgICAvLyBjbG9zdXJlIGF0IGV2ZXJ5IHJ1blxuICAgIFtrSGFuZGxlUHJvbWlzZV06IHtcbiAgICAgIHZhbHVlOiAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBpdGVyYXRvcltrU3RyZWFtXS5yZWFkKCk7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaXRlcmF0b3Jba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQoZGF0YSwgZmFsc2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gcmVzb2x2ZTtcbiAgICAgICAgICBpdGVyYXRvcltrTGFzdFJlamVjdF0gPSByZWplY3Q7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICBmaW5pc2hlZChzdHJlYW0sIGVyciA9PiB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSAhPT0gJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJykge1xuICAgICAgY29uc3QgcmVqZWN0ID0gaXRlcmF0b3Jba0xhc3RSZWplY3RdO1xuICAgICAgLy8gcmVqZWN0IGlmIHdlIGFyZSB3YWl0aW5nIGZvciBkYXRhIGluIHRoZSBQcm9taXNlXG4gICAgICAvLyByZXR1cm5lZCBieSBuZXh0KCkgYW5kIHN0b3JlIHRoZSBlcnJvclxuICAgICAgaWYgKHJlamVjdCAhPT0gbnVsbCkge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IG51bGw7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgaXRlcmF0b3Jba0Vycm9yXSA9IGVycjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZSA9IGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV07XG4gICAgaWYgKHJlc29sdmUgIT09IG51bGwpIHtcbiAgICAgIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICBpdGVyYXRvcltrTGFzdFJlamVjdF0gPSBudWxsO1xuICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KHVuZGVmaW5lZCwgdHJ1ZSkpO1xuICAgIH1cbiAgICBpdGVyYXRvcltrRW5kZWRdID0gdHJ1ZTtcbiAgfSk7XG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBvblJlYWRhYmxlLmJpbmQobnVsbCwgaXRlcmF0b3IpKTtcbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yOyIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG5jb25zdCBfcmVxdWlyZSA9IHJlcXVpcmUoJ2J1ZmZlcicpLFxuICBCdWZmZXIgPSBfcmVxdWlyZS5CdWZmZXI7XG5jb25zdCBfcmVxdWlyZTIgPSByZXF1aXJlKCd1dGlsJyksXG4gIGluc3BlY3QgPSBfcmVxdWlyZTIuaW5zcGVjdDtcbmNvbnN0IGN1c3RvbSA9IGluc3BlY3QgJiYgaW5zcGVjdC5jdXN0b20gfHwgJ2luc3BlY3QnO1xuZnVuY3Rpb24gY29weUJ1ZmZlcihzcmMsIHRhcmdldCwgb2Zmc2V0KSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuY29weS5jYWxsKHNyYywgdGFyZ2V0LCBvZmZzZXQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBCdWZmZXJMaXN0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuICBwdXNoKHYpIHtcbiAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgIGRhdGE6IHYsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgdGhpcy50YWlsID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfVxuICB1bnNoaWZ0KHYpIHtcbiAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgIGRhdGE6IHYsXG4gICAgICBuZXh0OiB0aGlzLmhlYWRcbiAgICB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfVxuICBzaGlmdCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICAtLXRoaXMubGVuZ3RoO1xuICAgIHJldHVybiByZXQ7XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cbiAgam9pbihzKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICAgIHdoaWxlIChwID0gcC5uZXh0KSByZXQgKz0gcyArIHAuZGF0YTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGNvbmNhdChuKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIGNvbnN0IHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuID4+PiAwKTtcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKHApIHtcbiAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIGNvbnN1bWUobiwgaGFzU3RyaW5ncykge1xuICAgIHZhciByZXQ7XG4gICAgaWYgKG4gPCB0aGlzLmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIGBzbGljZWAgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICByZXQgPSB0aGlzLmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICAgIHRoaXMuaGVhZC5kYXRhID0gdGhpcy5oZWFkLmRhdGEuc2xpY2Uobik7XG4gICAgfSBlbHNlIGlmIChuID09PSB0aGlzLmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIEZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaC5cbiAgICAgIHJldCA9IHRoaXMuc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyLlxuICAgICAgcmV0ID0gaGFzU3RyaW5ncyA/IHRoaXMuX2dldFN0cmluZyhuKSA6IHRoaXMuX2dldEJ1ZmZlcihuKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBmaXJzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gIH1cblxuICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICBfZ2V0U3RyaW5nKG4pIHtcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgYyA9IDE7XG4gICAgdmFyIHJldCA9IHAuZGF0YTtcbiAgICBuIC09IHJldC5sZW5ndGg7XG4gICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgIGNvbnN0IHN0ciA9IHAuZGF0YTtcbiAgICAgIGNvbnN0IG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgICBuIC09IG5iO1xuICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgKytjO1xuICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oZWFkID0gcDtcbiAgICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgKytjO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgX2dldEJ1ZmZlcihuKSB7XG4gICAgY29uc3QgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciBjID0gMTtcbiAgICBwLmRhdGEuY29weShyZXQpO1xuICAgIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgICAgY29uc3QgYnVmID0gcC5kYXRhO1xuICAgICAgY29uc3QgbmIgPSBuID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGggOiBuO1xuICAgICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgICAgbiAtPSBuYjtcbiAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICAgICsrYztcbiAgICAgICAgICBpZiAocC5uZXh0KSB0aGlzLmhlYWQgPSBwLm5leHQ7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG5iKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgICsrYztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggLT0gYztcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHRoZSBsaW5rZWQgbGlzdCBvbmx5IHNob3dzIHRoZSBtaW5pbWFsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi5cbiAgW2N1c3RvbV0oXywgb3B0aW9ucykge1xuICAgIHJldHVybiBpbnNwZWN0KHRoaXMsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAvLyBPbmx5IGluc3BlY3Qgb25lIGxldmVsLlxuICAgICAgZGVwdGg6IDAsXG4gICAgICAvLyBJdCBzaG91bGQgbm90IHJlY3Vyc2UuXG4gICAgICBjdXN0b21JbnNwZWN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG5cbi8vIHVuZG9jdW1lbnRlZCBjYigpIEFQSSwgbmVlZGVkIGZvciBjb3JlLCBub3QgZm9yIHB1YmxpYyBBUElcbmZ1bmN0aW9uIGRlc3Ryb3koZXJyLCBjYikge1xuICBjb25zdCByZWFkYWJsZURlc3Ryb3llZCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIGNvbnN0IHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgaWYgKHJlYWRhYmxlRGVzdHJveWVkIHx8IHdyaXRhYmxlRGVzdHJveWVkKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG4gIHRoaXMuX2Rlc3Ryb3koZXJyIHx8IG51bGwsIGVyciA9PiB7XG4gICAgaWYgKCFjYiAmJiBlcnIpIHtcbiAgICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvckFuZENsb3NlTlQsIHRoaXMsIGVycik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQW5kQ2xvc2VOVCwgdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIHRoaXMpO1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCwgdGhpcyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZU5UKHNlbGYsIGVycikge1xuICBlbWl0RXJyb3JOVChzZWxmLCBlcnIpO1xuICBlbWl0Q2xvc2VOVChzZWxmKTtcbn1cbmZ1bmN0aW9uIGVtaXRDbG9zZU5UKHNlbGYpIHtcbiAgaWYgKHNlbGYuX3dyaXRhYmxlU3RhdGUgJiYgIXNlbGYuX3dyaXRhYmxlU3RhdGUuZW1pdENsb3NlKSByZXR1cm47XG4gIGlmIChzZWxmLl9yZWFkYWJsZVN0YXRlICYmICFzZWxmLl9yZWFkYWJsZVN0YXRlLmVtaXRDbG9zZSkgcmV0dXJuO1xuICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG59XG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluYWxDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnByZWZpbmlzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRFcnJvck5UKHNlbGYsIGVycikge1xuICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn1cbmZ1bmN0aW9uIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyKSB7XG4gIC8vIFdlIGhhdmUgdGVzdHMgdGhhdCByZWx5IG9uIGVycm9ycyBiZWluZyBlbWl0dGVkXG4gIC8vIGluIHRoZSBzYW1lIHRpY2ssIHNvIGNoYW5naW5nIHRoaXMgaXMgc2VtdmVyIG1ham9yLlxuICAvLyBGb3Igbm93IHdoZW4geW91IG9wdC1pbiB0byBhdXRvRGVzdHJveSB3ZSBhbGxvd1xuICAvLyB0aGUgZXJyb3IgdG8gYmUgZW1pdHRlZCBuZXh0VGljay4gSW4gYSBmdXR1cmVcbiAgLy8gc2VtdmVyIG1ham9yIHVwZGF0ZSB3ZSBzaG91bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHRvIHRoaXMuXG5cbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIGlmIChyU3RhdGUgJiYgclN0YXRlLmF1dG9EZXN0cm95IHx8IHdTdGF0ZSAmJiB3U3RhdGUuYXV0b0Rlc3Ryb3kpIHN0cmVhbS5kZXN0cm95KGVycik7ZWxzZSBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlc3Ryb3ksXG4gIHVuZGVzdHJveSxcbiAgZXJyb3JPckRlc3Ryb3lcbn07IiwiLy8gUG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9lbmQtb2Ytc3RyZWFtIHdpdGhcbi8vIHBlcm1pc3Npb24gZnJvbSB0aGUgYXV0aG9yLCBNYXRoaWFzIEJ1dXMgKEBtYWZpbnRvc2gpLlxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7XG5mdW5jdGlvbiBvbmNlKGNhbGxiYWNrKSB7XG4gIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSByZXR1cm47XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xufVxuZnVuY3Rpb24gbm9vcCgpIHt9XG5mdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBlb3Moc3RyZWFtLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHJldHVybiBlb3Moc3RyZWFtLCBudWxsLCBvcHRzKTtcbiAgaWYgKCFvcHRzKSBvcHRzID0ge307XG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjayB8fCBub29wKTtcbiAgbGV0IHJlYWRhYmxlID0gb3B0cy5yZWFkYWJsZSB8fCBvcHRzLnJlYWRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ucmVhZGFibGU7XG4gIGxldCB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgb3B0cy53cml0YWJsZSAhPT0gZmFsc2UgJiYgc3RyZWFtLndyaXRhYmxlO1xuICBjb25zdCBvbmxlZ2FjeWZpbmlzaCA9ICgpID0+IHtcbiAgICBpZiAoIXN0cmVhbS53cml0YWJsZSkgb25maW5pc2goKTtcbiAgfTtcbiAgdmFyIHdyaXRhYmxlRW5kZWQgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkO1xuICBjb25zdCBvbmZpbmlzaCA9ICgpID0+IHtcbiAgICB3cml0YWJsZSA9IGZhbHNlO1xuICAgIHdyaXRhYmxlRW5kZWQgPSB0cnVlO1xuICAgIGlmICghcmVhZGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcbiAgfTtcbiAgdmFyIHJlYWRhYmxlRW5kZWQgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGUgJiYgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ7XG4gIGNvbnN0IG9uZW5kID0gKCkgPT4ge1xuICAgIHJlYWRhYmxlID0gZmFsc2U7XG4gICAgcmVhZGFibGVFbmRlZCA9IHRydWU7XG4gICAgaWYgKCF3cml0YWJsZSkgY2FsbGJhY2suY2FsbChzdHJlYW0pO1xuICB9O1xuICBjb25zdCBvbmVycm9yID0gZXJyID0+IHtcbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgfTtcbiAgY29uc3Qgb25jbG9zZSA9ICgpID0+IHtcbiAgICBsZXQgZXJyO1xuICAgIGlmIChyZWFkYWJsZSAmJiAhcmVhZGFibGVFbmRlZCkge1xuICAgICAgaWYgKCFzdHJlYW0uX3JlYWRhYmxlU3RhdGUgfHwgIXN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRlZCkgZXJyID0gbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG4gICAgfVxuICAgIGlmICh3cml0YWJsZSAmJiAhd3JpdGFibGVFbmRlZCkge1xuICAgICAgaWYgKCFzdHJlYW0uX3dyaXRhYmxlU3RhdGUgfHwgIXN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgZXJyID0gbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG4gICAgfVxuICB9O1xuICBjb25zdCBvbnJlcXVlc3QgPSAoKSA9PiB7XG4gICAgc3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpO1xuICB9O1xuICBpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHtcbiAgICBzdHJlYW0ub24oJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKTtcbiAgICBpZiAoc3RyZWFtLnJlcSkgb25yZXF1ZXN0KCk7ZWxzZSBzdHJlYW0ub24oJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuICB9IGVsc2UgaWYgKHdyaXRhYmxlICYmICFzdHJlYW0uX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAvLyBsZWdhY3kgc3RyZWFtc1xuICAgIHN0cmVhbS5vbignZW5kJywgb25sZWdhY3lmaW5pc2gpO1xuICAgIHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaCk7XG4gIH1cbiAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG4gIHN0cmVhbS5vbignZmluaXNoJywgb25maW5pc2gpO1xuICBpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpIHN0cmVhbS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgc3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaCk7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIG9uY2xvc2UpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGVvczsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXInKVxufTtcbiIsIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuJ3VzZSBzdHJpY3QnO1xuXG5sZXQgZW9zO1xuZnVuY3Rpb24gb25jZShjYWxsYmFjaykge1xuICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soLi4uYXJndW1lbnRzKTtcbiAgfTtcbn1cbmNvbnN0IF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9NSVNTSU5HX0FSR1MgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUlTU0lOR19BUkdTLFxuICBFUlJfU1RSRUFNX0RFU1RST1lFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVEO1xuZnVuY3Rpb24gbm9vcChlcnIpIHtcbiAgLy8gUmV0aHJvdyB0aGUgZXJyb3IgaWYgaXQgZXhpc3RzIHRvIGF2b2lkIHN3YWxsb3dpbmcgaXRcbiAgaWYgKGVycikgdGhyb3cgZXJyO1xufVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrKTtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBzdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gIH0pO1xuICBpZiAoZW9zID09PSB1bmRlZmluZWQpIGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpO1xuICBlb3Moc3RyZWFtLCB7XG4gICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgd3JpdGFibGU6IHdyaXRpbmdcbiAgfSwgZXJyID0+IHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIGNhbGxiYWNrKCk7XG4gIH0pO1xuICBsZXQgZGVzdHJveWVkID0gZmFsc2U7XG4gIHJldHVybiBlcnIgPT4ge1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcbiAgICBpZiAoZGVzdHJveWVkKSByZXR1cm47XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIHJlcXVlc3QuZGVzdHJveSBqdXN0IGRvIC5lbmQgLSAuYWJvcnQgaXMgd2hhdCB3ZSB3YW50XG4gICAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSByZXR1cm4gc3RyZWFtLmFib3J0KCk7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgY2FsbGJhY2soZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNhbGwoZm4pIHtcbiAgZm4oKTtcbn1cbmZ1bmN0aW9uIHBpcGUoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGZyb20ucGlwZSh0byk7XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIGlmICghc3RyZWFtcy5sZW5ndGgpIHJldHVybiBub29wO1xuICBpZiAodHlwZW9mIHN0cmVhbXNbc3RyZWFtcy5sZW5ndGggLSAxXSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vb3A7XG4gIHJldHVybiBzdHJlYW1zLnBvcCgpO1xufVxuZnVuY3Rpb24gcGlwZWxpbmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzdHJlYW1zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHN0cmVhbXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgY29uc3QgY2FsbGJhY2sgPSBwb3BDYWxsYmFjayhzdHJlYW1zKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RyZWFtc1swXSkpIHN0cmVhbXMgPSBzdHJlYW1zWzBdO1xuICBpZiAoc3RyZWFtcy5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoJ3N0cmVhbXMnKTtcbiAgfVxuICBsZXQgZXJyb3I7XG4gIGNvbnN0IGRlc3Ryb3lzID0gc3RyZWFtcy5tYXAoZnVuY3Rpb24gKHN0cmVhbSwgaSkge1xuICAgIGNvbnN0IHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHdyaXRpbmcgPSBpID4gMDtcbiAgICByZXR1cm4gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKCFlcnJvcikgZXJyb3IgPSBlcnI7XG4gICAgICBpZiAoZXJyKSBkZXN0cm95cy5mb3JFYWNoKGNhbGwpO1xuICAgICAgaWYgKHJlYWRpbmcpIHJldHVybjtcbiAgICAgIGRlc3Ryb3lzLmZvckVhY2goY2FsbCk7XG4gICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gc3RyZWFtcy5yZWR1Y2UocGlwZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHBpcGVsaW5lOyIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgRVJSX0lOVkFMSURfT1BUX1ZBTFVFID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMuRVJSX0lOVkFMSURfT1BUX1ZBTFVFO1xuZnVuY3Rpb24gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucywgaXNEdXBsZXgsIGR1cGxleEtleSkge1xuICByZXR1cm4gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrICE9IG51bGwgPyBvcHRpb25zLmhpZ2hXYXRlck1hcmsgOiBpc0R1cGxleCA/IG9wdGlvbnNbZHVwbGV4S2V5XSA6IG51bGw7XG59XG5mdW5jdGlvbiBnZXRIaWdoV2F0ZXJNYXJrKHN0YXRlLCBvcHRpb25zLCBkdXBsZXhLZXksIGlzRHVwbGV4KSB7XG4gIGNvbnN0IGh3bSA9IGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpO1xuICBpZiAoaHdtICE9IG51bGwpIHtcbiAgICBpZiAoIShpc0Zpbml0ZShod20pICYmIE1hdGguZmxvb3IoaHdtKSA9PT0gaHdtKSB8fCBod20gPCAwKSB7XG4gICAgICBjb25zdCBuYW1lID0gaXNEdXBsZXggPyBkdXBsZXhLZXkgOiAnaGlnaFdhdGVyTWFyayc7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfT1BUX1ZBTFVFKG5hbWUsIGh3bSk7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKGh3bSk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHZhbHVlXG4gIHJldHVybiBzdGF0ZS5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0SGlnaFdhdGVyTWFya1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbiIsIi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSlcblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIvL2ZpbHRlciB3aWxsIHJlZW1pdCB0aGUgZGF0YSBpZiBjYihlcnIscGFzcykgcGFzcyBpcyB0cnV0aHlcblxuLy8gcmVkdWNlIGlzIG1vcmUgdHJpY2t5XG4vLyBtYXliZSB3ZSB3YW50IHRvIGdyb3VwIHRoZSByZWR1Y3Rpb25zIG9yIGVtaXQgcHJvZ3Jlc3MgdXBkYXRlcyBvY2Nhc2lvbmFsbHlcbi8vIHRoZSBtb3N0IGJhc2ljIHJlZHVjZSBqdXN0IGVtaXRzIG9uZSAnZGF0YScgZXZlbnQgYWZ0ZXIgaXQgaGFzIHJlY2lldmVkICdlbmQnXG5cblxudmFyIHRocm91Z2ggPSByZXF1aXJlKCd0aHJvdWdoJylcbnZhciBEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKS5TdHJpbmdEZWNvZGVyXG5cbm1vZHVsZS5leHBvcnRzID0gc3BsaXRcblxuLy9UT0RPIHBhc3MgaW4gYSBmdW5jdGlvbiB0byBtYXAgYWNyb3NzIHRoZSBsaW5lcy5cblxuZnVuY3Rpb24gc3BsaXQgKG1hdGNoZXIsIG1hcHBlciwgb3B0aW9ucykge1xuICB2YXIgZGVjb2RlciA9IG5ldyBEZWNvZGVyKClcbiAgdmFyIHNvRmFyID0gJydcbiAgdmFyIG1heExlbmd0aCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhMZW5ndGg7XG4gIHZhciB0cmFpbGluZyA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFpbGluZyA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcbiAgaWYoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG1hdGNoZXIpXG4gICAgbWFwcGVyID0gbWF0Y2hlciwgbWF0Y2hlciA9IG51bGxcbiAgaWYgKCFtYXRjaGVyKVxuICAgIG1hdGNoZXIgPSAvXFxyP1xcbi9cblxuICBmdW5jdGlvbiBlbWl0KHN0cmVhbSwgcGllY2UpIHtcbiAgICBpZihtYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBpZWNlID0gbWFwcGVyKHBpZWNlKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfVxuICAgICAgaWYoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBwaWVjZSlcbiAgICAgICAgc3RyZWFtLnF1ZXVlKHBpZWNlKVxuICAgIH1cbiAgICBlbHNlXG4gICAgICBzdHJlYW0ucXVldWUocGllY2UpXG4gIH1cblxuICBmdW5jdGlvbiBuZXh0IChzdHJlYW0sIGJ1ZmZlcikge1xuICAgIHZhciBwaWVjZXMgPSAoKHNvRmFyICE9IG51bGwgPyBzb0ZhciA6ICcnKSArIGJ1ZmZlcikuc3BsaXQobWF0Y2hlcilcbiAgICBzb0ZhciA9IHBpZWNlcy5wb3AoKVxuXG4gICAgaWYgKG1heExlbmd0aCAmJiBzb0Zhci5sZW5ndGggPiBtYXhMZW5ndGgpXG4gICAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdtYXhpbXVtIGJ1ZmZlciByZWFjaGVkJykpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBpZWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBpZWNlID0gcGllY2VzW2ldXG4gICAgICBlbWl0KHN0cmVhbSwgcGllY2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRocm91Z2goZnVuY3Rpb24gKGIpIHtcbiAgICBuZXh0KHRoaXMsIGRlY29kZXIud3JpdGUoYikpXG4gIH0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICBpZihkZWNvZGVyLmVuZClcbiAgICAgIG5leHQodGhpcywgZGVjb2Rlci5lbmQoKSlcbiAgICBpZih0cmFpbGluZyAmJiBzb0ZhciAhPSBudWxsKVxuICAgICAgZW1pdCh0aGlzLCBzb0ZhcilcbiAgICB0aGlzLnF1ZXVlKG51bGwpXG4gIH0pXG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW07XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmluaGVyaXRzKFN0cmVhbSwgRUUpO1xuU3RyZWFtLlJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5TdHJlYW0uV3JpdGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5TdHJlYW0uVHJhbnNmb3JtID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG5TdHJlYW0uZmluaXNoZWQgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcycpXG5TdHJlYW0ucGlwZWxpbmUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanMnKVxuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuXG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCJ2YXIgZHVwbGV4ZXIgPSByZXF1aXJlKCdkdXBsZXhlcicpXG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0cmVhbXNcblxuICBpZihhcmd1bWVudHMubGVuZ3RoID09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKSB7XG4gICAgc3RyZWFtcyA9IGFyZ3VtZW50c1swXVxuICB9IGVsc2Uge1xuICAgIHN0cmVhbXMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgfVxuXG4gIGlmKHN0cmVhbXMubGVuZ3RoID09IDApXG4gICAgcmV0dXJuIHRocm91Z2goKVxuICBlbHNlIGlmKHN0cmVhbXMubGVuZ3RoID09IDEpXG4gICAgcmV0dXJuIHN0cmVhbXNbMF1cblxuICB2YXIgZmlyc3QgPSBzdHJlYW1zWzBdXG4gICAgLCBsYXN0ID0gc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdXG4gICAgLCB0aGVwaXBlID0gZHVwbGV4ZXIoZmlyc3QsIGxhc3QpXG5cbiAgLy9waXBlIGFsbCB0aGUgc3RyZWFtcyB0b2dldGhlclxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UgKHN0cmVhbXMpIHtcbiAgICBpZihzdHJlYW1zLmxlbmd0aCA8IDIpXG4gICAgICByZXR1cm5cbiAgICBzdHJlYW1zWzBdLnBpcGUoc3RyZWFtc1sxXSlcbiAgICByZWN1cnNlKHN0cmVhbXMuc2xpY2UoMSkpXG4gIH1cblxuICByZWN1cnNlKHN0cmVhbXMpXG5cbiAgZnVuY3Rpb24gb25lcnJvciAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICBhcmdzLnVuc2hpZnQoJ2Vycm9yJylcbiAgICB0aGVwaXBlLmVtaXQuYXBwbHkodGhlcGlwZSwgYXJncylcbiAgfVxuXG4gIC8vZXMuZHVwbGV4IGFscmVhZHkgcmVlbWl0cyB0aGUgZXJyb3IgZnJvbSB0aGUgZmlyc3QgYW5kIGxhc3Qgc3RyZWFtLlxuICAvL2FkZCBhIGxpc3RlbmVyIGZvciB0aGUgaW5uZXIgc3RyZWFtcyBpbiB0aGUgcGlwZWxpbmUuXG4gIGZvcih2YXIgaSA9IDE7IGkgPCBzdHJlYW1zLmxlbmd0aCAtIDE7IGkgKyspXG4gICAgc3RyZWFtc1tpXS5vbignZXJyb3InLCBvbmVycm9yKVxuXG4gIHJldHVybiB0aGVwaXBlXG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIGlzRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZyB8fCBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSAnJyArIGVuY29kaW5nO1xuICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOmNhc2UgJ3V0ZjgnOmNhc2UgJ3V0Zi04JzpjYXNlICdhc2NpaSc6Y2FzZSAnYmluYXJ5JzpjYXNlICdiYXNlNjQnOmNhc2UgJ3VjczInOmNhc2UgJ3Vjcy0yJzpjYXNlICd1dGYxNmxlJzpjYXNlICd1dGYtMTZsZSc6Y2FzZSAncmF3JzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgaWYgKCFlbmMpIHJldHVybiAndXRmOCc7XG4gIHZhciByZXRyaWVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuICd1dGY4JztcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiAndXRmMTZsZSc7XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuICdsYXRpbjEnO1xuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBlbmM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocmV0cmllZCkgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgICAgZW5jID0gKCcnICsgZW5jKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXRyaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIERvIG5vdCBjYWNoZSBgQnVmZmVyLmlzRW5jb2RpbmdgIHdoZW4gY2hlY2tpbmcgZW5jb2RpbmcgbmFtZXMgYXMgc29tZVxuLy8gbW9kdWxlcyBtb25rZXktcGF0Y2ggaXQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIGVuY29kaW5nc1xuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIHZhciBuZW5jID0gX25vcm1hbGl6ZUVuY29kaW5nKGVuYyk7XG4gIGlmICh0eXBlb2YgbmVuYyAhPT0gJ3N0cmluZycgJiYgKEJ1ZmZlci5pc0VuY29kaW5nID09PSBpc0VuY29kaW5nIHx8ICFpc0VuY29kaW5nKGVuYykpKSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmMpO1xuICByZXR1cm4gbmVuYyB8fCBlbmM7XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy5cbmV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXI7XG5mdW5jdGlvbiBTdHJpbmdEZWNvZGVyKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZyk7XG4gIHZhciBuYjtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICB0aGlzLnRleHQgPSB1dGYxNlRleHQ7XG4gICAgICB0aGlzLmVuZCA9IHV0ZjE2RW5kO1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICB0aGlzLmZpbGxMYXN0ID0gdXRmOEZpbGxMYXN0O1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHRoaXMudGV4dCA9IGJhc2U2NFRleHQ7XG4gICAgICB0aGlzLmVuZCA9IGJhc2U2NEVuZDtcbiAgICAgIG5iID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gc2ltcGxlV3JpdGU7XG4gICAgICB0aGlzLmVuZCA9IHNpbXBsZUVuZDtcbiAgICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgdGhpcy5sYXN0VG90YWwgPSAwO1xuICB0aGlzLmxhc3RDaGFyID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5iKTtcbn1cblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHZhciByO1xuICB2YXIgaTtcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICByID0gdGhpcy5maWxsTGFzdChidWYpO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBpID0gdGhpcy5sYXN0TmVlZDtcbiAgICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgfSBlbHNlIHtcbiAgICBpID0gMDtcbiAgfVxuICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHJldHVybiByID8gciArIHRoaXMudGV4dChidWYsIGkpIDogdGhpcy50ZXh0KGJ1ZiwgaSk7XG4gIHJldHVybiByIHx8ICcnO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gdXRmOEVuZDtcblxuLy8gUmV0dXJucyBvbmx5IGNvbXBsZXRlIGNoYXJhY3RlcnMgaW4gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLnRleHQgPSB1dGY4VGV4dDtcblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBwYXJ0aWFsIG5vbi1VVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZmlsbExhc3QgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59O1xuXG4vLyBDaGVja3MgdGhlIHR5cGUgb2YgYSBVVEYtOCBieXRlLCB3aGV0aGVyIGl0J3MgQVNDSUksIGEgbGVhZGluZyBieXRlLCBvciBhXG4vLyBjb250aW51YXRpb24gYnl0ZS4gSWYgYW4gaW52YWxpZCBieXRlIGlzIGRldGVjdGVkLCAtMiBpcyByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0J5dGUoYnl0ZSkge1xuICBpZiAoYnl0ZSA8PSAweDdGKSByZXR1cm4gMDtlbHNlIGlmIChieXRlID4+IDUgPT09IDB4MDYpIHJldHVybiAyO2Vsc2UgaWYgKGJ5dGUgPj4gNCA9PT0gMHgwRSkgcmV0dXJuIDM7ZWxzZSBpZiAoYnl0ZSA+PiAzID09PSAweDFFKSByZXR1cm4gNDtcbiAgcmV0dXJuIGJ5dGUgPj4gNiA9PT0gMHgwMiA/IC0xIDogLTI7XG59XG5cbi8vIENoZWNrcyBhdCBtb3N0IDMgYnl0ZXMgYXQgdGhlIGVuZCBvZiBhIEJ1ZmZlciBpbiBvcmRlciB0byBkZXRlY3QgYW5cbi8vIGluY29tcGxldGUgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIuIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgKDIsIDMsIG9yIDQpXG4vLyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIFVURi04IGNoYXJhY3RlciAoaWYgYXBwbGljYWJsZSkgYXJlIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrSW5jb21wbGV0ZShzZWxmLCBidWYsIGkpIHtcbiAgdmFyIGogPSBidWYubGVuZ3RoIC0gMTtcbiAgaWYgKGogPCBpKSByZXR1cm4gMDtcbiAgdmFyIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDE7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpIHx8IG5iID09PSAtMikgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDI7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpIHx8IG5iID09PSAtMikgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHtcbiAgICAgIGlmIChuYiA9PT0gMikgbmIgPSAwO2Vsc2Ugc2VsZi5sYXN0TmVlZCA9IG5iIC0gMztcbiAgICB9XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vLyBWYWxpZGF0ZXMgYXMgbWFueSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgYXNcbi8vIG5lZWRlZCBvciBhcmUgYXZhaWxhYmxlLiBJZiB3ZSBzZWUgYSBub24tY29udGludWF0aW9uIGJ5dGUgd2hlcmUgd2UgZXhwZWN0XG4vLyBvbmUsIHdlIFwicmVwbGFjZVwiIHRoZSB2YWxpZGF0ZWQgY29udGludWF0aW9uIGJ5dGVzIHdlJ3ZlIHNlZW4gc28gZmFyIHdpdGhcbi8vIGEgc2luZ2xlIFVURi04IHJlcGxhY2VtZW50IGNoYXJhY3RlciAoJ1xcdWZmZmQnKSwgdG8gbWF0Y2ggdjgncyBVVEYtOCBkZWNvZGluZ1xuLy8gYmVoYXZpb3IuIFRoZSBjb250aW51YXRpb24gYnl0ZSBjaGVjayBpcyBpbmNsdWRlZCB0aHJlZSB0aW1lcyBpbiB0aGUgY2FzZVxuLy8gd2hlcmUgYWxsIG9mIHRoZSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgY2hhcmFjdGVyIGV4aXN0IGluIHRoZSBzYW1lIGJ1ZmZlci5cbi8vIEl0IGlzIGFsc28gZG9uZSB0aGlzIHdheSBhcyBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbnN0ZWFkIG9mIHVzaW5nIGFcbi8vIGxvb3AuXG5mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHNlbGYsIGJ1ZiwgcCkge1xuICBpZiAoKGJ1ZlswXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgc2VsZi5sYXN0TmVlZCA9IDA7XG4gICAgcmV0dXJuICdcXHVmZmZkJztcbiAgfVxuICBpZiAoc2VsZi5sYXN0TmVlZCA+IDEgJiYgYnVmLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAoKGJ1ZlsxXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICBzZWxmLmxhc3ROZWVkID0gMTtcbiAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgfVxuICAgIGlmIChzZWxmLmxhc3ROZWVkID4gMiAmJiBidWYubGVuZ3RoID4gMikge1xuICAgICAgaWYgKChidWZbMl0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICBzZWxmLmxhc3ROZWVkID0gMjtcbiAgICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyLlxuZnVuY3Rpb24gdXRmOEZpbGxMYXN0KGJ1Zikge1xuICB2YXIgcCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgdmFyIHIgPSB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHRoaXMsIGJ1ZiwgcCk7XG4gIGlmIChyICE9PSB1bmRlZmluZWQpIHJldHVybiByO1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59XG5cbi8vIFJldHVybnMgYWxsIGNvbXBsZXRlIFVURi04IGNoYXJhY3RlcnMgaW4gYSBCdWZmZXIuIElmIHRoZSBCdWZmZXIgZW5kZWQgb24gYVxuLy8gcGFydGlhbCBjaGFyYWN0ZXIsIHRoZSBjaGFyYWN0ZXIncyBieXRlcyBhcmUgYnVmZmVyZWQgdW50aWwgdGhlIHJlcXVpcmVkXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIHV0ZjhUZXh0KGJ1ZiwgaSkge1xuICB2YXIgdG90YWwgPSB1dGY4Q2hlY2tJbmNvbXBsZXRlKHRoaXMsIGJ1ZiwgaSk7XG4gIGlmICghdGhpcy5sYXN0TmVlZCkgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGkpO1xuICB0aGlzLmxhc3RUb3RhbCA9IHRvdGFsO1xuICB2YXIgZW5kID0gYnVmLmxlbmd0aCAtICh0b3RhbCAtIHRoaXMubGFzdE5lZWQpO1xuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCAwLCBlbmQpO1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSwgZW5kKTtcbn1cblxuLy8gRm9yIFVURi04LCBhIHJlcGxhY2VtZW50IGNoYXJhY3RlciBpcyBhZGRlZCB3aGVuIGVuZGluZyBvbiBhIHBhcnRpYWxcbi8vIGNoYXJhY3Rlci5cbmZ1bmN0aW9uIHV0ZjhFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgJ1xcdWZmZmQnO1xuICByZXR1cm4gcjtcbn1cblxuLy8gVVRGLTE2TEUgdHlwaWNhbGx5IG5lZWRzIHR3byBieXRlcyBwZXIgY2hhcmFjdGVyLCBidXQgZXZlbiBpZiB3ZSBoYXZlIGFuIGV2ZW5cbi8vIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUsIHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgZW5kIG9uIGEgbGVhZGluZy9oaWdoXG4vLyBzdXJyb2dhdGUuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCB0d28gYnl0ZXMgaW4gb3JkZXIgdG9cbi8vIGRlY29kZSB0aGUgbGFzdCBjaGFyYWN0ZXIgcHJvcGVybHkuXG5mdW5jdGlvbiB1dGYxNlRleHQoYnVmLCBpKSB7XG4gIGlmICgoYnVmLmxlbmd0aCAtIGkpICUgMiA9PT0gMCkge1xuICAgIHZhciByID0gYnVmLnRvU3RyaW5nKCd1dGYxNmxlJywgaSk7XG4gICAgaWYgKHIpIHtcbiAgICAgIHZhciBjID0gci5jaGFyQ29kZUF0KHIubGVuZ3RoIC0gMSk7XG4gICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERCRkYpIHtcbiAgICAgICAgdGhpcy5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHRoaXMubGFzdFRvdGFsID0gNDtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gci5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAxO1xuICB0aGlzLmxhc3RUb3RhbCA9IDI7XG4gIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGYxNmxlJywgaSwgYnVmLmxlbmd0aCAtIDEpO1xufVxuXG4vLyBGb3IgVVRGLTE2TEUgd2UgZG8gbm90IGV4cGxpY2l0bHkgYXBwZW5kIHNwZWNpYWwgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBpZiB3ZVxuLy8gZW5kIG9uIGEgcGFydGlhbCBjaGFyYWN0ZXIsIHdlIHNpbXBseSBsZXQgdjggaGFuZGxlIHRoYXQuXG5mdW5jdGlvbiB1dGYxNkVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHZhciBlbmQgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gICAgcmV0dXJuIHIgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCd1dGYxNmxlJywgMCwgZW5kKTtcbiAgfVxuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gYmFzZTY0VGV4dChidWYsIGkpIHtcbiAgdmFyIG4gPSAoYnVmLmxlbmd0aCAtIGkpICUgMztcbiAgaWYgKG4gPT09IDApIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGkpO1xuICB0aGlzLmxhc3ROZWVkID0gMyAtIG47XG4gIHRoaXMubGFzdFRvdGFsID0gMztcbiAgaWYgKG4gPT09IDEpIHtcbiAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgfVxuICByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpLCBidWYubGVuZ3RoIC0gbik7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCdiYXNlNjQnLCAwLCAzIC0gdGhpcy5sYXN0TmVlZCk7XG4gIHJldHVybiByO1xufVxuXG4vLyBQYXNzIGJ5dGVzIG9uIHRocm91Z2ggZm9yIHNpbmdsZS1ieXRlIGVuY29kaW5ncyAoZS5nLiBhc2NpaSwgbGF0aW4xLCBoZXgpXG5mdW5jdGlvbiBzaW1wbGVXcml0ZShidWYpIHtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlRW5kKGJ1Zikge1xuICByZXR1cm4gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbn0iLCIndXNlIHN0cmljdCc7XG5jb25zdCBpc1JlZ2V4cCA9IHJlcXVpcmUoJ2lzLXJlZ2V4cCcpO1xuY29uc3QgaXNPYmogPSByZXF1aXJlKCdpcy1vYmonKTtcbmNvbnN0IGdldE93bkVudW1Qcm9wU3ltYm9scyA9IHJlcXVpcmUoJ2dldC1vd24tZW51bWVyYWJsZS1wcm9wZXJ0eS1zeW1ib2xzJykuZGVmYXVsdDtcblxubW9kdWxlLmV4cG9ydHMgPSAodmFsLCBvcHRzLCBwYWQpID0+IHtcblx0Y29uc3Qgc2VlbiA9IFtdO1xuXG5cdHJldHVybiAoZnVuY3Rpb24gc3RyaW5naWZ5KHZhbCwgb3B0cywgcGFkKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cdFx0b3B0cy5pbmRlbnQgPSBvcHRzLmluZGVudCB8fCAnXFx0Jztcblx0XHRwYWQgPSBwYWQgfHwgJyc7XG5cblx0XHRsZXQgdG9rZW5zO1xuXG5cdFx0aWYgKG9wdHMuaW5saW5lQ2hhcmFjdGVyTGltaXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dG9rZW5zID0ge1xuXHRcdFx0XHRuZXdMaW5lOiAnXFxuJyxcblx0XHRcdFx0bmV3TGluZU9yU3BhY2U6ICdcXG4nLFxuXHRcdFx0XHRwYWQsXG5cdFx0XHRcdGluZGVudDogcGFkICsgb3B0cy5pbmRlbnRcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRva2VucyA9IHtcblx0XHRcdFx0bmV3TGluZTogJ0BAX19TVFJJTkdJRllfT0JKRUNUX05FV19MSU5FX19AQCcsXG5cdFx0XHRcdG5ld0xpbmVPclNwYWNlOiAnQEBfX1NUUklOR0lGWV9PQkpFQ1RfTkVXX0xJTkVfT1JfU1BBQ0VfX0BAJyxcblx0XHRcdFx0cGFkOiAnQEBfX1NUUklOR0lGWV9PQkpFQ1RfUEFEX19AQCcsXG5cdFx0XHRcdGluZGVudDogJ0BAX19TVFJJTkdJRllfT0JKRUNUX0lOREVOVF9fQEAnXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGV4cGFuZFdoaXRlU3BhY2UgPSBzdHJpbmcgPT4ge1xuXHRcdFx0aWYgKG9wdHMuaW5saW5lQ2hhcmFjdGVyTGltaXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gc3RyaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvbmVMaW5lZCA9IHN0cmluZ1xuXHRcdFx0XHQucmVwbGFjZShuZXcgUmVnRXhwKHRva2Vucy5uZXdMaW5lLCAnZycpLCAnJylcblx0XHRcdFx0LnJlcGxhY2UobmV3IFJlZ0V4cCh0b2tlbnMubmV3TGluZU9yU3BhY2UsICdnJyksICcgJylcblx0XHRcdFx0LnJlcGxhY2UobmV3IFJlZ0V4cCh0b2tlbnMucGFkICsgJ3wnICsgdG9rZW5zLmluZGVudCwgJ2cnKSwgJycpO1xuXG5cdFx0XHRpZiAob25lTGluZWQubGVuZ3RoIDw9IG9wdHMuaW5saW5lQ2hhcmFjdGVyTGltaXQpIHtcblx0XHRcdFx0cmV0dXJuIG9uZUxpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3RyaW5nXG5cdFx0XHRcdC5yZXBsYWNlKG5ldyBSZWdFeHAodG9rZW5zLm5ld0xpbmUgKyAnfCcgKyB0b2tlbnMubmV3TGluZU9yU3BhY2UsICdnJyksICdcXG4nKVxuXHRcdFx0XHQucmVwbGFjZShuZXcgUmVnRXhwKHRva2Vucy5wYWQsICdnJyksIHBhZClcblx0XHRcdFx0LnJlcGxhY2UobmV3IFJlZ0V4cCh0b2tlbnMuaW5kZW50LCAnZycpLCBwYWQgKyBvcHRzLmluZGVudCk7XG5cdFx0fTtcblxuXHRcdGlmIChzZWVuLmluZGV4T2YodmFsKSAhPT0gLTEpIHtcblx0XHRcdHJldHVybiAnXCJbQ2lyY3VsYXJdXCInO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgPT09IG51bGwgfHxcblx0XHRcdHZhbCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHR0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fFxuXHRcdFx0dHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nIHx8XG5cdFx0XHR0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nIHx8XG5cdFx0XHR0eXBlb2YgdmFsID09PSAnc3ltYm9sJyB8fFxuXHRcdFx0aXNSZWdleHAodmFsKSkge1xuXHRcdFx0cmV0dXJuIFN0cmluZyh2YWwpO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRyZXR1cm4gYG5ldyBEYXRlKCcke3ZhbC50b0lTT1N0cmluZygpfScpYDtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gJ1tdJztcblx0XHRcdH1cblxuXHRcdFx0c2Vlbi5wdXNoKHZhbCk7XG5cblx0XHRcdGNvbnN0IHJldCA9ICdbJyArIHRva2Vucy5uZXdMaW5lICsgdmFsLm1hcCgoZWwsIGkpID0+IHtcblx0XHRcdFx0Y29uc3QgZW9sID0gdmFsLmxlbmd0aCAtIDEgPT09IGkgPyB0b2tlbnMubmV3TGluZSA6ICcsJyArIHRva2Vucy5uZXdMaW5lT3JTcGFjZTtcblx0XHRcdFx0bGV0IHZhbHVlID0gc3RyaW5naWZ5KGVsLCBvcHRzLCBwYWQgKyBvcHRzLmluZGVudCk7XG5cdFx0XHRcdGlmIChvcHRzLnRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdHZhbHVlID0gb3B0cy50cmFuc2Zvcm0odmFsLCBpLCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRva2Vucy5pbmRlbnQgKyB2YWx1ZSArIGVvbDtcblx0XHRcdH0pLmpvaW4oJycpICsgdG9rZW5zLnBhZCArICddJztcblxuXHRcdFx0c2Vlbi5wb3AoKTtcblxuXHRcdFx0cmV0dXJuIGV4cGFuZFdoaXRlU3BhY2UocmV0KTtcblx0XHR9XG5cblx0XHRpZiAoaXNPYmoodmFsKSkge1xuXHRcdFx0bGV0IG9iaktleXMgPSBPYmplY3Qua2V5cyh2YWwpLmNvbmNhdChnZXRPd25FbnVtUHJvcFN5bWJvbHModmFsKSk7XG5cblx0XHRcdGlmIChvcHRzLmZpbHRlcikge1xuXHRcdFx0XHRvYmpLZXlzID0gb2JqS2V5cy5maWx0ZXIoZWwgPT4gb3B0cy5maWx0ZXIodmFsLCBlbCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob2JqS2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuICd7fSc7XG5cdFx0XHR9XG5cblx0XHRcdHNlZW4ucHVzaCh2YWwpO1xuXG5cdFx0XHRjb25zdCByZXQgPSAneycgKyB0b2tlbnMubmV3TGluZSArIG9iaktleXMubWFwKChlbCwgaSkgPT4ge1xuXHRcdFx0XHRjb25zdCBlb2wgPSBvYmpLZXlzLmxlbmd0aCAtIDEgPT09IGkgPyB0b2tlbnMubmV3TGluZSA6ICcsJyArIHRva2Vucy5uZXdMaW5lT3JTcGFjZTtcblx0XHRcdFx0Y29uc3QgaXNTeW1ib2wgPSB0eXBlb2YgZWwgPT09ICdzeW1ib2wnO1xuXHRcdFx0XHRjb25zdCBpc0NsYXNzaWMgPSAhaXNTeW1ib2wgJiYgL15bYS16JF9dW2EteiRfMC05XSokL2kudGVzdChlbCk7XG5cdFx0XHRcdGNvbnN0IGtleSA9IGlzU3ltYm9sIHx8IGlzQ2xhc3NpYyA/IGVsIDogc3RyaW5naWZ5KGVsLCBvcHRzKTtcblx0XHRcdFx0bGV0IHZhbHVlID0gc3RyaW5naWZ5KHZhbFtlbF0sIG9wdHMsIHBhZCArIG9wdHMuaW5kZW50KTtcblx0XHRcdFx0aWYgKG9wdHMudHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBvcHRzLnRyYW5zZm9ybSh2YWwsIGVsLCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRva2Vucy5pbmRlbnQgKyBTdHJpbmcoa2V5KSArICc6ICcgKyB2YWx1ZSArIGVvbDtcblx0XHRcdH0pLmpvaW4oJycpICsgdG9rZW5zLnBhZCArICd9JztcblxuXHRcdFx0c2Vlbi5wb3AoKTtcblxuXHRcdFx0cmV0dXJuIGV4cGFuZFdoaXRlU3BhY2UocmV0KTtcblx0XHR9XG5cblx0XHR2YWwgPSBTdHJpbmcodmFsKS5yZXBsYWNlKC9bXFxyXFxuXS9nLCB4ID0+IHggPT09ICdcXG4nID8gJ1xcXFxuJyA6ICdcXFxccicpO1xuXG5cdFx0aWYgKG9wdHMuc2luZ2xlUXVvdGVzID09PSBmYWxzZSkge1xuXHRcdFx0dmFsID0gdmFsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKTtcblx0XHRcdHJldHVybiBgXCIke3ZhbH1cImA7XG5cdFx0fVxuXG5cdFx0dmFsID0gdmFsLnJlcGxhY2UoL1xcXFw/Jy9nLCAnXFxcXFxcJycpO1xuXHRcdHJldHVybiBgJyR7dmFsfSdgO1xuXHR9KSh2YWwsIG9wdHMsIHBhZCk7XG59O1xuIiwidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbi8vIHRocm91Z2hcbi8vXG4vLyBhIHN0cmVhbSB0aGF0IGRvZXMgbm90aGluZyBidXQgcmUtZW1pdCB0aGUgaW5wdXQuXG4vLyB1c2VmdWwgZm9yIGFnZ3JlZ2F0aW5nIGEgc2VyaWVzIG9mIGNoYW5naW5nIGJ1dCBub3QgZW5kaW5nIHN0cmVhbXMgaW50byBvbmUgc3RyZWFtKVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0aHJvdWdoXG50aHJvdWdoLnRocm91Z2ggPSB0aHJvdWdoXG5cbi8vY3JlYXRlIGEgcmVhZGFibGUgd3JpdGFibGUgc3RyZWFtLlxuXG5mdW5jdGlvbiB0aHJvdWdoICh3cml0ZSwgZW5kLCBvcHRzKSB7XG4gIHdyaXRlID0gd3JpdGUgfHwgZnVuY3Rpb24gKGRhdGEpIHsgdGhpcy5xdWV1ZShkYXRhKSB9XG4gIGVuZCA9IGVuZCB8fCBmdW5jdGlvbiAoKSB7IHRoaXMucXVldWUobnVsbCkgfVxuXG4gIHZhciBlbmRlZCA9IGZhbHNlLCBkZXN0cm95ZWQgPSBmYWxzZSwgYnVmZmVyID0gW10sIF9lbmRlZCA9IGZhbHNlXG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgc3RyZWFtLnJlYWRhYmxlID0gc3RyZWFtLndyaXRhYmxlID0gdHJ1ZVxuICBzdHJlYW0ucGF1c2VkID0gZmFsc2VcblxuLy8gIHN0cmVhbS5hdXRvUGF1c2UgICA9ICEob3B0cyAmJiBvcHRzLmF1dG9QYXVzZSAgID09PSBmYWxzZSlcbiAgc3RyZWFtLmF1dG9EZXN0cm95ID0gIShvcHRzICYmIG9wdHMuYXV0b0Rlc3Ryb3kgPT09IGZhbHNlKVxuXG4gIHN0cmVhbS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgd3JpdGUuY2FsbCh0aGlzLCBkYXRhKVxuICAgIHJldHVybiAhc3RyZWFtLnBhdXNlZFxuICB9XG5cbiAgZnVuY3Rpb24gZHJhaW4oKSB7XG4gICAgd2hpbGUoYnVmZmVyLmxlbmd0aCAmJiAhc3RyZWFtLnBhdXNlZCkge1xuICAgICAgdmFyIGRhdGEgPSBidWZmZXIuc2hpZnQoKVxuICAgICAgaWYobnVsbCA9PT0gZGF0YSlcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgZWxzZVxuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgc3RyZWFtLnF1ZXVlID0gc3RyZWFtLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSkge1xuLy8gICAgY29uc29sZS5lcnJvcihlbmRlZClcbiAgICBpZihfZW5kZWQpIHJldHVybiBzdHJlYW1cbiAgICBpZihkYXRhID09PSBudWxsKSBfZW5kZWQgPSB0cnVlXG4gICAgYnVmZmVyLnB1c2goZGF0YSlcbiAgICBkcmFpbigpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgLy90aGlzIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyB0aGUgZmlyc3QgJ2VuZCcgbGlzdGVuZXJcbiAgLy9tdXN0IGNhbGwgZGVzdHJveSBuZXh0IHRpY2ssIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhZnRlciBhbnlcbiAgLy9zdHJlYW0gcGlwZWQgZnJvbSBoZXJlLlxuICAvL3RoaXMgaXMgb25seSBhIHByb2JsZW0gaWYgZW5kIGlzIG5vdCBlbWl0dGVkIHN5bmNocm9ub3VzbHkuXG4gIC8vYSBuaWNlciB3YXkgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhpcyBpcyB0aGUgbGFzdCBsaXN0ZW5lciBmb3IgJ2VuZCdcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZVxuICAgIGlmKCFzdHJlYW0ud3JpdGFibGUgJiYgc3RyZWFtLmF1dG9EZXN0cm95KVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICAgIH0pXG4gIH0pXG5cbiAgZnVuY3Rpb24gX2VuZCAoKSB7XG4gICAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcbiAgICBlbmQuY2FsbChzdHJlYW0pXG4gICAgaWYoIXN0cmVhbS5yZWFkYWJsZSAmJiBzdHJlYW0uYXV0b0Rlc3Ryb3kpXG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gIH1cblxuICBzdHJlYW0uZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuXG4gICAgZW5kZWQgPSB0cnVlXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkgc3RyZWFtLndyaXRlKGRhdGEpXG4gICAgX2VuZCgpIC8vIHdpbGwgZW1pdCBvciBxdWV1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuICAgIGVuZGVkID0gdHJ1ZVxuICAgIGJ1ZmZlci5sZW5ndGggPSAwXG4gICAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gZmFsc2VcbiAgICBzdHJlYW0uZW1pdCgnY2xvc2UnKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihzdHJlYW0ucGF1c2VkKSByZXR1cm5cbiAgICBzdHJlYW0ucGF1c2VkID0gdHJ1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoc3RyZWFtLnBhdXNlZCkge1xuICAgICAgc3RyZWFtLnBhdXNlZCA9IGZhbHNlXG4gICAgICBzdHJlYW0uZW1pdCgncmVzdW1lJylcbiAgICB9XG4gICAgZHJhaW4oKVxuICAgIC8vbWF5IGhhdmUgYmVjb21lIHBhdXNlZCBhZ2FpbixcbiAgICAvL2FzIGRyYWluIGVtaXRzICdkYXRhJy5cbiAgICBpZighc3RyZWFtLnBhdXNlZClcbiAgICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG4gIHJldHVybiBzdHJlYW1cbn1cblxuIiwiLyoqIEBsaWNlbnNlIFVSSS5qcyB2NC40LjEgKGMpIDIwMTEgR2FyeSBDb3VydC4gTGljZW5zZTogaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L3VyaS1qcyAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuXHQoZmFjdG9yeSgoZ2xvYmFsLlVSSSA9IGdsb2JhbC5VUkkgfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG1lcmdlKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzZXRzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIHNldHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKHNldHMubGVuZ3RoID4gMSkge1xuICAgICAgICBzZXRzWzBdID0gc2V0c1swXS5zbGljZSgwLCAtMSk7XG4gICAgICAgIHZhciB4bCA9IHNldHMubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yICh2YXIgeCA9IDE7IHggPCB4bDsgKyt4KSB7XG4gICAgICAgICAgICBzZXRzW3hdID0gc2V0c1t4XS5zbGljZSgxLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0c1t4bF0gPSBzZXRzW3hsXS5zbGljZSgxKTtcbiAgICAgICAgcmV0dXJuIHNldHMuam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNldHNbMF07XG4gICAgfVxufVxuZnVuY3Rpb24gc3ViZXhwKHN0cikge1xuICAgIHJldHVybiBcIig/OlwiICsgc3RyICsgXCIpXCI7XG59XG5mdW5jdGlvbiB0eXBlT2Yobykge1xuICAgIHJldHVybiBvID09PSB1bmRlZmluZWQgPyBcInVuZGVmaW5lZFwiIDogbyA9PT0gbnVsbCA/IFwibnVsbFwiIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNwbGl0KFwiIFwiKS5wb3AoKS5zcGxpdChcIl1cIikuc2hpZnQoKS50b0xvd2VyQ2FzZSgpO1xufVxuZnVuY3Rpb24gdG9VcHBlckNhc2Uoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50b1VwcGVyQ2FzZSgpO1xufVxuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gb2JqIGluc3RhbmNlb2YgQXJyYXkgPyBvYmogOiB0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gXCJudW1iZXJcIiB8fCBvYmouc3BsaXQgfHwgb2JqLnNldEludGVydmFsIHx8IG9iai5jYWxsID8gW29ial0gOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopIDogW107XG59XG5mdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHtcbiAgICB2YXIgb2JqID0gdGFyZ2V0O1xuICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBidWlsZEV4cHMoaXNJUkkpIHtcbiAgICB2YXIgQUxQSEEkJCA9IFwiW0EtWmEtel1cIixcbiAgICAgICAgQ1IkID0gXCJbXFxcXHgwRF1cIixcbiAgICAgICAgRElHSVQkJCA9IFwiWzAtOV1cIixcbiAgICAgICAgRFFVT1RFJCQgPSBcIltcXFxceDIyXVwiLFxuICAgICAgICBIRVhESUckJCA9IG1lcmdlKERJR0lUJCQsIFwiW0EtRmEtZl1cIiksXG4gICAgICAgIC8vY2FzZS1pbnNlbnNpdGl2ZVxuICAgIExGJCQgPSBcIltcXFxceDBBXVwiLFxuICAgICAgICBTUCQkID0gXCJbXFxcXHgyMF1cIixcbiAgICAgICAgUENUX0VOQ09ERUQkID0gc3ViZXhwKHN1YmV4cChcIiVbRUZlZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVs4OUEtRmEtZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVwiICsgSEVYRElHJCQgKyBIRVhESUckJCkpLFxuICAgICAgICAvL2V4cGFuZGVkXG4gICAgR0VOX0RFTElNUyQkID0gXCJbXFxcXDpcXFxcL1xcXFw/XFxcXCNcXFxcW1xcXFxdXFxcXEBdXCIsXG4gICAgICAgIFNVQl9ERUxJTVMkJCA9IFwiW1xcXFwhXFxcXCRcXFxcJlxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFw7XFxcXD1dXCIsXG4gICAgICAgIFJFU0VSVkVEJCQgPSBtZXJnZShHRU5fREVMSU1TJCQsIFNVQl9ERUxJTVMkJCksXG4gICAgICAgIFVDU0NIQVIkJCA9IGlzSVJJID8gXCJbXFxcXHhBMC1cXFxcdTIwMERcXFxcdTIwMTAtXFxcXHUyMDI5XFxcXHUyMDJGLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkVGXVwiIDogXCJbXVwiLFxuICAgICAgICAvL3N1YnNldCwgZXhjbHVkZXMgYmlkaSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICBJUFJJVkFURSQkID0gaXNJUkkgPyBcIltcXFxcdUUwMDAtXFxcXHVGOEZGXVwiIDogXCJbXVwiLFxuICAgICAgICAvL3N1YnNldFxuICAgIFVOUkVTRVJWRUQkJCA9IG1lcmdlKEFMUEhBJCQsIERJR0lUJCQsIFwiW1xcXFwtXFxcXC5cXFxcX1xcXFx+XVwiLCBVQ1NDSEFSJCQpLFxuICAgICAgICBTQ0hFTUUkID0gc3ViZXhwKEFMUEhBJCQgKyBtZXJnZShBTFBIQSQkLCBESUdJVCQkLCBcIltcXFxcK1xcXFwtXFxcXC5dXCIpICsgXCIqXCIpLFxuICAgICAgICBVU0VSSU5GTyQgPSBzdWJleHAoc3ViZXhwKFBDVF9FTkNPREVEJCArIFwifFwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XVwiKSkgKyBcIipcIiksXG4gICAgICAgIERFQ19PQ1RFVCQgPSBzdWJleHAoc3ViZXhwKFwiMjVbMC01XVwiKSArIFwifFwiICsgc3ViZXhwKFwiMlswLTRdXCIgKyBESUdJVCQkKSArIFwifFwiICsgc3ViZXhwKFwiMVwiICsgRElHSVQkJCArIERJR0lUJCQpICsgXCJ8XCIgKyBzdWJleHAoXCJbMS05XVwiICsgRElHSVQkJCkgKyBcInxcIiArIERJR0lUJCQpLFxuICAgICAgICBERUNfT0NURVRfUkVMQVhFRCQgPSBzdWJleHAoc3ViZXhwKFwiMjVbMC01XVwiKSArIFwifFwiICsgc3ViZXhwKFwiMlswLTRdXCIgKyBESUdJVCQkKSArIFwifFwiICsgc3ViZXhwKFwiMVwiICsgRElHSVQkJCArIERJR0lUJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIwP1sxLTldXCIgKyBESUdJVCQkKSArIFwifDA/MD9cIiArIERJR0lUJCQpLFxuICAgICAgICAvL3JlbGF4ZWQgcGFyc2luZyBydWxlc1xuICAgIElQVjRBRERSRVNTJCA9IHN1YmV4cChERUNfT0NURVRfUkVMQVhFRCQgKyBcIlxcXFwuXCIgKyBERUNfT0NURVRfUkVMQVhFRCQgKyBcIlxcXFwuXCIgKyBERUNfT0NURVRfUkVMQVhFRCQgKyBcIlxcXFwuXCIgKyBERUNfT0NURVRfUkVMQVhFRCQpLFxuICAgICAgICBIMTYkID0gc3ViZXhwKEhFWERJRyQkICsgXCJ7MSw0fVwiKSxcbiAgICAgICAgTFMzMiQgPSBzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIgKyBIMTYkKSArIFwifFwiICsgSVBWNEFERFJFU1MkKSxcbiAgICAgICAgSVBWNkFERFJFU1MxJCA9IHN1YmV4cChzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcIns2fVwiICsgTFMzMiQpLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDYoIGgxNiBcIjpcIiApIGxzMzJcbiAgICBJUFY2QUREUkVTUzIkID0gc3ViZXhwKFwiXFxcXDpcXFxcOlwiICsgc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7NX1cIiArIExTMzIkKSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgXCI6OlwiIDUoIGgxNiBcIjpcIiApIGxzMzJcbiAgICBJUFY2QUREUkVTUzMkID0gc3ViZXhwKHN1YmV4cChIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiArIHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezR9XCIgKyBMUzMyJCksXG4gICAgICAgIC8vWyAgICAgICAgICAgICAgIGgxNiBdIFwiOjpcIiA0KCBoMTYgXCI6XCIgKSBsczMyXG4gICAgSVBWNkFERFJFU1M0JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwxfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInszfVwiICsgTFMzMiQpLFxuICAgICAgICAvL1sgKjEoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAzKCBoMTYgXCI6XCIgKSBsczMyXG4gICAgSVBWNkFERFJFU1M1JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwyfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInsyfVwiICsgTFMzMiQpLFxuICAgICAgICAvL1sgKjIoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAyKCBoMTYgXCI6XCIgKSBsczMyXG4gICAgSVBWNkFERFJFU1M2JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwzfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBIMTYkICsgXCJcXFxcOlwiICsgTFMzMiQpLFxuICAgICAgICAvL1sgKjMoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAgICBoMTYgXCI6XCIgICBsczMyXG4gICAgSVBWNkFERFJFU1M3JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCw0fVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBMUzMyJCksXG4gICAgICAgIC8vWyAqNCggaDE2IFwiOlwiICkgaDE2IF0gXCI6OlwiICAgICAgICAgICAgICBsczMyXG4gICAgSVBWNkFERFJFU1M4JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCw1fVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBIMTYkKSxcbiAgICAgICAgLy9bICo1KCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCIgICAgICAgICAgICAgIGgxNlxuICAgIElQVjZBRERSRVNTOSQgPSBzdWJleHAoc3ViZXhwKHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezAsNn1cIiArIEgxNiQpICsgXCI/XFxcXDpcXFxcOlwiKSxcbiAgICAgICAgLy9bICo2KCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCJcbiAgICBJUFY2QUREUkVTUyQgPSBzdWJleHAoW0lQVjZBRERSRVNTMSQsIElQVjZBRERSRVNTMiQsIElQVjZBRERSRVNTMyQsIElQVjZBRERSRVNTNCQsIElQVjZBRERSRVNTNSQsIElQVjZBRERSRVNTNiQsIElQVjZBRERSRVNTNyQsIElQVjZBRERSRVNTOCQsIElQVjZBRERSRVNTOSRdLmpvaW4oXCJ8XCIpKSxcbiAgICAgICAgWk9ORUlEJCA9IHN1YmV4cChzdWJleHAoVU5SRVNFUlZFRCQkICsgXCJ8XCIgKyBQQ1RfRU5DT0RFRCQpICsgXCIrXCIpLFxuICAgICAgICAvL1JGQyA2ODc0XG4gICAgSVBWNkFERFJaJCA9IHN1YmV4cChJUFY2QUREUkVTUyQgKyBcIlxcXFwlMjVcIiArIFpPTkVJRCQpLFxuICAgICAgICAvL1JGQyA2ODc0XG4gICAgSVBWNkFERFJaX1JFTEFYRUQkID0gc3ViZXhwKElQVjZBRERSRVNTJCArIHN1YmV4cChcIlxcXFwlMjV8XFxcXCUoPyFcIiArIEhFWERJRyQkICsgXCJ7Mn0pXCIpICsgWk9ORUlEJCksXG4gICAgICAgIC8vUkZDIDY4NzQsIHdpdGggcmVsYXhlZCBwYXJzaW5nIHJ1bGVzXG4gICAgSVBWRlVUVVJFJCA9IHN1YmV4cChcIlt2Vl1cIiArIEhFWERJRyQkICsgXCIrXFxcXC5cIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOl1cIikgKyBcIitcIiksXG4gICAgICAgIElQX0xJVEVSQUwkID0gc3ViZXhwKFwiXFxcXFtcIiArIHN1YmV4cChJUFY2QUREUlpfUkVMQVhFRCQgKyBcInxcIiArIElQVjZBRERSRVNTJCArIFwifFwiICsgSVBWRlVUVVJFJCkgKyBcIlxcXFxdXCIpLFxuICAgICAgICAvL1JGQyA2ODc0XG4gICAgUkVHX05BTUUkID0gc3ViZXhwKHN1YmV4cChQQ1RfRU5DT0RFRCQgKyBcInxcIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSkgKyBcIipcIiksXG4gICAgICAgIEhPU1QkID0gc3ViZXhwKElQX0xJVEVSQUwkICsgXCJ8XCIgKyBJUFY0QUREUkVTUyQgKyBcIig/IVwiICsgUkVHX05BTUUkICsgXCIpXCIgKyBcInxcIiArIFJFR19OQU1FJCksXG4gICAgICAgIFBPUlQkID0gc3ViZXhwKERJR0lUJCQgKyBcIipcIiksXG4gICAgICAgIEFVVEhPUklUWSQgPSBzdWJleHAoc3ViZXhwKFVTRVJJTkZPJCArIFwiQFwiKSArIFwiP1wiICsgSE9TVCQgKyBzdWJleHAoXCJcXFxcOlwiICsgUE9SVCQpICsgXCI/XCIpLFxuICAgICAgICBQQ0hBUiQgPSBzdWJleHAoUENUX0VOQ09ERUQkICsgXCJ8XCIgKyBtZXJnZShVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXDpcXFxcQF1cIikpLFxuICAgICAgICBTRUdNRU5UJCA9IHN1YmV4cChQQ0hBUiQgKyBcIipcIiksXG4gICAgICAgIFNFR01FTlRfTlokID0gc3ViZXhwKFBDSEFSJCArIFwiK1wiKSxcbiAgICAgICAgU0VHTUVOVF9OWl9OQyQgPSBzdWJleHAoc3ViZXhwKFBDVF9FTkNPREVEJCArIFwifFwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFxAXVwiKSkgKyBcIitcIiksXG4gICAgICAgIFBBVEhfQUJFTVBUWSQgPSBzdWJleHAoc3ViZXhwKFwiXFxcXC9cIiArIFNFR01FTlQkKSArIFwiKlwiKSxcbiAgICAgICAgUEFUSF9BQlNPTFVURSQgPSBzdWJleHAoXCJcXFxcL1wiICsgc3ViZXhwKFNFR01FTlRfTlokICsgUEFUSF9BQkVNUFRZJCkgKyBcIj9cIiksXG4gICAgICAgIC8vc2ltcGxpZmllZFxuICAgIFBBVEhfTk9TQ0hFTUUkID0gc3ViZXhwKFNFR01FTlRfTlpfTkMkICsgUEFUSF9BQkVNUFRZJCksXG4gICAgICAgIC8vc2ltcGxpZmllZFxuICAgIFBBVEhfUk9PVExFU1MkID0gc3ViZXhwKFNFR01FTlRfTlokICsgUEFUSF9BQkVNUFRZJCksXG4gICAgICAgIC8vc2ltcGxpZmllZFxuICAgIFBBVEhfRU1QVFkkID0gXCIoPyFcIiArIFBDSEFSJCArIFwiKVwiLFxuICAgICAgICBQQVRIJCA9IHN1YmV4cChQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9OT1NDSEVNRSQgKyBcInxcIiArIFBBVEhfUk9PVExFU1MkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG4gICAgICAgIFFVRVJZJCA9IHN1YmV4cChzdWJleHAoUENIQVIkICsgXCJ8XCIgKyBtZXJnZShcIltcXFxcL1xcXFw/XVwiLCBJUFJJVkFURSQkKSkgKyBcIipcIiksXG4gICAgICAgIEZSQUdNRU5UJCA9IHN1YmV4cChzdWJleHAoUENIQVIkICsgXCJ8W1xcXFwvXFxcXD9dXCIpICsgXCIqXCIpLFxuICAgICAgICBISUVSX1BBUlQkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC9cIiArIEFVVEhPUklUWSQgKyBQQVRIX0FCRU1QVFkkKSArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfUk9PVExFU1MkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG4gICAgICAgIFVSSSQgPSBzdWJleHAoU0NIRU1FJCArIFwiXFxcXDpcIiArIEhJRVJfUEFSVCQgKyBzdWJleHAoXCJcXFxcP1wiICsgUVVFUlkkKSArIFwiP1wiICsgc3ViZXhwKFwiXFxcXCNcIiArIEZSQUdNRU5UJCkgKyBcIj9cIiksXG4gICAgICAgIFJFTEFUSVZFX1BBUlQkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC9cIiArIEFVVEhPUklUWSQgKyBQQVRIX0FCRU1QVFkkKSArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG4gICAgICAgIFJFTEFUSVZFJCA9IHN1YmV4cChSRUxBVElWRV9QQVJUJCArIHN1YmV4cChcIlxcXFw/XCIgKyBRVUVSWSQpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcI1wiICsgRlJBR01FTlQkKSArIFwiP1wiKSxcbiAgICAgICAgVVJJX1JFRkVSRU5DRSQgPSBzdWJleHAoVVJJJCArIFwifFwiICsgUkVMQVRJVkUkKSxcbiAgICAgICAgQUJTT0xVVEVfVVJJJCA9IHN1YmV4cChTQ0hFTUUkICsgXCJcXFxcOlwiICsgSElFUl9QQVJUJCArIHN1YmV4cChcIlxcXFw/XCIgKyBRVUVSWSQpICsgXCI/XCIpLFxuICAgICAgICBHRU5FUklDX1JFRiQgPSBcIl4oXCIgKyBTQ0hFTUUkICsgXCIpXFxcXDpcIiArIHN1YmV4cChzdWJleHAoXCJcXFxcL1xcXFwvKFwiICsgc3ViZXhwKFwiKFwiICsgVVNFUklORk8kICsgXCIpQFwiKSArIFwiPyhcIiArIEhPU1QkICsgXCIpXCIgKyBzdWJleHAoXCJcXFxcOihcIiArIFBPUlQkICsgXCIpXCIpICsgXCI/KVwiKSArIFwiPyhcIiArIFBBVEhfQUJFTVBUWSQgKyBcInxcIiArIFBBVEhfQUJTT0xVVEUkICsgXCJ8XCIgKyBQQVRIX1JPT1RMRVNTJCArIFwifFwiICsgUEFUSF9FTVBUWSQgKyBcIilcIikgKyBzdWJleHAoXCJcXFxcPyhcIiArIFFVRVJZJCArIFwiKVwiKSArIFwiP1wiICsgc3ViZXhwKFwiXFxcXCMoXCIgKyBGUkFHTUVOVCQgKyBcIilcIikgKyBcIj8kXCIsXG4gICAgICAgIFJFTEFUSVZFX1JFRiQgPSBcIl4oKXswfVwiICsgc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC8oXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8pXCIpICsgXCI/KFwiICsgUEFUSF9BQkVNUFRZJCArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCArIFwiKVwiKSArIHN1YmV4cChcIlxcXFw/KFwiICsgUVVFUlkkICsgXCIpXCIpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcIyhcIiArIEZSQUdNRU5UJCArIFwiKVwiKSArIFwiPyRcIixcbiAgICAgICAgQUJTT0xVVEVfUkVGJCA9IFwiXihcIiArIFNDSEVNRSQgKyBcIilcXFxcOlwiICsgc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC8oXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8pXCIpICsgXCI/KFwiICsgUEFUSF9BQkVNUFRZJCArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfUk9PVExFU1MkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCArIFwiKVwiKSArIHN1YmV4cChcIlxcXFw/KFwiICsgUVVFUlkkICsgXCIpXCIpICsgXCI/JFwiLFxuICAgICAgICBTQU1FRE9DX1JFRiQgPSBcIl5cIiArIHN1YmV4cChcIlxcXFwjKFwiICsgRlJBR01FTlQkICsgXCIpXCIpICsgXCI/JFwiLFxuICAgICAgICBBVVRIT1JJVFlfUkVGJCA9IFwiXlwiICsgc3ViZXhwKFwiKFwiICsgVVNFUklORk8kICsgXCIpQFwiKSArIFwiPyhcIiArIEhPU1QkICsgXCIpXCIgKyBzdWJleHAoXCJcXFxcOihcIiArIFBPUlQkICsgXCIpXCIpICsgXCI/JFwiO1xuICAgIHJldHVybiB7XG4gICAgICAgIE5PVF9TQ0hFTUU6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXl1cIiwgQUxQSEEkJCwgRElHSVQkJCwgXCJbXFxcXCtcXFxcLVxcXFwuXVwiKSwgXCJnXCIpLFxuICAgICAgICBOT1RfVVNFUklORk86IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXDpdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfSE9TVDogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVcXFxcW1xcXFxdXFxcXDpdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfUEFUSDogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVcXFxcL1xcXFw6XFxcXEBdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfUEFUSF9OT1NDSEVNRTogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVcXFxcL1xcXFxAXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcbiAgICAgICAgTk9UX1FVRVJZOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJV1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XFxcXEBcXFxcL1xcXFw/XVwiLCBJUFJJVkFURSQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfRlJBR01FTlQ6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXDpcXFxcQFxcXFwvXFxcXD9dXCIpLCBcImdcIiksXG4gICAgICAgIEVTQ0FQRTogbmV3IFJlZ0V4cChtZXJnZShcIlteXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcbiAgICAgICAgVU5SRVNFUlZFRDogbmV3IFJlZ0V4cChVTlJFU0VSVkVEJCQsIFwiZ1wiKSxcbiAgICAgICAgT1RIRVJfQ0hBUlM6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXVwiLCBVTlJFU0VSVkVEJCQsIFJFU0VSVkVEJCQpLCBcImdcIiksXG4gICAgICAgIFBDVF9FTkNPREVEOiBuZXcgUmVnRXhwKFBDVF9FTkNPREVEJCwgXCJnXCIpLFxuICAgICAgICBJUFY0QUREUkVTUzogbmV3IFJlZ0V4cChcIl4oXCIgKyBJUFY0QUREUkVTUyQgKyBcIikkXCIpLFxuICAgICAgICBJUFY2QUREUkVTUzogbmV3IFJlZ0V4cChcIl5cXFxcWz8oXCIgKyBJUFY2QUREUkVTUyQgKyBcIilcIiArIHN1YmV4cChzdWJleHAoXCJcXFxcJTI1fFxcXFwlKD8hXCIgKyBIRVhESUckJCArIFwiezJ9KVwiKSArIFwiKFwiICsgWk9ORUlEJCArIFwiKVwiKSArIFwiP1xcXFxdPyRcIikgLy9SRkMgNjg3NCwgd2l0aCByZWxheGVkIHBhcnNpbmcgcnVsZXNcbiAgICB9O1xufVxudmFyIFVSSV9QUk9UT0NPTCA9IGJ1aWxkRXhwcyhmYWxzZSk7XG5cbnZhciBJUklfUFJPVE9DT0wgPSBidWlsZEV4cHModHJ1ZSk7XG5cbnZhciBzbGljZWRUb0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkge1xuICAgIHZhciBfYXJyID0gW107XG4gICAgdmFyIF9uID0gdHJ1ZTtcbiAgICB2YXIgX2QgPSBmYWxzZTtcbiAgICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9kID0gdHJ1ZTtcbiAgICAgIF9lID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2FycjtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkge1xuICAgICAgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG4gICAgfVxuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgdG9Db25zdW1hYmxlQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gICAgcmV0dXJuIGFycjI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYXJyKTtcbiAgfVxufTtcblxuLyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXG52YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG4vKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG52YXIgYmFzZSA9IDM2O1xudmFyIHRNaW4gPSAxO1xudmFyIHRNYXggPSAyNjtcbnZhciBza2V3ID0gMzg7XG52YXIgZGFtcCA9IDcwMDtcbnZhciBpbml0aWFsQmlhcyA9IDcyO1xudmFyIGluaXRpYWxOID0gMTI4OyAvLyAweDgwXG52YXIgZGVsaW1pdGVyID0gJy0nOyAvLyAnXFx4MkQnXG5cbi8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG52YXIgcmVnZXhQdW55Y29kZSA9IC9eeG4tLS87XG52YXIgcmVnZXhOb25BU0NJSSA9IC9bXlxcMC1cXHg3RV0vOyAvLyBub24tQVNDSUkgY2hhcnNcbnZhciByZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cbi8qKiBFcnJvciBtZXNzYWdlcyAqL1xudmFyIGVycm9ycyA9IHtcblx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcbn07XG5cbi8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cbnZhciBiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW47XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBlcnJvciQxKHR5cGUpIHtcblx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcbn1cblxuLyoqXG4gKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG4gKiBpdGVtLlxuICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuICogYWRkcmVzc2VzLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcbiAqIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0dmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XG5cdHZhciByZXN1bHQgPSAnJztcblx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHQvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG5cdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRyZXN1bHQgPSBwYXJ0c1swXSArICdAJztcblx0XHRzdHJpbmcgPSBwYXJ0c1sxXTtcblx0fVxuXHQvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG5cdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG5cdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0dmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcbiAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGRlY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0dmFyIG91dHB1dCA9IFtdO1xuXHR2YXIgY291bnRlciA9IDA7XG5cdHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdHZhciB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gSXQncyBhIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3Rlci5cblx0XHRcdHZhciBleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHtcblx0XHRcdFx0Ly8gTG93IHN1cnJvZ2F0ZS5cblx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEl0J3MgYW4gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlXG5cdFx0XHRcdC8vIG5leHQgY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLlxuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdHJpbmcgYmFzZWQgb24gYW4gYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cbiAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGVuY29kZVxuICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cbiAqL1xudmFyIHVjczJlbmNvZGUgPSBmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIHRvQ29uc3VtYWJsZUFycmF5KGFycmF5KSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cbiAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG4gKi9cbnZhciBiYXNpY1RvRGlnaXQgPSBmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XG5cdGlmIChjb2RlUG9pbnQgLSAweDMwIDwgMHgwQSkge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDE2O1xuXHR9XG5cdGlmIChjb2RlUG9pbnQgLSAweDQxIDwgMHgxQSkge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDQxO1xuXHR9XG5cdGlmIChjb2RlUG9pbnQgLSAweDYxIDwgMHgxQSkge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDYxO1xuXHR9XG5cdHJldHVybiBiYXNlO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3JcbiAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG4gKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcbiAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG4gKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuICovXG52YXIgZGlnaXRUb0Jhc2ljID0gZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xufTtcblxuLyoqXG4gKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBhZGFwdCA9IGZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHR2YXIgayA9IDA7XG5cdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG5cdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0Zm9yICg7IC8qIG5vIGluaXRpYWxpemF0aW9uICovZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XG5cdH1cblx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXG4gKiBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKi9cbnZhciBkZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcblx0Ly8gRG9uJ3QgdXNlIFVDUy0yLlxuXHR2YXIgb3V0cHV0ID0gW107XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGkgPSAwO1xuXHR2YXIgbiA9IGluaXRpYWxOO1xuXHR2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuXHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHR2YXIgYmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0YmFzaWMgPSAwO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBiYXNpYzsgKytqKSB7XG5cdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0ZXJyb3IkMSgnbm90LWJhc2ljJyk7XG5cdFx0fVxuXHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHR9XG5cblx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxuXHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdGZvciAodmFyIGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDspIC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi97XG5cblx0XHQvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG5cdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0Ly8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcblx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdHZhciBvbGRpID0gaTtcblx0XHRmb3IgKHZhciB3ID0gMSwgayA9IGJhc2U7OyAvKiBubyBjb25kaXRpb24gKi9rICs9IGJhc2UpIHtcblxuXHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdGVycm9yJDEoJ2ludmFsaWQtaW5wdXQnKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdGVycm9yJDEoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGkgKz0gZGlnaXQgKiB3O1xuXHRcdFx0dmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcztcblxuXHRcdFx0aWYgKGRpZ2l0IDwgdCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dmFyIGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcblx0XHRcdFx0ZXJyb3IkMSgnb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXHRcdH1cblxuXHRcdHZhciBvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRlcnJvciQxKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdG4gKz0gZmxvb3IoaSAvIG91dCk7XG5cdFx0aSAlPSBvdXQ7XG5cblx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0LlxuXHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblx0fVxuXG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIG91dHB1dCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG4gKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcblx0dmFyIG91dHB1dCA9IFtdO1xuXG5cdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG5cdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0Ly8gQ2FjaGUgdGhlIGxlbmd0aC5cblx0dmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuXHR2YXIgbiA9IGluaXRpYWxOO1xuXHR2YXIgZGVsdGEgPSAwO1xuXHR2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG5cdHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcblx0dmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG5cdHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuXHR0cnkge1xuXHRcdGZvciAodmFyIF9pdGVyYXRvciA9IGlucHV0W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuXHRcdFx0dmFyIF9jdXJyZW50VmFsdWUyID0gX3N0ZXAudmFsdWU7XG5cblx0XHRcdGlmIChfY3VycmVudFZhbHVlMiA8IDB4ODApIHtcblx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKF9jdXJyZW50VmFsdWUyKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG5cdFx0X2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG5cdH0gZmluYWxseSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG5cdFx0XHRcdF9pdGVyYXRvci5yZXR1cm4oKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG5cdFx0XHRcdHRocm93IF9pdGVyYXRvckVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHZhciBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cdHZhciBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoO1xuXG5cdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0Ly8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS5cblx0aWYgKGJhc2ljTGVuZ3RoKSB7XG5cdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0fVxuXG5cdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcblx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHQvLyBsYXJnZXIgb25lOlxuXHRcdHZhciBtID0gbWF4SW50O1xuXHRcdHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG5cdFx0dmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuXHRcdHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cblx0XHR0cnkge1xuXHRcdFx0Zm9yICh2YXIgX2l0ZXJhdG9yMiA9IGlucHV0W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG5cdFx0XHRcdHZhciBjdXJyZW50VmFsdWUgPSBfc3RlcDIudmFsdWU7XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0X2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcblx0XHRcdF9pdGVyYXRvckVycm9yMiA9IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiAmJiBfaXRlcmF0b3IyLnJldHVybikge1xuXHRcdFx0XHRcdF9pdGVyYXRvcjIucmV0dXJuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcblx0XHRcdFx0XHR0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgaGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuXHRcdGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG5cdFx0XHRlcnJvciQxKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG5cdFx0biA9IG07XG5cblx0XHR2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlO1xuXHRcdHZhciBfZGlkSXRlcmF0b3JFcnJvcjMgPSBmYWxzZTtcblx0XHR2YXIgX2l0ZXJhdG9yRXJyb3IzID0gdW5kZWZpbmVkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGZvciAodmFyIF9pdGVyYXRvcjMgPSBpbnB1dFtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IChfc3RlcDMgPSBfaXRlcmF0b3IzLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gdHJ1ZSkge1xuXHRcdFx0XHR2YXIgX2N1cnJlbnRWYWx1ZSA9IF9zdGVwMy52YWx1ZTtcblxuXHRcdFx0XHRpZiAoX2N1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuXHRcdFx0XHRcdGVycm9yJDEoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKF9jdXJyZW50VmFsdWUgPT0gbikge1xuXHRcdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuXHRcdFx0XHRcdHZhciBxID0gZGVsdGE7XG5cdFx0XHRcdFx0Zm9yICh2YXIgayA9IGJhc2U7OyAvKiBubyBjb25kaXRpb24gKi9rICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHZhciB0ID0gayA8PSBiaWFzID8gdE1pbiA6IGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXM7XG5cdFx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR2YXIgcU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0dmFyIGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSkpO1xuXHRcdFx0XHRcdFx0cSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG5cdFx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0XHRkZWx0YSA9IDA7XG5cdFx0XHRcdFx0KytoYW5kbGVkQ1BDb3VudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0X2RpZEl0ZXJhdG9yRXJyb3IzID0gdHJ1ZTtcblx0XHRcdF9pdGVyYXRvckVycm9yMyA9IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyAmJiBfaXRlcmF0b3IzLnJldHVybikge1xuXHRcdFx0XHRcdF9pdGVyYXRvcjMucmV0dXJuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChfZGlkSXRlcmF0b3JFcnJvcjMpIHtcblx0XHRcdFx0XHR0aHJvdyBfaXRlcmF0b3JFcnJvcjM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQrK2RlbHRhO1xuXHRcdCsrbjtcblx0fVxuXHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG4gKiB0byBVbmljb2RlLiBPbmx5IHRoZSBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkLCBpLmUuXG4gKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cbiAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG4gKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gUHVueWNvZGVcbiAqIHN0cmluZy5cbiAqL1xudmFyIHRvVW5pY29kZSA9IGZ1bmN0aW9uIHRvVW5pY29kZShpbnB1dCkge1xuXHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpID8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKSA6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG4gKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cbiAqIEFTQ0lJLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuICogVW5pY29kZSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG4gKiBlbWFpbCBhZGRyZXNzLlxuICovXG52YXIgdG9BU0NJSSA9IGZ1bmN0aW9uIHRvQVNDSUkoaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24gKHN0cmluZykge1xuXHRcdHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKSA/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpIDogc3RyaW5nO1xuXHR9KTtcbn07XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG52YXIgcHVueWNvZGUgPSB7XG5cdC8qKlxuICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cbiAgKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAgKiBAdHlwZSBTdHJpbmdcbiAgKi9cblx0J3ZlcnNpb24nOiAnMi4xLjAnLFxuXHQvKipcbiAgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuICAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG4gICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG4gICogQG1lbWJlck9mIHB1bnljb2RlXG4gICogQHR5cGUgT2JqZWN0XG4gICovXG5cdCd1Y3MyJzoge1xuXHRcdCdkZWNvZGUnOiB1Y3MyZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdH0sXG5cdCdkZWNvZGUnOiBkZWNvZGUsXG5cdCdlbmNvZGUnOiBlbmNvZGUsXG5cdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0J3RvVW5pY29kZSc6IHRvVW5pY29kZVxufTtcblxuLyoqXG4gKiBVUkkuanNcbiAqXG4gKiBAZmlsZW92ZXJ2aWV3IEFuIFJGQyAzOTg2IGNvbXBsaWFudCwgc2NoZW1lIGV4dGVuZGFibGUgVVJJIHBhcnNpbmcvdmFsaWRhdGluZy9yZXNvbHZpbmcgbGlicmFyeSBmb3IgSmF2YVNjcmlwdC5cbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzpnYXJ5LmNvdXJ0QGdtYWlsLmNvbVwiPkdhcnkgQ291cnQ8L2E+XG4gKiBAc2VlIGh0dHA6Ly9naXRodWIuY29tL2dhcnljb3VydC91cmktanNcbiAqL1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMSBHYXJ5IENvdXJ0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZVxuICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2ZcbiAqICAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdFxuICogICAgICAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHNcbiAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEdBUlkgQ09VUlQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEXG4gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR0FSWSBDT1VSVCBPUlxuICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbiAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRlxuICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKlxuICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGVcbiAqIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkXG4gKiBvciBpbXBsaWVkLCBvZiBHYXJ5IENvdXJ0LlxuICovXG52YXIgU0NIRU1FUyA9IHt9O1xuZnVuY3Rpb24gcGN0RW5jQ2hhcihjaHIpIHtcbiAgICB2YXIgYyA9IGNoci5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBlID0gdm9pZCAwO1xuICAgIGlmIChjIDwgMTYpIGUgPSBcIiUwXCIgKyBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO2Vsc2UgaWYgKGMgPCAxMjgpIGUgPSBcIiVcIiArIGMudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7ZWxzZSBpZiAoYyA8IDIwNDgpIGUgPSBcIiVcIiArIChjID4+IDYgfCAxOTIpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCIlXCIgKyAoYyAmIDYzIHwgMTI4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtlbHNlIGUgPSBcIiVcIiArIChjID4+IDEyIHwgMjI0KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKGMgPj4gNiAmIDYzIHwgMTI4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKGMgJiA2MyB8IDEyOCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBwY3REZWNDaGFycyhzdHIpIHtcbiAgICB2YXIgbmV3U3RyID0gXCJcIjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGlsID0gc3RyLmxlbmd0aDtcbiAgICB3aGlsZSAoaSA8IGlsKSB7XG4gICAgICAgIHZhciBjID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpICsgMSwgMiksIDE2KTtcbiAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgIG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgaSArPSAzO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPj0gMTk0ICYmIGMgPCAyMjQpIHtcbiAgICAgICAgICAgIGlmIChpbCAtIGkgPj0gNikge1xuICAgICAgICAgICAgICAgIHZhciBjMiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSArIDQsIDIpLCAxNik7XG4gICAgICAgICAgICAgICAgbmV3U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiAzMSkgPDwgNiB8IGMyICYgNjMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCA2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgKz0gNjtcbiAgICAgICAgfSBlbHNlIGlmIChjID49IDIyNCkge1xuICAgICAgICAgICAgaWYgKGlsIC0gaSA+PSA5KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9jID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpICsgNCwgMiksIDE2KTtcbiAgICAgICAgICAgICAgICB2YXIgYzMgPSBwYXJzZUludChzdHIuc3Vic3RyKGkgKyA3LCAyKSwgMTYpO1xuICAgICAgICAgICAgICAgIG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgMTUpIDw8IDEyIHwgKF9jICYgNjMpIDw8IDYgfCBjMyAmIDYzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U3RyICs9IHN0ci5zdWJzdHIoaSwgOSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpICs9IDk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCAzKTtcbiAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3U3RyO1xufVxuZnVuY3Rpb24gX25vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKGNvbXBvbmVudHMsIHByb3RvY29sKSB7XG4gICAgZnVuY3Rpb24gZGVjb2RlVW5yZXNlcnZlZChzdHIpIHtcbiAgICAgICAgdmFyIGRlY1N0ciA9IHBjdERlY0NoYXJzKHN0cik7XG4gICAgICAgIHJldHVybiAhZGVjU3RyLm1hdGNoKHByb3RvY29sLlVOUkVTRVJWRUQpID8gc3RyIDogZGVjU3RyO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50cy5zY2hlbWUpIGNvbXBvbmVudHMuc2NoZW1lID0gU3RyaW5nKGNvbXBvbmVudHMuc2NoZW1lKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocHJvdG9jb2wuTk9UX1NDSEVNRSwgXCJcIik7XG4gICAgaWYgKGNvbXBvbmVudHMudXNlcmluZm8gIT09IHVuZGVmaW5lZCkgY29tcG9uZW50cy51c2VyaW5mbyA9IFN0cmluZyhjb21wb25lbnRzLnVzZXJpbmZvKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKHByb3RvY29sLk5PVF9VU0VSSU5GTywgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xuICAgIGlmIChjb21wb25lbnRzLmhvc3QgIT09IHVuZGVmaW5lZCkgY29tcG9uZW50cy5ob3N0ID0gU3RyaW5nKGNvbXBvbmVudHMuaG9zdCkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHByb3RvY29sLk5PVF9IT1NULCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XG4gICAgaWYgKGNvbXBvbmVudHMucGF0aCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLnBhdGggPSBTdHJpbmcoY29tcG9uZW50cy5wYXRoKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKGNvbXBvbmVudHMuc2NoZW1lID8gcHJvdG9jb2wuTk9UX1BBVEggOiBwcm90b2NvbC5OT1RfUEFUSF9OT1NDSEVNRSwgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xuICAgIGlmIChjb21wb25lbnRzLnF1ZXJ5ICE9PSB1bmRlZmluZWQpIGNvbXBvbmVudHMucXVlcnkgPSBTdHJpbmcoY29tcG9uZW50cy5xdWVyeSkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShwcm90b2NvbC5OT1RfUVVFUlksIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcbiAgICBpZiAoY29tcG9uZW50cy5mcmFnbWVudCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLmZyYWdtZW50ID0gU3RyaW5nKGNvbXBvbmVudHMuZnJhZ21lbnQpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIGRlY29kZVVucmVzZXJ2ZWQpLnJlcGxhY2UocHJvdG9jb2wuTk9UX0ZSQUdNRU5ULCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG5cbmZ1bmN0aW9uIF9zdHJpcExlYWRpbmdaZXJvcyhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL14wKiguKikvLCBcIiQxXCIpIHx8IFwiMFwiO1xufVxuZnVuY3Rpb24gX25vcm1hbGl6ZUlQdjQoaG9zdCwgcHJvdG9jb2wpIHtcbiAgICB2YXIgbWF0Y2hlcyA9IGhvc3QubWF0Y2gocHJvdG9jb2wuSVBWNEFERFJFU1MpIHx8IFtdO1xuXG4gICAgdmFyIF9tYXRjaGVzID0gc2xpY2VkVG9BcnJheShtYXRjaGVzLCAyKSxcbiAgICAgICAgYWRkcmVzcyA9IF9tYXRjaGVzWzFdO1xuXG4gICAgaWYgKGFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIGFkZHJlc3Muc3BsaXQoXCIuXCIpLm1hcChfc3RyaXBMZWFkaW5nWmVyb3MpLmpvaW4oXCIuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBob3N0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9ub3JtYWxpemVJUHY2KGhvc3QsIHByb3RvY29sKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBob3N0Lm1hdGNoKHByb3RvY29sLklQVjZBRERSRVNTKSB8fCBbXTtcblxuICAgIHZhciBfbWF0Y2hlczIgPSBzbGljZWRUb0FycmF5KG1hdGNoZXMsIDMpLFxuICAgICAgICBhZGRyZXNzID0gX21hdGNoZXMyWzFdLFxuICAgICAgICB6b25lID0gX21hdGNoZXMyWzJdO1xuXG4gICAgaWYgKGFkZHJlc3MpIHtcbiAgICAgICAgdmFyIF9hZGRyZXNzJHRvTG93ZXJDYXNlJCA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKS5zcGxpdCgnOjonKS5yZXZlcnNlKCksXG4gICAgICAgICAgICBfYWRkcmVzcyR0b0xvd2VyQ2FzZSQyID0gc2xpY2VkVG9BcnJheShfYWRkcmVzcyR0b0xvd2VyQ2FzZSQsIDIpLFxuICAgICAgICAgICAgbGFzdCA9IF9hZGRyZXNzJHRvTG93ZXJDYXNlJDJbMF0sXG4gICAgICAgICAgICBmaXJzdCA9IF9hZGRyZXNzJHRvTG93ZXJDYXNlJDJbMV07XG5cbiAgICAgICAgdmFyIGZpcnN0RmllbGRzID0gZmlyc3QgPyBmaXJzdC5zcGxpdChcIjpcIikubWFwKF9zdHJpcExlYWRpbmdaZXJvcykgOiBbXTtcbiAgICAgICAgdmFyIGxhc3RGaWVsZHMgPSBsYXN0LnNwbGl0KFwiOlwiKS5tYXAoX3N0cmlwTGVhZGluZ1plcm9zKTtcbiAgICAgICAgdmFyIGlzTGFzdEZpZWxkSVB2NEFkZHJlc3MgPSBwcm90b2NvbC5JUFY0QUREUkVTUy50ZXN0KGxhc3RGaWVsZHNbbGFzdEZpZWxkcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIHZhciBmaWVsZENvdW50ID0gaXNMYXN0RmllbGRJUHY0QWRkcmVzcyA/IDcgOiA4O1xuICAgICAgICB2YXIgbGFzdEZpZWxkc1N0YXJ0ID0gbGFzdEZpZWxkcy5sZW5ndGggLSBmaWVsZENvdW50O1xuICAgICAgICB2YXIgZmllbGRzID0gQXJyYXkoZmllbGRDb3VudCk7XG4gICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgZmllbGRDb3VudDsgKyt4KSB7XG4gICAgICAgICAgICBmaWVsZHNbeF0gPSBmaXJzdEZpZWxkc1t4XSB8fCBsYXN0RmllbGRzW2xhc3RGaWVsZHNTdGFydCArIHhdIHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xhc3RGaWVsZElQdjRBZGRyZXNzKSB7XG4gICAgICAgICAgICBmaWVsZHNbZmllbGRDb3VudCAtIDFdID0gX25vcm1hbGl6ZUlQdjQoZmllbGRzW2ZpZWxkQ291bnQgLSAxXSwgcHJvdG9jb2wpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhbGxaZXJvRmllbGRzID0gZmllbGRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWVsZCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghZmllbGQgfHwgZmllbGQgPT09IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RMb25nZXN0ID0gYWNjW2FjYy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdExvbmdlc3QgJiYgbGFzdExvbmdlc3QuaW5kZXggKyBsYXN0TG9uZ2VzdC5sZW5ndGggPT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMb25nZXN0Lmxlbmd0aCsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFjYy5wdXNoKHsgaW5kZXg6IGluZGV4LCBsZW5ndGg6IDEgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuICAgICAgICB2YXIgbG9uZ2VzdFplcm9GaWVsZHMgPSBhbGxaZXJvRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9KVswXTtcbiAgICAgICAgdmFyIG5ld0hvc3QgPSB2b2lkIDA7XG4gICAgICAgIGlmIChsb25nZXN0WmVyb0ZpZWxkcyAmJiBsb25nZXN0WmVyb0ZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgbmV3Rmlyc3QgPSBmaWVsZHMuc2xpY2UoMCwgbG9uZ2VzdFplcm9GaWVsZHMuaW5kZXgpO1xuICAgICAgICAgICAgdmFyIG5ld0xhc3QgPSBmaWVsZHMuc2xpY2UobG9uZ2VzdFplcm9GaWVsZHMuaW5kZXggKyBsb25nZXN0WmVyb0ZpZWxkcy5sZW5ndGgpO1xuICAgICAgICAgICAgbmV3SG9zdCA9IG5ld0ZpcnN0LmpvaW4oXCI6XCIpICsgXCI6OlwiICsgbmV3TGFzdC5qb2luKFwiOlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0hvc3QgPSBmaWVsZHMuam9pbihcIjpcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHpvbmUpIHtcbiAgICAgICAgICAgIG5ld0hvc3QgKz0gXCIlXCIgKyB6b25lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdIb3N0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBob3N0O1xuICAgIH1cbn1cbnZhciBVUklfUEFSU0UgPSAvXig/OihbXjpcXC8/I10rKTopPyg/OlxcL1xcLygoPzooW15cXC8/I0BdKilAKT8oXFxbW15cXC8/I1xcXV0rXFxdfFteXFwvPyM6XSopKD86XFw6KFxcZCopKT8pKT8oW14/I10qKSg/OlxcPyhbXiNdKikpPyg/OiMoKD86LnxcXG58XFxyKSopKT8vaTtcbnZhciBOT19NQVRDSF9JU19VTkRFRklORUQgPSBcIlwiLm1hdGNoKC8oKXswfS8pWzFdID09PSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBwYXJzZSh1cmlTdHJpbmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgY29tcG9uZW50cyA9IHt9O1xuICAgIHZhciBwcm90b2NvbCA9IG9wdGlvbnMuaXJpICE9PSBmYWxzZSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTDtcbiAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2UgPT09IFwic3VmZml4XCIpIHVyaVN0cmluZyA9IChvcHRpb25zLnNjaGVtZSA/IG9wdGlvbnMuc2NoZW1lICsgXCI6XCIgOiBcIlwiKSArIFwiLy9cIiArIHVyaVN0cmluZztcbiAgICB2YXIgbWF0Y2hlcyA9IHVyaVN0cmluZy5tYXRjaChVUklfUEFSU0UpO1xuICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIGlmIChOT19NQVRDSF9JU19VTkRFRklORUQpIHtcbiAgICAgICAgICAgIC8vc3RvcmUgZWFjaCBjb21wb25lbnRcbiAgICAgICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gbWF0Y2hlc1sxXTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMudXNlcmluZm8gPSBtYXRjaGVzWzNdO1xuICAgICAgICAgICAgY29tcG9uZW50cy5ob3N0ID0gbWF0Y2hlc1s0XTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IG1hdGNoZXNbNl0gfHwgXCJcIjtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucXVlcnkgPSBtYXRjaGVzWzddO1xuICAgICAgICAgICAgY29tcG9uZW50cy5mcmFnbWVudCA9IG1hdGNoZXNbOF07XG4gICAgICAgICAgICAvL2ZpeCBwb3J0IG51bWJlclxuICAgICAgICAgICAgaWYgKGlzTmFOKGNvbXBvbmVudHMucG9ydCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnBvcnQgPSBtYXRjaGVzWzVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9JRSBGSVggZm9yIGltcHJvcGVyIFJlZ0V4cCBtYXRjaGluZ1xuICAgICAgICAgICAgLy9zdG9yZSBlYWNoIGNvbXBvbmVudFxuICAgICAgICAgICAgY29tcG9uZW50cy5zY2hlbWUgPSBtYXRjaGVzWzFdIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMudXNlcmluZm8gPSB1cmlTdHJpbmcuaW5kZXhPZihcIkBcIikgIT09IC0xID8gbWF0Y2hlc1szXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaG9zdCA9IHVyaVN0cmluZy5pbmRleE9mKFwiLy9cIikgIT09IC0xID8gbWF0Y2hlc1s0XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IG1hdGNoZXNbNl0gfHwgXCJcIjtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucXVlcnkgPSB1cmlTdHJpbmcuaW5kZXhPZihcIj9cIikgIT09IC0xID8gbWF0Y2hlc1s3XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZnJhZ21lbnQgPSB1cmlTdHJpbmcuaW5kZXhPZihcIiNcIikgIT09IC0xID8gbWF0Y2hlc1s4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vZml4IHBvcnQgbnVtYmVyXG4gICAgICAgICAgICBpZiAoaXNOYU4oY29tcG9uZW50cy5wb3J0KSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHVyaVN0cmluZy5tYXRjaCgvXFwvXFwvKD86LnxcXG4pKlxcOig/OlxcL3xcXD98XFwjfCQpLykgPyBtYXRjaGVzWzRdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb25lbnRzLmhvc3QpIHtcbiAgICAgICAgICAgIC8vbm9ybWFsaXplIElQIGhvc3RzXG4gICAgICAgICAgICBjb21wb25lbnRzLmhvc3QgPSBfbm9ybWFsaXplSVB2Nihfbm9ybWFsaXplSVB2NChjb21wb25lbnRzLmhvc3QsIHByb3RvY29sKSwgcHJvdG9jb2wpO1xuICAgICAgICB9XG4gICAgICAgIC8vZGV0ZXJtaW5lIHJlZmVyZW5jZSB0eXBlXG4gICAgICAgIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkICYmIGNvbXBvbmVudHMudXNlcmluZm8gPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLmhvc3QgPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLnBvcnQgPT09IHVuZGVmaW5lZCAmJiAhY29tcG9uZW50cy5wYXRoICYmIGNvbXBvbmVudHMucXVlcnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5yZWZlcmVuY2UgPSBcInNhbWUtZG9jdW1lbnRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLnJlZmVyZW5jZSA9IFwicmVsYXRpdmVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRzLmZyYWdtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucmVmZXJlbmNlID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50cy5yZWZlcmVuY2UgPSBcInVyaVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vY2hlY2sgZm9yIHJlZmVyZW5jZSBlcnJvcnNcbiAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBjb21wb25lbnRzLnJlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVUkkgaXMgbm90IGEgXCIgKyBvcHRpb25zLnJlZmVyZW5jZSArIFwiIHJlZmVyZW5jZS5cIjtcbiAgICAgICAgfVxuICAgICAgICAvL2ZpbmQgc2NoZW1lIGhhbmRsZXJcbiAgICAgICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTWyhvcHRpb25zLnNjaGVtZSB8fCBjb21wb25lbnRzLnNjaGVtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgLy9jaGVjayBpZiBzY2hlbWUgY2FuJ3QgaGFuZGxlIElSSXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnVuaWNvZGVTdXBwb3J0ICYmICghc2NoZW1lSGFuZGxlciB8fCAhc2NoZW1lSGFuZGxlci51bmljb2RlU3VwcG9ydCkpIHtcbiAgICAgICAgICAgIC8vaWYgaG9zdCBjb21wb25lbnQgaXMgYSBkb21haW4gbmFtZVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuaG9zdCAmJiAob3B0aW9ucy5kb21haW5Ib3N0IHx8IHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5kb21haW5Ib3N0KSkge1xuICAgICAgICAgICAgICAgIC8vY29udmVydCBVbmljb2RlIElETiAtPiBBU0NJSSBJRE5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmhvc3QgPSBwdW55Y29kZS50b0FTQ0lJKGNvbXBvbmVudHMuaG9zdC5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBwY3REZWNDaGFycykudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnZlcnQgSVJJIC0+IFVSSVxuICAgICAgICAgICAgX25vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKGNvbXBvbmVudHMsIFVSSV9QUk9UT0NPTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL25vcm1hbGl6ZSBlbmNvZGluZ3NcbiAgICAgICAgICAgIF9ub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyhjb21wb25lbnRzLCBwcm90b2NvbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9wZXJmb3JtIHNjaGVtZSBzcGVjaWZpYyBwYXJzaW5nXG4gICAgICAgIGlmIChzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIucGFyc2UpIHtcbiAgICAgICAgICAgIHNjaGVtZUhhbmRsZXIucGFyc2UoY29tcG9uZW50cywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIlVSSSBjYW4gbm90IGJlIHBhcnNlZC5cIjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG5cbmZ1bmN0aW9uIF9yZWNvbXBvc2VBdXRob3JpdHkoY29tcG9uZW50cywgb3B0aW9ucykge1xuICAgIHZhciBwcm90b2NvbCA9IG9wdGlvbnMuaXJpICE9PSBmYWxzZSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTDtcbiAgICB2YXIgdXJpVG9rZW5zID0gW107XG4gICAgaWYgKGNvbXBvbmVudHMudXNlcmluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLnVzZXJpbmZvKTtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goXCJAXCIpO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50cy5ob3N0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9ub3JtYWxpemUgSVAgaG9zdHMsIGFkZCBicmFja2V0cyBhbmQgZXNjYXBlIHpvbmUgc2VwYXJhdG9yIGZvciBJUHY2XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKF9ub3JtYWxpemVJUHY2KF9ub3JtYWxpemVJUHY0KFN0cmluZyhjb21wb25lbnRzLmhvc3QpLCBwcm90b2NvbCksIHByb3RvY29sKS5yZXBsYWNlKHByb3RvY29sLklQVjZBRERSRVNTLCBmdW5jdGlvbiAoXywgJDEsICQyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJbXCIgKyAkMSArICgkMiA/IFwiJTI1XCIgKyAkMiA6IFwiXCIpICsgXCJdXCI7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnRzLnBvcnQgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNvbXBvbmVudHMucG9ydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB1cmlUb2tlbnMucHVzaChcIjpcIik7XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKFN0cmluZyhjb21wb25lbnRzLnBvcnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVyaVRva2Vucy5sZW5ndGggPyB1cmlUb2tlbnMuam9pbihcIlwiKSA6IHVuZGVmaW5lZDtcbn1cblxudmFyIFJEUzEgPSAvXlxcLlxcLj9cXC8vO1xudmFyIFJEUzIgPSAvXlxcL1xcLihcXC98JCkvO1xudmFyIFJEUzMgPSAvXlxcL1xcLlxcLihcXC98JCkvO1xudmFyIFJEUzUgPSAvXlxcLz8oPzoufFxcbikqPyg/PVxcL3wkKS87XG5mdW5jdGlvbiByZW1vdmVEb3RTZWdtZW50cyhpbnB1dCkge1xuICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICB3aGlsZSAoaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChpbnB1dC5tYXRjaChSRFMxKSkge1xuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFJEUzEsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzIpKSB7XG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMiwgXCIvXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzMpKSB7XG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMywgXCIvXCIpO1xuICAgICAgICAgICAgb3V0cHV0LnBvcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcIi5cIiB8fCBpbnB1dCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW0gPSBpbnB1dC5tYXRjaChSRFM1KTtcbiAgICAgICAgICAgIGlmIChpbSkge1xuICAgICAgICAgICAgICAgIHZhciBzID0gaW1bMF07XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zbGljZShzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gocyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZG90IHNlZ21lbnQgY29uZGl0aW9uXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplKGNvbXBvbmVudHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgcHJvdG9jb2wgPSBvcHRpb25zLmlyaSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTDtcbiAgICB2YXIgdXJpVG9rZW5zID0gW107XG4gICAgLy9maW5kIHNjaGVtZSBoYW5kbGVyXG4gICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTWyhvcHRpb25zLnNjaGVtZSB8fCBjb21wb25lbnRzLnNjaGVtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpXTtcbiAgICAvL3BlcmZvcm0gc2NoZW1lIHNwZWNpZmljIHNlcmlhbGl6YXRpb25cbiAgICBpZiAoc2NoZW1lSGFuZGxlciAmJiBzY2hlbWVIYW5kbGVyLnNlcmlhbGl6ZSkgc2NoZW1lSGFuZGxlci5zZXJpYWxpemUoY29tcG9uZW50cywgb3B0aW9ucyk7XG4gICAgaWYgKGNvbXBvbmVudHMuaG9zdCkge1xuICAgICAgICAvL2lmIGhvc3QgY29tcG9uZW50IGlzIGFuIElQdjYgYWRkcmVzc1xuICAgICAgICBpZiAocHJvdG9jb2wuSVBWNkFERFJFU1MudGVzdChjb21wb25lbnRzLmhvc3QpKSB7fVxuICAgICAgICAvL1RPRE86IG5vcm1hbGl6ZSBJUHY2IGFkZHJlc3MgYXMgcGVyIFJGQyA1OTUyXG5cbiAgICAgICAgLy9pZiBob3N0IGNvbXBvbmVudCBpcyBhIGRvbWFpbiBuYW1lXG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZG9tYWluSG9zdCB8fCBzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIuZG9tYWluSG9zdCkge1xuICAgICAgICAgICAgICAgIC8vY29udmVydCBJRE4gdmlhIHB1bnljb2RlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5ob3N0ID0gIW9wdGlvbnMuaXJpID8gcHVueWNvZGUudG9BU0NJSShjb21wb25lbnRzLmhvc3QucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgcGN0RGVjQ2hhcnMpLnRvTG93ZXJDYXNlKCkpIDogcHVueWNvZGUudG9Vbmljb2RlKGNvbXBvbmVudHMuaG9zdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArICghb3B0aW9ucy5pcmkgPyBcIkFTQ0lJXCIgOiBcIlVuaWNvZGVcIikgKyBcIiB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8vbm9ybWFsaXplIGVuY29kaW5nXG4gICAgX25vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKGNvbXBvbmVudHMsIHByb3RvY29sKTtcbiAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2UgIT09IFwic3VmZml4XCIgJiYgY29tcG9uZW50cy5zY2hlbWUpIHtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5zY2hlbWUpO1xuICAgICAgICB1cmlUb2tlbnMucHVzaChcIjpcIik7XG4gICAgfVxuICAgIHZhciBhdXRob3JpdHkgPSBfcmVjb21wb3NlQXV0aG9yaXR5KGNvbXBvbmVudHMsIG9wdGlvbnMpO1xuICAgIGlmIChhdXRob3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2UgIT09IFwic3VmZml4XCIpIHtcbiAgICAgICAgICAgIHVyaVRva2Vucy5wdXNoKFwiLy9cIik7XG4gICAgICAgIH1cbiAgICAgICAgdXJpVG9rZW5zLnB1c2goYXV0aG9yaXR5KTtcbiAgICAgICAgaWYgKGNvbXBvbmVudHMucGF0aCAmJiBjb21wb25lbnRzLnBhdGguY2hhckF0KDApICE9PSBcIi9cIikge1xuICAgICAgICAgICAgdXJpVG9rZW5zLnB1c2goXCIvXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRzLnBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcyA9IGNvbXBvbmVudHMucGF0aDtcbiAgICAgICAgaWYgKCFvcHRpb25zLmFic29sdXRlUGF0aCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIuYWJzb2x1dGVQYXRoKSkge1xuICAgICAgICAgICAgcyA9IHJlbW92ZURvdFNlZ21lbnRzKHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXlxcL1xcLy8sIFwiLyUyRlwiKTsgLy9kb24ndCBhbGxvdyB0aGUgcGF0aCB0byBzdGFydCB3aXRoIFwiLy9cIlxuICAgICAgICB9XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKHMpO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50cy5xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKFwiP1wiKTtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5xdWVyeSk7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRzLmZyYWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goXCIjXCIpO1xuICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLmZyYWdtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHVyaVRva2Vucy5qb2luKFwiXCIpOyAvL21lcmdlIHRva2VucyBpbnRvIGEgc3RyaW5nXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnRzKGJhc2UsIHJlbGF0aXZlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHZhciBza2lwTm9ybWFsaXphdGlvbiA9IGFyZ3VtZW50c1szXTtcblxuICAgIHZhciB0YXJnZXQgPSB7fTtcbiAgICBpZiAoIXNraXBOb3JtYWxpemF0aW9uKSB7XG4gICAgICAgIGJhc2UgPSBwYXJzZShzZXJpYWxpemUoYmFzZSwgb3B0aW9ucyksIG9wdGlvbnMpOyAvL25vcm1hbGl6ZSBiYXNlIGNvbXBvbmVudHNcbiAgICAgICAgcmVsYXRpdmUgPSBwYXJzZShzZXJpYWxpemUocmVsYXRpdmUsIG9wdGlvbnMpLCBvcHRpb25zKTsgLy9ub3JtYWxpemUgcmVsYXRpdmUgY29tcG9uZW50c1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMudG9sZXJhbnQgJiYgcmVsYXRpdmUuc2NoZW1lKSB7XG4gICAgICAgIHRhcmdldC5zY2hlbWUgPSByZWxhdGl2ZS5zY2hlbWU7XG4gICAgICAgIC8vdGFyZ2V0LmF1dGhvcml0eSA9IHJlbGF0aXZlLmF1dGhvcml0eTtcbiAgICAgICAgdGFyZ2V0LnVzZXJpbmZvID0gcmVsYXRpdmUudXNlcmluZm87XG4gICAgICAgIHRhcmdldC5ob3N0ID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgdGFyZ2V0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgICAgICB0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHJlbGF0aXZlLnBhdGggfHwgXCJcIik7XG4gICAgICAgIHRhcmdldC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZWxhdGl2ZS51c2VyaW5mbyAhPT0gdW5kZWZpbmVkIHx8IHJlbGF0aXZlLmhvc3QgIT09IHVuZGVmaW5lZCB8fCByZWxhdGl2ZS5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vdGFyZ2V0LmF1dGhvcml0eSA9IHJlbGF0aXZlLmF1dGhvcml0eTtcbiAgICAgICAgICAgIHRhcmdldC51c2VyaW5mbyA9IHJlbGF0aXZlLnVzZXJpbmZvO1xuICAgICAgICAgICAgdGFyZ2V0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0O1xuICAgICAgICAgICAgdGFyZ2V0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgICAgICAgICAgdGFyZ2V0LnBhdGggPSByZW1vdmVEb3RTZWdtZW50cyhyZWxhdGl2ZS5wYXRoIHx8IFwiXCIpO1xuICAgICAgICAgICAgdGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXJlbGF0aXZlLnBhdGgpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IGJhc2UucGF0aDtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmUucXVlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlLnBhdGguY2hhckF0KDApID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHJlbGF0aXZlLnBhdGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYmFzZS51c2VyaW5mbyAhPT0gdW5kZWZpbmVkIHx8IGJhc2UuaG9zdCAhPT0gdW5kZWZpbmVkIHx8IGJhc2UucG9ydCAhPT0gdW5kZWZpbmVkKSAmJiAhYmFzZS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IFwiL1wiICsgcmVsYXRpdmUucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmFzZS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IHJlbGF0aXZlLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IGJhc2UucGF0aC5zbGljZSgwLCBiYXNlLnBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgKyByZWxhdGl2ZS5wYXRoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHModGFyZ2V0LnBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vdGFyZ2V0LmF1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5O1xuICAgICAgICAgICAgdGFyZ2V0LnVzZXJpbmZvID0gYmFzZS51c2VyaW5mbztcbiAgICAgICAgICAgIHRhcmdldC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdGFyZ2V0LnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LnNjaGVtZSA9IGJhc2Uuc2NoZW1lO1xuICAgIH1cbiAgICB0YXJnZXQuZnJhZ21lbnQgPSByZWxhdGl2ZS5mcmFnbWVudDtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlKGJhc2VVUkksIHJlbGF0aXZlVVJJLCBvcHRpb25zKSB7XG4gICAgdmFyIHNjaGVtZWxlc3NPcHRpb25zID0gYXNzaWduKHsgc2NoZW1lOiAnbnVsbCcgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZShyZXNvbHZlQ29tcG9uZW50cyhwYXJzZShiYXNlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHBhcnNlKHJlbGF0aXZlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHNjaGVtZWxlc3NPcHRpb25zLCB0cnVlKSwgc2NoZW1lbGVzc09wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUodXJpLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdXJpID0gc2VyaWFsaXplKHBhcnNlKHVyaSwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHlwZU9mKHVyaSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdXJpID0gcGFyc2Uoc2VyaWFsaXplKHVyaSwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdXJpO1xufVxuXG5mdW5jdGlvbiBlcXVhbCh1cmlBLCB1cmlCLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1cmlBID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHVyaUEgPSBzZXJpYWxpemUocGFyc2UodXJpQSwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHlwZU9mKHVyaUEpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHVyaUEgPSBzZXJpYWxpemUodXJpQSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdXJpQiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB1cmlCID0gc2VyaWFsaXplKHBhcnNlKHVyaUIsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVPZih1cmlCKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB1cmlCID0gc2VyaWFsaXplKHVyaUIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdXJpQSA9PT0gdXJpQjtcbn1cblxuZnVuY3Rpb24gZXNjYXBlQ29tcG9uZW50KHN0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBzdHIgJiYgc3RyLnRvU3RyaW5nKCkucmVwbGFjZSghb3B0aW9ucyB8fCAhb3B0aW9ucy5pcmkgPyBVUklfUFJPVE9DT0wuRVNDQVBFIDogSVJJX1BST1RPQ09MLkVTQ0FQRSwgcGN0RW5jQ2hhcik7XG59XG5cbmZ1bmN0aW9uIHVuZXNjYXBlQ29tcG9uZW50KHN0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBzdHIgJiYgc3RyLnRvU3RyaW5nKCkucmVwbGFjZSghb3B0aW9ucyB8fCAhb3B0aW9ucy5pcmkgPyBVUklfUFJPVE9DT0wuUENUX0VOQ09ERUQgOiBJUklfUFJPVE9DT0wuUENUX0VOQ09ERUQsIHBjdERlY0NoYXJzKTtcbn1cblxudmFyIGhhbmRsZXIgPSB7XG4gICAgc2NoZW1lOiBcImh0dHBcIixcbiAgICBkb21haW5Ib3N0OiB0cnVlLFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnRzLCBvcHRpb25zKSB7XG4gICAgICAgIC8vcmVwb3J0IG1pc3NpbmcgaG9zdFxuICAgICAgICBpZiAoIWNvbXBvbmVudHMuaG9zdCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJIVFRQIFVSSXMgbXVzdCBoYXZlIGEgaG9zdC5cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24gc2VyaWFsaXplKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHNlY3VyZSA9IFN0cmluZyhjb21wb25lbnRzLnNjaGVtZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJodHRwc1wiO1xuICAgICAgICAvL25vcm1hbGl6ZSB0aGUgZGVmYXVsdCBwb3J0XG4gICAgICAgIGlmIChjb21wb25lbnRzLnBvcnQgPT09IChzZWN1cmUgPyA0NDMgOiA4MCkgfHwgY29tcG9uZW50cy5wb3J0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLnBvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub3JtYWxpemUgdGhlIGVtcHR5IHBhdGhcbiAgICAgICAgaWYgKCFjb21wb25lbnRzLnBhdGgpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IFwiL1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vTk9URTogV2UgZG8gbm90IHBhcnNlIHF1ZXJ5IHN0cmluZ3MgZm9yIEhUVFAgVVJJc1xuICAgICAgICAvL2FzIFdXVyBGb3JtIFVybCBFbmNvZGVkIHF1ZXJ5IHN0cmluZ3MgYXJlIHBhcnQgb2YgdGhlIEhUTUw0KyBzcGVjLFxuICAgICAgICAvL2FuZCBub3QgdGhlIEhUVFAgc3BlYy5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufTtcblxudmFyIGhhbmRsZXIkMSA9IHtcbiAgICBzY2hlbWU6IFwiaHR0cHNcIixcbiAgICBkb21haW5Ib3N0OiBoYW5kbGVyLmRvbWFpbkhvc3QsXG4gICAgcGFyc2U6IGhhbmRsZXIucGFyc2UsXG4gICAgc2VyaWFsaXplOiBoYW5kbGVyLnNlcmlhbGl6ZVxufTtcblxuZnVuY3Rpb24gaXNTZWN1cmUod3NDb21wb25lbnRzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3c0NvbXBvbmVudHMuc2VjdXJlID09PSAnYm9vbGVhbicgPyB3c0NvbXBvbmVudHMuc2VjdXJlIDogU3RyaW5nKHdzQ29tcG9uZW50cy5zY2hlbWUpLnRvTG93ZXJDYXNlKCkgPT09IFwid3NzXCI7XG59XG4vL1JGQyA2NDU1XG52YXIgaGFuZGxlciQyID0ge1xuICAgIHNjaGVtZTogXCJ3c1wiLFxuICAgIGRvbWFpbkhvc3Q6IHRydWUsXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHdzQ29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gICAgICAgIC8vaW5kaWNhdGUgaWYgdGhlIHNlY3VyZSBmbGFnIGlzIHNldFxuICAgICAgICB3c0NvbXBvbmVudHMuc2VjdXJlID0gaXNTZWN1cmUod3NDb21wb25lbnRzKTtcbiAgICAgICAgLy9jb25zdHJ1Y3QgcmVzb3VjZSBuYW1lXG4gICAgICAgIHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUgPSAod3NDb21wb25lbnRzLnBhdGggfHwgJy8nKSArICh3c0NvbXBvbmVudHMucXVlcnkgPyAnPycgKyB3c0NvbXBvbmVudHMucXVlcnkgOiAnJyk7XG4gICAgICAgIHdzQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB3c0NvbXBvbmVudHMucXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3c0NvbXBvbmVudHM7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGZ1bmN0aW9uIHNlcmlhbGl6ZSh3c0NvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgLy9ub3JtYWxpemUgdGhlIGRlZmF1bHQgcG9ydFxuICAgICAgICBpZiAod3NDb21wb25lbnRzLnBvcnQgPT09IChpc1NlY3VyZSh3c0NvbXBvbmVudHMpID8gNDQzIDogODApIHx8IHdzQ29tcG9uZW50cy5wb3J0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICB3c0NvbXBvbmVudHMucG9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvL2Vuc3VyZSBzY2hlbWUgbWF0Y2hlcyBzZWN1cmUgZmxhZ1xuICAgICAgICBpZiAodHlwZW9mIHdzQ29tcG9uZW50cy5zZWN1cmUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgd3NDb21wb25lbnRzLnNjaGVtZSA9IHdzQ29tcG9uZW50cy5zZWN1cmUgPyAnd3NzJyA6ICd3cyc7XG4gICAgICAgICAgICB3c0NvbXBvbmVudHMuc2VjdXJlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVjb25zdHJ1Y3QgcGF0aCBmcm9tIHJlc291cmNlIG5hbWVcbiAgICAgICAgaWYgKHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUpIHtcbiAgICAgICAgICAgIHZhciBfd3NDb21wb25lbnRzJHJlc291cmMgPSB3c0NvbXBvbmVudHMucmVzb3VyY2VOYW1lLnNwbGl0KCc/JyksXG4gICAgICAgICAgICAgICAgX3dzQ29tcG9uZW50cyRyZXNvdXJjMiA9IHNsaWNlZFRvQXJyYXkoX3dzQ29tcG9uZW50cyRyZXNvdXJjLCAyKSxcbiAgICAgICAgICAgICAgICBwYXRoID0gX3dzQ29tcG9uZW50cyRyZXNvdXJjMlswXSxcbiAgICAgICAgICAgICAgICBxdWVyeSA9IF93c0NvbXBvbmVudHMkcmVzb3VyYzJbMV07XG5cbiAgICAgICAgICAgIHdzQ29tcG9uZW50cy5wYXRoID0gcGF0aCAmJiBwYXRoICE9PSAnLycgPyBwYXRoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgd3NDb21wb25lbnRzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgICB3c0NvbXBvbmVudHMucmVzb3VyY2VOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vZm9yYmlkIGZyYWdtZW50IGNvbXBvbmVudFxuICAgICAgICB3c0NvbXBvbmVudHMuZnJhZ21lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3c0NvbXBvbmVudHM7XG4gICAgfVxufTtcblxudmFyIGhhbmRsZXIkMyA9IHtcbiAgICBzY2hlbWU6IFwid3NzXCIsXG4gICAgZG9tYWluSG9zdDogaGFuZGxlciQyLmRvbWFpbkhvc3QsXG4gICAgcGFyc2U6IGhhbmRsZXIkMi5wYXJzZSxcbiAgICBzZXJpYWxpemU6IGhhbmRsZXIkMi5zZXJpYWxpemVcbn07XG5cbnZhciBPID0ge307XG52YXIgaXNJUkkgPSB0cnVlO1xuLy9SRkMgMzk4NlxudmFyIFVOUkVTRVJWRUQkJCA9IFwiW0EtWmEtejAtOVxcXFwtXFxcXC5cXFxcX1xcXFx+XCIgKyAoaXNJUkkgPyBcIlxcXFx4QTAtXFxcXHUyMDBEXFxcXHUyMDEwLVxcXFx1MjAyOVxcXFx1MjAyRi1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZFRlwiIDogXCJcIikgKyBcIl1cIjtcbnZhciBIRVhESUckJCA9IFwiWzAtOUEtRmEtZl1cIjsgLy9jYXNlLWluc2Vuc2l0aXZlXG52YXIgUENUX0VOQ09ERUQkID0gc3ViZXhwKHN1YmV4cChcIiVbRUZlZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVs4OUEtRmEtZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVwiICsgSEVYRElHJCQgKyBIRVhESUckJCkpOyAvL2V4cGFuZGVkXG4vL1JGQyA1MzIyLCBleGNlcHQgdGhlc2Ugc3ltYm9scyBhcyBwZXIgUkZDIDYwNjg6IEAgOiAvID8gIyBbIF0gJiA7ID1cbi8vY29uc3QgQVRFWFQkJCA9IFwiW0EtWmEtejAtOVxcXFwhXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcJ1xcXFwqXFxcXCtcXFxcLVxcXFwvXFxcXD1cXFxcP1xcXFxeXFxcXF9cXFxcYFxcXFx7XFxcXHxcXFxcfVxcXFx+XVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVRFWFQkJCA9IFwiW1xcXFx4MDEtXFxcXHgwOFxcXFx4MEJcXFxceDBDXFxcXHgwRS1cXFxceDFGXFxcXHg3Rl1cIjsgIC8vKCVkMS04IC8gJWQxMS0xMiAvICVkMTQtMzEgLyAlZDEyNylcbi8vY29uc3QgUVRFWFQkJCA9IG1lcmdlKFwiW1xcXFx4MjFcXFxceDIzLVxcXFx4NUJcXFxceDVELVxcXFx4N0VdXCIsIE9CU19RVEVYVCQkKTsgIC8vJWQzMyAvICVkMzUtOTEgLyAlZDkzLTEyNiAvIG9icy1xdGV4dFxuLy9jb25zdCBWQ0hBUiQkID0gXCJbXFxcXHgyMS1cXFxceDdFXVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVAkID0gc3ViZXhwKFwiXFxcXFxcXFxcIiArIG1lcmdlKFwiW1xcXFx4MDBcXFxceDBEXFxcXHgwQV1cIiwgT0JTX1FURVhUJCQpKTsgIC8vJWQwIC8gQ1IgLyBMRiAvIG9icy1xdGV4dFxuLy9jb25zdCBGV1MkID0gc3ViZXhwKHN1YmV4cChXU1AkJCArIFwiKlwiICsgXCJcXFxceDBEXFxcXHgwQVwiKSArIFwiP1wiICsgV1NQJCQgKyBcIitcIik7XG4vL2NvbnN0IFFVT1RFRF9QQUlSJCA9IHN1YmV4cChzdWJleHAoXCJcXFxcXFxcXFwiICsgc3ViZXhwKFZDSEFSJCQgKyBcInxcIiArIFdTUCQkKSkgKyBcInxcIiArIE9CU19RUCQpO1xuLy9jb25zdCBRVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIHN1YmV4cChGV1MkICsgXCI/XCIgKyBRQ09OVEVOVCQpICsgXCIqXCIgKyBGV1MkICsgXCI/XCIgKyAnXFxcXFwiJyk7XG52YXIgQVRFWFQkJCA9IFwiW0EtWmEtejAtOVxcXFwhXFxcXCRcXFxcJVxcXFwnXFxcXCpcXFxcK1xcXFwtXFxcXF5cXFxcX1xcXFxgXFxcXHtcXFxcfFxcXFx9XFxcXH5dXCI7XG52YXIgUVRFWFQkJCA9IFwiW1xcXFwhXFxcXCRcXFxcJVxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFwtXFxcXC4wLTlcXFxcPFxcXFw+QS1aXFxcXHg1RS1cXFxceDdFXVwiO1xudmFyIFZDSEFSJCQgPSBtZXJnZShRVEVYVCQkLCBcIltcXFxcXFxcIlxcXFxcXFxcXVwiKTtcbnZhciBTT01FX0RFTElNUyQkID0gXCJbXFxcXCFcXFxcJFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFw7XFxcXDpcXFxcQF1cIjtcbnZhciBVTlJFU0VSVkVEID0gbmV3IFJlZ0V4cChVTlJFU0VSVkVEJCQsIFwiZ1wiKTtcbnZhciBQQ1RfRU5DT0RFRCA9IG5ldyBSZWdFeHAoUENUX0VOQ09ERUQkLCBcImdcIik7XG52YXIgTk9UX0xPQ0FMX1BBUlQgPSBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIEFURVhUJCQsIFwiW1xcXFwuXVwiLCAnW1xcXFxcIl0nLCBWQ0hBUiQkKSwgXCJnXCIpO1xudmFyIE5PVF9IRk5BTUUgPSBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIFVOUkVTRVJWRUQkJCwgU09NRV9ERUxJTVMkJCksIFwiZ1wiKTtcbnZhciBOT1RfSEZWQUxVRSA9IE5PVF9IRk5BTUU7XG5mdW5jdGlvbiBkZWNvZGVVbnJlc2VydmVkKHN0cikge1xuICAgIHZhciBkZWNTdHIgPSBwY3REZWNDaGFycyhzdHIpO1xuICAgIHJldHVybiAhZGVjU3RyLm1hdGNoKFVOUkVTRVJWRUQpID8gc3RyIDogZGVjU3RyO1xufVxudmFyIGhhbmRsZXIkNCA9IHtcbiAgICBzY2hlbWU6IFwibWFpbHRvXCIsXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlJCQxKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG1haWx0b0NvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICAgICAgICB2YXIgdG8gPSBtYWlsdG9Db21wb25lbnRzLnRvID0gbWFpbHRvQ29tcG9uZW50cy5wYXRoID8gbWFpbHRvQ29tcG9uZW50cy5wYXRoLnNwbGl0KFwiLFwiKSA6IFtdO1xuICAgICAgICBtYWlsdG9Db21wb25lbnRzLnBhdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChtYWlsdG9Db21wb25lbnRzLnF1ZXJ5KSB7XG4gICAgICAgICAgICB2YXIgdW5rbm93bkhlYWRlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBoZWFkZXJzID0ge307XG4gICAgICAgICAgICB2YXIgaGZpZWxkcyA9IG1haWx0b0NvbXBvbmVudHMucXVlcnkuc3BsaXQoXCImXCIpO1xuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDAsIHhsID0gaGZpZWxkcy5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGhmaWVsZCA9IGhmaWVsZHNbeF0uc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaGZpZWxkWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0b1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvQWRkcnMgPSBoZmllbGRbMV0uc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX3ggPSAwLCBfeGwgPSB0b0FkZHJzLmxlbmd0aDsgX3ggPCBfeGw7ICsrX3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by5wdXNoKHRvQWRkcnNbX3hdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3ViamVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0ID0gdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzFdLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbHRvQ29tcG9uZW50cy5ib2R5ID0gdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzFdLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkhlYWRlcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1t1bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMF0sIG9wdGlvbnMpXSA9IHVuZXNjYXBlQ29tcG9uZW50KGhmaWVsZFsxXSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW5rbm93bkhlYWRlcnMpIG1haWx0b0NvbXBvbmVudHMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgbWFpbHRvQ29tcG9uZW50cy5xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yICh2YXIgX3gyID0gMCwgX3hsMiA9IHRvLmxlbmd0aDsgX3gyIDwgX3hsMjsgKytfeDIpIHtcbiAgICAgICAgICAgIHZhciBhZGRyID0gdG9bX3gyXS5zcGxpdChcIkBcIik7XG4gICAgICAgICAgICBhZGRyWzBdID0gdW5lc2NhcGVDb21wb25lbnQoYWRkclswXSk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudW5pY29kZVN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgVW5pY29kZSBJRE4gLT4gQVNDSUkgSUROXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkclsxXSA9IHB1bnljb2RlLnRvQVNDSUkodW5lc2NhcGVDb21wb25lbnQoYWRkclsxXSwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBtYWlsdG9Db21wb25lbnRzLmVycm9yID0gbWFpbHRvQ29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZHJbMV0gPSB1bmVzY2FwZUNvbXBvbmVudChhZGRyWzFdLCBvcHRpb25zKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9bX3gyXSA9IGFkZHIuam9pbihcIkBcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1haWx0b0NvbXBvbmVudHM7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGZ1bmN0aW9uIHNlcmlhbGl6ZSQkMShtYWlsdG9Db21wb25lbnRzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBjb21wb25lbnRzID0gbWFpbHRvQ29tcG9uZW50cztcbiAgICAgICAgdmFyIHRvID0gdG9BcnJheShtYWlsdG9Db21wb25lbnRzLnRvKTtcbiAgICAgICAgaWYgKHRvKSB7XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMCwgeGwgPSB0by5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQWRkciA9IFN0cmluZyh0b1t4XSk7XG4gICAgICAgICAgICAgICAgdmFyIGF0SWR4ID0gdG9BZGRyLmxhc3RJbmRleE9mKFwiQFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxQYXJ0ID0gdG9BZGRyLnNsaWNlKDAsIGF0SWR4KS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfTE9DQUxfUEFSVCwgcGN0RW5jQ2hhcik7XG4gICAgICAgICAgICAgICAgdmFyIGRvbWFpbiA9IHRvQWRkci5zbGljZShhdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIC8vY29udmVydCBJRE4gdmlhIHB1bnljb2RlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gIW9wdGlvbnMuaXJpID8gcHVueWNvZGUudG9BU0NJSSh1bmVzY2FwZUNvbXBvbmVudChkb21haW4sIG9wdGlvbnMpLnRvTG93ZXJDYXNlKCkpIDogcHVueWNvZGUudG9Vbmljb2RlKGRvbWFpbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArICghb3B0aW9ucy5pcmkgPyBcIkFTQ0lJXCIgOiBcIlVuaWNvZGVcIikgKyBcIiB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9beF0gPSBsb2NhbFBhcnQgKyBcIkBcIiArIGRvbWFpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IHRvLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoZWFkZXJzID0gbWFpbHRvQ29tcG9uZW50cy5oZWFkZXJzID0gbWFpbHRvQ29tcG9uZW50cy5oZWFkZXJzIHx8IHt9O1xuICAgICAgICBpZiAobWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0KSBoZWFkZXJzW1wic3ViamVjdFwiXSA9IG1haWx0b0NvbXBvbmVudHMuc3ViamVjdDtcbiAgICAgICAgaWYgKG1haWx0b0NvbXBvbmVudHMuYm9keSkgaGVhZGVyc1tcImJvZHlcIl0gPSBtYWlsdG9Db21wb25lbnRzLmJvZHk7XG4gICAgICAgIHZhciBmaWVsZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGVyc1tuYW1lXSAhPT0gT1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKG5hbWUucmVwbGFjZShQQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShQQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpLnJlcGxhY2UoTk9UX0hGTkFNRSwgcGN0RW5jQ2hhcikgKyBcIj1cIiArIGhlYWRlcnNbbmFtZV0ucmVwbGFjZShQQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShQQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpLnJlcGxhY2UoTk9UX0hGVkFMVUUsIHBjdEVuY0NoYXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5xdWVyeSA9IGZpZWxkcy5qb2luKFwiJlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG59O1xuXG52YXIgVVJOX1BBUlNFID0gL14oW15cXDpdKylcXDooLiopLztcbi8vUkZDIDIxNDFcbnZhciBoYW5kbGVyJDUgPSB7XG4gICAgc2NoZW1lOiBcInVyblwiLFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSQkMShjb21wb25lbnRzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gY29tcG9uZW50cy5wYXRoICYmIGNvbXBvbmVudHMucGF0aC5tYXRjaChVUk5fUEFSU0UpO1xuICAgICAgICB2YXIgdXJuQ29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICB2YXIgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgXCJ1cm5cIjtcbiAgICAgICAgICAgIHZhciBuaWQgPSBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB2YXIgbnNzID0gbWF0Y2hlc1syXTtcbiAgICAgICAgICAgIHZhciB1cm5TY2hlbWUgPSBzY2hlbWUgKyBcIjpcIiArIChvcHRpb25zLm5pZCB8fCBuaWQpO1xuICAgICAgICAgICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTW3VyblNjaGVtZV07XG4gICAgICAgICAgICB1cm5Db21wb25lbnRzLm5pZCA9IG5pZDtcbiAgICAgICAgICAgIHVybkNvbXBvbmVudHMubnNzID0gbnNzO1xuICAgICAgICAgICAgdXJuQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHNjaGVtZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICB1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5wYXJzZSh1cm5Db21wb25lbnRzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybkNvbXBvbmVudHMuZXJyb3IgPSB1cm5Db21wb25lbnRzLmVycm9yIHx8IFwiVVJOIGNhbiBub3QgYmUgcGFyc2VkLlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cm5Db21wb25lbnRzO1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiBmdW5jdGlvbiBzZXJpYWxpemUkJDEodXJuQ29tcG9uZW50cywgb3B0aW9ucykge1xuICAgICAgICB2YXIgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgXCJ1cm5cIjtcbiAgICAgICAgdmFyIG5pZCA9IHVybkNvbXBvbmVudHMubmlkO1xuICAgICAgICB2YXIgdXJuU2NoZW1lID0gc2NoZW1lICsgXCI6XCIgKyAob3B0aW9ucy5uaWQgfHwgbmlkKTtcbiAgICAgICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTW3VyblNjaGVtZV07XG4gICAgICAgIGlmIChzY2hlbWVIYW5kbGVyKSB7XG4gICAgICAgICAgICB1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5zZXJpYWxpemUodXJuQ29tcG9uZW50cywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVyaUNvbXBvbmVudHMgPSB1cm5Db21wb25lbnRzO1xuICAgICAgICB2YXIgbnNzID0gdXJuQ29tcG9uZW50cy5uc3M7XG4gICAgICAgIHVyaUNvbXBvbmVudHMucGF0aCA9IChuaWQgfHwgb3B0aW9ucy5uaWQpICsgXCI6XCIgKyBuc3M7XG4gICAgICAgIHJldHVybiB1cmlDb21wb25lbnRzO1xuICAgIH1cbn07XG5cbnZhciBVVUlEID0gL15bMC05QS1GYS1mXXs4fSg/OlxcLVswLTlBLUZhLWZdezR9KXszfVxcLVswLTlBLUZhLWZdezEyfSQvO1xuLy9SRkMgNDEyMlxudmFyIGhhbmRsZXIkNiA9IHtcbiAgICBzY2hlbWU6IFwidXJuOnV1aWRcIixcbiAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UodXJuQ29tcG9uZW50cywgb3B0aW9ucykge1xuICAgICAgICB2YXIgdXVpZENvbXBvbmVudHMgPSB1cm5Db21wb25lbnRzO1xuICAgICAgICB1dWlkQ29tcG9uZW50cy51dWlkID0gdXVpZENvbXBvbmVudHMubnNzO1xuICAgICAgICB1dWlkQ29tcG9uZW50cy5uc3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghb3B0aW9ucy50b2xlcmFudCAmJiAoIXV1aWRDb21wb25lbnRzLnV1aWQgfHwgIXV1aWRDb21wb25lbnRzLnV1aWQubWF0Y2goVVVJRCkpKSB7XG4gICAgICAgICAgICB1dWlkQ29tcG9uZW50cy5lcnJvciA9IHV1aWRDb21wb25lbnRzLmVycm9yIHx8IFwiVVVJRCBpcyBub3QgdmFsaWQuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHV1aWRDb21wb25lbnRzO1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiBmdW5jdGlvbiBzZXJpYWxpemUodXVpZENvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHVybkNvbXBvbmVudHMgPSB1dWlkQ29tcG9uZW50cztcbiAgICAgICAgLy9ub3JtYWxpemUgVVVJRFxuICAgICAgICB1cm5Db21wb25lbnRzLm5zcyA9ICh1dWlkQ29tcG9uZW50cy51dWlkIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiB1cm5Db21wb25lbnRzO1xuICAgIH1cbn07XG5cblNDSEVNRVNbaGFuZGxlci5zY2hlbWVdID0gaGFuZGxlcjtcblNDSEVNRVNbaGFuZGxlciQxLnNjaGVtZV0gPSBoYW5kbGVyJDE7XG5TQ0hFTUVTW2hhbmRsZXIkMi5zY2hlbWVdID0gaGFuZGxlciQyO1xuU0NIRU1FU1toYW5kbGVyJDMuc2NoZW1lXSA9IGhhbmRsZXIkMztcblNDSEVNRVNbaGFuZGxlciQ0LnNjaGVtZV0gPSBoYW5kbGVyJDQ7XG5TQ0hFTUVTW2hhbmRsZXIkNS5zY2hlbWVdID0gaGFuZGxlciQ1O1xuU0NIRU1FU1toYW5kbGVyJDYuc2NoZW1lXSA9IGhhbmRsZXIkNjtcblxuZXhwb3J0cy5TQ0hFTUVTID0gU0NIRU1FUztcbmV4cG9ydHMucGN0RW5jQ2hhciA9IHBjdEVuY0NoYXI7XG5leHBvcnRzLnBjdERlY0NoYXJzID0gcGN0RGVjQ2hhcnM7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLnJlbW92ZURvdFNlZ21lbnRzID0gcmVtb3ZlRG90U2VnbWVudHM7XG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcbmV4cG9ydHMucmVzb2x2ZUNvbXBvbmVudHMgPSByZXNvbHZlQ29tcG9uZW50cztcbmV4cG9ydHMucmVzb2x2ZSA9IHJlc29sdmU7XG5leHBvcnRzLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZTtcbmV4cG9ydHMuZXF1YWwgPSBlcXVhbDtcbmV4cG9ydHMuZXNjYXBlQ29tcG9uZW50ID0gZXNjYXBlQ29tcG9uZW50O1xuZXhwb3J0cy51bmVzY2FwZUNvbXBvbmVudCA9IHVuZXNjYXBlQ29tcG9uZW50O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXJpLmFsbC5qcy5tYXBcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuMy4yIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiZcblx0XHQhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0IW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChcblx0XHRmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC5zZWxmID09PSBmcmVlR2xvYmFsXG5cdCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW15cXHgyMC1cXHg3RV0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cblx0LyoqIEVycm9yIG1lc3NhZ2VzICovXG5cdGVycm9ycyA9IHtcblx0XHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHRcdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcblx0fSxcblxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5cdGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbixcblx0Zmxvb3IgPSBNYXRoLmZsb29yLFxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxuXG5cdC8qKiBUZW1wb3JhcnkgdmFyaWFibGUgKi9cblx0a2V5O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG5cdCAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0XHR0aHJvdyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG5cdH1cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuXHQgKiBpdGVtLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0XHRyZXN1bHRbbGVuZ3RoXSA9IGZuKGFycmF5W2xlbmd0aF0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuXHQgKiBhZGRyZXNzZXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuXHQgKiBjaGFyYWN0ZXIuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG5cdCAqIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0XHR2YXIgcGFydHMgPSBzdHJpbmcuc3BsaXQoJ0AnKTtcblx0XHR2YXIgcmVzdWx0ID0gJyc7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG5cdFx0XHRyZXN1bHQgPSBwYXJ0c1swXSArICdAJztcblx0XHRcdHN0cmluZyA9IHBhcnRzWzFdO1xuXHRcdH1cblx0XHQvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG5cdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0XHR2YXIgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG5cdFx0dmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRcdHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcblx0ICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuIFdoaWxlIEphdmFTY3JpcHQgdXNlcyBVQ1MtMiBpbnRlcm5hbGx5LFxuXHQgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuXHQgKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcblx0ICogbWF0Y2hpbmcgVVRGLTE2LlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGRlY29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgb2YgY29kZSBwb2ludHMuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRcdHZhciBvdXRwdXQgPSBbXSxcblx0XHQgICAgY291bnRlciA9IDAsXG5cdFx0ICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG5cdFx0ICAgIHZhbHVlLFxuXHRcdCAgICBleHRyYTtcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcblx0XHRcdFx0ZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcblx0XHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZW5jb2RlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJlbmNvZGUoYXJyYXkpIHtcblx0XHRyZXR1cm4gbWFwKGFycmF5LCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdFx0aWYgKHZhbHVlID4gMHhGRkZGKSB7XG5cdFx0XHRcdHZhbHVlIC09IDB4MTAwMDA7XG5cdFx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuXHRcdFx0XHR2YWx1ZSA9IDB4REMwMCB8IHZhbHVlICYgMHgzRkY7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKTtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBiYXNpYyBjb2RlIHBvaW50IGludG8gYSBkaWdpdC9pbnRlZ2VyLlxuXHQgKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVQb2ludCBUaGUgYmFzaWMgbnVtZXJpYyBjb2RlIHBvaW50IHZhbHVlLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuXHQgKiB0aGUgY29kZSBwb2ludCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWx1ZS5cblx0ICovXG5cdGZ1bmN0aW9uIGJhc2ljVG9EaWdpdChjb2RlUG9pbnQpIHtcblx0XHRpZiAoY29kZVBvaW50IC0gNDggPCAxMCkge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDIyO1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gNjUgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDY1O1xuXHRcdH1cblx0XHRpZiAoY29kZVBvaW50IC0gOTcgPCAyNikge1xuXHRcdFx0cmV0dXJuIGNvZGVQb2ludCAtIDk3O1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuXHQgKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcblx0ICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcblx0ICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cblx0ICovXG5cdGZ1bmN0aW9uIGRpZ2l0VG9CYXNpYyhkaWdpdCwgZmxhZykge1xuXHRcdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdFx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdFx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuXHQgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjMuMicsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHsgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7IC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKGtleSBpbiBwdW55Y29kZSkge1xuXHRcdFx0XHRwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gICAgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgICAvLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuICAgIGRlbGltcyA9IFsnPCcsICc+JywgJ1wiJywgJ2AnLCAnICcsICdcXHInLCAnXFxuJywgJ1xcdCddLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgICB1bndpc2UgPSBbJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ10uY29uY2F0KGRlbGltcyksXG5cbiAgICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gICAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gICAgLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbiAgICAvLyBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAgLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gICAgLy8gdGhlbS5cbiAgICBub25Ib3N0Q2hhcnMgPSBbJyUnLCAnLycsICc/JywgJzsnLCAnIyddLmNvbmNhdChhdXRvRXNjYXBlKSxcbiAgICBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ10sXG4gICAgaG9zdG5hbWVNYXhMZW4gPSAyNTUsXG4gICAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1dGlsLmlzT2JqZWN0KHVybCkgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSByZXR1cm4gdXJsO1xuXG4gIHZhciB1ID0gbmV3IFVybDtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICghdXRpbC5pc1N0cmluZyh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIHF1ZXJ5SW5kZXggPSB1cmwuaW5kZXhPZignPycpLFxuICAgICAgc3BsaXR0ZXIgPVxuICAgICAgICAgIChxdWVyeUluZGV4ICE9PSAtMSAmJiBxdWVyeUluZGV4IDwgdXJsLmluZGV4T2YoJyMnKSkgPyAnPycgOiAnIycsXG4gICAgICB1U3BsaXQgPSB1cmwuc3BsaXQoc3BsaXR0ZXIpLFxuICAgICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICBpZiAoIXNsYXNoZXNEZW5vdGVIb3N0ICYmIHVybC5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBmYXN0IHBhdGggcmVnZXhwXG4gICAgdmFyIHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKVxuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHRoaXMuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgICB0aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMV0gPT09ICddJztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB2YXIgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAodXRpbC5pc1N0cmluZyhvYmopKSBvYmogPSB1cmxQYXJzZShvYmopO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopO1xuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICAgIGhhc2ggPSB0aGlzLmhhc2ggfHwgJycsXG4gICAgICBob3N0ID0gZmFsc2UsXG4gICAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAgICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmXG4gICAgICB1dGlsLmlzT2JqZWN0KHRoaXMucXVlcnkpICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KTtcbiAgfVxuXG4gIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCB8fCAocXVlcnkgJiYgKCc/JyArIHF1ZXJ5KSkgfHwgJyc7XG5cbiAgaWYgKHByb3RvY29sICYmIHByb3RvY29sLnN1YnN0cigtMSkgIT09ICc6JykgcHJvdG9jb2wgKz0gJzonO1xuXG4gIC8vIG9ubHkgdGhlIHNsYXNoZWRQcm90b2NvbHMgZ2V0IHRoZSAvLy4gIE5vdCBtYWlsdG86LCB4bXBwOiwgZXRjLlxuICAvLyB1bmxlc3MgdGhleSBoYWQgdGhlbSB0byBiZWdpbiB3aXRoLlxuICBpZiAodGhpcy5zbGFzaGVzIHx8XG4gICAgICAoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbFtwcm90b2NvbF0pICYmIGhvc3QgIT09IGZhbHNlKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lO1xuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2g7XG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZU9iamVjdCA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIGlmICh1dGlsLmlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgICByZXN1bHQuaG9zdG5hbWUgJiYgIXJlc3VsdC5wYXRobmFtZSkge1xuICAgICAgcmVzdWx0LnBhdGggPSByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICAgIGlzUmVsQWJzID0gKFxuICAgICAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgICAgICByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgKSxcbiAgICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSksXG4gICAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIXV0aWwuaXNOdWxsT3JVbmRlZmluZWQocmVsYXRpdmUuc2VhcmNoKSkge1xuICAgIC8vIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAvLyBsaWtlIGhyZWY9Jz9mb28nLlxuICAgIC8vIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiZcbiAgICAgIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHwgbGFzdCA9PT0gJycpO1xuXG4gIC8vIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHNyY1BhdGgubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIGxhc3QgPSBzcmNQYXRoW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgICAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fFxuICAgICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyKDAsIGhvc3QubGVuZ3RoIC0gcG9ydC5sZW5ndGgpO1xuICB9XG4gIGlmIChob3N0KSB0aGlzLmhvc3RuYW1lID0gaG9zdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc1N0cmluZzogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZihhcmcpID09PSAnc3RyaW5nJztcbiAgfSxcbiAgaXNPYmplY3Q6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xuICB9LFxuICBpc051bGw6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgPT09IG51bGw7XG4gIH0sXG4gIGlzTnVsbE9yVW5kZWZpbmVkOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09IG51bGw7XG4gIH1cbn07XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJpbXBvcnQgeyBtYXAgYXMgZXZlbnRTdHJlYW1NYXAgfSBmcm9tICdldmVudC1zdHJlYW0nO1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5pbXBvcnQgeyBQYXJhbSwgUG9zdERhdGFDb21tb24sIFJlcXVlc3QgYXMgTnBtSGFyUmVxdWVzdCB9IGZyb20gJ2hhci1mb3JtYXQnO1xuaW1wb3J0IHsgc3RyaW5naWZ5IGFzIHF1ZXJ5U3RyaW5naWZ5IH0gZnJvbSAncXVlcnlzdHJpbmcnO1xuaW1wb3J0IHsgZm9ybWF0IGFzIHVybEZvcm1hdCwgcGFyc2UgYXMgdXJsUGFyc2UsIFVybFdpdGhQYXJzZWRRdWVyeSB9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7IGZvcm1EYXRhSXRlcmF0b3IsIGlzQmxvYiB9IGZyb20gJy4vaGVscGVycy9mb3JtLWRhdGEnO1xuaW1wb3J0IHsgdmFsaWRhdGVIYXJSZXF1ZXN0IH0gZnJvbSAnLi9oZWxwZXJzL2hhci12YWxpZGF0b3InO1xuaW1wb3J0IHsgZ2V0SGVhZGVyTmFtZSB9IGZyb20gJy4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IFJlZHVjZWRIZWxwZXJPYmplY3QsIHJlZHVjZXIgfSBmcm9tICcuL2hlbHBlcnMvcmVkdWNlcic7XG5pbXBvcnQgeyBDbGllbnRJZCwgVGFyZ2V0SWQsIHRhcmdldHMgfSBmcm9tICcuL3RhcmdldHMvdGFyZ2V0cyc7XG5cbmV4cG9ydCB7IGF2YWlsYWJsZVRhcmdldHMsIGV4dG5hbWUgfSBmcm9tICcuL2hlbHBlcnMvdXRpbHMnO1xuZXhwb3J0IHsgYWRkVGFyZ2V0LCBhZGRUYXJnZXRDbGllbnQgfSBmcm9tICcuL3RhcmdldHMvdGFyZ2V0cyc7XG5cbmNvbnN0IERFQlVHX01PREUgPSBmYWxzZTtcblxuY29uc3QgZGVidWcgPSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24gLS0gaW50ZW50aW9uYWwgbm9vcFxuICBpbmZvOiBERUJVR19NT0RFID8gY29uc29sZS5pbmZvIDogKCkgPT4ge30sXG59O1xuXG4vKiogaXMgdGhpcyB3cm9uZz8gIHllcy4gIGFjY29yZGluZyB0byB0aGUgc3BlYyAoaHR0cDovL3d3dy5zb2Z0d2FyZWlzaGFyZC5jb20vYmxvZy9oYXItMTItc3BlYy8jcG9zdERhdGEpIGl0J3MgdGVjaG5pY2FsbHkgd3Jvbmcgc2luY2UgYHBhcmFtc2AgYW5kIGB0ZXh0YCBhcmUgKGJ5IHRoZSBzcGVjKSBtdXR1YWxseSBleGNsdXNpdmUuICBIb3dldmVyLCBpbiBwcmFjdGljZSwgdGhpcyBpcyBub3Qgd2hhdCBpcyBvZnRlbiB0aGUgY2FzZS5cbiAqXG4gKiBJbiBnZW5lcmFsLCB0aGlzIGxpYnJhcnkgdGFrZXMgYSBfZGVzY3JpcHRpdmVfIHJhdGhlciB0aGFuIF9wZXJzY3JpcHRpdmVfIGFwcHJvYWNoIChzZWUgaHR0cHM6Ly9hbXlyZXkud2ViLnVuYy5lZHUvY2xhc3Nlcy9saW5nLTEwMS1vbmxpbmUvdHV0b3JpYWxzL3VuZGVyc3RhbmRpbmctcHJlc2NyaXB0aXZlLXZzLWRlc2NyaXB0aXZlLWdyYW1tYXIvKS5cbiAqXG4gKiBUaGVuLCBpbiBhZGRpdGlvbiB0byB0aGF0LCBpdCByZWFsbHkgYWRkcyB0byBjb21wbGV4aXR5IHdpdGggVHlwZVNjcmlwdCAoVHlwZVNjcmlwdCB0YWtlcyB0aGlzIGNvbnN0cmFpbnQgdmVyeSB2ZXJ5IHNlcmlvdXNseSkgaW4gYSB3YXkgdGhhdCdzIG5vdCBhY3R1YWxseSBzdXBlciB1c2VmdWwuICBTbywgd2UgdHJlYXQgdGhpcyBvYmplY3QgYXMgdGhvdWdoIGl0IGNvdWxkIGhhdmUgYm90aCBvciBlaXRoZXIgb2YgYHBhcmFtc2AgYW5kL29yIGB0ZXh0YC5cbiAqL1xudHlwZSBQb3N0RGF0YUJhc2UgPSBQb3N0RGF0YUNvbW1vbiAmIHtcbiAgdGV4dD86IHN0cmluZztcbiAgcGFyYW1zPzogUGFyYW1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIEhhclJlcXVlc3QgPSBPbWl0PE5wbUhhclJlcXVlc3QsICdwb3N0RGF0YSc+ICYgeyBwb3N0RGF0YTogUG9zdERhdGFCYXNlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEV4dHJhcyB7XG4gIHBvc3REYXRhOiBQb3N0RGF0YUJhc2UgJiB7XG4gICAganNvbk9iaj86IFJlZHVjZWRIZWxwZXJPYmplY3Q7XG4gICAgcGFyYW1zT2JqPzogUmVkdWNlZEhlbHBlck9iamVjdDtcbiAgICBib3VuZGFyeT86IHN0cmluZztcbiAgfTtcbiAgZnVsbFVybDogc3RyaW5nO1xuICBxdWVyeU9iajogUmVkdWNlZEhlbHBlck9iamVjdDtcbiAgaGVhZGVyc09iajogUmVkdWNlZEhlbHBlck9iamVjdDtcbiAgdXJpT2JqOiBVcmxXaXRoUGFyc2VkUXVlcnk7XG4gIGNvb2tpZXNPYmo6IFJlZHVjZWRIZWxwZXJPYmplY3Q7XG4gIGFsbEhlYWRlcnM6IFJlZHVjZWRIZWxwZXJPYmplY3Q7XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3QgPSBIYXJSZXF1ZXN0ICYgUmVxdWVzdEV4dHJhcztcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgcmVxdWVzdDogUGFydGlhbDxIYXJSZXF1ZXN0Pjtcbn1cblxuaW50ZXJmYWNlIEhhckVudHJ5IHtcbiAgbG9nOiB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGNyZWF0b3I6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZlcnNpb246IHN0cmluZztcbiAgICB9O1xuICAgIGVudHJpZXM6IEVudHJ5W107XG4gIH07XG59XG5cbmNvbnN0IGlzSGFyRW50cnkgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIEhhckVudHJ5ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgJ2xvZycgaW4gdmFsdWUgJiZcbiAgdHlwZW9mIHZhbHVlLmxvZyA9PT0gJ29iamVjdCcgJiZcbiAgJ2VudHJpZXMnIGluIHZhbHVlLmxvZyAmJlxuICBBcnJheS5pc0FycmF5KHZhbHVlLmxvZy5lbnRyaWVzKTtcblxuZXhwb3J0IGNsYXNzIEhUVFBTbmlwcGV0IHtcbiAgcmVxdWVzdHM6IFJlcXVlc3RbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBIYXJFbnRyeSB8IEhhclJlcXVlc3QpIHtcbiAgICBsZXQgZW50cmllczogRW50cnlbXSA9IFtdO1xuXG4gICAgLy8gcHJlcCB0aGUgbWFpbiBjb250YWluZXJcbiAgICB0aGlzLnJlcXVlc3RzID0gW107XG5cbiAgICAvLyBpcyBpdCBoYXI/XG4gICAgaWYgKGlzSGFyRW50cnkoaW5wdXQpKSB7XG4gICAgICBlbnRyaWVzID0gaW5wdXQubG9nLmVudHJpZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudHJpZXMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICByZXF1ZXN0OiBpbnB1dCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgZW50cmllcy5mb3JFYWNoKCh7IHJlcXVlc3QgfSkgPT4ge1xuICAgICAgLy8gYWRkIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8gbWFrZSB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWxcbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgYm9keVNpemU6IDAsXG4gICAgICAgIGhlYWRlcnNTaXplOiAwLFxuICAgICAgICBoZWFkZXJzOiBbXSxcbiAgICAgICAgY29va2llczogW10sXG4gICAgICAgIGh0dHBWZXJzaW9uOiAnSFRUUC8xLjEnLFxuICAgICAgICBxdWVyeVN0cmluZzogW10sXG4gICAgICAgIHBvc3REYXRhOiB7XG4gICAgICAgICAgbWltZVR5cGU6IHJlcXVlc3QucG9zdERhdGE/Lm1pbWVUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICB9LFxuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgfTtcblxuICAgICAgaWYgKHZhbGlkYXRlSGFyUmVxdWVzdChyZXEpKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdHMucHVzaCh0aGlzLnByZXBhcmUocmVxKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcmVwYXJlID0gKGhhclJlcXVlc3Q6IEhhclJlcXVlc3QpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBSZXF1ZXN0ID0ge1xuICAgICAgLi4uaGFyUmVxdWVzdCxcbiAgICAgIGZ1bGxVcmw6ICcnLFxuICAgICAgdXJpT2JqOiB7fSBhcyBVcmxXaXRoUGFyc2VkUXVlcnksXG4gICAgICBxdWVyeU9iajoge30sXG4gICAgICBoZWFkZXJzT2JqOiB7fSxcbiAgICAgIGNvb2tpZXNPYmo6IHt9LFxuICAgICAgYWxsSGVhZGVyczoge30sXG4gICAgfTtcblxuICAgIC8vIGNvbnN0cnVjdCBxdWVyeSBvYmplY3RzXG4gICAgaWYgKHJlcXVlc3QucXVlcnlTdHJpbmcgJiYgcmVxdWVzdC5xdWVyeVN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGRlYnVnLmluZm8oJ3F1ZXJ5U3RyaW5nIGZvdW5kLCBjb25zdHJ1Y3RpbmcgcXVlcnlTdHJpbmcgcGFpciBtYXAnKTtcblxuICAgICAgcmVxdWVzdC5xdWVyeU9iaiA9IHJlcXVlc3QucXVlcnlTdHJpbmcucmVkdWNlKHJlZHVjZXIsIHt9KTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgaGVhZGVycyBvYmplY3RzXG4gICAgaWYgKHJlcXVlc3QuaGVhZGVycyAmJiByZXF1ZXN0LmhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBodHRwMlZlcnNpb25SZWdleCA9IC9eSFRUUFxcLzIvO1xuICAgICAgcmVxdWVzdC5oZWFkZXJzT2JqID0gcmVxdWVzdC5oZWFkZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gaHR0cDJWZXJzaW9uUmVnZXguZXhlYyhyZXF1ZXN0Lmh0dHBWZXJzaW9uKVxuICAgICAgICAgID8gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgOiBuYW1lO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmFjY3VtdWxhdG9yLFxuICAgICAgICAgIFtoZWFkZXJOYW1lXTogdmFsdWUsXG4gICAgICAgIH07XG4gICAgICB9LCB7fSk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGhlYWRlcnMgb2JqZWN0c1xuICAgIGlmIChyZXF1ZXN0LmNvb2tpZXMgJiYgcmVxdWVzdC5jb29raWVzLmxlbmd0aCkge1xuICAgICAgcmVxdWVzdC5jb29raWVzT2JqID0gcmVxdWVzdC5jb29raWVzLnJlZHVjZVJpZ2h0KFxuICAgICAgICAoYWNjdW11bGF0b3IsIHsgbmFtZSwgdmFsdWUgfSkgPT4gKHtcbiAgICAgICAgICAuLi5hY2N1bXVsYXRvcixcbiAgICAgICAgICBbbmFtZV06IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICAge30sXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBDb29raWUgaGVhZGVyXG4gICAgY29uc3QgY29va2llcyA9IHJlcXVlc3QuY29va2llcz8ubWFwKFxuICAgICAgKHsgbmFtZSwgdmFsdWUgfSkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YCxcbiAgICApO1xuXG4gICAgaWYgKGNvb2tpZXM/Lmxlbmd0aCkge1xuICAgICAgcmVxdWVzdC5hbGxIZWFkZXJzLmNvb2tpZSA9IGNvb2tpZXMuam9pbignOyAnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlcXVlc3QucG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ211bHRpcGFydC9taXhlZCc6XG4gICAgICBjYXNlICdtdWx0aXBhcnQvcmVsYXRlZCc6XG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgIGNhc2UgJ211bHRpcGFydC9hbHRlcm5hdGl2ZSc6XG4gICAgICAgIC8vIHJlc2V0IHZhbHVlc1xuICAgICAgICByZXF1ZXN0LnBvc3REYXRhLnRleHQgPSAnJztcbiAgICAgICAgcmVxdWVzdC5wb3N0RGF0YS5taW1lVHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJztcblxuICAgICAgICBpZiAocmVxdWVzdC5wb3N0RGF0YT8ucGFyYW1zKSB7XG4gICAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgICAgICAgLy8gVGhlIGBmb3JtLWRhdGFgIG1vZHVsZSByZXR1cm5zIG9uZSBvZiB0d28gdGhpbmdzOiBhIG5hdGl2ZSBGb3JtRGF0YSBvYmplY3QsIG9yIGl0cyBvd24gcG9seWZpbGxcbiAgICAgICAgICAvLyBTaW5jZSB0aGUgcG9seWZpbGwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZnVsbCBBUEkgb2YgdGhlIG5hdGl2ZSBGb3JtRGF0YSBvYmplY3QsIHdoZW4gdGhpcyBsaWJyYXJ5IGlzIHJ1bm5pbmcgaW4gYSBicm93c2VyIGVudmlyb25tZW50IGl0J2xsIGZhaWwgb24gdHdvIHRoaW5nczpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAxLiBUaGUgQVBJIGZvciBgZm9ybS5hcHBlbmQoKWAgaGFzIHRocmVlIGFyZ3VtZW50cyBhbmQgdGhlIHRoaXJkIHNob3VsZCBvbmx5IGJlIHByZXNlbnQgd2hlbiB0aGUgc2Vjb25kIGlzIGFcbiAgICAgICAgICAvLyAgICBCbG9iIG9yIFVTVlN0cmluZy5cbiAgICAgICAgICAvLyAgMS4gYEZvcm1EYXRhLnBpcGUoKWAgaXNuJ3QgYSBmdW5jdGlvbi5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFNpbmNlIHRoZSBuYXRpdmUgRm9ybURhdGEgb2JqZWN0IGlzIGl0ZXJhYmxlLCB3ZSBlYXNpbHkgZGV0ZWN0IHdoYXQgdmVyc2lvbiBvZiBgZm9ybS1kYXRhYCB3ZSdyZSB3b3JraW5nIHdpdGggaGVyZSB0byBhbGxvdyBgbXVsdGlwYXJ0L2Zvcm0tZGF0YWAgcmVxdWVzdHMgdG8gYmUgY29tcGlsZWQgdW5kZXIgYm90aCBicm93c2VyIGFuZCBOb2RlIGVudmlyb25tZW50cy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoaXMgaGFjayBpcyBwcmV0dHkgYXdmdWwgYnV0IGl0J3MgdGhlIG9ubHkgd2F5IHdlIGNhbiB1c2UgdGhpcyBsaWJyYXJ5IGluIHRoZSBicm93c2VyIGFzIGlmIHdlIGNvZGUgdGhpcyBhZ2FpbnN0IGp1c3QgdGhlIG5hdGl2ZSBGb3JtRGF0YSBvYmplY3QsIHdlIGNhbid0IHBvbHlmaWxsIHRoYXQgYmFjayBpbnRvIE5vZGUgYmVjYXVzZSBCbG9iIGFuZCBGaWxlIG9iamVjdHMsIHdoaWNoIHNvbWV0aGluZyBsaWtlIGBmb3JtZGF0YS1wb2x5ZmlsbGAgcmVxdWlyZXMsIGRvbid0IGV4aXN0IHRoZXJlLlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ET1xuICAgICAgICAgIGNvbnN0IGlzTmF0aXZlRm9ybURhdGEgPSB0eXBlb2YgZm9ybVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xuXG4gICAgICAgICAgLy8gVE9ETzogVEhJUyBBQlNPTFVURUxZIE1VU1QgQkUgUkVNT1ZFRC5cbiAgICAgICAgICAvLyBJVCBCUkVBS1MgU09NRSBVU0UtQ0FTRVMgRk9SIE1VTFRJUEFSVCBGT1JNUyBUSEFUIERFUEVORCBPTiBCRUlORyBBQkxFIFRPIFNFVCBUSEUgQk9VTkRBUlkuXG4gICAgICAgICAgLy8gZWFzdGVyIGVnZ1xuICAgICAgICAgIGNvbnN0IGJvdW5kYXJ5ID0gJy0tLTAxMTAwMDAxMDExMTAwMDAwMTEwMTAwMSc7IC8vIHRoaXMgaXMgYmluYXJ5IGZvciBcImFwaVwiLiB5ZXAuXG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUZvcm1EYXRhKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRISVMgSVMgV1JPTkcuICBWRVJZIFdST05HLlxuICAgICAgICAgICAgZm9ybS5fYm91bmRhcnkgPSBib3VuZGFyeTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXF1ZXN0LnBvc3REYXRhPy5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcGFyYW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW0udmFsdWUgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhcmFtLmZpbGVOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChpc05hdGl2ZUZvcm1EYXRhKSB7XG4gICAgICAgICAgICAgIGlmIChpc0Jsb2IodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPXG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmQobmFtZSwgdmFsdWUsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvcm0uYXBwZW5kKG5hbWUsIHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPXG4gICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHBhcmFtLmNvbnRlbnRUeXBlIHx8IG51bGwsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGlzTmF0aXZlRm9ybURhdGEpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBmb3JtRGF0YUl0ZXJhdG9yKGZvcm0sIGJvdW5kYXJ5KSkge1xuICAgICAgICAgICAgICByZXF1ZXN0LnBvc3REYXRhLnRleHQgKz0gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybS5waXBlKFxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE9cbiAgICAgICAgICAgICAgZXZlbnRTdHJlYW1NYXAoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5wb3N0RGF0YS50ZXh0ICs9IGRhdGE7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXF1ZXN0LnBvc3REYXRhLmJvdW5kYXJ5ID0gYm91bmRhcnk7XG5cbiAgICAgICAgICAvLyBTaW5jZSBoZWFkZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZSB3ZSBuZWVkIHRvIHNlZSBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIGBDb250ZW50LVR5cGVgIGhlYWRlciB0aGF0IHdlIGNhbiBvdmVycmlkZS5cbiAgICAgICAgICBjb25zdCBjb250ZW50VHlwZUhlYWRlciA9XG4gICAgICAgICAgICBnZXRIZWFkZXJOYW1lKHJlcXVlc3QuaGVhZGVyc09iaiwgJ2NvbnRlbnQtdHlwZScpIHx8ICdjb250ZW50LXR5cGUnO1xuXG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzT2JqW2NvbnRlbnRUeXBlSGVhZGVyXSA9IGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke2JvdW5kYXJ5fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgIGlmICghcmVxdWVzdC5wb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICByZXF1ZXN0LnBvc3REYXRhLnRleHQgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBgaGFyLWZvcm1hdGAgdHlwZXMgbWFrZSB0aGlzIGNoYWxsZW5naW5nXG4gICAgICAgICAgcmVxdWVzdC5wb3N0RGF0YS5wYXJhbXNPYmogPSByZXF1ZXN0LnBvc3REYXRhLnBhcmFtcy5yZWR1Y2UocmVkdWNlciwge30pO1xuXG4gICAgICAgICAgLy8gYWx3YXlzIG92ZXJ3cml0ZVxuICAgICAgICAgIHJlcXVlc3QucG9zdERhdGEudGV4dCA9IHF1ZXJ5U3RyaW5naWZ5KHJlcXVlc3QucG9zdERhdGEucGFyYW1zT2JqKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGV4dC9qc29uJzpcbiAgICAgIGNhc2UgJ3RleHQveC1qc29uJzpcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC1qc29uJzpcbiAgICAgICAgcmVxdWVzdC5wb3N0RGF0YS5taW1lVHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICBpZiAocmVxdWVzdC5wb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QucG9zdERhdGEuanNvbk9iaiA9IEpTT04ucGFyc2UocmVxdWVzdC5wb3N0RGF0YS50ZXh0KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1Zy5pbmZvKGUpO1xuXG4gICAgICAgICAgICAvLyBmb3JjZSBiYWNrIHRvIGB0ZXh0L3BsYWluYCBpZiBoZWFkZXJzIGhhdmUgcHJvcGVyIGNvbnRlbnQtdHlwZSB2YWx1ZSwgdGhlbiB0aGlzIHNob3VsZCBhbHNvIHdvcmtcbiAgICAgICAgICAgIHJlcXVlc3QucG9zdERhdGEubWltZVR5cGUgPSAndGV4dC9wbGFpbic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhbGxIZWFkZXJzIG9iamVjdFxuICAgIGNvbnN0IGFsbEhlYWRlcnMgPSB7XG4gICAgICAuLi5yZXF1ZXN0LmFsbEhlYWRlcnMsXG4gICAgICAuLi5yZXF1ZXN0LmhlYWRlcnNPYmosXG4gICAgfTtcblxuICAgIGNvbnN0IHVybFdpdGhQYXJzZWRRdWVyeSA9IHVybFBhcnNlKHJlcXVlc3QudXJsLCB0cnVlLCB0cnVlKTsgLy8/XG5cbiAgICAvLyBxdWVyeSBzdHJpbmcga2V5L3ZhbHVlIHBhaXJzIGluIHdpdGggbGl0ZXJhbCBxdWVyeXN0cmluZ3MgY29udGFpbmQgd2l0aGluIHRoZSB1cmxcbiAgICByZXF1ZXN0LnF1ZXJ5T2JqID0ge1xuICAgICAgLi4ucmVxdWVzdC5xdWVyeU9iaixcbiAgICAgIC4uLih1cmxXaXRoUGFyc2VkUXVlcnkucXVlcnkgYXMgUmVkdWNlZEhlbHBlck9iamVjdCksXG4gICAgfTsgLy8/XG5cbiAgICAvLyByZXNldCB1cmlPYmogdmFsdWVzIGZvciBhIGNsZWFuIHVybFxuICAgIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5U3RyaW5naWZ5KHJlcXVlc3QucXVlcnlPYmopO1xuXG4gICAgY29uc3QgdXJpT2JqID0ge1xuICAgICAgLi4udXJsV2l0aFBhcnNlZFF1ZXJ5LFxuICAgICAgcXVlcnk6IHJlcXVlc3QucXVlcnlPYmosXG4gICAgICBzZWFyY2gsXG4gICAgICBwYXRoOiBzZWFyY2ggPyBgJHt1cmxXaXRoUGFyc2VkUXVlcnkucGF0aG5hbWV9PyR7c2VhcmNofWAgOiB1cmxXaXRoUGFyc2VkUXVlcnkucGF0aG5hbWUsXG4gICAgfTtcblxuICAgIC8vIGtlZXAgdGhlIGJhc2UgdXJsIGNsZWFuIG9mIHF1ZXJ5U3RyaW5nXG4gICAgY29uc3QgdXJsID0gdXJsRm9ybWF0KHtcbiAgICAgIC4uLnVybFdpdGhQYXJzZWRRdWVyeSxcbiAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgc2VhcmNoOiBudWxsLFxuICAgIH0pOyAvLz9cblxuICAgIGNvbnN0IGZ1bGxVcmwgPSB1cmxGb3JtYXQoe1xuICAgICAgLi4udXJsV2l0aFBhcnNlZFF1ZXJ5LFxuICAgICAgLi4udXJpT2JqLFxuICAgIH0pOyAvLz9cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXF1ZXN0LFxuICAgICAgYWxsSGVhZGVycyxcbiAgICAgIGZ1bGxVcmwsXG4gICAgICB1cmwsXG4gICAgICB1cmlPYmosXG4gICAgfTtcbiAgfTtcblxuICBjb252ZXJ0ID0gKHRhcmdldElkOiBUYXJnZXRJZCwgY2xpZW50SWQ/OiBDbGllbnRJZCwgb3B0aW9ucz86IGFueSkgPT4ge1xuICAgIGlmICghb3B0aW9ucyAmJiBjbGllbnRJZCkge1xuICAgICAgb3B0aW9ucyA9IGNsaWVudElkO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHNbdGFyZ2V0SWRdO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb252ZXJ0IH0gPSB0YXJnZXQuY2xpZW50c0J5SWRbY2xpZW50SWQgfHwgdGFyZ2V0LmluZm8uZGVmYXVsdF07XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMucmVxdWVzdHMubWFwKHJlcXVlc3QgPT4gY29udmVydChyZXF1ZXN0LCBvcHRpb25zKSk7XG4gICAgcmV0dXJuIHJlc3VsdHMubGVuZ3RoID09PSAxID8gcmVzdWx0c1swXSA6IHJlc3VsdHM7XG4gIH07XG59XG4iXSwibmFtZXMiOlsiREVGQVVMVF9JTkRFTlRBVElPTl9DSEFSQUNURVIiLCJERUZBVUxUX0xJTkVfSk9JTiIsIkNvZGVCdWlsZGVyIiwiX2NyZWF0ZUNsYXNzIiwiX3RoaXMiLCJfcmVmIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaW5kZW50Iiwiam9pbiIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0eSIsImxpbmUiLCJpbmRlbnRhdGlvbkxldmVsIiwiaW5kZW50YXRpb25DaGFyYWN0ZXIiLCJyZXBlYXQiLCJjb25jYXQiLCJuZXdMaW5lIiwiaW5kZW50TGluZSIsImNvZGUiLCJ1bnNoaWZ0IiwicHVzaCIsInVucmVwbGFjZWRDb2RlIiwibGluZUpvaW4iLCJyZXBsYWNlZE91dHB1dCIsInBvc3RQcm9jZXNzb3JzIiwicmVkdWNlIiwiYWNjdW11bGF0b3IiLCJyZXBsYWNlciIsInBvc3RQcm9jZXNzb3IiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJlc2NhcGVTdHJpbmciLCJyYXdWYWx1ZSIsIm9wdGlvbnMiLCJfb3B0aW9ucyRkZWxpbWl0ZXIiLCJkZWxpbWl0ZXIiLCJfb3B0aW9ucyRlc2NhcGVDaGFyIiwiZXNjYXBlQ2hhciIsIl9vcHRpb25zJGVzY2FwZU5ld2xpbiIsImVzY2FwZU5ld2xpbmVzIiwic3RyaW5nVmFsdWUiLCJ0b1N0cmluZyIsIm1hcCIsImMiLCJKU09OIiwic3RyaW5naWZ5Iiwic2xpY2UiLCJlc2NhcGVGb3JTaW5nbGVRdW90ZXMiLCJ2YWx1ZSIsImVzY2FwZUZvckRvdWJsZVF1b3RlcyIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJleHBvcnRzIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5Iiwib2JqIiwia2V5IiwiZGVzYyIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiYXJnIiwidHlwZSIsImNhbGwiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwibWV0aG9kIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsImludm9rZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWNvcmQiLCJyZXN1bHQiLCJfdHlwZW9mIiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwic3RhdGUiLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiZG9uZSIsIm1ldGhvZE5hbWUiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImkiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwia2V5cyIsInZhbCIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIl9pIiwiX3MiLCJfZSIsIl94IiwiX3IiLCJfYXJyIiwiX24iLCJfZCIsIkFycmF5IiwiaXNBcnJheSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwibyIsImFsbG93QXJyYXlMaWtlIiwiaXQiLCJGIiwicyIsIm4iLCJlIiwiX2UyIiwiZiIsIm5vcm1hbENvbXBsZXRpb24iLCJkaWRFcnIiLCJzdGVwIiwiX2UzIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJmcm9tIiwidGVzdCIsImxlbiIsImFycjIiLCJjYXJyaWFnZSIsImRhc2hlcyIsIk5BTUUiLCJpc0Jsb2IiLCJhcnJheUJ1ZmZlciIsInN0cmVhbSIsImdldEZvb3RlciIsImJvdW5kYXJ5IiwiZ2V0SGVhZGVyIiwiZmllbGQiLCJoZWFkZXIiLCJmb3JtRGF0YUl0ZXJhdG9yIiwiZm9ybSIsIl9pdGVyYXRvciIsIl9zdGVwIiwiX3N0ZXAkdmFsdWUiLCJmb3JtRGF0YUl0ZXJhdG9yJCIsIl9jb250ZXh0IiwidDEiLCJBanYiLCJzY2hlbWEiLCJIQVJFcnJvciIsIl9FcnJvciIsIl9pbmhlcml0cyIsIl9zdXBlciIsIl9jcmVhdGVTdXBlciIsImVycm9ycyIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJjYXB0dXJlU3RhY2tUcmFjZSIsIl93cmFwTmF0aXZlU3VwZXIiLCJhanYiLCJhbGxFcnJvcnMiLCJhZGRTY2hlbWEiLCJ2YWxpZGF0ZUhhclJlcXVlc3QiLCJyZXF1ZXN0IiwidmFsaWRhdGUiLCJnZXRTY2hlbWEiLCJ2YWxpZCIsImdldEhlYWRlck5hbWUiLCJoZWFkZXJzIiwiZmluZCIsInRvTG93ZXJDYXNlIiwiaGVhZGVyTmFtZSIsImhhc0hlYWRlciIsIkJvb2xlYW4iLCJtaW1lVHlwZUpzb24iLCJpc01pbWVUeXBlSlNPTiIsIm1pbWVUeXBlIiwic29tZSIsImluY2x1ZGVzIiwicmVkdWNlciIsInBhaXIiLCJjdXJyZW50VmFsdWUiLCJxdW90ZSIsInNhZmUiLCJpc1NoZWxsU2FmZSIsInJlcGxhY2UiLCJlc2NhcGUiLCJ0YXJnZXRzIiwiYXZhaWxhYmxlVGFyZ2V0cyIsInRhcmdldElkIiwiX29iamVjdFNwcmVhZCIsImNsaWVudHMiLCJjbGllbnRzQnlJZCIsImNsaWVudElkIiwiZXh0bmFtZSIsIl90YXJnZXRzJHRhcmdldElkIiwibGliY3VybCIsInRpdGxlIiwibGluayIsImRlc2NyaXB0aW9uIiwiY29udmVydCIsImZ1bGxVcmwiLCJoZWFkZXJzT2JqIiwiYWxsSGVhZGVycyIsInBvc3REYXRhIiwiX0NvZGVCdWlsZGVyIiwiYmxhbmsiLCJ0b1VwcGVyQ2FzZSIsImNvb2tpZSIsInRleHQiLCJLZXl3b3JkIiwiRmlsZSIsInBhdGgiLCJfdGhpczIiLCJqc1R5cGUiLCJpbnB1dCIsIm9iakVtcHR5IiwiZmlsdGVyRW1wdHkiLCJmaWx0ZXIiLCJ4IiwicGFkQmxvY2siLCJwYWRTaXplIiwicGFkZGluZyIsImpzVG9FZG4iLCJqcyIsInNvdXJjZSIsInRyaW0iLCJjbGpfaHR0cCIsInF1ZXJ5T2JqIiwidXJsIiwibWV0aG9kcyIsInBhcmFtcyIsImpzb25PYmoiLCJwYXJhbXNPYmoiLCJib2R5IiwibXVsdGlwYXJ0IiwicGFyYW0iLCJmaWxlTmFtZSIsImNvbnRlbnQiLCJhY2NlcHQiLCJmb3JtYXR0ZWRQYXJhbXMiLCJjbG9qdXJlIiwiZ2V0RGVjb21wcmVzc2lvbk1ldGhvZHMiLCJhY2NlcHRFbmNvZGluZ3MiLCJzdXBwb3J0ZWRNZXRob2RzIiwiZ3ppcCIsImRlZmxhdGUiLCJhY2NlcHRFbmNvZGluZyIsInNwbGl0IiwiZW5jb2RpbmciLCJtYXRjaCIsImV4ZWMiLCJodHRwY2xpZW50IiwiX3Bvc3REYXRhJHBhcmFtcyIsIl9wb3N0RGF0YSRwYXJhbXMyIiwib3B0cyIsImNsaWVudGhhbmRsZXIiLCJjb29raWVzIiwiZGVjb21wcmVzc2lvbk1ldGhvZHMiLCJzdWJzdHJpbmciLCJjb250ZW50VHlwZSIsInJlc3RzaGFycCIsImlzU3VwcG9ydGVkTWV0aG9kIiwiX3JlZjIiLCJjc2hhcnAiLCJuYXRpdmUiLCJfb3B0aW9ucyRzaG93Qm9pbGVycGwiLCJzaG93Qm9pbGVycGxhdGUiLCJfb3B0aW9ucyRjaGVja0Vycm9ycyIsImNoZWNrRXJyb3JzIiwiX29wdGlvbnMkcHJpbnRCb2R5IiwicHJpbnRCb2R5IiwiX29wdGlvbnMkdGltZW91dCIsInRpbWVvdXQiLCJfb3B0aW9ucyRpbnNlY3VyZVNraXAiLCJpbnNlY3VyZVNraXBWZXJpZnkiLCJlcnJvclBsYWNlaG9sZGVyIiwiZXJyb3JDaGVjayIsImhhc1RpbWVvdXQiLCJoYXNDbGllbnQiLCJjbGllbnQiLCJfbmF0aXZlIiwiZ28iLCJDUkxGIiwiaHR0cDExIiwidXJpT2JqIiwiaHR0cFZlcnNpb24iLCJhYnNvbHV0ZVVSSSIsImF1dG9Db250ZW50TGVuZ3RoIiwiYXV0b0hvc3QiLCJyZXF1ZXN0VXJsIiwiaGVhZGVyS2V5cyIsImtleUNhcGl0YWxpemVkIiwiaG9zdCIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJoZWFkZXJTZWN0aW9uIiwibWVzc2FnZUJvZHkiLCJodHRwIiwiYXN5bmNodHRwIiwibmV0aHR0cCIsIm9raHR0cCIsIm1ldGhvZHNXaXRoQm9keSIsInVuaXJlc3QiLCJqYXZhIiwic3RyaW5naWZ5T2JqZWN0IiwiYXhpb3MiLCJhZGRQb3N0UHJvY2Vzc29yIiwicmVxdWVzdE9wdGlvbnMiLCJkYXRhIiwib3B0aW9uU3RyaW5nIiwiaW5saW5lQ2hhcmFjdGVyTGltaXQiLCJmZXRjaCIsImlucHV0T3B0cyIsImNyZWRlbnRpYWxzIiwiY29udGVudFR5cGVIZWFkZXIiLCJ0cmFuc2Zvcm0iLCJfIiwicHJvcGVydHkiLCJvcmlnaW5hbFJlc3VsdCIsImpxdWVyeSIsInNldHRpbmdzIiwiY3Jvc3NEb21haW4iLCJwcm9jZXNzRGF0YSIsIl9nZXRIZWFkZXIiLCJzdHJpbmdpZmllZFNldHRpbmdzIiwieGhyIiwiamF2YXNjcmlwdCIsImNvcnMiLCJrb3RsaW4iLCJyZXFPcHRzIiwic3RyaW5naWZpZWRPcHRpb25zIiwiaW5jbHVkZUZTIiwiY29va2llc1N0cmluZyIsImVuY29kZVVSSUNvbXBvbmVudCIsIl9vcHRpb25zJGluZGVudCIsImhvc3RuYW1lIiwicG9ydCIsInJlamVjdFVuYXV0aG9yaXplZCIsInByb3RvY29sIiwicXMiLCJqc29uIiwiZm9ybURhdGEiLCJhdHRhY2htZW50IiwiZmlsZW5hbWUiLCJqYXIiLCJub2RlIiwicGFydCIsIm5zRGVjbGFyYXRpb24iLCJuc0NsYXNzIiwicGFyYW1ldGVycyIsIm9wZW5pbmciLCJsaXRlcmFsIiwibGl0ZXJhbFJlcHJlc2VudGF0aW9uIiwiaW5kZW50YXRpb24iLCJ2YWx1ZXNSZXByZXNlbnRhdGlvbiIsImtleVZhbHVlUGFpcnMiLCJuc3VybHNlc3Npb24iLCJwcmV0dHkiLCJyZXEiLCJoYXNIZWFkZXJzIiwiaGFzQm9keSIsIl90b0FycmF5IiwiaGVhZCIsInRhaWwiLCJ0b0ZpeGVkIiwib2JqYyIsImNvaHR0cCIsImgiLCJiIiwibSIsIm9jYW1sIiwiY29udmVydFR5cGUiLCJjdXJsIiwiX29wdGlvbnMkY2xvc2luZ1RhZyIsImNsb3NpbmdUYWciLCJfb3B0aW9ucyRtYXhSZWRpcmVjdHMiLCJtYXhSZWRpcmVjdHMiLCJfb3B0aW9ucyRuYW1lZEVycm9ycyIsIm5hbWVkRXJyb3JzIiwiX29wdGlvbnMkbm9UYWdzIiwibm9UYWdzIiwiX29wdGlvbnMkc2hvcnRUYWdzIiwic2hvcnRUYWdzIiwiY3VybE9wdGlvbnMiLCJjdXJsb3B0cyIsImN1cmxDb29raWVzIiwic29ydCIsImd1enpsZSIsIl9Db2RlQnVpbGRlcjIiLCJyZXF1ZXN0Q29kZSIsInJlcXVlc3RQdXNoIiwicmVxdWVzdEpvaW4iLCJmaWVsZHMiLCJjb250ZW50cyIsImluZGV4T2YiLCJjb29raWVTdHJpbmciLCJsYXN0SW5kZW50IiwiaXRlbSIsImh0dHAxIiwiY29va2llc09iaiIsImh0dHAyIiwiZmlsZXMiLCJmaWxlIiwiZm9ybVZhbHVlIiwicGhwIiwiZ2VuZXJhdGVQb3dlcnNoZWxsQ29udmVydCIsImNvbW1hbmQiLCJjb21tYW5kT3B0aW9ucyIsInJlc3RtZXRob2QiLCJ3ZWJyZXF1ZXN0IiwicG93ZXJzaGVsbCIsImNvbmNhdFZhbHVlcyIsImNvbmNhdFR5cGUiLCJpbmRlbnRMZXZlbCIsImN1cnJlbnRJbmRlbnQiLCJjbG9zaW5nQnJhY2VJbmRlbnQiLCJvcGVuaW5nQnJhY2UiLCJjbG9zaW5nQnJhY2UiLCJ2IiwicHl0aG9uMyIsIl9yZWYkdXJpT2JqIiwic3NsQ29udGV4dCIsInBheWxvYWQiLCJoZWFkZXJDb3VudCIsImNvdW50IiwiYnVpbHRJbk1ldGhvZHMiLCJyZXF1ZXN0cyIsImhhc0ZpbGVzIiwiaGFzUGF5bG9hZCIsImpzb25QYXlsb2FkIiwicCIsIm5vbkZpbGVQYXlsb2FkIiwicHl0aG9uIiwiaHR0ciIsInF1ZXJ5U3RyaW5nIiwiZW50cmllcyIsImVudHJpZXNDb3VudCIsIl9yZWYzIiwiaXNMYXN0SXRlbSIsIm1heWJlQ29tbWEiLCJjb29raWVIZWFkZXIiLCJhY2NlcHRIZWFkZXIiLCJzZXRDb29raWVzIiwiU3RyaW5nIiwic2V0QWNjZXB0Iiwic2V0Q29udGVudFR5cGUiLCJvdGhlckhlYWRlcnMiLCJfcmVmNCIsIl9yZWY1IiwiX3JlZjYiLCJfcmVmNyIsInNldEhlYWRlcnMiLCJoZWFkZXJBZGRpdGlvbnMiLCJyIiwicmF3TWV0aG9kIiwiY2FwTWV0aG9kIiwicnVieSIsImdsb2JvZmYiLCJpbnNlY3VyZSIsImdldEFyZyIsInNob3J0IiwibG9uZ05hbWUiLCJzaG9ydE5hbWUiLCJfb3B0aW9ucyRiaW5hcnkiLCJiaW5hcnkiLCJfb3B0aW9ucyRnbG9iT2ZmIiwiZ2xvYk9mZiIsIl9vcHRpb25zJHByZXR0aWZ5SnNvbiIsInByZXR0aWZ5SnNvbiIsIl9vcHRpb25zJHNob3J0IiwiZm9ybWF0dGVkVXJsIiwidW5lc2NhcGUiLCJjb250ZW50VHlwZUhlYWRlck5hbWUiLCJub0JvdW5kYXJ5IiwicG9zdCIsInVuZW5jb2RlZCIsImVuY29kZWQiLCJuZWVkc0VuY29kaW5nIiwiZmxhZyIsImJ1aWx0UGF5bG9hZCIsImNvdWxkQmVKU09OIiwicGFyc2UiLCJodHRwaWUiLCJjZXJ0IiwicHJpbnQiLCJxdWVyeVBhcmFtcyIsInN0eWxlIiwidmVyYm9zZSIsInZlcmlmeSIsInJhdyIsImZsYWdzIiwiY2xpRmxhZ3MiLCJwb3N0RGF0YVRleHQiLCJ3Z2V0Iiwic2hlbGwiLCJidWlsZFN0cmluZyIsInN0ciIsImNvbmNhdEFycmF5IiwibGl0ZXJhbERlY2xhcmF0aW9uIiwicGFyc2VJbnQiLCJzd2lmdCIsImlzVGFyZ2V0IiwidGFyZ2V0IiwiZ290IiwiaXNDbGllbnQiLCJhZGRUYXJnZXQiLCJhZGRUYXJnZXRDbGllbnQiLCJldmVudFN0cmVhbU1hcCIsIkZvcm1EYXRhIiwicXVlcnlTdHJpbmdpZnkiLCJmb3JtYXQiLCJ1cmxGb3JtYXQiLCJ1cmxQYXJzZSIsIkRFQlVHX01PREUiLCJkZWJ1ZyIsImNvbnNvbGUiLCJpc0hhckVudHJ5IiwibG9nIiwiSFRUUFNuaXBwZXQiLCJoYXJSZXF1ZXN0IiwiX3JlcXVlc3QkY29va2llcyIsIl9yZXF1ZXN0JHBvc3REYXRhIiwiaHR0cDJWZXJzaW9uUmVnZXgiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsInJlZHVjZVJpZ2h0IiwiX3JlcXVlc3QkcG9zdERhdGEyIiwiaXNOYXRpdmVGb3JtRGF0YSIsIl9ib3VuZGFyeSIsImFwcGVuZCIsInBpcGUiLCJ1cmxXaXRoUGFyc2VkUXVlcnkiLCJxdWVyeSIsInNlYXJjaCIsInBhdGhuYW1lIiwicmVzdWx0cyIsIl9yZXF1ZXN0JHBvc3REYXRhMyIsImJvZHlTaXplIiwiaGVhZGVyc1NpemUiLCJwcmVwYXJlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNkJBQTZCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0Esc0ZBQXNGO0FBQ3RGOzs7QUFHQTtBQUNBLHFEQUFxRDtBQUNyRDs7O0FBR0E7QUFDQSxpRkFBaUY7QUFDakY7OztBQUdBO0FBQ0EsMkRBQTJEO0FBQzNEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsY0FBYztBQUM5QjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xZYTs7QUFFYixVQUFVLG1CQUFPLENBQUMseURBQVE7QUFDMUIsWUFBWSxtQkFBTyxDQUFDLGdFQUFpQjtBQUNyQyxXQUFXLG1CQUFPLENBQUMsc0RBQVE7QUFDM0IsbUJBQW1CLG1CQUFPLENBQUMsa0VBQWM7QUFDekMsZUFBZSxtQkFBTyxDQUFDLDBFQUFzQjs7QUFFN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksVUFBVTtBQUN0QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksaUJBQWlCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUEsb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdRYTs7QUFFYixrQkFBa0IsbUJBQU8sQ0FBQyx1REFBVTtBQUNwQyxhQUFhLG9GQUF3Qjs7QUFFckM7QUFDQTtBQUNBLE1BQU07QUFDTixpQkFBaUIsaUNBQWlDO0FBQ2xELGlCQUFpQixpQ0FBaUMsMkJBQTJCO0FBQzdFLE1BQU07QUFDTixnRUFBZ0U7QUFDaEUsTUFBTTtBQUNOLDZFQUE2RTtBQUM3RSxNQUFNO0FBQ047QUFDQSxpQkFBaUIsOERBQThELEdBQUc7QUFDbEYsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDakVhOztBQUViLFdBQVcsbUJBQU8sQ0FBQyxzREFBUTs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNSYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkJhOzs7QUFHYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxtQkFBTyxDQUFDLGdFQUFpQjtBQUNsQyxjQUFjLG1CQUFPLENBQUMsa0VBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxnQkFBZ0IsY0FBYztBQUM5QjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLG1CQUFtQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5T2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLCtCQUErQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDOztBQUVBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hEYTs7QUFFYixpQkFBaUIsbUJBQU8sQ0FBQywrRkFBa0M7O0FBRTNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE1BQU07QUFDbEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QixpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGlCQUFpQixlQUFlO0FBQ2hDLGdCQUFnQixnQkFBZ0I7QUFDaEMsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDcENhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQSx1Q0FBdUMsNkRBQTZELHVIQUF1SDtBQUMzTjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxpQkFBaUIsOExBQThMO0FBQy9NO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixNQUFNO0FBQ04sa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRCxRQUFRO0FBQ1Isc0RBQXNELGNBQWM7QUFDcEU7QUFDQSxNQUFNO0FBQ04sMkNBQTJDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUNwSDtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxraEJBQWtoQixzRkFBc0Y7QUFDeG1CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscVJBQXFSO0FBQ3JSLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlIQUFpSDtBQUNqSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsZUFBZSxvTEFBb0wsZ0dBQWdHO0FBQ25TO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLElBQUk7QUFDSixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdELE1BQU07QUFDTixvREFBb0QsY0FBYztBQUNsRTtBQUNBLElBQUk7QUFDSix5Q0FBeUMsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ2xIO0FBQ0EsYUFBYTtBQUNiO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEthO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsZUFBZSx5TEFBeUwsZ0NBQWdDO0FBQ3hPO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixJQUFJO0FBQ0osZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RCxNQUFNO0FBQ04sb0RBQW9ELGNBQWM7QUFDbEU7QUFDQSxJQUFJO0FBQ0oseUNBQXlDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUNsSDtBQUNBLFlBQVk7QUFDWjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9FYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHO0FBQzVHO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLGVBQWUsMExBQTBMLGdDQUFnQztBQUN6TztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsSUFBSTtBQUNKLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0QsTUFBTTtBQUNOLG9EQUFvRCxjQUFjO0FBQ2xFO0FBQ0EsSUFBSTtBQUNKLHlDQUF5Qyx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDbEg7QUFDQSxZQUFZO0FBQ1o7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwRmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRHQUE0RztBQUM1RztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RjtBQUN2RjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxlQUFlLDhMQUE4TCxnQ0FBZ0M7QUFDN087QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLElBQUk7QUFDSixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdELE1BQU07QUFDTixvREFBb0QsY0FBYztBQUNsRTtBQUNBLElBQUk7QUFDSix5Q0FBeUMsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ2xIO0FBQ0EsWUFBWTtBQUNaO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL0VhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6Q2E7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSwyQ0FBMkMsK0JBQStCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFLHlCQUF5QjtBQUN2Ryw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLGVBQWU7QUFDaEY7QUFDQSxpQkFBaUIsbUtBQW1LO0FBQ3BMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixNQUFNO0FBQ04sa0JBQWtCO0FBQ2xCO0FBQ0EsZUFBZSx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDeEY7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUiw0Q0FBNEMsY0FBYztBQUMxRDtBQUNBO0FBQ0EsZUFBZSxRQUFRLDBCQUEwQix3QkFBd0IsdURBQXVELHVCQUF1QjtBQUN2SjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLElBQUk7QUFDSjtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0MsSUFBSTtBQUNKLDZIQUE2SDtBQUM3SDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2JhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0EsK0VBQStFLDJCQUEyQjtBQUMxRztBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsZUFBZSxrS0FBa0sscUNBQXFDO0FBQ3ROO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixJQUFJO0FBQ0osZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RCxNQUFNO0FBQ04sb0RBQW9ELGNBQWM7QUFDbEU7QUFDQSxJQUFJO0FBQ0oseUNBQXlDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUNsSDtBQUNBLFlBQVk7QUFDWjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZEYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMscUJBQXFCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyw2QkFBNkIseUNBQXlDLG9CQUFvQjtBQUN6STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw4REFBOEQ7QUFDOUQ7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQSxrRUFBa0U7QUFDbEUsSUFBSTtBQUNKLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxlQUFlLHNLQUFzSztBQUNyTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsSUFBSTtBQUNKLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0QsTUFBTTtBQUNOLG9EQUFvRCxjQUFjO0FBQ2xFO0FBQ0EsSUFBSTtBQUNKLHlDQUF5Qyx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDbEg7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQSx3Q0FBd0Msd0JBQXdCLHVEQUF1RCx1QkFBdUI7QUFDOUk7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hGYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRHQUE0RztBQUM1RztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBGQUEwRiw2REFBNkQ7QUFDdkosSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQSx1Q0FBdUMscUJBQXFCO0FBQzVEO0FBQ0Esd0JBQXdCO0FBQ3hCLHlEQUF5RCwyQkFBMkIsT0FBTztBQUMzRjtBQUNBLDBCQUEwQjtBQUMxQixnR0FBZ0csd0JBQXdCO0FBQ3hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sb0VBQW9FO0FBQ3BFO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDLE1BQU07QUFDTjtBQUNBO0FBQ0EsaURBQWlELE1BQU0sMkRBQTJELFlBQVksMEJBQTBCLGtFQUFrRSxnQkFBZ0I7QUFDMU8sUUFBUTtBQUNSLDZDQUE2QyxtREFBbUQ7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrR0FBK0c7QUFDL0c7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsaUJBQWlCLG9MQUFvTCx1Q0FBdUM7QUFDNU87QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLE1BQU07QUFDTixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9ELFFBQVE7QUFDUixzREFBc0QsY0FBYztBQUNwRTtBQUNBLE1BQU07QUFDTiwyQ0FBMkMsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ3BIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRCxxQkFBcUIsa0JBQWtCLGdEQUFnRCwwSEFBMEgsbURBQW1ELDhEQUE4RDtBQUM3WDtBQUNBLHlFQUF5RSwyQ0FBMkM7QUFDcEg7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVixvREFBb0QsNEJBQTRCLFFBQVEsdUNBQXVDLHFCQUFxQixrQkFBa0IsZ0RBQWdELDBIQUEwSCxtREFBbUQsOERBQThEO0FBQ2pjO0FBQ0EseUVBQXlFLDJDQUEyQztBQUNwSDtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsTUFBTTtBQUNOLGdDQUFnQztBQUNoQztBQUNBLG1CQUFtQixvTEFBb0wsdUNBQXVDO0FBQzlPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixRQUFRO0FBQ1Isb0JBQW9CO0FBQ3BCO0FBQ0EsaUJBQWlCLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUMxRjtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQsVUFBVTtBQUNWLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUiwyREFBMkQscURBQXFELG9EQUFvRCwwQkFBMEIsdUNBQXVDLHFCQUFxQixrQkFBa0IsZ0RBQWdELDJIQUEySCw2REFBNkQ7QUFDcGY7QUFDQSx1RUFBdUUsMkNBQTJDO0FBQ2xIO0FBQ0EscUJBQXFCLE9BQU8sNEJBQTRCO0FBQ3hEO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25PYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLHFCQUFxQix5S0FBeUsseU9BQXlPO0FBQ3ZhO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFVBQVU7QUFDVixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLFlBQVk7QUFDWiwwREFBMEQsY0FBYztBQUN4RTtBQUNBLFVBQVU7QUFDViwrQ0FBK0MsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ3hIO0FBQ0EsUUFBUTtBQUNSLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixlQUFlO0FBQ3hDO0FBQ0EseUJBQXlCLHlLQUF5Syx5T0FBeU87QUFDM2E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsY0FBYztBQUNkLDBCQUEwQjtBQUMxQjtBQUNBLHVCQUF1Qix1Q0FBdUMsd0JBQXdCLFlBQVk7QUFDbEc7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsNEJBQTRCO0FBQzVCLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EsNkNBQTZDO0FBQzdDLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZLYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHO0FBQzVHO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQSw4RUFBOEUseUVBQXlFLE1BQU07QUFDN0o7QUFDQSxtQ0FBbUMseUJBQXlCLHdDQUF3QyxnRkFBZ0YseUJBQXlCLFFBQVE7QUFDck47QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLGVBQWUsaUtBQWlLLHNDQUFzQztBQUN0TjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsSUFBSTtBQUNKLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0QsTUFBTTtBQUNOLG9EQUFvRCxjQUFjO0FBQ2xFO0FBQ0EsSUFBSTtBQUNKLHlDQUF5Qyx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDbEg7QUFDQSxZQUFZO0FBQ1o7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqRWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRHQUE0RztBQUM1RztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLDBJQUEwSSx5RkFBeUYsMkJBQTJCO0FBQ3BVO0FBQ0Esa0VBQWtFO0FBQ2xFO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDREQUE0RDtBQUM1RCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckUsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLGVBQWUsbUtBQW1LO0FBQ2xMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLElBQUk7QUFDSixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdELE1BQU07QUFDTixvREFBb0QsY0FBYztBQUNsRTtBQUNBLElBQUk7QUFDSix5Q0FBeUMsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ2xIO0FBQ0EsYUFBYTtBQUNiO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckphO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsOEJBQThCO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msd0JBQXdCLHVEQUF1RCx3QkFBd0I7QUFDL0k7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsUUFBUTtBQUNSO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxNQUFNO0FBQ04sNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsUUFBUTtBQUNSO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBLGlCQUFpQiwrSkFBK0osc0NBQXNDO0FBQ3ROO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixNQUFNO0FBQ04sa0JBQWtCO0FBQ2xCO0FBQ0EsZUFBZSx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDeEY7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUiw0Q0FBNEMsY0FBYztBQUMxRDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0R2E7O0FBRWI7QUFDQTtBQUNBLFVBQVUsbUJBQU8sQ0FBQyxrREFBTztBQUN6QixTQUFTLG1CQUFPLENBQUMsc0RBQVM7QUFDMUIsU0FBUyxtQkFBTyxDQUFDLHNEQUFTO0FBQzFCLGNBQWMsbUJBQU8sQ0FBQywwREFBVztBQUNqQyxTQUFTLG1CQUFPLENBQUMsc0RBQVM7QUFDMUIsWUFBWSxtQkFBTyxDQUFDLDREQUFZO0FBQ2hDLGdCQUFnQixtQkFBTyxDQUFDLG9FQUFnQjtBQUN4QyxVQUFVLG1CQUFPLENBQUMsb0RBQVE7QUFDMUIsVUFBVSxtQkFBTyxDQUFDLHdEQUFVO0FBQzVCLFFBQVEsbUJBQU8sQ0FBQyxnREFBTTtBQUN0QixTQUFTLG1CQUFPLENBQUMsc0RBQVM7QUFDMUIsV0FBVyxtQkFBTyxDQUFDLHdEQUFVO0FBQzdCLFdBQVcsbUJBQU8sQ0FBQyx3REFBVTtBQUM3QixZQUFZLG1CQUFPLENBQUMsa0VBQWU7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLGtFQUFlO0FBQ25DLGFBQWEsbUJBQU8sQ0FBQyxvRUFBZ0I7QUFDckMsYUFBYSxtQkFBTyxDQUFDLG9FQUFnQjtBQUNyQyxpQkFBaUIsbUJBQU8sQ0FBQyw0RUFBb0I7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMsNEVBQW9CO0FBQzdDLGNBQWMsbUJBQU8sQ0FBQyxnRUFBYztBQUNwQyxPQUFPLG1CQUFPLENBQUMsa0RBQU87QUFDdEIsU0FBUyxtQkFBTyxDQUFDLHNEQUFTO0FBQzFCLFdBQVcsbUJBQU8sQ0FBQywwREFBVztBQUM5QixjQUFjLG1CQUFPLENBQUMsZ0VBQWM7QUFDcEMsaUJBQWlCLG1CQUFPLENBQUMsc0VBQWlCO0FBQzFDLFlBQVksbUJBQU8sQ0FBQyw0REFBWTtBQUNoQyxlQUFlLG1CQUFPLENBQUMsa0VBQWU7QUFDdEMsWUFBWSxtQkFBTyxDQUFDLDREQUFZO0FBQ2hDOzs7Ozs7Ozs7Ozs7QUNoQ2E7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxxQkFBcUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGO0FBQ3RGO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLG1CQUFtQiw0S0FBNEssa0NBQWtDO0FBQ2pPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixRQUFRO0FBQ1Isb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRSxVQUFVO0FBQ1Ysd0RBQXdELGNBQWM7QUFDdEU7QUFDQSxRQUFRO0FBQ1IsNkNBQTZDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUN0SDtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsNkNBQTZDO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaLG9FQUFvRTtBQUNwRTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLGlEQUFpRDtBQUNqRCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QywwREFBMEQsb0RBQW9ELHlDQUF5QyxvQkFBb0I7QUFDdk47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSw2Q0FBNkM7QUFDN0MsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EscURBQXFELHlDQUF5QyxvQkFBb0I7QUFDbEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOERBQThEO0FBQzlEO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNJYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRHQUE0RztBQUM1RztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLGVBQWUsdUtBQXVLLHFDQUFxQztBQUMzTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixJQUFJO0FBQ0osZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RCxNQUFNO0FBQ04sb0RBQW9ELGNBQWM7QUFDbEU7QUFDQSxJQUFJO0FBQ0oseUNBQXlDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUNsSDtBQUNBLFlBQVk7QUFDWjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9FYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxpQkFBaUIsaUtBQWlLO0FBQ2xMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixNQUFNO0FBQ04sa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRCxRQUFRO0FBQ1Isc0RBQXNELGNBQWM7QUFDcEU7QUFDQSxNQUFNO0FBQ04sMkNBQTJDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUNwSDtBQUNBLGVBQWUsUUFBUSwwQkFBMEIsd0JBQXdCLHVEQUF1RCx1QkFBdUI7QUFDdko7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxJQUFJO0FBQ0osNkJBQTZCO0FBQzdCO0FBQ0EsaUJBQWlCLGlLQUFpSztBQUNsTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsTUFBTTtBQUNOLGtCQUFrQjtBQUNsQjtBQUNBLGVBQWUsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ3hGO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuRmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxSUFBcUk7QUFDckk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBLHFFQUFxRSwwQkFBMEIseUVBQXlFLE9BQU87QUFDL0ssNEJBQTRCO0FBQzVCO0FBQ0EsMkNBQTJDLGdEQUFnRCwyQ0FBMkM7QUFDdEk7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGVBQWU7QUFDNUU7QUFDQSxlQUFlLGtLQUFrSyw0Q0FBNEM7QUFDN047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLElBQUk7QUFDSixnQkFBZ0I7QUFDaEI7QUFDQSxhQUFhLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUN0RjtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQsTUFBTTtBQUNOLDBDQUEwQyxjQUFjO0FBQ3hEO0FBQ0E7QUFDQSxZQUFZLFFBQVEsMEJBQTBCLHdCQUF3Qix1REFBdUQsc0JBQXNCO0FBQ25KO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHO0FBQzVHO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxlQUFlLG9LQUFvSztBQUNuTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixJQUFJO0FBQ0osZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RCxNQUFNO0FBQ04sb0RBQW9ELGNBQWM7QUFDbEU7QUFDQSxJQUFJO0FBQ0oseUNBQXlDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUNsSDtBQUNBLFlBQVk7QUFDWjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFFYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0NBQWdDO0FBQ3ZFO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBLHNHQUFzRywyQkFBMkIsaURBQWlELG9CQUFvQixnRUFBZ0U7QUFDdFEsTUFBTTtBQUNOLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0NBQWtDO0FBQ3BEO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNELFVBQVU7QUFDVixpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSx1QkFBdUIsaUxBQWlMLHdEQUF3RDtBQUNoUTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QixZQUFZO0FBQ1osd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRSxjQUFjO0FBQ2QsNERBQTRELGNBQWM7QUFDMUU7QUFDQSxZQUFZO0FBQ1osaURBQWlELHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUMxSDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osb0VBQW9FO0FBQ3BFO0FBQ0EsZ0RBQWdELDBCQUEwQixnQ0FBZ0MsNkNBQTZDLCtCQUErQiwyQ0FBMkM7QUFDak87QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsMkNBQTJDO0FBQzNDLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw4QkFBOEI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsMkJBQTJCLHFLQUFxSyxrREFBa0Q7QUFDbFA7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0IsZ0JBQWdCO0FBQ2hCLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekUsa0JBQWtCO0FBQ2xCLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0EsZ0JBQWdCO0FBQ2hCLHFEQUFxRCx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDOUg7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLE9BQU87QUFDaEMsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0JBQStCLE9BQU87QUFDbEUsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHLDJCQUEyQixpREFBaUQsb0JBQW9CLGdFQUFnRTtBQUM1USxZQUFZO0FBQ1osbUVBQW1FO0FBQ25FO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsaURBQWlEO0FBQ2pELGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5VWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLHNHQUFzRywyQkFBMkIsaURBQWlELG9CQUFvQixnRUFBZ0U7QUFDdFEsTUFBTTtBQUNOLDZEQUE2RDtBQUM3RDtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBLDBDQUEwQywrQ0FBK0MscUJBQXFCLGtCQUFrQix5REFBeUQsZUFBZTtBQUN4TTtBQUNBLGlCQUFpQiwwS0FBMEssMkNBQTJDO0FBQ3RPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixNQUFNO0FBQ04sa0JBQWtCO0FBQ2xCO0FBQ0EsZUFBZSx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDeEY7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUiw0Q0FBNEMsY0FBYztBQUMxRDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hGYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EscUJBQXFCLGlLQUFpSyxtREFBbUQ7QUFDek87QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFVBQVU7QUFDVixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLFlBQVk7QUFDWiwwREFBMEQsY0FBYztBQUN4RTtBQUNBLFVBQVU7QUFDViwrQ0FBK0MsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ3hIO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0EscUJBQXFCLGdDQUFnQztBQUNyRDtBQUNBLDBDQUEwQztBQUMxQztBQUNBLGlCQUFpQixZQUFZLDhDQUE4QywwQ0FBMEMseUNBQXlDLHlCQUF5QjtBQUN2TDtBQUNBLDJDQUEyQztBQUMzQztBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLHlDQUF5QztBQUN6QztBQUNBLE1BQU07QUFDTixnREFBZ0QsMkRBQTJELDBEQUEwRCwyQkFBMkI7QUFDaE07QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0hhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBLGtGQUFrRjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBLG9GQUFvRix5RUFBeUUsTUFBTTtBQUNuSztBQUNBLDRDQUE0QywwQ0FBMEMsa0JBQWtCO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLHFCQUFxQixxS0FBcUssa0RBQWtEO0FBQzVPO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFVBQVU7QUFDVixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLFlBQVk7QUFDWiwwREFBMEQsY0FBYztBQUN4RTtBQUNBLFVBQVU7QUFDViwrQ0FBK0MsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ3hIO0FBQ0EsbUJBQW1CLE9BQU87QUFDMUIsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EscUJBQXFCLHFLQUFxSyxrREFBa0Q7QUFDNU87QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsVUFBVTtBQUNWLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUU7QUFDbkUsWUFBWTtBQUNaLDBEQUEwRCxjQUFjO0FBQ3hFO0FBQ0EsVUFBVTtBQUNWLCtDQUErQyx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDeEg7QUFDQSxtQkFBbUIsT0FBTztBQUMxQjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0Esa0ZBQWtGO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRkFBb0YsZUFBZTtBQUNuRztBQUNBLHVCQUF1QixxS0FBcUssa0RBQWtEO0FBQzlPO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLFlBQVk7QUFDWix3QkFBd0I7QUFDeEI7QUFDQSxxQkFBcUIsdUNBQXVDLHdCQUF3QixZQUFZLDZDQUE2QztBQUM3STtBQUNBLDRDQUE0QywwQ0FBMEMsa0JBQWtCO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0EscUJBQXFCLHFLQUFxSyxrREFBa0Q7QUFDNU87QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsVUFBVTtBQUNWLHNCQUFzQjtBQUN0QjtBQUNBLG1CQUFtQix1Q0FBdUMsd0JBQXdCLGNBQWM7QUFDaEc7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsZUFBZTtBQUN4QztBQUNBLHlCQUF5QixxS0FBcUssa0RBQWtEO0FBQ2hQO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLGNBQWM7QUFDZCwwQkFBMEI7QUFDMUI7QUFDQSx1QkFBdUIsdUNBQXVDLHdCQUF3QixZQUFZO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN1FhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsdUdBQXVHLGlGQUFpRixPQUFPO0FBQ3BPO0FBQ0EsMkVBQTJFLGFBQWE7QUFDeEY7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLElBQUksSUFBSSxZQUFZLElBQUksSUFBSSxxREFBcUQsMEJBQTBCLG1CQUFtQjtBQUMxSixNQUFNO0FBQ04sbUNBQW1DLFFBQVEsTUFBTSxJQUFJLElBQUksK0JBQStCO0FBQ3hGO0FBQ0EseUdBQXlHO0FBQ3pHO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0EsNkRBQTZELDBCQUEwQix1QkFBdUIsU0FBUyx5QkFBeUI7QUFDaEo7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGlCQUFpQix3S0FBd0ssYUFBYTtBQUN0TTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixNQUFNO0FBQ04sa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRCxRQUFRO0FBQ1Isc0RBQXNELGNBQWM7QUFDcEU7QUFDQSxNQUFNO0FBQ04sMkNBQTJDLHVDQUF1Qyx3QkFBd0IsVUFBVTtBQUNwSDtBQUNBLGVBQWU7QUFDZjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLElBQUk7QUFDSjtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckZhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUYsZ0JBQWdCO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUiwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsbUJBQW1CLDJMQUEyTDtBQUM5TTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsUUFBUTtBQUNSLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakUsVUFBVTtBQUNWLHdEQUF3RCxjQUFjO0FBQ3RFO0FBQ0EsUUFBUTtBQUNSLDZDQUE2Qyx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDdEg7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGdDQUFnQztBQUNoQyxVQUFVO0FBQ1YsMkNBQTJDLGFBQWE7QUFDeEQ7QUFDQSxRQUFRO0FBQ1IsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsMERBQTBEO0FBQzFELElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrR0FBa0c7QUFDbEc7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLG9DQUFvQztBQUN2RztBQUNBLDZIQUE2SCxzQ0FBc0MsOENBQThDLDJIQUEySDtBQUM1VTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNKQUFzSiw4REFBOEQ7QUFDcE4sY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFLGNBQWM7QUFDZCxnSkFBZ0osMkZBQTJGO0FBQzNPLGNBQWM7QUFDZCwySUFBMkk7QUFDM0ksY0FBYztBQUNkLGlOQUFpTjtBQUNqTjtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLHFCQUFxQixrTEFBa0w7QUFDdk07QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFVBQVU7QUFDVixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLFlBQVk7QUFDWiwwREFBMEQsY0FBYztBQUN4RTtBQUNBLFVBQVU7QUFDViwrQ0FBK0MsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ3hIO0FBQ0EsbUJBQW1CLHlDQUF5QztBQUM1RDtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBLDhGQUE4RjtBQUM5RixRQUFRO0FBQ1I7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLHFCQUFxQixrTEFBa0w7QUFDdk07QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFVBQVU7QUFDVixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FLFlBQVk7QUFDWiwwREFBMEQsY0FBYztBQUN4RTtBQUNBLFVBQVU7QUFDViwrQ0FBK0MsdUNBQXVDLHdCQUF3QixVQUFVO0FBQ3hIO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsMkJBQTJCO0FBQzNCO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsMkJBQTJCLGtMQUFrTDtBQUM3TTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0IsZ0JBQWdCO0FBQ2hCLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekUsa0JBQWtCO0FBQ2xCLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0EsZ0JBQWdCO0FBQ2hCLHFEQUFxRCx1Q0FBdUMsd0JBQXdCLFVBQVU7QUFDOUg7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEIsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hELHdEQUF3RDtBQUN4RCxNQUFNO0FBQ04sMENBQTBDO0FBQzFDLDBDQUEwQztBQUMxQztBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEMsSUFBSTtBQUNKLG1FQUFtRTtBQUNuRTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDamVhOztBQUViO0FBQ0EscUJBQXFCLG1CQUFPLENBQUMsOERBQWdCO0FBQzdDLHVCQUF1QixtQkFBTyxDQUFDLHdFQUFxQjs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVksS0FBSztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqSkEsSUFBTUEsNkJBQTZCLEdBQUcsRUFBRTtBQUN4QyxJQUFNQyxpQkFBaUIsR0FBRyxJQUFJO0FBa0J2QixJQUFNQyxXQUFXLGdCQUFBQyxZQUFBO0FBTXRCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0UsU0FBQUQsWUFBQSxFQUF1RDtFQUFBLElBQUFFLEtBQUE7RUFBQSxJQUFBQyxJQUFBLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFKLENBQUMsQ0FBQztJQUF2Q0csT0FBTSxHQUFBSixJQUFBLENBQU5JLE1BQU07SUFBRUMsSUFBSSxHQUFBTCxJQUFBLENBQUpLLElBQUk7RUFBQUMsZUFBQSxPQUFBVCxXQUFBO0VBQUFVLGVBQUEseUJBVFEsRUFBRTtFQUFBQSxlQUFBLGVBQ25CLEVBQUU7RUFBQUEsZUFBQSwrQkFDWVosNkJBQTZCO0VBQUFZLGVBQUEsbUJBQ2pEWCxpQkFBaUI7RUFXNUI7QUFDRjtBQUNBO0VBRkVXLGVBQUEscUJBR2EsVUFBQ0MsSUFBWSxFQUEyQjtJQUFBLElBQXpCQyxnQkFBZ0IsR0FBQVIsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsQ0FBQztJQUM5QyxJQUFNRyxNQUFNLEdBQUdMLEtBQUksQ0FBQ1csb0JBQW9CLENBQUNDLE1BQU0sQ0FBQ0YsZ0JBQWdCLENBQUM7SUFDakUsVUFBQUcsTUFBQSxDQUFVUixNQUFNLEVBQUFRLE1BQUEsQ0FBR0osSUFBSTtFQUN6QixDQUFDO0VBRUQ7QUFDRjtBQUNBO0VBRkVELGVBQUEsa0JBR1UsVUFBQ0MsSUFBWSxFQUFFQyxnQkFBeUIsRUFBSztJQUNyRCxJQUFNSSxPQUFPLEdBQUdkLEtBQUksQ0FBQ2UsVUFBVSxDQUFDTixJQUFJLEVBQUVDLGdCQUFnQixDQUFDO0lBQ3ZEVixLQUFJLENBQUNnQixJQUFJLENBQUNDLE9BQU8sQ0FBQ0gsT0FBTyxDQUFDO0VBQzVCLENBQUM7RUFFRDtBQUNGO0FBQ0E7RUFGRU4sZUFBQSxlQUdPLFVBQUNDLElBQVksRUFBRUMsZ0JBQXlCLEVBQUs7SUFDbEQsSUFBTUksT0FBTyxHQUFHZCxLQUFJLENBQUNlLFVBQVUsQ0FBQ04sSUFBSSxFQUFFQyxnQkFBZ0IsQ0FBQztJQUN2RFYsS0FBSSxDQUFDZ0IsSUFBSSxDQUFDRSxJQUFJLENBQUNKLE9BQU8sQ0FBQztFQUN6QixDQUFDO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7RUFIRU4sZUFBQSxxQkFJYSxVQUFDQyxJQUFZLEVBQUs7SUFDN0IsSUFBSSxDQUFDVCxLQUFJLENBQUNnQixJQUFJLEVBQUU7TUFDZGhCLEtBQUksQ0FBQ2tCLElBQUksQ0FBQ1QsSUFBSSxDQUFDO0lBQ2pCO0lBQ0EsSUFBTVUsV0FBVyxNQUFBTixNQUFBLENBQU1iLEtBQUksQ0FBQ2dCLElBQUksQ0FBQ2hCLEtBQUksQ0FBQ2dCLElBQUksQ0FBQ2IsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFBVSxNQUFBLENBQUdKLElBQUksQ0FBRTtJQUMvRFQsS0FBSSxDQUFDZ0IsSUFBSSxDQUFDaEIsS0FBSSxDQUFDZ0IsSUFBSSxDQUFDYixNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUdnQixXQUFXO0VBQy9DLENBQUM7RUFFRDtBQUNGO0FBQ0E7RUFGRVgsZUFBQSxnQkFHUSxZQUFNO0lBQ1pSLEtBQUksQ0FBQ2dCLElBQUksQ0FBQ0UsSUFBSSxDQUFDLEVBQUUsQ0FBQztFQUNwQixDQUFDO0VBRUQ7QUFDRjtBQUNBO0VBRkVWLGVBQUEsZUFHTyxZQUFNO0lBQ1gsSUFBTVksY0FBYyxHQUFHcEIsS0FBSSxDQUFDZ0IsSUFBSSxDQUFDVixJQUFJLENBQUNOLEtBQUksQ0FBQ3FCLFFBQVEsQ0FBQztJQUNwRCxJQUFNQyxjQUFjLEdBQUd0QixLQUFJLENBQUN1QixjQUFjLENBQUNDLE1BQU0sQ0FDL0MsVUFBQ0MsV0FBVyxFQUFFQyxRQUFRO01BQUEsT0FBS0EsUUFBUSxDQUFDRCxXQUFXLENBQUM7SUFBQSxHQUNoREwsY0FDRixDQUFDO0lBQ0QsT0FBT0UsY0FBYztFQUN2QixDQUFDO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7RUFIRWQsZUFBQSwyQkFJbUIsVUFBQ21CLGFBQTRCLEVBQUs7SUFDbkQzQixLQUFJLENBQUN1QixjQUFjLE1BQUFWLE1BQUEsQ0FBQWUsa0JBQUEsQ0FBTzVCLEtBQUksQ0FBQ3VCLGNBQWMsSUFBRUksYUFBYSxFQUFDO0VBQy9ELENBQUM7RUFqRUMsSUFBSSxDQUFDaEIsb0JBQW9CLEdBQUdOLE9BQU0sSUFBSVQsNkJBQTZCO0VBQ25FLElBQUksQ0FBQ3lCLFFBQVEsR0FBR2YsSUFBSSxhQUFKQSxJQUFJLGNBQUpBLElBQUksR0FBSVQsaUJBQWlCO0FBQzNDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNnQyxZQUFZQSxDQUFDQyxRQUFhLEVBQStCO0VBQUEsSUFBN0JDLE9BQXNCLEdBQUE3QixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxDQUFDLENBQUM7RUFDckUsSUFBQThCLGtCQUFBLEdBQXNFRCxPQUFPLENBQXJFRSxTQUFTO0lBQVRBLFNBQVMsR0FBQUQsa0JBQUEsY0FBRyxHQUFHLEdBQUFBLGtCQUFBO0lBQUFFLG1CQUFBLEdBQStDSCxPQUFPLENBQXBESSxVQUFVO0lBQVZBLFVBQVUsR0FBQUQsbUJBQUEsY0FBRyxJQUFJLEdBQUFBLG1CQUFBO0lBQUFFLHFCQUFBLEdBQTRCTCxPQUFPLENBQWpDTSxjQUFjO0lBQWRBLGNBQWMsR0FBQUQscUJBQUEsY0FBRyxJQUFJLEdBQUFBLHFCQUFBO0VBRWpFLElBQU1FLFdBQVcsR0FBR1IsUUFBUSxDQUFDUyxRQUFRLENBQUMsQ0FBQztFQUV2QyxPQUFPWCxrQkFBQSxDQUFJVSxXQUFXLEVBQ25CRSxHQUFHLENBQUMsVUFBQUMsQ0FBQyxFQUFJO0lBQ1IsSUFBSUEsQ0FBQyxLQUFLLElBQUksRUFBRTtNQUNkLFVBQUE1QixNQUFBLENBQVVzQixVQUFVO0lBQ3RCLENBQUMsTUFBTSxJQUFJTSxDQUFDLEtBQUssSUFBSSxFQUFFO01BQ3JCLFVBQUE1QixNQUFBLENBQVVzQixVQUFVO0lBQ3RCLENBQUMsTUFBTSxJQUFJTSxDQUFDLEtBQUssSUFBSSxFQUFFO01BQ3JCLElBQUlKLGNBQWMsRUFBRTtRQUNsQixVQUFBeEIsTUFBQSxDQUFVc0IsVUFBVTtNQUN0QjtNQUNBLE9BQU9NLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxNQUFNLElBQUlBLENBQUMsS0FBSyxJQUFJLEVBQUU7TUFDckIsVUFBQTVCLE1BQUEsQ0FBVXNCLFVBQVU7SUFDdEIsQ0FBQyxNQUFNLElBQUlNLENBQUMsS0FBSyxJQUFJLEVBQUU7TUFDckIsSUFBSUosY0FBYyxFQUFFO1FBQ2xCLFVBQUF4QixNQUFBLENBQVVzQixVQUFVO01BQ3RCO01BQ0EsT0FBT00sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLE1BQU0sSUFBSUEsQ0FBQyxLQUFLTixVQUFVLEVBQUU7TUFDM0IsT0FBT0EsVUFBVSxHQUFHQSxVQUFVO0lBQ2hDLENBQUMsTUFBTSxJQUFJTSxDQUFDLEtBQUtSLFNBQVMsRUFBRTtNQUMxQixPQUFPRSxVQUFVLEdBQUdGLFNBQVM7SUFDL0IsQ0FBQyxNQUFNLElBQUlRLENBQUMsR0FBRyxHQUFRLElBQUlBLENBQUMsR0FBRyxHQUFRLEVBQUU7TUFDdkM7TUFDQTtNQUNBO01BQ0E7TUFDQSxPQUFPQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0YsQ0FBQyxDQUFDLENBQUNHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkM7SUFDQSxPQUFPSCxDQUFDO0VBQ1YsQ0FBQyxDQUFDLENBQ0RuQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNdUMscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBSUMsS0FBVTtFQUFBLE9BQUtqQixZQUFZLENBQUNpQixLQUFLLEVBQUU7SUFBRWIsU0FBUyxFQUFFO0VBQUksQ0FBQyxDQUFDO0FBQUE7O0FBRTVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTWMscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBSUQsS0FBVTtFQUFBLE9BQUtqQixZQUFZLENBQUNpQixLQUFLLEVBQUU7SUFBRWIsU0FBUyxFQUFFO0VBQUksQ0FBQyxDQUFDO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7K0NDdEY1RixxSkFBQWUsbUJBQUEsWUFBQUEsb0JBQUEsV0FBQUMsT0FBQSxTQUFBQSxPQUFBLE9BQUFDLEVBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLEVBQUFDLE1BQUEsR0FBQUgsRUFBQSxDQUFBSSxjQUFBLEVBQUFDLGNBQUEsR0FBQUosTUFBQSxDQUFBSSxjQUFBLGNBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxJQUFBLElBQUFGLEdBQUEsQ0FBQUMsR0FBQSxJQUFBQyxJQUFBLENBQUFaLEtBQUEsS0FBQWEsT0FBQSx3QkFBQUMsTUFBQSxHQUFBQSxNQUFBLE9BQUFDLGNBQUEsR0FBQUYsT0FBQSxDQUFBRyxRQUFBLGtCQUFBQyxtQkFBQSxHQUFBSixPQUFBLENBQUFLLGFBQUEsdUJBQUFDLGlCQUFBLEdBQUFOLE9BQUEsQ0FBQU8sV0FBQSw4QkFBQUMsT0FBQVgsR0FBQSxFQUFBQyxHQUFBLEVBQUFYLEtBQUEsV0FBQUssTUFBQSxDQUFBSSxjQUFBLENBQUFDLEdBQUEsRUFBQUMsR0FBQSxJQUFBWCxLQUFBLEVBQUFBLEtBQUEsRUFBQXNCLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFkLEdBQUEsQ0FBQUMsR0FBQSxXQUFBVSxNQUFBLG1CQUFBSSxHQUFBLElBQUFKLE1BQUEsWUFBQUEsT0FBQVgsR0FBQSxFQUFBQyxHQUFBLEVBQUFYLEtBQUEsV0FBQVUsR0FBQSxDQUFBQyxHQUFBLElBQUFYLEtBQUEsZ0JBQUEwQixLQUFBQyxPQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxXQUFBLFFBQUFDLGNBQUEsR0FBQUgsT0FBQSxJQUFBQSxPQUFBLENBQUF0QixTQUFBLFlBQUEwQixTQUFBLEdBQUFKLE9BQUEsR0FBQUksU0FBQSxFQUFBQyxTQUFBLEdBQUE1QixNQUFBLENBQUE2QixNQUFBLENBQUFILGNBQUEsQ0FBQXpCLFNBQUEsR0FBQTZCLE9BQUEsT0FBQUMsT0FBQSxDQUFBTixXQUFBLGdCQUFBckIsY0FBQSxDQUFBd0IsU0FBQSxlQUFBakMsS0FBQSxFQUFBcUMsZ0JBQUEsQ0FBQVYsT0FBQSxFQUFBRSxJQUFBLEVBQUFNLE9BQUEsTUFBQUYsU0FBQSxhQUFBSyxTQUFBQyxFQUFBLEVBQUE3QixHQUFBLEVBQUE4QixHQUFBLG1CQUFBQyxJQUFBLFlBQUFELEdBQUEsRUFBQUQsRUFBQSxDQUFBRyxJQUFBLENBQUFoQyxHQUFBLEVBQUE4QixHQUFBLGNBQUFmLEdBQUEsYUFBQWdCLElBQUEsV0FBQUQsR0FBQSxFQUFBZixHQUFBLFFBQUF0QixPQUFBLENBQUF1QixJQUFBLEdBQUFBLElBQUEsTUFBQWlCLGdCQUFBLGdCQUFBWCxVQUFBLGNBQUFZLGtCQUFBLGNBQUFDLDJCQUFBLFNBQUFDLGlCQUFBLE9BQUF6QixNQUFBLENBQUF5QixpQkFBQSxFQUFBL0IsY0FBQSxxQ0FBQWdDLFFBQUEsR0FBQTFDLE1BQUEsQ0FBQTJDLGNBQUEsRUFBQUMsdUJBQUEsR0FBQUYsUUFBQSxJQUFBQSxRQUFBLENBQUFBLFFBQUEsQ0FBQUcsTUFBQSxRQUFBRCx1QkFBQSxJQUFBQSx1QkFBQSxLQUFBN0MsRUFBQSxJQUFBRyxNQUFBLENBQUFtQyxJQUFBLENBQUFPLHVCQUFBLEVBQUFsQyxjQUFBLE1BQUErQixpQkFBQSxHQUFBRyx1QkFBQSxPQUFBRSxFQUFBLEdBQUFOLDBCQUFBLENBQUF2QyxTQUFBLEdBQUEwQixTQUFBLENBQUExQixTQUFBLEdBQUFELE1BQUEsQ0FBQTZCLE1BQUEsQ0FBQVksaUJBQUEsWUFBQU0sc0JBQUE5QyxTQUFBLGdDQUFBK0MsT0FBQSxXQUFBQyxNQUFBLElBQUFqQyxNQUFBLENBQUFmLFNBQUEsRUFBQWdELE1BQUEsWUFBQWQsR0FBQSxnQkFBQWUsT0FBQSxDQUFBRCxNQUFBLEVBQUFkLEdBQUEsc0JBQUFnQixjQUFBdkIsU0FBQSxFQUFBd0IsV0FBQSxhQUFBQyxPQUFBSixNQUFBLEVBQUFkLEdBQUEsRUFBQW1CLE9BQUEsRUFBQUMsTUFBQSxRQUFBQyxNQUFBLEdBQUF2QixRQUFBLENBQUFMLFNBQUEsQ0FBQXFCLE1BQUEsR0FBQXJCLFNBQUEsRUFBQU8sR0FBQSxtQkFBQXFCLE1BQUEsQ0FBQXBCLElBQUEsUUFBQXFCLE1BQUEsR0FBQUQsTUFBQSxDQUFBckIsR0FBQSxFQUFBeEMsS0FBQSxHQUFBOEQsTUFBQSxDQUFBOUQsS0FBQSxTQUFBQSxLQUFBLGdCQUFBK0QsT0FBQSxDQUFBL0QsS0FBQSxLQUFBTyxNQUFBLENBQUFtQyxJQUFBLENBQUExQyxLQUFBLGVBQUF5RCxXQUFBLENBQUFFLE9BQUEsQ0FBQTNELEtBQUEsQ0FBQWdFLE9BQUEsRUFBQUMsSUFBQSxXQUFBakUsS0FBQSxJQUFBMEQsTUFBQSxTQUFBMUQsS0FBQSxFQUFBMkQsT0FBQSxFQUFBQyxNQUFBLGdCQUFBbkMsR0FBQSxJQUFBaUMsTUFBQSxVQUFBakMsR0FBQSxFQUFBa0MsT0FBQSxFQUFBQyxNQUFBLFFBQUFILFdBQUEsQ0FBQUUsT0FBQSxDQUFBM0QsS0FBQSxFQUFBaUUsSUFBQSxXQUFBQyxTQUFBLElBQUFKLE1BQUEsQ0FBQTlELEtBQUEsR0FBQWtFLFNBQUEsRUFBQVAsT0FBQSxDQUFBRyxNQUFBLGdCQUFBSyxLQUFBLFdBQUFULE1BQUEsVUFBQVMsS0FBQSxFQUFBUixPQUFBLEVBQUFDLE1BQUEsU0FBQUEsTUFBQSxDQUFBQyxNQUFBLENBQUFyQixHQUFBLFNBQUE0QixlQUFBLEVBQUEzRCxjQUFBLG9CQUFBVCxLQUFBLFdBQUFBLE1BQUFzRCxNQUFBLEVBQUFkLEdBQUEsYUFBQTZCLDJCQUFBLGVBQUFaLFdBQUEsV0FBQUUsT0FBQSxFQUFBQyxNQUFBLElBQUFGLE1BQUEsQ0FBQUosTUFBQSxFQUFBZCxHQUFBLEVBQUFtQixPQUFBLEVBQUFDLE1BQUEsZ0JBQUFRLGVBQUEsR0FBQUEsZUFBQSxHQUFBQSxlQUFBLENBQUFILElBQUEsQ0FBQUksMEJBQUEsRUFBQUEsMEJBQUEsSUFBQUEsMEJBQUEscUJBQUFoQyxpQkFBQVYsT0FBQSxFQUFBRSxJQUFBLEVBQUFNLE9BQUEsUUFBQW1DLEtBQUEsc0NBQUFoQixNQUFBLEVBQUFkLEdBQUEsd0JBQUE4QixLQUFBLFlBQUFDLEtBQUEsc0RBQUFELEtBQUEsb0JBQUFoQixNQUFBLFFBQUFkLEdBQUEsU0FBQWdDLFVBQUEsV0FBQXJDLE9BQUEsQ0FBQW1CLE1BQUEsR0FBQUEsTUFBQSxFQUFBbkIsT0FBQSxDQUFBSyxHQUFBLEdBQUFBLEdBQUEsVUFBQWlDLFFBQUEsR0FBQXRDLE9BQUEsQ0FBQXNDLFFBQUEsTUFBQUEsUUFBQSxRQUFBQyxjQUFBLEdBQUFDLG1CQUFBLENBQUFGLFFBQUEsRUFBQXRDLE9BQUEsT0FBQXVDLGNBQUEsUUFBQUEsY0FBQSxLQUFBL0IsZ0JBQUEsbUJBQUErQixjQUFBLHFCQUFBdkMsT0FBQSxDQUFBbUIsTUFBQSxFQUFBbkIsT0FBQSxDQUFBeUMsSUFBQSxHQUFBekMsT0FBQSxDQUFBMEMsS0FBQSxHQUFBMUMsT0FBQSxDQUFBSyxHQUFBLHNCQUFBTCxPQUFBLENBQUFtQixNQUFBLDZCQUFBZ0IsS0FBQSxRQUFBQSxLQUFBLGdCQUFBbkMsT0FBQSxDQUFBSyxHQUFBLEVBQUFMLE9BQUEsQ0FBQTJDLGlCQUFBLENBQUEzQyxPQUFBLENBQUFLLEdBQUEsdUJBQUFMLE9BQUEsQ0FBQW1CLE1BQUEsSUFBQW5CLE9BQUEsQ0FBQTRDLE1BQUEsV0FBQTVDLE9BQUEsQ0FBQUssR0FBQSxHQUFBOEIsS0FBQSxvQkFBQVQsTUFBQSxHQUFBdkIsUUFBQSxDQUFBWCxPQUFBLEVBQUFFLElBQUEsRUFBQU0sT0FBQSxvQkFBQTBCLE1BQUEsQ0FBQXBCLElBQUEsUUFBQTZCLEtBQUEsR0FBQW5DLE9BQUEsQ0FBQTZDLElBQUEsbUNBQUFuQixNQUFBLENBQUFyQixHQUFBLEtBQUFHLGdCQUFBLHFCQUFBM0MsS0FBQSxFQUFBNkQsTUFBQSxDQUFBckIsR0FBQSxFQUFBd0MsSUFBQSxFQUFBN0MsT0FBQSxDQUFBNkMsSUFBQSxrQkFBQW5CLE1BQUEsQ0FBQXBCLElBQUEsS0FBQTZCLEtBQUEsZ0JBQUFuQyxPQUFBLENBQUFtQixNQUFBLFlBQUFuQixPQUFBLENBQUFLLEdBQUEsR0FBQXFCLE1BQUEsQ0FBQXJCLEdBQUEsbUJBQUFtQyxvQkFBQUYsUUFBQSxFQUFBdEMsT0FBQSxRQUFBOEMsVUFBQSxHQUFBOUMsT0FBQSxDQUFBbUIsTUFBQSxFQUFBQSxNQUFBLEdBQUFtQixRQUFBLENBQUF6RCxRQUFBLENBQUFpRSxVQUFBLE9BQUEzSCxTQUFBLEtBQUFnRyxNQUFBLFNBQUFuQixPQUFBLENBQUFzQyxRQUFBLHFCQUFBUSxVQUFBLElBQUFSLFFBQUEsQ0FBQXpELFFBQUEsZUFBQW1CLE9BQUEsQ0FBQW1CLE1BQUEsYUFBQW5CLE9BQUEsQ0FBQUssR0FBQSxHQUFBbEYsU0FBQSxFQUFBcUgsbUJBQUEsQ0FBQUYsUUFBQSxFQUFBdEMsT0FBQSxlQUFBQSxPQUFBLENBQUFtQixNQUFBLGtCQUFBMkIsVUFBQSxLQUFBOUMsT0FBQSxDQUFBbUIsTUFBQSxZQUFBbkIsT0FBQSxDQUFBSyxHQUFBLE9BQUEwQyxTQUFBLHVDQUFBRCxVQUFBLGlCQUFBdEMsZ0JBQUEsTUFBQWtCLE1BQUEsR0FBQXZCLFFBQUEsQ0FBQWdCLE1BQUEsRUFBQW1CLFFBQUEsQ0FBQXpELFFBQUEsRUFBQW1CLE9BQUEsQ0FBQUssR0FBQSxtQkFBQXFCLE1BQUEsQ0FBQXBCLElBQUEsU0FBQU4sT0FBQSxDQUFBbUIsTUFBQSxZQUFBbkIsT0FBQSxDQUFBSyxHQUFBLEdBQUFxQixNQUFBLENBQUFyQixHQUFBLEVBQUFMLE9BQUEsQ0FBQXNDLFFBQUEsU0FBQTlCLGdCQUFBLE1BQUF3QyxJQUFBLEdBQUF0QixNQUFBLENBQUFyQixHQUFBLFNBQUEyQyxJQUFBLEdBQUFBLElBQUEsQ0FBQUgsSUFBQSxJQUFBN0MsT0FBQSxDQUFBc0MsUUFBQSxDQUFBVyxVQUFBLElBQUFELElBQUEsQ0FBQW5GLEtBQUEsRUFBQW1DLE9BQUEsQ0FBQWtELElBQUEsR0FBQVosUUFBQSxDQUFBYSxPQUFBLGVBQUFuRCxPQUFBLENBQUFtQixNQUFBLEtBQUFuQixPQUFBLENBQUFtQixNQUFBLFdBQUFuQixPQUFBLENBQUFLLEdBQUEsR0FBQWxGLFNBQUEsR0FBQTZFLE9BQUEsQ0FBQXNDLFFBQUEsU0FBQTlCLGdCQUFBLElBQUF3QyxJQUFBLElBQUFoRCxPQUFBLENBQUFtQixNQUFBLFlBQUFuQixPQUFBLENBQUFLLEdBQUEsT0FBQTBDLFNBQUEsc0NBQUEvQyxPQUFBLENBQUFzQyxRQUFBLFNBQUE5QixnQkFBQSxjQUFBNEMsYUFBQUMsSUFBQSxRQUFBQyxLQUFBLEtBQUFDLE1BQUEsRUFBQUYsSUFBQSxZQUFBQSxJQUFBLEtBQUFDLEtBQUEsQ0FBQUUsUUFBQSxHQUFBSCxJQUFBLFdBQUFBLElBQUEsS0FBQUMsS0FBQSxDQUFBRyxVQUFBLEdBQUFKLElBQUEsS0FBQUMsS0FBQSxDQUFBSSxRQUFBLEdBQUFMLElBQUEsV0FBQU0sVUFBQSxDQUFBMUgsSUFBQSxDQUFBcUgsS0FBQSxjQUFBTSxjQUFBTixLQUFBLFFBQUE1QixNQUFBLEdBQUE0QixLQUFBLENBQUFPLFVBQUEsUUFBQW5DLE1BQUEsQ0FBQXBCLElBQUEsb0JBQUFvQixNQUFBLENBQUFyQixHQUFBLEVBQUFpRCxLQUFBLENBQUFPLFVBQUEsR0FBQW5DLE1BQUEsYUFBQXpCLFFBQUFOLFdBQUEsU0FBQWdFLFVBQUEsTUFBQUosTUFBQSxhQUFBNUQsV0FBQSxDQUFBdUIsT0FBQSxDQUFBa0MsWUFBQSxjQUFBVSxLQUFBLGlCQUFBL0MsT0FBQWdELFFBQUEsUUFBQUEsUUFBQSxRQUFBQyxjQUFBLEdBQUFELFFBQUEsQ0FBQW5GLGNBQUEsT0FBQW9GLGNBQUEsU0FBQUEsY0FBQSxDQUFBekQsSUFBQSxDQUFBd0QsUUFBQSw0QkFBQUEsUUFBQSxDQUFBYixJQUFBLFNBQUFhLFFBQUEsT0FBQUUsS0FBQSxDQUFBRixRQUFBLENBQUE3SSxNQUFBLFNBQUFnSixDQUFBLE9BQUFoQixJQUFBLFlBQUFBLEtBQUEsYUFBQWdCLENBQUEsR0FBQUgsUUFBQSxDQUFBN0ksTUFBQSxPQUFBa0QsTUFBQSxDQUFBbUMsSUFBQSxDQUFBd0QsUUFBQSxFQUFBRyxDQUFBLFVBQUFoQixJQUFBLENBQUFyRixLQUFBLEdBQUFrRyxRQUFBLENBQUFHLENBQUEsR0FBQWhCLElBQUEsQ0FBQUwsSUFBQSxPQUFBSyxJQUFBLFNBQUFBLElBQUEsQ0FBQXJGLEtBQUEsR0FBQTFDLFNBQUEsRUFBQStILElBQUEsQ0FBQUwsSUFBQSxPQUFBSyxJQUFBLFlBQUFBLElBQUEsQ0FBQUEsSUFBQSxHQUFBQSxJQUFBLGVBQUFBLElBQUEsRUFBQWIsVUFBQSxlQUFBQSxXQUFBLGFBQUF4RSxLQUFBLEVBQUExQyxTQUFBLEVBQUEwSCxJQUFBLGlCQUFBcEMsaUJBQUEsQ0FBQXRDLFNBQUEsR0FBQXVDLDBCQUFBLEVBQUFwQyxjQUFBLENBQUEwQyxFQUFBLG1CQUFBbkQsS0FBQSxFQUFBNkMsMEJBQUEsRUFBQXRCLFlBQUEsU0FBQWQsY0FBQSxDQUFBb0MsMEJBQUEsbUJBQUE3QyxLQUFBLEVBQUE0QyxpQkFBQSxFQUFBckIsWUFBQSxTQUFBcUIsaUJBQUEsQ0FBQTBELFdBQUEsR0FBQWpGLE1BQUEsQ0FBQXdCLDBCQUFBLEVBQUExQixpQkFBQSx3QkFBQWhCLE9BQUEsQ0FBQW9HLG1CQUFBLGFBQUFDLE1BQUEsUUFBQUMsSUFBQSx3QkFBQUQsTUFBQSxJQUFBQSxNQUFBLENBQUFFLFdBQUEsV0FBQUQsSUFBQSxLQUFBQSxJQUFBLEtBQUE3RCxpQkFBQSw2QkFBQTZELElBQUEsQ0FBQUgsV0FBQSxJQUFBRyxJQUFBLENBQUFFLElBQUEsT0FBQXhHLE9BQUEsQ0FBQXlHLElBQUEsYUFBQUosTUFBQSxXQUFBbkcsTUFBQSxDQUFBd0csY0FBQSxHQUFBeEcsTUFBQSxDQUFBd0csY0FBQSxDQUFBTCxNQUFBLEVBQUEzRCwwQkFBQSxLQUFBMkQsTUFBQSxDQUFBTSxTQUFBLEdBQUFqRSwwQkFBQSxFQUFBeEIsTUFBQSxDQUFBbUYsTUFBQSxFQUFBckYsaUJBQUEseUJBQUFxRixNQUFBLENBQUFsRyxTQUFBLEdBQUFELE1BQUEsQ0FBQTZCLE1BQUEsQ0FBQWlCLEVBQUEsR0FBQXFELE1BQUEsS0FBQXJHLE9BQUEsQ0FBQTRHLEtBQUEsYUFBQXZFLEdBQUEsYUFBQXdCLE9BQUEsRUFBQXhCLEdBQUEsT0FBQVkscUJBQUEsQ0FBQUksYUFBQSxDQUFBbEQsU0FBQSxHQUFBZSxNQUFBLENBQUFtQyxhQUFBLENBQUFsRCxTQUFBLEVBQUFXLG1CQUFBLGlDQUFBZCxPQUFBLENBQUFxRCxhQUFBLEdBQUFBLGFBQUEsRUFBQXJELE9BQUEsQ0FBQTZHLEtBQUEsYUFBQXJGLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsRUFBQTJCLFdBQUEsZUFBQUEsV0FBQSxLQUFBQSxXQUFBLEdBQUF3RCxPQUFBLE9BQUFDLElBQUEsT0FBQTFELGFBQUEsQ0FBQTlCLElBQUEsQ0FBQUMsT0FBQSxFQUFBQyxPQUFBLEVBQUFDLElBQUEsRUFBQUMsV0FBQSxHQUFBMkIsV0FBQSxVQUFBdEQsT0FBQSxDQUFBb0csbUJBQUEsQ0FBQTNFLE9BQUEsSUFBQXNGLElBQUEsR0FBQUEsSUFBQSxDQUFBN0IsSUFBQSxHQUFBcEIsSUFBQSxXQUFBSCxNQUFBLFdBQUFBLE1BQUEsQ0FBQWtCLElBQUEsR0FBQWxCLE1BQUEsQ0FBQTlELEtBQUEsR0FBQWtILElBQUEsQ0FBQTdCLElBQUEsV0FBQWpDLHFCQUFBLENBQUFELEVBQUEsR0FBQTlCLE1BQUEsQ0FBQThCLEVBQUEsRUFBQWhDLGlCQUFBLGdCQUFBRSxNQUFBLENBQUE4QixFQUFBLEVBQUFwQyxjQUFBLGlDQUFBTSxNQUFBLENBQUE4QixFQUFBLDZEQUFBaEQsT0FBQSxDQUFBZ0gsSUFBQSxhQUFBQyxHQUFBLFFBQUFDLE1BQUEsR0FBQWhILE1BQUEsQ0FBQStHLEdBQUEsR0FBQUQsSUFBQSxnQkFBQXhHLEdBQUEsSUFBQTBHLE1BQUEsRUFBQUYsSUFBQSxDQUFBL0ksSUFBQSxDQUFBdUMsR0FBQSxVQUFBd0csSUFBQSxDQUFBRyxPQUFBLGFBQUFqQyxLQUFBLFdBQUE4QixJQUFBLENBQUE5SixNQUFBLFNBQUFzRCxHQUFBLEdBQUF3RyxJQUFBLENBQUFJLEdBQUEsUUFBQTVHLEdBQUEsSUFBQTBHLE1BQUEsU0FBQWhDLElBQUEsQ0FBQXJGLEtBQUEsR0FBQVcsR0FBQSxFQUFBMEUsSUFBQSxDQUFBTCxJQUFBLE9BQUFLLElBQUEsV0FBQUEsSUFBQSxDQUFBTCxJQUFBLE9BQUFLLElBQUEsUUFBQWxGLE9BQUEsQ0FBQStDLE1BQUEsR0FBQUEsTUFBQSxFQUFBZCxPQUFBLENBQUE5QixTQUFBLEtBQUFvRyxXQUFBLEVBQUF0RSxPQUFBLEVBQUE2RCxLQUFBLFdBQUFBLE1BQUF1QixhQUFBLGFBQUFDLElBQUEsV0FBQXBDLElBQUEsV0FBQVQsSUFBQSxRQUFBQyxLQUFBLEdBQUF2SCxTQUFBLE9BQUEwSCxJQUFBLFlBQUFQLFFBQUEsY0FBQW5CLE1BQUEsZ0JBQUFkLEdBQUEsR0FBQWxGLFNBQUEsT0FBQXdJLFVBQUEsQ0FBQXpDLE9BQUEsQ0FBQTBDLGFBQUEsSUFBQXlCLGFBQUEsV0FBQWIsSUFBQSxrQkFBQUEsSUFBQSxDQUFBZSxNQUFBLE9BQUFuSCxNQUFBLENBQUFtQyxJQUFBLE9BQUFpRSxJQUFBLE1BQUFQLEtBQUEsRUFBQU8sSUFBQSxDQUFBN0csS0FBQSxjQUFBNkcsSUFBQSxJQUFBckosU0FBQSxNQUFBcUssSUFBQSxXQUFBQSxLQUFBLFNBQUEzQyxJQUFBLFdBQUE0QyxVQUFBLFFBQUE5QixVQUFBLElBQUFFLFVBQUEsa0JBQUE0QixVQUFBLENBQUFuRixJQUFBLFFBQUFtRixVQUFBLENBQUFwRixHQUFBLGNBQUFxRixJQUFBLEtBQUEvQyxpQkFBQSxXQUFBQSxrQkFBQWdELFNBQUEsYUFBQTlDLElBQUEsUUFBQThDLFNBQUEsTUFBQTNGLE9BQUEsa0JBQUE0RixPQUFBQyxHQUFBLEVBQUFDLE1BQUEsV0FBQXBFLE1BQUEsQ0FBQXBCLElBQUEsWUFBQW9CLE1BQUEsQ0FBQXJCLEdBQUEsR0FBQXNGLFNBQUEsRUFBQTNGLE9BQUEsQ0FBQWtELElBQUEsR0FBQTJDLEdBQUEsRUFBQUMsTUFBQSxLQUFBOUYsT0FBQSxDQUFBbUIsTUFBQSxXQUFBbkIsT0FBQSxDQUFBSyxHQUFBLEdBQUFsRixTQUFBLEtBQUEySyxNQUFBLGFBQUE1QixDQUFBLFFBQUFQLFVBQUEsQ0FBQXpJLE1BQUEsTUFBQWdKLENBQUEsU0FBQUEsQ0FBQSxRQUFBWixLQUFBLFFBQUFLLFVBQUEsQ0FBQU8sQ0FBQSxHQUFBeEMsTUFBQSxHQUFBNEIsS0FBQSxDQUFBTyxVQUFBLGlCQUFBUCxLQUFBLENBQUFDLE1BQUEsU0FBQXFDLE1BQUEsYUFBQXRDLEtBQUEsQ0FBQUMsTUFBQSxTQUFBK0IsSUFBQSxRQUFBUyxRQUFBLEdBQUEzSCxNQUFBLENBQUFtQyxJQUFBLENBQUErQyxLQUFBLGVBQUEwQyxVQUFBLEdBQUE1SCxNQUFBLENBQUFtQyxJQUFBLENBQUErQyxLQUFBLHFCQUFBeUMsUUFBQSxJQUFBQyxVQUFBLGFBQUFWLElBQUEsR0FBQWhDLEtBQUEsQ0FBQUUsUUFBQSxTQUFBb0MsTUFBQSxDQUFBdEMsS0FBQSxDQUFBRSxRQUFBLGdCQUFBOEIsSUFBQSxHQUFBaEMsS0FBQSxDQUFBRyxVQUFBLFNBQUFtQyxNQUFBLENBQUF0QyxLQUFBLENBQUFHLFVBQUEsY0FBQXNDLFFBQUEsYUFBQVQsSUFBQSxHQUFBaEMsS0FBQSxDQUFBRSxRQUFBLFNBQUFvQyxNQUFBLENBQUF0QyxLQUFBLENBQUFFLFFBQUEscUJBQUF3QyxVQUFBLFlBQUE1RCxLQUFBLHFEQUFBa0QsSUFBQSxHQUFBaEMsS0FBQSxDQUFBRyxVQUFBLFNBQUFtQyxNQUFBLENBQUF0QyxLQUFBLENBQUFHLFVBQUEsWUFBQWIsTUFBQSxXQUFBQSxPQUFBdEMsSUFBQSxFQUFBRCxHQUFBLGFBQUE2RCxDQUFBLFFBQUFQLFVBQUEsQ0FBQXpJLE1BQUEsTUFBQWdKLENBQUEsU0FBQUEsQ0FBQSxRQUFBWixLQUFBLFFBQUFLLFVBQUEsQ0FBQU8sQ0FBQSxPQUFBWixLQUFBLENBQUFDLE1BQUEsU0FBQStCLElBQUEsSUFBQWxILE1BQUEsQ0FBQW1DLElBQUEsQ0FBQStDLEtBQUEsd0JBQUFnQyxJQUFBLEdBQUFoQyxLQUFBLENBQUFHLFVBQUEsUUFBQXdDLFlBQUEsR0FBQTNDLEtBQUEsYUFBQTJDLFlBQUEsaUJBQUEzRixJQUFBLG1CQUFBQSxJQUFBLEtBQUEyRixZQUFBLENBQUExQyxNQUFBLElBQUFsRCxHQUFBLElBQUFBLEdBQUEsSUFBQTRGLFlBQUEsQ0FBQXhDLFVBQUEsS0FBQXdDLFlBQUEsY0FBQXZFLE1BQUEsR0FBQXVFLFlBQUEsR0FBQUEsWUFBQSxDQUFBcEMsVUFBQSxjQUFBbkMsTUFBQSxDQUFBcEIsSUFBQSxHQUFBQSxJQUFBLEVBQUFvQixNQUFBLENBQUFyQixHQUFBLEdBQUFBLEdBQUEsRUFBQTRGLFlBQUEsU0FBQTlFLE1BQUEsZ0JBQUErQixJQUFBLEdBQUErQyxZQUFBLENBQUF4QyxVQUFBLEVBQUFqRCxnQkFBQSxTQUFBMEYsUUFBQSxDQUFBeEUsTUFBQSxNQUFBd0UsUUFBQSxXQUFBQSxTQUFBeEUsTUFBQSxFQUFBZ0MsUUFBQSxvQkFBQWhDLE1BQUEsQ0FBQXBCLElBQUEsUUFBQW9CLE1BQUEsQ0FBQXJCLEdBQUEscUJBQUFxQixNQUFBLENBQUFwQixJQUFBLG1CQUFBb0IsTUFBQSxDQUFBcEIsSUFBQSxRQUFBNEMsSUFBQSxHQUFBeEIsTUFBQSxDQUFBckIsR0FBQSxnQkFBQXFCLE1BQUEsQ0FBQXBCLElBQUEsU0FBQW9GLElBQUEsUUFBQXJGLEdBQUEsR0FBQXFCLE1BQUEsQ0FBQXJCLEdBQUEsT0FBQWMsTUFBQSxrQkFBQStCLElBQUEseUJBQUF4QixNQUFBLENBQUFwQixJQUFBLElBQUFvRCxRQUFBLFVBQUFSLElBQUEsR0FBQVEsUUFBQSxHQUFBbEQsZ0JBQUEsS0FBQTJGLE1BQUEsV0FBQUEsT0FBQTFDLFVBQUEsYUFBQVMsQ0FBQSxRQUFBUCxVQUFBLENBQUF6SSxNQUFBLE1BQUFnSixDQUFBLFNBQUFBLENBQUEsUUFBQVosS0FBQSxRQUFBSyxVQUFBLENBQUFPLENBQUEsT0FBQVosS0FBQSxDQUFBRyxVQUFBLEtBQUFBLFVBQUEsY0FBQXlDLFFBQUEsQ0FBQTVDLEtBQUEsQ0FBQU8sVUFBQSxFQUFBUCxLQUFBLENBQUFJLFFBQUEsR0FBQUUsYUFBQSxDQUFBTixLQUFBLEdBQUE5QyxnQkFBQSx5QkFBQTRGLE9BQUE3QyxNQUFBLGFBQUFXLENBQUEsUUFBQVAsVUFBQSxDQUFBekksTUFBQSxNQUFBZ0osQ0FBQSxTQUFBQSxDQUFBLFFBQUFaLEtBQUEsUUFBQUssVUFBQSxDQUFBTyxDQUFBLE9BQUFaLEtBQUEsQ0FBQUMsTUFBQSxLQUFBQSxNQUFBLFFBQUE3QixNQUFBLEdBQUE0QixLQUFBLENBQUFPLFVBQUEsa0JBQUFuQyxNQUFBLENBQUFwQixJQUFBLFFBQUErRixNQUFBLEdBQUEzRSxNQUFBLENBQUFyQixHQUFBLEVBQUF1RCxhQUFBLENBQUFOLEtBQUEsWUFBQStDLE1BQUEsZ0JBQUFqRSxLQUFBLDhCQUFBa0UsYUFBQSxXQUFBQSxjQUFBdkMsUUFBQSxFQUFBZCxVQUFBLEVBQUFFLE9BQUEsZ0JBQUFiLFFBQUEsS0FBQXpELFFBQUEsRUFBQWtDLE1BQUEsQ0FBQWdELFFBQUEsR0FBQWQsVUFBQSxFQUFBQSxVQUFBLEVBQUFFLE9BQUEsRUFBQUEsT0FBQSxvQkFBQWhDLE1BQUEsVUFBQWQsR0FBQSxHQUFBbEYsU0FBQSxHQUFBcUYsZ0JBQUEsT0FBQXhDLE9BQUE7QUFBQSxTQUFBdUksZUFBQUMsR0FBQSxFQUFBdEMsQ0FBQSxXQUFBdUMsZUFBQSxDQUFBRCxHQUFBLEtBQUFFLHFCQUFBLENBQUFGLEdBQUEsRUFBQXRDLENBQUEsS0FBQXlDLDJCQUFBLENBQUFILEdBQUEsRUFBQXRDLENBQUEsS0FBQTBDLGdCQUFBO0FBQUEsU0FBQUEsaUJBQUEsY0FBQTdELFNBQUE7QUFBQSxTQUFBMkQsc0JBQUFGLEdBQUEsRUFBQXRDLENBQUEsUUFBQTJDLEVBQUEsV0FBQUwsR0FBQSxnQ0FBQTdILE1BQUEsSUFBQTZILEdBQUEsQ0FBQTdILE1BQUEsQ0FBQUUsUUFBQSxLQUFBMkgsR0FBQSw0QkFBQUssRUFBQSxRQUFBQyxFQUFBLEVBQUFDLEVBQUEsRUFBQUMsRUFBQSxFQUFBQyxFQUFBLEVBQUFDLElBQUEsT0FBQUMsRUFBQSxPQUFBQyxFQUFBLGlCQUFBSixFQUFBLElBQUFILEVBQUEsR0FBQUEsRUFBQSxDQUFBdEcsSUFBQSxDQUFBaUcsR0FBQSxHQUFBdEQsSUFBQSxRQUFBZ0IsQ0FBQSxRQUFBaEcsTUFBQSxDQUFBMkksRUFBQSxNQUFBQSxFQUFBLFVBQUFNLEVBQUEsdUJBQUFBLEVBQUEsSUFBQUwsRUFBQSxHQUFBRSxFQUFBLENBQUF6RyxJQUFBLENBQUFzRyxFQUFBLEdBQUFoRSxJQUFBLE1BQUFxRSxJQUFBLENBQUFqTCxJQUFBLENBQUE2SyxFQUFBLENBQUFqSixLQUFBLEdBQUFxSixJQUFBLENBQUFoTSxNQUFBLEtBQUFnSixDQUFBLEdBQUFpRCxFQUFBLGlCQUFBN0gsR0FBQSxJQUFBOEgsRUFBQSxPQUFBTCxFQUFBLEdBQUF6SCxHQUFBLHlCQUFBNkgsRUFBQSxZQUFBTixFQUFBLGVBQUFJLEVBQUEsR0FBQUosRUFBQSxjQUFBM0ksTUFBQSxDQUFBK0ksRUFBQSxNQUFBQSxFQUFBLDJCQUFBRyxFQUFBLFFBQUFMLEVBQUEsYUFBQUcsSUFBQTtBQUFBLFNBQUFULGdCQUFBRCxHQUFBLFFBQUFhLEtBQUEsQ0FBQUMsT0FBQSxDQUFBZCxHQUFBLFVBQUFBLEdBQUE7QUFBQSxTQUFBZSwyQkFBQUMsQ0FBQSxFQUFBQyxjQUFBLFFBQUFDLEVBQUEsVUFBQS9JLE1BQUEsb0JBQUE2SSxDQUFBLENBQUE3SSxNQUFBLENBQUFFLFFBQUEsS0FBQTJJLENBQUEscUJBQUFFLEVBQUEsUUFBQUwsS0FBQSxDQUFBQyxPQUFBLENBQUFFLENBQUEsTUFBQUUsRUFBQSxHQUFBZiwyQkFBQSxDQUFBYSxDQUFBLE1BQUFDLGNBQUEsSUFBQUQsQ0FBQSxXQUFBQSxDQUFBLENBQUF0TSxNQUFBLHFCQUFBd00sRUFBQSxFQUFBRixDQUFBLEdBQUFFLEVBQUEsTUFBQXhELENBQUEsVUFBQXlELENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFFBQUEzRCxDQUFBLElBQUFzRCxDQUFBLENBQUF0TSxNQUFBLFdBQUEySCxJQUFBLG1CQUFBQSxJQUFBLFNBQUFoRixLQUFBLEVBQUEySixDQUFBLENBQUF0RCxDQUFBLFVBQUE0RCxDQUFBLFdBQUFBLEVBQUFDLEdBQUEsVUFBQUEsR0FBQSxLQUFBQyxDQUFBLEVBQUFMLENBQUEsZ0JBQUE1RSxTQUFBLGlKQUFBa0YsZ0JBQUEsU0FBQUMsTUFBQSxVQUFBNUksR0FBQSxXQUFBc0ksQ0FBQSxXQUFBQSxFQUFBLElBQUFGLEVBQUEsR0FBQUEsRUFBQSxDQUFBbkgsSUFBQSxDQUFBaUgsQ0FBQSxNQUFBSyxDQUFBLFdBQUFBLEVBQUEsUUFBQU0sSUFBQSxHQUFBVCxFQUFBLENBQUF4RSxJQUFBLElBQUErRSxnQkFBQSxHQUFBRSxJQUFBLENBQUF0RixJQUFBLFNBQUFzRixJQUFBLEtBQUFMLENBQUEsV0FBQUEsRUFBQU0sR0FBQSxJQUFBRixNQUFBLFNBQUE1SSxHQUFBLEdBQUE4SSxHQUFBLEtBQUFKLENBQUEsV0FBQUEsRUFBQSxlQUFBQyxnQkFBQSxJQUFBUCxFQUFBLG9CQUFBQSxFQUFBLDhCQUFBUSxNQUFBLFFBQUE1SSxHQUFBO0FBQUEsU0FBQXFILDRCQUFBYSxDQUFBLEVBQUFhLE1BQUEsU0FBQWIsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQWMsaUJBQUEsQ0FBQWQsQ0FBQSxFQUFBYSxNQUFBLE9BQUFSLENBQUEsR0FBQTNKLE1BQUEsQ0FBQUMsU0FBQSxDQUFBYixRQUFBLENBQUFpRCxJQUFBLENBQUFpSCxDQUFBLEVBQUE3SixLQUFBLGFBQUFrSyxDQUFBLGlCQUFBTCxDQUFBLENBQUFqRCxXQUFBLEVBQUFzRCxDQUFBLEdBQUFMLENBQUEsQ0FBQWpELFdBQUEsQ0FBQUMsSUFBQSxNQUFBcUQsQ0FBQSxjQUFBQSxDQUFBLG1CQUFBUixLQUFBLENBQUFrQixJQUFBLENBQUFmLENBQUEsT0FBQUssQ0FBQSwrREFBQVcsSUFBQSxDQUFBWCxDQUFBLFVBQUFTLGlCQUFBLENBQUFkLENBQUEsRUFBQWEsTUFBQTtBQUFBLFNBQUFDLGtCQUFBOUIsR0FBQSxFQUFBaUMsR0FBQSxRQUFBQSxHQUFBLFlBQUFBLEdBQUEsR0FBQWpDLEdBQUEsQ0FBQXRMLE1BQUEsRUFBQXVOLEdBQUEsR0FBQWpDLEdBQUEsQ0FBQXRMLE1BQUEsV0FBQWdKLENBQUEsTUFBQXdFLElBQUEsT0FBQXJCLEtBQUEsQ0FBQW9CLEdBQUEsR0FBQXZFLENBQUEsR0FBQXVFLEdBQUEsRUFBQXZFLENBQUEsSUFBQXdFLElBQUEsQ0FBQXhFLENBQUEsSUFBQXNDLEdBQUEsQ0FBQXRDLENBQUEsVUFBQXdFLElBQUE7QUFBQSxTQUFBOUcsUUFBQXJELEdBQUEsc0NBQUFxRCxPQUFBLHdCQUFBakQsTUFBQSx1QkFBQUEsTUFBQSxDQUFBRSxRQUFBLGFBQUFOLEdBQUEsa0JBQUFBLEdBQUEsZ0JBQUFBLEdBQUEsV0FBQUEsR0FBQSx5QkFBQUksTUFBQSxJQUFBSixHQUFBLENBQUFnRyxXQUFBLEtBQUE1RixNQUFBLElBQUFKLEdBQUEsS0FBQUksTUFBQSxDQUFBUixTQUFBLHFCQUFBSSxHQUFBLEtBQUFxRCxPQUFBLENBQUFyRCxHQUFBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUlBLElBQU1vSyxRQUFRLEdBQUcsTUFBTTtBQUN2QixJQUFNQyxNQUFNLEdBQUcsR0FBRyxDQUFDak4sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUU1QixJQUFNa04sSUFBSSxHQUFHbEssTUFBTSxDQUFDTSxXQUFXO0FBRXhCLElBQU02SixNQUFNLEdBQUcsU0FBVEEsTUFBTUEsQ0FBSTVELE1BQVc7RUFBQSxPQUNoQ3RELE9BQUEsQ0FBT3NELE1BQU0sTUFBSyxRQUFRLElBQzFCLE9BQU9BLE1BQU0sQ0FBQzZELFdBQVcsS0FBSyxVQUFVLElBQ3hDLE9BQU83RCxNQUFNLENBQUM1RSxJQUFJLEtBQUssUUFBUSxJQUMvQixPQUFPNEUsTUFBTSxDQUFDOEQsTUFBTSxLQUFLLFVBQVUsSUFDbkMsT0FBTzlELE1BQU0sQ0FBQ1gsV0FBVyxLQUFLLFVBQVUsSUFDeEMsZUFBZSxDQUFDaUUsSUFBSSxDQUFDdEQsTUFBTSxDQUFDMkQsSUFBSSxDQUFDLENBQUM7QUFBQTtBQUVwQyxJQUFNSSxTQUFTLEdBQUcsU0FBWkEsU0FBU0EsQ0FBSUMsUUFBZ0I7RUFBQSxVQUFBdE4sTUFBQSxDQUFRZ04sTUFBTSxFQUFBaE4sTUFBQSxDQUFHc04sUUFBUSxFQUFBdE4sTUFBQSxDQUFHZ04sTUFBTSxFQUFBaE4sTUFBQSxDQUFHK00sUUFBUSxDQUFDaE4sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUFBLENBQUU7QUFFNUYsSUFBTXdOLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFJRCxRQUFnQixFQUFFMUUsSUFBWSxFQUFFNEUsS0FBcUMsRUFBSztFQUMzRixJQUFJQyxNQUFNLEdBQUcsRUFBRTtFQUVmQSxNQUFNLE9BQUF6TixNQUFBLENBQU9nTixNQUFNLEVBQUFoTixNQUFBLENBQUdzTixRQUFRLEVBQUF0TixNQUFBLENBQUcrTSxRQUFRLENBQUU7RUFDM0NVLE1BQU0sOENBQUF6TixNQUFBLENBQTZDNEksSUFBSSxPQUFHO0VBRTFELElBQUlzRSxNQUFNLENBQUNNLEtBQUssQ0FBQyxFQUFFO0lBQ2pCQyxNQUFNLG9CQUFBek4sTUFBQSxDQUFtQndOLEtBQUssQ0FBQzVFLElBQUksUUFBQTVJLE1BQUEsQ0FBSStNLFFBQVEsQ0FBRTtJQUNqRFUsTUFBTSxxQkFBQXpOLE1BQUEsQ0FBcUJ3TixLQUFLLENBQUM5SSxJQUFJLElBQUksMEJBQTBCLENBQUU7RUFDdkU7RUFFQSxVQUFBMUUsTUFBQSxDQUFVeU4sTUFBTSxFQUFBek4sTUFBQSxDQUFHK00sUUFBUSxDQUFDaE4sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRU0sSUFBTTJOLGdCQUFnQixnQkFBQXZMLG1CQUFBLEdBQUEwRyxJQUFBLENBQUcsU0FBbkI2RSxnQkFBZ0JBLENBQWNDLElBQWMsRUFBRUwsUUFBZ0I7RUFBQSxJQUFBTSxTQUFBLEVBQUFDLEtBQUEsRUFBQUMsV0FBQSxFQUFBbEYsSUFBQSxFQUFBM0csS0FBQTtFQUFBLE9BQUFFLG1CQUFBLEdBQUF3QixJQUFBLFVBQUFvSyxrQkFBQUMsUUFBQTtJQUFBLGtCQUFBQSxRQUFBLENBQUF0RSxJQUFBLEdBQUFzRSxRQUFBLENBQUExRyxJQUFBO01BQUE7UUFDekU7UUFBQXNHLFNBQUEsR0FBQWpDLDBCQUFBLENBQzRCZ0MsSUFBSTtRQUFBSyxRQUFBLENBQUF0RSxJQUFBO1FBQUFrRSxTQUFBLENBQUE1QixDQUFBO01BQUE7UUFBQSxLQUFBNkIsS0FBQSxHQUFBRCxTQUFBLENBQUEzQixDQUFBLElBQUFoRixJQUFBO1VBQUErRyxRQUFBLENBQUExRyxJQUFBO1VBQUE7UUFBQTtRQUFBd0csV0FBQSxHQUFBbkQsY0FBQSxDQUFBa0QsS0FBQSxDQUFBNUwsS0FBQSxNQUFwQjJHLElBQUksR0FBQWtGLFdBQUEsS0FBRTdMLEtBQUssR0FBQTZMLFdBQUE7UUFBQUUsUUFBQSxDQUFBMUcsSUFBQTtRQUNyQixPQUFNaUcsU0FBUyxDQUFDRCxRQUFRLEVBQUUxRSxJQUFJLEVBQUUzRyxLQUFLLENBQUM7TUFBQTtRQUFBLEtBRWxDaUwsTUFBTSxDQUFDakwsS0FBSyxDQUFDO1VBQUErTCxRQUFBLENBQUExRyxJQUFBO1VBQUE7UUFBQTtRQUNmLE9BQUEwRyxRQUFBLENBQUF0RCxhQUFBLENBQU96SSxLQUFLLENBQUNtTCxNQUFNLENBQUMsQ0FBQztNQUFBO1FBQUFZLFFBQUEsQ0FBQTFHLElBQUE7UUFBQTtNQUFBO1FBQUEwRyxRQUFBLENBQUExRyxJQUFBO1FBRXJCLE9BQU1yRixLQUFLO01BQUE7UUFBQStMLFFBQUEsQ0FBQTFHLElBQUE7UUFHYixPQUFNeUYsUUFBUTtNQUFBO1FBQUFpQixRQUFBLENBQUExRyxJQUFBO1FBQUE7TUFBQTtRQUFBMEcsUUFBQSxDQUFBMUcsSUFBQTtRQUFBO01BQUE7UUFBQTBHLFFBQUEsQ0FBQXRFLElBQUE7UUFBQXNFLFFBQUEsQ0FBQUMsRUFBQSxHQUFBRCxRQUFBO1FBQUFKLFNBQUEsQ0FBQTFCLENBQUEsQ0FBQThCLFFBQUEsQ0FBQUMsRUFBQTtNQUFBO1FBQUFELFFBQUEsQ0FBQXRFLElBQUE7UUFBQWtFLFNBQUEsQ0FBQXhCLENBQUE7UUFBQSxPQUFBNEIsUUFBQSxDQUFBekQsTUFBQTtNQUFBO1FBQUF5RCxRQUFBLENBQUExRyxJQUFBO1FBR2hCLE9BQU0rRixTQUFTLENBQUNDLFFBQVEsQ0FBQztNQUFBO01BQUE7UUFBQSxPQUFBVSxRQUFBLENBQUFwRSxJQUFBO0lBQUE7RUFBQSxHQWRkOEQsZ0JBQWdCO0FBQUEsQ0FlNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUVzQztBQUVGO0FBRTlCLElBQU1VLFFBQVEsMEJBQUFDLE1BQUE7RUFJbkIsU0FBQUQsU0FBWUUsTUFBcUIsRUFBRTtJQUFBLElBQUFDLE1BQUE7SUFBQTdPLGVBQUEsT0FBQTBPLFFBQUE7SUFDakNHLE1BQUEsR0FBQUMsVUFBQSxPQUFBSixRQUFBO0lBQVF6TyxlQUFBLENBQUE0TyxNQUFBLFVBSkgsVUFBVTtJQUFBNU8sZUFBQSxDQUFBNE8sTUFBQSxhQUNQLG1CQUFtQjtJQUFBNU8sZUFBQSxDQUFBNE8sTUFBQSxZQUNMLEVBQUU7SUFHeEJBLE1BQUEsQ0FBS0QsTUFBTSxHQUFHQSxNQUFNO0lBQ3BCOUgsS0FBSyxDQUFDaUksaUJBQWlCLENBQUFGLE1BQUEsRUFBT0EsTUFBQSxDQUFLNUYsV0FBVyxDQUFDO0lBQUMsT0FBQTRGLE1BQUE7RUFDbEQ7RUFBQ0csU0FBQSxDQUFBTixRQUFBLEVBQUFDLE1BQUE7RUFBQSxPQUFBblAsWUFBQSxDQUFBa1AsUUFBQTtBQUFBLGdCQUFBTyxnQkFBQSxDQVIyQm5JLEtBQUs7QUFXbkMsSUFBTW9JLEdBQUcsR0FBRyxJQUFJViw0Q0FBRyxDQUFDO0VBQ2xCVyxTQUFTLEVBQUU7QUFDYixDQUFDLENBQUM7QUFDRkQsR0FBRyxDQUFDRSxTQUFTLENBQUNYLHVDQUFNLENBQUM7QUFFZCxJQUFNWSxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFJQyxPQUFZLEVBQXlCO0VBQ3RFLElBQU1DLFFBQVEsR0FBR0wsR0FBRyxDQUFDTSxTQUFTLENBQUMsY0FBYyxDQUFDO0VBQzlDLElBQUksQ0FBQ0QsUUFBUSxFQUFFO0lBQ2IsTUFBTSxJQUFJekksS0FBSyxDQUFDLG1DQUFtQyxDQUFDO0VBQ3REO0VBQ0EsSUFBTTJJLEtBQUssR0FBR0YsUUFBUSxDQUFDRCxPQUFPLENBQUM7RUFDL0IsSUFBSSxDQUFDRyxLQUFLLElBQUlGLFFBQVEsQ0FBQ1gsTUFBTSxFQUFFO0lBQzdCLE1BQU0sSUFBSUYsUUFBUSxDQUFDYSxRQUFRLENBQUNYLE1BQU0sQ0FBQztFQUNyQztFQUNBLE9BQU8sSUFBSTtBQUNiLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVCRDtBQUNBO0FBQ0E7QUFDTyxJQUFNYyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQU9DLE9BQW1CLEVBQUV6RyxJQUFZO0VBQUEsT0FDaEV0RyxNQUFNLENBQUM4RyxJQUFJLENBQUNpRyxPQUFPLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLFVBQUE3QixNQUFNO0lBQUEsT0FBSUEsTUFBTSxDQUFDOEIsV0FBVyxDQUFDLENBQUMsS0FBSzNHLElBQUksQ0FBQzJHLFdBQVcsQ0FBQyxDQUFDO0VBQUEsRUFBQztBQUFBOztBQUVsRjtBQUNBO0FBQ0E7QUFDTyxJQUFNaEMsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQU84QixPQUFtQixFQUFFekcsSUFBWSxFQUFLO0VBQ2pFLElBQU00RyxVQUFVLEdBQUdKLGFBQWEsQ0FBQ0MsT0FBTyxFQUFFekcsSUFBSSxDQUFDO0VBQy9DLElBQUksQ0FBQzRHLFVBQVUsRUFBRTtJQUNmLE9BQU9qUSxTQUFTO0VBQ2xCO0VBQ0EsT0FBTzhQLE9BQU8sQ0FBQ0csVUFBVSxDQUFDO0FBQzVCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ08sSUFBTUMsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQU9KLE9BQW1CLEVBQUV6RyxJQUFZO0VBQUEsT0FDNUQ4RyxPQUFPLENBQUNOLGFBQWEsQ0FBQ0MsT0FBTyxFQUFFekcsSUFBSSxDQUFDLENBQUM7QUFBQTtBQUV2QyxJQUFNK0csWUFBWSxHQUFHLENBQ25CLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGFBQWEsRUFDYixPQUFPLENBQ0M7QUFJVjtBQUNBO0FBQ0E7QUFDTyxJQUFNQyxjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQUlDLFFBQWdCO0VBQUEsT0FDN0NGLFlBQVksQ0FBQ0csSUFBSSxDQUFDLFVBQUFwTCxJQUFJO0lBQUEsT0FBSW1MLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDckwsSUFBSSxDQUFDO0VBQUEsRUFBQztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUNyQzdDLElBQU1zTCxPQUFPLEdBQUcsU0FBVkEsT0FBT0EsQ0FDbEJwUCxXQUFnQyxFQUNoQ3FQLElBQU8sRUFDSjtFQUNILElBQU1DLFlBQVksR0FBR3RQLFdBQVcsQ0FBQ3FQLElBQUksQ0FBQ3JILElBQUksQ0FBQztFQUMzQyxJQUFJc0gsWUFBWSxLQUFLM1EsU0FBUyxFQUFFO0lBQzlCcUIsV0FBVyxDQUFDcVAsSUFBSSxDQUFDckgsSUFBSSxDQUFDLEdBQUdxSCxJQUFJLENBQUNoTyxLQUFLO0lBQ25DLE9BQU9yQixXQUFXO0VBQ3BCOztFQUVBO0VBQ0EsSUFBSTZLLEtBQUssQ0FBQ0MsT0FBTyxDQUFDd0UsWUFBWSxDQUFDLEVBQUU7SUFDL0JBLFlBQVksQ0FBQzdQLElBQUksQ0FBQzRQLElBQUksQ0FBQ2hPLEtBQUssQ0FBQztJQUM3QixPQUFPckIsV0FBVztFQUNwQjs7RUFFQTtFQUNBQSxXQUFXLENBQUNxUCxJQUFJLENBQUNySCxJQUFJLENBQUMsR0FBRyxDQUFDc0gsWUFBWSxFQUFFRCxJQUFJLENBQUNoTyxLQUFLLENBQUM7RUFDbkQsT0FBT3JCLFdBQVc7QUFDcEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3JCRDtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQU11UCxLQUFLLEdBQUcsU0FBUkEsS0FBS0EsQ0FBQSxFQUFtQjtFQUFBLElBQWZsTyxLQUFLLEdBQUE1QyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxFQUFFO0VBQzlCLElBQU0rUSxJQUFJLEdBQUcsdUJBQXVCO0VBRXBDLElBQU1DLFdBQVcsR0FBR0QsSUFBSSxDQUFDeEQsSUFBSSxDQUFDM0ssS0FBSyxDQUFDO0VBRXBDLElBQUlvTyxXQUFXLEVBQUU7SUFDZixPQUFPcE8sS0FBSztFQUNkOztFQUVBO0VBQ0EsV0FBQWpDLE1BQUEsQ0FBV2lDLEtBQUssQ0FBQ3FPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ3pDLENBQUM7QUFFTSxJQUFNQyxNQUFNLEdBQUcsU0FBVEEsTUFBTUEsQ0FBSXRPLEtBQWE7RUFBQSxPQUFLQSxLQUFLLENBQUNxTyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDQSxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCWDtBQU14RSxJQUFNRyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFBO0VBQUEsT0FDM0JuTyxNQUFNLENBQUM4RyxJQUFJLENBQUNvSCxxREFBTyxDQUFDLENBQUM3TyxHQUFHLENBQWtCLFVBQUErTyxRQUFRO0lBQUEsT0FBQUMsYUFBQSxDQUFBQSxhQUFBLEtBQzdDSCxxREFBTyxDQUFDRSxRQUFRLENBQWEsQ0FBQ3RKLElBQUk7TUFDckN3SixPQUFPLEVBQUV0TyxNQUFNLENBQUM4RyxJQUFJLENBQUNvSCxxREFBTyxDQUFDRSxRQUFRLENBQWEsQ0FBQ0csV0FBVyxDQUFDLENBQUNsUCxHQUFHLENBQ2pFLFVBQUFtUCxRQUFRO1FBQUEsT0FBSU4scURBQU8sQ0FBQ0UsUUFBUSxDQUFhLENBQUNHLFdBQVcsQ0FBQ0MsUUFBUSxDQUFDLENBQUMxSixJQUFJO01BQUEsQ0FDdEU7SUFBQztFQUFBLENBQ0QsQ0FBQztBQUFBO0FBRUUsSUFBTTJKLE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFJTCxRQUFrQjtFQUFBLElBQUFNLGlCQUFBO0VBQUEsT0FBSyxFQUFBQSxpQkFBQSxHQUFBUixxREFBTyxDQUFDRSxRQUFRLENBQUMsY0FBQU0saUJBQUEsdUJBQWpCQSxpQkFBQSxDQUFtQjVKLElBQUksQ0FBQzJKLE9BQU8sS0FBSSxFQUFFO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZHhCO0FBQ0k7QUFHekQsSUFBTUUsT0FBZSxHQUFHO0VBQzdCN0osSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsU0FBUztJQUNkc08sS0FBSyxFQUFFLFNBQVM7SUFDaEJDLElBQUksRUFBRSw2QkFBNkI7SUFDbkNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQTZEO0lBQUEsSUFBeERtRyxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUrTCxPQUFPLEdBQUFsUyxJQUFBLENBQVBrUyxPQUFPO01BQUVDLFVBQVUsR0FBQW5TLElBQUEsQ0FBVm1TLFVBQVU7TUFBRUMsVUFBVSxHQUFBcFMsSUFBQSxDQUFWb1MsVUFBVTtNQUFFQyxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO0lBQzNELElBQUFDLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUMsQ0FBQztNQUF2Q29CLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBRXpCWSxJQUFJLENBQUMsK0JBQStCLENBQUM7SUFDckNzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxtREFBQUwsTUFBQSxDQUFrRHVGLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDLFNBQUssQ0FBQztJQUNoRnZSLElBQUkseUNBQUFMLE1BQUEsQ0FBd0NzUixPQUFPLFNBQUssQ0FBQzs7SUFFekQ7SUFDQSxJQUFNakMsT0FBTyxHQUFHL00sTUFBTSxDQUFDOEcsSUFBSSxDQUFDbUksVUFBVSxDQUFDOztJQUV2QztJQUNBLElBQUlsQyxPQUFPLENBQUMvUCxNQUFNLEVBQUU7TUFDbEJxUyxLQUFLLENBQUMsQ0FBQztNQUNQdFIsSUFBSSxDQUFDLG9DQUFvQyxDQUFDO01BRTFDZ1AsT0FBTyxDQUFDL0osT0FBTyxDQUFDLFVBQUFtSSxNQUFNLEVBQUk7UUFDeEJwTixJQUFJLDJDQUFBTCxNQUFBLENBQ3VDeU4sTUFBTSxRQUFBek4sTUFBQSxDQUFLa0Msc0VBQXFCLENBQ3ZFcVAsVUFBVSxDQUFDOUQsTUFBTSxDQUNuQixDQUFDLFNBQ0gsQ0FBQztNQUNILENBQUMsQ0FBQztNQUVGcE4sSUFBSSxDQUFDLHFEQUFxRCxDQUFDO0lBQzdEOztJQUVBO0lBQ0EsSUFBSW1SLFVBQVUsQ0FBQ0ssTUFBTSxFQUFFO01BQ3JCRixLQUFLLENBQUMsQ0FBQztNQUNQdFIsSUFBSSw0Q0FBQUwsTUFBQSxDQUEyQ3dSLFVBQVUsQ0FBQ0ssTUFBTSxTQUFLLENBQUM7SUFDeEU7SUFFQSxJQUFJSixRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQkgsS0FBSyxDQUFDLENBQUM7TUFDUHRSLElBQUksOENBQUFMLE1BQUEsQ0FBOEM2QixJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLE9BQUksQ0FBQztJQUN0RjtJQUVBSCxLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLHdDQUF3QyxDQUFDO0lBRTlDLE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDckQwQztBQUVwQyxJQUFNbUMsQ0FBUyxHQUFHO0VBQ3ZCd0YsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsR0FBRztJQUNSc08sS0FBSyxFQUFFLEdBQUc7SUFDVkgsT0FBTyxFQUFFLElBQUk7SUFDYixXQUFTO0VBQ1gsQ0FBQztFQUNERixXQUFXLEVBQUU7SUFDWEksT0FBTyxFQUFQQSxvREFBT0E7RUFDVDtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFDUTtBQUFBLElBRzlEYyxPQUFPLGdCQUFBN1MsWUFBQSxDQUVYLFNBQUE2UyxRQUFZbkosSUFBWSxFQUFFO0VBQUEsSUFBQXpKLEtBQUE7RUFBQU8sZUFBQSxPQUFBcVMsT0FBQTtFQUFBcFMsZUFBQSxlQURuQixFQUFFO0VBQUFBLGVBQUEsbUJBS0U7SUFBQSxXQUFBSyxNQUFBLENBQVViLEtBQUksQ0FBQ3lKLElBQUk7RUFBQSxDQUFFO0VBSDlCLElBQUksQ0FBQ0EsSUFBSSxHQUFHQSxJQUFJO0FBQ2xCLENBQUM7QUFBQSxJQUtHb0osSUFBSSxnQkFBQTlTLFlBQUEsQ0FFUixTQUFBOFMsS0FBWUMsSUFBWSxFQUFFO0VBQUEsSUFBQTFELE1BQUE7RUFBQTdPLGVBQUEsT0FBQXNTLElBQUE7RUFBQXJTLGVBQUEsZUFEbkIsRUFBRTtFQUFBQSxlQUFBLG1CQUtFO0lBQUEsa0NBQUFLLE1BQUEsQ0FBZ0N1TyxNQUFJLENBQUMwRCxJQUFJO0VBQUEsQ0FBSTtFQUh0RCxJQUFJLENBQUNBLElBQUksR0FBR0EsSUFBSTtBQUNsQixDQUFDO0FBS0gsSUFBTUMsTUFBTSxHQUFHLFNBQVRBLE1BQU1BLENBQUlDLEtBQVcsRUFBSztFQUM5QixJQUFJQSxLQUFLLEtBQUs1UyxTQUFTLEVBQUU7SUFDdkIsT0FBTyxJQUFJO0VBQ2I7RUFFQSxJQUFJNFMsS0FBSyxLQUFLLElBQUksRUFBRTtJQUNsQixPQUFPLE1BQU07RUFDZjtFQUVBLE9BQU9BLEtBQUssQ0FBQ3hKLFdBQVcsQ0FBQ0MsSUFBSSxDQUFDMkcsV0FBVyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELElBQU02QyxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSUQsS0FBVyxFQUFLO0VBQ2hDLElBQUlELE1BQU0sQ0FBQ0MsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO0lBQzlCLE9BQU83UCxNQUFNLENBQUM4RyxJQUFJLENBQUMrSSxLQUFLLENBQUMsQ0FBQzdTLE1BQU0sS0FBSyxDQUFDO0VBQ3hDO0VBQ0EsT0FBTyxLQUFLO0FBQ2QsQ0FBQztBQUVELElBQU0rUyxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBSUYsS0FBMEIsRUFBSztFQUNsRDdQLE1BQU0sQ0FBQzhHLElBQUksQ0FBQytJLEtBQUssQ0FBQyxDQUNmRyxNQUFNLENBQUMsVUFBQUMsQ0FBQztJQUFBLE9BQUlILFFBQVEsQ0FBQ0QsS0FBSyxDQUFDSSxDQUFDLENBQUMsQ0FBQztFQUFBLEVBQUMsQ0FDL0JqTixPQUFPLENBQUMsVUFBQWlOLENBQUMsRUFBSTtJQUNaLE9BQU9KLEtBQUssQ0FBQ0ksQ0FBQyxDQUFDO0VBQ2pCLENBQUMsQ0FBQztFQUNKLE9BQU9KLEtBQUs7QUFDZCxDQUFDO0FBRUQsSUFBTUssUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUlDLE9BQWUsRUFBRU4sS0FBYSxFQUFLO0VBQ25ELElBQU1PLE9BQU8sR0FBRyxHQUFHLENBQUMzUyxNQUFNLENBQUMwUyxPQUFPLENBQUM7RUFDbkMsT0FBT04sS0FBSyxDQUFDN0IsT0FBTyxDQUFDLEtBQUssT0FBQXRRLE1BQUEsQ0FBTzBTLE9BQU8sQ0FBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCxJQUFNQyxRQUFPLEdBQUcsU0FBVkEsT0FBT0EsQ0FBSUMsRUFBTyxFQUFLO0VBQzNCLFFBQVFWLE1BQU0sQ0FBQ1UsRUFBRSxDQUFDO0lBQ2hCLEtBQUssUUFBUTtNQUNYLFlBQUE1UyxNQUFBLENBQVc0UyxFQUFFLENBQUN0QyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztJQUVwQyxLQUFLLE1BQU07TUFDVCxPQUFPc0MsRUFBRSxDQUFDbFIsUUFBUSxDQUFDLENBQUM7SUFFdEIsS0FBSyxTQUFTO01BQ1osT0FBT2tSLEVBQUUsQ0FBQ2xSLFFBQVEsQ0FBQyxDQUFDO0lBRXRCLEtBQUssTUFBTTtNQUNULE9BQU8sS0FBSztJQUVkLEtBQUssUUFBUTtNQUNYLGFBQUExQixNQUFBLENBQVk0UyxFQUFFLENBQUNDLE1BQU07SUFFdkIsS0FBSyxRQUFRO01BQUU7UUFDYjtRQUNBLElBQU1sUSxHQUFHLEdBQUdMLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ3dKLEVBQUUsQ0FBQyxDQUN4QmpTLE1BQU0sQ0FBQyxVQUFDQyxXQUFXLEVBQUVnQyxHQUFHLEVBQUs7VUFDNUIsSUFBTXlHLEdBQUcsR0FBR21KLFFBQVEsQ0FBQzVQLEdBQUcsQ0FBQ3RELE1BQU0sR0FBRyxDQUFDLEVBQUVxVCxRQUFPLENBQUNDLEVBQUUsQ0FBQ2hRLEdBQUcsQ0FBQyxDQUFDLENBQUM7VUFDdEQsVUFBQTVDLE1BQUEsQ0FBVVksV0FBVyxPQUFBWixNQUFBLENBQUk0QyxHQUFHLE9BQUE1QyxNQUFBLENBQUlxSixHQUFHO1FBQ3JDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDTHlKLElBQUksQ0FBQyxDQUFDO1FBQ1QsV0FBQTlTLE1BQUEsQ0FBV3dTLFFBQVEsQ0FBQyxDQUFDLEVBQUU3UCxHQUFHLENBQUM7TUFDN0I7SUFFQSxLQUFLLE9BQU87TUFBRTtRQUNaO1FBQ0EsSUFBTWlJLEdBQUcsR0FBR2dJLEVBQUUsQ0FDWGpTLE1BQU0sQ0FBQyxVQUFDQyxXQUFtQixFQUFFcUIsS0FBYTtVQUFBLFVBQUFqQyxNQUFBLENBQVFZLFdBQVcsT0FBQVosTUFBQSxDQUFJMlMsUUFBTyxDQUFDMVEsS0FBSyxDQUFDO1FBQUEsQ0FBRSxFQUFFLEVBQUUsQ0FBQyxDQUN0RjZRLElBQUksQ0FBQyxDQUFDO1FBQ1QsV0FBQTlTLE1BQUEsQ0FBV3dTLFFBQVEsQ0FBQyxDQUFDLEVBQUU1SCxHQUFHLENBQUM7TUFDN0I7SUFFQTtNQUFTO01BQ1AsT0FBT2dJLEVBQUUsQ0FBQ2xSLFFBQVEsQ0FBQyxDQUFDO0VBQ3hCO0FBQ0YsQ0FBQztBQUVNLElBQU1xUixRQUFnQixHQUFHO0VBQzlCM0wsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsVUFBVTtJQUNmc08sS0FBSyxFQUFFLFVBQVU7SUFDakJDLElBQUksRUFBRSxxQ0FBcUM7SUFDM0NDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQW9EOEIsT0FBTyxFQUFLO0lBQUEsSUFBM0Q4UixRQUFRLEdBQUE1VCxJQUFBLENBQVI0VCxRQUFRO01BQUV6TixNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUVrTSxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUV3QixHQUFHLEdBQUE3VCxJQUFBLENBQUg2VCxHQUFHO01BQUV6QixVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO0lBQ3JELElBQUFFLFlBQUEsR0FBdUIsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFMEIsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUUxQjtNQUFPLENBQUMsQ0FBQztNQUEzRGEsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFWixJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBQ2xCLElBQU15VCxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7SUFDNUUzTixNQUFNLEdBQUdBLE1BQU0sQ0FBQ2dLLFdBQVcsQ0FBQyxDQUFDO0lBRTdCLElBQUksQ0FBQzJELE9BQU8sQ0FBQ25ELFFBQVEsQ0FBQ3hLLE1BQU0sQ0FBQyxFQUFFO01BQzdCbEYsSUFBSSxDQUFDLHNCQUFzQixDQUFDO01BQzVCLE9BQU9aLElBQUksQ0FBQyxDQUFDO0lBQ2Y7SUFFQSxJQUFNMFQsTUFBMkIsR0FBRztNQUNsQzlELE9BQU8sRUFBRW1DLFVBQVU7TUFDbkIsY0FBYyxFQUFFd0I7SUFDbEIsQ0FBQztJQUVELFFBQVF2QixRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssa0JBQWtCO1FBQ3JCO1VBQ0VzRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSXBCLE9BQU8sQ0FBQyxNQUFNLENBQUM7VUFDNUNvQixNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcxQixRQUFRLENBQUMyQixPQUFPO1VBQ3hDLElBQU0zRixNQUFNLEdBQUcyQiwrREFBYSxDQUFDK0QsTUFBTSxDQUFDOUQsT0FBTyxFQUFFLGNBQWMsQ0FBQztVQUM1RCxJQUFJNUIsTUFBTSxFQUFFO1lBQ1YsT0FBTzBGLE1BQU0sQ0FBQzlELE9BQU8sQ0FBQzVCLE1BQU0sQ0FBQztVQUMvQjtRQUNGO1FBQ0E7TUFFRixLQUFLLG1DQUFtQztRQUN0QztVQUNFMEYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHMUIsUUFBUSxDQUFDNEIsU0FBUztVQUMxQyxJQUFNNUYsT0FBTSxHQUFHMkIsK0RBQWEsQ0FBQytELE1BQU0sQ0FBQzlELE9BQU8sRUFBRSxjQUFjLENBQUM7VUFDNUQsSUFBSTVCLE9BQU0sRUFBRTtZQUNWLE9BQU8wRixNQUFNLENBQUM5RCxPQUFPLENBQUM1QixPQUFNLENBQUM7VUFDL0I7UUFDRjtRQUNBO01BRUYsS0FBSyxZQUFZO1FBQ2Y7VUFDRTBGLE1BQU0sQ0FBQ0csSUFBSSxHQUFHN0IsUUFBUSxDQUFDSyxJQUFJO1VBQzNCLElBQU1yRSxRQUFNLEdBQUcyQiwrREFBYSxDQUFDK0QsTUFBTSxDQUFDOUQsT0FBTyxFQUFFLGNBQWMsQ0FBQztVQUM1RCxJQUFJNUIsUUFBTSxFQUFFO1lBQ1YsT0FBTzBGLE1BQU0sQ0FBQzlELE9BQU8sQ0FBQzVCLFFBQU0sQ0FBQztVQUMvQjtRQUNGO1FBQ0E7TUFFRixLQUFLLHFCQUFxQjtRQUFFO1VBQzFCLElBQUlnRSxRQUFRLENBQUMwQixNQUFNLEVBQUU7WUFDbkJBLE1BQU0sQ0FBQ0ksU0FBUyxHQUFHOUIsUUFBUSxDQUFDMEIsTUFBTSxDQUFDeFIsR0FBRyxDQUFDLFVBQUE2UixLQUFLLEVBQUk7Y0FDOUMsSUFBSUEsS0FBSyxDQUFDQyxRQUFRLElBQUksQ0FBQ0QsS0FBSyxDQUFDdlIsS0FBSyxFQUFFO2dCQUNsQyxPQUFPO2tCQUNMMkcsSUFBSSxFQUFFNEssS0FBSyxDQUFDNUssSUFBSTtrQkFDaEI4SyxPQUFPLEVBQUUsSUFBSTFCLElBQUksQ0FBQ3dCLEtBQUssQ0FBQ0MsUUFBUTtnQkFDbEMsQ0FBQztjQUNIO2NBQ0EsT0FBTztnQkFDTDdLLElBQUksRUFBRTRLLEtBQUssQ0FBQzVLLElBQUk7Z0JBQ2hCOEssT0FBTyxFQUFFRixLQUFLLENBQUN2UjtjQUNqQixDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsSUFBTXdMLFFBQU0sR0FBRzJCLCtEQUFhLENBQUMrRCxNQUFNLENBQUM5RCxPQUFPLEVBQUUsY0FBYyxDQUFDO1lBQzVELElBQUk1QixRQUFNLEVBQUU7Y0FDVixPQUFPMEYsTUFBTSxDQUFDOUQsT0FBTyxDQUFDNUIsUUFBTSxDQUFDO1lBQy9CO1VBQ0Y7VUFDQTtRQUNGO0lBQ0Y7SUFFQSxRQUFRRiwyREFBUyxDQUFDNEYsTUFBTSxDQUFDOUQsT0FBTyxFQUFFLFFBQVEsQ0FBQztNQUN6QyxLQUFLLGtCQUFrQjtRQUNyQjtVQUNFOEQsTUFBTSxDQUFDUSxNQUFNLEdBQUcsSUFBSTVCLE9BQU8sQ0FBQyxNQUFNLENBQUM7VUFFbkMsSUFBTXRFLFFBQU0sR0FBRzJCLCtEQUFhLENBQUMrRCxNQUFNLENBQUM5RCxPQUFPLEVBQUUsUUFBUSxDQUFDO1VBQ3RELElBQUk1QixRQUFNLEVBQUU7WUFDVixPQUFPMEYsTUFBTSxDQUFDOUQsT0FBTyxDQUFDNUIsUUFBTSxDQUFDO1VBQy9CO1FBQ0Y7UUFDQTtJQUNKO0lBRUFwTixJQUFJLENBQUMsMkNBQTJDLENBQUM7SUFFakQsSUFBSStSLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDYyxNQUFNLENBQUMsQ0FBQyxFQUFFO01BQ2pDOVMsSUFBSSxZQUFBTCxNQUFBLENBQVl1RixNQUFNLFNBQUF2RixNQUFBLENBQUtpVCxHQUFHLFFBQUksQ0FBQztJQUNyQyxDQUFDLE1BQU07TUFDTCxJQUFNUCxPQUFPLEdBQUcsRUFBRSxHQUFHbk4sTUFBTSxDQUFDakcsTUFBTSxHQUFHMlQsR0FBRyxDQUFDM1QsTUFBTTtNQUMvQyxJQUFNc1UsZUFBZSxHQUFHcEIsUUFBUSxDQUFDRSxPQUFPLEVBQUVDLFFBQU8sQ0FBQ04sV0FBVyxDQUFDYyxNQUFNLENBQUMsQ0FBQyxDQUFDO01BQ3ZFOVMsSUFBSSxZQUFBTCxNQUFBLENBQVl1RixNQUFNLFNBQUF2RixNQUFBLENBQUtpVCxHQUFHLFNBQUFqVCxNQUFBLENBQUs0VCxlQUFlLE1BQUcsQ0FBQztJQUN4RDtJQUVBLE9BQU9uVSxJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ2hONEM7QUFFdEMsSUFBTW9VLE9BQWUsR0FBRztFQUM3QnpNLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFNBQVM7SUFDZHNPLEtBQUssRUFBRSxTQUFTO0lBQ2hCSCxPQUFPLEVBQUUsTUFBTTtJQUNmLFdBQVM7RUFDWCxDQUFDO0VBQ0RGLFdBQVcsRUFBRTtJQUNYa0MsUUFBUSxFQUFSQSxzREFBUUE7RUFDVjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzREO0FBQ0k7QUFPekQsSUFBTWUsT0FBb0MsR0FBRztFQUNsRDFNLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFFBQVE7SUFDYnNPLEtBQUssRUFBRSxjQUFjO0lBQ3JCQyxJQUFJLEVBQUUsc0RBQXNEO0lBQzVEQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUEwRTtJQUFBLElBQTdEMlUsU0FBUyxHQUFBM1UsSUFBQSxDQUFqQm1HLE1BQU07TUFBYStMLE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87TUFBRUcsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtNQUFFRCxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO0lBQUEsSUFBSXRRLE9BQU8sR0FBQTdCLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUMxRSxJQUFBMlUscUJBQUEsR0FBdUM5UyxPQUFPLENBQXRDK1Msa0JBQWtCO01BQWxCQSxrQkFBa0IsR0FBQUQscUJBQUEsY0FBRyxLQUFLLEdBQUFBLHFCQUFBO0lBRWxDLElBQUF0QyxZQUFBLEdBQThCLElBQUl6Uyw4REFBVyxDQUFDLENBQUM7TUFBdkNvQixJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVzUixLQUFLLEdBQUFELFlBQUEsQ0FBTEMsS0FBSztNQUFFbFMsSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtJQUV6QlksSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBRTdCc1IsS0FBSyxDQUFDLENBQUM7SUFFUHRSLElBQUksWUFBQUwsTUFBQSxDQUFXc1IsT0FBTyxPQUFHLENBQUM7SUFFMUIsSUFBTWpDLE9BQU8sR0FBRy9NLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQztJQUN2QyxJQUFJbkMsT0FBTyxDQUFDL1AsTUFBTSxFQUFFO01BQ2xCZSxJQUFJLENBQUMsMEJBQTBCLENBQUM7TUFDaENnUCxPQUFPLENBQUMvSixPQUFPLENBQUMsVUFBQTFDLEdBQUcsRUFBSTtRQUNyQnZDLElBQUksUUFBQUwsTUFBQSxDQUFPNEMsR0FBRyxjQUFBNUMsTUFBQSxDQUFTa0Msc0VBQXFCLENBQUNzUCxVQUFVLENBQUM1TyxHQUFHLENBQUMsQ0FBQyxPQUFHLENBQUM7TUFDbkUsQ0FBQyxDQUFDO01BQ0Z2QyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ1g7SUFFQSxJQUFJb1IsUUFBUSxDQUFDSyxJQUFJLEVBQUU7TUFDakJ6UixJQUFJLGNBQUFMLE1BQUEsQ0FBYzZCLElBQUksQ0FBQ0MsU0FBUyxDQUFDMlAsUUFBUSxDQUFDSyxJQUFJLENBQUMsQ0FBRSxDQUFDO0lBQ3BEO0lBRUFILEtBQUssQ0FBQyxDQUFDO0lBRVAsSUFBTXBNLE1BQU0sR0FBR3dPLFNBQVMsQ0FBQ25DLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLElBQU1zQixPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7SUFFNUUsSUFBTWdCLGNBQWMsR0FBRzdFLE9BQU8sQ0FBQy9QLE1BQU0sR0FBRyxvQkFBb0IsR0FBRyxFQUFFO0lBQ2pFLElBQU02VSxXQUFXLEdBQUcxQyxRQUFRLENBQUNLLElBQUksR0FBRyxpQkFBaUIsR0FBRyxFQUFFO0lBQzFELElBQU1zQyxVQUFVLEdBQUdILGtCQUFrQixHQUFHLCtDQUErQyxHQUFHLEVBQUU7SUFFNUYsSUFBSWYsT0FBTyxDQUFDbkQsUUFBUSxDQUFDeEssTUFBTSxDQUFDLEVBQUU7TUFDNUJsRixJQUFJLDRCQUFBTCxNQUFBLENBQ3lCdUYsTUFBTSxDQUFDZ0ssV0FBVyxDQUFDLENBQUMsVUFBQXZQLE1BQUEsQ0FBT2tVLGNBQWMsRUFBQWxVLE1BQUEsQ0FBR21VLFdBQVcsRUFBQW5VLE1BQUEsQ0FBR29VLFVBQVUsQ0FDakcsQ0FBQztJQUNILENBQUMsTUFBTTtNQUNML1QsSUFBSSxtQ0FBQUwsTUFBQSxDQUMrQnVGLE1BQU0sYUFBQXZGLE1BQUEsQ0FBU2tVLGNBQWMsRUFBQWxVLE1BQUEsQ0FBR21VLFdBQVcsRUFBQW5VLE1BQUEsQ0FBR29VLFVBQVUsQ0FDM0YsQ0FBQztJQUNIO0lBRUEvVCxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFFMUIsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEV3QztBQUVsQyxJQUFNNlUsT0FBZSxHQUFHO0VBQzdCbE4sSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsU0FBUztJQUNkc08sS0FBSyxFQUFFLFNBQVM7SUFDaEJILE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBUztFQUNYLENBQUM7RUFDREYsV0FBVyxFQUFFO0lBQ1gsVUFBQWlELGtEQUFBQTtFQUNGO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYjJEO0FBQ0k7QUFDWDtBQUlyRCxJQUFNUyx1QkFBdUIsR0FBRyxTQUExQkEsdUJBQXVCQSxDQUFJL0MsVUFBaUMsRUFBSztFQUNyRSxJQUFJZ0QsZUFBZSxHQUFHakgsMkRBQVMsQ0FBQ2lFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztFQUM5RCxJQUFJLENBQUNnRCxlQUFlLEVBQUU7SUFDcEIsT0FBTyxFQUFFLENBQUMsQ0FBQztFQUNiO0VBRUEsSUFBTUMsZ0JBQXdDLEdBQUc7SUFDL0NDLElBQUksRUFBRSwyQkFBMkI7SUFDakNDLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFFRCxJQUFNekIsT0FBaUIsR0FBRyxFQUFFO0VBQzVCLElBQUksT0FBT3NCLGVBQWUsS0FBSyxRQUFRLEVBQUU7SUFDdkNBLGVBQWUsR0FBRyxDQUFDQSxlQUFlLENBQUM7RUFDckM7RUFDQUEsZUFBZSxDQUFDbFAsT0FBTyxDQUFDLFVBQUFzUCxjQUFjLEVBQUk7SUFDeENBLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDdlAsT0FBTyxDQUFDLFVBQUF3UCxRQUFRLEVBQUk7TUFDNUMsSUFBTUMsS0FBSyxHQUFHLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDRixRQUFRLENBQUM7TUFDM0MsSUFBSUMsS0FBSyxFQUFFO1FBQ1QsSUFBTXhQLE1BQU0sR0FBR2tQLGdCQUFnQixDQUFDTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSXhQLE1BQU0sRUFBRTtVQUNWMk4sT0FBTyxDQUFDN1MsSUFBSSxDQUFDa0YsTUFBTSxDQUFDO1FBQ3RCO01BQ0Y7SUFDRixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRixPQUFPMk4sT0FBTztBQUNoQixDQUFDO0FBRU0sSUFBTStCLFVBQWtCLEdBQUc7RUFDaEM3TixJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxZQUFZO0lBQ2pCc08sS0FBSyxFQUFFLFlBQVk7SUFDbkJDLElBQUksRUFBRSx3RUFBd0U7SUFDOUVDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQThDOEIsT0FBTyxFQUFLO0lBQUEsSUFBQWdVLGdCQUFBLEVBQUFDLGlCQUFBO0lBQUEsSUFBckQzRCxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO01BQUVDLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRWxNLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFBRStMLE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87SUFDL0MsSUFBTThELElBQUksR0FBQXpFLGFBQUE7TUFDUm5SLE1BQU0sRUFBRTtJQUFNLEdBQ1gwQixPQUFPLENBQ1g7SUFFRCxJQUFBd1EsWUFBQSxHQUF1QixJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtNQUFPLENBQUMsQ0FBQztNQUF2RGEsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFWixJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBRWxCWSxJQUFJLENBQUMsZ0NBQWdDLENBQUM7SUFDdEMsSUFBSWdWLGFBQWEsR0FBRyxFQUFFO0lBQ3RCLElBQU1DLE9BQU8sR0FBRzVGLE9BQU8sQ0FBQzhCLFVBQVUsQ0FBQ0ssTUFBTSxDQUFDO0lBQzFDLElBQU0wRCxvQkFBb0IsR0FBR2hCLHVCQUF1QixDQUFDL0MsVUFBVSxDQUFDO0lBQ2hFLElBQUk4RCxPQUFPLElBQUlDLG9CQUFvQixDQUFDalcsTUFBTSxFQUFFO01BQzFDK1YsYUFBYSxHQUFHLGVBQWU7TUFDL0JoVixJQUFJLENBQUMsMkNBQTJDLENBQUM7TUFDakRBLElBQUksQ0FBQyxHQUFHLENBQUM7TUFDVCxJQUFJaVYsT0FBTyxFQUFFO1FBQ1g7UUFDQWpWLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7TUFDaEM7TUFDQSxJQUFJa1Ysb0JBQW9CLENBQUNqVyxNQUFNLEVBQUU7UUFDL0I7UUFDQWUsSUFBSSw2QkFBQUwsTUFBQSxDQUE2QnVWLG9CQUFvQixDQUFDOVYsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFLLENBQUMsQ0FBQztNQUMxRTtNQUNBWSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ1o7SUFFQUEsSUFBSSxnQ0FBQUwsTUFBQSxDQUFnQ3FWLGFBQWEsT0FBSSxDQUFDO0lBRXREaFYsSUFBSSxDQUFDLHNDQUFzQyxDQUFDO0lBQzVDQSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRVQsSUFBTTZTLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUM7SUFDckYzTixNQUFNLEdBQUdBLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDO0lBQzdCLElBQUlyTSxNQUFNLElBQUkyTixPQUFPLENBQUNuRCxRQUFRLENBQUN4SyxNQUFNLENBQUMsRUFBRTtNQUN0QztNQUNBQSxNQUFNLGlCQUFBdkYsTUFBQSxDQUFpQnVGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQXZGLE1BQUEsQ0FBR3VGLE1BQU0sQ0FBQ2lRLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ2pHLFdBQVcsQ0FBQyxDQUFDLENBQUU7SUFDeEUsQ0FBQyxNQUFNO01BQ0w7TUFDQWhLLE1BQU0sdUJBQUF2RixNQUFBLENBQXNCdUYsTUFBTSxRQUFJO0lBQ3hDO0lBQ0FsRixJQUFJLGFBQUFMLE1BQUEsQ0FBYXVGLE1BQU0sUUFBSyxDQUFDLENBQUM7SUFFOUJsRixJQUFJLDJCQUFBTCxNQUFBLENBQTBCc1IsT0FBTyxXQUFPLENBQUMsQ0FBQztJQUU5QyxJQUFNakMsT0FBb0MsR0FBRy9NLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDYyxNQUFNLENBQUMsVUFBQTdFLE1BQU0sRUFBSTtNQUNwRixRQUFRQSxNQUFNLENBQUM4QixXQUFXLENBQUMsQ0FBQztRQUMxQixLQUFLLGNBQWM7UUFDbkIsS0FBSyxnQkFBZ0I7UUFDckIsS0FBSyxpQkFBaUI7VUFDcEI7VUFDQSxPQUFPLEtBQUs7UUFFZDtVQUNFLE9BQU8sSUFBSTtNQUNmO0lBQ0YsQ0FBQyxDQUFDO0lBRUYsSUFBSUYsT0FBTyxDQUFDL1AsTUFBTSxFQUFFO01BQ2xCZSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztNQUNwQkEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7TUFDWmdQLE9BQU8sQ0FBQy9KLE9BQU8sQ0FBQyxVQUFBMUMsR0FBRyxFQUFJO1FBQ3JCdkMsSUFBSSxRQUFBTCxNQUFBLENBQU80QyxHQUFHLFlBQUE1QyxNQUFBLENBQU9rQyxzRUFBcUIsQ0FBQ3NQLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBQyxDQUFDLFlBQVEsQ0FBQyxDQUFDO01BQ3ZFLENBQUMsQ0FBQztNQUNGdkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDZjtJQUVBLElBQUlvUixRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQixJQUFNMkQsV0FBVyxHQUFHaEUsUUFBUSxDQUFDNUIsUUFBUTtNQUNyQyxRQUFRNEYsV0FBVztRQUNqQixLQUFLLG1DQUFtQztVQUN0Q3BWLElBQUksQ0FBQyxvRUFBb0UsRUFBRSxDQUFDLENBQUM7VUFDN0VBLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1VBQ1osQ0FBQTZVLGdCQUFBLEdBQUF6RCxRQUFRLENBQUMwQixNQUFNLGNBQUErQixnQkFBQSxlQUFmQSxnQkFBQSxDQUFpQjVQLE9BQU8sQ0FBQyxVQUFBa08sS0FBSyxFQUFJO1lBQ2hDblQsSUFBSSxRQUFBTCxNQUFBLENBQU93VCxLQUFLLENBQUM1SyxJQUFJLFlBQUE1SSxNQUFBLENBQU93VCxLQUFLLENBQUN2UixLQUFLLFlBQVEsQ0FBQyxDQUFDO1VBQ25ELENBQUMsQ0FBQztVQUNGNUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7VUFDZDtRQUVGLEtBQUsscUJBQXFCO1VBQ3hCQSxJQUFJLENBQUMsd0NBQXdDLEVBQUUsQ0FBQyxDQUFDO1VBQ2pEQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztVQUNaLENBQUE4VSxpQkFBQSxHQUFBMUQsUUFBUSxDQUFDMEIsTUFBTSxjQUFBZ0MsaUJBQUEsZUFBZkEsaUJBQUEsQ0FBaUI3UCxPQUFPLENBQUMsVUFBQWtPLEtBQUssRUFBSTtZQUNoQ25ULElBQUksc0JBQUFMLE1BQUEsQ0FBc0I2QixJQUFJLENBQUNDLFNBQVMsQ0FBQzBSLEtBQUssQ0FBQ3ZSLEtBQUssSUFBSSxFQUFFLENBQUMsUUFBSyxDQUFDLENBQUM7WUFDbEU1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNaQSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNwQkEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDWixJQUFJbVQsS0FBSyxDQUFDaUMsV0FBVyxFQUFFO2NBQ3JCcFYsSUFBSSw2Q0FBQUwsTUFBQSxDQUE0Q3dULEtBQUssQ0FBQ2lDLFdBQVcsV0FBTyxDQUFDLENBQUM7WUFDNUU7WUFDQXBWLElBQUksQ0FBQyxxRUFBcUUsRUFBRSxDQUFDLENBQUM7WUFDOUVBLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1pBLElBQUksYUFBQUwsTUFBQSxDQUFZd1QsS0FBSyxDQUFDNUssSUFBSSxVQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFJNEssS0FBSyxDQUFDQyxRQUFRLEVBQUU7Y0FDbEJwVCxJQUFJLGlCQUFBTCxNQUFBLENBQWdCd1QsS0FBSyxDQUFDQyxRQUFRLFVBQU0sQ0FBQyxDQUFDO1lBQzVDO1lBQ0FwVCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNaQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNaQSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztVQUNmLENBQUMsQ0FBQztVQUVGQSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztVQUNiO1FBRUY7VUFDRUEsSUFBSSxnQ0FBQUwsTUFBQSxDQUFnQzZCLElBQUksQ0FBQ0MsU0FBUyxDQUFDMlAsUUFBUSxDQUFDSyxJQUFJLElBQUksRUFBRSxDQUFDLFFBQUssQ0FBQyxDQUFDO1VBQzlFelIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7VUFDWkEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7VUFDcEJBLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1VBQ1pBLElBQUksNkNBQUFMLE1BQUEsQ0FBNEN5VixXQUFXLFVBQU0sQ0FBQyxDQUFDO1VBQ25FcFYsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7VUFDWkEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7VUFDWjtNQUNKO0lBQ0Y7SUFDQUEsSUFBSSxDQUFDLElBQUksQ0FBQzs7SUFFVjtJQUNBQSxJQUFJLENBQUMsd0RBQXdELENBQUM7SUFDOURBLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDVEEsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsQ0FBQztJQUM5Q0EsSUFBSSxDQUFDLHdEQUF3RCxFQUFFLENBQUMsQ0FBQztJQUNqRUEsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztJQUNuQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUVULE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxSzJEO0FBQ0k7QUFDWDtBQUc5QyxJQUFNaVcsU0FBaUIsR0FBRztFQUMvQnRPLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFdBQVc7SUFDaEJzTyxLQUFLLEVBQUUsV0FBVztJQUNsQkMsSUFBSSxFQUFFLHVCQUF1QjtJQUM3QkMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBc0U7SUFBQSxJQUFqRW9TLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRWpNLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFBRStMLE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87TUFBRUMsVUFBVSxHQUFBblMsSUFBQSxDQUFWbVMsVUFBVTtNQUFFK0QsT0FBTyxHQUFBbFcsSUFBQSxDQUFQa1csT0FBTztNQUFFN0QsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtJQUNwRSxJQUFBQyxZQUFBLEdBQXVCLElBQUl6Uyw4REFBVyxDQUFDLENBQUM7TUFBaENvQixJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVaLElBQUksR0FBQWlTLFlBQUEsQ0FBSmpTLElBQUk7SUFDbEIsSUFBTWtXLGlCQUFpQixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM1RixRQUFRLENBQzdGeEssTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQ3JCLENBQUM7SUFFRCxJQUFJLENBQUMrRCxpQkFBaUIsRUFBRTtNQUN0QixPQUFPLHNCQUFzQjtJQUMvQjtJQUVBdFYsSUFBSSxrQ0FBQUwsTUFBQSxDQUFpQ3NSLE9BQU8sU0FBSyxDQUFDO0lBQ2xEalIsSUFBSSx5Q0FBQUwsTUFBQSxDQUF5Q3VGLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDLE9BQUksQ0FBQzs7SUFFdEU7O0lBRUF0UCxNQUFNLENBQUM4RyxJQUFJLENBQUNtSSxVQUFVLENBQUMsQ0FBQ2pNLE9BQU8sQ0FBQyxVQUFBMUMsR0FBRyxFQUFJO01BQ3JDdkMsSUFBSSx3QkFBQUwsTUFBQSxDQUF1QjRDLEdBQUcsWUFBQTVDLE1BQUEsQ0FBT2tDLHNFQUFxQixDQUFDcVAsVUFBVSxDQUFDM08sR0FBRyxDQUFDLENBQUMsU0FBSyxDQUFDO0lBQ25GLENBQUMsQ0FBQztJQUVGMFMsT0FBTyxDQUFDaFEsT0FBTyxDQUFDLFVBQUFzUSxLQUFBLEVBQXFCO01BQUEsSUFBbEJoTixJQUFJLEdBQUFnTixLQUFBLENBQUpoTixJQUFJO1FBQUUzRyxLQUFLLEdBQUEyVCxLQUFBLENBQUwzVCxLQUFLO01BQzVCNUIsSUFBSSx3QkFBQUwsTUFBQSxDQUF1QjRJLElBQUksWUFBQTVJLE1BQUEsQ0FBT2lDLEtBQUssU0FBSyxDQUFDO0lBQ25ELENBQUMsQ0FBQztJQUVGLElBQUl3UCxRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQixJQUFNckUsTUFBTSxHQUFHRiwyREFBUyxDQUFDaUUsVUFBVSxFQUFFLGNBQWMsQ0FBQztNQUNwRCxJQUFNTSxJQUFJLEdBQUdqUSxJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDO01BQzFDelIsSUFBSSwyQkFBQUwsTUFBQSxDQUEwQnlOLE1BQU0sVUFBQXpOLE1BQUEsQ0FBTThSLElBQUksa0NBQStCLENBQUM7SUFDaEY7SUFFQXpSLElBQUksQ0FBQyxtREFBbUQsQ0FBQztJQUN6RCxPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzQ2dEO0FBQ0Y7QUFFeEMsSUFBTW9XLE1BQWMsR0FBRztFQUM1QnpPLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFFBQVE7SUFDYnNPLEtBQUssRUFBRSxJQUFJO0lBQ1hILE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBUztFQUNYLENBQUM7RUFFREYsV0FBVyxFQUFFO0lBQ1hvRSxVQUFVLEVBQVZBLDBEQUFVO0lBQ1ZTLFNBQVMsRUFBVEEsd0RBQVNBO0VBQ1g7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQ0k7QUFXekQsSUFBTTVCLE9BQStCLEdBQUc7RUFDN0MxTSxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxRQUFRO0lBQ2JzTyxLQUFLLEVBQUUsWUFBWTtJQUNuQkMsSUFBSSxFQUFFLDRDQUE0QztJQUNsREMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBK0Q7SUFBQSxJQUExRHFTLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRWxNLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFBRWlNLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUYsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztJQUFBLElBQUlwUSxPQUFPLEdBQUE3QixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxDQUFDLENBQUM7SUFDL0QsSUFBQXFTLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFO01BQUssQ0FBQyxDQUFDO01BQXZEbVMsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRXRSLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRVosSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtJQUV6QixJQUFBcVcscUJBQUEsR0FNSTVVLE9BQU8sQ0FMVDZVLGVBQWU7TUFBZkEsZUFBZSxHQUFBRCxxQkFBQSxjQUFHLElBQUksR0FBQUEscUJBQUE7TUFBQUUsb0JBQUEsR0FLcEI5VSxPQUFPLENBSlQrVSxXQUFXO01BQVhBLFdBQVcsR0FBQUQsb0JBQUEsY0FBRyxLQUFLLEdBQUFBLG9CQUFBO01BQUFFLGtCQUFBLEdBSWpCaFYsT0FBTyxDQUhUaVYsU0FBUztNQUFUQSxTQUFTLEdBQUFELGtCQUFBLGNBQUcsSUFBSSxHQUFBQSxrQkFBQTtNQUFBRSxnQkFBQSxHQUdkbFYsT0FBTyxDQUZUbVYsT0FBTztNQUFQQSxPQUFPLEdBQUFELGdCQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLGdCQUFBO01BQUFwQyxxQkFBQSxHQUVWOVMsT0FBTyxDQURUK1Msa0JBQWtCO01BQWxCQSxrQkFBa0IsR0FBQUQscUJBQUEsY0FBRyxLQUFLLEdBQUFBLHFCQUFBO0lBRzVCLElBQU1zQyxnQkFBZ0IsR0FBR0wsV0FBVyxHQUFHLEtBQUssR0FBRyxHQUFHO0lBRWxELElBQU16VyxNQUFNLEdBQUd1VyxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFFdEMsSUFBTVEsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUEsRUFBUztNQUN2QixJQUFJTixXQUFXLEVBQUU7UUFDZjVWLElBQUksQ0FBQyxpQkFBaUIsRUFBRWIsTUFBTSxDQUFDO1FBQy9CYSxJQUFJLENBQUMsWUFBWSxFQUFFYixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlCYSxJQUFJLENBQUMsR0FBRyxFQUFFYixNQUFNLENBQUM7TUFDbkI7SUFDRixDQUFDOztJQUVEO0lBQ0EsSUFBSXVXLGVBQWUsRUFBRTtNQUNuQjFWLElBQUksQ0FBQyxjQUFjLENBQUM7TUFDcEJzUixLQUFLLENBQUMsQ0FBQztNQUNQdFIsSUFBSSxDQUFDLFVBQVUsQ0FBQztNQUNoQkEsSUFBSSxDQUFDLE9BQU8sRUFBRWIsTUFBTSxDQUFDO01BRXJCLElBQUk2VyxPQUFPLEdBQUcsQ0FBQyxFQUFFO1FBQ2ZoVyxJQUFJLENBQUMsUUFBUSxFQUFFYixNQUFNLENBQUM7TUFDeEI7TUFFQSxJQUFJeVUsa0JBQWtCLEVBQUU7UUFDdEI1VCxJQUFJLENBQUMsY0FBYyxFQUFFYixNQUFNLENBQUM7TUFDOUI7TUFFQSxJQUFJaVMsUUFBUSxDQUFDSyxJQUFJLEVBQUU7UUFDakJ6UixJQUFJLENBQUMsV0FBVyxFQUFFYixNQUFNLENBQUM7TUFDM0I7TUFFQWEsSUFBSSxDQUFDLFlBQVksRUFBRWIsTUFBTSxDQUFDO01BRTFCLElBQUkyVyxTQUFTLEVBQUU7UUFDYjlWLElBQUksQ0FBQyxNQUFNLEVBQUViLE1BQU0sQ0FBQztNQUN0QjtNQUVBYSxJQUFJLENBQUMsR0FBRyxDQUFDO01BQ1RzUixLQUFLLENBQUMsQ0FBQztNQUNQdFIsSUFBSSxDQUFDLGVBQWUsQ0FBQztNQUNyQnNSLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7O0lBRUE7SUFDQSxJQUFJc0Msa0JBQWtCLEVBQUU7TUFDdEI1VCxJQUFJLENBQUMsc0VBQXNFLEVBQUViLE1BQU0sQ0FBQztNQUNwRmEsSUFBSSxDQUFDLDJFQUEyRSxFQUFFYixNQUFNLENBQUM7SUFDM0Y7O0lBRUE7SUFDQSxJQUFNZ1gsVUFBVSxHQUFHSCxPQUFPLEdBQUcsQ0FBQztJQUM5QixJQUFNSSxTQUFTLEdBQUdELFVBQVUsSUFBSXZDLGtCQUFrQjtJQUNsRCxJQUFNeUMsTUFBTSxHQUFHRCxTQUFTLEdBQUcsUUFBUSxHQUFHLG9CQUFvQjtJQUUxRCxJQUFJQSxTQUFTLEVBQUU7TUFDYnBXLElBQUksQ0FBQyx3QkFBd0IsRUFBRWIsTUFBTSxDQUFDO01BRXRDLElBQUlnWCxVQUFVLEVBQUU7UUFDZG5XLElBQUksMkJBQUFMLE1BQUEsQ0FBMkJxVyxPQUFPLHVCQUFvQjdXLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDdkU7TUFFQSxJQUFJeVUsa0JBQWtCLEVBQUU7UUFDdEI1VCxJQUFJLENBQUMsK0JBQStCLEVBQUViLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDbkQ7TUFFQWEsSUFBSSxDQUFDLEdBQUcsRUFBRWIsTUFBTSxDQUFDO01BQ2pCbVMsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBdFIsSUFBSSxhQUFBTCxNQUFBLENBQVlzUixPQUFPLFNBQUs5UixNQUFNLENBQUM7SUFDbkNtUyxLQUFLLENBQUMsQ0FBQzs7SUFFUDtJQUNBLElBQUlGLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO01BQ2pCelIsSUFBSSxpQ0FBQUwsTUFBQSxDQUFpQzZCLElBQUksQ0FBQ0MsU0FBUyxDQUFDMlAsUUFBUSxDQUFDSyxJQUFJLENBQUMsUUFBS3RTLE1BQU0sQ0FBQztNQUM5RW1TLEtBQUssQ0FBQyxDQUFDO01BQ1B0UixJQUFJLFNBQUFMLE1BQUEsQ0FBU3NXLGdCQUFnQiw0QkFBQXRXLE1BQUEsQ0FBd0J1RixNQUFNLHdCQUFvQi9GLE1BQU0sQ0FBQztNQUN0Rm1TLEtBQUssQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxNQUFNO01BQ0x0UixJQUFJLFNBQUFMLE1BQUEsQ0FBU3NXLGdCQUFnQiw0QkFBQXRXLE1BQUEsQ0FBd0J1RixNQUFNLG9CQUFnQi9GLE1BQU0sQ0FBQztNQUNsRm1TLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7SUFFQTRFLFVBQVUsQ0FBQyxDQUFDOztJQUVaO0lBQ0EsSUFBSWpVLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDbFMsTUFBTSxFQUFFO01BQ2xDZ0QsTUFBTSxDQUFDOEcsSUFBSSxDQUFDb0ksVUFBVSxDQUFDLENBQUNsTSxPQUFPLENBQUMsVUFBQTFDLEdBQUcsRUFBSTtRQUNyQ3ZDLElBQUkscUJBQUFMLE1BQUEsQ0FBb0I0QyxHQUFHLFlBQUE1QyxNQUFBLENBQU9rQyxzRUFBcUIsQ0FBQ3NQLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBQyxDQUFDLFVBQU1wRCxNQUFNLENBQUM7TUFDdkYsQ0FBQyxDQUFDO01BRUZtUyxLQUFLLENBQUMsQ0FBQztJQUNUOztJQUVBO0lBQ0F0UixJQUFJLFNBQUFMLE1BQUEsQ0FBU3NXLGdCQUFnQixVQUFBdFcsTUFBQSxDQUFPMFcsTUFBTSxlQUFZbFgsTUFBTSxDQUFDO0lBQzdEK1csVUFBVSxDQUFDLENBQUM7O0lBRVo7SUFDQSxJQUFJSixTQUFTLEVBQUU7TUFDYnhFLEtBQUssQ0FBQyxDQUFDO01BQ1B0UixJQUFJLENBQUMsd0JBQXdCLEVBQUViLE1BQU0sQ0FBQztNQUN0Q2EsSUFBSSxVQUFBTCxNQUFBLENBQVVzVyxnQkFBZ0IsK0JBQTRCOVcsTUFBTSxDQUFDO01BQ2pFK1csVUFBVSxDQUFDLENBQUM7SUFDZDs7SUFFQTtJQUNBNUUsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQyxrQkFBa0IsRUFBRWIsTUFBTSxDQUFDO0lBRWhDLElBQUkyVyxTQUFTLEVBQUU7TUFDYjlWLElBQUksQ0FBQywyQkFBMkIsRUFBRWIsTUFBTSxDQUFDO0lBQzNDOztJQUVBO0lBQ0EsSUFBSXVXLGVBQWUsRUFBRTtNQUNuQnBFLEtBQUssQ0FBQyxDQUFDO01BQ1B0UixJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ1g7SUFFQSxPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqS3dDO0FBRWxDLElBQU1rWCxFQUFVLEdBQUc7RUFDeEJ2UCxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxJQUFJO0lBQ1RzTyxLQUFLLEVBQUUsSUFBSTtJQUNYSCxPQUFPLEVBQUUsS0FBSztJQUNkLFdBQVM7RUFDWCxDQUFDO0VBQ0RGLFdBQVcsRUFBRTtJQUNYLFVBQUFpRCxrREFBQUE7RUFDRjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFHNUQsSUFBTThDLElBQUksR0FBRyxNQUFNO0FBUW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNQyxNQUE2QixHQUFHO0VBQzNDelAsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsU0FBUztJQUNkc08sS0FBSyxFQUFFLFVBQVU7SUFDakJDLElBQUksRUFBRSxxQ0FBcUM7SUFDM0NDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQW1FOEIsT0FBTyxFQUFLO0lBQUEsSUFBMUVxRSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUrTCxPQUFPLEdBQUFsUyxJQUFBLENBQVBrUyxPQUFPO01BQUV3RixNQUFNLEdBQUExWCxJQUFBLENBQU4wWCxNQUFNO01BQUVDLFdBQVcsR0FBQTNYLElBQUEsQ0FBWDJYLFdBQVc7TUFBRXZGLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUMsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtJQUNwRSxJQUFNMkQsSUFBSSxHQUFBekUsYUFBQTtNQUNScUcsV0FBVyxFQUFFLEtBQUs7TUFDbEJDLGlCQUFpQixFQUFFLElBQUk7TUFDdkJDLFFBQVEsRUFBRTtJQUFJLEdBQ1hoVyxPQUFPLENBQ1g7O0lBRUQ7SUFDQTtJQUNBLElBQUF3USxZQUFBLEdBQThCLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRSxFQUFFO1FBQUVDLElBQUksRUFBRW1YO01BQUssQ0FBQyxDQUFDO01BQWpFakYsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRXRSLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRVosSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTs7SUFFekI7SUFDQTtJQUNBO0lBQ0EsSUFBTTBYLFVBQVUsR0FBRy9CLElBQUksQ0FBQzRCLFdBQVcsR0FBRzFGLE9BQU8sR0FBR3dGLE1BQU0sQ0FBQzdFLElBQUk7O0lBRTNEO0lBQ0E1UixJQUFJLElBQUFMLE1BQUEsQ0FBSXVGLE1BQU0sT0FBQXZGLE1BQUEsQ0FBSW1YLFVBQVUsT0FBQW5YLE1BQUEsQ0FBSStXLFdBQVcsQ0FBRSxDQUFDO0lBRTlDLElBQU1LLFVBQVUsR0FBRzlVLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQztJQUMxQztJQUNBNEYsVUFBVSxDQUFDOVIsT0FBTyxDQUFDLFVBQUExQyxHQUFHLEVBQUk7TUFDeEI7TUFDQSxJQUFNeVUsY0FBYyxHQUFHelUsR0FBRyxDQUFDMk0sV0FBVyxDQUFDLENBQUMsQ0FBQ2UsT0FBTyxDQUFDLFlBQVksRUFBRSxVQUFBNkIsS0FBSztRQUFBLE9BQUlBLEtBQUssQ0FBQ1AsV0FBVyxDQUFDLENBQUM7TUFBQSxFQUFDO01BQzVGdlIsSUFBSSxJQUFBTCxNQUFBLENBQUlxWCxjQUFjLFFBQUFyWCxNQUFBLENBQUt3UixVQUFVLENBQUM1TyxHQUFHLENBQUMsQ0FBRSxDQUFDO0lBQy9DLENBQUMsQ0FBQzs7SUFFRjtJQUNBO0lBQ0EsSUFBSXdTLElBQUksQ0FBQzhCLFFBQVEsSUFBSSxDQUFDRSxVQUFVLENBQUNySCxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDakQxUCxJQUFJLFVBQUFMLE1BQUEsQ0FBVThXLE1BQU0sQ0FBQ1EsSUFBSSxDQUFFLENBQUM7SUFDOUI7O0lBRUE7SUFDQTtJQUNBLElBQUlsQyxJQUFJLENBQUM2QixpQkFBaUIsSUFBSXhGLFFBQVEsQ0FBQ0ssSUFBSSxJQUFJLENBQUNzRixVQUFVLENBQUNySCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtNQUNyRixJQUFNelEsTUFBTSxHQUFHaVksTUFBTSxDQUFDQyxVQUFVLENBQUMvRixRQUFRLENBQUNLLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQ3BRLFFBQVEsQ0FBQyxDQUFDO01BQ25FckIsSUFBSSxvQkFBQUwsTUFBQSxDQUFvQlYsTUFBTSxDQUFFLENBQUM7SUFDbkM7O0lBRUE7SUFDQXFTLEtBQUssQ0FBQyxDQUFDOztJQUVQO0lBQ0EsSUFBTThGLGFBQWEsR0FBR2hZLElBQUksQ0FBQyxDQUFDOztJQUU1QjtJQUNBLElBQU1pWSxXQUFXLEdBQUdqRyxRQUFRLENBQUNLLElBQUksSUFBSSxFQUFFOztJQUV2QztJQUNBO0lBQ0EsVUFBQTlSLE1BQUEsQ0FBVXlYLGFBQWEsRUFBQXpYLE1BQUEsQ0FBRzRXLElBQUksRUFBQTVXLE1BQUEsQ0FBRzBYLFdBQVc7RUFDOUM7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDdkZ5QztBQUVuQyxJQUFNQyxJQUFZLEdBQUc7RUFDMUJ2USxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxNQUFNO0lBQ1hzTyxLQUFLLEVBQUUsTUFBTTtJQUNiSCxPQUFPLEVBQUUsSUFBSTtJQUNiLFdBQVM7RUFDWCxDQUFDO0VBQ0RGLFdBQVcsRUFBRTtJQUNYLFNBQVMsRUFBRWdHLG1EQUFNQTtFQUNuQjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU0RDtBQUNJO0FBR3pELElBQU1lLFNBQWlCLEdBQUc7RUFDL0J4USxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxXQUFXO0lBQ2hCc08sS0FBSyxFQUFFLFdBQVc7SUFDbEJDLElBQUksRUFBRSxzREFBc0Q7SUFDNURDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQThDOEIsT0FBTyxFQUFLO0lBQUEsSUFBckRxRSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUVpTSxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO01BQUVDLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUgsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztJQUMvQyxJQUFNOEQsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFO0lBQUksR0FDVDBCLE9BQU8sQ0FDWDtJQUNELElBQUF3USxZQUFBLEdBQThCLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BQTlEbVMsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRXRSLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRVosSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtJQUV6QlksSUFBSSxDQUFDLHdEQUF3RCxDQUFDO0lBRTlEQSxJQUFJLHFCQUFBTCxNQUFBLENBQW9CdUYsTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsWUFBQTVSLE1BQUEsQ0FBT3NSLE9BQU8sUUFBSSxDQUFDOztJQUUvRDtJQUNBaFAsTUFBTSxDQUFDOEcsSUFBSSxDQUFDb0ksVUFBVSxDQUFDLENBQUNsTSxPQUFPLENBQUMsVUFBQTFDLEdBQUcsRUFBSTtNQUNyQ3ZDLElBQUksaUJBQUFMLE1BQUEsQ0FBZ0I0QyxHQUFHLFlBQUE1QyxNQUFBLENBQU9rQyxzRUFBcUIsQ0FBQ3NQLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBQyxDQUFDLFVBQU0sQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQztJQUVGLElBQUk2TyxRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQnpSLElBQUksYUFBQUwsTUFBQSxDQUFhNkIsSUFBSSxDQUFDQyxTQUFTLENBQUMyUCxRQUFRLENBQUNLLElBQUksQ0FBQyxRQUFLLENBQUMsQ0FBQztJQUN2RDtJQUVBelIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDckJBLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7SUFDakNBLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLENBQUM7SUFDM0NBLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ25Cc1IsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUV2QixPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsREQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU0RDtBQUNJO0FBT3pELElBQU1vWSxPQUFlLEdBQUc7RUFDN0J6USxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxTQUFTO0lBQ2RzTyxLQUFLLEVBQUUsZUFBZTtJQUN0QkMsSUFBSSxFQUFFLDJEQUEyRDtJQUNqRUMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBOEM4QixPQUFPLEVBQUs7SUFBQSxJQUFyRHNRLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUYsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztNQUFFL0wsTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFa00sUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtJQUMvQyxJQUFNMkQsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFO0lBQUksR0FDVDBCLE9BQU8sQ0FDWDtJQUVELElBQUF3USxZQUFBLEdBQXVCLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BQXZEYSxJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVaLElBQUksR0FBQWlTLFlBQUEsQ0FBSmpTLElBQUk7SUFFbEJZLElBQUksQ0FBQyxnREFBZ0QsQ0FBQztJQUN0REEsSUFBSSxzQkFBQUwsTUFBQSxDQUFxQnNSLE9BQU8sV0FBTyxDQUFDLENBQUM7SUFFekNoUCxNQUFNLENBQUM4RyxJQUFJLENBQUNvSSxVQUFVLENBQUMsQ0FBQ2xNLE9BQU8sQ0FBQyxVQUFBMUMsR0FBRyxFQUFJO01BQ3JDdkMsSUFBSSxjQUFBTCxNQUFBLENBQWE0QyxHQUFHLFlBQUE1QyxNQUFBLENBQU9rQyxzRUFBcUIsQ0FBQ3NQLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBQyxDQUFDLFVBQU0sQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQztJQUVGLElBQUk2TyxRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQnpSLElBQUksY0FBQUwsTUFBQSxDQUNVdUYsTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsOENBQUE1UixNQUFBLENBQTBDNkIsSUFBSSxDQUFDQyxTQUFTLENBQ3RGMlAsUUFBUSxDQUFDSyxJQUNYLENBQUMsU0FDRCxDQUNGLENBQUM7SUFDSCxDQUFDLE1BQU07TUFDTHpSLElBQUksY0FBQUwsTUFBQSxDQUFhdUYsTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsK0NBQTJDLENBQUMsQ0FBQztJQUNwRjtJQUVBdlIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFFcEJBLElBQUksQ0FDRixpSEFDRixDQUFDO0lBQ0RBLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQztJQUU1QyxPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1REQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU0RDtBQUNJO0FBR3pELElBQU1xWSxNQUFjLEdBQUc7RUFDNUIxUSxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxRQUFRO0lBQ2JzTyxLQUFLLEVBQUUsUUFBUTtJQUNmQyxJQUFJLEVBQUUsaUNBQWlDO0lBQ3ZDQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUE4QzhCLE9BQU8sRUFBSztJQUFBLElBQXJEdVEsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtNQUFFbE0sTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFK0wsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztNQUFFRSxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO0lBQy9DLElBQU00RCxJQUFJLEdBQUF6RSxhQUFBO01BQ1JuUixNQUFNLEVBQUU7SUFBSSxHQUNUMEIsT0FBTyxDQUNYO0lBQ0QsSUFBQXdRLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7TUFBTyxDQUFDLENBQUM7TUFBOURhLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBRXpCLElBQU15VCxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNqRSxJQUFNNkUsZUFBZSxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO0lBRTFEMVgsSUFBSSxDQUFDLDJDQUEyQyxDQUFDO0lBQ2pEc1IsS0FBSyxDQUFDLENBQUM7SUFFUCxJQUFJRixRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQixJQUFJTCxRQUFRLENBQUNuRSxRQUFRLEVBQUU7UUFDckJqTixJQUFJLDRDQUFBTCxNQUFBLENBQ3dDeVIsUUFBUSxDQUFDNUIsUUFBUSxpQkFBQTdQLE1BQUEsQ0FBY3lSLFFBQVEsQ0FBQ25FLFFBQVEsU0FDNUYsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNMak4sSUFBSSw0Q0FBQUwsTUFBQSxDQUEyQ3lSLFFBQVEsQ0FBQzVCLFFBQVEsU0FBSyxDQUFDO01BQ3hFO01BQ0F4UCxJQUFJLHFEQUFBTCxNQUFBLENBQXFENkIsSUFBSSxDQUFDQyxTQUFTLENBQUMyUCxRQUFRLENBQUNLLElBQUksQ0FBQyxPQUFJLENBQUM7SUFDN0Y7SUFFQXpSLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQztJQUMvQ0EsSUFBSSxXQUFBTCxNQUFBLENBQVVzUixPQUFPLFVBQU0sQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQzRCLE9BQU8sQ0FBQ25ELFFBQVEsQ0FBQ3hLLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUMzQyxJQUFJSCxRQUFRLENBQUNLLElBQUksRUFBRTtRQUNqQnpSLElBQUksY0FBQUwsTUFBQSxDQUFhdUYsTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsZ0JBQVksQ0FBQyxDQUFDO01BQ3JELENBQUMsTUFBTTtRQUNMdlIsSUFBSSxjQUFBTCxNQUFBLENBQWF1RixNQUFNLENBQUNxTSxXQUFXLENBQUMsQ0FBQyxnQkFBWSxDQUFDLENBQUM7TUFDckQ7SUFDRixDQUFDLE1BQU0sSUFBSW1HLGVBQWUsQ0FBQ2hJLFFBQVEsQ0FBQ3hLLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUN6RCxJQUFJSCxRQUFRLENBQUNLLElBQUksRUFBRTtRQUNqQnpSLElBQUksS0FBQUwsTUFBQSxDQUFLdUYsTUFBTSxDQUFDZ0ssV0FBVyxDQUFDLENBQUMsYUFBVSxDQUFDLENBQUM7TUFDM0MsQ0FBQyxNQUFNO1FBQ0xsUCxJQUFJLEtBQUFMLE1BQUEsQ0FBS3VGLE1BQU0sQ0FBQ2dLLFdBQVcsQ0FBQyxDQUFDLGFBQVUsQ0FBQyxDQUFDO01BQzNDO0lBQ0YsQ0FBQyxNQUFNO01BQ0xsUCxJQUFJLEtBQUFMLE1BQUEsQ0FBS3VGLE1BQU0sQ0FBQ2dLLFdBQVcsQ0FBQyxDQUFDLFNBQU0sQ0FBQyxDQUFDO0lBQ3ZDOztJQUVBO0lBQ0FqTixNQUFNLENBQUM4RyxJQUFJLENBQUNvSSxVQUFVLENBQUMsQ0FBQ2xNLE9BQU8sQ0FBQyxVQUFBMUMsR0FBRyxFQUFJO01BQ3JDdkMsSUFBSSxpQkFBQUwsTUFBQSxDQUFnQjRDLEdBQUcsWUFBQTVDLE1BQUEsQ0FBT2tDLHNFQUFxQixDQUFDc1AsVUFBVSxDQUFDNU8sR0FBRyxDQUFDLENBQUMsVUFBTSxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDO0lBRUZ2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNwQnNSLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLENBQUMsd0RBQXdELENBQUM7SUFFOUQsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6RThDO0FBQ0o7QUFDRjtBQUNFO0FBRXBDLElBQU13WSxJQUFZLEdBQUc7RUFDMUI3USxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxNQUFNO0lBQ1hzTyxLQUFLLEVBQUUsTUFBTTtJQUNiSCxPQUFPLEVBQUUsT0FBTztJQUNoQixXQUFTO0VBQ1gsQ0FBQztFQUVERixXQUFXLEVBQUU7SUFDWCtHLFNBQVMsRUFBVEEsd0RBQVM7SUFDVEMsT0FBTyxFQUFQQSxvREFBTztJQUNQQyxNQUFNLEVBQU5BLGtEQUFNO0lBQ05FLE9BQU8sRUFBUEEsb0RBQU9BO0VBQ1Q7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQ0k7QUFHekQsSUFBTUEsT0FBZSxHQUFHO0VBQzdCNVEsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsU0FBUztJQUNkc08sS0FBSyxFQUFFLFNBQVM7SUFDaEJDLElBQUksRUFBRSw2QkFBNkI7SUFDbkNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQThDOEIsT0FBTyxFQUFLO0lBQUEsSUFBckRxRSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUVpTSxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO01BQUVDLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUgsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztJQUMvQyxJQUFNOEQsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFO0lBQUksR0FDVDBCLE9BQU8sQ0FDWDtJQUVELElBQUF3USxZQUFBLEdBQXVCLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BQXZEQyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO01BQUVZLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7SUFFbEIsSUFBTTZTLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztJQUU1RSxJQUFJLENBQUNBLE9BQU8sQ0FBQ25ELFFBQVEsQ0FBQ3hLLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUMzQ3ZSLElBQUksMkRBQUFMLE1BQUEsQ0FDdUR1RixNQUFNLENBQUNxTSxXQUFXLENBQUMsQ0FBQyxXQUFBNVIsTUFBQSxDQUFNc1IsT0FBTyxRQUM1RixDQUFDO0lBQ0gsQ0FBQyxNQUFNO01BQ0xqUixJQUFJLDRDQUFBTCxNQUFBLENBQTRDdUYsTUFBTSxDQUFDZ0ssV0FBVyxDQUFDLENBQUMsU0FBQXZQLE1BQUEsQ0FBS3NSLE9BQU8sUUFBSSxDQUFDO0lBQ3ZGOztJQUVBO0lBQ0FoUCxNQUFNLENBQUM4RyxJQUFJLENBQUNvSSxVQUFVLENBQUMsQ0FBQ2xNLE9BQU8sQ0FBQyxVQUFBMUMsR0FBRyxFQUFJO01BQ3JDdkMsSUFBSSxjQUFBTCxNQUFBLENBQWE0QyxHQUFHLFlBQUE1QyxNQUFBLENBQU9rQyxzRUFBcUIsQ0FBQ3NQLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBQyxDQUFDLFVBQU0sQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQztJQUVGLElBQUk2TyxRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQnpSLElBQUksVUFBQUwsTUFBQSxDQUFVNkIsSUFBSSxDQUFDQyxTQUFTLENBQUMyUCxRQUFRLENBQUNLLElBQUksQ0FBQyxRQUFLLENBQUMsQ0FBQztJQUNwRDtJQUVBelIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFFdkIsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BERDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRStDO0FBRWE7QUFHckQsSUFBTTBZLEtBQWEsR0FBRztFQUMzQi9RLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE9BQU87SUFDWnNPLEtBQUssRUFBRSxPQUFPO0lBQ2RDLElBQUksRUFBRSxnQ0FBZ0M7SUFDdENDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQW9EOEIsT0FBTyxFQUFLO0lBQUEsSUFBM0RzUSxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO01BQUVqTSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUwTixHQUFHLEdBQUE3VCxJQUFBLENBQUg2VCxHQUFHO01BQUVELFFBQVEsR0FBQTVULElBQUEsQ0FBUjRULFFBQVE7TUFBRXZCLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7SUFDckQsSUFBTTJELElBQUksR0FBQXpFLGFBQUE7TUFDUm5SLE1BQU0sRUFBRTtJQUFJLEdBQ1QwQixPQUFPLENBQ1g7SUFFRCxJQUFBd1EsWUFBQSxHQUFnRCxJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtNQUFPLENBQUMsQ0FBQztNQUFoRm1TLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUV0UixJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVaLElBQUksR0FBQWlTLFlBQUEsQ0FBSmpTLElBQUk7TUFBRTJZLGdCQUFnQixHQUFBMUcsWUFBQSxDQUFoQjBHLGdCQUFnQjtJQUUzQy9YLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUNsQ3NSLEtBQUssQ0FBQyxDQUFDO0lBRVAsSUFBTTBHLGNBQW1DLEdBQUc7TUFDMUM5UyxNQUFNLEVBQU5BLE1BQU07TUFDTjBOLEdBQUcsRUFBSEE7SUFDRixDQUFDO0lBRUQsSUFBSTNRLE1BQU0sQ0FBQzhHLElBQUksQ0FBQzRKLFFBQVEsQ0FBQyxDQUFDMVQsTUFBTSxFQUFFO01BQ2hDK1ksY0FBYyxDQUFDbEYsTUFBTSxHQUFHSCxRQUFRO0lBQ2xDO0lBRUEsSUFBSTFRLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDbFMsTUFBTSxFQUFFO01BQ2xDK1ksY0FBYyxDQUFDaEosT0FBTyxHQUFHbUMsVUFBVTtJQUNyQztJQUVBLFFBQVFDLFFBQVEsQ0FBQzVCLFFBQVE7TUFDdkIsS0FBSyxtQ0FBbUM7UUFDdEMsSUFBSTRCLFFBQVEsQ0FBQzBCLE1BQU0sRUFBRTtVQUNuQjlTLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQztVQUNwRG9SLFFBQVEsQ0FBQzBCLE1BQU0sQ0FBQzdOLE9BQU8sQ0FBQyxVQUFBa08sS0FBSyxFQUFJO1lBQy9CblQsSUFBSSx1QkFBQUwsTUFBQSxDQUF1QndULEtBQUssQ0FBQzVLLElBQUksVUFBQTVJLE1BQUEsQ0FBT3dULEtBQUssQ0FBQ3ZSLEtBQUssUUFBSyxDQUFDO1VBQy9ELENBQUMsQ0FBQztVQUVGMFAsS0FBSyxDQUFDLENBQUM7VUFFUDBHLGNBQWMsQ0FBQ0MsSUFBSSxHQUFHLGdCQUFnQjtVQUN0Q0YsZ0JBQWdCLENBQUMsVUFBQWpZLElBQUk7WUFBQSxPQUFJQSxJQUFJLENBQUNtUSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7VUFBQSxFQUFDO1FBQzlFO1FBRUE7TUFFRixLQUFLLGtCQUFrQjtRQUNyQixJQUFJbUIsUUFBUSxDQUFDMkIsT0FBTyxFQUFFO1VBQ3BCaUYsY0FBYyxDQUFDQyxJQUFJLEdBQUc3RyxRQUFRLENBQUMyQixPQUFPO1FBQ3hDO1FBQ0E7TUFFRixLQUFLLHFCQUFxQjtRQUN4QixJQUFJLENBQUMzQixRQUFRLENBQUMwQixNQUFNLEVBQUU7VUFDcEI7UUFDRjtRQUVBOVMsSUFBSSxDQUFDLDhCQUE4QixDQUFDO1FBRXBDb1IsUUFBUSxDQUFDMEIsTUFBTSxDQUFDN04sT0FBTyxDQUFDLFVBQUFrTyxLQUFLLEVBQUk7VUFDL0JuVCxJQUFJLGlCQUFBTCxNQUFBLENBQWlCd1QsS0FBSyxDQUFDNUssSUFBSSxVQUFBNUksTUFBQSxDQUFPd1QsS0FBSyxDQUFDdlIsS0FBSyxJQUFJdVIsS0FBSyxDQUFDQyxRQUFRLElBQUksRUFBRSxRQUFLLENBQUM7UUFDakYsQ0FBQyxDQUFDO1FBRUY5QixLQUFLLENBQUMsQ0FBQztRQUVQMEcsY0FBYyxDQUFDQyxJQUFJLEdBQUcsUUFBUTtRQUM5QjtNQUVGO1FBQ0UsSUFBSTdHLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO1VBQ2pCdUcsY0FBYyxDQUFDQyxJQUFJLEdBQUc3RyxRQUFRLENBQUNLLElBQUk7UUFDckM7SUFDSjtJQUVBLElBQU15RyxZQUFZLEdBQUdMLHVEQUFlLENBQUNHLGNBQWMsRUFBRTtNQUNuRDdZLE1BQU0sRUFBRSxJQUFJO01BQ1pnWixvQkFBb0IsRUFBRTtJQUN4QixDQUFDLENBQUMsQ0FBQ2xJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQzlCalEsSUFBSSxvQkFBQUwsTUFBQSxDQUFvQnVZLFlBQVksTUFBRyxDQUFDO0lBQ3hDNUcsS0FBSyxDQUFDLENBQUM7SUFFUHRSLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDYkEsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLENBQUMsQ0FBQztJQUN6REEsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUM3QkEsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3pCQSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDQSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRVQsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUrQztBQUVhO0FBQ0g7QUFPbEQsSUFBTWdaLEtBQTJCLEdBQUc7RUFDekNyUixJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxPQUFPO0lBQ1pzTyxLQUFLLEVBQUUsT0FBTztJQUNkQyxJQUFJLEVBQUUsd0VBQXdFO0lBQzlFQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUE4Q3NaLFNBQVMsRUFBSztJQUFBLElBQXZEblQsTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFaU0sVUFBVSxHQUFBcFMsSUFBQSxDQUFWb1MsVUFBVTtNQUFFQyxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVILE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87SUFDL0MsSUFBTThELElBQUksR0FBQXpFLGFBQUE7TUFDUm5SLE1BQU0sRUFBRSxJQUFJO01BQ1ptWixXQUFXLEVBQUU7SUFBSSxHQUNkRCxTQUFTLENBQ2I7SUFFRCxJQUFBaEgsWUFBQSxHQUE4QixJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtNQUFPLENBQUMsQ0FBQztNQUE5RG1TLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO01BQUVZLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7SUFFekIsSUFBTWEsT0FBNEIsR0FBRztNQUNuQ3FFLE1BQU0sRUFBTkE7SUFDRixDQUFDO0lBRUQsSUFBSWpELE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDbFMsTUFBTSxFQUFFO01BQ2xDNEIsT0FBTyxDQUFDbU8sT0FBTyxHQUFHbUMsVUFBVTtJQUM5QjtJQUVBLElBQUk0RCxJQUFJLENBQUN1RCxXQUFXLEtBQUssSUFBSSxFQUFFO01BQzdCelgsT0FBTyxDQUFDeVgsV0FBVyxHQUFHdkQsSUFBSSxDQUFDdUQsV0FBVztJQUN4QztJQUVBdFksSUFBSSxpQkFBQUwsTUFBQSxDQUFpQnNSLE9BQU8sT0FBSSxDQUFDO0lBRWpDLFFBQVFHLFFBQVEsQ0FBQzVCLFFBQVE7TUFDdkIsS0FBSyxtQ0FBbUM7UUFDdEMzTyxPQUFPLENBQUNvUyxJQUFJLEdBQUc3QixRQUFRLENBQUM0QixTQUFTLEdBQUc1QixRQUFRLENBQUM0QixTQUFTLEdBQUc1QixRQUFRLENBQUNLLElBQUk7UUFDdEU7TUFFRixLQUFLLGtCQUFrQjtRQUNyQjVRLE9BQU8sQ0FBQ29TLElBQUksR0FBR3pSLElBQUksQ0FBQ0MsU0FBUyxDQUFDMlAsUUFBUSxDQUFDMkIsT0FBTyxDQUFDO1FBQy9DO01BRUYsS0FBSyxxQkFBcUI7UUFDeEIsSUFBSSxDQUFDM0IsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1VBQ3BCO1FBQ0Y7O1FBRUE7UUFDQTtRQUNBLElBQU15RixpQkFBaUIsR0FBR3hKLCtEQUFhLENBQUNvQyxVQUFVLEVBQUUsY0FBYyxDQUFDO1FBQ25FLElBQUlvSCxpQkFBaUIsRUFBRTtVQUNyQixPQUFPcEgsVUFBVSxDQUFDb0gsaUJBQWlCLENBQUM7UUFDdEM7UUFFQXZZLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztRQUVwQ29SLFFBQVEsQ0FBQzBCLE1BQU0sQ0FBQzdOLE9BQU8sQ0FBQyxVQUFBa08sS0FBSyxFQUFJO1VBQy9CblQsSUFBSSxpQkFBQUwsTUFBQSxDQUFpQndULEtBQUssQ0FBQzVLLElBQUksVUFBQTVJLE1BQUEsQ0FBT3dULEtBQUssQ0FBQ3ZSLEtBQUssSUFBSXVSLEtBQUssQ0FBQ0MsUUFBUSxJQUFJLEVBQUUsUUFBSyxDQUFDO1FBQ2pGLENBQUMsQ0FBQztRQUVGOUIsS0FBSyxDQUFDLENBQUM7UUFDUDtNQUVGO1FBQ0UsSUFBSUYsUUFBUSxDQUFDSyxJQUFJLEVBQUU7VUFDakI1USxPQUFPLENBQUNvUyxJQUFJLEdBQUc3QixRQUFRLENBQUNLLElBQUk7UUFDOUI7SUFDSjs7SUFFQTtJQUNBLElBQUk1USxPQUFPLENBQUNtTyxPQUFPLElBQUksQ0FBQy9NLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ2xJLE9BQU8sQ0FBQ21PLE9BQU8sQ0FBQyxDQUFDL1AsTUFBTSxFQUFFO01BQzNELE9BQU80QixPQUFPLENBQUNtTyxPQUFPO0lBQ3hCO0lBRUFoUCxJQUFJLG9CQUFBTCxNQUFBLENBQ2lCa1ksdURBQWUsQ0FBQ2hYLE9BQU8sRUFBRTtNQUMxQzFCLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWLE1BQU07TUFDbkJnWixvQkFBb0IsRUFBRSxFQUFFO01BQ3hCSyxTQUFTLEVBQUUsU0FBWEEsU0FBU0EsQ0FBR0MsQ0FBQyxFQUFFQyxRQUFRLEVBQUVDLGNBQWMsRUFBSztRQUMxQyxJQUFJRCxRQUFRLEtBQUssTUFBTSxJQUFJdEgsUUFBUSxDQUFDNUIsUUFBUSxLQUFLLG1DQUFtQyxFQUFFO1VBQ3BGLDhCQUFBN1AsTUFBQSxDQUE4QmdaLGNBQWM7UUFDOUM7UUFDQSxPQUFPQSxjQUFjO01BQ3ZCO0lBQ0YsQ0FBQyxDQUFDLE1BQ0osQ0FBQztJQUNEckgsS0FBSyxDQUFDLENBQUM7SUFFUCxJQUFJRixRQUFRLENBQUMwQixNQUFNLElBQUkxQixRQUFRLENBQUM1QixRQUFRLEtBQUsscUJBQXFCLEVBQUU7TUFDbEV4UCxJQUFJLENBQUMsc0JBQXNCLENBQUM7TUFDNUJzUixLQUFLLENBQUMsQ0FBQztJQUNUO0lBRUF0UixJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ2JBLElBQUksZ0RBQWdELENBQUMsQ0FBQztJQUN0REEsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsQ0FBQztJQUM5Q0EsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUM3QkEsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3pCQSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDQSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRVQsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4SEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUrQztBQUVhO0FBQ21CO0FBR3hFLElBQU13WixNQUFjLEdBQUc7RUFDNUI3UixJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxRQUFRO0lBQ2JzTyxLQUFLLEVBQUUsUUFBUTtJQUNmQyxJQUFJLEVBQUUsb0NBQW9DO0lBQzFDQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUE4QzhCLE9BQU8sRUFBSztJQUFBLElBQXJEb1EsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztNQUFFL0wsTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFaU0sVUFBVSxHQUFBcFMsSUFBQSxDQUFWb1MsVUFBVTtNQUFFQyxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO0lBQy9DLElBQU0yRCxJQUFJLEdBQUF6RSxhQUFBO01BQ1JuUixNQUFNLEVBQUU7SUFBSSxHQUNUMEIsT0FBTyxDQUNYO0lBRUQsSUFBQXdRLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7TUFBTyxDQUFDLENBQUM7TUFBOURtUyxLQUFLLEdBQUFELFlBQUEsQ0FBTEMsS0FBSztNQUFFdFIsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFWixJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBRXpCLElBQU15WixRQUE2QixHQUFHO01BQ3BDalEsS0FBSyxFQUFFLElBQUk7TUFDWGtRLFdBQVcsRUFBRSxJQUFJO01BQ2pCbEcsR0FBRyxFQUFFM0IsT0FBTztNQUNaL0wsTUFBTSxFQUFOQSxNQUFNO01BQ044SixPQUFPLEVBQUVtQztJQUNYLENBQUM7SUFFRCxRQUFRQyxRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssbUNBQW1DO1FBQ3RDcUosUUFBUSxDQUFDWixJQUFJLEdBQUc3RyxRQUFRLENBQUM0QixTQUFTLEdBQUc1QixRQUFRLENBQUM0QixTQUFTLEdBQUc1QixRQUFRLENBQUNLLElBQUk7UUFDdkU7TUFFRixLQUFLLGtCQUFrQjtRQUNyQm9ILFFBQVEsQ0FBQ0UsV0FBVyxHQUFHLEtBQUs7UUFDNUJGLFFBQVEsQ0FBQ1osSUFBSSxHQUFHN0csUUFBUSxDQUFDSyxJQUFJO1FBQzdCO01BRUYsS0FBSyxxQkFBcUI7UUFDeEIsSUFBSSxDQUFDTCxRQUFRLENBQUMwQixNQUFNLEVBQUU7VUFDcEI7UUFDRjtRQUVBOVMsSUFBSSxDQUFDLDhCQUE4QixDQUFDO1FBRXBDb1IsUUFBUSxDQUFDMEIsTUFBTSxDQUFDN04sT0FBTyxDQUFDLFVBQUFrTyxLQUFLLEVBQUk7VUFDL0JuVCxJQUFJLGlCQUFBTCxNQUFBLENBQWlCd1QsS0FBSyxDQUFDNUssSUFBSSxVQUFBNUksTUFBQSxDQUFPd1QsS0FBSyxDQUFDdlIsS0FBSyxJQUFJdVIsS0FBSyxDQUFDQyxRQUFRLElBQUksRUFBRSxRQUFLLENBQUM7UUFDakYsQ0FBQyxDQUFDO1FBRUZ5RixRQUFRLENBQUNFLFdBQVcsR0FBRyxLQUFLO1FBQzVCRixRQUFRLENBQUN6RCxXQUFXLEdBQUcsS0FBSztRQUM1QnlELFFBQVEsQ0FBQ3JKLFFBQVEsR0FBRyxxQkFBcUI7UUFDekNxSixRQUFRLENBQUNaLElBQUksR0FBRyxRQUFROztRQUV4QjtRQUNBLElBQUk3SSwyREFBUyxDQUFDK0IsVUFBVSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1VBQUEsSUFBQTZILFVBQUE7VUFDekMsS0FBQUEsVUFBQSxHQUFJOUwsMkRBQVMsQ0FBQ2lFLFVBQVUsRUFBRSxjQUFjLENBQUMsY0FBQTZILFVBQUEsZUFBckNBLFVBQUEsQ0FBdUN0SixRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0QsSUFBTVAsVUFBVSxHQUFHSiwrREFBYSxDQUFDb0MsVUFBVSxFQUFFLGNBQWMsQ0FBQztZQUM1RCxJQUFJaEMsVUFBVSxFQUFFO2NBQ2QsT0FBTzBKLFFBQVEsQ0FBQzdKLE9BQU8sQ0FBQ0csVUFBVSxDQUFDO1lBQ3JDO1VBQ0Y7UUFDRjtRQUVBbUMsS0FBSyxDQUFDLENBQUM7UUFDUDtNQUVGO1FBQ0UsSUFBSUYsUUFBUSxDQUFDSyxJQUFJLEVBQUU7VUFDakJvSCxRQUFRLENBQUNaLElBQUksR0FBRzdHLFFBQVEsQ0FBQ0ssSUFBSTtRQUMvQjtJQUNKO0lBRUEsSUFBTXdILG1CQUFtQixHQUFHcEIsdURBQWUsQ0FBQ2dCLFFBQVEsRUFBRTtNQUFFMVosTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7SUFBTyxDQUFDLENBQUMsQ0FBQzhRLE9BQU8sQ0FDcEYsVUFBVSxFQUNWLE1BQ0YsQ0FBQztJQUVEalEsSUFBSSxxQkFBQUwsTUFBQSxDQUFxQnNaLG1CQUFtQixNQUFHLENBQUM7SUFDaEQzSCxLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLDZDQUE2QyxDQUFDO0lBQ25EQSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDQSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBRVgsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoR3NDO0FBQ0E7QUFDRTtBQUNOO0FBRTVCLElBQU0rWixVQUFrQixHQUFHO0VBQ2hDcFMsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsWUFBWTtJQUNqQnNPLEtBQUssRUFBRSxZQUFZO0lBQ25CSCxPQUFPLEVBQUUsS0FBSztJQUNkLFdBQVM7RUFDWCxDQUFDO0VBRURGLFdBQVcsRUFBRTtJQUNYMEksR0FBRyxFQUFIQSw0Q0FBRztJQUNIcEIsS0FBSyxFQUFMQSxnREFBSztJQUNMTSxLQUFLLEVBQUxBLGdEQUFLO0lBQ0xRLE1BQU0sRUFBTkEsa0RBQU1BO0VBQ1I7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRStDO0FBRWE7QUFDSTtBQUNlO0FBT3hFLElBQU1NLEdBQVcsR0FBRztFQUN6Qm5TLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLEtBQUs7SUFDVnNPLEtBQUssRUFBRSxnQkFBZ0I7SUFDdkJDLElBQUksRUFBRSxpRUFBaUU7SUFDdkVDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQThDOEIsT0FBTyxFQUFLO0lBQUEsSUFBckR1USxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVELFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRWpNLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFBRStMLE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87SUFDL0MsSUFBTThELElBQUksR0FBQXpFLGFBQUE7TUFDUm5SLE1BQU0sRUFBRSxJQUFJO01BQ1ppYSxJQUFJLEVBQUU7SUFBSSxHQUNQdlksT0FBTyxDQUNYO0lBRUQsSUFBQXdRLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7TUFBTyxDQUFDLENBQUM7TUFBOURtUyxLQUFLLEdBQUFELFlBQUEsQ0FBTEMsS0FBSztNQUFFdFIsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFWixJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBRXpCLFFBQVFnUyxRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssa0JBQWtCO1FBQ3JCeFAsSUFBSSxnQ0FBQUwsTUFBQSxDQUM2QmtZLHVEQUFlLENBQUN6RyxRQUFRLENBQUMyQixPQUFPLEVBQUU7VUFDL0Q1VCxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtRQUNmLENBQUMsQ0FBQyxPQUNKLENBQUM7UUFDRG1TLEtBQUssQ0FBQyxDQUFDO1FBQ1A7TUFFRixLQUFLLHFCQUFxQjtRQUN4QixJQUFJLENBQUNGLFFBQVEsQ0FBQzBCLE1BQU0sRUFBRTtVQUNwQjtRQUNGO1FBRUE5UyxJQUFJLENBQUMsOEJBQThCLENBQUM7UUFFcENvUixRQUFRLENBQUMwQixNQUFNLENBQUM3TixPQUFPLENBQUMsVUFBQWtPLEtBQUssRUFBSTtVQUMvQm5ULElBQUksaUJBQUFMLE1BQUEsQ0FBaUJ3VCxLQUFLLENBQUM1SyxJQUFJLFVBQUE1SSxNQUFBLENBQU93VCxLQUFLLENBQUN2UixLQUFLLElBQUl1UixLQUFLLENBQUNDLFFBQVEsSUFBSSxFQUFFLFFBQUssQ0FBQztRQUNqRixDQUFDLENBQUM7O1FBRUY7UUFDQSxJQUFJaEUsMkRBQVMsQ0FBQytCLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBRTtVQUFBLElBQUE2SCxVQUFBO1VBQ3pDLEtBQUFBLFVBQUEsR0FBSTlMLDJEQUFTLENBQUNpRSxVQUFVLEVBQUUsY0FBYyxDQUFDLGNBQUE2SCxVQUFBLGVBQXJDQSxVQUFBLENBQXVDdEosUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQy9ELElBQU1QLFVBQVUsR0FBR0osK0RBQWEsQ0FBQ29DLFVBQVUsRUFBRSxjQUFjLENBQUM7WUFDNUQsSUFBSWhDLFVBQVUsRUFBRTtjQUNkLE9BQU9nQyxVQUFVLENBQUNoQyxVQUFVLENBQUM7WUFDL0I7VUFDRjtRQUNGO1FBRUFtQyxLQUFLLENBQUMsQ0FBQztRQUNQO01BRUY7UUFDRXRSLElBQUksaUJBQUFMLE1BQUEsQ0FBaUJ5UixRQUFRLENBQUNLLElBQUksT0FBQTlSLE1BQUEsQ0FBT3lSLFFBQVEsQ0FBQ0ssSUFBSSxTQUFNLE1BQU0sTUFBRyxDQUFDO1FBQ3RFSCxLQUFLLENBQUMsQ0FBQztJQUNYO0lBRUF0UixJQUFJLENBQUMsbUNBQW1DLENBQUM7SUFFekMsSUFBSStVLElBQUksQ0FBQ3FFLElBQUksRUFBRTtNQUNicFosSUFBSSxDQUFDLDZCQUE2QixDQUFDO0lBQ3JDO0lBRUFzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLHdEQUF3RCxDQUFDO0lBQzlEQSxJQUFJLENBQUMsc0NBQXNDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DQSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNaQSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ1hzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxjQUFBTCxNQUFBLENBQWN1RixNQUFNLFVBQUF2RixNQUFBLENBQU9zUixPQUFPLFFBQUssQ0FBQztJQUU1Q2hQLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDbE0sT0FBTyxDQUFDLFVBQUExQyxHQUFHLEVBQUk7TUFDckN2QyxJQUFJLDBCQUFBTCxNQUFBLENBQTBCNEMsR0FBRyxVQUFBNUMsTUFBQSxDQUFPZ0Msc0VBQXFCLENBQUN3UCxVQUFVLENBQUM1TyxHQUFHLENBQUMsQ0FBQyxRQUFLLENBQUM7SUFDdEYsQ0FBQyxDQUFDO0lBRUYrTyxLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBRXZCLE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQ0k7QUFHekQsSUFBTXFZLE1BQWMsR0FBRztFQUM1QjFRLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFFBQVE7SUFDYnNPLEtBQUssRUFBRSxRQUFRO0lBQ2ZDLElBQUksRUFBRSxpQ0FBaUM7SUFDdkNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQThDOEIsT0FBTyxFQUFLO0lBQUEsSUFBckR1USxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVILE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87TUFBRS9MLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFBRWlNLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7SUFDL0MsSUFBTTRELElBQUksR0FBQXpFLGFBQUE7TUFDUm5SLE1BQU0sRUFBRTtJQUFJLEdBQ1QwQixPQUFPLENBQ1g7SUFDRCxJQUFBd1EsWUFBQSxHQUE4QixJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtNQUFPLENBQUMsQ0FBQztNQUE5RG1TLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO01BQUVZLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7SUFFekIsSUFBTTZTLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO0lBRWpFLElBQU02RSxlQUFlLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUM7SUFFMUQxWCxJQUFJLENBQUMsNkJBQTZCLENBQUM7SUFDbkNzUixLQUFLLENBQUMsQ0FBQztJQUVQLElBQUlGLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO01BQ2pCLElBQUlMLFFBQVEsQ0FBQ25FLFFBQVEsRUFBRTtRQUNyQmpOLElBQUksc0NBQUFMLE1BQUEsQ0FDa0N5UixRQUFRLENBQUM1QixRQUFRLGlCQUFBN1AsTUFBQSxDQUFjeVIsUUFBUSxDQUFDbkUsUUFBUSxRQUN0RixDQUFDO01BQ0gsQ0FBQyxNQUFNO1FBQ0xqTixJQUFJLHNDQUFBTCxNQUFBLENBQXFDeVIsUUFBUSxDQUFDNUIsUUFBUSxRQUFJLENBQUM7TUFDakU7TUFDQXhQLElBQUksNkNBQUFMLE1BQUEsQ0FBNkM2QixJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLE1BQUcsQ0FBQztJQUNwRjtJQUVBelIsSUFBSSxDQUFDLGlDQUFpQyxDQUFDO0lBQ3ZDQSxJQUFJLFdBQUFMLE1BQUEsQ0FBVXNSLE9BQU8sVUFBTSxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDNEIsT0FBTyxDQUFDbkQsUUFBUSxDQUFDeEssTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQzNDLElBQUlILFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO1FBQ2pCelIsSUFBSSxjQUFBTCxNQUFBLENBQWF1RixNQUFNLENBQUNxTSxXQUFXLENBQUMsQ0FBQyxnQkFBWSxDQUFDLENBQUM7TUFDckQsQ0FBQyxNQUFNO1FBQ0x2UixJQUFJLGNBQUFMLE1BQUEsQ0FBYXVGLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDLGdCQUFZLENBQUMsQ0FBQztNQUNyRDtJQUNGLENBQUMsTUFBTSxJQUFJbUcsZUFBZSxDQUFDaEksUUFBUSxDQUFDeEssTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ3pELElBQUlILFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO1FBQ2pCelIsSUFBSSxLQUFBTCxNQUFBLENBQUt1RixNQUFNLENBQUNnSyxXQUFXLENBQUMsQ0FBQyxhQUFVLENBQUMsQ0FBQztNQUMzQyxDQUFDLE1BQU07UUFDTGxQLElBQUksS0FBQUwsTUFBQSxDQUFLdUYsTUFBTSxDQUFDZ0ssV0FBVyxDQUFDLENBQUMsYUFBVSxDQUFDLENBQUM7TUFDM0M7SUFDRixDQUFDLE1BQU07TUFDTGxQLElBQUksS0FBQUwsTUFBQSxDQUFLdUYsTUFBTSxDQUFDZ0ssV0FBVyxDQUFDLENBQUMsU0FBTSxDQUFDLENBQUM7SUFDdkM7O0lBRUE7SUFDQWpOLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDbE0sT0FBTyxDQUFDLFVBQUExQyxHQUFHLEVBQUk7TUFDckN2QyxJQUFJLGlCQUFBTCxNQUFBLENBQWdCNEMsR0FBRyxZQUFBNUMsTUFBQSxDQUFPa0Msc0VBQXFCLENBQUNzUCxVQUFVLENBQUM1TyxHQUFHLENBQUMsQ0FBQyxVQUFNLENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUM7SUFFRnZDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ25Cc1IsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQyxrREFBa0QsQ0FBQztJQUV4RCxPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQzFFd0M7QUFFbEMsSUFBTWlhLE1BQWMsR0FBRztFQUM1QnRTLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFFBQVE7SUFDYnNPLEtBQUssRUFBRSxRQUFRO0lBQ2ZILE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBUztFQUNYLENBQUM7RUFDREYsV0FBVyxFQUFFO0lBQ1hpSCxNQUFNLEVBQU5BLGtEQUFNQTtFQUNSO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUrQztBQUVhO0FBR3JELElBQU1LLEtBQWEsR0FBRztFQUMzQi9RLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE9BQU87SUFDWnNPLEtBQUssRUFBRSxPQUFPO0lBQ2RDLElBQUksRUFBRSxnQ0FBZ0M7SUFDdENDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQW9EOEIsT0FBTyxFQUFLO0lBQUEsSUFBM0RxRSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUwTixHQUFHLEdBQUE3VCxJQUFBLENBQUg2VCxHQUFHO01BQUVELFFBQVEsR0FBQTVULElBQUEsQ0FBUjRULFFBQVE7TUFBRXhCLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUMsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtJQUNyRCxJQUFNMkQsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFO0lBQUksR0FDVDBCLE9BQU8sQ0FDWDtJQUNELElBQUF3USxZQUFBLEdBQWdELElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BQWhGbVMsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRWxTLElBQUksR0FBQWlTLFlBQUEsQ0FBSmpTLElBQUk7TUFBRVksSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFK1gsZ0JBQWdCLEdBQUExRyxZQUFBLENBQWhCMEcsZ0JBQWdCO0lBRTNDL1gsSUFBSSxDQUFDLHlDQUF5QyxDQUFDO0lBRS9DLElBQU1zWixPQUE0QixHQUFHO01BQ25DcFUsTUFBTSxFQUFOQSxNQUFNO01BQ04wTixHQUFHLEVBQUhBO0lBQ0YsQ0FBQztJQUVELElBQUkzUSxNQUFNLENBQUM4RyxJQUFJLENBQUM0SixRQUFRLENBQUMsQ0FBQzFULE1BQU0sRUFBRTtNQUNoQ3FhLE9BQU8sQ0FBQ3hHLE1BQU0sR0FBR0gsUUFBUTtJQUMzQjtJQUVBLElBQUkxUSxNQUFNLENBQUM4RyxJQUFJLENBQUNvSSxVQUFVLENBQUMsQ0FBQ2xTLE1BQU0sRUFBRTtNQUNsQ3FhLE9BQU8sQ0FBQ3RLLE9BQU8sR0FBR21DLFVBQVU7SUFDOUI7SUFFQSxRQUFRQyxRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssbUNBQW1DO1FBQ3RDLElBQUk0QixRQUFRLENBQUMwQixNQUFNLEVBQUU7VUFDbkI5UyxJQUFJLENBQUMsNkNBQTZDLENBQUM7VUFDbkRzUixLQUFLLENBQUMsQ0FBQztVQUVQdFIsSUFBSSxDQUFDLDhDQUE4QyxDQUFDO1VBQ3BEb1IsUUFBUSxDQUFDMEIsTUFBTSxDQUFDN04sT0FBTyxDQUFDLFVBQUFrTyxLQUFLLEVBQUk7WUFDL0JuVCxJQUFJLHVCQUFBTCxNQUFBLENBQXVCd1QsS0FBSyxDQUFDNUssSUFBSSxVQUFBNUksTUFBQSxDQUFPd1QsS0FBSyxDQUFDdlIsS0FBSyxRQUFLLENBQUM7VUFDL0QsQ0FBQyxDQUFDO1VBRUYwUCxLQUFLLENBQUMsQ0FBQztVQUVQZ0ksT0FBTyxDQUFDckIsSUFBSSxHQUFHLGdCQUFnQjtVQUMvQkYsZ0JBQWdCLENBQUMsVUFBQWpZLElBQUk7WUFBQSxPQUFJQSxJQUFJLENBQUNtUSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7VUFBQSxFQUFDO1FBQzlFO1FBRUE7TUFFRixLQUFLLGtCQUFrQjtRQUNyQnFCLEtBQUssQ0FBQyxDQUFDO1FBQ1AsSUFBSUYsUUFBUSxDQUFDMkIsT0FBTyxFQUFFO1VBQ3BCdUcsT0FBTyxDQUFDckIsSUFBSSxHQUFHN0csUUFBUSxDQUFDMkIsT0FBTztRQUNqQztRQUNBO01BRUY7UUFDRXpCLEtBQUssQ0FBQyxDQUFDO1FBQ1AsSUFBSUYsUUFBUSxDQUFDSyxJQUFJLEVBQUU7VUFDakI2SCxPQUFPLENBQUNyQixJQUFJLEdBQUc3RyxRQUFRLENBQUNLLElBQUk7UUFDOUI7SUFDSjtJQUVBLElBQU04SCxrQkFBa0IsR0FBRzFCLHVEQUFlLENBQUN5QixPQUFPLEVBQUU7TUFBRW5hLE1BQU0sRUFBRSxJQUFJO01BQUVnWixvQkFBb0IsRUFBRTtJQUFHLENBQUMsQ0FBQztJQUMvRm5ZLElBQUksb0JBQUFMLE1BQUEsQ0FBb0I0WixrQkFBa0IsTUFBRyxDQUFDO0lBQzlDakksS0FBSyxDQUFDLENBQUM7SUFFUHRSLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDYkEsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLENBQUMsQ0FBQztJQUN6REEsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUM3QkEsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3pCQSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDQSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRVQsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxRkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUrQztBQUVhO0FBQ0g7QUFHbEQsSUFBTWdaLEtBQWEsR0FBRztFQUMzQnJSLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE9BQU87SUFDWnNPLEtBQUssRUFBRSxPQUFPO0lBQ2RDLElBQUksRUFBRSxzQ0FBc0M7SUFDNUNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQXVEOEIsT0FBTyxFQUFLO0lBQUEsSUFBQWdVLGdCQUFBO0lBQUEsSUFBOUQzUCxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUrTCxPQUFPLEdBQUFsUyxJQUFBLENBQVBrUyxPQUFPO01BQUVHLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUYsVUFBVSxHQUFBblMsSUFBQSxDQUFWbVMsVUFBVTtNQUFFK0QsT0FBTyxHQUFBbFcsSUFBQSxDQUFQa1csT0FBTztJQUN4RCxJQUFNRixJQUFJLEdBQUF6RSxhQUFBO01BQ1JuUixNQUFNLEVBQUU7SUFBSSxHQUNUMEIsT0FBTyxDQUNYO0lBRUQsSUFBSTJZLFNBQVMsR0FBRyxLQUFLO0lBQ3JCLElBQUFuSSxZQUFBLEdBQXVDLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BQXZFbVMsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRXRSLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRVosSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtNQUFFVyxPQUFPLEdBQUFzUixZQUFBLENBQVB0UixPQUFPO0lBRWxDQyxJQUFJLENBQUMsc0NBQXNDLENBQUM7SUFDNUNzUixLQUFLLENBQUMsQ0FBQztJQUVQLElBQU1nSSxPQUE0QixHQUFHO01BQ25DcFUsTUFBTSxFQUFOQTtJQUNGLENBQUM7SUFFRCxJQUFJakQsTUFBTSxDQUFDOEcsSUFBSSxDQUFDbUksVUFBVSxDQUFDLENBQUNqUyxNQUFNLEVBQUU7TUFDbENxYSxPQUFPLENBQUN0SyxPQUFPLEdBQUdrQyxVQUFVO0lBQzlCO0lBRUEsUUFBUUUsUUFBUSxDQUFDNUIsUUFBUTtNQUN2QixLQUFLLG1DQUFtQztRQUN0Q3pQLE9BQU8sQ0FBQyw2Q0FBNkMsQ0FBQztRQUN0REMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDO1FBQ3BELENBQUE2VSxnQkFBQSxHQUFBekQsUUFBUSxDQUFDMEIsTUFBTSxjQUFBK0IsZ0JBQUEsZUFBZkEsZ0JBQUEsQ0FBaUI1UCxPQUFPLENBQUMsVUFBQWtPLEtBQUssRUFBSTtVQUNoQ25ULElBQUksdUJBQUFMLE1BQUEsQ0FBdUJ3VCxLQUFLLENBQUM1SyxJQUFJLFVBQUE1SSxNQUFBLENBQU93VCxLQUFLLENBQUN2UixLQUFLLFFBQUssQ0FBQztRQUMvRCxDQUFDLENBQUM7UUFDRjBQLEtBQUssQ0FBQyxDQUFDO1FBRVBnSSxPQUFPLENBQUNyRyxJQUFJLEdBQUcsZUFBZTtRQUM5QjtNQUVGLEtBQUssa0JBQWtCO1FBQ3JCLElBQUk3QixRQUFRLENBQUMyQixPQUFPLEVBQUU7VUFDcEJ1RyxPQUFPLENBQUNyRyxJQUFJLEdBQUd6UixJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQzJCLE9BQU8sQ0FBQztRQUNqRDtRQUNBO01BRUYsS0FBSyxxQkFBcUI7UUFDeEIsSUFBSSxDQUFDM0IsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1VBQ3BCO1FBQ0Y7O1FBRUE7UUFDQTtRQUNBLElBQU15RixpQkFBaUIsR0FBR3hKLCtEQUFhLENBQUNtQyxVQUFVLEVBQUUsY0FBYyxDQUFDO1FBQ25FLElBQUlxSCxpQkFBaUIsRUFBRTtVQUNyQixPQUFPckgsVUFBVSxDQUFDcUgsaUJBQWlCLENBQUM7UUFDdEM7UUFFQXhZLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQztRQUNqREMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDO1FBQ3hDb1IsUUFBUSxDQUFDMEIsTUFBTSxDQUFDN04sT0FBTyxDQUFDLFVBQUFrTyxLQUFLLEVBQUk7VUFDL0IsSUFBSSxDQUFDQSxLQUFLLENBQUNDLFFBQVEsSUFBSSxDQUFDRCxLQUFLLENBQUNDLFFBQVEsSUFBSSxDQUFDRCxLQUFLLENBQUNpQyxXQUFXLEVBQUU7WUFDNURwVixJQUFJLHFCQUFBTCxNQUFBLENBQXFCd1QsS0FBSyxDQUFDNUssSUFBSSxVQUFBNUksTUFBQSxDQUFPd1QsS0FBSyxDQUFDdlIsS0FBSyxRQUFLLENBQUM7WUFDM0Q7VUFDRjtVQUVBLElBQUl1UixLQUFLLENBQUNDLFFBQVEsRUFBRTtZQUNsQm9HLFNBQVMsR0FBRyxJQUFJO1lBQ2hCeFosSUFBSSxxQkFBQUwsTUFBQSxDQUFxQndULEtBQUssQ0FBQzVLLElBQUksOEJBQUE1SSxNQUFBLENBQTJCd1QsS0FBSyxDQUFDQyxRQUFRLFNBQU0sQ0FBQztVQUNyRjtRQUNGLENBQUMsQ0FBQztRQUNGOUIsS0FBSyxDQUFDLENBQUM7UUFDUDtNQUVGO1FBQ0UsSUFBSUYsUUFBUSxDQUFDSyxJQUFJLEVBQUU7VUFDakI2SCxPQUFPLENBQUNyRyxJQUFJLEdBQUc3QixRQUFRLENBQUNLLElBQUk7UUFDOUI7SUFDSjs7SUFFQTtJQUNBLElBQUl3RCxPQUFPLENBQUNoVyxNQUFNLEVBQUU7TUFDbEIsSUFBTXdhLGFBQWEsR0FBR3hFLE9BQU8sQ0FDMUIzVCxHQUFHLENBQUMsVUFBQWtRLE1BQU07UUFBQSxVQUFBN1IsTUFBQSxDQUFPK1osa0JBQWtCLENBQUNsSSxNQUFNLENBQUNqSixJQUFJLENBQUMsT0FBQTVJLE1BQUEsQ0FBSStaLGtCQUFrQixDQUFDbEksTUFBTSxDQUFDNVAsS0FBSyxDQUFDO01BQUEsQ0FBRSxDQUFDLENBQ3ZGeEMsSUFBSSxDQUFDLElBQUksQ0FBQztNQUNiLElBQUlrYSxPQUFPLENBQUN0SyxPQUFPLEVBQUU7UUFDbkJzSyxPQUFPLENBQUN0SyxPQUFPLENBQUN3QyxNQUFNLEdBQUdpSSxhQUFhO01BQ3hDLENBQUMsTUFBTTtRQUNMSCxPQUFPLENBQUN0SyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCc0ssT0FBTyxDQUFDdEssT0FBTyxDQUFDd0MsTUFBTSxHQUFHaUksYUFBYTtNQUN4QztJQUNGO0lBRUF6WixJQUFJLGlCQUFBTCxNQUFBLENBQWlCc1IsT0FBTyxPQUFJLENBQUM7O0lBRWpDO0lBQ0EsSUFBSXFJLE9BQU8sQ0FBQ3RLLE9BQU8sSUFBSSxDQUFDL00sTUFBTSxDQUFDOEcsSUFBSSxDQUFDdVEsT0FBTyxDQUFDdEssT0FBTyxDQUFDLENBQUMvUCxNQUFNLEVBQUU7TUFDM0QsT0FBT3FhLE9BQU8sQ0FBQ3RLLE9BQU87SUFDeEI7SUFFQSxJQUFNdUssa0JBQWtCLEdBQUcxQix1REFBZSxDQUFDeUIsT0FBTyxFQUFFO01BQUVuYSxNQUFNLEVBQUUsSUFBSTtNQUFFZ1osb0JBQW9CLEVBQUU7SUFBRyxDQUFDLENBQUM7SUFDL0ZuWSxJQUFJLG9CQUFBTCxNQUFBLENBQW9CNFosa0JBQWtCLE1BQUcsQ0FBQztJQUU5QyxJQUFJQyxTQUFTLEVBQUU7TUFDYnpaLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQztJQUN0QztJQUNBLElBQUlxUixRQUFRLENBQUMwQixNQUFNLElBQUkxQixRQUFRLENBQUM1QixRQUFRLEtBQUsscUJBQXFCLEVBQUU7TUFDbEV4UCxJQUFJLENBQUMsMEJBQTBCLENBQUM7SUFDbEM7SUFDQXNSLEtBQUssQ0FBQyxDQUFDO0lBRVB0UixJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ2JBLElBQUksZ0RBQWdELENBQUMsQ0FBQztJQUN0REEsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsQ0FBQztJQUM5Q0EsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUM3QkEsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3pCQSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDQSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRVQsT0FBT1osSUFBSSxDQUFDLENBQUMsQ0FDVjZRLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FDM0NBLE9BQU8sQ0FBQyxzQ0FBc0MsRUFBRSwyQkFBMkIsQ0FBQztFQUNqRjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRStDO0FBRWE7QUFPckQsSUFBTXdELE9BQWlDLEdBQUc7RUFDL0MxTSxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxRQUFRO0lBQ2JzTyxLQUFLLEVBQUUsTUFBTTtJQUNiQyxJQUFJLEVBQUUsb0VBQW9FO0lBQzFFQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUE4RDtJQUFBLElBQXpEMFgsTUFBTSxHQUFBMVgsSUFBQSxDQUFOMFgsTUFBTTtNQUFFdlIsTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFaU0sVUFBVSxHQUFBcFMsSUFBQSxDQUFWb1MsVUFBVTtNQUFFQyxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO0lBQUEsSUFBSXZRLE9BQU8sR0FBQTdCLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUM5RCxJQUFBMmEsZUFBQSxHQUFzRDlZLE9BQU8sQ0FBckQxQixNQUFNO01BQU5BLE1BQU0sR0FBQXdhLGVBQUEsY0FBRyxJQUFJLEdBQUFBLGVBQUE7TUFBQWhHLHFCQUFBLEdBQWlDOVMsT0FBTyxDQUF0QytTLGtCQUFrQjtNQUFsQkEsa0JBQWtCLEdBQUFELHFCQUFBLGNBQUcsS0FBSyxHQUFBQSxxQkFBQTtJQUNqRCxJQUFBdEMsWUFBQSxHQUF1QyxJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQU5BO01BQU8sQ0FBQyxDQUFDO01BQTFEbVMsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRWxTLElBQUksR0FBQWlTLFlBQUEsQ0FBSmpTLElBQUk7TUFBRVksSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFRCxPQUFPLEdBQUFzUixZQUFBLENBQVB0UixPQUFPO0lBRWxDLElBQU11WixPQUFPLEdBQUFoSixhQUFBO01BQ1hwTCxNQUFNLEVBQU5BLE1BQU07TUFDTjBVLFFBQVEsRUFBRW5ELE1BQU0sQ0FBQ21ELFFBQVE7TUFDekJDLElBQUksRUFBRXBELE1BQU0sQ0FBQ29ELElBQUk7TUFDakJqSSxJQUFJLEVBQUU2RSxNQUFNLENBQUM3RSxJQUFJO01BQ2pCNUMsT0FBTyxFQUFFbUM7SUFBVSxHQUNmeUMsa0JBQWtCLEdBQUc7TUFBRWtHLGtCQUFrQixFQUFFO0lBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUM1RDs7SUFFRDtJQUNBOVosSUFBSSwwQkFBQUwsTUFBQSxDQUEwQjhXLE1BQU0sQ0FBQ3NELFFBQVEsQ0FBQzlKLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFFBQUssQ0FBQztJQUVwRXFCLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLG9CQUFBTCxNQUFBLENBQW9Ca1ksdURBQWUsQ0FBQ3lCLE9BQU8sRUFBRTtNQUFFbmEsTUFBTSxFQUFOQTtJQUFPLENBQUMsQ0FBQyxNQUFHLENBQUM7SUFDaEVtUyxLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLG9EQUFvRCxDQUFDO0lBQzFEQSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQzdCc1IsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDLENBQUM7SUFDNUNBLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDOUJBLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2RzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUMsQ0FBQztJQUN0Q0EsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsQ0FBQztJQUM5Q0EsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQztJQUN4Q0EsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDZEEsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNYc1IsS0FBSyxDQUFDLENBQUM7SUFFUCxRQUFRRixRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssbUNBQW1DO1FBQ3RDLElBQUk0QixRQUFRLENBQUM0QixTQUFTLEVBQUU7VUFDdEJqVCxPQUFPLENBQUMsb0NBQW9DLENBQUM7VUFDN0NDLElBQUksMkJBQUFMLE1BQUEsQ0FDd0JrWSx1REFBZSxDQUFDekcsUUFBUSxDQUFDNEIsU0FBUyxFQUFFO1lBQzVEN1QsTUFBTSxFQUFFLElBQUk7WUFDWmdaLG9CQUFvQixFQUFFO1VBQ3hCLENBQUMsQ0FBQyxRQUNKLENBQUM7UUFDSDtRQUNBO01BRUYsS0FBSyxrQkFBa0I7UUFDckIsSUFBSS9HLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRTtVQUNwQi9TLElBQUksNkJBQUFMLE1BQUEsQ0FDMEJrWSx1REFBZSxDQUFDekcsUUFBUSxDQUFDMkIsT0FBTyxFQUFFO1lBQzVENVQsTUFBTSxFQUFFLElBQUk7WUFDWmdaLG9CQUFvQixFQUFFO1VBQ3hCLENBQUMsQ0FBQyxRQUNKLENBQUM7UUFDSDtRQUNBO01BRUY7UUFDRSxJQUFJL0csUUFBUSxDQUFDSyxJQUFJLEVBQUU7VUFDakJ6UixJQUFJLGNBQUFMLE1BQUEsQ0FBY2tZLHVEQUFlLENBQUN6RyxRQUFRLENBQUNLLElBQUksRUFBRTtZQUFFdFMsTUFBTSxFQUFOQTtVQUFPLENBQUMsQ0FBQyxPQUFJLENBQUM7UUFDbkU7SUFDSjtJQUVBYSxJQUFJLENBQUMsWUFBWSxDQUFDO0lBRWxCLE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFK0M7QUFFYTtBQUdyRCxJQUFNdVAsT0FBZSxHQUFHO0VBQzdCNUgsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsU0FBUztJQUNkc08sS0FBSyxFQUFFLFNBQVM7SUFDaEJDLElBQUksRUFBRSxvQ0FBb0M7SUFDMUNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQTZEOEIsT0FBTyxFQUFLO0lBQUEsSUFBcEVxRSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUwTixHQUFHLEdBQUE3VCxJQUFBLENBQUg2VCxHQUFHO01BQUVELFFBQVEsR0FBQTVULElBQUEsQ0FBUjRULFFBQVE7TUFBRXZCLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUYsVUFBVSxHQUFBblMsSUFBQSxDQUFWbVMsVUFBVTtNQUFFK0QsT0FBTyxHQUFBbFcsSUFBQSxDQUFQa1csT0FBTztJQUM5RCxJQUFNRixJQUFJLEdBQUF6RSxhQUFBO01BQ1JuUixNQUFNLEVBQUU7SUFBSSxHQUNUMEIsT0FBTyxDQUNYO0lBRUQsSUFBSTJZLFNBQVMsR0FBRyxLQUFLO0lBQ3JCLElBQUFuSSxZQUFBLEdBQXVDLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BQXZFYSxJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVzUixLQUFLLEdBQUFELFlBQUEsQ0FBTEMsS0FBSztNQUFFbFMsSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtNQUFFVyxPQUFPLEdBQUFzUixZQUFBLENBQVB0UixPQUFPO0lBRWxDQyxJQUFJLENBQUMscUNBQXFDLENBQUM7SUFDM0NzUixLQUFLLENBQUMsQ0FBQztJQUVQLElBQU1nSSxPQUE0QixHQUFHO01BQ25DcFUsTUFBTSxFQUFOQSxNQUFNO01BQ04wTixHQUFHLEVBQUhBO0lBQ0YsQ0FBQztJQUVELElBQUkzUSxNQUFNLENBQUM4RyxJQUFJLENBQUM0SixRQUFRLENBQUMsQ0FBQzFULE1BQU0sRUFBRTtNQUNoQ3FhLE9BQU8sQ0FBQ1UsRUFBRSxHQUFHckgsUUFBUTtJQUN2QjtJQUVBLElBQUkxUSxNQUFNLENBQUM4RyxJQUFJLENBQUNtSSxVQUFVLENBQUMsQ0FBQ2pTLE1BQU0sRUFBRTtNQUNsQ3FhLE9BQU8sQ0FBQ3RLLE9BQU8sR0FBR2tDLFVBQVU7SUFDOUI7SUFFQSxRQUFRRSxRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssbUNBQW1DO1FBQ3RDOEosT0FBTyxDQUFDaE0sSUFBSSxHQUFHOEQsUUFBUSxDQUFDNEIsU0FBUztRQUNqQztNQUVGLEtBQUssa0JBQWtCO1FBQ3JCLElBQUk1QixRQUFRLENBQUMyQixPQUFPLEVBQUU7VUFDcEJ1RyxPQUFPLENBQUNyRyxJQUFJLEdBQUc3QixRQUFRLENBQUMyQixPQUFPO1VBQy9CdUcsT0FBTyxDQUFDVyxJQUFJLEdBQUcsSUFBSTtRQUNyQjtRQUNBO01BRUYsS0FBSyxxQkFBcUI7UUFDeEIsSUFBSSxDQUFDN0ksUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1VBQ3BCO1FBQ0Y7UUFFQXdHLE9BQU8sQ0FBQ1ksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVyQjlJLFFBQVEsQ0FBQzBCLE1BQU0sQ0FBQzdOLE9BQU8sQ0FBQyxVQUFBa08sS0FBSyxFQUFJO1VBQy9CLElBQUksQ0FBQ0EsS0FBSyxDQUFDQyxRQUFRLElBQUksQ0FBQ0QsS0FBSyxDQUFDQyxRQUFRLElBQUksQ0FBQ0QsS0FBSyxDQUFDaUMsV0FBVyxFQUFFO1lBQzVEa0UsT0FBTyxDQUFDWSxRQUFRLENBQUMvRyxLQUFLLENBQUM1SyxJQUFJLENBQUMsR0FBRzRLLEtBQUssQ0FBQ3ZSLEtBQUs7WUFDMUM7VUFDRjtVQUVBLElBQUl1WSxVQU1ILEdBQUcsQ0FBQyxDQUFDO1VBRU4sSUFBSWhILEtBQUssQ0FBQ0MsUUFBUSxFQUFFO1lBQ2xCb0csU0FBUyxHQUFHLElBQUk7WUFDaEJXLFVBQVUsR0FBRztjQUNYdlksS0FBSyx5QkFBQWpDLE1BQUEsQ0FBeUJ3VCxLQUFLLENBQUNDLFFBQVEsTUFBRztjQUMvQ3ZTLE9BQU8sRUFBRTtnQkFDUHVaLFFBQVEsRUFBRWpILEtBQUssQ0FBQ0MsUUFBUTtnQkFDeEJnQyxXQUFXLEVBQUVqQyxLQUFLLENBQUNpQyxXQUFXLEdBQUdqQyxLQUFLLENBQUNpQyxXQUFXLEdBQUc7Y0FDdkQ7WUFDRixDQUFDO1VBQ0gsQ0FBQyxNQUFNLElBQUlqQyxLQUFLLENBQUN2UixLQUFLLEVBQUU7WUFDdEJ1WSxVQUFVLENBQUN2WSxLQUFLLEdBQUd1UixLQUFLLENBQUN2UixLQUFLO1VBQ2hDO1VBRUEwWCxPQUFPLENBQUNZLFFBQVEsQ0FBQy9HLEtBQUssQ0FBQzVLLElBQUksQ0FBQyxHQUFHNFIsVUFBVTtRQUMzQyxDQUFDLENBQUM7UUFDRjtNQUVGO1FBQ0UsSUFBSS9JLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO1VBQ2pCNkgsT0FBTyxDQUFDckcsSUFBSSxHQUFHN0IsUUFBUSxDQUFDSyxJQUFJO1FBQzlCO0lBQ0o7O0lBRUE7SUFDQSxJQUFJd0QsT0FBTyxDQUFDaFcsTUFBTSxFQUFFO01BQ2xCcWEsT0FBTyxDQUFDZSxHQUFHLEdBQUcsS0FBSztNQUVuQnJhLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztNQUVsQ2lWLE9BQU8sQ0FBQ2hRLE9BQU8sQ0FBQyxVQUFBdU0sTUFBTSxFQUFJO1FBQ3hCeFIsSUFBSSxrQ0FBQUwsTUFBQSxDQUMrQitaLGtCQUFrQixDQUFDbEksTUFBTSxDQUFDakosSUFBSSxDQUFDLE9BQUE1SSxNQUFBLENBQUkrWixrQkFBa0IsQ0FDcEZsSSxNQUFNLENBQUM1UCxLQUNULENBQUMsV0FBQWpDLE1BQUEsQ0FBUWlULEdBQUcsUUFDZCxDQUFDO01BQ0gsQ0FBQyxDQUFDO01BQ0Z0QixLQUFLLENBQUMsQ0FBQztJQUNUO0lBRUEsSUFBSWtJLFNBQVMsRUFBRTtNQUNielosT0FBTyxDQUFDLDJCQUEyQixDQUFDO0lBQ3RDO0lBRUFDLElBQUksb0JBQUFMLE1BQUEsQ0FDaUJrWSx1REFBZSxDQUFDeUIsT0FBTyxFQUFFO01BQUVuYSxNQUFNLEVBQUUsSUFBSTtNQUFFZ1osb0JBQW9CLEVBQUU7SUFBRyxDQUFDLENBQUMsTUFDekYsQ0FBQztJQUNEN0csS0FBSyxDQUFDLENBQUM7SUFFUHRSLElBQUksQ0FBQyxxREFBcUQsQ0FBQztJQUMzREEsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLENBQUMsQ0FBQztJQUM3Q3NSLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQzdCQSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBRVgsT0FBT1osSUFBSSxDQUFDLENBQUMsQ0FDVjZRLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQ3ZCQSxPQUFPLENBQUMsZ0NBQWdDLEVBQUUsMkJBQTJCLENBQUM7RUFDM0U7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pJc0M7QUFDQTtBQUNFO0FBQ0U7QUFDQTtBQUVwQyxJQUFNcUssSUFBWSxHQUFHO0VBQzFCdlQsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsTUFBTTtJQUNYc08sS0FBSyxFQUFFLFNBQVM7SUFDaEJILE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBUztFQUNYLENBQUM7RUFDREYsV0FBVyxFQUFFO0lBQ1gsVUFBQWlELGtEQUFNO0lBQ045RSxPQUFPLEVBQVBBLG9EQUFPO0lBQ1BnSixPQUFPLEVBQVBBLG9EQUFPO0lBQ1BHLEtBQUssRUFBTEEsZ0RBQUs7SUFDTE0sS0FBSyxFQUFMQSxnREFBS0E7RUFDUDtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRStDO0FBRWE7QUFHckQsSUFBTVQsT0FBZSxHQUFHO0VBQzdCNVEsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsU0FBUztJQUNkc08sS0FBSyxFQUFFLFNBQVM7SUFDaEJDLElBQUksRUFBRSwrQkFBK0I7SUFDckNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQTZEOEIsT0FBTyxFQUFLO0lBQUEsSUFBcEVxRSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUwTixHQUFHLEdBQUE3VCxJQUFBLENBQUg2VCxHQUFHO01BQUVxQyxPQUFPLEdBQUFsVyxJQUFBLENBQVBrVyxPQUFPO01BQUV0QyxRQUFRLEdBQUE1VCxJQUFBLENBQVI0VCxRQUFRO01BQUV2QixRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVGLFVBQVUsR0FBQW5TLElBQUEsQ0FBVm1TLFVBQVU7SUFDOUQsSUFBTTZELElBQUksR0FBQXpFLGFBQUE7TUFDUm5SLE1BQU0sRUFBRTtJQUFJLEdBQ1QwQixPQUFPLENBQ1g7SUFFRCxJQUFJMlksU0FBUyxHQUFHLEtBQUs7SUFDckIsSUFBQW5JLFlBQUEsR0FBeUQsSUFBSXpTLDhEQUFXLENBQUM7UUFDdkVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQ2YsQ0FBQyxDQUFDO01BRk00WSxnQkFBZ0IsR0FBQTFHLFlBQUEsQ0FBaEIwRyxnQkFBZ0I7TUFBRXpHLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO01BQUVZLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRUQsT0FBTyxHQUFBc1IsWUFBQSxDQUFQdFIsT0FBTztJQUlwREMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDO0lBQzNDc1IsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUkseUJBQUFMLE1BQUEsQ0FBeUJ1RixNQUFNLFVBQUF2RixNQUFBLENBQU9pVCxHQUFHLFFBQUssQ0FBQztJQUNuRHRCLEtBQUssQ0FBQyxDQUFDO0lBRVAsSUFBSTJELE9BQU8sQ0FBQ2hXLE1BQU0sRUFBRTtNQUNsQmUsSUFBSSxDQUFDLGtDQUFrQyxDQUFDO01BRXhDaVYsT0FBTyxDQUFDaFEsT0FBTyxDQUFDLFVBQUF1TSxNQUFNLEVBQUk7UUFDeEJ4UixJQUFJLG1CQUFBTCxNQUFBLENBQ2dCK1osa0JBQWtCLENBQUNsSSxNQUFNLENBQUNqSixJQUFJLENBQUMsT0FBQTVJLE1BQUEsQ0FBSStaLGtCQUFrQixDQUNyRWxJLE1BQU0sQ0FBQzVQLEtBQ1QsQ0FBQyxVQUFBakMsTUFBQSxDQUFPaVQsR0FBRyxRQUNiLENBQUM7TUFDSCxDQUFDLENBQUM7TUFFRjVTLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztNQUMzQnNSLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7SUFFQSxJQUFJclAsTUFBTSxDQUFDOEcsSUFBSSxDQUFDNEosUUFBUSxDQUFDLENBQUMxVCxNQUFNLEVBQUU7TUFDaENlLElBQUksY0FBQUwsTUFBQSxDQUFja1ksdURBQWUsQ0FBQ2xGLFFBQVEsRUFBRTtRQUFFeFQsTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7TUFBTyxDQUFDLENBQUMsT0FBSSxDQUFDO01BQ3pFbVMsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBLElBQUlyUCxNQUFNLENBQUM4RyxJQUFJLENBQUNtSSxVQUFVLENBQUMsQ0FBQ2pTLE1BQU0sRUFBRTtNQUNsQ2UsSUFBSSxnQkFBQUwsTUFBQSxDQUFnQmtZLHVEQUFlLENBQUMzRyxVQUFVLEVBQUU7UUFBRS9SLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDLE9BQUksQ0FBQztNQUM3RW1TLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7SUFFQSxRQUFRRixRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssbUNBQW1DO1FBQ3RDLElBQUk0QixRQUFRLENBQUM0QixTQUFTLEVBQUU7VUFDdEJoVCxJQUFJLGFBQUFMLE1BQUEsQ0FBYWtZLHVEQUFlLENBQUN6RyxRQUFRLENBQUM0QixTQUFTLEVBQUU7WUFBRTdULE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO1VBQU8sQ0FBQyxDQUFDLE9BQUksQ0FBQztVQUNsRm1TLEtBQUssQ0FBQyxDQUFDO1FBQ1Q7UUFDQTtNQUVGLEtBQUssa0JBQWtCO1FBQ3JCLElBQUlGLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRTtVQUNwQi9TLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztVQUN6QkEsSUFBSSxhQUFBTCxNQUFBLENBQWFrWSx1REFBZSxDQUFDekcsUUFBUSxDQUFDMkIsT0FBTyxFQUFFO1lBQUU1VCxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtVQUFPLENBQUMsQ0FBQyxPQUFJLENBQUM7VUFDaEZtUyxLQUFLLENBQUMsQ0FBQztRQUNUO1FBQ0E7TUFFRixLQUFLLHFCQUFxQjtRQUFFO1VBQzFCLElBQUksQ0FBQ0YsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1lBQ3BCO1VBQ0Y7VUFFQSxJQUFNSSxTQUFtQyxHQUFHLEVBQUU7VUFFOUM5QixRQUFRLENBQUMwQixNQUFNLENBQUM3TixPQUFPLENBQUMsVUFBQWtPLEtBQUssRUFBSTtZQUMvQixJQUFNb0gsSUFBNEIsR0FBRyxDQUFDLENBQUM7WUFFdkMsSUFBSXBILEtBQUssQ0FBQ0MsUUFBUSxJQUFJLENBQUNELEtBQUssQ0FBQ3ZSLEtBQUssRUFBRTtjQUNsQzRYLFNBQVMsR0FBRyxJQUFJO2NBRWhCZSxJQUFJLENBQUN0SCxJQUFJLDJCQUFBdFQsTUFBQSxDQUEyQndULEtBQUssQ0FBQ0MsUUFBUSxPQUFJO2NBQ3REMkUsZ0JBQWdCLENBQUMsVUFBQWpZLElBQUk7Z0JBQUEsT0FDbkJBLElBQUksQ0FBQ21RLE9BQU8sQ0FBQyxzQ0FBc0MsRUFBRSwyQkFBMkIsQ0FBQztjQUFBLENBQ25GLENBQUM7WUFDSCxDQUFDLE1BQU0sSUFBSWtELEtBQUssQ0FBQ3ZSLEtBQUssRUFBRTtjQUN0QjJZLElBQUksQ0FBQ3RILElBQUksR0FBR0UsS0FBSyxDQUFDdlIsS0FBSztZQUN6QjtZQUVBLElBQUkyWSxJQUFJLENBQUN0SCxJQUFJLEVBQUU7Y0FDYixJQUFJRSxLQUFLLENBQUNpQyxXQUFXLEVBQUU7Z0JBQ3JCbUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHcEgsS0FBSyxDQUFDaUMsV0FBVztjQUMxQztjQUVBbEMsU0FBUyxDQUFDbFQsSUFBSSxDQUFDdWEsSUFBSSxDQUFDO1lBQ3RCO1VBQ0YsQ0FBQyxDQUFDO1VBRUZ2YSxJQUFJLGtCQUFBTCxNQUFBLENBQWtCa1ksdURBQWUsQ0FBQzNFLFNBQVMsRUFBRTtZQUFFL1QsTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7VUFBTyxDQUFDLENBQUMsT0FBSSxDQUFDO1VBQzlFbVMsS0FBSyxDQUFDLENBQUM7VUFDUDtRQUNGO01BRUE7UUFDRSxJQUFJRixRQUFRLENBQUNLLElBQUksRUFBRTtVQUNqQnpSLElBQUksYUFBQUwsTUFBQSxDQUFha1ksdURBQWUsQ0FBQ3pHLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO1lBQUV0UyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtVQUFPLENBQUMsQ0FBQyxPQUFJLENBQUM7VUFDN0VtUyxLQUFLLENBQUMsQ0FBQztRQUNUO0lBQ0o7SUFFQSxJQUFJa0ksU0FBUyxFQUFFO01BQ2J6WixPQUFPLENBQUMsMkJBQTJCLENBQUM7SUFDdEM7SUFFQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDO0lBQ2hDQSxJQUFJLENBQUMsNENBQTRDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JEc1IsS0FBSyxDQUFDLENBQUM7SUFFUHRSLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7SUFDakNBLElBQUksQ0FBQyxLQUFLLENBQUM7SUFFWCxPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQU1vYixhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQ3hCQyxPQUFlLEVBQ2ZsUyxJQUFZLEVBQ1ptUyxVQUErQixFQUMvQnZiLE1BQWdCLEVBQ2I7RUFDSCxJQUFNd2IsT0FBTyxNQUFBaGIsTUFBQSxDQUFNOGEsT0FBTyxRQUFBOWEsTUFBQSxDQUFLNEksSUFBSSxRQUFLO0VBQ3hDLElBQU1xUyxPQUFPLEdBQUdDLHNCQUFxQixDQUFDSCxVQUFVLEVBQUV2YixNQUFNLEdBQUd3YixPQUFPLENBQUMxYixNQUFNLEdBQUdDLFNBQVMsQ0FBQztFQUN0RixVQUFBUyxNQUFBLENBQVVnYixPQUFPLEVBQUFoYixNQUFBLENBQUdpYixPQUFPO0FBQzdCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQU1DLHNCQUFxQixHQUFHLFNBQXhCQSxxQkFBcUJBLENBQUlqWixLQUFVLEVBQUVrWixXQUFvQixFQUFhO0VBQ2pGLElBQU0xYixJQUFJLEdBQUcwYixXQUFXLEtBQUs1YixTQUFTLEdBQUcsSUFBSSxZQUFBUyxNQUFBLENBQVksR0FBRyxDQUFDRCxNQUFNLENBQUNvYixXQUFXLENBQUMsQ0FBRTtFQUVsRixRQUFRN1ksTUFBTSxDQUFDQyxTQUFTLENBQUNiLFFBQVEsQ0FBQ2lELElBQUksQ0FBQzFDLEtBQUssQ0FBQztJQUMzQyxLQUFLLGlCQUFpQjtNQUNwQixXQUFBakMsTUFBQSxDQUFXaUMsS0FBSztJQUVsQixLQUFLLGdCQUFnQjtNQUFFO1FBQ3JCLElBQU1tWixvQkFBb0IsR0FBR25aLEtBQUssQ0FBQ04sR0FBRyxDQUFDLFVBQUNNLEtBQVU7VUFBQSxPQUFLaVosc0JBQXFCLENBQUNqWixLQUFLLENBQUM7UUFBQSxFQUFDO1FBQ3BGLGFBQUFqQyxNQUFBLENBQWFvYixvQkFBb0IsQ0FBQzNiLElBQUksQ0FBQ0EsSUFBSSxDQUFDO01BQzlDO0lBRUEsS0FBSyxpQkFBaUI7TUFBRTtRQUN0QixJQUFNNGIsYUFBYSxHQUFHLEVBQUU7UUFDeEIsS0FBSyxJQUFNelksR0FBRyxJQUFJWCxLQUFLLEVBQUU7VUFDdkJvWixhQUFhLENBQUNoYixJQUFJLE9BQUFMLE1BQUEsQ0FBTTRDLEdBQUcsVUFBQTVDLE1BQUEsQ0FBTWtiLHNCQUFxQixDQUFDalosS0FBSyxDQUFDVyxHQUFHLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDdkU7UUFDQSxhQUFBNUMsTUFBQSxDQUFhcWIsYUFBYSxDQUFDNWIsSUFBSSxDQUFDQSxJQUFJLENBQUM7TUFDdkM7SUFFQSxLQUFLLGtCQUFrQjtNQUNyQixPQUFPd0MsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLO0lBRS9CO01BQ0UsSUFBSUEsS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLMUMsU0FBUyxFQUFFO1FBQ3pDLE9BQU8sRUFBRTtNQUNYO01BQ0EsYUFBQVMsTUFBQSxDQUFZaUMsS0FBSyxDQUFDUCxRQUFRLENBQUMsQ0FBQyxDQUFDNE8sT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7RUFDckQ7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU0RDtBQUVqQjtBQU9wQyxJQUFNaUwsWUFBeUMsR0FBRztFQUN2RG5VLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLGNBQWM7SUFDbkJzTyxLQUFLLEVBQUUsY0FBYztJQUNyQkMsSUFBSSxFQUFFLDBHQUEwRztJQUNoSEMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBOEM4QixPQUFPLEVBQUs7SUFBQSxJQUFBZ1UsZ0JBQUE7SUFBQSxJQUFyRDFELFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUMsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtNQUFFbE0sTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFK0wsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztJQUMvQyxJQUFNOEQsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFLE1BQU07TUFDZGdjLE1BQU0sRUFBRSxJQUFJO01BQ1puRixPQUFPLEVBQUU7SUFBRSxHQUNSblYsT0FBTyxDQUNYO0lBRUQsSUFBQXdRLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7TUFBTyxDQUFDLENBQUM7TUFBOURhLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRVosSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtNQUFFa1MsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7SUFDekI7SUFDQSxJQUFNOEosR0FBRyxHQUFHO01BQ1ZDLFVBQVUsRUFBRSxLQUFLO01BQ2pCQyxPQUFPLEVBQUU7SUFDWCxDQUFDOztJQUVEO0lBQ0F0YixJQUFJLENBQUMsbUNBQW1DLENBQUM7SUFFekMsSUFBSWlDLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDbFMsTUFBTSxFQUFFO01BQ2xDbWMsR0FBRyxDQUFDQyxVQUFVLEdBQUcsSUFBSTtNQUNyQi9KLEtBQUssQ0FBQyxDQUFDO01BQ1B0UixJQUFJLENBQUN3YSx1REFBYSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUVySixVQUFVLEVBQUU0RCxJQUFJLENBQUNvRyxNQUFNLENBQUMsQ0FBQztJQUN6RTtJQUVBLElBQUkvSixRQUFRLENBQUNLLElBQUksSUFBSUwsUUFBUSxDQUFDMkIsT0FBTyxJQUFJM0IsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO01BQ3hEc0ksR0FBRyxDQUFDRSxPQUFPLEdBQUcsSUFBSTtNQUVsQixRQUFRbEssUUFBUSxDQUFDNUIsUUFBUTtRQUN2QixLQUFLLG1DQUFtQztVQUN0QyxLQUFBcUYsZ0JBQUEsR0FBSXpELFFBQVEsQ0FBQzBCLE1BQU0sY0FBQStCLGdCQUFBLGVBQWZBLGdCQUFBLENBQWlCNVYsTUFBTSxFQUFFO1lBQzNCO1lBQ0E7WUFDQTtZQUNBcVMsS0FBSyxDQUFDLENBQUM7WUFFUCxJQUFBd0QsaUJBQUEsR0FBQXlHLFFBQUEsQ0FBd0JuSyxRQUFRLENBQUMwQixNQUFNO2NBQWhDMEksSUFBSSxHQUFBMUcsaUJBQUE7Y0FBSzJHLElBQUksR0FBQTNHLGlCQUFBLENBQUFwVCxLQUFBO1lBQ3BCMUIsSUFBSSxzRUFBQUwsTUFBQSxDQUNrRTZiLElBQUksQ0FBQ2pULElBQUksT0FBQTVJLE1BQUEsQ0FBSTZiLElBQUksQ0FBQzVaLEtBQUssaURBQzdGLENBQUM7WUFFRDZaLElBQUksQ0FBQ3hXLE9BQU8sQ0FBQyxVQUFBc1EsS0FBQSxFQUFxQjtjQUFBLElBQWxCaE4sSUFBSSxHQUFBZ04sS0FBQSxDQUFKaE4sSUFBSTtnQkFBRTNHLEtBQUssR0FBQTJULEtBQUEsQ0FBTDNULEtBQUs7Y0FDekI1QixJQUFJLDhCQUFBTCxNQUFBLENBQzBCNEksSUFBSSxPQUFBNUksTUFBQSxDQUFJaUMsS0FBSyxpREFDM0MsQ0FBQztZQUNILENBQUMsQ0FBQztVQUNKLENBQUMsTUFBTTtZQUNMd1osR0FBRyxDQUFDRSxPQUFPLEdBQUcsS0FBSztVQUNyQjtVQUNBO1FBRUYsS0FBSyxrQkFBa0I7VUFDckIsSUFBSWxLLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRTtZQUNwQi9TLElBQUksQ0FBQ3dhLHVEQUFhLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRXBKLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRWdDLElBQUksQ0FBQ29HLE1BQU0sQ0FBQyxDQUFDO1lBQ2hGN0osS0FBSyxDQUFDLENBQUM7WUFDUHRSLElBQUksQ0FDRiw2RkFDRixDQUFDO1VBQ0g7VUFDQTtRQUVGLEtBQUsscUJBQXFCO1VBQ3hCO1VBQ0E7VUFDQTtVQUNBQSxJQUFJLENBQUN3YSx1REFBYSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUVwSixRQUFRLENBQUMwQixNQUFNLElBQUksRUFBRSxFQUFFaUMsSUFBSSxDQUFDb0csTUFBTSxDQUFDLENBQUM7VUFDaEZuYixJQUFJLDRCQUFBTCxNQUFBLENBQTJCeVIsUUFBUSxDQUFDbkUsUUFBUSxRQUFJLENBQUM7VUFDckRxRSxLQUFLLENBQUMsQ0FBQztVQUNQdFIsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1VBQ3ZCQSxJQUFJLENBQUMsbURBQW1ELENBQUM7VUFDekRBLElBQUksQ0FBQywyQ0FBMkMsQ0FBQztVQUNqREEsSUFBSSxDQUFDLDhDQUE4QyxFQUFFLENBQUMsQ0FBQztVQUN2REEsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQztVQUNwQ0EsSUFBSSxDQUNGLG1JQUFtSSxFQUNuSSxDQUNGLENBQUM7VUFDREEsSUFBSSxDQUFDLDZFQUE2RSxFQUFFLENBQUMsQ0FBQztVQUN0RkEsSUFBSSxDQUNGLCtIQUErSCxFQUMvSCxDQUNGLENBQUM7VUFDREEsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7VUFDdkJBLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7VUFDL0JBLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1VBQ1pBLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1VBQ25CQSxJQUFJLENBQ0Ysa0dBQWtHLEVBQ2xHLENBQ0YsQ0FBQztVQUNEQSxJQUFJLENBQUMsNkNBQTZDLEVBQUUsQ0FBQyxDQUFDO1VBQ3REQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztVQUNaQSxJQUFJLENBQUMsR0FBRyxDQUFDO1VBQ1RBLElBQUksQ0FBQyxzREFBc0QsQ0FBQztVQUM1REEsSUFBSSxDQUFDLG1FQUFtRSxDQUFDO1VBQ3pFO1FBRUY7VUFDRXNSLEtBQUssQ0FBQyxDQUFDO1VBQ1B0UixJQUFJLHdEQUFBTCxNQUFBLENBQ29EeVIsUUFBUSxDQUFDSyxJQUFJLGlEQUNyRSxDQUFDO01BQ0w7SUFDRjtJQUVBSCxLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSwrRkFBQUwsTUFBQSxDQUMyRnNSLE9BQU8sUUFDdEcsQ0FBQzs7SUFFRDtJQUNBalIsSUFBSSxDQUNGLHVHQUNGLENBQUM7SUFDREEsSUFBSSx1RUFBQUwsTUFBQSxDQUNvRW9WLElBQUksQ0FBQ2lCLE9BQU8sQ0FBQzBGLE9BQU8sQ0FDeEYsQ0FDRixDQUFDLE9BQ0gsQ0FBQztJQUNEMWIsSUFBSSw4QkFBQUwsTUFBQSxDQUE2QnVGLE1BQU0sU0FBSyxDQUFDO0lBRTdDLElBQUlrVyxHQUFHLENBQUNDLFVBQVUsRUFBRTtNQUNsQnJiLElBQUksQ0FBQywyQ0FBMkMsQ0FBQztJQUNuRDtJQUVBLElBQUlvYixHQUFHLENBQUNFLE9BQU8sRUFBRTtNQUNmdGIsSUFBSSxDQUFDLGlDQUFpQyxDQUFDO0lBQ3pDO0lBRUFzUixLQUFLLENBQUMsQ0FBQzs7SUFFUDtJQUNBdFIsSUFBSSxDQUFDLHVEQUF1RCxDQUFDO0lBQzdEQSxJQUFJLENBQUMsdUVBQXVFLENBQUM7SUFDN0VBLElBQUksQ0FDRiwwSEFDRixDQUFDO0lBQ0RBLElBQUksQ0FBQywwREFBMEQsRUFBRSxDQUFDLENBQUM7SUFDbkVBLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxDQUFDLENBQUM7SUFDM0VBLElBQUksQ0FBQyxzREFBc0QsRUFBRSxDQUFDLENBQUM7O0lBRS9EO0lBQ0FBLElBQUksQ0FDRiwrR0FBK0csRUFDL0csQ0FDRixDQUFDO0lBQ0RBLElBQUksQ0FBQyx5RUFBeUUsRUFBRSxDQUFDLENBQUM7SUFDbEZBLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxDQUFDLENBQUM7SUFDeERBLElBQUksQ0FBQyxpREFBaUQsQ0FBQztJQUN2REEsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBRTFCLE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDakxvRDtBQUU5QyxJQUFNdWMsSUFBWSxHQUFHO0VBQzFCNVUsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsTUFBTTtJQUNYc08sS0FBSyxFQUFFLGFBQWE7SUFDcEJILE9BQU8sRUFBRSxJQUFJO0lBQ2IsV0FBUztFQUNYLENBQUM7RUFDREYsV0FBVyxFQUFFO0lBQ1gwSyxZQUFZLEVBQVpBLDhEQUFZQTtFQUNkO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQ0k7QUFHekQsSUFBTVUsTUFBYyxHQUFHO0VBQzVCN1UsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsUUFBUTtJQUNic08sS0FBSyxFQUFFLFFBQVE7SUFDZkMsSUFBSSxFQUFFLHdDQUF3QztJQUM5Q0MsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBOEM4QixPQUFPLEVBQUs7SUFBQSxJQUFyRG9RLE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87TUFBRUUsVUFBVSxHQUFBcFMsSUFBQSxDQUFWb1MsVUFBVTtNQUFFQyxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVsTSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO0lBQy9DLElBQU02UCxJQUFJLEdBQUF6RSxhQUFBO01BQ1JuUixNQUFNLEVBQUU7SUFBSSxHQUNUMEIsT0FBTyxDQUNYO0lBRUQsSUFBTWdTLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQztJQUM1RSxJQUFBeEIsWUFBQSxHQUE4QixJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtNQUFPLENBQUMsQ0FBQztNQUE5RGEsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFc1IsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRWxTLElBQUksR0FBQWlTLFlBQUEsQ0FBSmpTLElBQUk7SUFFekJZLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUM1QkEsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNuQkEsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNoQnNSLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLDhCQUFBTCxNQUFBLENBQTZCc1IsT0FBTyxVQUFNLENBQUM7O0lBRS9DO0lBQ0EsSUFBTWpDLE9BQU8sR0FBRy9NLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQztJQUV2QyxJQUFJbkMsT0FBTyxDQUFDL1AsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUN4QmUsSUFBSSxnREFBQUwsTUFBQSxDQUM0Q3FQLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBQXJQLE1BQUEsQ0FBTWtDLHNFQUFxQixDQUNqRnNQLFVBQVUsQ0FBQ25DLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDdkIsQ0FBQyxVQUNILENBQUM7SUFDSCxDQUFDLE1BQU0sSUFBSUEsT0FBTyxDQUFDL1AsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUM3QmUsSUFBSSxDQUFDLGtEQUFrRCxDQUFDO01BQ3hEZ1AsT0FBTyxDQUFDL0osT0FBTyxDQUFDLFVBQUExQyxHQUFHLEVBQUk7UUFDckJ2QyxJQUFJLE9BQUFMLE1BQUEsQ0FBTTRDLEdBQUcsWUFBQTVDLE1BQUEsQ0FBT2tDLHNFQUFxQixDQUFDc1AsVUFBVSxDQUFDNU8sR0FBRyxDQUFDLENBQUMsV0FBTyxDQUFDLENBQUM7TUFDckUsQ0FBQyxDQUFDO01BQ0Z2QyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ2Q7O0lBRUE7SUFDQSxJQUFJb1IsUUFBUSxDQUFDSyxJQUFJLEVBQUU7TUFDakI7TUFDQXpSLElBQUkseUNBQUFMLE1BQUEsQ0FBeUM2QixJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLFFBQUssQ0FBQztJQUNsRjs7SUFFQTtJQUNBSCxLQUFLLENBQUMsQ0FBQztJQUVQLElBQU11SyxDQUFDLEdBQUc3TSxPQUFPLENBQUMvUCxNQUFNLEdBQUcsV0FBVyxHQUFHLEVBQUU7SUFDM0MsSUFBTTZjLENBQUMsR0FBRzFLLFFBQVEsQ0FBQ0ssSUFBSSxHQUFHLFFBQVEsR0FBRyxFQUFFO0lBQ3ZDLElBQU1zSyxDQUFDLEdBQUdsSixPQUFPLENBQUNuRCxRQUFRLENBQUN4SyxNQUFNLENBQUNnSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQUF2UCxNQUFBLENBQ3ZDdUYsTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsZ0NBQUE1UixNQUFBLENBQ0V1RixNQUFNLFFBQUk7SUFFekNsRixJQUFJLGdCQUFBTCxNQUFBLENBQWdCa2MsQ0FBQyxFQUFBbGMsTUFBQSxDQUFHbWMsQ0FBQyxFQUFBbmMsTUFBQSxDQUFHb2MsQ0FBQyxTQUFNLENBQUM7O0lBRXBDO0lBQ0EvYixJQUFJLENBQUMsK0JBQStCLENBQUM7SUFDckNBLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLENBQUM7SUFFekMsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzRXdDO0FBRWxDLElBQU00YyxLQUFhLEdBQUc7RUFDM0JqVixJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxPQUFPO0lBQ1pzTyxLQUFLLEVBQUUsT0FBTztJQUNkSCxPQUFPLEVBQUUsS0FBSztJQUNkLFdBQVM7RUFDWCxDQUFDO0VBQ0RGLFdBQVcsRUFBRTtJQUNYb0wsTUFBTSxFQUFOQSxrREFBTUE7RUFDUjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFDSTtBQUV2QjtBQVdsQyxJQUFNTSxJQUF5QixHQUFHO0VBQ3ZDblYsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsTUFBTTtJQUNYc08sS0FBSyxFQUFFLE1BQU07SUFDYkMsSUFBSSxFQUFFLHdDQUF3QztJQUM5Q0MsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFHRjtJQUFBLElBRkQwWCxNQUFNLEdBQUExWCxJQUFBLENBQU4wWCxNQUFNO01BQUVyRixRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVILE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87TUFBRS9MLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFBRXdSLFdBQVcsR0FBQTNYLElBQUEsQ0FBWDJYLFdBQVc7TUFBRXpCLE9BQU8sR0FBQWxXLElBQUEsQ0FBUGtXLE9BQU87TUFBRS9ELFVBQVUsR0FBQW5TLElBQUEsQ0FBVm1TLFVBQVU7SUFBQSxJQUNyRXJRLE9BQU8sR0FBQTdCLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUVaLElBQUFtZCxtQkFBQSxHQVFJdGIsT0FBTyxDQVBUdWIsVUFBVTtNQUFWQSxVQUFVLEdBQUFELG1CQUFBLGNBQUcsS0FBSyxHQUFBQSxtQkFBQTtNQUFBeEMsZUFBQSxHQU9oQjlZLE9BQU8sQ0FOVDFCLE1BQU07TUFBTkEsTUFBTSxHQUFBd2EsZUFBQSxjQUFHLElBQUksR0FBQUEsZUFBQTtNQUFBMEMscUJBQUEsR0FNWHhiLE9BQU8sQ0FMVHliLFlBQVk7TUFBWkEsWUFBWSxHQUFBRCxxQkFBQSxjQUFHLEVBQUUsR0FBQUEscUJBQUE7TUFBQUUsb0JBQUEsR0FLZjFiLE9BQU8sQ0FKVDJiLFdBQVc7TUFBWEEsV0FBVyxHQUFBRCxvQkFBQSxjQUFHLEtBQUssR0FBQUEsb0JBQUE7TUFBQUUsZUFBQSxHQUlqQjViLE9BQU8sQ0FIVDZiLE1BQU07TUFBTkEsTUFBTSxHQUFBRCxlQUFBLGNBQUcsS0FBSyxHQUFBQSxlQUFBO01BQUFFLGtCQUFBLEdBR1o5YixPQUFPLENBRlQrYixTQUFTO01BQVRBLFNBQVMsR0FBQUQsa0JBQUEsY0FBRyxLQUFLLEdBQUFBLGtCQUFBO01BQUE1RyxnQkFBQSxHQUVmbFYsT0FBTyxDQURUbVYsT0FBTztNQUFQQSxPQUFPLEdBQUFELGdCQUFBLGNBQUcsRUFBRSxHQUFBQSxnQkFBQTtJQUdkLElBQUExRSxZQUFBLEdBQThCLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBTkE7TUFBTyxDQUFDLENBQUM7TUFBakRhLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBRXpCLElBQUksQ0FBQ3NkLE1BQU0sRUFBRTtNQUNYMWMsSUFBSSxDQUFDNGMsU0FBUyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7TUFDaEN0TCxLQUFLLENBQUMsQ0FBQztJQUNUO0lBRUF0UixJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDNUJzUixLQUFLLENBQUMsQ0FBQztJQUVQLElBQU11TCxXQUFXLEdBQUcsQ0FDbEI7TUFDRTNNLE1BQU0sRUFBRSxJQUFJO01BQ1ozSCxJQUFJLEVBQUUsY0FBYztNQUNwQjNHLEtBQUssRUFBRTZVLE1BQU0sQ0FBQ29EO0lBQ2hCLENBQUMsRUFDRDtNQUNFM0osTUFBTSxFQUFFLElBQUk7TUFDWjNILElBQUksRUFBRSxhQUFhO01BQ25CM0csS0FBSyxFQUFFcVA7SUFDVCxDQUFDLEVBQ0Q7TUFDRWYsTUFBTSxFQUFFLEtBQUs7TUFDYjNILElBQUksRUFBRSx3QkFBd0I7TUFDOUIzRyxLQUFLLEVBQUU7SUFDVCxDQUFDLEVBQ0Q7TUFDRXNPLE1BQU0sRUFBRSxJQUFJO01BQ1ozSCxJQUFJLEVBQUUsa0JBQWtCO01BQ3hCM0csS0FBSyxFQUFFO0lBQ1QsQ0FBQyxFQUNEO01BQ0VzTyxNQUFNLEVBQUUsS0FBSztNQUNiM0gsSUFBSSxFQUFFLG1CQUFtQjtNQUN6QjNHLEtBQUssRUFBRTBhO0lBQ1QsQ0FBQyxFQUNEO01BQ0VwTSxNQUFNLEVBQUUsS0FBSztNQUNiM0gsSUFBSSxFQUFFLGlCQUFpQjtNQUN2QjNHLEtBQUssRUFBRW9VO0lBQ1QsQ0FBQyxFQUNEO01BQ0U5RixNQUFNLEVBQUUsS0FBSztNQUNiM0gsSUFBSSxFQUFFLHNCQUFzQjtNQUM1QjNHLEtBQUssRUFBRThVLFdBQVcsS0FBSyxVQUFVLEdBQUcsdUJBQXVCLEdBQUc7SUFDaEUsQ0FBQyxFQUNEO01BQ0V4RyxNQUFNLEVBQUUsSUFBSTtNQUNaM0gsSUFBSSxFQUFFLHVCQUF1QjtNQUM3QjNHLEtBQUssRUFBRXNEO0lBQ1QsQ0FBQyxFQUNEO01BQ0VnTCxNQUFNLEVBQUUsQ0FBQ2tCLFFBQVEsQ0FBQzJCLE9BQU87TUFDekJ4SyxJQUFJLEVBQUUsb0JBQW9CO01BQzFCM0csS0FBSyxFQUFFd1AsUUFBUSxHQUNYQSxRQUFRLENBQUMyQixPQUFPLGtCQUFBcFQsTUFBQSxDQUNDc2MscURBQVcsQ0FBQzdLLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRTVULE1BQU0sQ0FBQ08sTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFUCxNQUFNLENBQUMsU0FDdEVpUyxRQUFRLENBQUNLLElBQUksR0FDZnZTO0lBQ04sQ0FBQyxDQUNGO0lBRURjLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUVsQyxJQUFNOGMsUUFBUSxHQUFHLElBQUlsZSw4REFBVyxDQUFDO01BQUVPLE1BQU0sRUFBTkEsTUFBTTtNQUFFQyxJQUFJLE9BQUFPLE1BQUEsQ0FBT1IsTUFBTTtJQUFHLENBQUMsQ0FBQztJQUVqRTBkLFdBQVcsQ0FBQzVYLE9BQU8sQ0FBQyxVQUFBc1EsS0FBQSxFQUE2QjtNQUFBLElBQTFCM1QsS0FBSyxHQUFBMlQsS0FBQSxDQUFMM1QsS0FBSztRQUFFMkcsSUFBSSxHQUFBZ04sS0FBQSxDQUFKaE4sSUFBSTtRQUFFMkgsTUFBTSxHQUFBcUYsS0FBQSxDQUFOckYsTUFBTTtNQUN4QyxJQUFJdE8sS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLMUMsU0FBUyxFQUFFO1FBQ3pDNGQsUUFBUSxDQUFDOWMsSUFBSSxJQUFBTCxNQUFBLENBQUk0SSxJQUFJLFVBQUE1SSxNQUFBLENBQU91USxNQUFNLEdBQUcxTyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0csS0FBSyxDQUFDLEdBQUdBLEtBQUssTUFBRyxDQUFDO01BQ3hFO0lBQ0YsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsSUFBTW1iLFdBQVcsR0FBRzlILE9BQU8sQ0FBQzNULEdBQUcsQ0FDN0IsVUFBQWtRLE1BQU07TUFBQSxVQUFBN1IsTUFBQSxDQUFPK1osa0JBQWtCLENBQUNsSSxNQUFNLENBQUNqSixJQUFJLENBQUMsT0FBQTVJLE1BQUEsQ0FBSStaLGtCQUFrQixDQUFDbEksTUFBTSxDQUFDNVAsS0FBSyxDQUFDO0lBQUEsQ0FDbEYsQ0FBQztJQUNELElBQUltYixXQUFXLENBQUM5ZCxNQUFNLEVBQUU7TUFDdEI2ZCxRQUFRLENBQUM5YyxJQUFJLHdCQUFBTCxNQUFBLENBQXVCb2QsV0FBVyxDQUFDM2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFJLENBQUM7SUFDakU7O0lBRUE7SUFDQSxJQUFNNFAsT0FBTyxHQUFHL00sTUFBTSxDQUFDOEcsSUFBSSxDQUFDbUksVUFBVSxDQUFDLENBQ3BDOEwsSUFBSSxDQUFDLENBQUMsQ0FDTjFiLEdBQUcsQ0FBQyxVQUFBaUIsR0FBRztNQUFBLFlBQUE1QyxNQUFBLENBQVE0QyxHQUFHLFFBQUE1QyxNQUFBLENBQUtrQyxzRUFBcUIsQ0FBQ3FQLFVBQVUsQ0FBQzNPLEdBQUcsQ0FBQyxDQUFDO0lBQUEsQ0FBRyxDQUFDO0lBRXBFLElBQUl5TSxPQUFPLENBQUMvUCxNQUFNLEVBQUU7TUFDbEI2ZCxRQUFRLENBQUM5YyxJQUFJLENBQUMseUJBQXlCLENBQUM7TUFDeEM4YyxRQUFRLENBQUM5YyxJQUFJLENBQUNnUCxPQUFPLENBQUM1UCxJQUFJLE9BQUFPLE1BQUEsQ0FBT1IsTUFBTSxFQUFBUSxNQUFBLENBQUdSLE1BQU0sQ0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3ZEMmQsUUFBUSxDQUFDOWMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQjtJQUVBQSxJQUFJLENBQUM4YyxRQUFRLENBQUMxZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QlksSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNYc1IsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQywrQkFBK0IsQ0FBQztJQUNyQ0EsSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQ2pDc1IsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUMxQnNSLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLENBQUMsYUFBYSxDQUFDO0lBRW5CLElBQUl3YyxXQUFXLEVBQUU7TUFDZnhjLElBQUksQ0FBQyw2REFBNkQsRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQyxNQUFNO01BQ0xBLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLENBQUM7SUFDekM7SUFFQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNoQkEsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUMxQkEsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUVULElBQUksQ0FBQzBjLE1BQU0sSUFBSU4sVUFBVSxFQUFFO01BQ3pCOUssS0FBSyxDQUFDLENBQUM7TUFDUHRSLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDWjtJQUVBLE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbktEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFDSTtBQUNlO0FBRXRDO0FBU2xDLElBQU02ZCxNQUE2QixHQUFHO0VBQzNDbFcsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsUUFBUTtJQUNic08sS0FBSyxFQUFFLFFBQVE7SUFDZkMsSUFBSSxFQUFFLHNDQUFzQztJQUM1Q0MsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBdUQ4QixPQUFPLEVBQUs7SUFBQSxJQUE5RHVRLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUgsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztNQUFFL0wsTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFK1AsT0FBTyxHQUFBbFcsSUFBQSxDQUFQa1csT0FBTztNQUFFL0QsVUFBVSxHQUFBblMsSUFBQSxDQUFWbVMsVUFBVTtJQUN4RCxJQUFNNkQsSUFBSSxHQUFBekUsYUFBQTtNQUNSOEwsVUFBVSxFQUFFLEtBQUs7TUFDakJqZCxNQUFNLEVBQUUsSUFBSTtNQUNadWQsTUFBTSxFQUFFLEtBQUs7TUFDYkUsU0FBUyxFQUFFO0lBQUssR0FDYi9iLE9BQU8sQ0FDWDtJQUVELElBQUF3USxZQUFBLEdBQThCLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BQTlEYSxJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVzUixLQUFLLEdBQUFELFlBQUEsQ0FBTEMsS0FBSztNQUFFbFMsSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtJQUN6QixJQUFBOGQsYUFBQSxHQUlJLElBQUl0ZSw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWO01BQU8sQ0FBQyxDQUFDO01BSHBDZ2UsV0FBVyxHQUFBRCxhQUFBLENBQWpCcGQsSUFBSTtNQUNFc2QsV0FBVyxHQUFBRixhQUFBLENBQWpCbGQsSUFBSTtNQUNFcWQsV0FBVyxHQUFBSCxhQUFBLENBQWpCOWQsSUFBSTtJQUdOLElBQUksQ0FBQzJWLElBQUksQ0FBQzJILE1BQU0sRUFBRTtNQUNoQjFjLElBQUksQ0FBQytVLElBQUksQ0FBQzZILFNBQVMsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDO01BQ3JDdEwsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBLFFBQVFGLFFBQVEsQ0FBQzVCLFFBQVE7TUFDdkIsS0FBSyxtQ0FBbUM7UUFDdEM0TixXQUFXLHFCQUFBemQsTUFBQSxDQUNXc2MscURBQVcsQ0FDN0I3SyxRQUFRLENBQUM0QixTQUFTLEVBQ2xCK0IsSUFBSSxDQUFDNVYsTUFBTSxHQUFHNFYsSUFBSSxDQUFDNVYsTUFBTSxFQUN6QjRWLElBQUksQ0FBQzVWLE1BQ1AsQ0FBQyxRQUNELENBQ0YsQ0FBQztRQUNEO01BRUYsS0FBSyxxQkFBcUI7UUFBRTtVQVExQixJQUFNbWUsTUFBd0IsR0FBRyxFQUFFO1VBRW5DLElBQUlsTSxRQUFRLENBQUMwQixNQUFNLEVBQUU7WUFDbkIxQixRQUFRLENBQUMwQixNQUFNLENBQUM3TixPQUFPLENBQUMsVUFBVWtPLEtBQUssRUFBRTtjQUN2QyxJQUFJQSxLQUFLLENBQUNDLFFBQVEsRUFBRTtnQkFDbEIsSUFBTWpHLEtBQXFCLEdBQUc7a0JBQzVCNUUsSUFBSSxFQUFFNEssS0FBSyxDQUFDNUssSUFBSTtrQkFDaEI2UixRQUFRLEVBQUVqSCxLQUFLLENBQUNDLFFBQVE7a0JBQ3hCbUssUUFBUSxFQUFFcEssS0FBSyxDQUFDdlI7Z0JBQ2xCLENBQUM7Z0JBRUQsSUFBSXVSLEtBQUssQ0FBQ2lDLFdBQVcsRUFBRTtrQkFDckJqSSxLQUFLLENBQUM2QixPQUFPLEdBQUc7b0JBQUUsY0FBYyxFQUFFbUUsS0FBSyxDQUFDaUM7a0JBQVksQ0FBQztnQkFDdkQ7Z0JBRUFrSSxNQUFNLENBQUN0ZCxJQUFJLENBQUNtTixLQUFLLENBQUM7Y0FDcEIsQ0FBQyxNQUFNLElBQUlnRyxLQUFLLENBQUN2UixLQUFLLEVBQUU7Z0JBQ3RCMGIsTUFBTSxDQUFDdGQsSUFBSSxDQUFDO2tCQUNWdUksSUFBSSxFQUFFNEssS0FBSyxDQUFDNUssSUFBSTtrQkFDaEJnVixRQUFRLEVBQUVwSyxLQUFLLENBQUN2UjtnQkFDbEIsQ0FBQyxDQUFDO2NBQ0o7WUFDRixDQUFDLENBQUM7VUFDSjtVQUVBLElBQUkwYixNQUFNLENBQUNyZSxNQUFNLEVBQUU7WUFDakJtZSxXQUFXLG1CQUFBemQsTUFBQSxDQUNTc2MscURBQVcsQ0FBQ3FCLE1BQU0sRUFBRXZJLElBQUksQ0FBQzVWLE1BQU0sR0FBRzRWLElBQUksQ0FBQzVWLE1BQU0sRUFBRTRWLElBQUksQ0FBQzVWLE1BQU0sQ0FBQyxHQUM3RSxDQUNGLENBQUM7O1lBRUQ7WUFDQSxJQUFJaVEsMkRBQVMsQ0FBQzhCLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBRTtjQUFBLElBQUE4SCxVQUFBO2NBQ3pDLEtBQUFBLFVBQUEsR0FBSTlMLDJEQUFTLENBQUNnRSxVQUFVLEVBQUUsY0FBYyxDQUFDLGNBQUE4SCxVQUFBLGVBQXJDQSxVQUFBLENBQXVDd0UsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUM5RCxJQUFNck8sVUFBVSxHQUFHSiwrREFBYSxDQUFDbUMsVUFBVSxFQUFFLGNBQWMsQ0FBQztnQkFDNUQsSUFBSS9CLFVBQVUsRUFBRTtrQkFDZCxPQUFPK0IsVUFBVSxDQUFDL0IsVUFBVSxDQUFDO2dCQUMvQjtjQUNGO1lBQ0Y7VUFDRjtVQUNBO1FBQ0Y7TUFFQTtRQUNFLElBQUlpQyxRQUFRLENBQUNLLElBQUksRUFBRTtVQUNqQjJMLFdBQVcsY0FBQXpkLE1BQUEsQ0FBY3NjLHFEQUFXLENBQUM3SyxRQUFRLENBQUNLLElBQUksQ0FBQyxRQUFLLENBQUMsQ0FBQztRQUM1RDtJQUNKOztJQUVBO0lBQ0EsSUFBTXpDLE9BQU8sR0FBRy9NLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ21JLFVBQVUsQ0FBQyxDQUNwQzhMLElBQUksQ0FBQyxDQUFDLENBQ04xYixHQUFHLENBQUMsVUFBVWlCLEdBQUcsRUFBRTtNQUNsQixVQUFBNUMsTUFBQSxDQUNFb1YsSUFBSSxDQUFDNVYsTUFBTSxFQUFBUSxNQUFBLENBQ1ZvVixJQUFJLENBQUM1VixNQUFNLE9BQUFRLE1BQUEsQ0FBSTRDLEdBQUcsWUFBQTVDLE1BQUEsQ0FBU2dDLHNFQUFxQixDQUFDdVAsVUFBVSxDQUFDM08sR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDOztJQUVKO0lBQ0EsSUFBTWtiLFlBQVksR0FBR3hJLE9BQU8sQ0FDekIzVCxHQUFHLENBQUMsVUFBQWtRLE1BQU07TUFBQSxVQUFBN1IsTUFBQSxDQUFPK1osa0JBQWtCLENBQUNsSSxNQUFNLENBQUNqSixJQUFJLENBQUMsT0FBQTVJLE1BQUEsQ0FBSStaLGtCQUFrQixDQUFDbEksTUFBTSxDQUFDNVAsS0FBSyxDQUFDO0lBQUEsQ0FBRSxDQUFDLENBQ3ZGeEMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNiLElBQUlxZSxZQUFZLENBQUN4ZSxNQUFNLEVBQUU7TUFDdkIrUCxPQUFPLENBQUNoUCxJQUFJLElBQUFMLE1BQUEsQ0FDUG9WLElBQUksQ0FBQzVWLE1BQU0sRUFBQVEsTUFBQSxDQUFHb1YsSUFBSSxDQUFDNVYsTUFBTSxtQkFBQVEsTUFBQSxDQUFnQmdDLHNFQUFxQixDQUFDOGIsWUFBWSxDQUFDLE9BQ2pGLENBQUM7SUFDSDtJQUVBLElBQUl6TyxPQUFPLENBQUMvUCxNQUFNLEVBQUU7TUFDbEJtZSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO01BQ2hDQSxXQUFXLENBQUNwTyxPQUFPLENBQUM1UCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDL0JnZSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0QjtJQUVBcGQsSUFBSSxDQUFDLHVDQUF1QyxDQUFDO0lBQzdDc1IsS0FBSyxDQUFDLENBQUM7SUFFUCxJQUFJNkwsV0FBVyxDQUFDbGUsTUFBTSxFQUFFO01BQ3RCZSxJQUFJLGtDQUFBTCxNQUFBLENBQWtDdUYsTUFBTSxVQUFBdkYsTUFBQSxDQUFPc1IsT0FBTyxTQUFNLENBQUM7TUFDakVqUixJQUFJLENBQUNxZCxXQUFXLENBQUMsQ0FBQyxDQUFDO01BQ25CcmQsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNiLENBQUMsTUFBTTtNQUNMQSxJQUFJLGtDQUFBTCxNQUFBLENBQWtDdUYsTUFBTSxVQUFBdkYsTUFBQSxDQUFPc1IsT0FBTyxRQUFLLENBQUM7SUFDbEU7SUFFQUssS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUVsQyxJQUFJLENBQUMrVSxJQUFJLENBQUMySCxNQUFNLElBQUkzSCxJQUFJLENBQUNxSCxVQUFVLEVBQUU7TUFDbkM5SyxLQUFLLENBQUMsQ0FBQztNQUNQdFIsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNaO0lBRUEsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkttRDtBQUU3QyxJQUFNNmMsWUFBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUkzWixHQUFnQixFQUFFbkQsTUFBZSxFQUFFdWUsVUFBbUIsRUFBSztFQUNyRkEsVUFBVSxHQUFHQSxVQUFVLElBQUksRUFBRTtFQUM3QnZlLE1BQU0sR0FBR0EsTUFBTSxJQUFJLEVBQUU7RUFFckIsUUFBUThDLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDYixRQUFRLENBQUNpRCxJQUFJLENBQUNoQyxHQUFHLENBQUM7SUFDekMsS0FBSyxlQUFlO01BQ2xCLE9BQU8sTUFBTTtJQUVmLEtBQUssb0JBQW9CO01BQ3ZCLE9BQU8sTUFBTTtJQUVmLEtBQUssaUJBQWlCO01BQ3BCLFdBQUEzQyxNQUFBLENBQVdnQiw2REFBWSxDQUFDMkIsR0FBRyxFQUFFO1FBQUV2QixTQUFTLEVBQUUsR0FBRztRQUFFSSxjQUFjLEVBQUU7TUFBTSxDQUFDLENBQUM7SUFFekUsS0FBSyxpQkFBaUI7TUFDcEIsT0FBT21CLEdBQUcsQ0FBQ2pCLFFBQVEsQ0FBQyxDQUFDO0lBRXZCLEtBQUssZ0JBQWdCO01BQUU7UUFDckIsSUFBTWtjLFFBQVEsR0FBR2piLEdBQUcsQ0FDakJoQixHQUFHLENBQUMsVUFBQ3FjLElBQVM7VUFBQSxPQUFLMUIsWUFBVyxDQUFDMEIsSUFBSSxLQUFBaGUsTUFBQSxDQUFLUixNQUFNLEVBQUFRLE1BQUEsQ0FBR1IsTUFBTSxHQUFJQSxNQUFNLENBQUM7UUFBQSxFQUFDLENBQ25FQyxJQUFJLE9BQUFPLE1BQUEsQ0FBT1IsTUFBTSxDQUFFLENBQUM7UUFDdkIsYUFBQVEsTUFBQSxDQUFhUixNQUFNLEVBQUFRLE1BQUEsQ0FBRzRkLFFBQVEsUUFBQTVkLE1BQUEsQ0FBSytkLFVBQVU7TUFDL0M7SUFFQSxLQUFLLGlCQUFpQjtNQUFFO1FBQ3RCLElBQU1oWSxNQUFnQixHQUFHLEVBQUU7UUFDM0IsS0FBSyxJQUFNdUMsQ0FBQyxJQUFJM0YsR0FBRyxFQUFFO1VBQ25CLElBQUlMLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDRSxjQUFjLENBQUNrQyxJQUFJLENBQUNoQyxHQUFHLEVBQUUyRixDQUFDLENBQUMsRUFBRTtZQUNoRHZDLE1BQU0sQ0FBQzFGLElBQUksSUFBQUwsTUFBQSxDQUNOc2MsWUFBVyxDQUFDaFUsQ0FBQyxFQUFFOUksTUFBTSxDQUFDLFVBQUFRLE1BQUEsQ0FBT3NjLFlBQVcsQ0FBQzNaLEdBQUcsQ0FBQzJGLENBQUMsQ0FBQyxLQUFBdEksTUFBQSxDQUFLUixNQUFNLEVBQUFRLE1BQUEsQ0FBR1IsTUFBTSxHQUFJQSxNQUFNLENBQUMsQ0FDbkYsQ0FBQztVQUNIO1FBQ0Y7UUFDQSxhQUFBUSxNQUFBLENBQWFSLE1BQU0sRUFBQVEsTUFBQSxDQUFHK0YsTUFBTSxDQUFDdEcsSUFBSSxPQUFBTyxNQUFBLENBQU9SLE1BQU0sQ0FBRSxDQUFDLFFBQUFRLE1BQUEsQ0FBSytkLFVBQVU7TUFDbEU7SUFFQTtNQUNFLE9BQU8sTUFBTTtFQUNqQjtBQUNGLENBQUM7QUFBQztBQUVLLElBQU10SixnQkFBZ0IsR0FBRyxDQUM5QixLQUFLLEVBQ0wsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1AsTUFBTSxFQUNOLE9BQU8sRUFDUCxZQUFZLEVBQ1osT0FBTyxFQUNQLGFBQWEsRUFDYixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixRQUFRLEVBQ1IsUUFBUSxFQUNSLGlCQUFpQixDQUNsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU0RDtBQUVEO0FBUXBELElBQU15SixLQUEyQixHQUFHO0VBQ3pDOVcsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsT0FBTztJQUNac08sS0FBSyxFQUFFLFNBQVM7SUFDaEJDLElBQUksRUFBRSx3Q0FBd0M7SUFDOUNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQWlGO0lBQUEsSUFBNUVtRyxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUUwTixHQUFHLEdBQUE3VCxJQUFBLENBQUg2VCxHQUFHO01BQUV4QixRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUV1QixRQUFRLEdBQUE1VCxJQUFBLENBQVI0VCxRQUFRO01BQUV6QixVQUFVLEdBQUFuUyxJQUFBLENBQVZtUyxVQUFVO01BQUU0TSxVQUFVLEdBQUEvZSxJQUFBLENBQVYrZSxVQUFVO0lBQUEsSUFBSWpkLE9BQU8sR0FBQTdCLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUNqRixJQUFBbWQsbUJBQUEsR0FBaUZ0YixPQUFPLENBQWhGdWIsVUFBVTtNQUFWQSxVQUFVLEdBQUFELG1CQUFBLGNBQUcsS0FBSyxHQUFBQSxtQkFBQTtNQUFBeEMsZUFBQSxHQUF1RDlZLE9BQU8sQ0FBNUQxQixNQUFNO01BQU5BLE1BQU0sR0FBQXdhLGVBQUEsY0FBRyxJQUFJLEdBQUFBLGVBQUE7TUFBQThDLGVBQUEsR0FBd0M1YixPQUFPLENBQTdDNmIsTUFBTTtNQUFOQSxNQUFNLEdBQUFELGVBQUEsY0FBRyxLQUFLLEdBQUFBLGVBQUE7TUFBQUUsa0JBQUEsR0FBd0I5YixPQUFPLENBQTdCK2IsU0FBUztNQUFUQSxTQUFTLEdBQUFELGtCQUFBLGNBQUcsS0FBSyxHQUFBQSxrQkFBQTtJQUU1RSxJQUFBdEwsWUFBQSxHQUE4QixJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQU5BO01BQU8sQ0FBQyxDQUFDO01BQWpEYSxJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVzUixLQUFLLEdBQUFELFlBQUEsQ0FBTEMsS0FBSztNQUFFbFMsSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtJQUV6QixJQUFJLENBQUNzZCxNQUFNLEVBQUU7TUFDWDFjLElBQUksQ0FBQzRjLFNBQVMsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDO01BQ2hDdEwsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBLElBQUksQ0FBQzhDLHNEQUFnQixDQUFDMUUsUUFBUSxDQUFDeEssTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ3BEdlIsSUFBSSxpQ0FBQUwsTUFBQSxDQUFpQ3VGLE1BQU0sUUFBSyxDQUFDO0lBQ25EO0lBRUFsRixJQUFJLENBQUMsK0JBQStCLENBQUM7SUFDckNBLElBQUkscUJBQUFMLE1BQUEsQ0FBcUJzYyxxREFBVyxDQUFDckosR0FBRyxDQUFDLE9BQUksQ0FBQztJQUU5QyxJQUFJd0Isc0RBQWdCLENBQUMxRSxRQUFRLENBQUN4SyxNQUFNLENBQUNxTSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDbkR2UixJQUFJLGtDQUFBTCxNQUFBLENBQWtDdUYsTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsT0FBSSxDQUFDO0lBQ2pFLENBQUMsTUFBTTtNQUNMdlIsSUFBSSwrQ0FBQUwsTUFBQSxDQUErQ3VGLE1BQU0sQ0FBQ3FNLFdBQVcsQ0FBQyxDQUFDLE9BQUksQ0FBQztJQUM5RTtJQUVBRCxLQUFLLENBQUMsQ0FBQztJQUVQLElBQUlyUCxNQUFNLENBQUM4RyxJQUFJLENBQUM0SixRQUFRLENBQUMsQ0FBQzFULE1BQU0sRUFBRTtNQUNoQ2UsSUFBSSwyQkFBQUwsTUFBQSxDQUEyQnNjLHFEQUFXLENBQUN0SixRQUFRLEVBQUV4VCxNQUFNLENBQUMsT0FBSSxDQUFDO01BQ2pFbVMsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBLElBQUlyUCxNQUFNLENBQUM4RyxJQUFJLENBQUNtSSxVQUFVLENBQUMsQ0FBQ2pTLE1BQU0sRUFBRTtNQUNsQ2UsSUFBSSx5QkFBQUwsTUFBQSxDQUF5QnNjLHFEQUFXLENBQUMvSyxVQUFVLEVBQUUvUixNQUFNLENBQUMsT0FBSSxDQUFDO01BQ2pFbVMsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBLElBQUlyUCxNQUFNLENBQUM4RyxJQUFJLENBQUMrVSxVQUFVLENBQUMsQ0FBQzdlLE1BQU0sRUFBRTtNQUNsQ2UsSUFBSSx5QkFBQUwsTUFBQSxDQUF5QnNjLHFEQUFXLENBQUM2QixVQUFVLEVBQUUzZSxNQUFNLENBQUMsT0FBSSxDQUFDO01BQ2pFbVMsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBLFFBQVFGLFFBQVEsQ0FBQzVCLFFBQVE7TUFDdkIsS0FBSyxtQ0FBbUM7UUFDdEN4UCxJQUFJLDZCQUFBTCxNQUFBLENBQTZCc2MscURBQVcsQ0FBQzdLLFFBQVEsQ0FBQzVCLFFBQVEsQ0FBQyxPQUFJLENBQUM7UUFDcEV4UCxJQUFJLDRCQUFBTCxNQUFBLENBQTRCc2MscURBQVcsQ0FBQzdLLFFBQVEsQ0FBQzRCLFNBQVMsRUFBRTdULE1BQU0sQ0FBQyxPQUFJLENBQUM7UUFDNUVtUyxLQUFLLENBQUMsQ0FBQztRQUNQO01BRUYsS0FBSyxrQkFBa0I7UUFDckJ0UixJQUFJLDZCQUFBTCxNQUFBLENBQTZCc2MscURBQVcsQ0FBQzdLLFFBQVEsQ0FBQzVCLFFBQVEsQ0FBQyxPQUFJLENBQUM7UUFDcEV4UCxJQUFJLGtDQUFBTCxNQUFBLENBQWtDc2MscURBQVcsQ0FBQzdLLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRTVULE1BQU0sQ0FBQyxRQUFLLENBQUM7UUFDakZtUyxLQUFLLENBQUMsQ0FBQztRQUNQO01BRUY7UUFDRSxJQUFJRixRQUFRLENBQUNLLElBQUksRUFBRTtVQUNqQnpSLElBQUksc0JBQUFMLE1BQUEsQ0FBc0JzYyxxREFBVyxDQUFDN0ssUUFBUSxDQUFDSyxJQUFJLENBQUMsT0FBSSxDQUFDO1VBQ3pESCxLQUFLLENBQUMsQ0FBQztRQUNUO0lBQ0o7SUFFQXRSLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDYkEsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQztJQUN4Q3NSLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDQSxJQUFJLENBQUMsK0JBQStCLENBQUM7SUFDckNBLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCQSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRVQsSUFBSSxDQUFDMGMsTUFBTSxJQUFJTixVQUFVLEVBQUU7TUFDekI5SyxLQUFLLENBQUMsQ0FBQztNQUNQdFIsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNaO0lBRUEsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQ21CO0FBRXRDO0FBUWxDLElBQU0yZSxLQUEyQixHQUFHO0VBQ3pDaFgsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsT0FBTztJQUNac08sS0FBSyxFQUFFLFNBQVM7SUFDaEJDLElBQUksRUFBRSwwQ0FBMEM7SUFDaERDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQWlGO0lBQUEsSUFBNUVxUyxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVGLFVBQVUsR0FBQW5TLElBQUEsQ0FBVm1TLFVBQVU7TUFBRWhNLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFBRXlOLFFBQVEsR0FBQTVULElBQUEsQ0FBUjRULFFBQVE7TUFBRW1MLFVBQVUsR0FBQS9lLElBQUEsQ0FBVitlLFVBQVU7TUFBRWxMLEdBQUcsR0FBQTdULElBQUEsQ0FBSDZULEdBQUc7SUFBQSxJQUFJL1IsT0FBTyxHQUFBN0IsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsQ0FBQyxDQUFDO0lBQ2pGLElBQUFtZCxtQkFBQSxHQUFpRnRiLE9BQU8sQ0FBaEZ1YixVQUFVO01BQVZBLFVBQVUsR0FBQUQsbUJBQUEsY0FBRyxLQUFLLEdBQUFBLG1CQUFBO01BQUF4QyxlQUFBLEdBQXVEOVksT0FBTyxDQUE1RDFCLE1BQU07TUFBTkEsTUFBTSxHQUFBd2EsZUFBQSxjQUFHLElBQUksR0FBQUEsZUFBQTtNQUFBOEMsZUFBQSxHQUF3QzViLE9BQU8sQ0FBN0M2YixNQUFNO01BQU5BLE1BQU0sR0FBQUQsZUFBQSxjQUFHLEtBQUssR0FBQUEsZUFBQTtNQUFBRSxrQkFBQSxHQUF3QjliLE9BQU8sQ0FBN0IrYixTQUFTO01BQVRBLFNBQVMsR0FBQUQsa0JBQUEsY0FBRyxLQUFLLEdBQUFBLGtCQUFBO0lBRTVFLElBQUF0TCxZQUFBLEdBQThCLElBQUl6Uyw4REFBVyxDQUFDO1FBQUVPLE1BQU0sRUFBTkE7TUFBTyxDQUFDLENBQUM7TUFBakRhLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBQ3pCLElBQUlrYyxPQUFPLEdBQUcsS0FBSztJQUVuQixJQUFJLENBQUNvQixNQUFNLEVBQUU7TUFDWDFjLElBQUksQ0FBQzRjLFNBQVMsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDO01BQ2hDdEwsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBdFIsSUFBSSxDQUFDLDZCQUE2QixDQUFDO0lBQ25DQSxJQUFJLENBQUMsdUNBQXVDLENBQUM7SUFDN0NzUixLQUFLLENBQUMsQ0FBQztJQUVQLFFBQVFGLFFBQVEsQ0FBQzVCLFFBQVE7TUFDdkIsS0FBSyxtQ0FBbUM7UUFDdEN4UCxJQUFJLENBQUMsa0NBQWtDLENBQUM7UUFDeENBLElBQUksd0NBQUFMLE1BQUEsQ0FBd0NzYyxxREFBVyxDQUFDN0ssUUFBUSxDQUFDNEIsU0FBUyxFQUFFN1QsTUFBTSxDQUFDLFFBQUssQ0FBQztRQUN6Rm1TLEtBQUssQ0FBQyxDQUFDO1FBQ1BnSyxPQUFPLEdBQUcsSUFBSTtRQUNkO01BRUYsS0FBSyxxQkFBcUI7UUFBRTtVQUMxQixJQUFJLENBQUNsSyxRQUFRLENBQUMwQixNQUFNLEVBQUU7WUFDcEI7VUFDRjtVQUVBLElBQU1rTCxLQU1ILEdBQUcsRUFBRTtVQUNSLElBQU1WLE1BQTJCLEdBQUcsQ0FBQyxDQUFDO1VBQ3RDbE0sUUFBUSxDQUFDMEIsTUFBTSxDQUFDN04sT0FBTyxDQUFDLFVBQUFzUSxLQUFBLEVBQTRDO1lBQUEsSUFBekNoTixJQUFJLEdBQUFnTixLQUFBLENBQUpoTixJQUFJO2NBQUU2SyxRQUFRLEdBQUFtQyxLQUFBLENBQVJuQyxRQUFRO2NBQUV4UixLQUFLLEdBQUEyVCxLQUFBLENBQUwzVCxLQUFLO2NBQUV3VCxXQUFXLEdBQUFHLEtBQUEsQ0FBWEgsV0FBVztZQUMzRCxJQUFJaEMsUUFBUSxFQUFFO2NBQ1o0SyxLQUFLLENBQUNoZSxJQUFJLENBQUM7Z0JBQ1R1SSxJQUFJLEVBQUpBLElBQUk7Z0JBQ0psRSxJQUFJLEVBQUUrUSxXQUFXO2dCQUNqQjZJLElBQUksRUFBRTdLLFFBQVE7Z0JBQ2Q2RSxJQUFJLEVBQUVyVztjQUNSLENBQUMsQ0FBQztjQUNGO1lBQ0Y7WUFDQSxJQUFJQSxLQUFLLEVBQUU7Y0FDVDBiLE1BQU0sQ0FBQy9VLElBQUksQ0FBQyxHQUFHM0csS0FBSztZQUN0QjtVQUNGLENBQUMsQ0FBQztVQUVGLElBQU11TCxLQUFLLEdBQUdsTCxNQUFNLENBQUM4RyxJQUFJLENBQUN1VSxNQUFNLENBQUMsQ0FBQ3JlLE1BQU0sR0FBR2dkLHFEQUFXLENBQUNxQixNQUFNLEVBQUVuZSxNQUFNLENBQUMsR0FBRyxNQUFNO1VBQy9FLElBQU0rZSxTQUFTLEdBQUdGLEtBQUssQ0FBQy9lLE1BQU0sR0FBR2dkLHFEQUFXLENBQUMrQixLQUFLLEVBQUU3ZSxNQUFNLENBQUMsR0FBRyxNQUFNO1VBRXBFYSxJQUFJLENBQUMsa0NBQWtDLENBQUM7VUFDeENBLElBQUksbUJBQUFMLE1BQUEsQ0FBbUJ3TixLQUFLLFFBQUF4TixNQUFBLENBQUt1ZSxTQUFTLE9BQUksQ0FBQzs7VUFFL0M7VUFDQSxJQUFJOU8sMkRBQVMsQ0FBQzhCLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBRTtZQUFBLElBQUE4SCxVQUFBO1lBQ3pDLEtBQUFBLFVBQUEsR0FBSTlMLDJEQUFTLENBQUNnRSxVQUFVLEVBQUUsY0FBYyxDQUFDLGNBQUE4SCxVQUFBLGVBQXJDQSxVQUFBLENBQXVDd0UsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2NBQzlELElBQU1yTyxVQUFVLEdBQUdKLCtEQUFhLENBQUNtQyxVQUFVLEVBQUUsY0FBYyxDQUFDO2NBQzVELElBQUkvQixVQUFVLEVBQUU7Z0JBQ2QsT0FBTytCLFVBQVUsQ0FBQy9CLFVBQVUsQ0FBQztjQUMvQjtZQUNGO1VBQ0Y7VUFFQW1DLEtBQUssQ0FBQyxDQUFDO1VBRVBnSyxPQUFPLEdBQUcsSUFBSTtVQUNkO1FBQ0Y7TUFDQSxLQUFLLGtCQUFrQjtRQUNyQnRiLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztRQUN4Q0EsSUFBSSw4QkFBQUwsTUFBQSxDQUE4QnNjLHFEQUFXLENBQUM3SyxRQUFRLENBQUMyQixPQUFPLEVBQUU1VCxNQUFNLENBQUMsUUFBSyxDQUFDO1FBQzdFbWMsT0FBTyxHQUFHLElBQUk7UUFDZDtNQUVGO1FBQ0UsSUFBSWxLLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO1VBQ2pCelIsSUFBSSxDQUFDLGtDQUFrQyxDQUFDO1VBQ3hDQSxJQUFJLGtCQUFBTCxNQUFBLENBQWtCc2MscURBQVcsQ0FBQzdLLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLE9BQUksQ0FBQztVQUNyREgsS0FBSyxDQUFDLENBQUM7VUFDUGdLLE9BQU8sR0FBRyxJQUFJO1FBQ2hCO0lBQ0o7SUFFQXRiLElBQUksNEJBQUFMLE1BQUEsQ0FBNEJzYyxxREFBVyxDQUFDckosR0FBRyxDQUFDLE9BQUksQ0FBQztJQUNyRDVTLElBQUksK0JBQUFMLE1BQUEsQ0FBK0JzYyxxREFBVyxDQUFDL1csTUFBTSxDQUFDLE9BQUksQ0FBQztJQUUzRCxJQUFJb1csT0FBTyxFQUFFO01BQ1h0YixJQUFJLENBQUMsMkJBQTJCLENBQUM7TUFDakNzUixLQUFLLENBQUMsQ0FBQztJQUNUO0lBRUEsSUFBSXJQLE1BQU0sQ0FBQzhHLElBQUksQ0FBQzRKLFFBQVEsQ0FBQyxDQUFDMVQsTUFBTSxFQUFFO01BQ2hDZSxJQUFJLDZDQUFBTCxNQUFBLENBQTZDc2MscURBQVcsQ0FBQ3RKLFFBQVEsRUFBRXhULE1BQU0sQ0FBQyxRQUFLLENBQUM7TUFDcEZtUyxLQUFLLENBQUMsQ0FBQztJQUNUO0lBRUEsSUFBSXJQLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ21JLFVBQVUsQ0FBQyxDQUFDalMsTUFBTSxFQUFFO01BQ2xDZSxJQUFJLHlCQUFBTCxNQUFBLENBQXlCc2MscURBQVcsQ0FBQy9LLFVBQVUsRUFBRS9SLE1BQU0sQ0FBQyxPQUFJLENBQUM7TUFDakVtUyxLQUFLLENBQUMsQ0FBQztJQUNUO0lBRUEsSUFBSXJQLE1BQU0sQ0FBQzhHLElBQUksQ0FBQytVLFVBQVUsQ0FBQyxDQUFDN2UsTUFBTSxFQUFFO01BQ2xDcVMsS0FBSyxDQUFDLENBQUM7TUFDUHRSLElBQUksd0JBQUFMLE1BQUEsQ0FBd0JzYyxxREFBVyxDQUFDNkIsVUFBVSxFQUFFM2UsTUFBTSxDQUFDLE9BQUksQ0FBQztNQUNoRW1TLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7SUFFQXRSLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQztJQUMzQ0EsSUFBSSxDQUFDLHFDQUFxQyxDQUFDO0lBQzNDc1IsS0FBSyxDQUFDLENBQUM7SUFDUHRSLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUVsQyxJQUFJLENBQUMwYyxNQUFNLElBQUlOLFVBQVUsRUFBRTtNQUN6QjlLLEtBQUssQ0FBQyxDQUFDO01BQ1B0UixJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ1o7SUFFQSxPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RKb0M7QUFDSTtBQUNGO0FBQ0E7QUFFaEMsSUFBTStlLEdBQVcsR0FBRztFQUN6QnBYLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLEtBQUs7SUFDVnNPLEtBQUssRUFBRSxLQUFLO0lBQ1pILE9BQU8sRUFBRSxNQUFNO0lBQ2YsV0FBUztFQUNYLENBQUM7RUFDREYsV0FBVyxFQUFFO0lBQ1gwTCxJQUFJLEVBQUpBLDhDQUFJO0lBQ0plLE1BQU0sRUFBTkEsa0RBQU07SUFDTlksS0FBSyxFQUFMQSxnREFBSztJQUNMRSxLQUFLLEVBQUxBLGdEQUFLQTtFQUNQO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJ3RDtBQUNMO0FBQ0Y7QUFLM0MsSUFBTUsseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUF5QkEsQ0FBSUMsT0FBMEIsRUFBSztFQUN2RSxJQUFNck4sT0FBdUIsR0FBRyxTQUExQkEsT0FBdUJBLENBQUFqUyxJQUFBLEVBUXZCO0lBQUEsSUFQSm1HLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07TUFDTmdNLFVBQVUsR0FBQW5TLElBQUEsQ0FBVm1TLFVBQVU7TUFDVitELE9BQU8sR0FBQWxXLElBQUEsQ0FBUGtXLE9BQU87TUFDUHdCLE1BQU0sR0FBQTFYLElBQUEsQ0FBTjBYLE1BQU07TUFDTnhGLE9BQU8sR0FBQWxTLElBQUEsQ0FBUGtTLE9BQU87TUFDUEcsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtNQUNSRCxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO0lBRVYsSUFBQUUsWUFBQSxHQUF1QixJQUFJelMsOERBQVcsQ0FBQyxDQUFDO01BQWhDb0IsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFWixJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBQ2xCLElBQU15VCxPQUFPLEdBQUcsQ0FDZCxTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sT0FBTyxFQUNQLFNBQVMsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLEtBQUssRUFDTCxPQUFPLENBQ1I7SUFDRCxJQUFNeUwsU0FBUyxHQUFHekwsT0FBTyxDQUFDbkQsUUFBUSxDQUFDeEssTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxlQUFlO0lBRXRGLElBQU1nTixjQUFjLEdBQUcsRUFBRTs7SUFFekI7SUFDQSxJQUFNdlAsT0FBTyxHQUFHL00sTUFBTSxDQUFDOEcsSUFBSSxDQUFDbUksVUFBVSxDQUFDOztJQUV2QztJQUNBLElBQUlsQyxPQUFPLENBQUMvUCxNQUFNLEVBQUU7TUFDbEJlLElBQUksQ0FBQyxjQUFjLENBQUM7TUFDcEJnUCxPQUFPLENBQUMvSixPQUFPLENBQUMsVUFBQTFDLEdBQUcsRUFBSTtRQUNyQixJQUFJQSxHQUFHLEtBQUssWUFBWSxFQUFFO1VBQ3hCO1VBQ0F2QyxJQUFJLG1CQUFBTCxNQUFBLENBQWtCNEMsR0FBRyxZQUFBNUMsTUFBQSxDQUFPZ0IsNkRBQVksQ0FBQ3VRLFVBQVUsQ0FBQzNPLEdBQUcsQ0FBQyxFQUFFO1lBQUV0QixVQUFVLEVBQUU7VUFBSSxDQUFDLENBQUMsUUFBSSxDQUFDO1FBQ3pGO01BQ0YsQ0FBQyxDQUFDO01BQ0ZzZCxjQUFjLENBQUN2ZSxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDMUM7O0lBRUE7SUFDQSxJQUFJaVYsT0FBTyxDQUFDaFcsTUFBTSxFQUFFO01BQ2xCZSxJQUFJLENBQUMsdUVBQXVFLENBQUM7TUFFN0VpVixPQUFPLENBQUNoUSxPQUFPLENBQUMsVUFBQXVNLE1BQU0sRUFBSTtRQUN4QnhSLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQztRQUU5Q0EsSUFBSSxvQkFBQUwsTUFBQSxDQUFvQjZSLE1BQU0sQ0FBQ2pKLElBQUksTUFBRyxDQUFDO1FBQ3ZDdkksSUFBSSxxQkFBQUwsTUFBQSxDQUFxQjZSLE1BQU0sQ0FBQzVQLEtBQUssTUFBRyxDQUFDO1FBQ3pDNUIsSUFBSSxzQkFBQUwsTUFBQSxDQUFzQjhXLE1BQU0sQ0FBQ1EsSUFBSSxNQUFHLENBQUM7UUFFekNqWCxJQUFJLENBQUMsK0JBQStCLENBQUM7TUFDdkMsQ0FBQyxDQUFDO01BQ0Z1ZSxjQUFjLENBQUN2ZSxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDN0M7SUFFQSxJQUFJb1IsUUFBUSxDQUFDSyxJQUFJLEVBQUU7TUFDakI4TSxjQUFjLENBQUN2ZSxJQUFJLGtCQUFBTCxNQUFBLENBQ0FnQiw2REFBWSxDQUFDdU0sMkRBQVMsQ0FBQ2lFLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBRTtRQUNuRXBRLFNBQVMsRUFBRSxHQUFHO1FBQ2RFLFVBQVUsRUFBRTtNQUNkLENBQUMsQ0FBQyxNQUNKLENBQUM7TUFDRHNkLGNBQWMsQ0FBQ3ZlLElBQUksV0FBQUwsTUFBQSxDQUFXeVIsUUFBUSxDQUFDSyxJQUFJLE1BQUcsQ0FBQztJQUNqRDtJQUVBelIsSUFBSSxnQkFBQUwsTUFBQSxDQUNhMGUsT0FBTyxhQUFBMWUsTUFBQSxDQUFVc1IsT0FBTyxRQUFBdFIsTUFBQSxDQUFLMmUsU0FBUyxPQUFBM2UsTUFBQSxDQUFJdUYsTUFBTSxPQUFBdkYsTUFBQSxDQUFJNGUsY0FBYyxDQUFDbmYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUM3RixDQUFDO0lBQ0QsT0FBT0EsSUFBSSxDQUFDLENBQUM7RUFDZixDQUFDO0VBQ0QsT0FBTzRSLE9BQU87QUFDaEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ2hGcUQ7QUFFL0MsSUFBTXdOLFVBQWtCLEdBQUc7RUFDaEN6WCxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxZQUFZO0lBQ2pCc08sS0FBSyxFQUFFLG1CQUFtQjtJQUMxQkMsSUFBSSxFQUFFLG1HQUFtRztJQUN6R0MsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUVvTixrRUFBeUIsQ0FBQyxtQkFBbUI7QUFDeEQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWZ0Q7QUFDQTtBQUUxQyxJQUFNTSxVQUFrQixHQUFHO0VBQ2hDM1gsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsWUFBWTtJQUNqQnNPLEtBQUssRUFBRSxZQUFZO0lBQ25CSCxPQUFPLEVBQUUsTUFBTTtJQUNmLFdBQVM7RUFDWCxDQUFDO0VBQ0RGLFdBQVcsRUFBRTtJQUNYaU8sVUFBVSxFQUFWQSwwREFBVTtJQUNWRCxVQUFVLEVBQVZBLDBEQUFVQTtFQUNaO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ2RxRDtBQUUvQyxJQUFNQyxVQUFrQixHQUFHO0VBQ2hDMVgsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsWUFBWTtJQUNqQnNPLEtBQUssRUFBRSxtQkFBbUI7SUFDMUJDLElBQUksRUFBRSxtR0FBbUc7SUFDekdDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFb04sa0VBQXlCLENBQUMsbUJBQW1CO0FBQ3hELENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ1hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU08sWUFBWUEsQ0FDbkJDLFVBQThCLEVBQzlCOVosTUFBVyxFQUNYcVcsTUFBZSxFQUNmTCxXQUFtQixFQUNuQitELFdBQW1CLEVBQ25CO0VBQ0EsSUFBTUMsYUFBYSxHQUFHaEUsV0FBVyxDQUFDcGIsTUFBTSxDQUFDbWYsV0FBVyxDQUFDO0VBQ3JELElBQU1FLGtCQUFrQixHQUFHakUsV0FBVyxDQUFDcGIsTUFBTSxDQUFDbWYsV0FBVyxHQUFHLENBQUMsQ0FBQztFQUM5RCxJQUFNemYsSUFBSSxHQUFHK2IsTUFBTSxTQUFBeGIsTUFBQSxDQUFTbWYsYUFBYSxJQUFLLElBQUk7RUFDbEQsSUFBTUUsWUFBWSxHQUFHSixVQUFVLEtBQUssUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHO0VBQ3hELElBQU1LLFlBQVksR0FBR0wsVUFBVSxLQUFLLFFBQVEsR0FBRyxHQUFHLEdBQUcsR0FBRztFQUV4RCxJQUFJekQsTUFBTSxFQUFFO0lBQ1YsVUFBQXhiLE1BQUEsQ0FBVXFmLFlBQVksUUFBQXJmLE1BQUEsQ0FBS21mLGFBQWEsRUFBQW5mLE1BQUEsQ0FBR21GLE1BQU0sQ0FBQzFGLElBQUksQ0FDcERBLElBQ0YsQ0FBQyxRQUFBTyxNQUFBLENBQUtvZixrQkFBa0IsRUFBQXBmLE1BQUEsQ0FBR3NmLFlBQVk7RUFDekM7RUFFQSxJQUFJTCxVQUFVLEtBQUssUUFBUSxJQUFJOVosTUFBTSxDQUFDN0YsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUNoRCxVQUFBVSxNQUFBLENBQVVxZixZQUFZLE9BQUFyZixNQUFBLENBQUltRixNQUFNLENBQUMxRixJQUFJLENBQUNBLElBQUksQ0FBQyxPQUFBTyxNQUFBLENBQUlzZixZQUFZO0VBQzdEO0VBRUEsVUFBQXRmLE1BQUEsQ0FBVXFmLFlBQVksRUFBQXJmLE1BQUEsQ0FBR21GLE1BQU0sQ0FBQzFGLElBQUksQ0FBQ0EsSUFBSSxDQUFDLEVBQUFPLE1BQUEsQ0FBR3NmLFlBQVk7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNcEUsc0JBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FDaENqWixLQUFVLEVBQ1ZtVCxJQUF5QixFQUN6QjhKLFdBQW9CLEVBQ1o7RUFDUkEsV0FBVyxHQUFHQSxXQUFXLEtBQUszZixTQUFTLEdBQUcsQ0FBQyxHQUFHMmYsV0FBVyxHQUFHLENBQUM7RUFFN0QsUUFBUTVjLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDYixRQUFRLENBQUNpRCxJQUFJLENBQUMxQyxLQUFLLENBQUM7SUFDM0MsS0FBSyxpQkFBaUI7TUFDcEIsT0FBT0EsS0FBSztJQUVkLEtBQUssZ0JBQWdCO01BQUU7UUFDckIsSUFBSXVaLE1BQU0sR0FBRyxLQUFLO1FBQ2xCLElBQU1KLG9CQUF5QixHQUFJblosS0FBSyxDQUFXTixHQUFHLENBQUMsVUFBQTRkLENBQUMsRUFBSTtVQUMxRDtVQUNBLElBQUlqZCxNQUFNLENBQUNDLFNBQVMsQ0FBQ2IsUUFBUSxDQUFDaUQsSUFBSSxDQUFDNGEsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEVBQUU7WUFDM0QvRCxNQUFNLEdBQUdsWixNQUFNLENBQUM4RyxJQUFJLENBQUNtVyxDQUFDLENBQUMsQ0FBQ2pnQixNQUFNLEdBQUcsQ0FBQztVQUNwQztVQUNBLE9BQU80YixzQkFBcUIsQ0FBQ3FFLENBQUMsRUFBRW5LLElBQUksRUFBRThKLFdBQVcsQ0FBQztRQUNwRCxDQUFDLENBQUM7UUFDRixPQUFPRixZQUFZLENBQUMsT0FBTyxFQUFFNUQsb0JBQW9CLEVBQUVJLE1BQU0sRUFBRXBHLElBQUksQ0FBQzVWLE1BQU0sRUFBRTBmLFdBQVcsQ0FBQztNQUN0RjtJQUVBLEtBQUssaUJBQWlCO01BQUU7UUFDdEIsSUFBTTdELGFBQWEsR0FBRyxFQUFFO1FBQ3hCLEtBQUssSUFBTXpZLEdBQUcsSUFBSVgsS0FBSyxFQUFFO1VBQ3ZCb1osYUFBYSxDQUFDaGIsSUFBSSxNQUFBTCxNQUFBLENBQUs0QyxHQUFHLFVBQUE1QyxNQUFBLENBQU1rYixzQkFBcUIsQ0FBQ2paLEtBQUssQ0FBQ1csR0FBRyxDQUFDLEVBQUV3UyxJQUFJLEVBQUU4SixXQUFXLENBQUMsQ0FBRSxDQUFDO1FBQ3pGO1FBQ0EsT0FBT0YsWUFBWSxDQUNqQixRQUFRLEVBQ1IzRCxhQUFhLEVBQ2JqRyxJQUFJLENBQUNvRyxNQUFNLElBQUlILGFBQWEsQ0FBQy9iLE1BQU0sR0FBRyxDQUFDLEVBQ3ZDOFYsSUFBSSxDQUFDNVYsTUFBTSxFQUNYMGYsV0FDRixDQUFDO01BQ0g7SUFFQSxLQUFLLGVBQWU7TUFDbEIsT0FBTyxNQUFNO0lBRWYsS0FBSyxrQkFBa0I7TUFDckIsT0FBT2pkLEtBQUssR0FBRyxNQUFNLEdBQUcsT0FBTztJQUVqQztNQUNFLElBQUlBLEtBQUssS0FBSyxJQUFJLElBQUlBLEtBQUssS0FBSzFDLFNBQVMsRUFBRTtRQUN6QyxPQUFPLEVBQUU7TUFDWDtNQUNBLFlBQUFTLE1BQUEsQ0FBV2lDLEtBQUssQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQzRPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO0VBQ3BEO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFDSTtBQU96RCxJQUFNa1AsT0FBK0IsR0FBRztFQUM3Q3BZLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFNBQVM7SUFDZHNPLEtBQUssRUFBRSxhQUFhO0lBQ3BCQyxJQUFJLEVBQUUsb0RBQW9EO0lBQzFEQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUF3RjtJQUFBLElBQUFxZ0IsV0FBQSxHQUFBcmdCLElBQUEsQ0FBbkYwWCxNQUFNO01BQUk3RSxJQUFJLEdBQUF3TixXQUFBLENBQUp4TixJQUFJO01BQUVtSSxRQUFRLEdBQUFxRixXQUFBLENBQVJyRixRQUFRO01BQUU5QyxJQUFJLEdBQUFtSSxXQUFBLENBQUpuSSxJQUFJO01BQUk3RixRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVELFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRWpNLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07SUFBQSxJQUFJckUsT0FBTyxHQUFBN0IsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsQ0FBQyxDQUFDO0lBQ3hGLElBQUEyVSxxQkFBQSxHQUF1QzlTLE9BQU8sQ0FBdEMrUyxrQkFBa0I7TUFBbEJBLGtCQUFrQixHQUFBRCxxQkFBQSxjQUFHLEtBQUssR0FBQUEscUJBQUE7SUFFbEMsSUFBQXRDLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUMsQ0FBQztNQUF2Q29CLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBQ3pCO0lBQ0FZLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUMxQixJQUFJNFQsa0JBQWtCLEVBQUU7TUFDdEI1VCxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3BCO0lBQ0FzUixLQUFLLENBQUMsQ0FBQzs7SUFFUDtJQUNBLElBQUl5SSxRQUFRLEtBQUssUUFBUSxFQUFFO01BQ3pCLElBQU1oRyxVQUFVLEdBQUdILGtCQUFrQixHQUFHLDhDQUE4QyxHQUFHLEVBQUU7TUFDM0Y1VCxJQUFJLHlDQUFBTCxNQUFBLENBQXdDc1gsSUFBSSxRQUFBdFgsTUFBQSxDQUFJb1UsVUFBVSxNQUFHLENBQUM7TUFDbEV6QyxLQUFLLENBQUMsQ0FBQztJQUNULENBQUMsTUFBTTtNQUNMdFIsSUFBSSx3Q0FBQUwsTUFBQSxDQUF1Q3NYLElBQUksUUFBSSxDQUFDO01BQ3BEM0YsS0FBSyxDQUFDLENBQUM7SUFDVDs7SUFFQTtJQUNBLElBQU0rTixPQUFPLEdBQUc3ZCxJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDO0lBQzdDLElBQUk0TixPQUFPLEVBQUU7TUFDWHJmLElBQUksY0FBQUwsTUFBQSxDQUFjMGYsT0FBTyxDQUFFLENBQUM7TUFDNUIvTixLQUFLLENBQUMsQ0FBQztJQUNUOztJQUVBO0lBQ0EsSUFBTXRDLE9BQU8sR0FBR21DLFVBQVU7SUFDMUIsSUFBTW1PLFdBQVcsR0FBR3JkLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ2lHLE9BQU8sQ0FBQyxDQUFDL1AsTUFBTTtJQUMvQyxJQUFJcWdCLFdBQVcsS0FBSyxDQUFDLEVBQUU7TUFDckIsS0FBSyxJQUFNbFMsTUFBTSxJQUFJNEIsT0FBTyxFQUFFO1FBQzVCaFAsSUFBSSxpQkFBQUwsTUFBQSxDQUFpQnlOLE1BQU0sV0FBQXpOLE1BQUEsQ0FBT2tDLHNFQUFxQixDQUFDbU4sT0FBTyxDQUFDNUIsTUFBTSxDQUFDLENBQUMsU0FBSyxDQUFDO1FBQzlFa0UsS0FBSyxDQUFDLENBQUM7TUFDVDtJQUNGLENBQUMsTUFBTSxJQUFJZ08sV0FBVyxHQUFHLENBQUMsRUFBRTtNQUMxQixJQUFJQyxLQUFLLEdBQUcsQ0FBQztNQUVidmYsSUFBSSxDQUFDLGFBQWEsQ0FBQztNQUVuQixLQUFLLElBQU1vTixPQUFNLElBQUk0QixPQUFPLEVBQUU7UUFDNUIsSUFBSXVRLEtBQUssRUFBRSxLQUFLRCxXQUFXLEVBQUU7VUFDM0J0ZixJQUFJLFNBQUFMLE1BQUEsQ0FBU3lOLE9BQU0sV0FBQXpOLE1BQUEsQ0FBT2tDLHNFQUFxQixDQUFDbU4sT0FBTyxDQUFDNUIsT0FBTSxDQUFDLENBQUMsUUFBSSxDQUFDO1FBQ3ZFLENBQUMsTUFBTTtVQUNMcE4sSUFBSSxTQUFBTCxNQUFBLENBQVN5TixPQUFNLFdBQUF6TixNQUFBLENBQU9rQyxzRUFBcUIsQ0FBQ21OLE9BQU8sQ0FBQzVCLE9BQU0sQ0FBQyxDQUFDLE9BQUcsQ0FBQztRQUN0RTtNQUNGO01BRUFwTixJQUFJLENBQUMsR0FBRyxDQUFDO01BQ1RzUixLQUFLLENBQUMsQ0FBQztJQUNUOztJQUVBO0lBQ0EsSUFBSStOLE9BQU8sSUFBSUMsV0FBVyxFQUFFO01BQzFCdGYsSUFBSSxtQkFBQUwsTUFBQSxDQUFrQnVGLE1BQU0sWUFBQXZGLE1BQUEsQ0FBT2lTLElBQUksMEJBQXNCLENBQUM7SUFDaEUsQ0FBQyxNQUFNLElBQUl5TixPQUFPLElBQUksQ0FBQ0MsV0FBVyxFQUFFO01BQ2xDdGYsSUFBSSxtQkFBQUwsTUFBQSxDQUFrQnVGLE1BQU0sWUFBQXZGLE1BQUEsQ0FBT2lTLElBQUksaUJBQWEsQ0FBQztJQUN2RCxDQUFDLE1BQU0sSUFBSSxDQUFDeU4sT0FBTyxJQUFJQyxXQUFXLEVBQUU7TUFDbEN0ZixJQUFJLG1CQUFBTCxNQUFBLENBQWtCdUYsTUFBTSxZQUFBdkYsTUFBQSxDQUFPaVMsSUFBSSx5QkFBcUIsQ0FBQztJQUMvRCxDQUFDLE1BQU07TUFDTDVSLElBQUksbUJBQUFMLE1BQUEsQ0FBa0J1RixNQUFNLFlBQUF2RixNQUFBLENBQU9pUyxJQUFJLFFBQUksQ0FBQztJQUM5Qzs7SUFFQTtJQUNBTixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLDBCQUEwQixDQUFDO0lBQ2hDQSxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDekJzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLDZCQUE2QixDQUFDO0lBRW5DLE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFDSTtBQUNQO0FBRU47QUFFbkQsSUFBTW9nQixjQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUM7QUFNNUUsSUFBTUMsUUFBaUMsR0FBRztFQUMvQzFZLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFVBQVU7SUFDZnNPLEtBQUssRUFBRSxVQUFVO0lBQ2pCQyxJQUFJLEVBQUUsaUVBQWlFO0lBQ3ZFQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUFvRDhCLE9BQU8sRUFBSztJQUFBLElBQTNEOFIsUUFBUSxHQUFBNVQsSUFBQSxDQUFSNFQsUUFBUTtNQUFFQyxHQUFHLEdBQUE3VCxJQUFBLENBQUg2VCxHQUFHO01BQUV4QixRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVELFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRWpNLE1BQU0sR0FBQW5HLElBQUEsQ0FBTm1HLE1BQU07SUFDckQsSUFBTTZQLElBQUksR0FBQXpFLGFBQUE7TUFDUm5SLE1BQU0sRUFBRSxNQUFNO01BQ2RnYyxNQUFNLEVBQUU7SUFBSSxHQUNUdGEsT0FBTyxDQUNYO0lBQ0Q7SUFDQSxJQUFBd1EsWUFBQSxHQUE4QixJQUFJelMsOERBQVcsQ0FBQztRQUFFTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VjtNQUFPLENBQUMsQ0FBQztNQUE5RGEsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFc1IsS0FBSyxHQUFBRCxZQUFBLENBQUxDLEtBQUs7TUFBRWxTLElBQUksR0FBQWlTLFlBQUEsQ0FBSmpTLElBQUk7O0lBRXpCO0lBQ0FZLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN2QnNSLEtBQUssQ0FBQyxDQUFDOztJQUVQO0lBQ0F0UixJQUFJLFlBQUFMLE1BQUEsQ0FBV2lULEdBQUcsT0FBRyxDQUFDO0lBQ3RCdEIsS0FBSyxDQUFDLENBQUM7O0lBRVA7SUFDQSxJQUFJMEksRUFBRTtJQUNOLElBQUkvWCxNQUFNLENBQUM4RyxJQUFJLENBQUM0SixRQUFRLENBQUMsQ0FBQzFULE1BQU0sRUFBRTtNQUNoQythLEVBQUUsb0JBQUFyYSxNQUFBLENBQW9CNkIsSUFBSSxDQUFDQyxTQUFTLENBQUNrUixRQUFRLENBQUMsQ0FBRTtNQUVoRDNTLElBQUksQ0FBQ2dhLEVBQUUsQ0FBQztNQUNSMUksS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBLElBQU10QyxPQUFPLEdBQUdtQyxVQUFVOztJQUUxQjtJQUNBLElBQUlrTyxPQUE0QixHQUFHLENBQUMsQ0FBQztJQUNyQyxJQUFNckIsS0FBNkIsR0FBRyxDQUFDLENBQUM7SUFFeEMsSUFBSTBCLFFBQVEsR0FBRyxLQUFLO0lBQ3BCLElBQUlDLFVBQVUsR0FBRyxLQUFLO0lBQ3RCLElBQUlDLFdBQVcsR0FBRyxLQUFLO0lBQ3ZCLFFBQVF4TyxRQUFRLENBQUM1QixRQUFRO01BQ3ZCLEtBQUssa0JBQWtCO1FBQ3JCLElBQUk0QixRQUFRLENBQUMyQixPQUFPLEVBQUU7VUFDcEIvUyxJQUFJLGNBQUFMLE1BQUEsQ0FBY2tiLCtEQUFxQixDQUFDekosUUFBUSxDQUFDMkIsT0FBTyxFQUFFZ0MsSUFBSSxDQUFDLENBQUUsQ0FBQztVQUNsRTZLLFdBQVcsR0FBRyxJQUFJO1VBQ2xCRCxVQUFVLEdBQUcsSUFBSTtRQUNuQjtRQUNBO01BRUYsS0FBSyxxQkFBcUI7UUFDeEIsSUFBSSxDQUFDdk8sUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1VBQ3BCO1FBQ0Y7UUFFQXVNLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDWmpPLFFBQVEsQ0FBQzBCLE1BQU0sQ0FBQzdOLE9BQU8sQ0FBQyxVQUFBNGEsQ0FBQyxFQUFJO1VBQzNCLElBQUlBLENBQUMsQ0FBQ3pNLFFBQVEsRUFBRTtZQUNkNEssS0FBSyxDQUFDNkIsQ0FBQyxDQUFDdFgsSUFBSSxDQUFDLFlBQUE1SSxNQUFBLENBQVlrZ0IsQ0FBQyxDQUFDek0sUUFBUSxhQUFVO1lBQzdDc00sUUFBUSxHQUFHLElBQUk7VUFDakIsQ0FBQyxNQUFNO1lBQ0xMLE9BQU8sQ0FBQ1EsQ0FBQyxDQUFDdFgsSUFBSSxDQUFDLEdBQUdzWCxDQUFDLENBQUNqZSxLQUFLO1lBQ3pCK2QsVUFBVSxHQUFHLElBQUk7VUFDbkI7UUFDRixDQUFDLENBQUM7UUFFRixJQUFJRCxRQUFRLEVBQUU7VUFDWjFmLElBQUksWUFBQUwsTUFBQSxDQUFZa2IsK0RBQXFCLENBQUNtRCxLQUFLLEVBQUVqSixJQUFJLENBQUMsQ0FBRSxDQUFDO1VBRXJELElBQUk0SyxVQUFVLEVBQUU7WUFDZDNmLElBQUksY0FBQUwsTUFBQSxDQUFja2IsK0RBQXFCLENBQUN3RSxPQUFPLEVBQUV0SyxJQUFJLENBQUMsQ0FBRSxDQUFDO1VBQzNEOztVQUVBO1VBQ0EsSUFBTTVGLFVBQVUsR0FBR0osK0RBQWEsQ0FBQ0MsT0FBTyxFQUFFLGNBQWMsQ0FBQztVQUN6RCxJQUFJRyxVQUFVLEVBQUU7WUFDZCxPQUFPSCxPQUFPLENBQUNHLFVBQVUsQ0FBQztVQUM1QjtRQUNGLENBQUMsTUFBTTtVQUNMLElBQU0yUSxjQUFjLEdBQUd0ZSxJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDO1VBQ3BELElBQUlxTyxjQUFjLEVBQUU7WUFDbEI5ZixJQUFJLGNBQUFMLE1BQUEsQ0FBY21nQixjQUFjLENBQUUsQ0FBQztZQUNuQ0gsVUFBVSxHQUFHLElBQUk7VUFDbkI7UUFDRjtRQUNBO01BRUY7UUFBUztVQUNQLElBQUl2TyxRQUFRLENBQUM1QixRQUFRLEtBQUssbUNBQW1DLElBQUk0QixRQUFRLENBQUM0QixTQUFTLEVBQUU7WUFDbkZoVCxJQUFJLGNBQUFMLE1BQUEsQ0FBY2tiLCtEQUFxQixDQUFDekosUUFBUSxDQUFDNEIsU0FBUyxFQUFFK0IsSUFBSSxDQUFDLENBQUUsQ0FBQztZQUNwRTRLLFVBQVUsR0FBRyxJQUFJO1lBQ2pCO1VBQ0Y7VUFFQSxJQUFNTixRQUFPLEdBQUc3ZCxJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDO1VBQzdDLElBQUk0TixRQUFPLEVBQUU7WUFDWHJmLElBQUksY0FBQUwsTUFBQSxDQUFjMGYsUUFBTyxDQUFFLENBQUM7WUFDNUJNLFVBQVUsR0FBRyxJQUFJO1VBQ25CO1FBQ0Y7SUFDRjs7SUFFQTtJQUNBLElBQU1MLFdBQVcsR0FBR3JkLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ2lHLE9BQU8sQ0FBQyxDQUFDL1AsTUFBTTtJQUUvQyxJQUFJcWdCLFdBQVcsS0FBSyxDQUFDLEtBQUtLLFVBQVUsSUFBSUQsUUFBUSxDQUFDLEVBQUU7TUFDakQ7TUFDQXBPLEtBQUssQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxNQUFNLElBQUlnTyxXQUFXLEtBQUssQ0FBQyxFQUFFO01BQzVCLEtBQUssSUFBTWxTLE1BQU0sSUFBSTRCLE9BQU8sRUFBRTtRQUM1QmhQLElBQUksaUJBQUFMLE1BQUEsQ0FBZ0J5TixNQUFNLFlBQUF6TixNQUFBLENBQU9rQyxzRUFBcUIsQ0FBQ21OLE9BQU8sQ0FBQzVCLE1BQU0sQ0FBQyxDQUFDLFFBQUksQ0FBQztRQUM1RWtFLEtBQUssQ0FBQyxDQUFDO01BQ1Q7SUFDRixDQUFDLE1BQU0sSUFBSWdPLFdBQVcsR0FBRyxDQUFDLEVBQUU7TUFDMUIsSUFBSUMsS0FBSyxHQUFHLENBQUM7TUFFYnZmLElBQUksQ0FBQyxhQUFhLENBQUM7TUFFbkIsS0FBSyxJQUFNb04sT0FBTSxJQUFJNEIsT0FBTyxFQUFFO1FBQzVCLElBQUl1USxLQUFLLEtBQUtELFdBQVcsRUFBRTtVQUN6QnRmLElBQUksTUFBQUwsTUFBQSxDQUFLeU4sT0FBTSxZQUFBek4sTUFBQSxDQUFPa0Msc0VBQXFCLENBQUNtTixPQUFPLENBQUM1QixPQUFNLENBQUMsQ0FBQyxVQUFNLENBQUMsQ0FBQztRQUN0RSxDQUFDLE1BQU07VUFDTHBOLElBQUksTUFBQUwsTUFBQSxDQUFLeU4sT0FBTSxZQUFBek4sTUFBQSxDQUFPa0Msc0VBQXFCLENBQUNtTixPQUFPLENBQUM1QixPQUFNLENBQUMsQ0FBQyxTQUFLLENBQUMsQ0FBQztRQUNyRTtRQUNBbVMsS0FBSyxJQUFJLENBQUM7TUFDWjtNQUVBdmYsSUFBSSxDQUFDLEdBQUcsQ0FBQztNQUNUc1IsS0FBSyxDQUFDLENBQUM7SUFDVDs7SUFFQTtJQUNBLElBQUkzQyxPQUFPLEdBQUc2USxjQUFjLENBQUM5UCxRQUFRLENBQUN4SyxNQUFNLENBQUMsMEJBQUF2RixNQUFBLENBQ2xCdUYsTUFBTSxDQUFDZ0ssV0FBVyxDQUFDLENBQUMsNkNBQUF2UCxNQUFBLENBQ1h1RixNQUFNLFlBQVE7SUFFbEQsSUFBSXlhLFVBQVUsRUFBRTtNQUNkLElBQUlDLFdBQVcsRUFBRTtRQUNmalIsT0FBTyxJQUFJLGdCQUFnQjtNQUM3QixDQUFDLE1BQU07UUFDTEEsT0FBTyxJQUFJLGdCQUFnQjtNQUM3QjtJQUNGO0lBRUEsSUFBSStRLFFBQVEsRUFBRTtNQUNaL1EsT0FBTyxJQUFJLGVBQWU7SUFDNUI7SUFFQSxJQUFJMlEsV0FBVyxHQUFHLENBQUMsRUFBRTtNQUNuQjNRLE9BQU8sSUFBSSxtQkFBbUI7SUFDaEM7SUFFQSxJQUFJcUwsRUFBRSxFQUFFO01BQ05yTCxPQUFPLElBQUksc0JBQXNCO0lBQ25DO0lBRUFBLE9BQU8sSUFBSSxHQUFHO0lBRWQzTyxJQUFJLENBQUMyTyxPQUFPLENBQUM7SUFDYjJDLEtBQUssQ0FBQyxDQUFDOztJQUVQO0lBQ0F0UixJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFFOUIsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUwwQztBQUNFO0FBRXRDLElBQU0yZ0IsTUFBYyxHQUFHO0VBQzVCaFosSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsUUFBUTtJQUNic08sS0FBSyxFQUFFLFFBQVE7SUFDZkgsT0FBTyxFQUFFLEtBQUs7SUFDZCxXQUFTO0VBQ1gsQ0FBQztFQUNERixXQUFXLEVBQUU7SUFDWDJPLE9BQU8sRUFBUEEsb0RBQU87SUFDUE0sUUFBUSxFQUFSQSxzREFBUUE7RUFDVjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFPNEQ7QUFDMkI7QUFDbEM7QUFHOUMsSUFBTU8sSUFBWSxHQUFHO0VBQzFCalosSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsTUFBTTtJQUNYc08sS0FBSyxFQUFFLE1BQU07SUFDYkMsSUFBSSxFQUFFLHdFQUF3RTtJQUM5RUMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBa0Y7SUFBQSxJQUFBNGEsZUFBQTtJQUFBLElBQTdFL0csR0FBRyxHQUFBN1QsSUFBQSxDQUFINlQsR0FBRztNQUFFRCxRQUFRLEdBQUE1VCxJQUFBLENBQVI0VCxRQUFRO01BQUVzTixXQUFXLEdBQUFsaEIsSUFBQSxDQUFYa2hCLFdBQVc7TUFBRTdPLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUQsVUFBVSxHQUFBcFMsSUFBQSxDQUFWb1MsVUFBVTtNQUFFak0sTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtJQUFBLElBQUlyRSxPQUFPLEdBQUE3QixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxDQUFDLENBQUM7SUFDbEY7SUFDQSxJQUFBcVMsWUFBQSxHQUE4QixJQUFJelMsOERBQVcsQ0FBQztRQUM1Q08sTUFBTSxHQUFBd2EsZUFBQSxHQUFFOVksT0FBTyxDQUFDMUIsTUFBTSxjQUFBd2EsZUFBQSxjQUFBQSxlQUFBLEdBQUk7TUFDNUIsQ0FBQyxDQUFDO01BRk0zWixJQUFJLEdBQUFxUixZQUFBLENBQUpyUixJQUFJO01BQUVzUixLQUFLLEdBQUFELFlBQUEsQ0FBTEMsS0FBSztNQUFFbFMsSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTs7SUFJekI7SUFDQVksSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNyQnNSLEtBQUssQ0FBQyxDQUFDOztJQUVQO0lBQ0F0UixJQUFJLGFBQUFMLE1BQUEsQ0FBWWlULEdBQUcsT0FBRyxDQUFDO0lBQ3ZCdEIsS0FBSyxDQUFDLENBQUM7O0lBRVA7SUFDQSxJQUFNMEksRUFBRSxHQUFHckgsUUFBUTtJQUNuQixPQUFPQSxRQUFRLENBQUNwUSxHQUFHO0lBRW5CLElBQU0yZCxPQUFPLEdBQUdqZSxNQUFNLENBQUNpZSxPQUFPLENBQUNsRyxFQUFFLENBQUM7SUFDbEMsSUFBTW1HLFlBQVksR0FBR0QsT0FBTyxDQUFDamhCLE1BQU07SUFFbkMsSUFBSWtoQixZQUFZLEtBQUssQ0FBQyxFQUFFO01BQ3RCLElBQU05WSxLQUFLLEdBQUc2WSxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ3hCbGdCLElBQUksd0JBQUFMLE1BQUEsQ0FBd0IwSCxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQUExSCxNQUFBLENBQU8wSCxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQUksQ0FBQztNQUN4RGlLLEtBQUssQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxNQUFNLElBQUk2TyxZQUFZLEdBQUcsQ0FBQyxFQUFFO01BQzNCbmdCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztNQUU1QmtnQixPQUFPLENBQUNqYixPQUFPLENBQUMsVUFBQXNRLEtBQUEsRUFBZXROLENBQUMsRUFBSztRQUFBLElBQUFtWSxLQUFBLEdBQUE5VixjQUFBLENBQUFpTCxLQUFBO1VBQW5CaFQsR0FBRyxHQUFBNmQsS0FBQTtVQUFFeGUsS0FBSyxHQUFBd2UsS0FBQTtRQUMxQixJQUFNQyxVQUFVLEdBQUdwWSxDQUFDLEtBQUtrWSxZQUFZLEdBQUcsQ0FBQztRQUN6QyxJQUFNRyxVQUFVLEdBQUdELFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRTtRQUN4Q3JnQixJQUFJLElBQUFMLE1BQUEsQ0FBSTRDLEdBQUcsV0FBQTVDLE1BQUEsQ0FBT2lDLEtBQUssUUFBQWpDLE1BQUEsQ0FBSTJnQixVQUFVLEdBQUksQ0FBQyxDQUFDO01BQzdDLENBQUMsQ0FBQztNQUVGdGdCLElBQUksQ0FBQyxHQUFHLENBQUM7TUFDVHNSLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7O0lBRUE7SUFDQSxJQUFNK04sT0FBTyxHQUFHN2QsSUFBSSxDQUFDQyxTQUFTLENBQUMyUCxRQUFRLENBQUNLLElBQUksQ0FBQztJQUU3QyxJQUFJNE4sT0FBTyxFQUFFO01BQ1hyZixJQUFJLGVBQUFMLE1BQUEsQ0FBZTBmLE9BQU8sQ0FBRSxDQUFDO01BQzdCL04sS0FBSyxDQUFDLENBQUM7SUFDVDs7SUFFQTtJQUNBLElBQUlGLFFBQVEsQ0FBQ0ssSUFBSSxJQUFJTCxRQUFRLENBQUMyQixPQUFPLElBQUkzQixRQUFRLENBQUMwQixNQUFNLEVBQUU7TUFDeEQsUUFBUTFCLFFBQVEsQ0FBQzVCLFFBQVE7UUFDdkIsS0FBSyxtQ0FBbUM7VUFDdEN4UCxJQUFJLENBQUMsa0JBQWtCLENBQUM7VUFDeEJzUixLQUFLLENBQUMsQ0FBQztVQUNQO1FBRUYsS0FBSyxrQkFBa0I7VUFDckJ0UixJQUFJLENBQUMsa0JBQWtCLENBQUM7VUFDeEJzUixLQUFLLENBQUMsQ0FBQztVQUNQO1FBRUYsS0FBSyxxQkFBcUI7VUFDeEJ0UixJQUFJLENBQUMsdUJBQXVCLENBQUM7VUFDN0JzUixLQUFLLENBQUMsQ0FBQztVQUNQO1FBRUY7VUFDRXRSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztVQUN2QnNSLEtBQUssQ0FBQyxDQUFDO1VBQ1A7TUFDSjtJQUNGOztJQUVBO0lBQ0EsSUFBTWlQLFlBQVksR0FBR3JULDJEQUFTLENBQUNpRSxVQUFVLEVBQUUsUUFBUSxDQUFDO0lBQ3BELElBQU1xUCxZQUFZLEdBQUd0VCwyREFBUyxDQUFDaUUsVUFBVSxFQUFFLFFBQVEsQ0FBQztJQUVwRCxJQUFNc1AsVUFBVSxHQUFHRixZQUFZLG1CQUFBNWdCLE1BQUEsQ0FDVitnQixNQUFNLENBQUNILFlBQVksQ0FBQyxDQUNsQ3RRLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQ3JCQSxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUNuQkEsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsV0FDM0IvUSxTQUFTO0lBRWIsSUFBTXloQixTQUFTLEdBQUdILFlBQVksZUFBQTdnQixNQUFBLENBQWNrQyxzRUFBcUIsQ0FBQzJlLFlBQVksQ0FBQyxXQUFPdGhCLFNBQVM7SUFFL0YsSUFBTTBoQixjQUFjLHFCQUFBamhCLE1BQUEsQ0FBb0JrQyxzRUFBcUIsQ0FBQ3VQLFFBQVEsQ0FBQzVCLFFBQVEsQ0FBQyxRQUFJO0lBRXBGLElBQU1xUixZQUFZLEdBQUc1ZSxNQUFNLENBQUNpZSxPQUFPLENBQUMvTyxVQUFVO0lBQzVDO0lBQUEsQ0FDQ2MsTUFBTSxDQUFDLFVBQUE2TyxLQUFBO01BQUEsSUFBQUMsS0FBQSxHQUFBelcsY0FBQSxDQUFBd1csS0FBQTtRQUFFdmUsR0FBRyxHQUFBd2UsS0FBQTtNQUFBLE9BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUNyUixRQUFRLENBQUNuTixHQUFHLENBQUMyTSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQUEsRUFBQyxDQUNwRjVOLEdBQUcsQ0FBQyxVQUFBMGYsS0FBQTtNQUFBLElBQUFDLEtBQUEsR0FBQTNXLGNBQUEsQ0FBQTBXLEtBQUE7UUFBRXplLEdBQUcsR0FBQTBlLEtBQUE7UUFBRXJmLEtBQUssR0FBQXFmLEtBQUE7TUFBQSxXQUFBdGhCLE1BQUEsQ0FBVTRDLEdBQUcsV0FBQTVDLE1BQUEsQ0FBUWdDLHNFQUFxQixDQUFDQyxLQUFLLENBQUM7SUFBQSxDQUFHLENBQUMsQ0FDckV4QyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBRWIsSUFBTThoQixVQUFVLEdBQUdMLFlBQVksa0JBQUFsaEIsTUFBQSxDQUFrQmtoQixZQUFZLFNBQU0zaEIsU0FBUzs7SUFFNUU7SUFDQSxJQUFJeVAsT0FBTyx5QkFBQWhQLE1BQUEsQ0FBd0J1RixNQUFNLFlBQVE7SUFFakQsSUFBSW1hLE9BQU8sRUFBRTtNQUNYMVEsT0FBTyxJQUFJLGtCQUFrQjtJQUMvQjtJQUVBLElBQUlzUixXQUFXLENBQUNoaEIsTUFBTSxFQUFFO01BQ3RCMFAsT0FBTyxJQUFJLHVCQUF1QjtJQUNwQztJQUVBLElBQU13UyxlQUFlLEdBQUcsQ0FBQ0QsVUFBVSxFQUFFTixjQUFjLEVBQUVELFNBQVMsRUFBRUYsVUFBVSxDQUFDLENBQ3hFeE8sTUFBTSxDQUFDLFVBQUFDLENBQUM7TUFBQSxPQUFJLENBQUMsQ0FBQ0EsQ0FBQztJQUFBLEVBQUMsQ0FDaEI5UyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBRWIsSUFBSStoQixlQUFlLEVBQUU7TUFDbkJ4UyxPQUFPLFNBQUFoUCxNQUFBLENBQVN3aEIsZUFBZSxDQUFFO0lBQ25DO0lBRUEsSUFBSS9QLFFBQVEsQ0FBQ0ssSUFBSSxJQUFJTCxRQUFRLENBQUMyQixPQUFPLElBQUkzQixRQUFRLENBQUMwQixNQUFNLEVBQUU7TUFDeERuRSxPQUFPLElBQUksbUJBQW1CO0lBQ2hDO0lBRUFBLE9BQU8sSUFBSSxHQUFHO0lBRWQzTyxJQUFJLENBQUMyTyxPQUFPLENBQUM7SUFFYjJDLEtBQUssQ0FBQyxDQUFDO0lBQ1A7SUFDQXRSLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUVqQyxPQUFPWixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pKb0M7QUFFOUIsSUFBTWdpQixDQUFTLEdBQUc7RUFDdkJyYSxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxHQUFHO0lBQ1JzTyxLQUFLLEVBQUUsR0FBRztJQUNWSCxPQUFPLEVBQUUsSUFBSTtJQUNiLFdBQVM7RUFDWCxDQUFDO0VBQ0RGLFdBQVcsRUFBRTtJQUNYd1AsSUFBSSxFQUFKQSw4Q0FBSUE7RUFDTjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYjJEO0FBQ0k7QUFHekQsSUFBTXFCLE9BQWUsR0FBRztFQUM3QnRhLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLFNBQVM7SUFDZHNPLEtBQUssRUFBRSxTQUFTO0lBQ2hCQyxJQUFJLEVBQUUsdUNBQXVDO0lBQzdDQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBQ0RDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBalMsSUFBQSxFQUFxRTtJQUFBLElBQWhFMFgsTUFBTSxHQUFBMVgsSUFBQSxDQUFOMFgsTUFBTTtNQUFFOUQsUUFBUSxHQUFBNVQsSUFBQSxDQUFSNFQsUUFBUTtNQUFVZSxTQUFTLEdBQUEzVSxJQUFBLENBQWpCbUcsTUFBTTtNQUFha00sUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtNQUFFRCxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO0lBQ25FLElBQUFFLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUMsQ0FBQztNQUF2Q29CLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJOztJQUV6QjtJQUNBO0lBQ0EsSUFBTThGLE1BQU0sR0FBR3dPLFNBQVMsQ0FBQ25DLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLElBQU1zQixPQUFPLEdBQUcsQ0FDZCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsT0FBTyxFQUNQLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE9BQU8sQ0FDUjtJQUVELElBQUksQ0FBQ0EsT0FBTyxDQUFDbkQsUUFBUSxDQUFDeEssTUFBTSxDQUFDLEVBQUU7TUFDN0JsRixJQUFJLG1DQUFBTCxNQUFBLENBQW1DdUYsTUFBTSwwQ0FBdUMsQ0FBQztNQUNyRixPQUFPOUYsSUFBSSxDQUFDLENBQUM7SUFDZjtJQUVBWSxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDekJzUixLQUFLLENBQUMsQ0FBQzs7SUFFUDtJQUNBLElBQUlGLFFBQVEsQ0FBQzVCLFFBQVEsS0FBSyxtQ0FBbUMsRUFBRTtNQUM3RCxJQUFJNEIsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1FBQ25COVMsSUFBSSxXQUFXLENBQUM7UUFDaEJvUixRQUFRLENBQUMwQixNQUFNLENBQUM3TixPQUFPLENBQUMsVUFBQWtPLEtBQUssRUFBSTtVQUMvQm5ULElBQUksT0FBQUwsTUFBQSxDQUFPd1QsS0FBSyxDQUFDNUssSUFBSSxVQUFBNUksTUFBQSxDQUFPNkIsSUFBSSxDQUFDQyxTQUFTLENBQUMwUixLQUFLLENBQUN2UixLQUFLLENBQUMsTUFBRyxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUNGNUIsSUFBSSxJQUFJLENBQUM7UUFDVHNSLEtBQUssQ0FBQyxDQUFDO01BQ1Q7SUFDRjtJQUVBdFIsSUFBSSxzQkFBc0IsQ0FBQztJQUMzQkEsSUFBSSxZQUFBTCxNQUFBLENBQVk4VyxNQUFNLENBQUNzRCxRQUFRLFFBQUFwYSxNQUFBLENBQUs4VyxNQUFNLENBQUNRLElBQUksT0FBSSxDQUFDO0lBQ3BELElBQUk5RixVQUFVLENBQUMsY0FBYyxDQUFDLElBQUlBLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRTtNQUM1RG5SLElBQUksbUNBQUFMLE1BQUEsQ0FFQXdSLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSUEsVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUU1RCxDQUFDO0lBQ0g7SUFDQW5SLElBQUksSUFBSSxDQUFDO0lBRVRzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxvQkFBQUwsTUFBQSxDQUFvQnVGLE1BQU0sQ0FBQ2dLLFdBQVcsQ0FBQyxDQUFDLFFBQUF2UCxNQUFBLENBQUs4VyxNQUFNLENBQUM2SyxRQUFRLGdCQUFhLENBQUM7SUFFOUUsSUFBTXRTLE9BQU8sR0FBRy9NLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQztJQUN2QyxJQUFJbkMsT0FBTyxDQUFDL1AsTUFBTSxFQUFFO01BQ2xCK1AsT0FBTyxDQUFDL0osT0FBTyxDQUFDLFVBQUExQyxHQUFHLEVBQUk7UUFDckIsSUFBSUEsR0FBRyxDQUFDMk0sV0FBVyxDQUFDLENBQUMsS0FBSyxjQUFjLEVBQUU7VUFDeENsUCxJQUFJLG1CQUFBTCxNQUFBLENBQW1CNEMsR0FBRyxZQUFBNUMsTUFBQSxDQUFTZ0Msc0VBQXFCLENBQUN3UCxVQUFVLENBQUM1TyxHQUFHLENBQUMsQ0FBQyxNQUFHLENBQUM7UUFDL0U7TUFDRixDQUFDLENBQUM7SUFDSjtJQUVBTixNQUFNLENBQUM4RyxJQUFJLENBQUM0SixRQUFRLENBQUMsQ0FBQzFOLE9BQU8sQ0FBQyxVQUFBc0QsSUFBSSxFQUFJO01BQ3BDLElBQU0zRyxLQUFLLEdBQUcrUSxRQUFRLENBQUNwSyxJQUFJLENBQUM7TUFDNUIsSUFBSTZDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDekosS0FBSyxDQUFDLEVBQUU7UUFDeEI1QixJQUFJLGtCQUFBTCxNQUFBLENBQWtCNEksSUFBSSxXQUFBNUksTUFBQSxDQUFRNkIsSUFBSSxDQUFDQyxTQUFTLENBQUNHLEtBQUssQ0FBQyxDQUFFLENBQUM7TUFDNUQsQ0FBQyxNQUFNO1FBQ0w1QixJQUFJLGtCQUFBTCxNQUFBLENBQWtCNEksSUFBSSxZQUFBNUksTUFBQSxDQUFTaUMsS0FBSyxNQUFHLENBQUM7TUFDOUM7SUFDRixDQUFDLENBQUM7SUFFRixRQUFRd1AsUUFBUSxDQUFDNUIsUUFBUTtNQUN2QixLQUFLLG1DQUFtQztRQUN0QyxJQUFJNEIsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1VBQ25COVMsSUFBSSx5Q0FBeUMsQ0FBQztRQUNoRDtRQUNBO01BRUYsS0FBSyxrQkFBa0I7UUFDckIsSUFBSW9SLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRTtVQUNwQi9TLElBQUksaUJBQUFMLE1BQUEsQ0FBaUI2QixJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLENBQUUsQ0FBQztRQUN2RDtRQUNBO01BRUY7UUFDRSxJQUFJTCxRQUFRLENBQUNLLElBQUksRUFBRTtVQUNqQnpSLElBQUksaUJBQUFMLE1BQUEsQ0FBaUI2QixJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLENBQUUsQ0FBQztRQUN2RDtJQUNKO0lBRUF6UixJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ1hzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQzVCQSxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFFMUIsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUcyRDtBQUNJO0FBT3pELElBQU1xVSxPQUFpQyxHQUFHO0VBQy9DMU0sSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsUUFBUTtJQUNic08sS0FBSyxFQUFFLFdBQVc7SUFDbEJDLElBQUksRUFBRSxxRUFBcUU7SUFDM0VDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQWtGO0lBQUEsSUFBN0UwWCxNQUFNLEdBQUExWCxJQUFBLENBQU4wWCxNQUFNO01BQVUvQyxTQUFTLEdBQUEzVSxJQUFBLENBQWpCbUcsTUFBTTtNQUFhK0wsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztNQUFFRyxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVELFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7SUFBQSxJQUFJdFEsT0FBTyxHQUFBN0IsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsQ0FBQyxDQUFDO0lBQ2xGLElBQUEyVSxxQkFBQSxHQUF1QzlTLE9BQU8sQ0FBdEMrUyxrQkFBa0I7TUFBbEJBLGtCQUFrQixHQUFBRCxxQkFBQSxjQUFHLEtBQUssR0FBQUEscUJBQUE7SUFFbEMsSUFBQXRDLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUMsQ0FBQztNQUF2Q29CLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBRXpCWSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3JCQSxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDMUJzUixLQUFLLENBQUMsQ0FBQzs7SUFFUDtJQUNBO0lBQ0EsSUFBTXBNLE1BQU0sR0FBR3dPLFNBQVMsQ0FBQ25DLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLElBQU1zQixPQUFPLEdBQUcsQ0FDZCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsT0FBTyxFQUNQLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE9BQU8sQ0FDUjtJQUNELElBQU0wTyxTQUFTLEdBQUdyYyxNQUFNLENBQUNvRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUdwRSxNQUFNLENBQUNpUSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUNqRyxXQUFXLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMyRCxPQUFPLENBQUNuRCxRQUFRLENBQUN4SyxNQUFNLENBQUMsRUFBRTtNQUM3QmxGLElBQUkscUJBQUFMLE1BQUEsQ0FBcUI0aEIsU0FBUyx3QkFBcUIsQ0FBQztNQUN4RHZoQixJQUFJLGdCQUFBTCxNQUFBLENBQWdCdUYsTUFBTSxDQUFDcU0sV0FBVyxDQUFDLENBQUMsTUFBRyxDQUFDO01BQzVDdlIsSUFBSSwwQkFBQUwsTUFBQSxDQUEwQnlSLFFBQVEsQ0FBQ0ssSUFBSSxHQUFHLE1BQU0sR0FBRyxPQUFPLE1BQUcsQ0FBQztNQUNsRXpSLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztNQUNsQ0EsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUNYc1IsS0FBSyxDQUFDLENBQUM7SUFDVDtJQUVBdFIsSUFBSSxnQkFBQUwsTUFBQSxDQUFlc1IsT0FBTyxRQUFJLENBQUM7SUFDL0JLLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLENBQUMsMENBQTBDLENBQUM7SUFFaEQsSUFBSXlXLE1BQU0sQ0FBQ3NELFFBQVEsS0FBSyxRQUFRLEVBQUU7TUFDaEMvWixJQUFJLENBQUMscUJBQXFCLENBQUM7TUFDM0IsSUFBSTRULGtCQUFrQixFQUFFO1FBQ3RCNVQsSUFBSSxDQUFDLDhDQUE4QyxDQUFDO01BQ3REO0lBQ0Y7SUFFQXNSLEtBQUssQ0FBQyxDQUFDO0lBQ1B0UixJQUFJLHlCQUFBTCxNQUFBLENBQXlCNGhCLFNBQVMsY0FBVyxDQUFDO0lBRWxELElBQU12UyxPQUFPLEdBQUcvTSxNQUFNLENBQUM4RyxJQUFJLENBQUNvSSxVQUFVLENBQUM7SUFDdkMsSUFBSW5DLE9BQU8sQ0FBQy9QLE1BQU0sRUFBRTtNQUNsQitQLE9BQU8sQ0FBQy9KLE9BQU8sQ0FBQyxVQUFBMUMsR0FBRyxFQUFJO1FBQ3JCdkMsSUFBSSxjQUFBTCxNQUFBLENBQWE0QyxHQUFHLGFBQUE1QyxNQUFBLENBQVNnQyxzRUFBcUIsQ0FBQ3dQLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBQyxDQUFDLE1BQUcsQ0FBQztNQUN6RSxDQUFDLENBQUM7SUFDSjtJQUVBLElBQUk2TyxRQUFRLENBQUNLLElBQUksRUFBRTtNQUNqQnpSLElBQUksbUJBQUFMLE1BQUEsQ0FBbUI2QixJQUFJLENBQUNDLFNBQVMsQ0FBQzJQLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLENBQUUsQ0FBQztJQUN6RDtJQUVBSCxLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLGtDQUFrQyxDQUFDO0lBQ3hDQSxJQUFJLENBQUMseUJBQXlCLENBQUM7SUFFL0IsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pGMEM7QUFDRjtBQUVsQyxJQUFNb2lCLElBQVksR0FBRztFQUMxQnphLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE1BQU07SUFDWHNPLEtBQUssRUFBRSxNQUFNO0lBQ2JILE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBUztFQUNYLENBQUM7RUFDREYsV0FBVyxFQUFFO0lBQ1gsVUFBQWlELGtEQUFNO0lBQ040TixPQUFPLEVBQVBBLG9EQUFPQTtFQUNUO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDZkQsU0FBUzFDLFlBQVlBLENBQ25CQyxVQUE4QixFQUM5QjlaLE1BQVcsRUFDWHFXLE1BQWUsRUFDZkwsV0FBbUIsRUFDbkIrRCxXQUFtQixFQUNYO0VBQ1IsSUFBTUMsYUFBYSxHQUFHaEUsV0FBVyxDQUFDcGIsTUFBTSxDQUFDbWYsV0FBVyxDQUFDO0VBQ3JELElBQU1FLGtCQUFrQixHQUFHakUsV0FBVyxDQUFDcGIsTUFBTSxDQUFDbWYsV0FBVyxHQUFHLENBQUMsQ0FBQztFQUM5RCxJQUFNemYsSUFBSSxHQUFHK2IsTUFBTSxTQUFBeGIsTUFBQSxDQUFTbWYsYUFBYSxJQUFLLElBQUk7RUFDbEQsSUFBTUUsWUFBWSxHQUFHSixVQUFVLEtBQUssUUFBUSxHQUFHLFNBQVMsR0FBRyxHQUFHO0VBQzlELElBQU1LLFlBQVksR0FBR0wsVUFBVSxLQUFLLFFBQVEsR0FBRyxJQUFJLEdBQUcsR0FBRztFQUV6RCxJQUFJekQsTUFBTSxFQUFFO0lBQ1YsVUFBQXhiLE1BQUEsQ0FBVXFmLFlBQVksUUFBQXJmLE1BQUEsQ0FBS21mLGFBQWEsRUFBQW5mLE1BQUEsQ0FBR21GLE1BQU0sQ0FBQzFGLElBQUksQ0FDcERBLElBQ0YsQ0FBQyxRQUFBTyxNQUFBLENBQUtvZixrQkFBa0IsRUFBQXBmLE1BQUEsQ0FBR3NmLFlBQVk7RUFDekM7RUFFQSxVQUFBdGYsTUFBQSxDQUFVcWYsWUFBWSxFQUFBcmYsTUFBQSxDQUFHbUYsTUFBTSxDQUFDMUYsSUFBSSxDQUFDQSxJQUFJLENBQUMsRUFBQU8sTUFBQSxDQUFHc2YsWUFBWTtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQU1wRSxzQkFBcUIsR0FBRyxTQUF4QkEscUJBQXFCQSxDQUNoQ2paLEtBQVUsRUFDVm1ULElBQXlCLEVBQ3pCOEosV0FBb0IsRUFDWjtFQUNSO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRUEsV0FBVyxHQUFHQSxXQUFXLEtBQUszZixTQUFTLEdBQUcsQ0FBQyxHQUFHMmYsV0FBVyxHQUFHLENBQUM7RUFFN0QsUUFBUTVjLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDYixRQUFRLENBQUNpRCxJQUFJLENBQUMxQyxLQUFLLENBQUM7SUFDM0MsS0FBSyxpQkFBaUI7TUFDcEIsT0FBT0EsS0FBSztJQUVkLEtBQUssZ0JBQWdCO01BQUU7UUFDckIsSUFBSXVaLE1BQU0sR0FBRyxLQUFLO1FBQ2xCLElBQU1zRyxTQUFjLEdBQUk3ZixLQUFLLENBQVdOLEdBQUcsQ0FBQyxVQUFBNGQsQ0FBQyxFQUFJO1VBQy9DO1VBQ0EsSUFBSWpkLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDYixRQUFRLENBQUNpRCxJQUFJLENBQUM0YSxDQUFDLENBQUMsS0FBSyxpQkFBaUIsRUFBRTtZQUMzRC9ELE1BQU0sR0FBR2xaLE1BQU0sQ0FBQzhHLElBQUksQ0FBQ21XLENBQUMsQ0FBQyxDQUFDamdCLE1BQU0sR0FBRyxDQUFDO1VBQ3BDO1VBQ0EsT0FBTzRiLHNCQUFxQixDQUFDcUUsQ0FBQyxFQUFFbkssSUFBSSxFQUFFOEosV0FBVyxDQUFDO1FBQ3BELENBQUMsQ0FBQztRQUNGLE9BQU9GLFlBQVksQ0FBQyxPQUFPLEVBQUU4QyxTQUFTLEVBQUV0RyxNQUFNLEVBQUVwRyxJQUFJLENBQUM1VixNQUFNLEVBQUUwZixXQUFXLENBQUM7TUFDM0U7SUFFQSxLQUFLLGlCQUFpQjtNQUFFO1FBQ3RCLElBQU03RCxhQUFhLEdBQUcsRUFBRTtRQUN4QixLQUFLLElBQU16WSxHQUFHLElBQUlYLEtBQUssRUFBRTtVQUN2Qm9aLGFBQWEsQ0FBQ2hiLElBQUksTUFBQUwsTUFBQSxDQUFLNEMsR0FBRyxVQUFBNUMsTUFBQSxDQUFNa2Isc0JBQXFCLENBQUNqWixLQUFLLENBQUNXLEdBQUcsQ0FBQyxFQUFFd1MsSUFBSSxFQUFFOEosV0FBVyxDQUFDLENBQUUsQ0FBQztRQUN6RjtRQUNBLE9BQU9GLFlBQVksQ0FDakIsUUFBUSxFQUNSM0QsYUFBYSxFQUNiakcsSUFBSSxDQUFDb0csTUFBTSxJQUFJSCxhQUFhLENBQUMvYixNQUFNLEdBQUcsQ0FBQyxFQUN2QzhWLElBQUksQ0FBQzVWLE1BQU0sRUFDWDBmLFdBQ0YsQ0FBQztNQUNIO0lBRUEsS0FBSyxlQUFlO01BQ2xCLE9BQU8sYUFBYTtJQUV0QixLQUFLLGtCQUFrQjtNQUNyQixPQUFPamQsS0FBSyxHQUFHLE1BQU0sR0FBRyxPQUFPO0lBRWpDO01BQ0UsSUFBSUEsS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLMUMsU0FBUyxFQUFFO1FBQ3pDLE9BQU8sRUFBRTtNQUNYO01BQ0EsWUFBQVMsTUFBQSxDQUFXaUMsS0FBSyxDQUFDUCxRQUFRLENBQUMsQ0FBQyxDQUFDNE8sT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7RUFDcEQ7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFFVDtBQUU1QyxJQUFNeVIsT0FBZSxHQUFHO0VBQzdCM2EsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsU0FBUztJQUNkc08sS0FBSyxFQUFFLFNBQVM7SUFDaEJDLElBQUksRUFBRSx5Q0FBeUM7SUFDL0NDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQW9EOEIsT0FBTyxFQUFLO0lBQUEsSUFBM0Q4UixRQUFRLEdBQUE1VCxJQUFBLENBQVI0VCxRQUFRO01BQUVDLEdBQUcsR0FBQTdULElBQUEsQ0FBSDZULEdBQUc7TUFBRXhCLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUQsVUFBVSxHQUFBcFMsSUFBQSxDQUFWb1MsVUFBVTtNQUFFak0sTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtJQUNyRCxJQUFNNlAsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFLE1BQU07TUFDZGdjLE1BQU0sRUFBRTtJQUFJLEdBQ1R0YSxPQUFPLENBQ1g7SUFFRCxJQUFJZ2UsV0FBVyxHQUFHLENBQUM7O0lBRW5CO0lBQ0EsSUFBQXhOLFlBQUEsR0FBbUQsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7TUFBTyxDQUFDLENBQUM7TUFBbkZhLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO01BQUV1aUIsVUFBVSxHQUFBdFEsWUFBQSxDQUFWc1EsVUFBVTtNQUFFNWhCLE9BQU8sR0FBQXNSLFlBQUEsQ0FBUHRSLE9BQU87O0lBRTlDO0lBQ0FDLElBQUksQ0FBQyxjQUFjLEVBQUU2ZSxXQUFXLENBQUM7SUFDakN2TixLQUFLLENBQUMsQ0FBQzs7SUFFUDtJQUNBdFIsSUFBSSxDQUFDLGdCQUFnQixFQUFFNmUsV0FBVyxDQUFDO0lBQ25DN2UsSUFBSSxDQUFDLHVCQUF1QixFQUFFNmUsV0FBVyxDQUFDO0lBQzFDQSxXQUFXLElBQUksQ0FBQzs7SUFFaEI7SUFDQTdlLElBQUksZ0JBQUFMLE1BQUEsQ0FBZWlULEdBQUcsVUFBTWlNLFdBQVcsQ0FBQztJQUN4Q3ZOLEtBQUssQ0FBQyxDQUFDO0lBRVAsSUFBSXNRLFFBQVEsR0FBRyxLQUFLO0lBQ3BCO0lBQ0EsSUFBSTNmLE1BQU0sQ0FBQzhHLElBQUksQ0FBQzRKLFFBQVEsQ0FBQyxDQUFDMVQsTUFBTSxFQUFFO01BQ2hDMmlCLFFBQVEsR0FBRyxJQUFJO01BQ2Y1aEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFNmUsV0FBVyxDQUFDO01BQ3hDQSxXQUFXLElBQUksQ0FBQztNQUNoQixTQUFBalUsRUFBQSxNQUFBaVgsZUFBQSxHQUEyQjVmLE1BQU0sQ0FBQ2llLE9BQU8sQ0FBQ3ZOLFFBQVEsQ0FBQyxFQUFBL0gsRUFBQSxHQUFBaVgsZUFBQSxDQUFBNWlCLE1BQUEsRUFBQTJMLEVBQUEsSUFBRTtRQUFoRCxJQUFBa1gsa0JBQUEsR0FBQXhYLGNBQUEsQ0FBQXVYLGVBQUEsQ0FBQWpYLEVBQUE7VUFBT3JJLEdBQUcsR0FBQXVmLGtCQUFBO1VBQUVsZ0IsS0FBSyxHQUFBa2dCLGtCQUFBO1FBQ3BCOWhCLElBQUksT0FBQUwsTUFBQSxDQUFNNEMsR0FBRyxZQUFBNUMsTUFBQSxDQUFPaUMsS0FBSyxXQUFPaWQsV0FBVyxDQUFDO01BQzlDO01BQ0FBLFdBQVcsSUFBSSxDQUFDO01BQ2hCN2UsSUFBSSxDQUFDLElBQUksRUFBRTZlLFdBQVcsQ0FBQztNQUN2QnZOLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7O0lBRUE7SUFDQSxJQUFJK04sT0FBNEIsR0FBRyxDQUFDLENBQUM7SUFDckMsSUFBTXJCLEtBQTZCLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLElBQUkwQixRQUFRLEdBQUcsS0FBSztJQUNwQixJQUFJcUMsT0FBTyxHQUFHLEtBQUs7SUFDbkIsSUFBSXpHLE9BQU8sR0FBRyxLQUFLO0lBQ25CLElBQUlzRSxXQUFXLEdBQUcsS0FBSztJQUN2QixJQUFJb0MsV0FBVyxHQUFHLEtBQUs7SUFDdkIsUUFBUTVRLFFBQVEsQ0FBQzVCLFFBQVE7TUFDdkIsS0FBSyxrQkFBa0I7UUFDckIsSUFBSTRCLFFBQVEsQ0FBQzJCLE9BQU8sRUFBRTtVQUNwQi9TLElBQUksa0JBQUFMLE1BQUEsQ0FDZWtiLCtEQUFxQixDQUFDekosUUFBUSxDQUFDMkIsT0FBTyxFQUFFZ0MsSUFBSSxFQUFFOEosV0FBVyxDQUFDLFFBQzNFQSxXQUNGLENBQUM7UUFDSDtRQUNBZSxXQUFXLEdBQUcsSUFBSTtRQUNsQjtNQUVGLEtBQUsscUJBQXFCO1FBQ3hCb0MsV0FBVyxHQUFHLElBQUk7UUFFbEIsSUFBSSxDQUFDNVEsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO1VBQ3BCOVMsSUFBSSwrQ0FBK0M2ZSxXQUFXLENBQUM7VUFDL0Q3ZSxJQUFJLHVCQUFtQjZlLFdBQVcsR0FBRyxDQUFDLENBQUM7VUFDdkM7UUFDRjtRQUVBUSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1pqTyxRQUFRLENBQUMwQixNQUFNLENBQUM3TixPQUFPLENBQUMsVUFBQTRhLENBQUMsRUFBSTtVQUMzQixJQUFJQSxDQUFDLENBQUN6TSxRQUFRLEVBQUU7WUFDZDRLLEtBQUssQ0FBQzZCLENBQUMsQ0FBQ3RYLElBQUksQ0FBQyxHQUFHc1gsQ0FBQyxDQUFDek0sUUFBUTtZQUMxQnNNLFFBQVEsR0FBRyxJQUFJO1VBQ2pCLENBQUMsTUFBTTtZQUNMTCxPQUFPLENBQUNRLENBQUMsQ0FBQ3RYLElBQUksQ0FBQyxHQUFHc1gsQ0FBQyxDQUFDamUsS0FBSztVQUMzQjtRQUNGLENBQUMsQ0FBQztRQUVGLElBQUk4ZCxRQUFRLEVBQUU7VUFBQSxJQUFBblMsU0FBQSxHQUFBakMsMEJBQUEsQ0FDTzJXLGdCQUFnQjtZQUFBelUsS0FBQTtVQUFBO1lBQW5DLEtBQUFELFNBQUEsQ0FBQTVCLENBQUEsTUFBQTZCLEtBQUEsR0FBQUQsU0FBQSxDQUFBM0IsQ0FBQSxJQUFBaEYsSUFBQSxHQUFxQztjQUFBLElBQTFCckgsSUFBSSxHQUFBaU8sS0FBQSxDQUFBNUwsS0FBQTtjQUNiNUIsSUFBSSxDQUFDVCxJQUFJLEVBQUVzZixXQUFXLENBQUM7WUFDekI7VUFBQyxTQUFBeGIsR0FBQTtZQUFBa0ssU0FBQSxDQUFBMUIsQ0FBQSxDQUFBeEksR0FBQTtVQUFBO1lBQUFrSyxTQUFBLENBQUF4QixDQUFBO1VBQUE7VUFDRHVGLEtBQUssQ0FBQyxDQUFDO1FBQ1Q7UUFDQXRSLElBQUksK0NBQStDNmUsV0FBVyxDQUFDO1FBRS9ELFNBQUFxRCxHQUFBLE1BQUFDLGdCQUFBLEdBQStCbGdCLE1BQU0sQ0FBQ2llLE9BQU8sQ0FBQ2xDLEtBQUssQ0FBQyxFQUFBa0UsR0FBQSxHQUFBQyxnQkFBQSxDQUFBbGpCLE1BQUEsRUFBQWlqQixHQUFBLElBQUU7VUFBakQsSUFBQUUsbUJBQUEsR0FBQTlYLGNBQUEsQ0FBQTZYLGdCQUFBLENBQUFELEdBQUE7WUFBTzNaLElBQUksR0FBQTZaLG1CQUFBO1lBQUVoUCxRQUFRLEdBQUFnUCxtQkFBQTtVQUN4QnBpQixJQUFJLFlBQUFMLE1BQUEsQ0FBVzRJLElBQUkseUJBQUE1SSxNQUFBLENBQW9CeVQsUUFBUSxpQkFBYXlMLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDOUU7UUFDQSxTQUFBd0QsR0FBQSxNQUFBQyxnQkFBQSxHQUE0QnJnQixNQUFNLENBQUNpZSxPQUFPLENBQUNiLE9BQU8sQ0FBQyxFQUFBZ0QsR0FBQSxHQUFBQyxnQkFBQSxDQUFBcmpCLE1BQUEsRUFBQW9qQixHQUFBLElBQUU7VUFBaEQsSUFBQUUsbUJBQUEsR0FBQWpZLGNBQUEsQ0FBQWdZLGdCQUFBLENBQUFELEdBQUE7WUFBTzlaLEtBQUksR0FBQWdhLG1CQUFBO1lBQUUzZ0IsTUFBSyxHQUFBMmdCLG1CQUFBO1VBQ3JCdmlCLElBQUksWUFBQUwsTUFBQSxDQUFXNEksS0FBSSxZQUFBNUksTUFBQSxDQUFPaUMsTUFBSyxVQUFNaWQsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN2RDtRQUNBOEMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUVmO01BRUY7UUFBUztVQUNQLElBQUl2USxRQUFRLENBQUM1QixRQUFRLEtBQUssbUNBQW1DLElBQUk0QixRQUFRLENBQUM0QixTQUFTLEVBQUU7WUFDbkZoVCxJQUFJLGtCQUFBTCxNQUFBLENBQ2VrYiwrREFBcUIsQ0FBQ3pKLFFBQVEsQ0FBQzRCLFNBQVMsRUFBRStCLElBQUksRUFBRThKLFdBQVcsQ0FBQyxRQUM3RUEsV0FDRixDQUFDO1lBQ0RrRCxPQUFPLEdBQUcsSUFBSTtZQUNkO1VBQ0Y7VUFFQSxJQUFJM1EsUUFBUSxDQUFDSyxJQUFJLEVBQUU7WUFDakJ6UixJQUFJLGtCQUFBTCxNQUFBLENBQ2VrYiwrREFBcUIsQ0FBQ3pKLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFc0QsSUFBSSxFQUFFOEosV0FBVyxDQUFDLFFBQ3hFQSxXQUNGLENBQUM7WUFDRHZELE9BQU8sR0FBRyxJQUFJO1lBQ2Q7VUFDRjtRQUNGO0lBQ0Y7SUFFQSxJQUFJeUcsT0FBTyxJQUFJbkMsV0FBVyxJQUFJdEUsT0FBTyxFQUFFO01BQ3JDdmIsT0FBTyx3QkFBd0IsQ0FBQztNQUNoQ3VSLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7SUFFQSxJQUFJK0osVUFBVSxHQUFHLEtBQUs7SUFDdEI7SUFDQSxJQUFJcFosTUFBTSxDQUFDOEcsSUFBSSxDQUFDb0ksVUFBVSxDQUFDLENBQUNsUyxNQUFNLEVBQUU7TUFDbENvYyxVQUFVLEdBQUcsSUFBSTtNQUNqQnJiLElBQUksQ0FBQyxzREFBc0QsRUFBRTZlLFdBQVcsQ0FBQztNQUN6RSxTQUFBMkQsR0FBQSxNQUFBQyxnQkFBQSxHQUEyQnhnQixNQUFNLENBQUNpZSxPQUFPLENBQUMvTyxVQUFVLENBQUMsRUFBQXFSLEdBQUEsR0FBQUMsZ0JBQUEsQ0FBQXhqQixNQUFBLEVBQUF1akIsR0FBQSxJQUFFO1FBQWxELElBQUFFLG1CQUFBLEdBQUFwWSxjQUFBLENBQUFtWSxnQkFBQSxDQUFBRCxHQUFBO1VBQU9qZ0IsSUFBRyxHQUFBbWdCLG1CQUFBO1VBQUU5Z0IsT0FBSyxHQUFBOGdCLG1CQUFBO1FBQ3BCO1FBQ0E7UUFDQSxJQUFJbmdCLElBQUcsQ0FBQzJNLFdBQVcsQ0FBQyxDQUFDLEtBQUssY0FBYyxJQUFJOFMsV0FBVyxFQUFFO1VBQ3ZEO1FBQ0Y7UUFDQWhpQixJQUFJLHFCQUFBTCxNQUFBLENBQ2lCNEMsSUFBRyxVQUFBNUMsTUFBQSxDQUFNa2IsK0RBQXFCLENBQUNqWixPQUFLLEVBQUVtVCxJQUFJLENBQUMsMEJBQzlEOEosV0FDRixDQUFDO01BQ0g7TUFDQXZOLEtBQUssQ0FBQyxDQUFDO0lBQ1Q7O0lBRUE7SUFDQXRSLElBQUksQ0FBQyxzQ0FBc0MsRUFBRTZlLFdBQVcsQ0FBQzs7SUFFekQ7SUFDQSxRQUFRM1osTUFBTTtNQUNaLEtBQUssTUFBTTtRQUNUbEYsSUFBSSxvQ0FBb0M2ZSxXQUFXLENBQUM7UUFDcEQ7TUFFRixLQUFLLEtBQUs7UUFDUjdlLElBQUksbUNBQW1DNmUsV0FBVyxDQUFDO1FBQ25EO01BRUY7UUFBUztVQUNQN2UsSUFBSSw4REFBQUwsTUFBQSxDQUMwRHVGLE1BQU0seUJBQ2xFMlosV0FDRixDQUFDO1VBQ0Q5ZSxPQUFPLHlCQUF5QixDQUFDO1VBQ2pDO1FBQ0Y7SUFDRjtJQUVBLElBQUk2aEIsUUFBUSxFQUFFO01BQ1o1aEIsSUFBSSx5QkFBeUI2ZSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQy9DO0lBRUEsSUFBSW1ELFdBQVcsRUFBRTtNQUNmaGlCLElBQUkscUJBQXFCNmUsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUMzQztJQUVBLElBQUl4RCxVQUFVLEVBQUU7TUFDZHJiLElBQUksc0JBQXNCNmUsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUM1QztJQUVBLElBQUllLFdBQVcsRUFBRTtNQUNmNWYsSUFBSSxvQkFBb0I2ZSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQzFDO0lBRUEsSUFBSWtELE9BQU8sRUFBRTtNQUNYL2hCLElBQUksb0JBQW9CNmUsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUMxQztJQUVBLElBQUl2RCxPQUFPLEVBQUU7TUFDWHRiLElBQUksbUJBQW1CNmUsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUN6Qzs7SUFFQTtJQUNBN2UsSUFBSSxDQUFDLFNBQVMsRUFBRTZlLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDaEM3ZSxJQUFJLENBQUMsU0FBUyxFQUFFNmUsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNoQ3ZOLEtBQUssQ0FBQyxDQUFDOztJQUVQO0lBQ0F0UixJQUFJLENBQUMsaUNBQWlDLEVBQUU2ZSxXQUFXLENBQUM7SUFDcEQ3ZSxJQUFJLENBQUMsOEJBQThCLEVBQUU2ZSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3JEN2UsSUFBSSxDQUFDLFFBQVEsRUFBRTZlLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDL0I3ZSxJQUFJLENBQUMsWUFBWSxFQUFFNmUsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNuQ3ZOLEtBQUssQ0FBQyxDQUFDO0lBRVB0UixJQUFJLENBQUMsZ0JBQWdCLEVBQUU2ZSxXQUFXLENBQUM7SUFFbkM3ZSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBRVgsT0FBT1osSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7QUFFRCxJQUFNNmlCLGdCQUFnQixHQUFHLCthQVN4Qjs7Ozs7Ozs7Ozs7Ozs7OztBQzdPMEM7QUFFcEMsSUFBTVUsSUFBWSxHQUFHO0VBQzFCNWIsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsTUFBTTtJQUNYc08sS0FBSyxFQUFFLE1BQU07SUFDYkgsT0FBTyxFQUFFLEtBQUs7SUFDZCxXQUFTO0VBQ1gsQ0FBQztFQUNERixXQUFXLEVBQUU7SUFDWGtSLE9BQU8sRUFBUEEsb0RBQU9BO0VBQ1Q7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFDd0I7QUFDckM7QUFZL0M7QUFDQTtBQUNBO0FBQ0EsSUFBTTVPLE1BQU0sR0FBRztFQUNiLFNBQVMsRUFBRSxHQUFHO0VBQ2QsTUFBTSxFQUFFLEVBQUU7RUFDVnRCLE1BQU0sRUFBRSxHQUFHO0VBQ1h5RyxJQUFJLEVBQUUsR0FBRztFQUNUM0ssSUFBSSxFQUFFLEdBQUc7RUFDVHNWLE9BQU8sRUFBRSxHQUFHO0VBQ1p4VixNQUFNLEVBQUUsR0FBRztFQUNYeVYsUUFBUSxFQUFFLEdBQUc7RUFDYmxVLE9BQU8sRUFBRTtBQUNYLENBQVU7QUFFVixJQUFNbVUsTUFBTSxHQUFHLFNBQVRBLE1BQU1BLENBQUlDLE1BQWM7RUFBQSxPQUFLLFVBQUNDLFFBQTZCLEVBQUs7SUFDcEUsSUFBSUQsTUFBSyxFQUFFO01BQ1QsSUFBTUUsU0FBUyxHQUFHblEsTUFBTSxDQUFDa1EsUUFBUSxDQUFDO01BQ2xDLElBQUksQ0FBQ0MsU0FBUyxFQUFFO1FBQ2QsT0FBTyxFQUFFO01BQ1g7TUFDQSxXQUFBdGpCLE1BQUEsQ0FBV3NqQixTQUFTO0lBQ3RCO0lBQ0EsWUFBQXRqQixNQUFBLENBQVlxakIsUUFBUTtFQUN0QixDQUFDO0FBQUE7QUFFTSxJQUFNOUcsSUFBeUIsR0FBRztFQUN2Q25WLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE1BQU07SUFDWHNPLEtBQUssRUFBRSxNQUFNO0lBQ2JDLElBQUksRUFBRSxzQkFBc0I7SUFDNUJDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQXdGO0lBQUEsSUFBQThWLGdCQUFBO0lBQUEsSUFBbkY1RCxPQUFPLEdBQUFsUyxJQUFBLENBQVBrUyxPQUFPO01BQUUvTCxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUV3UixXQUFXLEdBQUEzWCxJQUFBLENBQVgyWCxXQUFXO01BQUV4RixVQUFVLEdBQUFuUyxJQUFBLENBQVZtUyxVQUFVO01BQUVDLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUMsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtJQUFBLElBQUl2USxPQUFPLEdBQUE3QixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxDQUFDLENBQUM7SUFDeEYsSUFBQWtrQixlQUFBLEdBT0lyaUIsT0FBTyxDQU5Uc2lCLE1BQU07TUFBTkEsTUFBTSxHQUFBRCxlQUFBLGNBQUcsS0FBSyxHQUFBQSxlQUFBO01BQUFFLGdCQUFBLEdBTVp2aUIsT0FBTyxDQUxUd2lCLE9BQU87TUFBUEEsT0FBTyxHQUFBRCxnQkFBQSxjQUFHLEtBQUssR0FBQUEsZ0JBQUE7TUFBQXpKLGVBQUEsR0FLYjlZLE9BQU8sQ0FKVDFCLE1BQU07TUFBTkEsTUFBTSxHQUFBd2EsZUFBQSxjQUFHLElBQUksR0FBQUEsZUFBQTtNQUFBaEcscUJBQUEsR0FJWDlTLE9BQU8sQ0FIVCtTLGtCQUFrQjtNQUFsQkEsa0JBQWtCLEdBQUFELHFCQUFBLGNBQUcsS0FBSyxHQUFBQSxxQkFBQTtNQUFBMlAscUJBQUEsR0FHeEJ6aUIsT0FBTyxDQUZUMGlCLFlBQVk7TUFBWkEsWUFBWSxHQUFBRCxxQkFBQSxjQUFHLEtBQUssR0FBQUEscUJBQUE7TUFBQUUsY0FBQSxHQUVsQjNpQixPQUFPO01BRFRraUIsT0FBSyxHQUFBUyxjQUFBLGNBQUcsS0FBSyxHQUFBQSxjQUFBO0lBR2YsSUFBQW5TLFlBQUEsR0FBdUIsSUFBSXpTLDhEQUFXLENBQUEwUixhQUFBLENBQUFBLGFBQUEsS0FDaEMsT0FBT25SLE1BQU0sS0FBSyxRQUFRLEdBQUc7UUFBRUEsTUFBTSxFQUFFQTtNQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeERDLElBQUksRUFBRUQsTUFBTSxLQUFLLEtBQUssV0FBQVEsTUFBQSxDQUFXUixNQUFNLElBQUs7TUFBRyxFQUNoRCxDQUFDO01BSE1hLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRVosSUFBSSxHQUFBaVMsWUFBQSxDQUFKalMsSUFBSTtJQUtsQixJQUFNZ0YsR0FBRyxHQUFHMGUsTUFBTSxDQUFDQyxPQUFLLENBQUM7SUFFekIsSUFBSVUsWUFBWSxHQUFHM1QscURBQUssQ0FBQ21CLE9BQU8sQ0FBQztJQUVqQ2pSLElBQUksU0FBQUwsTUFBQSxDQUFTeUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFBekUsTUFBQSxDQUFJdUYsTUFBTSxDQUFFLENBQUM7SUFDeEMsSUFBSW1lLE9BQU8sRUFBRTtNQUNYSSxZQUFZLEdBQUdDLFFBQVEsQ0FBQ0QsWUFBWSxDQUFDO01BQ3JDempCLElBQUksQ0FBQ29FLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QjtJQUNBcEUsSUFBSSxJQUFBTCxNQUFBLENBQUl5RSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUF6RSxNQUFBLENBQUc4akIsWUFBWSxDQUFFLENBQUM7SUFFckMsSUFBSTdQLGtCQUFrQixFQUFFO01BQ3RCNVQsSUFBSSxDQUFDb0UsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZCO0lBRUEsSUFBSXNTLFdBQVcsS0FBSyxVQUFVLEVBQUU7TUFDOUIxVyxJQUFJLENBQUNvRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEI7SUFFQSxJQUFJOEksMkRBQVMsQ0FBQ2lFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO01BQzVDO01BQ0FuUixJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3RCOztJQUVBO0lBQ0EsSUFBSW9SLFFBQVEsQ0FBQzVCLFFBQVEsS0FBSyxxQkFBcUIsRUFBRTtNQUMvQyxJQUFNbVUscUJBQXFCLEdBQUc1VSwrREFBYSxDQUFDbUMsVUFBVSxFQUFFLGNBQWMsQ0FBQztNQUN2RSxJQUFJeVMscUJBQXFCLEVBQUU7UUFDekIsSUFBTXBMLGlCQUFpQixHQUFHckgsVUFBVSxDQUFDeVMscUJBQXFCLENBQUM7UUFDM0QsSUFBSUEscUJBQXFCLElBQUlwTCxpQkFBaUIsRUFBRTtVQUM5QztVQUNBO1VBQ0E7VUFDQSxJQUFNcUwsVUFBVSxHQUFHckwsaUJBQWlCLENBQUN0SSxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDOztVQUUxRTtVQUNBaUIsVUFBVSxDQUFDeVMscUJBQXFCLENBQUMsR0FBR0MsVUFBVTtVQUM5Q3pTLFVBQVUsQ0FBQ3dTLHFCQUFxQixDQUFDLEdBQUdDLFVBQVU7UUFDaEQ7TUFDRjtJQUNGOztJQUVBO0lBQ0EzaEIsTUFBTSxDQUFDOEcsSUFBSSxDQUFDbUksVUFBVSxDQUFDLENBQ3BCOEwsSUFBSSxDQUFDLENBQUMsQ0FDTi9YLE9BQU8sQ0FBQyxVQUFBMUMsR0FBRyxFQUFJO01BQ2QsSUFBTTZLLE1BQU0sTUFBQXpOLE1BQUEsQ0FBTTRDLEdBQUcsUUFBQTVDLE1BQUEsQ0FBS3VSLFVBQVUsQ0FBQzNPLEdBQUcsQ0FBQyxDQUFFO01BQzNDdkMsSUFBSSxJQUFBTCxNQUFBLENBQUl5RSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQUF6RSxNQUFBLENBQUltUSxxREFBSyxDQUFDMUMsTUFBTSxDQUFDLENBQUUsQ0FBQztJQUMzQyxDQUFDLENBQUM7SUFFSixJQUFJK0QsVUFBVSxDQUFDSyxNQUFNLEVBQUU7TUFDckJ4UixJQUFJLElBQUFMLE1BQUEsQ0FBSXlFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBQXpFLE1BQUEsQ0FBSW1RLHFEQUFLLENBQUNxQixVQUFVLENBQUNLLE1BQWdCLENBQUMsQ0FBRSxDQUFDO0lBQ2hFOztJQUVBO0lBQ0EsUUFBUUosUUFBUSxDQUFDNUIsUUFBUTtNQUN2QixLQUFLLHFCQUFxQjtRQUN4QixDQUFBcUYsZ0JBQUEsR0FBQXpELFFBQVEsQ0FBQzBCLE1BQU0sY0FBQStCLGdCQUFBLGVBQWZBLGdCQUFBLENBQWlCNVAsT0FBTyxDQUFDLFVBQUFrTyxLQUFLLEVBQUk7VUFDaEMsSUFBSTBRLElBQUksR0FBRyxFQUFFO1VBQ2IsSUFBSTFRLEtBQUssQ0FBQ0MsUUFBUSxFQUFFO1lBQ2xCeVEsSUFBSSxNQUFBbGtCLE1BQUEsQ0FBTXdULEtBQUssQ0FBQzVLLElBQUksUUFBQTVJLE1BQUEsQ0FBS3dULEtBQUssQ0FBQ0MsUUFBUSxDQUFFO1VBQzNDLENBQUMsTUFBTTtZQUNMeVEsSUFBSSxNQUFBbGtCLE1BQUEsQ0FBTXdULEtBQUssQ0FBQzVLLElBQUksT0FBQTVJLE1BQUEsQ0FBSXdULEtBQUssQ0FBQ3ZSLEtBQUssQ0FBRTtVQUN2QztVQUVBNUIsSUFBSSxJQUFBTCxNQUFBLENBQUl5RSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQUF6RSxNQUFBLENBQUltUSxxREFBSyxDQUFDK1QsSUFBSSxDQUFDLENBQUUsQ0FBQztRQUN2QyxDQUFDLENBQUM7UUFDRjtNQUVGLEtBQUssbUNBQW1DO1FBQ3RDLElBQUl6UyxRQUFRLENBQUMwQixNQUFNLEVBQUU7VUFDbkIxQixRQUFRLENBQUMwQixNQUFNLENBQUM3TixPQUFPLENBQUMsVUFBQWtPLEtBQUssRUFBSTtZQUMvQixJQUFNMlEsU0FBUyxHQUFHM1EsS0FBSyxDQUFDNUssSUFBSTtZQUM1QixJQUFNd2IsT0FBTyxHQUFHckssa0JBQWtCLENBQUN2RyxLQUFLLENBQUM1SyxJQUFJLENBQUM7WUFDOUMsSUFBTXliLGFBQWEsR0FBR0QsT0FBTyxLQUFLRCxTQUFTO1lBQzNDLElBQU12YixJQUFJLEdBQUd5YixhQUFhLEdBQUdELE9BQU8sR0FBR0QsU0FBUztZQUNoRCxJQUFNRyxJQUFJLEdBQUdkLE1BQU0sR0FBRyxlQUFlLFlBQUF4akIsTUFBQSxDQUFZcWtCLGFBQWEsR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFFO1lBQ3BGaGtCLElBQUksSUFBQUwsTUFBQSxDQUFJc2tCLElBQUksT0FBQXRrQixNQUFBLENBQUltUSxxREFBSyxJQUFBblEsTUFBQSxDQUFJNEksSUFBSSxPQUFBNUksTUFBQSxDQUFJd1QsS0FBSyxDQUFDdlIsS0FBSyxDQUFFLENBQUMsQ0FBRSxDQUFDO1VBQ3BELENBQUMsQ0FBQztRQUNKLENBQUMsTUFBTTtVQUNMNUIsSUFBSSxJQUFBTCxNQUFBLENBQUl3akIsTUFBTSxHQUFHLGVBQWUsR0FBRy9lLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBQXpFLE1BQUEsQ0FBSW1RLHFEQUFLLENBQUNzQixRQUFRLENBQUNLLElBQUksQ0FBQyxDQUFFLENBQUM7UUFDM0U7UUFDQTtNQUVGO1FBQVM7VUFDUDtVQUNBLElBQUksQ0FBQ0wsUUFBUSxDQUFDSyxJQUFJLEVBQUU7WUFDbEI7VUFDRjtVQUVBLElBQU13UyxJQUFJLEdBQUdkLE1BQU0sR0FBRyxlQUFlLEdBQUcvZSxHQUFHLENBQUMsTUFBTSxDQUFDO1VBRW5ELElBQUk4ZixZQUFZLEdBQUcsS0FBSztVQUN4QjtVQUNBLElBQUkzVSxnRUFBYyxDQUFDNkIsUUFBUSxDQUFDNUIsUUFBUSxDQUFDLEVBQUU7WUFDckM7WUFDQSxJQUFNMlUsV0FBVyxHQUFHL1MsUUFBUSxDQUFDSyxJQUFJLENBQUN4UyxNQUFNLEdBQUcsQ0FBQztZQUM1QyxJQUFJa2xCLFdBQVcsSUFBSVosWUFBWSxFQUFFO2NBQy9CLElBQUk7Z0JBQ0YsSUFBTTNELFdBQVcsR0FBR3BlLElBQUksQ0FBQzRpQixLQUFLLENBQUNoVCxRQUFRLENBQUNLLElBQUksQ0FBQzs7Z0JBRTdDO2dCQUNBO2dCQUNBO2dCQUNBeVMsWUFBWSxHQUFHLElBQUk7Z0JBRW5CLElBQU03RSxPQUFPLEdBQUc3ZCxJQUFJLENBQUNDLFNBQVMsQ0FBQ21lLFdBQVcsRUFBRTFnQixTQUFTLEVBQUVDLE1BQWdCLENBQUM7Z0JBQ3hFLElBQUlpUyxRQUFRLENBQUNLLElBQUksQ0FBQytMLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7a0JBQ2xDeGQsSUFBSSxJQUFBTCxNQUFBLENBQUlza0IsSUFBSSxpQkFBQXRrQixNQUFBLENBQWMwZixPQUFPLFVBQU8sQ0FBQztnQkFDM0MsQ0FBQyxNQUFNO2tCQUNMcmYsSUFBSSxJQUFBTCxNQUFBLENBQUlza0IsSUFBSSxVQUFBdGtCLE1BQUEsQ0FBTzBmLE9BQU8sUUFBSyxDQUFDO2dCQUNsQztjQUNGLENBQUMsQ0FBQyxPQUFPaGMsR0FBRyxFQUFFO2dCQUNaO2NBQUE7WUFFSjtVQUNGO1VBRUEsSUFBSSxDQUFDNmdCLFlBQVksRUFBRTtZQUNqQmxrQixJQUFJLElBQUFMLE1BQUEsQ0FBSXNrQixJQUFJLE9BQUF0a0IsTUFBQSxDQUFJbVEscURBQUssQ0FBQ3NCLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLENBQUUsQ0FBQztVQUN6QztRQUNGO0lBQ0Y7SUFFQSxPQUFPclMsSUFBSSxDQUFDLENBQUM7RUFDZjtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdk1EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNEQ7QUFDYjtBQWlCeEMsSUFBTWlsQixNQUE2QixHQUFHO0VBQzNDdGQsSUFBSSxFQUFFO0lBQ0p4RSxHQUFHLEVBQUUsUUFBUTtJQUNic08sS0FBSyxFQUFFLFFBQVE7SUFDZkMsSUFBSSxFQUFFLG9CQUFvQjtJQUMxQkMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQWpTLElBQUEsRUFBNkQ4QixPQUFPLEVBQUs7SUFBQSxJQUFwRXNRLFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUMsUUFBUSxHQUFBclMsSUFBQSxDQUFScVMsUUFBUTtNQUFFdUIsUUFBUSxHQUFBNVQsSUFBQSxDQUFSNFQsUUFBUTtNQUFFMUIsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztNQUFFL0wsTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtNQUFFME4sR0FBRyxHQUFBN1QsSUFBQSxDQUFINlQsR0FBRztJQUM5RCxJQUFNbUMsSUFBSSxHQUFBekUsYUFBQTtNQUNSMkMsSUFBSSxFQUFFLEtBQUs7TUFDWHFSLElBQUksRUFBRSxLQUFLO01BQ1h0VixPQUFPLEVBQUUsS0FBSztNQUNkN1AsTUFBTSxFQUFFLElBQUk7TUFDWmdjLE1BQU0sRUFBRSxLQUFLO01BQ2JvSixLQUFLLEVBQUUsS0FBSztNQUNaQyxXQUFXLEVBQUUsS0FBSztNQUNsQixTQUFPLEtBQUs7TUFDWkMsS0FBSyxFQUFFLEtBQUs7TUFDWnpPLE9BQU8sRUFBRSxLQUFLO01BQ2QwTyxPQUFPLEVBQUUsS0FBSztNQUNkQyxNQUFNLEVBQUU7SUFBSyxHQUNWOWpCLE9BQU8sQ0FDWDtJQUVELElBQUF3USxZQUFBLEdBQWdDLElBQUl6Uyw4REFBVyxDQUFDO1FBQzlDTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VixNQUFNO1FBQ25CO1FBQ0FDLElBQUksRUFBRTJWLElBQUksQ0FBQzVWLE1BQU0sS0FBSyxLQUFLLFdBQUFRLE1BQUEsQ0FBV29WLElBQUksQ0FBQzVWLE1BQU0sSUFBSztNQUN4RCxDQUFDLENBQUM7TUFKTWEsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFWixJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO01BQUVXLE9BQU8sR0FBQXNSLFlBQUEsQ0FBUHRSLE9BQU87SUFNM0IsSUFBSTZrQixHQUFHLEdBQUcsS0FBSztJQUNmLElBQU1DLEtBQUssR0FBRyxFQUFFO0lBRWhCLElBQUk5UCxJQUFJLENBQUMvRixPQUFPLEVBQUU7TUFDaEI2VixLQUFLLENBQUM3a0IsSUFBSSxDQUFDK1UsSUFBSSxTQUFNLEdBQUcsSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUM3QztJQUVBLElBQUlBLElBQUksQ0FBQzlCLElBQUksRUFBRTtNQUNiNFIsS0FBSyxDQUFDN2tCLElBQUksQ0FBQytVLElBQUksU0FBTSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUM7SUFDMUM7SUFFQSxJQUFJQSxJQUFJLENBQUMyUCxPQUFPLEVBQUU7TUFDaEJHLEtBQUssQ0FBQzdrQixJQUFJLENBQUMrVSxJQUFJLFNBQU0sR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDO0lBQzdDO0lBRUEsSUFBSUEsSUFBSSxDQUFDd1AsS0FBSyxFQUFFO01BQ2RNLEtBQUssQ0FBQzdrQixJQUFJLElBQUFMLE1BQUEsQ0FBSW9WLElBQUksU0FBTSxHQUFHLElBQUksR0FBRyxTQUFTLE9BQUFwVixNQUFBLENBQUlvVixJQUFJLENBQUN3UCxLQUFLLENBQUUsQ0FBQztJQUM5RDtJQUVBLElBQUl4UCxJQUFJLENBQUM0UCxNQUFNLEVBQUU7TUFDZkUsS0FBSyxDQUFDN2tCLElBQUksYUFBQUwsTUFBQSxDQUFhb1YsSUFBSSxDQUFDNFAsTUFBTSxDQUFFLENBQUM7SUFDdkM7SUFFQSxJQUFJNVAsSUFBSSxDQUFDdVAsSUFBSSxFQUFFO01BQ2JPLEtBQUssQ0FBQzdrQixJQUFJLFdBQUFMLE1BQUEsQ0FBV29WLElBQUksQ0FBQ3VQLElBQUksQ0FBRSxDQUFDO0lBQ25DO0lBRUEsSUFBSXZQLElBQUksQ0FBQ29HLE1BQU0sRUFBRTtNQUNmMEosS0FBSyxDQUFDN2tCLElBQUksYUFBQUwsTUFBQSxDQUFhb1YsSUFBSSxDQUFDb0csTUFBTSxDQUFFLENBQUM7SUFDdkM7SUFFQSxJQUFJcEcsSUFBSSxDQUFDMFAsS0FBSyxFQUFFO01BQ2RJLEtBQUssQ0FBQzdrQixJQUFJLFlBQUFMLE1BQUEsQ0FBWW9WLElBQUksQ0FBQzBQLEtBQUssQ0FBRSxDQUFDO0lBQ3JDO0lBRUEsSUFBSTFQLElBQUksQ0FBQ2lCLE9BQU8sRUFBRTtNQUNoQjZPLEtBQUssQ0FBQzdrQixJQUFJLGNBQUFMLE1BQUEsQ0FBY29WLElBQUksQ0FBQ2lCLE9BQU8sQ0FBRSxDQUFDO0lBQ3pDOztJQUVBO0lBQ0EsSUFBSWpCLElBQUksQ0FBQ3lQLFdBQVcsRUFBRTtNQUNwQnZpQixNQUFNLENBQUM4RyxJQUFJLENBQUM0SixRQUFRLENBQUMsQ0FBQzFOLE9BQU8sQ0FBQyxVQUFBc0QsSUFBSSxFQUFJO1FBQ3BDLElBQU0zRyxLQUFLLEdBQUcrUSxRQUFRLENBQUNwSyxJQUFJLENBQUM7UUFFNUIsSUFBSTZDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDekosS0FBSyxDQUFDLEVBQUU7VUFDeEJBLEtBQUssQ0FBQ3FELE9BQU8sQ0FBQyxVQUFBK0QsR0FBRyxFQUFJO1lBQ25CaEosSUFBSSxJQUFBTCxNQUFBLENBQUk0SSxJQUFJLFFBQUE1SSxNQUFBLENBQUttUSxxREFBSyxDQUFDOUcsR0FBRyxDQUFDLENBQUUsQ0FBQztVQUNoQyxDQUFDLENBQUM7UUFDSixDQUFDLE1BQU07VUFDTGhKLElBQUksSUFBQUwsTUFBQSxDQUFJNEksSUFBSSxRQUFBNUksTUFBQSxDQUFLbVEscURBQUssQ0FBQ2xPLEtBQUssQ0FBQyxDQUFFLENBQUM7UUFDbEM7TUFDRixDQUFDLENBQUM7SUFDSjs7SUFFQTtJQUNBSyxNQUFNLENBQUM4RyxJQUFJLENBQUNvSSxVQUFVLENBQUMsQ0FDcEI2TCxJQUFJLENBQUMsQ0FBQyxDQUNOL1gsT0FBTyxDQUFDLFVBQUExQyxHQUFHLEVBQUk7TUFDZHZDLElBQUksSUFBQUwsTUFBQSxDQUFJNEMsR0FBRyxPQUFBNUMsTUFBQSxDQUFJbVEscURBQUssQ0FBQ3FCLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBVyxDQUFDLENBQUUsQ0FBQztJQUNwRCxDQUFDLENBQUM7SUFFSixJQUFJNk8sUUFBUSxDQUFDNUIsUUFBUSxLQUFLLG1DQUFtQyxFQUFFO01BQzdEO01BQ0EsSUFBSTRCLFFBQVEsQ0FBQzBCLE1BQU0sSUFBSTFCLFFBQVEsQ0FBQzBCLE1BQU0sQ0FBQzdULE1BQU0sRUFBRTtRQUM3QzRsQixLQUFLLENBQUM3a0IsSUFBSSxDQUFDK1UsSUFBSSxTQUFNLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUV4QzNELFFBQVEsQ0FBQzBCLE1BQU0sQ0FBQzdOLE9BQU8sQ0FBQyxVQUFBa08sS0FBSyxFQUFJO1VBQy9CblQsSUFBSSxJQUFBTCxNQUFBLENBQUl3VCxLQUFLLENBQUM1SyxJQUFJLE9BQUE1SSxNQUFBLENBQUltUSxxREFBSyxDQUFDcUQsS0FBSyxDQUFDdlIsS0FBSyxDQUFDLENBQUUsQ0FBQztRQUM3QyxDQUFDLENBQUM7TUFDSjtJQUNGLENBQUMsTUFBTTtNQUNMZ2pCLEdBQUcsR0FBRyxJQUFJO0lBQ1o7SUFFQSxJQUFNRSxRQUFRLEdBQUdELEtBQUssQ0FBQzVsQixNQUFNLE1BQUFVLE1BQUEsQ0FBTWtsQixLQUFLLENBQUN6bEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFNLEVBQUU7SUFDMUR3VCxHQUFHLEdBQUc5QyxxREFBSyxDQUFDaUYsSUFBSSxDQUFDeVAsV0FBVyxHQUFHNVIsR0FBRyxHQUFHM0IsT0FBTyxDQUFDO0lBQzdDbFIsT0FBTyxTQUFBSixNQUFBLENBQVNtbEIsUUFBUSxFQUFBbmxCLE1BQUEsQ0FBR3VGLE1BQU0sT0FBQXZGLE1BQUEsQ0FBSWlULEdBQUcsQ0FBRSxDQUFDO0lBRTNDLElBQUlnUyxHQUFHLElBQUl4VCxRQUFRLENBQUNLLElBQUksRUFBRTtNQUN4QixJQUFNc1QsWUFBWSxHQUFHalYscURBQUssQ0FBQ3NCLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDO01BQ3pDMVIsT0FBTyxTQUFBSixNQUFBLENBQVNvbEIsWUFBWSxRQUFLLENBQUM7SUFDcEM7SUFFQSxPQUFPM2xCLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5SW9DO0FBQ0k7QUFDSjtBQUU5QixJQUFNNmxCLEtBQWEsR0FBRztFQUMzQmxlLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE9BQU87SUFDWnNPLEtBQUssRUFBRSxPQUFPO0lBQ2RILE9BQU8sRUFBRSxLQUFLO0lBQ2QsV0FBUztFQUNYLENBQUM7RUFDREYsV0FBVyxFQUFFO0lBQ1gwTCxJQUFJLEVBQUpBLDhDQUFJO0lBQ0ptSSxNQUFNLEVBQU5BLGtEQUFNO0lBQ05XLElBQUksRUFBSkEsOENBQUlBO0VBQ047QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQ0w7QUFRaEQsSUFBTUEsSUFBeUIsR0FBRztFQUN2Q2plLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE1BQU07SUFDWHNPLEtBQUssRUFBRSxNQUFNO0lBQ2JDLElBQUksRUFBRSxvQ0FBb0M7SUFDMUNDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQThDOEIsT0FBTyxFQUFLO0lBQUEsSUFBckRxRSxNQUFNLEdBQUFuRyxJQUFBLENBQU5tRyxNQUFNO01BQUVrTSxRQUFRLEdBQUFyUyxJQUFBLENBQVJxUyxRQUFRO01BQUVELFVBQVUsR0FBQXBTLElBQUEsQ0FBVm9TLFVBQVU7TUFBRUYsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztJQUMvQyxJQUFNOEQsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFLElBQUk7TUFDWixTQUFPLEtBQUs7TUFDWnVsQixPQUFPLEVBQUU7SUFBSyxHQUNYN2pCLE9BQU8sQ0FDWDtJQUVELElBQUF3USxZQUFBLEdBQXVCLElBQUl6Uyw4REFBVyxDQUFDO1FBQ3JDTyxNQUFNLEVBQUU0VixJQUFJLENBQUM1VixNQUFNO1FBQ25CO1FBQ0FDLElBQUksRUFBRTJWLElBQUksQ0FBQzVWLE1BQU0sS0FBSyxLQUFLLFdBQUFRLE1BQUEsQ0FBV29WLElBQUksQ0FBQzVWLE1BQU0sSUFBSztNQUN4RCxDQUFDLENBQUM7TUFKTWEsSUFBSSxHQUFBcVIsWUFBQSxDQUFKclIsSUFBSTtNQUFFWixJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJO0lBTWxCLElBQUkyVixJQUFJLENBQUMyUCxPQUFPLEVBQUU7TUFDaEIxa0IsSUFBSSxTQUFBTCxNQUFBLENBQVNvVixJQUFJLFNBQU0sR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFFLENBQUM7SUFDakQsQ0FBQyxNQUFNO01BQ0wvVSxJQUFJLFNBQUFMLE1BQUEsQ0FBU29WLElBQUksU0FBTSxHQUFHLElBQUksR0FBRyxTQUFTLENBQUUsQ0FBQztJQUMvQztJQUVBL1UsSUFBSSxhQUFBTCxNQUFBLENBQWFtUSxxREFBSyxDQUFDNUssTUFBTSxDQUFDLENBQUUsQ0FBQztJQUVqQ2pELE1BQU0sQ0FBQzhHLElBQUksQ0FBQ29JLFVBQVUsQ0FBQyxDQUFDbE0sT0FBTyxDQUFDLFVBQUExQyxHQUFHLEVBQUk7TUFDckMsSUFBTTZLLE1BQU0sTUFBQXpOLE1BQUEsQ0FBTTRDLEdBQUcsUUFBQTVDLE1BQUEsQ0FBS3dSLFVBQVUsQ0FBQzVPLEdBQUcsQ0FBQyxDQUFFO01BQzNDdkMsSUFBSSxhQUFBTCxNQUFBLENBQWFtUSxxREFBSyxDQUFDMUMsTUFBTSxDQUFDLENBQUUsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFFRixJQUFJZ0UsUUFBUSxDQUFDSyxJQUFJLEVBQUU7TUFDakJ6UixJQUFJLGdCQUFBTCxNQUFBLENBQWdCdVEsc0RBQU0sQ0FBQ0oscURBQUssQ0FBQ3NCLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDO0lBQ3JEO0lBRUF6UixJQUFJLENBQUMrVSxJQUFJLFNBQU0sR0FBRyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDN0MvVSxJQUFJLE1BQUFMLE1BQUEsQ0FBTW1RLHFEQUFLLENBQUNtQixPQUFPLENBQUMsQ0FBRSxDQUFDO0lBRTNCLE9BQU83UixJQUFJLENBQUMsQ0FBQztFQUNmO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQzlERDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNOGxCLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFJam1CLE1BQWMsRUFBRWttQixHQUFXO0VBQUEsT0FBS0EsR0FBRyxDQUFDemxCLE1BQU0sQ0FBQ1QsTUFBTSxDQUFDO0FBQUE7O0FBRXZFO0FBQ0E7QUFDQTtBQUNBLElBQU1tbUIsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQU83YSxHQUFRLEVBQUU0USxNQUFlLEVBQUVMLFdBQW1CLEVBQUUrRCxXQUFtQixFQUFLO0VBQzlGLElBQU1DLGFBQWEsR0FBR29HLFdBQVcsQ0FBQ3JHLFdBQVcsRUFBRS9ELFdBQVcsQ0FBQztFQUMzRCxJQUFNaUUsa0JBQWtCLEdBQUdtRyxXQUFXLENBQUNyRyxXQUFXLEdBQUcsQ0FBQyxFQUFFL0QsV0FBVyxDQUFDO0VBQ3BFLElBQU0xYixJQUFJLEdBQUcrYixNQUFNLFNBQUF4YixNQUFBLENBQVNtZixhQUFhLElBQUssSUFBSTtFQUVsRCxJQUFJM0QsTUFBTSxFQUFFO0lBQ1YsYUFBQXhiLE1BQUEsQ0FBYW1mLGFBQWEsRUFBQW5mLE1BQUEsQ0FBRzRLLEdBQUcsQ0FBQ25MLElBQUksQ0FBQ0EsSUFBSSxDQUFDLFFBQUFPLE1BQUEsQ0FBS29mLGtCQUFrQjtFQUNwRTtFQUNBLFdBQUFwZixNQUFBLENBQVc0SyxHQUFHLENBQUNuTCxJQUFJLENBQUNBLElBQUksQ0FBQztBQUMzQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNaW1CLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQVU5YyxJQUFZLEVBQUVtUyxVQUFhLEVBQUUzRixJQUFPO0VBQUEsY0FBQXBWLE1BQUEsQ0FDcEU0SSxJQUFJLFNBQUE1SSxNQUFBLENBQU1rYixzQkFBcUIsQ0FBQ0gsVUFBVSxFQUFFM0YsSUFBSSxDQUFDO0FBQUEsQ0FBRTs7QUFFNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTThGLHNCQUFxQixHQUFHLFNBQXhCQSxxQkFBcUJBLENBQ2hDalosS0FBUSxFQUNSbVQsSUFBTyxFQUNQOEosV0FBb0IsRUFDQTtFQUNwQkEsV0FBVyxHQUFHQSxXQUFXLEtBQUszZixTQUFTLEdBQUcsQ0FBQyxHQUFHMmYsV0FBVyxHQUFHLENBQUM7RUFFN0QsUUFBUTVjLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDYixRQUFRLENBQUNpRCxJQUFJLENBQUMxQyxLQUFLLENBQUM7SUFDM0MsS0FBSyxpQkFBaUI7TUFDcEIsT0FBT0EsS0FBSztJQUVkLEtBQUssZ0JBQWdCO01BQUU7UUFDckI7UUFDQSxJQUFJdVosTUFBTSxHQUFHLEtBQUs7UUFDbEIsSUFBTUosb0JBQW9CLEdBQUluWixLQUFLLENBQXNCTixHQUFHLENBQUMsVUFBQzRkLENBQU0sRUFBSztVQUN2RTtVQUNBLElBQUlqZCxNQUFNLENBQUNDLFNBQVMsQ0FBQ2IsUUFBUSxDQUFDaUQsSUFBSSxDQUFDNGEsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEVBQUU7WUFDM0QvRCxNQUFNLEdBQUdsWixNQUFNLENBQUM4RyxJQUFJLENBQUNtVyxDQUFDLENBQUMsQ0FBQ2pnQixNQUFNLEdBQUcsQ0FBQztVQUNwQztVQUNBLE9BQU80YixzQkFBcUIsQ0FBQ3FFLENBQUMsRUFBRW5LLElBQUksRUFBRThKLFdBQVcsQ0FBQztRQUNwRCxDQUFDLENBQUM7UUFDRjtRQUNBLE9BQU91RyxXQUFXLENBQUNySyxvQkFBb0IsRUFBRUksTUFBTSxFQUFFcEcsSUFBSSxDQUFDNVYsTUFBTSxFQUFFMGYsV0FBVyxDQUFDO01BQzVFO0lBRUEsS0FBSyxpQkFBaUI7TUFBRTtRQUN0QixJQUFNN0QsYUFBYSxHQUFHLEVBQUU7UUFDeEIsS0FBSyxJQUFNelksR0FBRyxJQUFJWCxLQUFLLEVBQUU7VUFDdkJvWixhQUFhLENBQUNoYixJQUFJLE1BQUFMLE1BQUEsQ0FBSzRDLEdBQUcsVUFBQTVDLE1BQUEsQ0FBTWtiLHNCQUFxQixDQUFDalosS0FBSyxDQUFDVyxHQUFHLENBQUMsRUFBRXdTLElBQUksRUFBRThKLFdBQVcsQ0FBQyxDQUFFLENBQUM7UUFDekY7UUFDQSxPQUFPdUcsV0FBVyxDQUNoQnBLLGFBQWE7UUFDYjtRQUNBakcsSUFBSSxDQUFDb0csTUFBTSxJQUFJSCxhQUFhLENBQUMvYixNQUFNLEdBQUcsQ0FBQztRQUN2QztRQUNBOFYsSUFBSSxDQUFDNVYsTUFBTSxFQUNYMGYsV0FDRixDQUFDO01BQ0g7SUFFQSxLQUFLLGtCQUFrQjtNQUNyQixPQUFRamQsS0FBSyxDQUF3QlAsUUFBUSxDQUFDLENBQUM7SUFFakQ7TUFDRSxJQUFJTyxLQUFLLEtBQUssSUFBSSxJQUFJQSxLQUFLLEtBQUsxQyxTQUFTLEVBQUU7UUFDekMsT0FBTyxFQUFFO01BQ1g7TUFDQSxZQUFBUyxNQUFBLENBQVlpQyxLQUFLLENBQVNQLFFBQVEsQ0FBQyxDQUFDLENBQUM0TyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztFQUM3RDtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hGRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBRVo7QUFPekMsSUFBTWlMLFlBQXlDLEdBQUc7RUFDdkRuVSxJQUFJLEVBQUU7SUFDSnhFLEdBQUcsRUFBRSxjQUFjO0lBQ25Cc08sS0FBSyxFQUFFLGNBQWM7SUFDckJDLElBQUksRUFBRSwwR0FBMEc7SUFDaEhDLFdBQVcsRUFBRTtFQUNmLENBQUM7RUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUFqUyxJQUFBLEVBQThDOEIsT0FBTyxFQUFLO0lBQUEsSUFBQWdVLGdCQUFBO0lBQUEsSUFBckQxRCxVQUFVLEdBQUFwUyxJQUFBLENBQVZvUyxVQUFVO01BQUVDLFFBQVEsR0FBQXJTLElBQUEsQ0FBUnFTLFFBQVE7TUFBRUgsT0FBTyxHQUFBbFMsSUFBQSxDQUFQa1MsT0FBTztNQUFFL0wsTUFBTSxHQUFBbkcsSUFBQSxDQUFObUcsTUFBTTtJQUMvQyxJQUFNNlAsSUFBSSxHQUFBekUsYUFBQTtNQUNSblIsTUFBTSxFQUFFLElBQUk7TUFDWmdjLE1BQU0sRUFBRSxJQUFJO01BQ1puRixPQUFPLEVBQUU7SUFBSSxHQUNWblYsT0FBTyxDQUNYO0lBRUQsSUFBQXdRLFlBQUEsR0FBOEIsSUFBSXpTLDhEQUFXLENBQUM7UUFBRU8sTUFBTSxFQUFFNFYsSUFBSSxDQUFDNVY7TUFBTyxDQUFDLENBQUM7TUFBOURhLElBQUksR0FBQXFSLFlBQUEsQ0FBSnJSLElBQUk7TUFBRXNSLEtBQUssR0FBQUQsWUFBQSxDQUFMQyxLQUFLO01BQUVsUyxJQUFJLEdBQUFpUyxZQUFBLENBQUpqUyxJQUFJOztJQUV6QjtJQUNBLElBQU1nYyxHQUFHLEdBQUc7TUFDVkMsVUFBVSxFQUFFLEtBQUs7TUFDakJDLE9BQU8sRUFBRTtJQUNYLENBQUM7O0lBRUQ7SUFDQXRiLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUV6QixJQUFJaUMsTUFBTSxDQUFDOEcsSUFBSSxDQUFDb0ksVUFBVSxDQUFDLENBQUNsUyxNQUFNLEVBQUU7TUFDbENtYyxHQUFHLENBQUNDLFVBQVUsR0FBRyxJQUFJO01BQ3JCL0osS0FBSyxDQUFDLENBQUM7TUFDUHRSLElBQUksQ0FBQ3FsQiw0REFBa0IsQ0FBQyxTQUFTLEVBQUVsVSxVQUFVLEVBQUU0RCxJQUFJLENBQUMsQ0FBQztJQUN2RDtJQUVBLElBQUkzRCxRQUFRLENBQUNLLElBQUksSUFBSUwsUUFBUSxDQUFDMkIsT0FBTyxJQUFJM0IsUUFBUSxDQUFDMEIsTUFBTSxFQUFFO01BQ3hEc0ksR0FBRyxDQUFDRSxPQUFPLEdBQUcsSUFBSTtNQUVsQixRQUFRbEssUUFBUSxDQUFDNUIsUUFBUTtRQUN2QixLQUFLLG1DQUFtQztVQUN0QztVQUNBO1VBQ0E7VUFDQThCLEtBQUssQ0FBQyxDQUFDO1VBQ1AsS0FBQXVELGdCQUFBLEdBQUl6RCxRQUFRLENBQUMwQixNQUFNLGNBQUErQixnQkFBQSxlQUFmQSxnQkFBQSxDQUFpQjVWLE1BQU0sRUFBRTtZQUMzQixJQUFBNlYsaUJBQUEsR0FBQXlHLFFBQUEsQ0FBd0JuSyxRQUFRLENBQUMwQixNQUFNO2NBQWhDMEksSUFBSSxHQUFBMUcsaUJBQUE7Y0FBSzJHLElBQUksR0FBQTNHLGlCQUFBLENBQUFwVCxLQUFBO1lBQ3BCMUIsSUFBSSx5Q0FBQUwsTUFBQSxDQUNxQzZiLElBQUksQ0FBQ2pULElBQUksT0FBQTVJLE1BQUEsQ0FBSTZiLElBQUksQ0FBQzVaLEtBQUssMkNBQ2hFLENBQUM7WUFDRDZaLElBQUksQ0FBQ3hXLE9BQU8sQ0FBQyxVQUFBc1EsS0FBQSxFQUFxQjtjQUFBLElBQWxCaE4sSUFBSSxHQUFBZ04sS0FBQSxDQUFKaE4sSUFBSTtnQkFBRTNHLEtBQUssR0FBQTJULEtBQUEsQ0FBTDNULEtBQUs7Y0FDekI1QixJQUFJLHVCQUFBTCxNQUFBLENBQXNCNEksSUFBSSxPQUFBNUksTUFBQSxDQUFJaUMsS0FBSywyQ0FBdUMsQ0FBQztZQUNqRixDQUFDLENBQUM7VUFDSixDQUFDLE1BQU07WUFDTHdaLEdBQUcsQ0FBQ0UsT0FBTyxHQUFHLEtBQUs7VUFDckI7VUFDQTtRQUVGLEtBQUssa0JBQWtCO1VBQ3JCLElBQUlsSyxRQUFRLENBQUMyQixPQUFPLEVBQUU7WUFDcEIvUyxJQUFJLElBQUFMLE1BQUEsQ0FBSTBsQiw0REFBa0IsQ0FBQyxZQUFZLEVBQUVqVSxRQUFRLENBQUMyQixPQUFPLEVBQUVnQyxJQUFJLENBQUMsdUJBQW9CLENBQUM7WUFDckZ6RCxLQUFLLENBQUMsQ0FBQztZQUVQdFIsSUFBSSxDQUFDLGdGQUFnRixDQUFDO1VBQ3hGO1VBQ0E7UUFFRixLQUFLLHFCQUFxQjtVQUN4QjtBQUNWO0FBQ0E7QUFDQTtBQUNBOztVQUVVQSxJQUFJLENBQUNxbEIsNERBQWtCLENBQUMsWUFBWSxFQUFFalUsUUFBUSxDQUFDMEIsTUFBTSxFQUFFaUMsSUFBSSxDQUFDLENBQUM7VUFDN0R6RCxLQUFLLENBQUMsQ0FBQztVQUNQdFIsSUFBSSxxQkFBQUwsTUFBQSxDQUFvQnlSLFFBQVEsQ0FBQ25FLFFBQVEsT0FBRyxDQUFDO1VBQzdDcUUsS0FBSyxDQUFDLENBQUM7VUFDUHRSLElBQUksQ0FBQyxlQUFlLENBQUM7VUFDckJBLElBQUksQ0FBQywyQkFBMkIsQ0FBQztVQUNqQ0EsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1VBQ2pDQSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFDO1VBQ3pDQSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFDO1VBQ3pDQSxJQUFJLENBQUMsbUVBQW1FLEVBQUUsQ0FBQyxDQUFDO1VBQzVFQSxJQUFJLENBQUMsdUNBQXVDLEVBQUUsQ0FBQyxDQUFDO1VBQ2hEQSxJQUFJLENBQUMsMENBQTBDLEVBQUUsQ0FBQyxDQUFDO1VBQ25EQSxJQUFJLENBQ0Ysb0ZBQW9GLEVBQ3BGLENBQ0YsQ0FBQztVQUNEQSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1VBQzlCQSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1VBQzlCQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztVQUNaQSxJQUFJLENBQUMsK0NBQStDLEVBQUUsQ0FBQyxDQUFDO1VBQ3hEQSxJQUFJLENBQUMscURBQXFELEVBQUUsQ0FBQyxDQUFDO1VBQzlEQSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1VBQzlCQSxJQUFJLENBQUMsNkNBQTZDLEVBQUUsQ0FBQyxDQUFDO1VBQ3REQSxJQUFJLENBQUMsc0NBQXNDLEVBQUUsQ0FBQyxDQUFDO1VBQy9DQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztVQUNaQSxJQUFJLENBQUMsR0FBRyxDQUFDO1VBQ1Q7UUFFRjtVQUNFc1IsS0FBSyxDQUFDLENBQUM7VUFDUHRSLElBQUksa0NBQUFMLE1BQUEsQ0FDOEJ5UixRQUFRLENBQUNLLElBQUksMkNBQy9DLENBQUM7TUFDTDtJQUNGO0lBRUFILEtBQUssQ0FBQyxDQUFDOztJQUVQO0lBQ0F0UixJQUFJLDJEQUFBTCxNQUFBLENBQTBEc1IsT0FBTyxpQkFBYSxDQUFDO0lBQ25GalIsSUFBSSxDQUFDLCtFQUErRSxDQUFDO0lBQ3JGQSxJQUFJLEVBQ0Y7SUFBQSx3REFBQUwsTUFBQSxDQUN3RDJsQixRQUFRLENBQUN2USxJQUFJLENBQUNpQixPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMwRixPQUFPLENBQ3hGLENBQ0YsQ0FBQyxNQUNILENBQUM7SUFDRDFiLElBQUksMkJBQUFMLE1BQUEsQ0FBMEJ1RixNQUFNLE9BQUcsQ0FBQztJQUV4QyxJQUFJa1csR0FBRyxDQUFDQyxVQUFVLEVBQUU7TUFDbEJyYixJQUFJLENBQUMsdUNBQXVDLENBQUM7SUFDL0M7SUFFQSxJQUFJb2IsR0FBRyxDQUFDRSxPQUFPLEVBQUU7TUFDZnRiLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQztJQUM3QztJQUVBc1IsS0FBSyxDQUFDLENBQUM7SUFDUDs7SUFFQXRSLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztJQUN2Q0EsSUFBSSxDQUNGLHNIQUNGLENBQUM7SUFDREEsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUM5QkEsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUM5QkEsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCQSxJQUFJLENBQUMsaURBQWlELEVBQUUsQ0FBQyxDQUFDO0lBQzFEQSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBQzlCQSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNaQSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ1ZzUixLQUFLLENBQUMsQ0FBQztJQUNQdFIsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBRXpCLE9BQU9aLElBQUksQ0FBQyxDQUFDO0VBQ2Y7QUFDRixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDcEtvRDtBQUU5QyxJQUFNbW1CLEtBQWEsR0FBRztFQUMzQnhlLElBQUksRUFBRTtJQUNKeEUsR0FBRyxFQUFFLE9BQU87SUFDWnNPLEtBQUssRUFBRSxPQUFPO0lBQ2RILE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVM7RUFDWCxDQUFDO0VBQ0RGLFdBQVcsRUFBRTtJQUNYMEssWUFBWSxFQUFaQSw4REFBWUE7RUFDZDtBQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUOEI7QUFDWTtBQUNBO0FBQ0Y7QUFDUjtBQUNJO0FBQ0E7QUFDWTtBQUNSO0FBQ0o7QUFDQTtBQUNFO0FBQ0o7QUFDYztBQUNSO0FBQ1Y7QUFDTTtBQUNBO0FBQ0U7QUFDQTtBQXFDaEMsSUFBTS9LLE9BQU8sR0FBRztFQUNyQjVPLENBQUMsRUFBREEsd0NBQUM7RUFDRGlTLE9BQU8sRUFBUEEsb0RBQU87RUFDUFMsT0FBTyxFQUFQQSxvREFBTztFQUNQdUIsTUFBTSxFQUFOQSxrREFBTTtFQUNOYyxFQUFFLEVBQUZBLDBDQUFFO0VBQ0ZnQixJQUFJLEVBQUpBLDhDQUFJO0VBQ0pNLElBQUksRUFBSkEsOENBQUk7RUFDSnVCLFVBQVUsRUFBVkEsMERBQVU7RUFDVkUsTUFBTSxFQUFOQSxrREFBTTtFQUNOaUIsSUFBSSxFQUFKQSw4Q0FBSTtFQUNKcUIsSUFBSSxFQUFKQSwrQ0FBSTtFQUNKSyxLQUFLLEVBQUxBLGlEQUFLO0VBQ0xtQyxHQUFHLEVBQUhBLDZDQUFHO0VBQ0hPLFVBQVUsRUFBVkEsMkRBQVU7RUFDVnFCLE1BQU0sRUFBTkEsbURBQU07RUFDTnFCLENBQUMsRUFBREEseUNBQUM7RUFDREksSUFBSSxFQUFKQSwrQ0FBSTtFQUNKbUIsSUFBSSxFQUFKQSwrQ0FBSTtFQUNKc0MsS0FBSyxFQUFMQSxpREFBSztFQUNMTSxLQUFLLEVBQUxBLGlEQUFLQTtBQUNQLENBQUM7QUFFTSxJQUFNQyxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSUMsTUFBYyxFQUF1QjtFQUM1RCxJQUFJOWYsT0FBQSxDQUFPOGYsTUFBTSxNQUFLLFFBQVEsSUFBSUEsTUFBTSxLQUFLLElBQUksSUFBSXJhLEtBQUssQ0FBQ0MsT0FBTyxDQUFDb2EsTUFBTSxDQUFDLEVBQUU7SUFDMUUsSUFBTUMsR0FBRyxHQUFHRCxNQUFNLEtBQUssSUFBSSxHQUFHLE1BQU0sR0FBR3JhLEtBQUssQ0FBQ0MsT0FBTyxDQUFDb2EsTUFBTSxDQUFDLEdBQUcsT0FBTyxHQUFBOWYsT0FBQSxDQUFVOGYsTUFBTTtJQUN0RixNQUFNLElBQUl0ZixLQUFLLGtFQUFBeEcsTUFBQSxDQUFpRStsQixHQUFHLE9BQUcsQ0FBQztFQUN6RjtFQUVBLElBQUksQ0FBQ3pqQixNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDbWhCLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRTtJQUN6RCxNQUFNLElBQUl0ZixLQUFLLENBQUMsdUNBQXVDLENBQUM7RUFDMUQ7RUFFQSxJQUFJLENBQUNsRSxNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDbWhCLE1BQU0sQ0FBQzFlLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtJQUM3RCxNQUFNLElBQUlaLEtBQUssQ0FBQyw0REFBNEQsQ0FBQztFQUMvRTtFQUVBLElBQUksQ0FBQ3NmLE1BQU0sQ0FBQzFlLElBQUksQ0FBQ3hFLEdBQUcsRUFBRTtJQUNwQixNQUFNLElBQUk0RCxLQUFLLENBQUMsb0NBQW9DLENBQUM7RUFDdkQ7RUFFQSxJQUFJbEUsTUFBTSxDQUFDQyxTQUFTLENBQUNFLGNBQWMsQ0FBQ2tDLElBQUksQ0FBQzZMLE9BQU8sRUFBRXNWLE1BQU0sQ0FBQzFlLElBQUksQ0FBQ3hFLEdBQUcsQ0FBQyxFQUFFO0lBQ2xFLE1BQU0sSUFBSTRELEtBQUssNENBQUF4RyxNQUFBLENBQTZDOGxCLE1BQU0sQ0FBQzFlLElBQUksQ0FBQ3hFLEdBQUcsTUFBSSxDQUFDO0VBQ2xGO0VBRUEsSUFBSSxDQUFDTixNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDbWhCLE1BQU0sQ0FBQzFlLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtJQUMvRCxNQUFNLElBQUlaLEtBQUssQ0FBQyw4REFBOEQsQ0FBQztFQUNqRjtFQUVBLElBQUksQ0FBQ3NmLE1BQU0sQ0FBQzFlLElBQUksQ0FBQzhKLEtBQUssRUFBRTtJQUN0QixNQUFNLElBQUkxSyxLQUFLLENBQUMsK0NBQStDLENBQUM7RUFDbEU7RUFFQSxJQUFJLENBQUNsRSxNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDbWhCLE1BQU0sQ0FBQzFlLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtJQUNqRSxNQUFNLElBQUlaLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQztFQUNuRjtFQUVBLElBQ0UsQ0FBQ2xFLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDRSxjQUFjLENBQUNrQyxJQUFJLENBQUNtaEIsTUFBTSxFQUFFLGFBQWEsQ0FBQyxJQUM1RCxDQUFDQSxNQUFNLENBQUNqVixXQUFXLElBQ25Cdk8sTUFBTSxDQUFDOEcsSUFBSSxDQUFDMGMsTUFBTSxDQUFDalYsV0FBVyxDQUFDLENBQUN2UixNQUFNLEtBQUssQ0FBQyxFQUM1QztJQUNBLE1BQU0sSUFBSWtILEtBQUssa0NBQUF4RyxNQUFBLENBQ29COGxCLE1BQU0sQ0FBQzFlLElBQUksQ0FBQ3hFLEdBQUcsMEVBQ2xELENBQUM7RUFDSDtFQUVBLElBQUksQ0FBQ04sTUFBTSxDQUFDQyxTQUFTLENBQUNFLGNBQWMsQ0FBQ2tDLElBQUksQ0FBQ21oQixNQUFNLENBQUMxZSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7SUFDakUsTUFBTSxJQUFJWixLQUFLLENBQUMsZ0VBQWdFLENBQUM7RUFDbkY7RUFFQSxJQUFJLENBQUNsRSxNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDbWhCLE1BQU0sQ0FBQ2pWLFdBQVcsRUFBRWlWLE1BQU0sQ0FBQzFlLElBQUksV0FBUSxDQUFDLEVBQUU7SUFDbEYsTUFBTSxJQUFJWixLQUFLLFdBQUF4RyxNQUFBLENBQ0g4bEIsTUFBTSxDQUFDMWUsSUFBSSxDQUFDeEUsR0FBRywyQ0FBQTVDLE1BQUEsQ0FDdkI4bEIsTUFBTSxDQUFDMWUsSUFBSSxXQUFRLDBFQUFBcEgsTUFBQSxDQUNvRDZCLElBQUksQ0FBQ0MsU0FBUyxDQUNyRlEsTUFBTSxDQUFDOEcsSUFBSSxDQUFDMGMsTUFBTSxDQUFDalYsV0FBVyxDQUNoQyxDQUFDLE1BQ0gsQ0FBQztFQUNIO0VBRUF2TyxNQUFNLENBQUM2QyxNQUFNLENBQUMyZ0IsTUFBTSxDQUFDalYsV0FBVyxDQUFDLENBQUN2TCxPQUFPLENBQUMwZ0IsUUFBUSxDQUFDO0VBRW5ELE9BQU8sSUFBSTtBQUNiLENBQUM7QUFFTSxJQUFNQyxTQUFTLEdBQUcsU0FBWkEsU0FBU0EsQ0FBSUgsTUFBYyxFQUFLO0VBQzNDLElBQUksQ0FBQ0QsUUFBUSxDQUFDQyxNQUFNLENBQUMsRUFBRTtJQUNyQjtFQUNGO0VBQ0F0VixPQUFPLENBQUNzVixNQUFNLENBQUMxZSxJQUFJLENBQUN4RSxHQUFHLENBQUMsR0FBR2tqQixNQUFNO0FBQ25DLENBQUM7QUFFTSxJQUFNRSxRQUFRLEdBQUcsU0FBWEEsUUFBUUEsQ0FBSXRQLE1BQWMsRUFBdUI7RUFDNUQsSUFBSSxDQUFDQSxNQUFNLEVBQUU7SUFDWCxNQUFNLElBQUlsUSxLQUFLLENBQUMseUJBQXlCLENBQUM7RUFDNUM7RUFFQSxJQUFJLENBQUNsRSxNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDK1IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFO0lBQ3pELE1BQU0sSUFBSWxRLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQztFQUNqRTtFQUVBLElBQUksQ0FBQ2xFLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDRSxjQUFjLENBQUNrQyxJQUFJLENBQUMrUixNQUFNLENBQUN0UCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7SUFDN0QsTUFBTSxJQUFJWixLQUFLLENBQUMsK0RBQStELENBQUM7RUFDbEY7RUFFQSxJQUFJLENBQUNrUSxNQUFNLENBQUN0UCxJQUFJLENBQUN4RSxHQUFHLEVBQUU7SUFDcEIsTUFBTSxJQUFJNEQsS0FBSyxDQUFDLGtFQUFrRSxDQUFDO0VBQ3JGO0VBRUEsSUFBSSxDQUFDbEUsTUFBTSxDQUFDQyxTQUFTLENBQUNFLGNBQWMsQ0FBQ2tDLElBQUksQ0FBQytSLE1BQU0sQ0FBQ3RQLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtJQUMvRCxNQUFNLElBQUlaLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQztFQUNwRjtFQUVBLElBQUksQ0FBQ2xFLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDRSxjQUFjLENBQUNrQyxJQUFJLENBQUMrUixNQUFNLENBQUN0UCxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQUU7SUFDckUsTUFBTSxJQUFJWixLQUFLLENBQUMsdUVBQXVFLENBQUM7RUFDMUY7RUFFQSxJQUFJLENBQUNsRSxNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDK1IsTUFBTSxDQUFDdFAsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFO0lBQzlELE1BQU0sSUFBSVosS0FBSyxDQUFDLGdFQUFnRSxDQUFDO0VBQ25GO0VBRUEsSUFDRSxDQUFDbEUsTUFBTSxDQUFDQyxTQUFTLENBQUNFLGNBQWMsQ0FBQ2tDLElBQUksQ0FBQytSLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFDeEQsT0FBT0EsTUFBTSxDQUFDckYsT0FBTyxLQUFLLFVBQVUsRUFDcEM7SUFDQSxNQUFNLElBQUk3SyxLQUFLLENBQ2IsZ0ZBQ0YsQ0FBQztFQUNIO0VBRUEsT0FBTyxJQUFJO0FBQ2IsQ0FBQztBQUVNLElBQU0wZixlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQUl4VixRQUFrQixFQUFFZ0csTUFBYyxFQUFLO0VBQ3JFLElBQUksQ0FBQ3NQLFFBQVEsQ0FBQ3RQLE1BQU0sQ0FBQyxFQUFFO0lBQ3JCO0VBQ0Y7RUFFQSxJQUFJLENBQUNwVSxNQUFNLENBQUNDLFNBQVMsQ0FBQ0UsY0FBYyxDQUFDa0MsSUFBSSxDQUFDNkwsT0FBTyxFQUFFRSxRQUFRLENBQUMsRUFBRTtJQUM1RCxNQUFNLElBQUlsSyxLQUFLLGtCQUFBeEcsTUFBQSxDQUFrQjBRLFFBQVEscUNBQWtDLENBQUM7RUFDOUU7RUFFQSxJQUFJcE8sTUFBTSxDQUFDQyxTQUFTLENBQUNFLGNBQWMsQ0FBQ2tDLElBQUksQ0FBQzZMLE9BQU8sQ0FBQ0UsUUFBUSxDQUFDLEVBQUVnRyxNQUFNLENBQUN0UCxJQUFJLENBQUN4RSxHQUFHLENBQUMsRUFBRTtJQUM1RSxNQUFNLElBQUk0RCxLQUFLLGVBQUF4RyxNQUFBLENBQ0MwUSxRQUFRLHlDQUFBMVEsTUFBQSxDQUFzQzBXLE1BQU0sQ0FBQ3RQLElBQUksQ0FBQ3hFLEdBQUcsaUNBQzdFLENBQUM7RUFDSDtFQUVBNE4sT0FBTyxDQUFDRSxRQUFRLENBQUMsQ0FBQ0csV0FBVyxDQUFDNkYsTUFBTSxDQUFDdFAsSUFBSSxDQUFDeEUsR0FBRyxDQUFDLEdBQUc4VCxNQUFNO0FBQ3pELENBQUM7Ozs7Ozs7Ozs7O0FDbE5XOztBQUVaLGtCQUFrQjtBQUNsQixtQkFBbUI7QUFDbkIscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsU0FBUztBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDLFVBQVU7QUFDckQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVZOztBQUVaLGVBQWUsbUJBQU8sQ0FBQyxvREFBVztBQUNsQyxnQkFBZ0IsbUJBQU8sQ0FBQyxnREFBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjO0FBQ2Qsa0JBQWtCO0FBQ2xCLHlCQUF5Qjs7QUFFekI7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxpQkFBaUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsRUFBRTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixlQUFlO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0Esc0JBQXNCLGVBQWU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHNCQUFzQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUI7QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EscUJBQXFCLFdBQVcsR0FBRyxJQUFJO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsZ0JBQWdCLFdBQVcsR0FBRyxJQUFJLEtBQUssYUFBYTtBQUNwRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU07QUFDdEI7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLG1CQUFtQixLQUFLLG1EQUFtRCxjQUFjO0FBQ3pGLEdBQUc7QUFDSDtBQUNBO0FBQ0EsK0JBQStCLElBQUk7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixNQUFNLGFBQWEsU0FBUztBQUN0RDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGdCQUFnQjtBQUN6QixjQUFjLG9CQUFvQixFQUFFLElBQUk7QUFDeEM7QUFDQSxZQUFZLGdCQUFnQixFQUFFLElBQUk7QUFDbEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLEdBQUcsU0FBUyxHQUFHLEtBQUsscUJBQXFCLEVBQUUsRUFBRTtBQUNwRSxRQUFRO0FBQ1IseUJBQXlCLEdBQUcsS0FBSyx5QkFBeUIsRUFBRSxFQUFFO0FBQzlELG1CQUFtQix5QkFBeUIsRUFBRSxFQUFFO0FBQ2hEO0FBQ0EsTUFBTTtBQUNOLG9CQUFvQixJQUFJLEVBQUUsR0FBRyxTQUFTLElBQUksRUFBRSxFQUFFO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQyxjQUFjLFNBQVMsT0FBTztBQUN4RTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixZQUFZO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6akVhOztBQUViLG1CQUFtQixtQkFBTyxDQUFDLDREQUFlOztBQUUxQyxlQUFlLG1CQUFPLENBQUMsNkNBQUk7O0FBRTNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNkYTs7QUFFYixXQUFXLG1CQUFPLENBQUMsNERBQWU7QUFDbEMsbUJBQW1CLG1CQUFPLENBQUMsNERBQWU7QUFDMUMsd0JBQXdCLG1CQUFPLENBQUMsd0VBQXFCOztBQUVyRCxpQkFBaUIsbUJBQU8sQ0FBQyx3REFBZ0I7QUFDekM7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixtQkFBTyxDQUFDLHNFQUFvQjtBQUNsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QyxrQkFBa0I7QUFDOUQsRUFBRTtBQUNGLENBQUMsb0JBQW9CO0FBQ3JCOzs7Ozs7Ozs7Ozs7QUNsQ2E7O0FBRWIsc0JBQXNCLG1CQUFPLENBQUMsc0VBQW9COztBQUVsRCxtQkFBbUIsbUJBQU8sQ0FBQyw0REFBa0I7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMsd0RBQWdCOztBQUV6QyxXQUFXLG1CQUFPLENBQUMsMENBQU07O0FBRXpCLFdBQVcsYUFBYTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsMENBQTBDO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxHQUFHO0FBQ0g7QUFDQSx5QkFBeUI7QUFDekIsR0FBRztBQUNIO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2REEsYUFBYSxtQkFBTyxDQUFDLHlEQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RGYTs7QUFFYixtQkFBbUIsbUJBQU8sQ0FBQyw0REFBZTs7QUFFMUMsV0FBVyxhQUFhO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTLFVBQVU7QUFDdkMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUNmYTs7QUFFYixXQUFXLGtCQUFrQjtBQUM3Qjs7Ozs7Ozs7Ozs7O0FDSGE7O0FBRWIsV0FBVyxhQUFhO0FBQ3hCOzs7Ozs7Ozs7Ozs7QUNIYTs7QUFFYixXQUFXLG1CQUFtQjtBQUM5Qjs7Ozs7Ozs7Ozs7O0FDSGE7O0FBRWIsV0FBVyxpQkFBaUI7QUFDNUI7Ozs7Ozs7Ozs7OztBQ0hhOztBQUViLFdBQVcsb0JBQW9CO0FBQy9COzs7Ozs7Ozs7Ozs7QUNIYTs7QUFFYixXQUFXLGtCQUFrQjtBQUM3Qjs7Ozs7Ozs7Ozs7O0FDSGE7O0FBRWIsV0FBVyxpQkFBaUI7QUFDNUI7Ozs7Ozs7Ozs7OztBQ0hBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLHVGQUF3QjtBQUNyQztBQUNBLGNBQWMsbUJBQU8sQ0FBQyxnREFBUztBQUMvQixXQUFXLG1CQUFPLENBQUMsMENBQU07QUFDekIsYUFBYSxtQkFBTyxDQUFDLGtEQUFVO0FBQy9CLFVBQVUsbUJBQU8sQ0FBQyxzREFBWTtBQUM5QixZQUFZLG1CQUFPLENBQUMsMERBQWM7QUFDbEMsWUFBWSxtQkFBTyxDQUFDLDRDQUFPO0FBQzNCLGVBQWUsbUJBQU8sQ0FBQyxnRUFBaUI7QUFDeEMsa0JBQWtCLHFCQUFNLGlCQUFpQixPQUFPOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJO0FBQ0osSUFBSSxPQUFPO0FBQ1g7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUNBQWlDLGNBQWM7O0FBRS9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSw0RUFBd0I7QUFDdkM7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDLGdCQUFnQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3hGQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLGFBQWEsdUZBQXdCOzs7QUFHckM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSw4QkFBOEI7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTztBQUNYO0FBQ0EsS0FBSztBQUNMO0FB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O0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3hRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGVBQWU7QUFDakM7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU87QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLE9BQU8sb0JBQW9CLE9BQU87QUFDbEc7QUFDQSx3QkFBd0IsT0FBTyxpQkFBaUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixRQUFRLE9BQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU87QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU87QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU87QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJO0FBQ0osQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFPLENBQUMsOEVBQWtCOztBQUUvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLHNEQUFzRDtBQUM5SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTztBQUNYO0FBQ0E7QUFDQSxJQUFJLE9BQU87QUFDWDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sT0FBTztBQUNiLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxPQUFPO0FBQ2IsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU8sY0FBYztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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Q0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ3ZTQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLDhDQUFRO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUUsY0FBYztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNK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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyREFBMkQsbUVBQW1FO0FBQzlIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkRBQTJELG1FQUFtRTtBQUM5SDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsK0JBQStCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCx5REFBeUQseUhBQXlIO0FBQzFPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLCtCQUErQix5QkFBeUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsRUFBRTtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBLFlBQVksT0FBTztBQUNuQixZQUFZLFVBQVU7QUFDdEI7QUFDQSxjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksVUFBVTtBQUN0QjtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxNQUFNO0FBQ04sNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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RUFBRTtNQUMzQnRjLEtBQUksQ0FBQzJnQixRQUFRLENBQUN6ZixJQUFJLENBQUNsQixLQUFJLENBQUM4b0IsT0FBTyxDQUFDeE0sR0FBRyxDQUFDLENBQUM7SUFDdkM7RUFDRixDQUFDLENBQUM7QUFDSixDQUFDLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2Fqdi5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NhY2hlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9hc3luYy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvZXJyb3JfY2xhc3Nlcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvZm9ybWF0cy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL3Jlc29sdmUuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL3J1bGVzLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9zY2hlbWFfb2JqLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS91Y3MybGVuZ3RoLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS91dGlsLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZGF0YS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RlZmluaXRpb25fc2NoZW1hLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvX2xpbWl0LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvX2xpbWl0SXRlbXMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9fbGltaXRMZW5ndGguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9fbGltaXRQcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvYWxsT2YuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9hbnlPZi5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2NvbW1lbnQuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9jb25zdC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2NvbnRhaW5zLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvY3VzdG9tLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvZGVwZW5kZW5jaWVzLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvZW51bS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2Zvcm1hdC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2lmLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9pdGVtcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL211bHRpcGxlT2YuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9ub3QuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9vbmVPZi5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL3BhdHRlcm4uanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvcHJvcGVydHlOYW1lcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL3JlZi5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL3JlcXVpcmVkLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvdW5pcXVlSXRlbXMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9hanYvbGliL2tleXdvcmQuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaGVscGVycy9jb2RlLWJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaGVscGVycy9lc2NhcGUudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaGVscGVycy9mb3JtLWRhdGEudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaGVscGVycy9oYXItdmFsaWRhdG9yLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL2hlbHBlcnMvaGVhZGVycy50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy9oZWxwZXJzL3JlZHVjZXIudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvaGVscGVycy9zaGVsbC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy9oZWxwZXJzL3V0aWxzLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvYy9saWJjdXJsL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2MvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvY2xvanVyZS9jbGpfaHR0cC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9jbG9qdXJlL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2NyeXN0YWwvbmF0aXZlL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2NyeXN0YWwvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvY3NoYXJwL2h0dHBjbGllbnQvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvY3NoYXJwL3Jlc3RzaGFycC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9jc2hhcnAvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvZ28vbmF0aXZlL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2dvL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2h0dHAvaHR0cDEuMS9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9odHRwL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmEvYXN5bmNodHRwL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmEvbmV0aHR0cC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9qYXZhL29raHR0cC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9qYXZhL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmEvdW5pcmVzdC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9qYXZhc2NyaXB0L2F4aW9zL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2phdmFzY3JpcHQvZmV0Y2gvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvamF2YXNjcmlwdC9qcXVlcnkvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvamF2YXNjcmlwdC90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9qYXZhc2NyaXB0L3hoci9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9rb3RsaW4vb2todHRwL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL2tvdGxpbi90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9ub2RlL2F4aW9zL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL25vZGUvZmV0Y2gvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvbm9kZS9uYXRpdmUvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvbm9kZS9yZXF1ZXN0L2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL25vZGUvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvbm9kZS91bmlyZXN0L2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL29iamMvaGVscGVycy50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL29iamMvbnN1cmxzZXNzaW9uL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL29iamMvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvb2NhbWwvY29odHRwL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL29jYW1sL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3BocC9jdXJsL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3BocC9ndXp6bGUvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcGhwL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9waHAvaHR0cDEvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcGhwL2h0dHAyL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3BocC90YXJnZXQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9wb3dlcnNoZWxsL2NvbW1vbi50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3Bvd2Vyc2hlbGwvcmVzdG1ldGhvZC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9wb3dlcnNoZWxsL3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3Bvd2Vyc2hlbGwvd2VicmVxdWVzdC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9weXRob24vaGVscGVycy50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3B5dGhvbi9weXRob24zL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3B5dGhvbi9yZXF1ZXN0cy9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9weXRob24vdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvci9odHRyL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3IvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcnVieS9mYXJhZGF5L2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3J1YnkvbmF0aXZlL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3J1YnkvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcnVzdC9oZWxwZXJzLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvcnVzdC9yZXF3ZXN0L2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3J1c3QvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvc2hlbGwvY3VybC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9zaGVsbC9odHRwaWUvY2xpZW50LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvc2hlbGwvdGFyZ2V0LnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvc2hlbGwvd2dldC9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9zcmMvdGFyZ2V0cy9zd2lmdC9oZWxwZXJzLnRzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL3RhcmdldHMvc3dpZnQvbnN1cmxzZXNzaW9uL2NsaWVudC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3N3aWZ0L3RhcmdldC50cyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL3NyYy90YXJnZXRzL3RhcmdldHMudHMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvY2FsbEJvdW5kLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9kZWZpbmUtZGF0YS1wcm9wZXJ0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9kdXBsZXhlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9lcy1kZWZpbmUtcHJvcGVydHkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL2V2YWwuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yYW5nZS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvcmVmLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9zeW50YXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3R5cGUuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3VyaS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9ldmVudC1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9mYXN0LWRlZXAtZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZm9ybS1kYXRhL2xpYi9icm93c2VyLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2Zyb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvZ2V0LW93bi1lbnVtZXJhYmxlLXByb3BlcnR5LXN5bWJvbHMvbGliL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2dvcGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvaGFyLXNjaGVtYS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2hhcy1wcm90by9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9oYXNvd24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL2lzLW9iai9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9pcy1yZWdleHAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvanNvbi1zY2hlbWEtdHJhdmVyc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvbWFwLXN0cmVhbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9vYmplY3QtaW5zcGVjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9wYXVzZS1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hc3luY19pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYnVmZmVyX2xpc3QuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zZXQtZnVuY3Rpb24tbGVuZ3RoL2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zcGxpdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zdHJlYW0tY29tYmluZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy9zdHJpbmdpZnktb2JqZWN0L2luZGV4LmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3Rocm91Z2gvaW5kZXguanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvdXJpLWpzL2Rpc3QvZXM1L3VyaS5hbGwuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvLi9ub2RlX21vZHVsZXMvdXJsL25vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC8uL25vZGVfbW9kdWxlcy91cmwvdXJsLmpzIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vbm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9odHRwc25pcHBldC9odHRwc25pcHBldC9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3R8Li91dGlsLmluc3BlY3QiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9odHRwc25pcHBldC9odHRwc25pcHBldC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zfHV0aWwiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9odHRwc25pcHBldC9odHRwc25pcHBldC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYnx1dGlsIiwid2VicGFjazovL2h0dHBzbmlwcGV0L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2h0dHBzbmlwcGV0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2h0dHBzbmlwcGV0L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9odHRwc25pcHBldC93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2h0dHBzbmlwcGV0L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vaHR0cHNuaXBwZXQvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9odHRwc25pcHBldC93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL2h0dHBzbmlwcGV0Ly4vc3JjL2h0dHBzbmlwcGV0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbXBpbGVTY2hlbWEgPSByZXF1aXJlKCcuL2NvbXBpbGUnKVxuICAsIHJlc29sdmUgPSByZXF1aXJlKCcuL2NvbXBpbGUvcmVzb2x2ZScpXG4gICwgQ2FjaGUgPSByZXF1aXJlKCcuL2NhY2hlJylcbiAgLCBTY2hlbWFPYmplY3QgPSByZXF1aXJlKCcuL2NvbXBpbGUvc2NoZW1hX29iaicpXG4gICwgc3RhYmxlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnknKVxuICAsIGZvcm1hdHMgPSByZXF1aXJlKCcuL2NvbXBpbGUvZm9ybWF0cycpXG4gICwgcnVsZXMgPSByZXF1aXJlKCcuL2NvbXBpbGUvcnVsZXMnKVxuICAsICRkYXRhTWV0YVNjaGVtYSA9IHJlcXVpcmUoJy4vZGF0YScpXG4gICwgdXRpbCA9IHJlcXVpcmUoJy4vY29tcGlsZS91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQWp2O1xuXG5BanYucHJvdG90eXBlLnZhbGlkYXRlID0gdmFsaWRhdGU7XG5BanYucHJvdG90eXBlLmNvbXBpbGUgPSBjb21waWxlO1xuQWp2LnByb3RvdHlwZS5hZGRTY2hlbWEgPSBhZGRTY2hlbWE7XG5BanYucHJvdG90eXBlLmFkZE1ldGFTY2hlbWEgPSBhZGRNZXRhU2NoZW1hO1xuQWp2LnByb3RvdHlwZS52YWxpZGF0ZVNjaGVtYSA9IHZhbGlkYXRlU2NoZW1hO1xuQWp2LnByb3RvdHlwZS5nZXRTY2hlbWEgPSBnZXRTY2hlbWE7XG5BanYucHJvdG90eXBlLnJlbW92ZVNjaGVtYSA9IHJlbW92ZVNjaGVtYTtcbkFqdi5wcm90b3R5cGUuYWRkRm9ybWF0ID0gYWRkRm9ybWF0O1xuQWp2LnByb3RvdHlwZS5lcnJvcnNUZXh0ID0gZXJyb3JzVGV4dDtcblxuQWp2LnByb3RvdHlwZS5fYWRkU2NoZW1hID0gX2FkZFNjaGVtYTtcbkFqdi5wcm90b3R5cGUuX2NvbXBpbGUgPSBfY29tcGlsZTtcblxuQWp2LnByb3RvdHlwZS5jb21waWxlQXN5bmMgPSByZXF1aXJlKCcuL2NvbXBpbGUvYXN5bmMnKTtcbnZhciBjdXN0b21LZXl3b3JkID0gcmVxdWlyZSgnLi9rZXl3b3JkJyk7XG5BanYucHJvdG90eXBlLmFkZEtleXdvcmQgPSBjdXN0b21LZXl3b3JkLmFkZDtcbkFqdi5wcm90b3R5cGUuZ2V0S2V5d29yZCA9IGN1c3RvbUtleXdvcmQuZ2V0O1xuQWp2LnByb3RvdHlwZS5yZW1vdmVLZXl3b3JkID0gY3VzdG9tS2V5d29yZC5yZW1vdmU7XG5BanYucHJvdG90eXBlLnZhbGlkYXRlS2V5d29yZCA9IGN1c3RvbUtleXdvcmQudmFsaWRhdGU7XG5cbnZhciBlcnJvckNsYXNzZXMgPSByZXF1aXJlKCcuL2NvbXBpbGUvZXJyb3JfY2xhc3NlcycpO1xuQWp2LlZhbGlkYXRpb25FcnJvciA9IGVycm9yQ2xhc3Nlcy5WYWxpZGF0aW9uO1xuQWp2Lk1pc3NpbmdSZWZFcnJvciA9IGVycm9yQ2xhc3Nlcy5NaXNzaW5nUmVmO1xuQWp2LiRkYXRhTWV0YVNjaGVtYSA9ICRkYXRhTWV0YVNjaGVtYTtcblxudmFyIE1FVEFfU0NIRU1BX0lEID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hJztcblxudmFyIE1FVEFfSUdOT1JFX09QVElPTlMgPSBbICdyZW1vdmVBZGRpdGlvbmFsJywgJ3VzZURlZmF1bHRzJywgJ2NvZXJjZVR5cGVzJywgJ3N0cmljdERlZmF1bHRzJyBdO1xudmFyIE1FVEFfU1VQUE9SVF9EQVRBID0gWycvcHJvcGVydGllcyddO1xuXG4vKipcbiAqIENyZWF0ZXMgdmFsaWRhdG9yIGluc3RhbmNlLlxuICogVXNhZ2U6IGBBanYob3B0cylgXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBvcHRpb25hbCBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IGFqdiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBanYob3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQWp2KSkgcmV0dXJuIG5ldyBBanYob3B0cyk7XG4gIG9wdHMgPSB0aGlzLl9vcHRzID0gdXRpbC5jb3B5KG9wdHMpIHx8IHt9O1xuICBzZXRMb2dnZXIodGhpcyk7XG4gIHRoaXMuX3NjaGVtYXMgPSB7fTtcbiAgdGhpcy5fcmVmcyA9IHt9O1xuICB0aGlzLl9mcmFnbWVudHMgPSB7fTtcbiAgdGhpcy5fZm9ybWF0cyA9IGZvcm1hdHMob3B0cy5mb3JtYXQpO1xuXG4gIHRoaXMuX2NhY2hlID0gb3B0cy5jYWNoZSB8fCBuZXcgQ2FjaGU7XG4gIHRoaXMuX2xvYWRpbmdTY2hlbWFzID0ge307XG4gIHRoaXMuX2NvbXBpbGF0aW9ucyA9IFtdO1xuICB0aGlzLlJVTEVTID0gcnVsZXMoKTtcbiAgdGhpcy5fZ2V0SWQgPSBjaG9vc2VHZXRJZChvcHRzKTtcblxuICBvcHRzLmxvb3BSZXF1aXJlZCA9IG9wdHMubG9vcFJlcXVpcmVkIHx8IEluZmluaXR5O1xuICBpZiAob3B0cy5lcnJvckRhdGFQYXRoID09ICdwcm9wZXJ0eScpIG9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA9IHRydWU7XG4gIGlmIChvcHRzLnNlcmlhbGl6ZSA9PT0gdW5kZWZpbmVkKSBvcHRzLnNlcmlhbGl6ZSA9IHN0YWJsZVN0cmluZ2lmeTtcbiAgdGhpcy5fbWV0YU9wdHMgPSBnZXRNZXRhU2NoZW1hT3B0aW9ucyh0aGlzKTtcblxuICBpZiAob3B0cy5mb3JtYXRzKSBhZGRJbml0aWFsRm9ybWF0cyh0aGlzKTtcbiAgaWYgKG9wdHMua2V5d29yZHMpIGFkZEluaXRpYWxLZXl3b3Jkcyh0aGlzKTtcbiAgYWRkRGVmYXVsdE1ldGFTY2hlbWEodGhpcyk7XG4gIGlmICh0eXBlb2Ygb3B0cy5tZXRhID09ICdvYmplY3QnKSB0aGlzLmFkZE1ldGFTY2hlbWEob3B0cy5tZXRhKTtcbiAgaWYgKG9wdHMubnVsbGFibGUpIHRoaXMuYWRkS2V5d29yZCgnbnVsbGFibGUnLCB7bWV0YVNjaGVtYToge3R5cGU6ICdib29sZWFuJ319KTtcbiAgYWRkSW5pdGlhbFNjaGVtYXModGhpcyk7XG59XG5cblxuXG4vKipcbiAqIFZhbGlkYXRlIGRhdGEgdXNpbmcgc2NoZW1hXG4gKiBTY2hlbWEgd2lsbCBiZSBjb21waWxlZCBhbmQgY2FjaGVkICh1c2luZyBzZXJpYWxpemVkIEpTT04gYXMga2V5LiBbZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnldKGh0dHBzOi8vZ2l0aHViLmNvbS9lcG9iZXJlemtpbi9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSkgaXMgdXNlZCB0byBzZXJpYWxpemUuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7U3RyaW5nfE9iamVjdH0gc2NoZW1hS2V5UmVmIGtleSwgcmVmIG9yIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSAge0FueX0gZGF0YSB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHZhbGlkYXRpb24gcmVzdWx0LiBFcnJvcnMgZnJvbSB0aGUgbGFzdCB2YWxpZGF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGluIGBhanYuZXJyb3JzYCAoYW5kIGFsc28gaW4gY29tcGlsZWQgc2NoZW1hOiBgc2NoZW1hLmVycm9yc2ApLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZShzY2hlbWFLZXlSZWYsIGRhdGEpIHtcbiAgdmFyIHY7XG4gIGlmICh0eXBlb2Ygc2NoZW1hS2V5UmVmID09ICdzdHJpbmcnKSB7XG4gICAgdiA9IHRoaXMuZ2V0U2NoZW1hKHNjaGVtYUtleVJlZik7XG4gICAgaWYgKCF2KSB0aHJvdyBuZXcgRXJyb3IoJ25vIHNjaGVtYSB3aXRoIGtleSBvciByZWYgXCInICsgc2NoZW1hS2V5UmVmICsgJ1wiJyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVtYU9iaiA9IHRoaXMuX2FkZFNjaGVtYShzY2hlbWFLZXlSZWYpO1xuICAgIHYgPSBzY2hlbWFPYmoudmFsaWRhdGUgfHwgdGhpcy5fY29tcGlsZShzY2hlbWFPYmopO1xuICB9XG5cbiAgdmFyIHZhbGlkID0gdihkYXRhKTtcbiAgaWYgKHYuJGFzeW5jICE9PSB0cnVlKSB0aGlzLmVycm9ycyA9IHYuZXJyb3JzO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cblxuLyoqXG4gKiBDcmVhdGUgdmFsaWRhdGluZyBmdW5jdGlvbiBmb3IgcGFzc2VkIHNjaGVtYS5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBfbWV0YSB0cnVlIGlmIHNjaGVtYSBpcyBhIG1ldGEtc2NoZW1hLiBVc2VkIGludGVybmFsbHkgdG8gY29tcGlsZSBtZXRhIHNjaGVtYXMgb2YgY3VzdG9tIGtleXdvcmRzLlxuICogQHJldHVybiB7RnVuY3Rpb259IHZhbGlkYXRpbmcgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZShzY2hlbWEsIF9tZXRhKSB7XG4gIHZhciBzY2hlbWFPYmogPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCB1bmRlZmluZWQsIF9tZXRhKTtcbiAgcmV0dXJuIHNjaGVtYU9iai52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlKHNjaGVtYU9iaik7XG59XG5cblxuLyoqXG4gKiBBZGRzIHNjaGVtYSB0byB0aGUgaW5zdGFuY2UuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IHNjaGVtYSBzY2hlbWEgb3IgYXJyYXkgb2Ygc2NoZW1hcy4gSWYgYXJyYXkgaXMgcGFzc2VkLCBga2V5YCBhbmQgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IE9wdGlvbmFsIHNjaGVtYSBrZXkuIENhbiBiZSBwYXNzZWQgdG8gYHZhbGlkYXRlYCBtZXRob2QgaW5zdGVhZCBvZiBzY2hlbWEgb2JqZWN0IG9yIGlkL3JlZi4gT25lIHNjaGVtYSBwZXIgaW5zdGFuY2UgY2FuIGhhdmUgZW1wdHkgYGlkYCBhbmQgYGtleWAuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9za2lwVmFsaWRhdGlvbiB0cnVlIHRvIHNraXAgc2NoZW1hIHZhbGlkYXRpb24uIFVzZWQgaW50ZXJuYWxseSwgb3B0aW9uIHZhbGlkYXRlU2NoZW1hIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9tZXRhIHRydWUgaWYgc2NoZW1hIGlzIGEgbWV0YS1zY2hlbWEuIFVzZWQgaW50ZXJuYWxseSwgYWRkTWV0YVNjaGVtYSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gYWRkU2NoZW1hKHNjaGVtYSwga2V5LCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpe1xuICAgIGZvciAodmFyIGk9MDsgaTxzY2hlbWEubGVuZ3RoOyBpKyspIHRoaXMuYWRkU2NoZW1hKHNjaGVtYVtpXSwgdW5kZWZpbmVkLCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWEpO1xuICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaWQgIT0gJ3N0cmluZycpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2hlbWEgaWQgbXVzdCBiZSBzdHJpbmcnKTtcbiAga2V5ID0gcmVzb2x2ZS5ub3JtYWxpemVJZChrZXkgfHwgaWQpO1xuICBjaGVja1VuaXF1ZSh0aGlzLCBrZXkpO1xuICB0aGlzLl9zY2hlbWFzW2tleV0gPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhLCB0cnVlKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBBZGQgc2NoZW1hIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIG90aGVyIHNjaGVtYXNcbiAqIG9wdGlvbnMgaW4gTUVUQV9JR05PUkVfT1BUSU9OUyBhcmUgYWx3YXkgc2V0IHRvIGZhbHNlXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IG9wdGlvbmFsIHNjaGVtYSBrZXlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2tpcFZhbGlkYXRpb24gdHJ1ZSB0byBza2lwIHNjaGVtYSB2YWxpZGF0aW9uLCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB2YWxpZGF0ZVNjaGVtYSBvcHRpb24gZm9yIG1ldGEtc2NoZW1hXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiBhZGRNZXRhU2NoZW1hKHNjaGVtYSwga2V5LCBza2lwVmFsaWRhdGlvbikge1xuICB0aGlzLmFkZFNjaGVtYShzY2hlbWEsIGtleSwgc2tpcFZhbGlkYXRpb24sIHRydWUpO1xuICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFZhbGlkYXRlIHNjaGVtYVxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T3JMb2dFcnJvciBwYXNzIHRydWUgdG8gdGhyb3cgKG9yIGxvZykgYW4gZXJyb3IgaWYgaW52YWxpZFxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBzY2hlbWEgaXMgdmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0aHJvd09yTG9nRXJyb3IpIHtcbiAgdmFyICRzY2hlbWEgPSBzY2hlbWEuJHNjaGVtYTtcbiAgaWYgKCRzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgJHNjaGVtYSAhPSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJyRzY2hlbWEgbXVzdCBiZSBhIHN0cmluZycpO1xuICAkc2NoZW1hID0gJHNjaGVtYSB8fCB0aGlzLl9vcHRzLmRlZmF1bHRNZXRhIHx8IGRlZmF1bHRNZXRhKHRoaXMpO1xuICBpZiAoISRzY2hlbWEpIHtcbiAgICB0aGlzLmxvZ2dlci53YXJuKCdtZXRhLXNjaGVtYSBub3QgYXZhaWxhYmxlJyk7XG4gICAgdGhpcy5lcnJvcnMgPSBudWxsO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciB2YWxpZCA9IHRoaXMudmFsaWRhdGUoJHNjaGVtYSwgc2NoZW1hKTtcbiAgaWYgKCF2YWxpZCAmJiB0aHJvd09yTG9nRXJyb3IpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdzY2hlbWEgaXMgaW52YWxpZDogJyArIHRoaXMuZXJyb3JzVGV4dCgpO1xuICAgIGlmICh0aGlzLl9vcHRzLnZhbGlkYXRlU2NoZW1hID09ICdsb2cnKSB0aGlzLmxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICBlbHNlIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cblxuZnVuY3Rpb24gZGVmYXVsdE1ldGEoc2VsZikge1xuICB2YXIgbWV0YSA9IHNlbGYuX29wdHMubWV0YTtcbiAgc2VsZi5fb3B0cy5kZWZhdWx0TWV0YSA9IHR5cGVvZiBtZXRhID09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWxmLl9nZXRJZChtZXRhKSB8fCBtZXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZWxmLmdldFNjaGVtYShNRVRBX1NDSEVNQV9JRClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTUVUQV9TQ0hFTUFfSURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gc2VsZi5fb3B0cy5kZWZhdWx0TWV0YTtcbn1cblxuXG4vKipcbiAqIEdldCBjb21waWxlZCBzY2hlbWEgZnJvbSB0aGUgaW5zdGFuY2UgYnkgYGtleWAgb3IgYHJlZmAuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7U3RyaW5nfSBrZXlSZWYgYGtleWAgdGhhdCB3YXMgcGFzc2VkIHRvIGBhZGRTY2hlbWFgIG9yIGZ1bGwgc2NoZW1hIHJlZmVyZW5jZSAoYHNjaGVtYS5pZGAgb3IgcmVzb2x2ZWQgaWQpLlxuICogQHJldHVybiB7RnVuY3Rpb259IHNjaGVtYSB2YWxpZGF0aW5nIGZ1bmN0aW9uICh3aXRoIHByb3BlcnR5IGBzY2hlbWFgKS5cbiAqL1xuZnVuY3Rpb24gZ2V0U2NoZW1hKGtleVJlZikge1xuICB2YXIgc2NoZW1hT2JqID0gX2dldFNjaGVtYU9iaih0aGlzLCBrZXlSZWYpO1xuICBzd2l0Y2ggKHR5cGVvZiBzY2hlbWFPYmopIHtcbiAgICBjYXNlICdvYmplY3QnOiByZXR1cm4gc2NoZW1hT2JqLnZhbGlkYXRlIHx8IHRoaXMuX2NvbXBpbGUoc2NoZW1hT2JqKTtcbiAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gdGhpcy5nZXRTY2hlbWEoc2NoZW1hT2JqKTtcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gX2dldFNjaGVtYUZyYWdtZW50KHRoaXMsIGtleVJlZik7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2NoZW1hRnJhZ21lbnQoc2VsZiwgcmVmKSB7XG4gIHZhciByZXMgPSByZXNvbHZlLnNjaGVtYS5jYWxsKHNlbGYsIHsgc2NoZW1hOiB7fSB9LCByZWYpO1xuICBpZiAocmVzKSB7XG4gICAgdmFyIHNjaGVtYSA9IHJlcy5zY2hlbWFcbiAgICAgICwgcm9vdCA9IHJlcy5yb290XG4gICAgICAsIGJhc2VJZCA9IHJlcy5iYXNlSWQ7XG4gICAgdmFyIHYgPSBjb21waWxlU2NoZW1hLmNhbGwoc2VsZiwgc2NoZW1hLCByb290LCB1bmRlZmluZWQsIGJhc2VJZCk7XG4gICAgc2VsZi5fZnJhZ21lbnRzW3JlZl0gPSBuZXcgU2NoZW1hT2JqZWN0KHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgZnJhZ21lbnQ6IHRydWUsXG4gICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICBiYXNlSWQ6IGJhc2VJZCxcbiAgICAgIHZhbGlkYXRlOiB2XG4gICAgfSk7XG4gICAgcmV0dXJuIHY7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2NoZW1hT2JqKHNlbGYsIGtleVJlZikge1xuICBrZXlSZWYgPSByZXNvbHZlLm5vcm1hbGl6ZUlkKGtleVJlZik7XG4gIHJldHVybiBzZWxmLl9zY2hlbWFzW2tleVJlZl0gfHwgc2VsZi5fcmVmc1trZXlSZWZdIHx8IHNlbGYuX2ZyYWdtZW50c1trZXlSZWZdO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlIGNhY2hlZCBzY2hlbWEocykuXG4gKiBJZiBubyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIGJ1dCBtZXRhLXNjaGVtYXMgYXJlIHJlbW92ZWQuXG4gKiBJZiBSZWdFeHAgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIHdpdGgga2V5L2lkIG1hdGNoaW5nIHBhdHRlcm4gYnV0IG1ldGEtc2NoZW1hcyBhcmUgcmVtb3ZlZC5cbiAqIEV2ZW4gaWYgc2NoZW1hIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgc2NoZW1hcyBpdCBzdGlsbCBjYW4gYmUgcmVtb3ZlZCBhcyBvdGhlciBzY2hlbWFzIGhhdmUgbG9jYWwgcmVmZXJlbmNlcy5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtTdHJpbmd8T2JqZWN0fFJlZ0V4cH0gc2NoZW1hS2V5UmVmIGtleSwgcmVmLCBwYXR0ZXJuIHRvIG1hdGNoIGtleS9yZWYgb3Igc2NoZW1hIG9iamVjdFxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU2NoZW1hKHNjaGVtYUtleVJlZikge1xuICBpZiAoc2NoZW1hS2V5UmVmIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgX3JlbW92ZUFsbFNjaGVtYXModGhpcywgdGhpcy5fc2NoZW1hcywgc2NoZW1hS2V5UmVmKTtcbiAgICBfcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLCB0aGlzLl9yZWZzLCBzY2hlbWFLZXlSZWYpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHN3aXRjaCAodHlwZW9mIHNjaGVtYUtleVJlZikge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBfcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLCB0aGlzLl9zY2hlbWFzKTtcbiAgICAgIF9yZW1vdmVBbGxTY2hlbWFzKHRoaXMsIHRoaXMuX3JlZnMpO1xuICAgICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICB2YXIgc2NoZW1hT2JqID0gX2dldFNjaGVtYU9iaih0aGlzLCBzY2hlbWFLZXlSZWYpO1xuICAgICAgaWYgKHNjaGVtYU9iaikgdGhpcy5fY2FjaGUuZGVsKHNjaGVtYU9iai5jYWNoZUtleSk7XG4gICAgICBkZWxldGUgdGhpcy5fc2NoZW1hc1tzY2hlbWFLZXlSZWZdO1xuICAgICAgZGVsZXRlIHRoaXMuX3JlZnNbc2NoZW1hS2V5UmVmXTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgc2VyaWFsaXplID0gdGhpcy5fb3B0cy5zZXJpYWxpemU7XG4gICAgICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemUgPyBzZXJpYWxpemUoc2NoZW1hS2V5UmVmKSA6IHNjaGVtYUtleVJlZjtcbiAgICAgIHRoaXMuX2NhY2hlLmRlbChjYWNoZUtleSk7XG4gICAgICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWFLZXlSZWYpO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGlkID0gcmVzb2x2ZS5ub3JtYWxpemVJZChpZCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zY2hlbWFzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3JlZnNbaWRdO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW1vdmVBbGxTY2hlbWFzKHNlbGYsIHNjaGVtYXMsIHJlZ2V4KSB7XG4gIGZvciAodmFyIGtleVJlZiBpbiBzY2hlbWFzKSB7XG4gICAgdmFyIHNjaGVtYU9iaiA9IHNjaGVtYXNba2V5UmVmXTtcbiAgICBpZiAoIXNjaGVtYU9iai5tZXRhICYmICghcmVnZXggfHwgcmVnZXgudGVzdChrZXlSZWYpKSkge1xuICAgICAgc2VsZi5fY2FjaGUuZGVsKHNjaGVtYU9iai5jYWNoZUtleSk7XG4gICAgICBkZWxldGUgc2NoZW1hc1trZXlSZWZdO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qIEB0aGlzICAgQWp2ICovXG5mdW5jdGlvbiBfYWRkU2NoZW1hKHNjaGVtYSwgc2tpcFZhbGlkYXRpb24sIG1ldGEsIHNob3VsZEFkZFNjaGVtYSkge1xuICBpZiAodHlwZW9mIHNjaGVtYSAhPSAnb2JqZWN0JyAmJiB0eXBlb2Ygc2NoZW1hICE9ICdib29sZWFuJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjaGVtYSBzaG91bGQgYmUgb2JqZWN0IG9yIGJvb2xlYW4nKTtcbiAgdmFyIHNlcmlhbGl6ZSA9IHRoaXMuX29wdHMuc2VyaWFsaXplO1xuICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemUgPyBzZXJpYWxpemUoc2NoZW1hKSA6IHNjaGVtYTtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX2NhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgc2hvdWxkQWRkU2NoZW1hID0gc2hvdWxkQWRkU2NoZW1hIHx8IHRoaXMuX29wdHMuYWRkVXNlZFNjaGVtYSAhPT0gZmFsc2U7XG5cbiAgdmFyIGlkID0gcmVzb2x2ZS5ub3JtYWxpemVJZCh0aGlzLl9nZXRJZChzY2hlbWEpKTtcbiAgaWYgKGlkICYmIHNob3VsZEFkZFNjaGVtYSkgY2hlY2tVbmlxdWUodGhpcywgaWQpO1xuXG4gIHZhciB3aWxsVmFsaWRhdGUgPSB0aGlzLl9vcHRzLnZhbGlkYXRlU2NoZW1hICE9PSBmYWxzZSAmJiAhc2tpcFZhbGlkYXRpb247XG4gIHZhciByZWN1cnNpdmVNZXRhO1xuICBpZiAod2lsbFZhbGlkYXRlICYmICEocmVjdXJzaXZlTWV0YSA9IGlkICYmIGlkID09IHJlc29sdmUubm9ybWFsaXplSWQoc2NoZW1hLiRzY2hlbWEpKSlcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG5cbiAgdmFyIGxvY2FsUmVmcyA9IHJlc29sdmUuaWRzLmNhbGwodGhpcywgc2NoZW1hKTtcblxuICB2YXIgc2NoZW1hT2JqID0gbmV3IFNjaGVtYU9iamVjdCh7XG4gICAgaWQ6IGlkLFxuICAgIHNjaGVtYTogc2NoZW1hLFxuICAgIGxvY2FsUmVmczogbG9jYWxSZWZzLFxuICAgIGNhY2hlS2V5OiBjYWNoZUtleSxcbiAgICBtZXRhOiBtZXRhXG4gIH0pO1xuXG4gIGlmIChpZFswXSAhPSAnIycgJiYgc2hvdWxkQWRkU2NoZW1hKSB0aGlzLl9yZWZzW2lkXSA9IHNjaGVtYU9iajtcbiAgdGhpcy5fY2FjaGUucHV0KGNhY2hlS2V5LCBzY2hlbWFPYmopO1xuXG4gIGlmICh3aWxsVmFsaWRhdGUgJiYgcmVjdXJzaXZlTWV0YSkgdGhpcy52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuXG4gIHJldHVybiBzY2hlbWFPYmo7XG59XG5cblxuLyogQHRoaXMgICBBanYgKi9cbmZ1bmN0aW9uIF9jb21waWxlKHNjaGVtYU9iaiwgcm9vdCkge1xuICBpZiAoc2NoZW1hT2JqLmNvbXBpbGluZykge1xuICAgIHNjaGVtYU9iai52YWxpZGF0ZSA9IGNhbGxWYWxpZGF0ZTtcbiAgICBjYWxsVmFsaWRhdGUuc2NoZW1hID0gc2NoZW1hT2JqLnNjaGVtYTtcbiAgICBjYWxsVmFsaWRhdGUuZXJyb3JzID0gbnVsbDtcbiAgICBjYWxsVmFsaWRhdGUucm9vdCA9IHJvb3QgPyByb290IDogY2FsbFZhbGlkYXRlO1xuICAgIGlmIChzY2hlbWFPYmouc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZSlcbiAgICAgIGNhbGxWYWxpZGF0ZS4kYXN5bmMgPSB0cnVlO1xuICAgIHJldHVybiBjYWxsVmFsaWRhdGU7XG4gIH1cbiAgc2NoZW1hT2JqLmNvbXBpbGluZyA9IHRydWU7XG5cbiAgdmFyIGN1cnJlbnRPcHRzO1xuICBpZiAoc2NoZW1hT2JqLm1ldGEpIHtcbiAgICBjdXJyZW50T3B0cyA9IHRoaXMuX29wdHM7XG4gICAgdGhpcy5fb3B0cyA9IHRoaXMuX21ldGFPcHRzO1xuICB9XG5cbiAgdmFyIHY7XG4gIHRyeSB7IHYgPSBjb21waWxlU2NoZW1hLmNhbGwodGhpcywgc2NoZW1hT2JqLnNjaGVtYSwgcm9vdCwgc2NoZW1hT2JqLmxvY2FsUmVmcyk7IH1cbiAgY2F0Y2goZSkge1xuICAgIGRlbGV0ZSBzY2hlbWFPYmoudmFsaWRhdGU7XG4gICAgdGhyb3cgZTtcbiAgfVxuICBmaW5hbGx5IHtcbiAgICBzY2hlbWFPYmouY29tcGlsaW5nID0gZmFsc2U7XG4gICAgaWYgKHNjaGVtYU9iai5tZXRhKSB0aGlzLl9vcHRzID0gY3VycmVudE9wdHM7XG4gIH1cblxuICBzY2hlbWFPYmoudmFsaWRhdGUgPSB2O1xuICBzY2hlbWFPYmoucmVmcyA9IHYucmVmcztcbiAgc2NoZW1hT2JqLnJlZlZhbCA9IHYucmVmVmFsO1xuICBzY2hlbWFPYmoucm9vdCA9IHYucm9vdDtcbiAgcmV0dXJuIHY7XG5cblxuICAvKiBAdGhpcyAgIHsqfSAtIGN1c3RvbSBjb250ZXh0LCBzZWUgcGFzc0NvbnRleHQgb3B0aW9uICovXG4gIGZ1bmN0aW9uIGNhbGxWYWxpZGF0ZSgpIHtcbiAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gICAgdmFyIF92YWxpZGF0ZSA9IHNjaGVtYU9iai52YWxpZGF0ZTtcbiAgICB2YXIgcmVzdWx0ID0gX3ZhbGlkYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgY2FsbFZhbGlkYXRlLmVycm9ycyA9IF92YWxpZGF0ZS5lcnJvcnM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNob29zZUdldElkKG9wdHMpIHtcbiAgc3dpdGNoIChvcHRzLnNjaGVtYUlkKSB7XG4gICAgY2FzZSAnYXV0byc6IHJldHVybiBfZ2V0JElkT3JJZDtcbiAgICBjYXNlICdpZCc6IHJldHVybiBfZ2V0SWQ7XG4gICAgZGVmYXVsdDogcmV0dXJuIF9nZXQkSWQ7XG4gIH1cbn1cblxuLyogQHRoaXMgICBBanYgKi9cbmZ1bmN0aW9uIF9nZXRJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS4kaWQpIHRoaXMubG9nZ2VyLndhcm4oJ3NjaGVtYSAkaWQgaWdub3JlZCcsIHNjaGVtYS4kaWQpO1xuICByZXR1cm4gc2NoZW1hLmlkO1xufVxuXG4vKiBAdGhpcyAgIEFqdiAqL1xuZnVuY3Rpb24gX2dldCRJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS5pZCkgdGhpcy5sb2dnZXIud2Fybignc2NoZW1hIGlkIGlnbm9yZWQnLCBzY2hlbWEuaWQpO1xuICByZXR1cm4gc2NoZW1hLiRpZDtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0JElkT3JJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS4kaWQgJiYgc2NoZW1hLmlkICYmIHNjaGVtYS4kaWQgIT0gc2NoZW1hLmlkKVxuICAgIHRocm93IG5ldyBFcnJvcignc2NoZW1hICRpZCBpcyBkaWZmZXJlbnQgZnJvbSBpZCcpO1xuICByZXR1cm4gc2NoZW1hLiRpZCB8fCBzY2hlbWEuaWQ7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIGVycm9yIG1lc3NhZ2Ugb2JqZWN0cyB0byBzdHJpbmdcbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtBcnJheTxPYmplY3Q+fSBlcnJvcnMgb3B0aW9uYWwgYXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvcnMsIGlmIG5vdCBwYXNzZWQgZXJyb3JzIGZyb20gdGhlIGluc3RhbmNlIGFyZSB1c2VkLlxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIG9wdGlvbmFsIG9wdGlvbnMgd2l0aCBwcm9wZXJ0aWVzIGBzZXBhcmF0b3JgIGFuZCBgZGF0YVZhcmAuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGh1bWFuIHJlYWRhYmxlIHN0cmluZyB3aXRoIGFsbCBlcnJvcnMgZGVzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGVycm9yc1RleHQoZXJyb3JzLCBvcHRpb25zKSB7XG4gIGVycm9ycyA9IGVycm9ycyB8fCB0aGlzLmVycm9ycztcbiAgaWYgKCFlcnJvcnMpIHJldHVybiAnTm8gZXJyb3JzJztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBzZXBhcmF0b3IgPSBvcHRpb25zLnNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJywgJyA6IG9wdGlvbnMuc2VwYXJhdG9yO1xuICB2YXIgZGF0YVZhciA9IG9wdGlvbnMuZGF0YVZhciA9PT0gdW5kZWZpbmVkID8gJ2RhdGEnIDogb3B0aW9ucy5kYXRhVmFyO1xuXG4gIHZhciB0ZXh0ID0gJyc7XG4gIGZvciAodmFyIGk9MDsgaTxlcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZSA9IGVycm9yc1tpXTtcbiAgICBpZiAoZSkgdGV4dCArPSBkYXRhVmFyICsgZS5kYXRhUGF0aCArICcgJyArIGUubWVzc2FnZSArIHNlcGFyYXRvcjtcbiAgfVxuICByZXR1cm4gdGV4dC5zbGljZSgwLCAtc2VwYXJhdG9yLmxlbmd0aCk7XG59XG5cblxuLyoqXG4gKiBBZGQgY3VzdG9tIGZvcm1hdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGZvcm1hdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB8RnVuY3Rpb259IGZvcm1hdCBzdHJpbmcgaXMgY29udmVydGVkIHRvIFJlZ0V4cDsgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBib29sZWFuICh0cnVlIHdoZW4gdmFsaWQpXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiBhZGRGb3JtYXQobmFtZSwgZm9ybWF0KSB7XG4gIGlmICh0eXBlb2YgZm9ybWF0ID09ICdzdHJpbmcnKSBmb3JtYXQgPSBuZXcgUmVnRXhwKGZvcm1hdCk7XG4gIHRoaXMuX2Zvcm1hdHNbbmFtZV0gPSBmb3JtYXQ7XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIGFkZERlZmF1bHRNZXRhU2NoZW1hKHNlbGYpIHtcbiAgdmFyICRkYXRhU2NoZW1hO1xuICBpZiAoc2VsZi5fb3B0cy4kZGF0YSkge1xuICAgICRkYXRhU2NoZW1hID0gcmVxdWlyZSgnLi9yZWZzL2RhdGEuanNvbicpO1xuICAgIHNlbGYuYWRkTWV0YVNjaGVtYSgkZGF0YVNjaGVtYSwgJGRhdGFTY2hlbWEuJGlkLCB0cnVlKTtcbiAgfVxuICBpZiAoc2VsZi5fb3B0cy5tZXRhID09PSBmYWxzZSkgcmV0dXJuO1xuICB2YXIgbWV0YVNjaGVtYSA9IHJlcXVpcmUoJy4vcmVmcy9qc29uLXNjaGVtYS1kcmFmdC0wNy5qc29uJyk7XG4gIGlmIChzZWxmLl9vcHRzLiRkYXRhKSBtZXRhU2NoZW1hID0gJGRhdGFNZXRhU2NoZW1hKG1ldGFTY2hlbWEsIE1FVEFfU1VQUE9SVF9EQVRBKTtcbiAgc2VsZi5hZGRNZXRhU2NoZW1hKG1ldGFTY2hlbWEsIE1FVEFfU0NIRU1BX0lELCB0cnVlKTtcbiAgc2VsZi5fcmVmc1snaHR0cDovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWEnXSA9IE1FVEFfU0NIRU1BX0lEO1xufVxuXG5cbmZ1bmN0aW9uIGFkZEluaXRpYWxTY2hlbWFzKHNlbGYpIHtcbiAgdmFyIG9wdHNTY2hlbWFzID0gc2VsZi5fb3B0cy5zY2hlbWFzO1xuICBpZiAoIW9wdHNTY2hlbWFzKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdHNTY2hlbWFzKSkgc2VsZi5hZGRTY2hlbWEob3B0c1NjaGVtYXMpO1xuICBlbHNlIGZvciAodmFyIGtleSBpbiBvcHRzU2NoZW1hcykgc2VsZi5hZGRTY2hlbWEob3B0c1NjaGVtYXNba2V5XSwga2V5KTtcbn1cblxuXG5mdW5jdGlvbiBhZGRJbml0aWFsRm9ybWF0cyhzZWxmKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gc2VsZi5fb3B0cy5mb3JtYXRzKSB7XG4gICAgdmFyIGZvcm1hdCA9IHNlbGYuX29wdHMuZm9ybWF0c1tuYW1lXTtcbiAgICBzZWxmLmFkZEZvcm1hdChuYW1lLCBmb3JtYXQpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gYWRkSW5pdGlhbEtleXdvcmRzKHNlbGYpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiBzZWxmLl9vcHRzLmtleXdvcmRzKSB7XG4gICAgdmFyIGtleXdvcmQgPSBzZWxmLl9vcHRzLmtleXdvcmRzW25hbWVdO1xuICAgIHNlbGYuYWRkS2V5d29yZChuYW1lLCBrZXl3b3JkKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNoZWNrVW5pcXVlKHNlbGYsIGlkKSB7XG4gIGlmIChzZWxmLl9zY2hlbWFzW2lkXSB8fCBzZWxmLl9yZWZzW2lkXSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjaGVtYSB3aXRoIGtleSBvciBpZCBcIicgKyBpZCArICdcIiBhbHJlYWR5IGV4aXN0cycpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1ldGFTY2hlbWFPcHRpb25zKHNlbGYpIHtcbiAgdmFyIG1ldGFPcHRzID0gdXRpbC5jb3B5KHNlbGYuX29wdHMpO1xuICBmb3IgKHZhciBpPTA7IGk8TUVUQV9JR05PUkVfT1BUSU9OUy5sZW5ndGg7IGkrKylcbiAgICBkZWxldGUgbWV0YU9wdHNbTUVUQV9JR05PUkVfT1BUSU9OU1tpXV07XG4gIHJldHVybiBtZXRhT3B0cztcbn1cblxuXG5mdW5jdGlvbiBzZXRMb2dnZXIoc2VsZikge1xuICB2YXIgbG9nZ2VyID0gc2VsZi5fb3B0cy5sb2dnZXI7XG4gIGlmIChsb2dnZXIgPT09IGZhbHNlKSB7XG4gICAgc2VsZi5sb2dnZXIgPSB7bG9nOiBub29wLCB3YXJuOiBub29wLCBlcnJvcjogbm9vcH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSBsb2dnZXIgPSBjb25zb2xlO1xuICAgIGlmICghKHR5cGVvZiBsb2dnZXIgPT0gJ29iamVjdCcgJiYgbG9nZ2VyLmxvZyAmJiBsb2dnZXIud2FybiAmJiBsb2dnZXIuZXJyb3IpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2dnZXIgbXVzdCBpbXBsZW1lbnQgbG9nLCB3YXJuIGFuZCBlcnJvciBtZXRob2RzJyk7XG4gICAgc2VsZi5sb2dnZXIgPSBsb2dnZXI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBub29wKCkge31cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgQ2FjaGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIENhY2hlKCkge1xuICB0aGlzLl9jYWNoZSA9IHt9O1xufTtcblxuXG5DYWNoZS5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gQ2FjaGVfcHV0KGtleSwgdmFsdWUpIHtcbiAgdGhpcy5fY2FjaGVba2V5XSA9IHZhbHVlO1xufTtcblxuXG5DYWNoZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gQ2FjaGVfZ2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fY2FjaGVba2V5XTtcbn07XG5cblxuQ2FjaGUucHJvdG90eXBlLmRlbCA9IGZ1bmN0aW9uIENhY2hlX2RlbChrZXkpIHtcbiAgZGVsZXRlIHRoaXMuX2NhY2hlW2tleV07XG59O1xuXG5cbkNhY2hlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIENhY2hlX2NsZWFyKCkge1xuICB0aGlzLl9jYWNoZSA9IHt9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1pc3NpbmdSZWZFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3JfY2xhc3NlcycpLk1pc3NpbmdSZWY7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZUFzeW5jO1xuXG5cbi8qKlxuICogQ3JlYXRlcyB2YWxpZGF0aW5nIGZ1bmN0aW9uIGZvciBwYXNzZWQgc2NoZW1hIHdpdGggYXN5bmNocm9ub3VzIGxvYWRpbmcgb2YgbWlzc2luZyBzY2hlbWFzLlxuICogYGxvYWRTY2hlbWFgIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgc2NoZW1hIHVyaSBhbmQgcmV0dXJucyBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2NoZW1hLlxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtPYmplY3R9ICAgc2NoZW1hIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gIG1ldGEgb3B0aW9uYWwgdHJ1ZSB0byBjb21waWxlIG1ldGEtc2NoZW1hOyB0aGlzIHBhcmFtZXRlciBjYW4gYmUgc2tpcHBlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYW4gb3B0aW9uYWwgbm9kZS1zdHlsZSBjYWxsYmFjaywgaXQgaXMgY2FsbGVkIHdpdGggMiBwYXJhbWV0ZXJzOiBlcnJvciAob3IgbnVsbCkgYW5kIHZhbGlkYXRpbmcgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHZhbGlkYXRpbmcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVBc3luYyhzY2hlbWEsIG1ldGEsIGNhbGxiYWNrKSB7XG4gIC8qIGVzbGludCBuby1zaGFkb3c6IDAgKi9cbiAgLyogZ2xvYmFsIFByb21pc2UgKi9cbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICh0eXBlb2YgdGhpcy5fb3B0cy5sb2FkU2NoZW1hICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLmxvYWRTY2hlbWEgc2hvdWxkIGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAodHlwZW9mIG1ldGEgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gbWV0YTtcbiAgICBtZXRhID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIHAgPSBsb2FkTWV0YVNjaGVtYU9mKHNjaGVtYSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNjaGVtYU9iaiA9IHNlbGYuX2FkZFNjaGVtYShzY2hlbWEsIHVuZGVmaW5lZCwgbWV0YSk7XG4gICAgcmV0dXJuIHNjaGVtYU9iai52YWxpZGF0ZSB8fCBfY29tcGlsZUFzeW5jKHNjaGVtYU9iaik7XG4gIH0pO1xuXG4gIGlmIChjYWxsYmFjaykge1xuICAgIHAudGhlbihcbiAgICAgIGZ1bmN0aW9uKHYpIHsgY2FsbGJhY2sobnVsbCwgdik7IH0sXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gcDtcblxuXG4gIGZ1bmN0aW9uIGxvYWRNZXRhU2NoZW1hT2Yoc2NoKSB7XG4gICAgdmFyICRzY2hlbWEgPSBzY2guJHNjaGVtYTtcbiAgICByZXR1cm4gJHNjaGVtYSAmJiAhc2VsZi5nZXRTY2hlbWEoJHNjaGVtYSlcbiAgICAgICAgICAgID8gY29tcGlsZUFzeW5jLmNhbGwoc2VsZiwgeyAkcmVmOiAkc2NoZW1hIH0sIHRydWUpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cblxuICBmdW5jdGlvbiBfY29tcGlsZUFzeW5jKHNjaGVtYU9iaikge1xuICAgIHRyeSB7IHJldHVybiBzZWxmLl9jb21waWxlKHNjaGVtYU9iaik7IH1cbiAgICBjYXRjaChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE1pc3NpbmdSZWZFcnJvcikgcmV0dXJuIGxvYWRNaXNzaW5nU2NoZW1hKGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGxvYWRNaXNzaW5nU2NoZW1hKGUpIHtcbiAgICAgIHZhciByZWYgPSBlLm1pc3NpbmdTY2hlbWE7XG4gICAgICBpZiAoYWRkZWQocmVmKSkgdGhyb3cgbmV3IEVycm9yKCdTY2hlbWEgJyArIHJlZiArICcgaXMgbG9hZGVkIGJ1dCAnICsgZS5taXNzaW5nUmVmICsgJyBjYW5ub3QgYmUgcmVzb2x2ZWQnKTtcblxuICAgICAgdmFyIHNjaGVtYVByb21pc2UgPSBzZWxmLl9sb2FkaW5nU2NoZW1hc1tyZWZdO1xuICAgICAgaWYgKCFzY2hlbWFQcm9taXNlKSB7XG4gICAgICAgIHNjaGVtYVByb21pc2UgPSBzZWxmLl9sb2FkaW5nU2NoZW1hc1tyZWZdID0gc2VsZi5fb3B0cy5sb2FkU2NoZW1hKHJlZik7XG4gICAgICAgIHNjaGVtYVByb21pc2UudGhlbihyZW1vdmVQcm9taXNlLCByZW1vdmVQcm9taXNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjaGVtYVByb21pc2UudGhlbihmdW5jdGlvbiAoc2NoKSB7XG4gICAgICAgIGlmICghYWRkZWQocmVmKSkge1xuICAgICAgICAgIHJldHVybiBsb2FkTWV0YVNjaGVtYU9mKHNjaCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWFkZGVkKHJlZikpIHNlbGYuYWRkU2NoZW1hKHNjaCwgcmVmLCB1bmRlZmluZWQsIG1ldGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2NvbXBpbGVBc3luYyhzY2hlbWFPYmopO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlbW92ZVByb21pc2UoKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmLl9sb2FkaW5nU2NoZW1hc1tyZWZdO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhZGRlZChyZWYpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3JlZnNbcmVmXSB8fCBzZWxmLl9zY2hlbWFzW3JlZl07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXNvbHZlID0gcmVxdWlyZSgnLi9yZXNvbHZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBWYWxpZGF0aW9uOiBlcnJvclN1YmNsYXNzKFZhbGlkYXRpb25FcnJvciksXG4gIE1pc3NpbmdSZWY6IGVycm9yU3ViY2xhc3MoTWlzc2luZ1JlZkVycm9yKVxufTtcblxuXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKSB7XG4gIHRoaXMubWVzc2FnZSA9ICd2YWxpZGF0aW9uIGZhaWxlZCc7XG4gIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICB0aGlzLmFqdiA9IHRoaXMudmFsaWRhdGlvbiA9IHRydWU7XG59XG5cblxuTWlzc2luZ1JlZkVycm9yLm1lc3NhZ2UgPSBmdW5jdGlvbiAoYmFzZUlkLCByZWYpIHtcbiAgcmV0dXJuICdjYW5cXCd0IHJlc29sdmUgcmVmZXJlbmNlICcgKyByZWYgKyAnIGZyb20gaWQgJyArIGJhc2VJZDtcbn07XG5cblxuZnVuY3Rpb24gTWlzc2luZ1JlZkVycm9yKGJhc2VJZCwgcmVmLCBtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgTWlzc2luZ1JlZkVycm9yLm1lc3NhZ2UoYmFzZUlkLCByZWYpO1xuICB0aGlzLm1pc3NpbmdSZWYgPSByZXNvbHZlLnVybChiYXNlSWQsIHJlZik7XG4gIHRoaXMubWlzc2luZ1NjaGVtYSA9IHJlc29sdmUubm9ybWFsaXplSWQocmVzb2x2ZS5mdWxsUGF0aCh0aGlzLm1pc3NpbmdSZWYpKTtcbn1cblxuXG5mdW5jdGlvbiBlcnJvclN1YmNsYXNzKFN1YmNsYXNzKSB7XG4gIFN1YmNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgU3ViY2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViY2xhc3M7XG4gIHJldHVybiBTdWJjbGFzcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIERBVEUgPSAvXihcXGRcXGRcXGRcXGQpLShcXGRcXGQpLShcXGRcXGQpJC87XG52YXIgREFZUyA9IFswLDMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtcbnZhciBUSU1FID0gL14oXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKShcXC5cXGQrKT8oenxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPyk/JC9pO1xudmFyIEhPU1ROQU1FID0gL14oPz0uezEsMjUzfVxcLj8kKVthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86Wy0wLTlhLXpdezAsNjF9WzAtOWEtel0pPykqXFwuPyQvaTtcbnZhciBVUkkgPSAvXig/OlthLXpdW2EtejAtOStcXC0uXSo6KSg/OlxcLz9cXC8oPzooPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06XXwlWzAtOWEtZl17Mn0pKkApPyg/OlxcWyg/Oig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs2fXw6Oig/OlswLTlhLWZdezEsNH06KXs1fXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwxfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezN9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDJ9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7Mn18KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDR9WzAtOWEtZl17MSw0fSk/OjopKD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNX1bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH18KD86KD86WzAtOWEtZl17MSw0fTopezAsNn1bMC05YS1mXXsxLDR9KT86Oil8W1Z2XVswLTlhLWZdK1xcLlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdKylcXF18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pfCg/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PV18JVswLTlhLWZdezJ9KSopKD86OlxcZCopPyg/OlxcLyg/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKikqfFxcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKyg/OlxcLyg/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKikqKT98KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSopKD86XFw/KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkAvP118JVswLTlhLWZdezJ9KSopPyg/OiMoPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/JC9pO1xudmFyIFVSSVJFRiA9IC9eKD86W2Etel1bYS16MC05K1xcLS5dKjopPyg/OlxcLz9cXC8oPzooPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06XXwlWzAtOWEtZl17Mn0pKkApPyg/OlxcWyg/Oig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs2fXw6Oig/OlswLTlhLWZdezEsNH06KXs1fXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwxfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezN9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDJ9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7Mn18KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDR9WzAtOWEtZl17MSw0fSk/OjopKD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNX1bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH18KD86KD86WzAtOWEtZl17MSw0fTopezAsNn1bMC05YS1mXXsxLDR9KT86Oil8W1Z2XVswLTlhLWZdK1xcLlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdKylcXF18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pfCg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9XXwlWzAtOWEtZl17Mn0pKikoPzo6XFxkKik/KD86XFwvKD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKnxcXC8oPzooPzpbYS16MC05XFwtLl9+ISQmJ1wiKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKyg/OlxcLyg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSopP3woPzpbYS16MC05XFwtLl9+ISQmJ1wiKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKyg/OlxcLyg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSopPyg/OlxcPyg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkAvP118JVswLTlhLWZdezJ9KSopPyg/OiMoPzpbYS16MC05XFwtLl9+ISQmJ1wiKCkqKyw7PTpALz9dfCVbMC05YS1mXXsyfSkqKT8kL2k7XG4vLyB1cmktdGVtcGxhdGU6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTcwXG52YXIgVVJJVEVNUExBVEUgPSAvXig/Oig/OlteXFx4MDAtXFx4MjBcIic8PiVcXFxcXmB7fH1dfCVbMC05YS1mXXsyfSl8XFx7WysjLi87PyY9LCFAfF0/KD86W2EtejAtOV9dfCVbMC05YS1mXXsyfSkrKD86OlsxLTldWzAtOV17MCwzfXxcXCopPyg/OiwoPzpbYS16MC05X118JVswLTlhLWZdezJ9KSsoPzo6WzEtOV1bMC05XXswLDN9fFxcKik/KSpcXH0pKiQvaTtcbi8vIEZvciB0aGUgc291cmNlOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kcGVyaW5pLzcyOTI5NFxuLy8gRm9yIHRlc3QgY2FzZXM6IGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9kZW1vL3VybC1yZWdleFxuLy8gQHRvZG8gRGVsZXRlIGN1cnJlbnQgVVJMIGluIGZhdm91ciBvZiB0aGUgY29tbWVudGVkIG91dCBVUkwgcnVsZSB3aGVuIHRoaXMgaXNzdWUgaXMgZml4ZWQgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzc5ODMuXG4vLyB2YXIgVVJMID0gL14oPzooPzpodHRwcz98ZnRwKTpcXC9cXC8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyExMCg/OlxcLlxcZHsxLDN9KXszfSkoPyExMjcoPzpcXC5cXGR7MSwzfSl7M30pKD8hMTY5XFwuMjU0KD86XFwuXFxkezEsM30pezJ9KSg/ITE5MlxcLjE2OCg/OlxcLlxcZHsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlxcZHwzWzAtMV0pKD86XFwuXFxkezEsM30pezJ9KSg/OlsxLTldXFxkP3wxXFxkXFxkfDJbMDFdXFxkfDIyWzAtM10pKD86XFwuKD86MT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rLSkqW2EtelxcdXswMGExfS1cXHV7ZmZmZn0wLTldKykoPzpcXC4oPzpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rLSkqW2EtelxcdXswMGExfS1cXHV7ZmZmZn0wLTldKykqKD86XFwuKD86W2EtelxcdXswMGExfS1cXHV7ZmZmZn1dezIsfSkpKSg/OjpcXGR7Miw1fSk/KD86XFwvW15cXHNdKik/JC9pdTtcbnZhciBVUkwgPSAvXig/Oig/Omh0dHBbc1xcdTAxN0ZdP3xmdHApOlxcL1xcLykoPzooPzpbXFwwLVxceDA4XFx4MEUtXFx4MUYhLVxceDlGXFx4QTEtXFx1MTY3RlxcdTE2ODEtXFx1MUZGRlxcdTIwMEItXFx1MjAyN1xcdTIwMkEtXFx1MjAyRVxcdTIwMzAtXFx1MjA1RVxcdTIwNjAtXFx1MkZGRlxcdTMwMDEtXFx1RDdGRlxcdUUwMDAtXFx1RkVGRVxcdUZGMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXSkrKD86Oig/OltcXDAtXFx4MDhcXHgwRS1cXHgxRiEtXFx4OUZcXHhBMS1cXHUxNjdGXFx1MTY4MS1cXHUxRkZGXFx1MjAwQi1cXHUyMDI3XFx1MjAyQS1cXHUyMDJFXFx1MjAzMC1cXHUyMDVFXFx1MjA2MC1cXHUyRkZGXFx1MzAwMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRUZFXFx1RkYwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSopP0ApPyg/Oig/ITEwKD86XFwuWzAtOV17MSwzfSl7M30pKD8hMTI3KD86XFwuWzAtOV17MSwzfSl7M30pKD8hMTY5XFwuMjU0KD86XFwuWzAtOV17MSwzfSl7Mn0pKD8hMTkyXFwuMTY4KD86XFwuWzAtOV17MSwzfSl7Mn0pKD8hMTcyXFwuKD86MVs2LTldfDJbMC05XXwzWzAxXSkoPzpcXC5bMC05XXsxLDN9KXsyfSkoPzpbMS05XVswLTldP3wxWzAtOV1bMC05XXwyWzAxXVswLTldfDIyWzAtM10pKD86XFwuKD86MT9bMC05XXsxLDJ9fDJbMC00XVswLTldfDI1WzAtNV0pKXsyfSg/OlxcLig/OlsxLTldWzAtOV0/fDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNF0pKXwoPzooPzooPzpbMC05YS16XFx4QTEtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKy0pKig/OlswLTlhLXpcXHhBMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXSkrKSg/OlxcLig/Oig/OlswLTlhLXpcXHhBMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXSkrLSkqKD86WzAtOWEtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSspKig/OlxcLig/Oig/OlthLXpcXHhBMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXSl7Mix9KSkpKD86OlswLTldezIsNX0pPyg/OlxcLyg/OltcXDAtXFx4MDhcXHgwRS1cXHgxRiEtXFx4OUZcXHhBMS1cXHUxNjdGXFx1MTY4MS1cXHUxRkZGXFx1MjAwQi1cXHUyMDI3XFx1MjAyQS1cXHUyMDJFXFx1MjAzMC1cXHUyMDVFXFx1MjA2MC1cXHUyRkZGXFx1MzAwMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRUZFXFx1RkYwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSopPyQvaTtcbnZhciBVVUlEID0gL14oPzp1cm46dXVpZDopP1swLTlhLWZdezh9LSg/OlswLTlhLWZdezR9LSl7M31bMC05YS1mXXsxMn0kL2k7XG52YXIgSlNPTl9QT0lOVEVSID0gL14oPzpcXC8oPzpbXn4vXXx+MHx+MSkqKSokLztcbnZhciBKU09OX1BPSU5URVJfVVJJX0ZSQUdNRU5UID0gL14jKD86XFwvKD86W2EtejAtOV9cXC0uISQmJygpKissOzo9QF18JVswLTlhLWZdezJ9fH4wfH4xKSopKiQvaTtcbnZhciBSRUxBVElWRV9KU09OX1BPSU5URVIgPSAvXig/OjB8WzEtOV1bMC05XSopKD86I3woPzpcXC8oPzpbXn4vXXx+MHx+MSkqKSopJC87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JtYXRzO1xuXG5mdW5jdGlvbiBmb3JtYXRzKG1vZGUpIHtcbiAgbW9kZSA9IG1vZGUgPT0gJ2Z1bGwnID8gJ2Z1bGwnIDogJ2Zhc3QnO1xuICByZXR1cm4gdXRpbC5jb3B5KGZvcm1hdHNbbW9kZV0pO1xufVxuXG5cbmZvcm1hdHMuZmFzdCA9IHtcbiAgLy8gZGF0ZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICBkYXRlOiAvXlxcZFxcZFxcZFxcZC1bMC0xXVxcZC1bMC0zXVxcZCQvLFxuICAvLyBkYXRlLXRpbWU6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkjc2VjdGlvbi01LjZcbiAgdGltZTogL14oPzpbMC0yXVxcZDpbMC01XVxcZDpbMC01XVxcZHwyMzo1OTo2MCkoPzpcXC5cXGQrKT8oPzp6fFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/KT8kL2ksXG4gICdkYXRlLXRpbWUnOiAvXlxcZFxcZFxcZFxcZC1bMC0xXVxcZC1bMC0zXVxcZFt0XFxzXSg/OlswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkfDIzOjU5OjYwKSg/OlxcLlxcZCspPyg/Onp8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8pJC9pLFxuICAvLyB1cmk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvaXMtbXktanNvbi12YWxpZC9ibG9iL21hc3Rlci9mb3JtYXRzLmpzXG4gIHVyaTogL14oPzpbYS16XVthLXowLTkrXFwtLl0qOikoPzpcXC8/XFwvKT9bXlxcc10qJC9pLFxuICAndXJpLXJlZmVyZW5jZSc6IC9eKD86KD86W2Etel1bYS16MC05K1xcLS5dKjopP1xcLz9cXC8pPyg/OlteXFxcXFxccyNdW15cXHMjXSopPyg/OiNbXlxcXFxcXHNdKik/JC9pLFxuICAndXJpLXRlbXBsYXRlJzogVVJJVEVNUExBVEUsXG4gIHVybDogVVJMLFxuICAvLyBlbWFpbCAoc291cmNlcyBmcm9tIGpzZW4gdmFsaWRhdG9yKTpcbiAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMDEzMjMvdXNpbmctYS1yZWd1bGFyLWV4cHJlc3Npb24tdG8tdmFsaWRhdGUtYW4tZW1haWwtYWRkcmVzcyNhbnN3ZXItODgyOTM2M1xuICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9mb3Jtcy5odG1sI3ZhbGlkLWUtbWFpbC1hZGRyZXNzIChzZWFyY2ggZm9yICd3aWxsZnVsIHZpb2xhdGlvbicpXG4gIGVtYWlsOiAvXlthLXowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykqJC9pLFxuICBob3N0bmFtZTogSE9TVE5BTUUsXG4gIC8vIG9wdGltaXplZCBodHRwczovL3d3dy5zYWZhcmlib29rc29ubGluZS5jb20vbGlicmFyeS92aWV3L3JlZ3VsYXItZXhwcmVzc2lvbnMtY29va2Jvb2svOTc4MDU5NjgwMjgzNy9jaDA3czE2Lmh0bWxcbiAgaXB2NDogL14oPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPykkLyxcbiAgLy8gb3B0aW1pemVkIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTM0OTcvcmVndWxhci1leHByZXNzaW9uLXRoYXQtbWF0Y2hlcy12YWxpZC1pcHY2LWFkZHJlc3Nlc1xuICBpcHY2OiAvXlxccyooPzooPzooPzpbMC05YS1mXXsxLDR9Oil7N30oPzpbMC05YS1mXXsxLDR9fDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7Nn0oPzo6WzAtOWEtZl17MSw0fXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KD86KD86WzAtOWEtZl17MSw0fTopezV9KD86KD86KD86OlswLTlhLWZdezEsNH0pezEsMn0pfDooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KD86KD86WzAtOWEtZl17MSw0fTopezR9KD86KD86KD86OlswLTlhLWZdezEsNH0pezEsM30pfCg/Oig/OjpbMC05YS1mXXsxLDR9KT86KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7M30oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw0fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsMn06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7Mn0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw1fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsM306KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw2fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNH06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzo6KD86KD86KD86OlswLTlhLWZdezEsNH0pezEsN30pfCg/Oig/OjpbMC05YS1mXXsxLDR9KXswLDV9Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSkpKD86JS4rKT9cXHMqJC9pLFxuICByZWdleDogcmVnZXgsXG4gIC8vIHV1aWQ6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQxMjJcbiAgdXVpZDogVVVJRCxcbiAgLy8gSlNPTi1wb2ludGVyOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMVxuICAvLyB1cmkgZnJhZ21lbnQ6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I2FwcGVuZGl4LUFcbiAgJ2pzb24tcG9pbnRlcic6IEpTT05fUE9JTlRFUixcbiAgJ2pzb24tcG9pbnRlci11cmktZnJhZ21lbnQnOiBKU09OX1BPSU5URVJfVVJJX0ZSQUdNRU5ULFxuICAvLyByZWxhdGl2ZSBKU09OLXBvaW50ZXI6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWx1ZmYtcmVsYXRpdmUtanNvbi1wb2ludGVyLTAwXG4gICdyZWxhdGl2ZS1qc29uLXBvaW50ZXInOiBSRUxBVElWRV9KU09OX1BPSU5URVJcbn07XG5cblxuZm9ybWF0cy5mdWxsID0ge1xuICBkYXRlOiBkYXRlLFxuICB0aW1lOiB0aW1lLFxuICAnZGF0ZS10aW1lJzogZGF0ZV90aW1lLFxuICB1cmk6IHVyaSxcbiAgJ3VyaS1yZWZlcmVuY2UnOiBVUklSRUYsXG4gICd1cmktdGVtcGxhdGUnOiBVUklURU1QTEFURSxcbiAgdXJsOiBVUkwsXG4gIGVtYWlsOiAvXlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcXC5bYS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSpAKD86W2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP1xcLikrW2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pPyQvaSxcbiAgaG9zdG5hbWU6IEhPU1ROQU1FLFxuICBpcHY0OiAvXig/Oig/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSQvLFxuICBpcHY2OiAvXlxccyooPzooPzooPzpbMC05YS1mXXsxLDR9Oil7N30oPzpbMC05YS1mXXsxLDR9fDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7Nn0oPzo6WzAtOWEtZl17MSw0fXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KD86KD86WzAtOWEtZl17MSw0fTopezV9KD86KD86KD86OlswLTlhLWZdezEsNH0pezEsMn0pfDooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KD86KD86WzAtOWEtZl17MSw0fTopezR9KD86KD86KD86OlswLTlhLWZdezEsNH0pezEsM30pfCg/Oig/OjpbMC05YS1mXXsxLDR9KT86KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7M30oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw0fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsMn06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7Mn0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw1fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsM306KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw2fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNH06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoPzo6KD86KD86KD86OlswLTlhLWZdezEsNH0pezEsN30pfCg/Oig/OjpbMC05YS1mXXsxLDR9KXswLDV9Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSkpKD86JS4rKT9cXHMqJC9pLFxuICByZWdleDogcmVnZXgsXG4gIHV1aWQ6IFVVSUQsXG4gICdqc29uLXBvaW50ZXInOiBKU09OX1BPSU5URVIsXG4gICdqc29uLXBvaW50ZXItdXJpLWZyYWdtZW50JzogSlNPTl9QT0lOVEVSX1VSSV9GUkFHTUVOVCxcbiAgJ3JlbGF0aXZlLWpzb24tcG9pbnRlcic6IFJFTEFUSVZFX0pTT05fUE9JTlRFUlxufTtcblxuXG5mdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkjYXBwZW5kaXgtQ1xuICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XG59XG5cblxuZnVuY3Rpb24gZGF0ZShzdHIpIHtcbiAgLy8gZnVsbC1kYXRlIGZyb20gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChEQVRFKTtcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHllYXIgPSArbWF0Y2hlc1sxXTtcbiAgdmFyIG1vbnRoID0gK21hdGNoZXNbMl07XG4gIHZhciBkYXkgPSArbWF0Y2hlc1szXTtcblxuICByZXR1cm4gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiAmJiBkYXkgPj0gMSAmJlxuICAgICAgICAgIGRheSA8PSAobW9udGggPT0gMiAmJiBpc0xlYXBZZWFyKHllYXIpID8gMjkgOiBEQVlTW21vbnRoXSk7XG59XG5cblxuZnVuY3Rpb24gdGltZShzdHIsIGZ1bGwpIHtcbiAgdmFyIG1hdGNoZXMgPSBzdHIubWF0Y2goVElNRSk7XG4gIGlmICghbWF0Y2hlcykgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBob3VyID0gbWF0Y2hlc1sxXTtcbiAgdmFyIG1pbnV0ZSA9IG1hdGNoZXNbMl07XG4gIHZhciBzZWNvbmQgPSBtYXRjaGVzWzNdO1xuICB2YXIgdGltZVpvbmUgPSBtYXRjaGVzWzVdO1xuICByZXR1cm4gKChob3VyIDw9IDIzICYmIG1pbnV0ZSA8PSA1OSAmJiBzZWNvbmQgPD0gNTkpIHx8XG4gICAgICAgICAgKGhvdXIgPT0gMjMgJiYgbWludXRlID09IDU5ICYmIHNlY29uZCA9PSA2MCkpICYmXG4gICAgICAgICAoIWZ1bGwgfHwgdGltZVpvbmUpO1xufVxuXG5cbnZhciBEQVRFX1RJTUVfU0VQQVJBVE9SID0gL3R8XFxzL2k7XG5mdW5jdGlvbiBkYXRlX3RpbWUoc3RyKSB7XG4gIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkjc2VjdGlvbi01LjZcbiAgdmFyIGRhdGVUaW1lID0gc3RyLnNwbGl0KERBVEVfVElNRV9TRVBBUkFUT1IpO1xuICByZXR1cm4gZGF0ZVRpbWUubGVuZ3RoID09IDIgJiYgZGF0ZShkYXRlVGltZVswXSkgJiYgdGltZShkYXRlVGltZVsxXSwgdHJ1ZSk7XG59XG5cblxudmFyIE5PVF9VUklfRlJBR01FTlQgPSAvXFwvfDovO1xuZnVuY3Rpb24gdXJpKHN0cikge1xuICAvLyBodHRwOi8vam1yd2FyZS5jb20vYXJ0aWNsZXMvMjAwOS91cmlfcmVnZXhwL1VSSV9yZWdleC5odG1sICsgb3B0aW9uYWwgcHJvdG9jb2wgKyByZXF1aXJlZCBcIi5cIlxuICByZXR1cm4gTk9UX1VSSV9GUkFHTUVOVC50ZXN0KHN0cikgJiYgVVJJLnRlc3Qoc3RyKTtcbn1cblxuXG52YXIgWl9BTkNIT1IgPSAvW15cXFxcXVxcXFxaLztcbmZ1bmN0aW9uIHJlZ2V4KHN0cikge1xuICBpZiAoWl9BTkNIT1IudGVzdChzdHIpKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgbmV3IFJlZ0V4cChzdHIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlc29sdmUgPSByZXF1aXJlKCcuL3Jlc29sdmUnKVxuICAsIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKVxuICAsIGVycm9yQ2xhc3NlcyA9IHJlcXVpcmUoJy4vZXJyb3JfY2xhc3NlcycpXG4gICwgc3RhYmxlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnknKTtcblxudmFyIHZhbGlkYXRlR2VuZXJhdG9yID0gcmVxdWlyZSgnLi4vZG90anMvdmFsaWRhdGUnKTtcblxuLyoqXG4gKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgaW5zaWRlIGNvbXBpbGVkIHZhbGlkYXRpb25zIGZ1bmN0aW9uXG4gKi9cblxudmFyIHVjczJsZW5ndGggPSB1dGlsLnVjczJsZW5ndGg7XG52YXIgZXF1YWwgPSByZXF1aXJlKCdmYXN0LWRlZXAtZXF1YWwnKTtcblxuLy8gdGhpcyBlcnJvciBpcyB0aHJvd24gYnkgYXN5bmMgc2NoZW1hcyB0byByZXR1cm4gdmFsaWRhdGlvbiBlcnJvcnMgdmlhIGV4Y2VwdGlvblxudmFyIFZhbGlkYXRpb25FcnJvciA9IGVycm9yQ2xhc3Nlcy5WYWxpZGF0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGU7XG5cblxuLyoqXG4gKiBDb21waWxlcyBzY2hlbWEgdG8gdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9vdCBzY2hlbWEgZm9yIHRoaXMgc2NoZW1hXG4gKiBAcGFyYW0gIHtPYmplY3R9IGxvY2FsUmVmcyB0aGUgaGFzaCBvZiBsb2NhbCByZWZlcmVuY2VzIGluc2lkZSB0aGUgc2NoZW1hIChjcmVhdGVkIGJ5IHJlc29sdmUuaWQpLCB1c2VkIGZvciBpbmxpbmUgcmVzb2x1dGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBJRCBmb3IgSURzIGluIHRoZSBzY2hlbWFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUoc2NoZW1hLCByb290LCBsb2NhbFJlZnMsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlLCBldmlsOiB0cnVlICovXG4gIC8qIGVzbGludCBuby1zaGFkb3c6IDAgKi9cbiAgdmFyIHNlbGYgPSB0aGlzXG4gICAgLCBvcHRzID0gdGhpcy5fb3B0c1xuICAgICwgcmVmVmFsID0gWyB1bmRlZmluZWQgXVxuICAgICwgcmVmcyA9IHt9XG4gICAgLCBwYXR0ZXJucyA9IFtdXG4gICAgLCBwYXR0ZXJuc0hhc2ggPSB7fVxuICAgICwgZGVmYXVsdHMgPSBbXVxuICAgICwgZGVmYXVsdHNIYXNoID0ge31cbiAgICAsIGN1c3RvbVJ1bGVzID0gW107XG5cbiAgcm9vdCA9IHJvb3QgfHwgeyBzY2hlbWE6IHNjaGVtYSwgcmVmVmFsOiByZWZWYWwsIHJlZnM6IHJlZnMgfTtcblxuICB2YXIgYyA9IGNoZWNrQ29tcGlsaW5nLmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICB2YXIgY29tcGlsYXRpb24gPSB0aGlzLl9jb21waWxhdGlvbnNbYy5pbmRleF07XG4gIGlmIChjLmNvbXBpbGluZykgcmV0dXJuIChjb21waWxhdGlvbi5jYWxsVmFsaWRhdGUgPSBjYWxsVmFsaWRhdGUpO1xuXG4gIHZhciBmb3JtYXRzID0gdGhpcy5fZm9ybWF0cztcbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcblxuICB0cnkge1xuICAgIHZhciB2ID0gbG9jYWxDb21waWxlKHNjaGVtYSwgcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpO1xuICAgIGNvbXBpbGF0aW9uLnZhbGlkYXRlID0gdjtcbiAgICB2YXIgY3YgPSBjb21waWxhdGlvbi5jYWxsVmFsaWRhdGU7XG4gICAgaWYgKGN2KSB7XG4gICAgICBjdi5zY2hlbWEgPSB2LnNjaGVtYTtcbiAgICAgIGN2LmVycm9ycyA9IG51bGw7XG4gICAgICBjdi5yZWZzID0gdi5yZWZzO1xuICAgICAgY3YucmVmVmFsID0gdi5yZWZWYWw7XG4gICAgICBjdi5yb290ID0gdi5yb290O1xuICAgICAgY3YuJGFzeW5jID0gdi4kYXN5bmM7XG4gICAgICBpZiAob3B0cy5zb3VyY2VDb2RlKSBjdi5zb3VyY2UgPSB2LnNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG4gIH0gZmluYWxseSB7XG4gICAgZW5kQ29tcGlsaW5nLmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICB9XG5cbiAgLyogQHRoaXMgICB7Kn0gLSBjdXN0b20gY29udGV4dCwgc2VlIHBhc3NDb250ZXh0IG9wdGlvbiAqL1xuICBmdW5jdGlvbiBjYWxsVmFsaWRhdGUoKSB7XG4gICAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICAgIHZhciB2YWxpZGF0ZSA9IGNvbXBpbGF0aW9uLnZhbGlkYXRlO1xuICAgIHZhciByZXN1bHQgPSB2YWxpZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGNhbGxWYWxpZGF0ZS5lcnJvcnMgPSB2YWxpZGF0ZS5lcnJvcnM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2FsQ29tcGlsZShfc2NoZW1hLCBfcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpIHtcbiAgICB2YXIgaXNSb290ID0gIV9yb290IHx8IChfcm9vdCAmJiBfcm9vdC5zY2hlbWEgPT0gX3NjaGVtYSk7XG4gICAgaWYgKF9yb290LnNjaGVtYSAhPSByb290LnNjaGVtYSlcbiAgICAgIHJldHVybiBjb21waWxlLmNhbGwoc2VsZiwgX3NjaGVtYSwgX3Jvb3QsIGxvY2FsUmVmcywgYmFzZUlkKTtcblxuICAgIHZhciAkYXN5bmMgPSBfc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZTtcblxuICAgIHZhciBzb3VyY2VDb2RlID0gdmFsaWRhdGVHZW5lcmF0b3Ioe1xuICAgICAgaXNUb3A6IHRydWUsXG4gICAgICBzY2hlbWE6IF9zY2hlbWEsXG4gICAgICBpc1Jvb3Q6IGlzUm9vdCxcbiAgICAgIGJhc2VJZDogYmFzZUlkLFxuICAgICAgcm9vdDogX3Jvb3QsXG4gICAgICBzY2hlbWFQYXRoOiAnJyxcbiAgICAgIGVyclNjaGVtYVBhdGg6ICcjJyxcbiAgICAgIGVycm9yUGF0aDogJ1wiXCInLFxuICAgICAgTWlzc2luZ1JlZkVycm9yOiBlcnJvckNsYXNzZXMuTWlzc2luZ1JlZixcbiAgICAgIFJVTEVTOiBSVUxFUyxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZUdlbmVyYXRvcixcbiAgICAgIHV0aWw6IHV0aWwsXG4gICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgcmVzb2x2ZVJlZjogcmVzb2x2ZVJlZixcbiAgICAgIHVzZVBhdHRlcm46IHVzZVBhdHRlcm4sXG4gICAgICB1c2VEZWZhdWx0OiB1c2VEZWZhdWx0LFxuICAgICAgdXNlQ3VzdG9tUnVsZTogdXNlQ3VzdG9tUnVsZSxcbiAgICAgIG9wdHM6IG9wdHMsXG4gICAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgICAgbG9nZ2VyOiBzZWxmLmxvZ2dlcixcbiAgICAgIHNlbGY6IHNlbGZcbiAgICB9KTtcblxuICAgIHNvdXJjZUNvZGUgPSB2YXJzKHJlZlZhbCwgcmVmVmFsQ29kZSkgKyB2YXJzKHBhdHRlcm5zLCBwYXR0ZXJuQ29kZSlcbiAgICAgICAgICAgICAgICAgICArIHZhcnMoZGVmYXVsdHMsIGRlZmF1bHRDb2RlKSArIHZhcnMoY3VzdG9tUnVsZXMsIGN1c3RvbVJ1bGVDb2RlKVxuICAgICAgICAgICAgICAgICAgICsgc291cmNlQ29kZTtcblxuICAgIGlmIChvcHRzLnByb2Nlc3NDb2RlKSBzb3VyY2VDb2RlID0gb3B0cy5wcm9jZXNzQ29kZShzb3VyY2VDb2RlLCBfc2NoZW1hKTtcbiAgICAvLyBjb25zb2xlLmxvZygnXFxuXFxuXFxuICoqKiBcXG4nLCBKU09OLnN0cmluZ2lmeShzb3VyY2VDb2RlKSk7XG4gICAgdmFyIHZhbGlkYXRlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgbWFrZVZhbGlkYXRlID0gbmV3IEZ1bmN0aW9uKFxuICAgICAgICAnc2VsZicsXG4gICAgICAgICdSVUxFUycsXG4gICAgICAgICdmb3JtYXRzJyxcbiAgICAgICAgJ3Jvb3QnLFxuICAgICAgICAncmVmVmFsJyxcbiAgICAgICAgJ2RlZmF1bHRzJyxcbiAgICAgICAgJ2N1c3RvbVJ1bGVzJyxcbiAgICAgICAgJ2VxdWFsJyxcbiAgICAgICAgJ3VjczJsZW5ndGgnLFxuICAgICAgICAnVmFsaWRhdGlvbkVycm9yJyxcbiAgICAgICAgc291cmNlQ29kZVxuICAgICAgKTtcblxuICAgICAgdmFsaWRhdGUgPSBtYWtlVmFsaWRhdGUoXG4gICAgICAgIHNlbGYsXG4gICAgICAgIFJVTEVTLFxuICAgICAgICBmb3JtYXRzLFxuICAgICAgICByb290LFxuICAgICAgICByZWZWYWwsXG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICBjdXN0b21SdWxlcyxcbiAgICAgICAgZXF1YWwsXG4gICAgICAgIHVjczJsZW5ndGgsXG4gICAgICAgIFZhbGlkYXRpb25FcnJvclxuICAgICAgKTtcblxuICAgICAgcmVmVmFsWzBdID0gdmFsaWRhdGU7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBzZWxmLmxvZ2dlci5lcnJvcignRXJyb3IgY29tcGlsaW5nIHNjaGVtYSwgZnVuY3Rpb24gY29kZTonLCBzb3VyY2VDb2RlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUuc2NoZW1hID0gX3NjaGVtYTtcbiAgICB2YWxpZGF0ZS5lcnJvcnMgPSBudWxsO1xuICAgIHZhbGlkYXRlLnJlZnMgPSByZWZzO1xuICAgIHZhbGlkYXRlLnJlZlZhbCA9IHJlZlZhbDtcbiAgICB2YWxpZGF0ZS5yb290ID0gaXNSb290ID8gdmFsaWRhdGUgOiBfcm9vdDtcbiAgICBpZiAoJGFzeW5jKSB2YWxpZGF0ZS4kYXN5bmMgPSB0cnVlO1xuICAgIGlmIChvcHRzLnNvdXJjZUNvZGUgPT09IHRydWUpIHtcbiAgICAgIHZhbGlkYXRlLnNvdXJjZSA9IHtcbiAgICAgICAgY29kZTogc291cmNlQ29kZSxcbiAgICAgICAgcGF0dGVybnM6IHBhdHRlcm5zLFxuICAgICAgICBkZWZhdWx0czogZGVmYXVsdHNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlZihiYXNlSWQsIHJlZiwgaXNSb290KSB7XG4gICAgcmVmID0gcmVzb2x2ZS51cmwoYmFzZUlkLCByZWYpO1xuICAgIHZhciByZWZJbmRleCA9IHJlZnNbcmVmXTtcbiAgICB2YXIgX3JlZlZhbCwgcmVmQ29kZTtcbiAgICBpZiAocmVmSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgX3JlZlZhbCA9IHJlZlZhbFtyZWZJbmRleF07XG4gICAgICByZWZDb2RlID0gJ3JlZlZhbFsnICsgcmVmSW5kZXggKyAnXSc7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRSZWYoX3JlZlZhbCwgcmVmQ29kZSk7XG4gICAgfVxuICAgIGlmICghaXNSb290ICYmIHJvb3QucmVmcykge1xuICAgICAgdmFyIHJvb3RSZWZJZCA9IHJvb3QucmVmc1tyZWZdO1xuICAgICAgaWYgKHJvb3RSZWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF9yZWZWYWwgPSByb290LnJlZlZhbFtyb290UmVmSWRdO1xuICAgICAgICByZWZDb2RlID0gYWRkTG9jYWxSZWYocmVmLCBfcmVmVmFsKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkUmVmKF9yZWZWYWwsIHJlZkNvZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlZkNvZGUgPSBhZGRMb2NhbFJlZihyZWYpO1xuICAgIHZhciB2ID0gcmVzb2x2ZS5jYWxsKHNlbGYsIGxvY2FsQ29tcGlsZSwgcm9vdCwgcmVmKTtcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgbG9jYWxTY2hlbWEgPSBsb2NhbFJlZnMgJiYgbG9jYWxSZWZzW3JlZl07XG4gICAgICBpZiAobG9jYWxTY2hlbWEpIHtcbiAgICAgICAgdiA9IHJlc29sdmUuaW5saW5lUmVmKGxvY2FsU2NoZW1hLCBvcHRzLmlubGluZVJlZnMpXG4gICAgICAgICAgICA/IGxvY2FsU2NoZW1hXG4gICAgICAgICAgICA6IGNvbXBpbGUuY2FsbChzZWxmLCBsb2NhbFNjaGVtYSwgcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbW92ZUxvY2FsUmVmKHJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcGxhY2VMb2NhbFJlZihyZWYsIHYpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkUmVmKHYsIHJlZkNvZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExvY2FsUmVmKHJlZiwgdikge1xuICAgIHZhciByZWZJZCA9IHJlZlZhbC5sZW5ndGg7XG4gICAgcmVmVmFsW3JlZklkXSA9IHY7XG4gICAgcmVmc1tyZWZdID0gcmVmSWQ7XG4gICAgcmV0dXJuICdyZWZWYWwnICsgcmVmSWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVMb2NhbFJlZihyZWYpIHtcbiAgICBkZWxldGUgcmVmc1tyZWZdO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVwbGFjZUxvY2FsUmVmKHJlZiwgdikge1xuICAgIHZhciByZWZJZCA9IHJlZnNbcmVmXTtcbiAgICByZWZWYWxbcmVmSWRdID0gdjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVkUmVmKHJlZlZhbCwgY29kZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVmVmFsID09ICdvYmplY3QnIHx8IHR5cGVvZiByZWZWYWwgPT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICA/IHsgY29kZTogY29kZSwgc2NoZW1hOiByZWZWYWwsIGlubGluZTogdHJ1ZSB9XG4gICAgICAgICAgICA6IHsgY29kZTogY29kZSwgJGFzeW5jOiByZWZWYWwgJiYgISFyZWZWYWwuJGFzeW5jIH07XG4gIH1cblxuICBmdW5jdGlvbiB1c2VQYXR0ZXJuKHJlZ2V4U3RyKSB7XG4gICAgdmFyIGluZGV4ID0gcGF0dGVybnNIYXNoW3JlZ2V4U3RyXTtcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBwYXR0ZXJuc0hhc2hbcmVnZXhTdHJdID0gcGF0dGVybnMubGVuZ3RoO1xuICAgICAgcGF0dGVybnNbaW5kZXhdID0gcmVnZXhTdHI7XG4gICAgfVxuICAgIHJldHVybiAncGF0dGVybicgKyBpbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZURlZmF1bHQodmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gJycgKyB2YWx1ZTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB1dGlsLnRvUXVvdGVkU3RyaW5nKHZhbHVlKTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgICAgICAgdmFyIHZhbHVlU3RyID0gc3RhYmxlU3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgdmFyIGluZGV4ID0gZGVmYXVsdHNIYXNoW3ZhbHVlU3RyXTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGRlZmF1bHRzSGFzaFt2YWx1ZVN0cl0gPSBkZWZhdWx0cy5sZW5ndGg7XG4gICAgICAgICAgZGVmYXVsdHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdkZWZhdWx0JyArIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUN1c3RvbVJ1bGUocnVsZSwgc2NoZW1hLCBwYXJlbnRTY2hlbWEsIGl0KSB7XG4gICAgaWYgKHNlbGYuX29wdHMudmFsaWRhdGVTY2hlbWEgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgZGVwcyA9IHJ1bGUuZGVmaW5pdGlvbi5kZXBlbmRlbmNpZXM7XG4gICAgICBpZiAoZGVwcyAmJiAhZGVwcy5ldmVyeShmdW5jdGlvbihrZXl3b3JkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyZW50U2NoZW1hLCBrZXl3b3JkKTtcbiAgICAgIH0pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudCBzY2hlbWEgbXVzdCBoYXZlIGFsbCByZXF1aXJlZCBrZXl3b3JkczogJyArIGRlcHMuam9pbignLCcpKTtcblxuICAgICAgdmFyIHZhbGlkYXRlU2NoZW1hID0gcnVsZS5kZWZpbml0aW9uLnZhbGlkYXRlU2NoZW1hO1xuICAgICAgaWYgKHZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAgIHZhciB2YWxpZCA9IHZhbGlkYXRlU2NoZW1hKHNjaGVtYSk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICB2YXIgbWVzc2FnZSA9ICdrZXl3b3JkIHNjaGVtYSBpcyBpbnZhbGlkOiAnICsgc2VsZi5lcnJvcnNUZXh0KHZhbGlkYXRlU2NoZW1hLmVycm9ycyk7XG4gICAgICAgICAgaWYgKHNlbGYuX29wdHMudmFsaWRhdGVTY2hlbWEgPT0gJ2xvZycpIHNlbGYubG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvbXBpbGUgPSBydWxlLmRlZmluaXRpb24uY29tcGlsZVxuICAgICAgLCBpbmxpbmUgPSBydWxlLmRlZmluaXRpb24uaW5saW5lXG4gICAgICAsIG1hY3JvID0gcnVsZS5kZWZpbml0aW9uLm1hY3JvO1xuXG4gICAgdmFyIHZhbGlkYXRlO1xuICAgIGlmIChjb21waWxlKSB7XG4gICAgICB2YWxpZGF0ZSA9IGNvbXBpbGUuY2FsbChzZWxmLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpO1xuICAgIH0gZWxzZSBpZiAobWFjcm8pIHtcbiAgICAgIHZhbGlkYXRlID0gbWFjcm8uY2FsbChzZWxmLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpO1xuICAgICAgaWYgKG9wdHMudmFsaWRhdGVTY2hlbWEgIT09IGZhbHNlKSBzZWxmLnZhbGlkYXRlU2NoZW1hKHZhbGlkYXRlLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGlubGluZSkge1xuICAgICAgdmFsaWRhdGUgPSBpbmxpbmUuY2FsbChzZWxmLCBpdCwgcnVsZS5rZXl3b3JkLCBzY2hlbWEsIHBhcmVudFNjaGVtYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlID0gcnVsZS5kZWZpbml0aW9uLnZhbGlkYXRlO1xuICAgICAgaWYgKCF2YWxpZGF0ZSkgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjdXN0b20ga2V5d29yZCBcIicgKyBydWxlLmtleXdvcmQgKyAnXCJmYWlsZWQgdG8gY29tcGlsZScpO1xuXG4gICAgdmFyIGluZGV4ID0gY3VzdG9tUnVsZXMubGVuZ3RoO1xuICAgIGN1c3RvbVJ1bGVzW2luZGV4XSA9IHZhbGlkYXRlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6ICdjdXN0b21SdWxlJyArIGluZGV4LFxuICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlXG4gICAgfTtcbiAgfVxufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBzY2hlbWEgaXMgY3VycmVudGx5IGNvbXBpbGVkXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIGNvbXBpbGVcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdFxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBzY2hlbWEgSURcbiAqIEByZXR1cm4ge09iamVjdH0gb2JqZWN0IHdpdGggcHJvcGVydGllcyBcImluZGV4XCIgKGNvbXBpbGF0aW9uIGluZGV4KSBhbmQgXCJjb21waWxpbmdcIiAoYm9vbGVhbilcbiAqL1xuZnVuY3Rpb24gY2hlY2tDb21waWxpbmcoc2NoZW1hLCByb290LCBiYXNlSWQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgaW5kZXggPSBjb21wSW5kZXguY2FsbCh0aGlzLCBzY2hlbWEsIHJvb3QsIGJhc2VJZCk7XG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4geyBpbmRleDogaW5kZXgsIGNvbXBpbGluZzogdHJ1ZSB9O1xuICBpbmRleCA9IHRoaXMuX2NvbXBpbGF0aW9ucy5sZW5ndGg7XG4gIHRoaXMuX2NvbXBpbGF0aW9uc1tpbmRleF0gPSB7XG4gICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgcm9vdDogcm9vdCxcbiAgICBiYXNlSWQ6IGJhc2VJZFxuICB9O1xuICByZXR1cm4geyBpbmRleDogaW5kZXgsIGNvbXBpbGluZzogZmFsc2UgfTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHNjaGVtYSBmcm9tIHRoZSBjdXJyZW50bHkgY29tcGlsZWQgbGlzdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSB0byBjb21waWxlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgcm9vdCBvYmplY3RcbiAqIEBwYXJhbSAge1N0cmluZ30gYmFzZUlkIGJhc2Ugc2NoZW1hIElEXG4gKi9cbmZ1bmN0aW9uIGVuZENvbXBpbGluZyhzY2hlbWEsIHJvb3QsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciBpID0gY29tcEluZGV4LmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICBpZiAoaSA+PSAwKSB0aGlzLl9jb21waWxhdGlvbnMuc3BsaWNlKGksIDEpO1xufVxuXG5cbi8qKlxuICogSW5kZXggb2Ygc2NoZW1hIGNvbXBpbGF0aW9uIGluIHRoZSBjdXJyZW50bHkgY29tcGlsZWQgbGlzdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSB0byBjb21waWxlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgcm9vdCBvYmplY3RcbiAqIEBwYXJhbSAge1N0cmluZ30gYmFzZUlkIGJhc2Ugc2NoZW1hIElEXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBjb21waWxhdGlvbiBpbmRleFxuICovXG5mdW5jdGlvbiBjb21wSW5kZXgoc2NoZW1hLCByb290LCBiYXNlSWQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICBmb3IgKHZhciBpPTA7IGk8dGhpcy5fY29tcGlsYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSB0aGlzLl9jb21waWxhdGlvbnNbaV07XG4gICAgaWYgKGMuc2NoZW1hID09IHNjaGVtYSAmJiBjLnJvb3QgPT0gcm9vdCAmJiBjLmJhc2VJZCA9PSBiYXNlSWQpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5mdW5jdGlvbiBwYXR0ZXJuQ29kZShpLCBwYXR0ZXJucykge1xuICByZXR1cm4gJ3ZhciBwYXR0ZXJuJyArIGkgKyAnID0gbmV3IFJlZ0V4cCgnICsgdXRpbC50b1F1b3RlZFN0cmluZyhwYXR0ZXJuc1tpXSkgKyAnKTsnO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmF1bHRDb2RlKGkpIHtcbiAgcmV0dXJuICd2YXIgZGVmYXVsdCcgKyBpICsgJyA9IGRlZmF1bHRzWycgKyBpICsgJ107Jztcbn1cblxuXG5mdW5jdGlvbiByZWZWYWxDb2RlKGksIHJlZlZhbCkge1xuICByZXR1cm4gcmVmVmFsW2ldID09PSB1bmRlZmluZWQgPyAnJyA6ICd2YXIgcmVmVmFsJyArIGkgKyAnID0gcmVmVmFsWycgKyBpICsgJ107Jztcbn1cblxuXG5mdW5jdGlvbiBjdXN0b21SdWxlQ29kZShpKSB7XG4gIHJldHVybiAndmFyIGN1c3RvbVJ1bGUnICsgaSArICcgPSBjdXN0b21SdWxlc1snICsgaSArICddOyc7XG59XG5cblxuZnVuY3Rpb24gdmFycyhhcnIsIHN0YXRlbWVudCkge1xuICBpZiAoIWFyci5sZW5ndGgpIHJldHVybiAnJztcbiAgdmFyIGNvZGUgPSAnJztcbiAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKylcbiAgICBjb2RlICs9IHN0YXRlbWVudChpLCBhcnIpO1xuICByZXR1cm4gY29kZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFVSSSA9IHJlcXVpcmUoJ3VyaS1qcycpXG4gICwgZXF1YWwgPSByZXF1aXJlKCdmYXN0LWRlZXAtZXF1YWwnKVxuICAsIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKVxuICAsIFNjaGVtYU9iamVjdCA9IHJlcXVpcmUoJy4vc2NoZW1hX29iaicpXG4gICwgdHJhdmVyc2UgPSByZXF1aXJlKCdqc29uLXNjaGVtYS10cmF2ZXJzZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc29sdmU7XG5cbnJlc29sdmUubm9ybWFsaXplSWQgPSBub3JtYWxpemVJZDtcbnJlc29sdmUuZnVsbFBhdGggPSBnZXRGdWxsUGF0aDtcbnJlc29sdmUudXJsID0gcmVzb2x2ZVVybDtcbnJlc29sdmUuaWRzID0gcmVzb2x2ZUlkcztcbnJlc29sdmUuaW5saW5lUmVmID0gaW5saW5lUmVmO1xucmVzb2x2ZS5zY2hlbWEgPSByZXNvbHZlU2NoZW1hO1xuXG4vKipcbiAqIFtyZXNvbHZlIGFuZCBjb21waWxlIHRoZSByZWZlcmVuY2VzICgkcmVmKV1cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY29tcGlsZSByZWZlcmVuY2UgdG8gc2NoZW1hIGNvbXBpbGF0aW9uIGZ1bmNpdG9uIChsb2NhbENvbXBpbGUpXG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvb3Qgc2NoZW1hIGZvciB0aGUgY3VycmVudCBzY2hlbWFcbiAqIEBwYXJhbSAge1N0cmluZ30gcmVmIHJlZmVyZW5jZSB0byByZXNvbHZlXG4gKiBAcmV0dXJuIHtPYmplY3R8RnVuY3Rpb259IHNjaGVtYSBvYmplY3QgKGlmIHRoZSBzY2hlbWEgY2FuIGJlIGlubGluZWQpIG9yIHZhbGlkYXRpb24gZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZShjb21waWxlLCByb290LCByZWYpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgcmVmVmFsID0gdGhpcy5fcmVmc1tyZWZdO1xuICBpZiAodHlwZW9mIHJlZlZhbCA9PSAnc3RyaW5nJykge1xuICAgIGlmICh0aGlzLl9yZWZzW3JlZlZhbF0pIHJlZlZhbCA9IHRoaXMuX3JlZnNbcmVmVmFsXTtcbiAgICBlbHNlIHJldHVybiByZXNvbHZlLmNhbGwodGhpcywgY29tcGlsZSwgcm9vdCwgcmVmVmFsKTtcbiAgfVxuXG4gIHJlZlZhbCA9IHJlZlZhbCB8fCB0aGlzLl9zY2hlbWFzW3JlZl07XG4gIGlmIChyZWZWYWwgaW5zdGFuY2VvZiBTY2hlbWFPYmplY3QpIHtcbiAgICByZXR1cm4gaW5saW5lUmVmKHJlZlZhbC5zY2hlbWEsIHRoaXMuX29wdHMuaW5saW5lUmVmcylcbiAgICAgICAgICAgID8gcmVmVmFsLnNjaGVtYVxuICAgICAgICAgICAgOiByZWZWYWwudmFsaWRhdGUgfHwgdGhpcy5fY29tcGlsZShyZWZWYWwpO1xuICB9XG5cbiAgdmFyIHJlcyA9IHJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLCByb290LCByZWYpO1xuICB2YXIgc2NoZW1hLCB2LCBiYXNlSWQ7XG4gIGlmIChyZXMpIHtcbiAgICBzY2hlbWEgPSByZXMuc2NoZW1hO1xuICAgIHJvb3QgPSByZXMucm9vdDtcbiAgICBiYXNlSWQgPSByZXMuYmFzZUlkO1xuICB9XG5cbiAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYU9iamVjdCkge1xuICAgIHYgPSBzY2hlbWEudmFsaWRhdGUgfHwgY29tcGlsZS5jYWxsKHRoaXMsIHNjaGVtYS5zY2hlbWEsIHJvb3QsIHVuZGVmaW5lZCwgYmFzZUlkKTtcbiAgfSBlbHNlIGlmIChzY2hlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgIHYgPSBpbmxpbmVSZWYoc2NoZW1hLCB0aGlzLl9vcHRzLmlubGluZVJlZnMpXG4gICAgICAgID8gc2NoZW1hXG4gICAgICAgIDogY29tcGlsZS5jYWxsKHRoaXMsIHNjaGVtYSwgcm9vdCwgdW5kZWZpbmVkLCBiYXNlSWQpO1xuICB9XG5cbiAgcmV0dXJuIHY7XG59XG5cblxuLyoqXG4gKiBSZXNvbHZlIHNjaGVtYSwgaXRzIHJvb3QgYW5kIGJhc2VJZFxuICogQHRoaXMgQWp2XG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgcm9vdCBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHNjaGVtYSwgcmVmVmFsLCByZWZzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHJlZiAgcmVmZXJlbmNlIHRvIHJlc29sdmVcbiAqIEByZXR1cm4ge09iamVjdH0gb2JqZWN0IHdpdGggcHJvcGVydGllcyBzY2hlbWEsIHJvb3QsIGJhc2VJZFxuICovXG5mdW5jdGlvbiByZXNvbHZlU2NoZW1hKHJvb3QsIHJlZikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciBwID0gVVJJLnBhcnNlKHJlZilcbiAgICAsIHJlZlBhdGggPSBfZ2V0RnVsbFBhdGgocClcbiAgICAsIGJhc2VJZCA9IGdldEZ1bGxQYXRoKHRoaXMuX2dldElkKHJvb3Quc2NoZW1hKSk7XG4gIGlmIChPYmplY3Qua2V5cyhyb290LnNjaGVtYSkubGVuZ3RoID09PSAwIHx8IHJlZlBhdGggIT09IGJhc2VJZCkge1xuICAgIHZhciBpZCA9IG5vcm1hbGl6ZUlkKHJlZlBhdGgpO1xuICAgIHZhciByZWZWYWwgPSB0aGlzLl9yZWZzW2lkXTtcbiAgICBpZiAodHlwZW9mIHJlZlZhbCA9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlc29sdmVSZWN1cnNpdmUuY2FsbCh0aGlzLCByb290LCByZWZWYWwsIHApO1xuICAgIH0gZWxzZSBpZiAocmVmVmFsIGluc3RhbmNlb2YgU2NoZW1hT2JqZWN0KSB7XG4gICAgICBpZiAoIXJlZlZhbC52YWxpZGF0ZSkgdGhpcy5fY29tcGlsZShyZWZWYWwpO1xuICAgICAgcm9vdCA9IHJlZlZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmVmFsID0gdGhpcy5fc2NoZW1hc1tpZF07XG4gICAgICBpZiAocmVmVmFsIGluc3RhbmNlb2YgU2NoZW1hT2JqZWN0KSB7XG4gICAgICAgIGlmICghcmVmVmFsLnZhbGlkYXRlKSB0aGlzLl9jb21waWxlKHJlZlZhbCk7XG4gICAgICAgIGlmIChpZCA9PSBub3JtYWxpemVJZChyZWYpKVxuICAgICAgICAgIHJldHVybiB7IHNjaGVtYTogcmVmVmFsLCByb290OiByb290LCBiYXNlSWQ6IGJhc2VJZCB9O1xuICAgICAgICByb290ID0gcmVmVmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJvb3Quc2NoZW1hKSByZXR1cm47XG4gICAgYmFzZUlkID0gZ2V0RnVsbFBhdGgodGhpcy5fZ2V0SWQocm9vdC5zY2hlbWEpKTtcbiAgfVxuICByZXR1cm4gZ2V0SnNvblBvaW50ZXIuY2FsbCh0aGlzLCBwLCBiYXNlSWQsIHJvb3Quc2NoZW1hLCByb290KTtcbn1cblxuXG4vKiBAdGhpcyBBanYgKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWN1cnNpdmUocm9vdCwgcmVmLCBwYXJzZWRSZWYpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgcmVzID0gcmVzb2x2ZVNjaGVtYS5jYWxsKHRoaXMsIHJvb3QsIHJlZik7XG4gIGlmIChyZXMpIHtcbiAgICB2YXIgc2NoZW1hID0gcmVzLnNjaGVtYTtcbiAgICB2YXIgYmFzZUlkID0gcmVzLmJhc2VJZDtcbiAgICByb290ID0gcmVzLnJvb3Q7XG4gICAgdmFyIGlkID0gdGhpcy5fZ2V0SWQoc2NoZW1hKTtcbiAgICBpZiAoaWQpIGJhc2VJZCA9IHJlc29sdmVVcmwoYmFzZUlkLCBpZCk7XG4gICAgcmV0dXJuIGdldEpzb25Qb2ludGVyLmNhbGwodGhpcywgcGFyc2VkUmVmLCBiYXNlSWQsIHNjaGVtYSwgcm9vdCk7XG4gIH1cbn1cblxuXG52YXIgUFJFVkVOVF9TQ09QRV9DSEFOR0UgPSB1dGlsLnRvSGFzaChbJ3Byb3BlcnRpZXMnLCAncGF0dGVyblByb3BlcnRpZXMnLCAnZW51bScsICdkZXBlbmRlbmNpZXMnLCAnZGVmaW5pdGlvbnMnXSk7XG4vKiBAdGhpcyBBanYgKi9cbmZ1bmN0aW9uIGdldEpzb25Qb2ludGVyKHBhcnNlZFJlZiwgYmFzZUlkLCBzY2hlbWEsIHJvb3QpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICBwYXJzZWRSZWYuZnJhZ21lbnQgPSBwYXJzZWRSZWYuZnJhZ21lbnQgfHwgJyc7XG4gIGlmIChwYXJzZWRSZWYuZnJhZ21lbnQuc2xpY2UoMCwxKSAhPSAnLycpIHJldHVybjtcbiAgdmFyIHBhcnRzID0gcGFyc2VkUmVmLmZyYWdtZW50LnNwbGl0KCcvJyk7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQpIHtcbiAgICAgIHBhcnQgPSB1dGlsLnVuZXNjYXBlRnJhZ21lbnQocGFydCk7XG4gICAgICBzY2hlbWEgPSBzY2hlbWFbcGFydF07XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgdmFyIGlkO1xuICAgICAgaWYgKCFQUkVWRU5UX1NDT1BFX0NIQU5HRVtwYXJ0XSkge1xuICAgICAgICBpZCA9IHRoaXMuX2dldElkKHNjaGVtYSk7XG4gICAgICAgIGlmIChpZCkgYmFzZUlkID0gcmVzb2x2ZVVybChiYXNlSWQsIGlkKTtcbiAgICAgICAgaWYgKHNjaGVtYS4kcmVmKSB7XG4gICAgICAgICAgdmFyICRyZWYgPSByZXNvbHZlVXJsKGJhc2VJZCwgc2NoZW1hLiRyZWYpO1xuICAgICAgICAgIHZhciByZXMgPSByZXNvbHZlU2NoZW1hLmNhbGwodGhpcywgcm9vdCwgJHJlZik7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgc2NoZW1hID0gcmVzLnNjaGVtYTtcbiAgICAgICAgICAgIHJvb3QgPSByZXMucm9vdDtcbiAgICAgICAgICAgIGJhc2VJZCA9IHJlcy5iYXNlSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiBzY2hlbWEgIT09IHJvb3Quc2NoZW1hKVxuICAgIHJldHVybiB7IHNjaGVtYTogc2NoZW1hLCByb290OiByb290LCBiYXNlSWQ6IGJhc2VJZCB9O1xufVxuXG5cbnZhciBTSU1QTEVfSU5MSU5FRCA9IHV0aWwudG9IYXNoKFtcbiAgJ3R5cGUnLCAnZm9ybWF0JywgJ3BhdHRlcm4nLFxuICAnbWF4TGVuZ3RoJywgJ21pbkxlbmd0aCcsXG4gICdtYXhQcm9wZXJ0aWVzJywgJ21pblByb3BlcnRpZXMnLFxuICAnbWF4SXRlbXMnLCAnbWluSXRlbXMnLFxuICAnbWF4aW11bScsICdtaW5pbXVtJyxcbiAgJ3VuaXF1ZUl0ZW1zJywgJ211bHRpcGxlT2YnLFxuICAncmVxdWlyZWQnLCAnZW51bSdcbl0pO1xuZnVuY3Rpb24gaW5saW5lUmVmKHNjaGVtYSwgbGltaXQpIHtcbiAgaWYgKGxpbWl0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCB8fCBsaW1pdCA9PT0gdHJ1ZSkgcmV0dXJuIGNoZWNrTm9SZWYoc2NoZW1hKTtcbiAgZWxzZSBpZiAobGltaXQpIHJldHVybiBjb3VudEtleXMoc2NoZW1hKSA8PSBsaW1pdDtcbn1cblxuXG5mdW5jdGlvbiBjaGVja05vUmVmKHNjaGVtYSkge1xuICB2YXIgaXRlbTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGZvciAodmFyIGk9MDsgaTxzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBzY2hlbWFbaV07XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gJ29iamVjdCcgJiYgIWNoZWNrTm9SZWYoaXRlbSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNjaGVtYSkge1xuICAgICAgaWYgKGtleSA9PSAnJHJlZicpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ZW0gPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PSAnb2JqZWN0JyAmJiAhY2hlY2tOb1JlZihpdGVtKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiBjb3VudEtleXMoc2NoZW1hKSB7XG4gIHZhciBjb3VudCA9IDAsIGl0ZW07XG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICBmb3IgKHZhciBpPTA7IGk8c2NoZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gc2NoZW1hW2ldO1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdvYmplY3QnKSBjb3VudCArPSBjb3VudEtleXMoaXRlbSk7XG4gICAgICBpZiAoY291bnQgPT0gSW5maW5pdHkpIHJldHVybiBJbmZpbml0eTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNjaGVtYSkge1xuICAgICAgaWYgKGtleSA9PSAnJHJlZicpIHJldHVybiBJbmZpbml0eTtcbiAgICAgIGlmIChTSU1QTEVfSU5MSU5FRFtrZXldKSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtID0gc2NoZW1hW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PSAnb2JqZWN0JykgY291bnQgKz0gY291bnRLZXlzKGl0ZW0pICsgMTtcbiAgICAgICAgaWYgKGNvdW50ID09IEluZmluaXR5KSByZXR1cm4gSW5maW5pdHk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3VudDtcbn1cblxuXG5mdW5jdGlvbiBnZXRGdWxsUGF0aChpZCwgbm9ybWFsaXplKSB7XG4gIGlmIChub3JtYWxpemUgIT09IGZhbHNlKSBpZCA9IG5vcm1hbGl6ZUlkKGlkKTtcbiAgdmFyIHAgPSBVUkkucGFyc2UoaWQpO1xuICByZXR1cm4gX2dldEZ1bGxQYXRoKHApO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRGdWxsUGF0aChwKSB7XG4gIHJldHVybiBVUkkuc2VyaWFsaXplKHApLnNwbGl0KCcjJylbMF0gKyAnIyc7XG59XG5cblxudmFyIFRSQUlMSU5HX1NMQVNIX0hBU0ggPSAvI1xcLz8kLztcbmZ1bmN0aW9uIG5vcm1hbGl6ZUlkKGlkKSB7XG4gIHJldHVybiBpZCA/IGlkLnJlcGxhY2UoVFJBSUxJTkdfU0xBU0hfSEFTSCwgJycpIDogJyc7XG59XG5cblxuZnVuY3Rpb24gcmVzb2x2ZVVybChiYXNlSWQsIGlkKSB7XG4gIGlkID0gbm9ybWFsaXplSWQoaWQpO1xuICByZXR1cm4gVVJJLnJlc29sdmUoYmFzZUlkLCBpZCk7XG59XG5cblxuLyogQHRoaXMgQWp2ICovXG5mdW5jdGlvbiByZXNvbHZlSWRzKHNjaGVtYSkge1xuICB2YXIgc2NoZW1hSWQgPSBub3JtYWxpemVJZCh0aGlzLl9nZXRJZChzY2hlbWEpKTtcbiAgdmFyIGJhc2VJZHMgPSB7Jyc6IHNjaGVtYUlkfTtcbiAgdmFyIGZ1bGxQYXRocyA9IHsnJzogZ2V0RnVsbFBhdGgoc2NoZW1hSWQsIGZhbHNlKX07XG4gIHZhciBsb2NhbFJlZnMgPSB7fTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHRyYXZlcnNlKHNjaGVtYSwge2FsbEtleXM6IHRydWV9LCBmdW5jdGlvbihzY2gsIGpzb25QdHIsIHJvb3RTY2hlbWEsIHBhcmVudEpzb25QdHIsIHBhcmVudEtleXdvcmQsIHBhcmVudFNjaGVtYSwga2V5SW5kZXgpIHtcbiAgICBpZiAoanNvblB0ciA9PT0gJycpIHJldHVybjtcbiAgICB2YXIgaWQgPSBzZWxmLl9nZXRJZChzY2gpO1xuICAgIHZhciBiYXNlSWQgPSBiYXNlSWRzW3BhcmVudEpzb25QdHJdO1xuICAgIHZhciBmdWxsUGF0aCA9IGZ1bGxQYXRoc1twYXJlbnRKc29uUHRyXSArICcvJyArIHBhcmVudEtleXdvcmQ7XG4gICAgaWYgKGtleUluZGV4ICE9PSB1bmRlZmluZWQpXG4gICAgICBmdWxsUGF0aCArPSAnLycgKyAodHlwZW9mIGtleUluZGV4ID09ICdudW1iZXInID8ga2V5SW5kZXggOiB1dGlsLmVzY2FwZUZyYWdtZW50KGtleUluZGV4KSk7XG5cbiAgICBpZiAodHlwZW9mIGlkID09ICdzdHJpbmcnKSB7XG4gICAgICBpZCA9IGJhc2VJZCA9IG5vcm1hbGl6ZUlkKGJhc2VJZCA/IFVSSS5yZXNvbHZlKGJhc2VJZCwgaWQpIDogaWQpO1xuXG4gICAgICB2YXIgcmVmVmFsID0gc2VsZi5fcmVmc1tpZF07XG4gICAgICBpZiAodHlwZW9mIHJlZlZhbCA9PSAnc3RyaW5nJykgcmVmVmFsID0gc2VsZi5fcmVmc1tyZWZWYWxdO1xuICAgICAgaWYgKHJlZlZhbCAmJiByZWZWYWwuc2NoZW1hKSB7XG4gICAgICAgIGlmICghZXF1YWwoc2NoLCByZWZWYWwuc2NoZW1hKSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIFwiJyArIGlkICsgJ1wiIHJlc29sdmVzIHRvIG1vcmUgdGhhbiBvbmUgc2NoZW1hJyk7XG4gICAgICB9IGVsc2UgaWYgKGlkICE9IG5vcm1hbGl6ZUlkKGZ1bGxQYXRoKSkge1xuICAgICAgICBpZiAoaWRbMF0gPT0gJyMnKSB7XG4gICAgICAgICAgaWYgKGxvY2FsUmVmc1tpZF0gJiYgIWVxdWFsKHNjaCwgbG9jYWxSZWZzW2lkXSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIFwiJyArIGlkICsgJ1wiIHJlc29sdmVzIHRvIG1vcmUgdGhhbiBvbmUgc2NoZW1hJyk7XG4gICAgICAgICAgbG9jYWxSZWZzW2lkXSA9IHNjaDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLl9yZWZzW2lkXSA9IGZ1bGxQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJhc2VJZHNbanNvblB0cl0gPSBiYXNlSWQ7XG4gICAgZnVsbFBhdGhzW2pzb25QdHJdID0gZnVsbFBhdGg7XG4gIH0pO1xuXG4gIHJldHVybiBsb2NhbFJlZnM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBydWxlTW9kdWxlcyA9IHJlcXVpcmUoJy4uL2RvdGpzJylcbiAgLCB0b0hhc2ggPSByZXF1aXJlKCcuL3V0aWwnKS50b0hhc2g7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcnVsZXMoKSB7XG4gIHZhciBSVUxFUyA9IFtcbiAgICB7IHR5cGU6ICdudW1iZXInLFxuICAgICAgcnVsZXM6IFsgeyAnbWF4aW11bSc6IFsnZXhjbHVzaXZlTWF4aW11bSddIH0sXG4gICAgICAgICAgICAgICB7ICdtaW5pbXVtJzogWydleGNsdXNpdmVNaW5pbXVtJ10gfSwgJ211bHRpcGxlT2YnLCAnZm9ybWF0J10gfSxcbiAgICB7IHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcnVsZXM6IFsgJ21heExlbmd0aCcsICdtaW5MZW5ndGgnLCAncGF0dGVybicsICdmb3JtYXQnIF0gfSxcbiAgICB7IHR5cGU6ICdhcnJheScsXG4gICAgICBydWxlczogWyAnbWF4SXRlbXMnLCAnbWluSXRlbXMnLCAnaXRlbXMnLCAnY29udGFpbnMnLCAndW5pcXVlSXRlbXMnIF0gfSxcbiAgICB7IHR5cGU6ICdvYmplY3QnLFxuICAgICAgcnVsZXM6IFsgJ21heFByb3BlcnRpZXMnLCAnbWluUHJvcGVydGllcycsICdyZXF1aXJlZCcsICdkZXBlbmRlbmNpZXMnLCAncHJvcGVydHlOYW1lcycsXG4gICAgICAgICAgICAgICB7ICdwcm9wZXJ0aWVzJzogWydhZGRpdGlvbmFsUHJvcGVydGllcycsICdwYXR0ZXJuUHJvcGVydGllcyddIH0gXSB9LFxuICAgIHsgcnVsZXM6IFsgJyRyZWYnLCAnY29uc3QnLCAnZW51bScsICdub3QnLCAnYW55T2YnLCAnb25lT2YnLCAnYWxsT2YnLCAnaWYnIF0gfVxuICBdO1xuXG4gIHZhciBBTEwgPSBbICd0eXBlJywgJyRjb21tZW50JyBdO1xuICB2YXIgS0VZV09SRFMgPSBbXG4gICAgJyRzY2hlbWEnLCAnJGlkJywgJ2lkJywgJyRkYXRhJywgJyRhc3luYycsICd0aXRsZScsXG4gICAgJ2Rlc2NyaXB0aW9uJywgJ2RlZmF1bHQnLCAnZGVmaW5pdGlvbnMnLFxuICAgICdleGFtcGxlcycsICdyZWFkT25seScsICd3cml0ZU9ubHknLFxuICAgICdjb250ZW50TWVkaWFUeXBlJywgJ2NvbnRlbnRFbmNvZGluZycsXG4gICAgJ2FkZGl0aW9uYWxJdGVtcycsICd0aGVuJywgJ2Vsc2UnXG4gIF07XG4gIHZhciBUWVBFUyA9IFsgJ251bWJlcicsICdpbnRlZ2VyJywgJ3N0cmluZycsICdhcnJheScsICdvYmplY3QnLCAnYm9vbGVhbicsICdudWxsJyBdO1xuICBSVUxFUy5hbGwgPSB0b0hhc2goQUxMKTtcbiAgUlVMRVMudHlwZXMgPSB0b0hhc2goVFlQRVMpO1xuXG4gIFJVTEVTLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgZ3JvdXAucnVsZXMgPSBncm91cC5ydWxlcy5tYXAoZnVuY3Rpb24gKGtleXdvcmQpIHtcbiAgICAgIHZhciBpbXBsS2V5d29yZHM7XG4gICAgICBpZiAodHlwZW9mIGtleXdvcmQgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGtleSA9IE9iamVjdC5rZXlzKGtleXdvcmQpWzBdO1xuICAgICAgICBpbXBsS2V5d29yZHMgPSBrZXl3b3JkW2tleV07XG4gICAgICAgIGtleXdvcmQgPSBrZXk7XG4gICAgICAgIGltcGxLZXl3b3Jkcy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgQUxMLnB1c2goayk7XG4gICAgICAgICAgUlVMRVMuYWxsW2tdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBBTEwucHVzaChrZXl3b3JkKTtcbiAgICAgIHZhciBydWxlID0gUlVMRVMuYWxsW2tleXdvcmRdID0ge1xuICAgICAgICBrZXl3b3JkOiBrZXl3b3JkLFxuICAgICAgICBjb2RlOiBydWxlTW9kdWxlc1trZXl3b3JkXSxcbiAgICAgICAgaW1wbGVtZW50czogaW1wbEtleXdvcmRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgfSk7XG5cbiAgICBSVUxFUy5hbGwuJGNvbW1lbnQgPSB7XG4gICAgICBrZXl3b3JkOiAnJGNvbW1lbnQnLFxuICAgICAgY29kZTogcnVsZU1vZHVsZXMuJGNvbW1lbnRcbiAgICB9O1xuXG4gICAgaWYgKGdyb3VwLnR5cGUpIFJVTEVTLnR5cGVzW2dyb3VwLnR5cGVdID0gZ3JvdXA7XG4gIH0pO1xuXG4gIFJVTEVTLmtleXdvcmRzID0gdG9IYXNoKEFMTC5jb25jYXQoS0VZV09SRFMpKTtcbiAgUlVMRVMuY3VzdG9tID0ge307XG5cbiAgcmV0dXJuIFJVTEVTO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWFPYmplY3Q7XG5cbmZ1bmN0aW9uIFNjaGVtYU9iamVjdChvYmopIHtcbiAgdXRpbC5jb3B5KG9iaiwgdGhpcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvcHVueWNvZGUuanMgLSBwdW55Y29kZS51Y3MyLmRlY29kZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1Y3MybGVuZ3RoKHN0cikge1xuICB2YXIgbGVuZ3RoID0gMFxuICAgICwgbGVuID0gc3RyLmxlbmd0aFxuICAgICwgcG9zID0gMFxuICAgICwgdmFsdWU7XG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBsZW5ndGgrKztcbiAgICB2YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KHBvcysrKTtcbiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBwb3MgPCBsZW4pIHtcbiAgICAgIC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuICAgICAgdmFsdWUgPSBzdHIuY2hhckNvZGVBdChwb3MpO1xuICAgICAgaWYgKCh2YWx1ZSAmIDB4RkMwMCkgPT0gMHhEQzAwKSBwb3MrKzsgLy8gbG93IHN1cnJvZ2F0ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29weTogY29weSxcbiAgY2hlY2tEYXRhVHlwZTogY2hlY2tEYXRhVHlwZSxcbiAgY2hlY2tEYXRhVHlwZXM6IGNoZWNrRGF0YVR5cGVzLFxuICBjb2VyY2VUb1R5cGVzOiBjb2VyY2VUb1R5cGVzLFxuICB0b0hhc2g6IHRvSGFzaCxcbiAgZ2V0UHJvcGVydHk6IGdldFByb3BlcnR5LFxuICBlc2NhcGVRdW90ZXM6IGVzY2FwZVF1b3RlcyxcbiAgZXF1YWw6IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpLFxuICB1Y3MybGVuZ3RoOiByZXF1aXJlKCcuL3VjczJsZW5ndGgnKSxcbiAgdmFyT2NjdXJlbmNlczogdmFyT2NjdXJlbmNlcyxcbiAgdmFyUmVwbGFjZTogdmFyUmVwbGFjZSxcbiAgc2NoZW1hSGFzUnVsZXM6IHNjaGVtYUhhc1J1bGVzLFxuICBzY2hlbWFIYXNSdWxlc0V4Y2VwdDogc2NoZW1hSGFzUnVsZXNFeGNlcHQsXG4gIHNjaGVtYVVua25vd25SdWxlczogc2NoZW1hVW5rbm93blJ1bGVzLFxuICB0b1F1b3RlZFN0cmluZzogdG9RdW90ZWRTdHJpbmcsXG4gIGdldFBhdGhFeHByOiBnZXRQYXRoRXhwcixcbiAgZ2V0UGF0aDogZ2V0UGF0aCxcbiAgZ2V0RGF0YTogZ2V0RGF0YSxcbiAgdW5lc2NhcGVGcmFnbWVudDogdW5lc2NhcGVGcmFnbWVudCxcbiAgdW5lc2NhcGVKc29uUG9pbnRlcjogdW5lc2NhcGVKc29uUG9pbnRlcixcbiAgZXNjYXBlRnJhZ21lbnQ6IGVzY2FwZUZyYWdtZW50LFxuICBlc2NhcGVKc29uUG9pbnRlcjogZXNjYXBlSnNvblBvaW50ZXJcbn07XG5cblxuZnVuY3Rpb24gY29weShvLCB0bykge1xuICB0byA9IHRvIHx8IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gbykgdG9ba2V5XSA9IG9ba2V5XTtcbiAgcmV0dXJuIHRvO1xufVxuXG5cbmZ1bmN0aW9uIGNoZWNrRGF0YVR5cGUoZGF0YVR5cGUsIGRhdGEsIHN0cmljdE51bWJlcnMsIG5lZ2F0ZSkge1xuICB2YXIgRVFVQUwgPSBuZWdhdGUgPyAnICE9PSAnIDogJyA9PT0gJ1xuICAgICwgQU5EID0gbmVnYXRlID8gJyB8fCAnIDogJyAmJiAnXG4gICAgLCBPSyA9IG5lZ2F0ZSA/ICchJyA6ICcnXG4gICAgLCBOT1QgPSBuZWdhdGUgPyAnJyA6ICchJztcbiAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgIGNhc2UgJ251bGwnOiByZXR1cm4gZGF0YSArIEVRVUFMICsgJ251bGwnO1xuICAgIGNhc2UgJ2FycmF5JzogcmV0dXJuIE9LICsgJ0FycmF5LmlzQXJyYXkoJyArIGRhdGEgKyAnKSc7XG4gICAgY2FzZSAnb2JqZWN0JzogcmV0dXJuICcoJyArIE9LICsgZGF0YSArIEFORCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlb2YgJyArIGRhdGEgKyBFUVVBTCArICdcIm9iamVjdFwiJyArIEFORCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIE5PVCArICdBcnJheS5pc0FycmF5KCcgKyBkYXRhICsgJykpJztcbiAgICBjYXNlICdpbnRlZ2VyJzogcmV0dXJuICcodHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCJudW1iZXJcIicgKyBBTkQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UICsgJygnICsgZGF0YSArICcgJSAxKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EICsgZGF0YSArIEVRVUFMICsgZGF0YSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaWN0TnVtYmVycyA/IChBTkQgKyBPSyArICdpc0Zpbml0ZSgnICsgZGF0YSArICcpJykgOiAnJykgKyAnKSc7XG4gICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuICcodHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCInICsgZGF0YVR5cGUgKyAnXCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmljdE51bWJlcnMgPyAoQU5EICsgT0sgKyAnaXNGaW5pdGUoJyArIGRhdGEgKyAnKScpIDogJycpICsgJyknO1xuICAgIGRlZmF1bHQ6IHJldHVybiAndHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCInICsgZGF0YVR5cGUgKyAnXCInO1xuICB9XG59XG5cblxuZnVuY3Rpb24gY2hlY2tEYXRhVHlwZXMoZGF0YVR5cGVzLCBkYXRhLCBzdHJpY3ROdW1iZXJzKSB7XG4gIHN3aXRjaCAoZGF0YVR5cGVzLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGNoZWNrRGF0YVR5cGUoZGF0YVR5cGVzWzBdLCBkYXRhLCBzdHJpY3ROdW1iZXJzLCB0cnVlKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGNvZGUgPSAnJztcbiAgICAgIHZhciB0eXBlcyA9IHRvSGFzaChkYXRhVHlwZXMpO1xuICAgICAgaWYgKHR5cGVzLmFycmF5ICYmIHR5cGVzLm9iamVjdCkge1xuICAgICAgICBjb2RlID0gdHlwZXMubnVsbCA/ICcoJzogJyghJyArIGRhdGEgKyAnIHx8ICc7XG4gICAgICAgIGNvZGUgKz0gJ3R5cGVvZiAnICsgZGF0YSArICcgIT09IFwib2JqZWN0XCIpJztcbiAgICAgICAgZGVsZXRlIHR5cGVzLm51bGw7XG4gICAgICAgIGRlbGV0ZSB0eXBlcy5hcnJheTtcbiAgICAgICAgZGVsZXRlIHR5cGVzLm9iamVjdDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlcy5udW1iZXIpIGRlbGV0ZSB0eXBlcy5pbnRlZ2VyO1xuICAgICAgZm9yICh2YXIgdCBpbiB0eXBlcylcbiAgICAgICAgY29kZSArPSAoY29kZSA/ICcgJiYgJyA6ICcnICkgKyBjaGVja0RhdGFUeXBlKHQsIGRhdGEsIHN0cmljdE51bWJlcnMsIHRydWUpO1xuXG4gICAgICByZXR1cm4gY29kZTtcbiAgfVxufVxuXG5cbnZhciBDT0VSQ0VfVE9fVFlQRVMgPSB0b0hhc2goWyAnc3RyaW5nJywgJ251bWJlcicsICdpbnRlZ2VyJywgJ2Jvb2xlYW4nLCAnbnVsbCcgXSk7XG5mdW5jdGlvbiBjb2VyY2VUb1R5cGVzKG9wdGlvbkNvZXJjZVR5cGVzLCBkYXRhVHlwZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVR5cGVzKSkge1xuICAgIHZhciB0eXBlcyA9IFtdO1xuICAgIGZvciAodmFyIGk9MDsgaTxkYXRhVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0ID0gZGF0YVR5cGVzW2ldO1xuICAgICAgaWYgKENPRVJDRV9UT19UWVBFU1t0XSkgdHlwZXNbdHlwZXMubGVuZ3RoXSA9IHQ7XG4gICAgICBlbHNlIGlmIChvcHRpb25Db2VyY2VUeXBlcyA9PT0gJ2FycmF5JyAmJiB0ID09PSAnYXJyYXknKSB0eXBlc1t0eXBlcy5sZW5ndGhdID0gdDtcbiAgICB9XG4gICAgaWYgKHR5cGVzLmxlbmd0aCkgcmV0dXJuIHR5cGVzO1xuICB9IGVsc2UgaWYgKENPRVJDRV9UT19UWVBFU1tkYXRhVHlwZXNdKSB7XG4gICAgcmV0dXJuIFtkYXRhVHlwZXNdO1xuICB9IGVsc2UgaWYgKG9wdGlvbkNvZXJjZVR5cGVzID09PSAnYXJyYXknICYmIGRhdGFUeXBlcyA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBbJ2FycmF5J107XG4gIH1cbn1cblxuXG5mdW5jdGlvbiB0b0hhc2goYXJyKSB7XG4gIHZhciBoYXNoID0ge307XG4gIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIGhhc2hbYXJyW2ldXSA9IHRydWU7XG4gIHJldHVybiBoYXNoO1xufVxuXG5cbnZhciBJREVOVElGSUVSID0gL15bYS16JF9dW2EteiRfMC05XSokL2k7XG52YXIgU0lOR0xFX1FVT1RFID0gLyd8XFxcXC9nO1xuZnVuY3Rpb24gZ2V0UHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiB0eXBlb2Yga2V5ID09ICdudW1iZXInXG4gICAgICAgICAgPyAnWycgKyBrZXkgKyAnXSdcbiAgICAgICAgICA6IElERU5USUZJRVIudGVzdChrZXkpXG4gICAgICAgICAgICA/ICcuJyArIGtleVxuICAgICAgICAgICAgOiBcIlsnXCIgKyBlc2NhcGVRdW90ZXMoa2V5KSArIFwiJ11cIjtcbn1cblxuXG5mdW5jdGlvbiBlc2NhcGVRdW90ZXMoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShTSU5HTEVfUVVPVEUsICdcXFxcJCYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCAnXFxcXHQnKTtcbn1cblxuXG5mdW5jdGlvbiB2YXJPY2N1cmVuY2VzKHN0ciwgZGF0YVZhcikge1xuICBkYXRhVmFyICs9ICdbXjAtOV0nO1xuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChuZXcgUmVnRXhwKGRhdGFWYXIsICdnJykpO1xuICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbn1cblxuXG5mdW5jdGlvbiB2YXJSZXBsYWNlKHN0ciwgZGF0YVZhciwgZXhwcikge1xuICBkYXRhVmFyICs9ICcoW14wLTldKSc7XG4gIGV4cHIgPSBleHByLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpO1xuICByZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cChkYXRhVmFyLCAnZycpLCBleHByICsgJyQxJyk7XG59XG5cblxuZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXMoc2NoZW1hLCBydWxlcykge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybiAhc2NoZW1hO1xuICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSBpZiAocnVsZXNba2V5XSkgcmV0dXJuIHRydWU7XG59XG5cblxuZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXNFeGNlcHQoc2NoZW1hLCBydWxlcywgZXhjZXB0S2V5d29yZCkge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybiAhc2NoZW1hICYmIGV4Y2VwdEtleXdvcmQgIT0gJ25vdCc7XG4gIGZvciAodmFyIGtleSBpbiBzY2hlbWEpIGlmIChrZXkgIT0gZXhjZXB0S2V5d29yZCAmJiBydWxlc1trZXldKSByZXR1cm4gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiBzY2hlbWFVbmtub3duUnVsZXMoc2NoZW1hLCBydWxlcykge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybjtcbiAgZm9yICh2YXIga2V5IGluIHNjaGVtYSkgaWYgKCFydWxlc1trZXldKSByZXR1cm4ga2V5O1xufVxuXG5cbmZ1bmN0aW9uIHRvUXVvdGVkU3RyaW5nKHN0cikge1xuICByZXR1cm4gJ1xcJycgKyBlc2NhcGVRdW90ZXMoc3RyKSArICdcXCcnO1xufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGhFeHByKGN1cnJlbnRQYXRoLCBleHByLCBqc29uUG9pbnRlcnMsIGlzTnVtYmVyKSB7XG4gIHZhciBwYXRoID0ganNvblBvaW50ZXJzIC8vIGZhbHNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgPyAnXFwnL1xcJyArICcgKyBleHByICsgKGlzTnVtYmVyID8gJycgOiAnLnJlcGxhY2UoL34vZywgXFwnfjBcXCcpLnJlcGxhY2UoL1xcXFwvL2csIFxcJ34xXFwnKScpXG4gICAgICAgICAgICAgIDogKGlzTnVtYmVyID8gJ1xcJ1tcXCcgKyAnICsgZXhwciArICcgKyBcXCddXFwnJyA6ICdcXCdbXFxcXFxcJ1xcJyArICcgKyBleHByICsgJyArIFxcJ1xcXFxcXCddXFwnJyk7XG4gIHJldHVybiBqb2luUGF0aHMoY3VycmVudFBhdGgsIHBhdGgpO1xufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGgoY3VycmVudFBhdGgsIHByb3AsIGpzb25Qb2ludGVycykge1xuICB2YXIgcGF0aCA9IGpzb25Qb2ludGVycyAvLyBmYWxzZSBieSBkZWZhdWx0XG4gICAgICAgICAgICAgID8gdG9RdW90ZWRTdHJpbmcoJy8nICsgZXNjYXBlSnNvblBvaW50ZXIocHJvcCkpXG4gICAgICAgICAgICAgIDogdG9RdW90ZWRTdHJpbmcoZ2V0UHJvcGVydHkocHJvcCkpO1xuICByZXR1cm4gam9pblBhdGhzKGN1cnJlbnRQYXRoLCBwYXRoKTtcbn1cblxuXG52YXIgSlNPTl9QT0lOVEVSID0gL15cXC8oPzpbXn5dfH4wfH4xKSokLztcbnZhciBSRUxBVElWRV9KU09OX1BPSU5URVIgPSAvXihbMC05XSspKCN8XFwvKD86W15+XXx+MHx+MSkqKT8kLztcbmZ1bmN0aW9uIGdldERhdGEoJGRhdGEsIGx2bCwgcGF0aHMpIHtcbiAgdmFyIHVwLCBqc29uUG9pbnRlciwgZGF0YSwgbWF0Y2hlcztcbiAgaWYgKCRkYXRhID09PSAnJykgcmV0dXJuICdyb290RGF0YSc7XG4gIGlmICgkZGF0YVswXSA9PSAnLycpIHtcbiAgICBpZiAoIUpTT05fUE9JTlRFUi50ZXN0KCRkYXRhKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04tcG9pbnRlcjogJyArICRkYXRhKTtcbiAgICBqc29uUG9pbnRlciA9ICRkYXRhO1xuICAgIGRhdGEgPSAncm9vdERhdGEnO1xuICB9IGVsc2Uge1xuICAgIG1hdGNoZXMgPSAkZGF0YS5tYXRjaChSRUxBVElWRV9KU09OX1BPSU5URVIpO1xuICAgIGlmICghbWF0Y2hlcykgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04tcG9pbnRlcjogJyArICRkYXRhKTtcbiAgICB1cCA9ICttYXRjaGVzWzFdO1xuICAgIGpzb25Qb2ludGVyID0gbWF0Y2hlc1syXTtcbiAgICBpZiAoanNvblBvaW50ZXIgPT0gJyMnKSB7XG4gICAgICBpZiAodXAgPj0gbHZsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3MgcHJvcGVydHkvaW5kZXggJyArIHVwICsgJyBsZXZlbHMgdXAsIGN1cnJlbnQgbGV2ZWwgaXMgJyArIGx2bCk7XG4gICAgICByZXR1cm4gcGF0aHNbbHZsIC0gdXBdO1xuICAgIH1cblxuICAgIGlmICh1cCA+IGx2bCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIGRhdGEgJyArIHVwICsgJyBsZXZlbHMgdXAsIGN1cnJlbnQgbGV2ZWwgaXMgJyArIGx2bCk7XG4gICAgZGF0YSA9ICdkYXRhJyArICgobHZsIC0gdXApIHx8ICcnKTtcbiAgICBpZiAoIWpzb25Qb2ludGVyKSByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBleHByID0gZGF0YTtcbiAgdmFyIHNlZ21lbnRzID0ganNvblBvaW50ZXIuc3BsaXQoJy8nKTtcbiAgZm9yICh2YXIgaT0wOyBpPHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgZGF0YSArPSBnZXRQcm9wZXJ0eSh1bmVzY2FwZUpzb25Qb2ludGVyKHNlZ21lbnQpKTtcbiAgICAgIGV4cHIgKz0gJyAmJiAnICsgZGF0YTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4cHI7XG59XG5cblxuZnVuY3Rpb24gam9pblBhdGhzIChhLCBiKSB7XG4gIGlmIChhID09ICdcIlwiJykgcmV0dXJuIGI7XG4gIHJldHVybiAoYSArICcgKyAnICsgYikucmVwbGFjZSgvKFteXFxcXF0pJyBcXCsgJy9nLCAnJDEnKTtcbn1cblxuXG5mdW5jdGlvbiB1bmVzY2FwZUZyYWdtZW50KHN0cikge1xuICByZXR1cm4gdW5lc2NhcGVKc29uUG9pbnRlcihkZWNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5cblxuZnVuY3Rpb24gZXNjYXBlRnJhZ21lbnQoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZXNjYXBlSnNvblBvaW50ZXIoc3RyKSk7XG59XG5cblxuZnVuY3Rpb24gZXNjYXBlSnNvblBvaW50ZXIoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XG59XG5cblxuZnVuY3Rpb24gdW5lc2NhcGVKc29uUG9pbnRlcihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9+MS9nLCAnLycpLnJlcGxhY2UoL34wL2csICd+Jyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBLRVlXT1JEUyA9IFtcbiAgJ211bHRpcGxlT2YnLFxuICAnbWF4aW11bScsXG4gICdleGNsdXNpdmVNYXhpbXVtJyxcbiAgJ21pbmltdW0nLFxuICAnZXhjbHVzaXZlTWluaW11bScsXG4gICdtYXhMZW5ndGgnLFxuICAnbWluTGVuZ3RoJyxcbiAgJ3BhdHRlcm4nLFxuICAnYWRkaXRpb25hbEl0ZW1zJyxcbiAgJ21heEl0ZW1zJyxcbiAgJ21pbkl0ZW1zJyxcbiAgJ3VuaXF1ZUl0ZW1zJyxcbiAgJ21heFByb3BlcnRpZXMnLFxuICAnbWluUHJvcGVydGllcycsXG4gICdyZXF1aXJlZCcsXG4gICdhZGRpdGlvbmFsUHJvcGVydGllcycsXG4gICdlbnVtJyxcbiAgJ2Zvcm1hdCcsXG4gICdjb25zdCdcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGFTY2hlbWEsIGtleXdvcmRzSnNvblBvaW50ZXJzKSB7XG4gIGZvciAodmFyIGk9MDsgaTxrZXl3b3Jkc0pzb25Qb2ludGVycy5sZW5ndGg7IGkrKykge1xuICAgIG1ldGFTY2hlbWEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1ldGFTY2hlbWEpKTtcbiAgICB2YXIgc2VnbWVudHMgPSBrZXl3b3Jkc0pzb25Qb2ludGVyc1tpXS5zcGxpdCgnLycpO1xuICAgIHZhciBrZXl3b3JkcyA9IG1ldGFTY2hlbWE7XG4gICAgdmFyIGo7XG4gICAgZm9yIChqPTE7IGo8c2VnbWVudHMubGVuZ3RoOyBqKyspXG4gICAgICBrZXl3b3JkcyA9IGtleXdvcmRzW3NlZ21lbnRzW2pdXTtcblxuICAgIGZvciAoaj0wOyBqPEtFWVdPUkRTLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIga2V5ID0gS0VZV09SRFNbal07XG4gICAgICB2YXIgc2NoZW1hID0ga2V5d29yZHNba2V5XTtcbiAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAga2V5d29yZHNba2V5XSA9IHtcbiAgICAgICAgICBhbnlPZjogW1xuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgeyAkcmVmOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXRhU2NoZW1hO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1ldGFTY2hlbWEgPSByZXF1aXJlKCcuL3JlZnMvanNvbi1zY2hlbWEtZHJhZnQtMDcuanNvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJGlkOiAnaHR0cHM6Ly9naXRodWIuY29tL2Fqdi12YWxpZGF0b3IvYWp2L2Jsb2IvbWFzdGVyL2xpYi9kZWZpbml0aW9uX3NjaGVtYS5qcycsXG4gIGRlZmluaXRpb25zOiB7XG4gICAgc2ltcGxlVHlwZXM6IG1ldGFTY2hlbWEuZGVmaW5pdGlvbnMuc2ltcGxlVHlwZXNcbiAgfSxcbiAgdHlwZTogJ29iamVjdCcsXG4gIGRlcGVuZGVuY2llczoge1xuICAgIHNjaGVtYTogWyd2YWxpZGF0ZSddLFxuICAgICRkYXRhOiBbJ3ZhbGlkYXRlJ10sXG4gICAgc3RhdGVtZW50czogWydpbmxpbmUnXSxcbiAgICB2YWxpZDoge25vdDoge3JlcXVpcmVkOiBbJ21hY3JvJ119fVxuICB9LFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgdHlwZTogbWV0YVNjaGVtYS5wcm9wZXJ0aWVzLnR5cGUsXG4gICAgc2NoZW1hOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICBzdGF0ZW1lbnRzOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBpdGVtczoge3R5cGU6ICdzdHJpbmcnfVxuICAgIH0sXG4gICAgbWV0YVNjaGVtYToge3R5cGU6ICdvYmplY3QnfSxcbiAgICBtb2RpZnlpbmc6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIHZhbGlkOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICAkZGF0YToge3R5cGU6ICdib29sZWFuJ30sXG4gICAgYXN5bmM6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIGVycm9yczoge1xuICAgICAgYW55T2Y6IFtcbiAgICAgICAge3R5cGU6ICdib29sZWFuJ30sXG4gICAgICAgIHtjb25zdDogJ2Z1bGwnfVxuICAgICAgXVxuICAgIH1cbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfX2xpbWl0KGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICRpc01heCA9ICRrZXl3b3JkID09ICdtYXhpbXVtJyxcbiAgICAkZXhjbHVzaXZlS2V5d29yZCA9ICRpc01heCA/ICdleGNsdXNpdmVNYXhpbXVtJyA6ICdleGNsdXNpdmVNaW5pbXVtJyxcbiAgICAkc2NoZW1hRXhjbCA9IGl0LnNjaGVtYVskZXhjbHVzaXZlS2V5d29yZF0sXG4gICAgJGlzRGF0YUV4Y2wgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWFFeGNsICYmICRzY2hlbWFFeGNsLiRkYXRhLFxuICAgICRvcCA9ICRpc01heCA/ICc8JyA6ICc+JyxcbiAgICAkbm90T3AgPSAkaXNNYXggPyAnPicgOiAnPCcsXG4gICAgJGVycm9yS2V5d29yZCA9IHVuZGVmaW5lZDtcbiAgaWYgKCEoJGlzRGF0YSB8fCB0eXBlb2YgJHNjaGVtYSA9PSAnbnVtYmVyJyB8fCAkc2NoZW1hID09PSB1bmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRrZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghKCRpc0RhdGFFeGNsIHx8ICRzY2hlbWFFeGNsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mICRzY2hlbWFFeGNsID09ICdudW1iZXInIHx8IHR5cGVvZiAkc2NoZW1hRXhjbCA9PSAnYm9vbGVhbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRleGNsdXNpdmVLZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlciBvciBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCRpc0RhdGFFeGNsKSB7XG4gICAgdmFyICRzY2hlbWFWYWx1ZUV4Y2wgPSBpdC51dGlsLmdldERhdGEoJHNjaGVtYUV4Y2wuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFyciksXG4gICAgICAkZXhjbHVzaXZlID0gJ2V4Y2x1c2l2ZScgKyAkbHZsLFxuICAgICAgJGV4Y2xUeXBlID0gJ2V4Y2xUeXBlJyArICRsdmwsXG4gICAgICAkZXhjbElzTnVtYmVyID0gJ2V4Y2xJc051bWJlcicgKyAkbHZsLFxuICAgICAgJG9wRXhwciA9ICdvcCcgKyAkbHZsLFxuICAgICAgJG9wU3RyID0gJ1xcJyArICcgKyAkb3BFeHByICsgJyArIFxcJyc7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYUV4Y2wnICsgKCRsdmwpICsgJyA9ICcgKyAoJHNjaGVtYVZhbHVlRXhjbCkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZUV4Y2wgPSAnc2NoZW1hRXhjbCcgKyAkbHZsO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRleGNsdXNpdmUpICsgJzsgdmFyICcgKyAoJGV4Y2xUeXBlKSArICcgPSB0eXBlb2YgJyArICgkc2NoZW1hVmFsdWVFeGNsKSArICc7IGlmICgnICsgKCRleGNsVHlwZSkgKyAnICE9IFxcJ2Jvb2xlYW5cXCcgJiYgJyArICgkZXhjbFR5cGUpICsgJyAhPSBcXCd1bmRlZmluZWRcXCcgJiYgJyArICgkZXhjbFR5cGUpICsgJyAhPSBcXCdudW1iZXJcXCcpIHsgJztcbiAgICB2YXIgJGVycm9yS2V5d29yZCA9ICRleGNsdXNpdmVLZXl3b3JkO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19leGNsdXNpdmVMaW1pdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCcnICsgKCRleGNsdXNpdmVLZXl3b3JkKSArICcgc2hvdWxkIGJlIGJvb2xlYW5cXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgdmFyIF9fZXJyID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9IGVsc2UgaWYgKCAnO1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgJyArICgkZXhjbFR5cGUpICsgJyA9PSBcXCdudW1iZXJcXCcgPyAoICgnICsgKCRleGNsdXNpdmUpICsgJyA9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPT09IHVuZGVmaW5lZCB8fCAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJyAnICsgKCRvcCkgKyAnPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnKSA/ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnPSAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJyA6ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKSA6ICggKCcgKyAoJGV4Y2x1c2l2ZSkgKyAnID0gJyArICgkc2NoZW1hVmFsdWVFeGNsKSArICcgPT09IHRydWUpID8gJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgOiAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICkgfHwgJyArICgkZGF0YSkgKyAnICE9PSAnICsgKCRkYXRhKSArICcpIHsgdmFyIG9wJyArICgkbHZsKSArICcgPSAnICsgKCRleGNsdXNpdmUpICsgJyA/IFxcJycgKyAoJG9wKSArICdcXCcgOiBcXCcnICsgKCRvcCkgKyAnPVxcJzsgJztcbiAgICBpZiAoJHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAkZXJyb3JLZXl3b3JkID0gJGV4Y2x1c2l2ZUtleXdvcmQ7XG4gICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWFWYWx1ZUV4Y2w7XG4gICAgICAkaXNEYXRhID0gJGlzRGF0YUV4Y2w7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciAkZXhjbElzTnVtYmVyID0gdHlwZW9mICRzY2hlbWFFeGNsID09ICdudW1iZXInLFxuICAgICAgJG9wU3RyID0gJG9wO1xuICAgIGlmICgkZXhjbElzTnVtYmVyICYmICRpc0RhdGEpIHtcbiAgICAgIHZhciAkb3BFeHByID0gJ1xcJycgKyAkb3BTdHIgKyAnXFwnJztcbiAgICAgIG91dCArPSAnIGlmICggJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgKCAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSB1bmRlZmluZWQgfHwgJyArICgkc2NoZW1hRXhjbCkgKyAnICcgKyAoJG9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPyAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJz0gJyArICgkc2NoZW1hRXhjbCkgKyAnIDogJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJyApIHx8ICcgKyAoJGRhdGEpICsgJyAhPT0gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkZXhjbElzTnVtYmVyICYmICRzY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAkZXhjbHVzaXZlID0gdHJ1ZTtcbiAgICAgICAgJGVycm9yS2V5d29yZCA9ICRleGNsdXNpdmVLZXl3b3JkO1xuICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYUV4Y2w7XG4gICAgICAgICRub3RPcCArPSAnPSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoJGV4Y2xJc051bWJlcikgJHNjaGVtYVZhbHVlID0gTWF0aFskaXNNYXggPyAnbWluJyA6ICdtYXgnXSgkc2NoZW1hRXhjbCwgJHNjaGVtYSk7XG4gICAgICAgIGlmICgkc2NoZW1hRXhjbCA9PT0gKCRleGNsSXNOdW1iZXIgPyAkc2NoZW1hVmFsdWUgOiB0cnVlKSkge1xuICAgICAgICAgICRleGNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAgICRlcnJvcktleXdvcmQgPSAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgICAkbm90T3AgKz0gJz0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRleGNsdXNpdmUgPSBmYWxzZTtcbiAgICAgICAgICAkb3BTdHIgKz0gJz0nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgJG9wRXhwciA9ICdcXCcnICsgJG9wU3RyICsgJ1xcJyc7XG4gICAgICBvdXQgKz0gJyBpZiAoICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfHwgJyArICgkZGF0YSkgKyAnICE9PSAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICB9XG4gIH1cbiAgJGVycm9yS2V5d29yZCA9ICRlcnJvcktleXdvcmQgfHwgJGtleXdvcmQ7XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICdfbGltaXQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGNvbXBhcmlzb246ICcgKyAoJG9wRXhwcikgKyAnLCBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJywgZXhjbHVzaXZlOiAnICsgKCRleGNsdXNpdmUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSAnICsgKCRvcFN0cikgKyAnICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hVmFsdWUpICsgJ1xcJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnIH0gJztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9fbGltaXRJdGVtcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGVycm9yS2V5d29yZDtcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIGlmICghKCRpc0RhdGEgfHwgdHlwZW9mICRzY2hlbWEgPT0gJ251bWJlcicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRrZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlcicpO1xuICB9XG4gIHZhciAkb3AgPSAka2V5d29yZCA9PSAnbWF4SXRlbXMnID8gJz4nIDogJzwnO1xuICBvdXQgKz0gJ2lmICggJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgfVxuICBvdXQgKz0gJyAnICsgKCRkYXRhKSArICcubGVuZ3RoICcgKyAoJG9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJykgeyAnO1xuICB2YXIgJGVycm9yS2V5d29yZCA9ICRrZXl3b3JkO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnX2xpbWl0SXRlbXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGxpbWl0OiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBoYXZlICc7XG4gICAgICBpZiAoJGtleXdvcmQgPT0gJ21heEl0ZW1zJykge1xuICAgICAgICBvdXQgKz0gJ21vcmUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICdmZXdlcic7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB0aGFuICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKyBcXCcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWEpO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgaXRlbXNcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfX2xpbWl0TGVuZ3RoKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgaWYgKCEoJGlzRGF0YSB8fCB0eXBlb2YgJHNjaGVtYSA9PSAnbnVtYmVyJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJGtleXdvcmQgKyAnIG11c3QgYmUgbnVtYmVyJyk7XG4gIH1cbiAgdmFyICRvcCA9ICRrZXl3b3JkID09ICdtYXhMZW5ndGgnID8gJz4nIDogJzwnO1xuICBvdXQgKz0gJ2lmICggJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgfVxuICBpZiAoaXQub3B0cy51bmljb2RlID09PSBmYWxzZSkge1xuICAgIG91dCArPSAnICcgKyAoJGRhdGEpICsgJy5sZW5ndGggJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB1Y3MybGVuZ3RoKCcgKyAoJGRhdGEpICsgJykgJztcbiAgfVxuICBvdXQgKz0gJyAnICsgKCRvcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcpIHsgJztcbiAgdmFyICRlcnJvcktleXdvcmQgPSAka2V5d29yZDtcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19saW1pdExlbmd0aCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgbGltaXQ6ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGJlICc7XG4gICAgICBpZiAoJGtleXdvcmQgPT0gJ21heExlbmd0aCcpIHtcbiAgICAgICAgb3V0ICs9ICdsb25nZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICdzaG9ydGVyJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRoYW4gJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpICsgJyArIFxcJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyBjaGFyYWN0ZXJzXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX19saW1pdFByb3BlcnRpZXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heFByb3BlcnRpZXMnID8gJz4nIDogJzwnO1xuICBvdXQgKz0gJ2lmICggJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgfVxuICBvdXQgKz0gJyBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpLmxlbmd0aCAnICsgKCRvcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcpIHsgJztcbiAgdmFyICRlcnJvcktleXdvcmQgPSAka2V5d29yZDtcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19saW1pdFByb3BlcnRpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGxpbWl0OiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBoYXZlICc7XG4gICAgICBpZiAoJGtleXdvcmQgPT0gJ21heFByb3BlcnRpZXMnKSB7XG4gICAgICAgIG91dCArPSAnbW9yZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ2Zld2VyJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRoYW4gJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpICsgJyArIFxcJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyBwcm9wZXJ0aWVzXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2FsbE9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQsXG4gICAgJGFsbFNjaGVtYXNFbXB0eSA9IHRydWU7XG4gIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgaWYgKGFycjEpIHtcbiAgICB2YXIgJHNjaCwgJGkgPSAtMSxcbiAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAkc2NoID0gYXJyMVskaSArPSAxXTtcbiAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgJGFsbFNjaGVtYXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgJGk7XG4gICAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgaWYgKCRhbGxTY2hlbWFzRW1wdHkpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMuc2xpY2UoMCwgLTEpKSArICcgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfYW55T2YoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgdmFyICRub0VtcHR5U2NoZW1hID0gJHNjaGVtYS5ldmVyeShmdW5jdGlvbigkc2NoKSB7XG4gICAgcmV0dXJuIChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2gpLmxlbmd0aCA+IDApIHx8ICRzY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoLCBpdC5SVUxFUy5hbGwpKTtcbiAgfSk7XG4gIGlmICgkbm9FbXB0eVNjaGVtYSkge1xuICAgIHZhciAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQ7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsgdmFyICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgICc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgdmFyIGFycjEgPSAkc2NoZW1hO1xuICAgIGlmIChhcnIxKSB7XG4gICAgICB2YXIgJHNjaCwgJGkgPSAtMSxcbiAgICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoJGkgPCBsMSkge1xuICAgICAgICAkc2NoID0gYXJyMVskaSArPSAxXTtcbiAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICRpdC5zY2hlbWFQYXRoID0gJHNjaGVtYVBhdGggKyAnWycgKyAkaSArICddJztcbiAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aCArICcvJyArICRpO1xuICAgICAgICBvdXQgKz0gJyAgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkdmFsaWQpICsgJyB8fCAnICsgKCRuZXh0VmFsaWQpICsgJzsgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgIH1cbiAgICB9XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdhbnlPZicpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgbWF0Y2ggc29tZSBzY2hlbWEgaW4gYW55T2ZcXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0ICs9ICcgfSBlbHNlIHsgIGVycm9ycyA9ICcgKyAoJGVycnMpICsgJzsgaWYgKHZFcnJvcnMgIT09IG51bGwpIHsgaWYgKCcgKyAoJGVycnMpICsgJykgdkVycm9ycy5sZW5ndGggPSAnICsgKCRlcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IG51bGw7IH0gJztcbiAgICBpZiAoaXQub3B0cy5hbGxFcnJvcnMpIHtcbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2NvbW1lbnQoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGNvbW1lbnQgPSBpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpO1xuICBpZiAoaXQub3B0cy4kY29tbWVudCA9PT0gdHJ1ZSkge1xuICAgIG91dCArPSAnIGNvbnNvbGUubG9nKCcgKyAoJGNvbW1lbnQpICsgJyk7JztcbiAgfSBlbHNlIGlmICh0eXBlb2YgaXQub3B0cy4kY29tbWVudCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgb3V0ICs9ICcgc2VsZi5fb3B0cy4kY29tbWVudCgnICsgKCRjb21tZW50KSArICcsICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJywgdmFsaWRhdGUucm9vdC5zY2hlbWEpOyc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY29uc3QoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgaWYgKCEkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnOyc7XG4gIH1cbiAgb3V0ICs9ICd2YXIgJyArICgkdmFsaWQpICsgJyA9IGVxdWFsKCcgKyAoJGRhdGEpICsgJywgc2NoZW1hJyArICgkbHZsKSArICcpOyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2NvbnN0JykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBhbGxvd2VkVmFsdWU6IHNjaGVtYScgKyAoJGx2bCkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlIGVxdWFsIHRvIGNvbnN0YW50XFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY29udGFpbnMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgdmFyICRpZHggPSAnaScgKyAkbHZsLFxuICAgICRkYXRhTnh0ID0gJGl0LmRhdGFMZXZlbCA9IGl0LmRhdGFMZXZlbCArIDEsXG4gICAgJG5leHREYXRhID0gJ2RhdGEnICsgJGRhdGFOeHQsXG4gICAgJGN1cnJlbnRCYXNlSWQgPSBpdC5iYXNlSWQsXG4gICAgJG5vbkVtcHR5U2NoZW1hID0gKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2hlbWEgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaGVtYSkubGVuZ3RoID4gMCkgfHwgJHNjaGVtYSA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2hlbWEsIGl0LlJVTEVTLmFsbCkpO1xuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7dmFyICcgKyAoJHZhbGlkKSArICc7JztcbiAgaWYgKCRub25FbXB0eVNjaGVtYSkge1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgICRpdC5zY2hlbWEgPSAkc2NoZW1hO1xuICAgICRpdC5zY2hlbWFQYXRoID0gJHNjaGVtYVBhdGg7XG4gICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aDtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dFZhbGlkKSArICcgPSBmYWxzZTsgZm9yICh2YXIgJyArICgkaWR4KSArICcgPSAwOyAnICsgKCRpZHgpICsgJyA8ICcgKyAoJGRhdGEpICsgJy5sZW5ndGg7ICcgKyAoJGlkeCkgKyAnKyspIHsgJztcbiAgICAkaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRpZHgsIGl0Lm9wdHMuanNvblBvaW50ZXJzLCB0cnVlKTtcbiAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAkaWR4ICsgJ10nO1xuICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSAkaWR4O1xuICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSBicmVhazsgfSAgJztcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMpICsgJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSB7JztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkZGF0YSkgKyAnLmxlbmd0aCA9PSAwKSB7JztcbiAgfVxuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2NvbnRhaW5zJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczoge30gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGNvbnRhaW4gYSB2YWxpZCBpdGVtXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSBlbHNlIHsgJztcbiAgaWYgKCRub25FbXB0eVNjaGVtYSkge1xuICAgIG91dCArPSAnICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICc7XG4gIH1cbiAgaWYgKGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2N1c3RvbShpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGVycm9yS2V5d29yZDtcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICB2YXIgJHJ1bGUgPSB0aGlzLFxuICAgICRkZWZpbml0aW9uID0gJ2RlZmluaXRpb24nICsgJGx2bCxcbiAgICAkckRlZiA9ICRydWxlLmRlZmluaXRpb24sXG4gICAgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgdmFyICRjb21waWxlLCAkaW5saW5lLCAkbWFjcm8sICRydWxlVmFsaWRhdGUsICR2YWxpZGF0ZUNvZGU7XG4gIGlmICgkaXNEYXRhICYmICRyRGVmLiRkYXRhKSB7XG4gICAgJHZhbGlkYXRlQ29kZSA9ICdrZXl3b3JkVmFsaWRhdGUnICsgJGx2bDtcbiAgICB2YXIgJHZhbGlkYXRlU2NoZW1hID0gJHJEZWYudmFsaWRhdGVTY2hlbWE7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJGRlZmluaXRpb24pICsgJyA9IFJVTEVTLmN1c3RvbVtcXCcnICsgKCRrZXl3b3JkKSArICdcXCddLmRlZmluaXRpb247IHZhciAnICsgKCR2YWxpZGF0ZUNvZGUpICsgJyA9ICcgKyAoJGRlZmluaXRpb24pICsgJy52YWxpZGF0ZTsnO1xuICB9IGVsc2Uge1xuICAgICRydWxlVmFsaWRhdGUgPSBpdC51c2VDdXN0b21SdWxlKCRydWxlLCAkc2NoZW1hLCBpdC5zY2hlbWEsIGl0KTtcbiAgICBpZiAoISRydWxlVmFsaWRhdGUpIHJldHVybjtcbiAgICAkc2NoZW1hVmFsdWUgPSAndmFsaWRhdGUuc2NoZW1hJyArICRzY2hlbWFQYXRoO1xuICAgICR2YWxpZGF0ZUNvZGUgPSAkcnVsZVZhbGlkYXRlLmNvZGU7XG4gICAgJGNvbXBpbGUgPSAkckRlZi5jb21waWxlO1xuICAgICRpbmxpbmUgPSAkckRlZi5pbmxpbmU7XG4gICAgJG1hY3JvID0gJHJEZWYubWFjcm87XG4gIH1cbiAgdmFyICRydWxlRXJycyA9ICR2YWxpZGF0ZUNvZGUgKyAnLmVycm9ycycsXG4gICAgJGkgPSAnaScgKyAkbHZsLFxuICAgICRydWxlRXJyID0gJ3J1bGVFcnInICsgJGx2bCxcbiAgICAkYXN5bmNLZXl3b3JkID0gJHJEZWYuYXN5bmM7XG4gIGlmICgkYXN5bmNLZXl3b3JkICYmICFpdC5hc3luYykgdGhyb3cgbmV3IEVycm9yKCdhc3luYyBrZXl3b3JkIGluIHN5bmMgc2NoZW1hJyk7XG4gIGlmICghKCRpbmxpbmUgfHwgJG1hY3JvKSkge1xuICAgIG91dCArPSAnJyArICgkcnVsZUVycnMpICsgJyA9IG51bGw7JztcbiAgfVxuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7dmFyICcgKyAoJHZhbGlkKSArICc7JztcbiAgaWYgKCRpc0RhdGEgJiYgJHJEZWYuJGRhdGEpIHtcbiAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgb3V0ICs9ICcgaWYgKCcgKyAoJHNjaGVtYVZhbHVlKSArICcgPT09IHVuZGVmaW5lZCkgeyAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgfSBlbHNlIHsgJztcbiAgICBpZiAoJHZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkZGVmaW5pdGlvbikgKyAnLnZhbGlkYXRlU2NoZW1hKCcgKyAoJHNjaGVtYVZhbHVlKSArICcpOyBpZiAoJyArICgkdmFsaWQpICsgJykgeyAnO1xuICAgIH1cbiAgfVxuICBpZiAoJGlubGluZSkge1xuICAgIGlmICgkckRlZi5zdGF0ZW1lbnRzKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRydWxlVmFsaWRhdGUudmFsaWRhdGUpICsgJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkcnVsZVZhbGlkYXRlLnZhbGlkYXRlKSArICc7ICc7XG4gICAgfVxuICB9IGVsc2UgaWYgKCRtYWNybykge1xuICAgIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICAgIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAgICRpdC5sZXZlbCsrO1xuICAgIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgICAkaXQuc2NoZW1hID0gJHJ1bGVWYWxpZGF0ZS52YWxpZGF0ZTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICcnO1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCkucmVwbGFjZSgvdmFsaWRhdGVcXC5zY2hlbWEvZywgJHZhbGlkYXRlQ29kZSk7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyAnICsgKCRjb2RlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7XG4gICAgb3V0ICs9ICcgICcgKyAoJHZhbGlkYXRlQ29kZSkgKyAnLmNhbGwoICc7XG4gICAgaWYgKGl0Lm9wdHMucGFzc0NvbnRleHQpIHtcbiAgICAgIG91dCArPSAndGhpcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnc2VsZic7XG4gICAgfVxuICAgIGlmICgkY29tcGlsZSB8fCAkckRlZi5zY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyAsICcgKyAoJHNjaGVtYVZhbHVlKSArICcgLCAnICsgKCRkYXRhKSArICcgLCB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAsIChkYXRhUGF0aCB8fCBcXCdcXCcpJztcbiAgICBpZiAoaXQuZXJyb3JQYXRoICE9ICdcIlwiJykge1xuICAgICAgb3V0ICs9ICcgKyAnICsgKGl0LmVycm9yUGF0aCk7XG4gICAgfVxuICAgIHZhciAkcGFyZW50RGF0YSA9ICRkYXRhTHZsID8gJ2RhdGEnICsgKCgkZGF0YUx2bCAtIDEpIHx8ICcnKSA6ICdwYXJlbnREYXRhJyxcbiAgICAgICRwYXJlbnREYXRhUHJvcGVydHkgPSAkZGF0YUx2bCA/IGl0LmRhdGFQYXRoQXJyWyRkYXRhTHZsXSA6ICdwYXJlbnREYXRhUHJvcGVydHknO1xuICAgIG91dCArPSAnICwgJyArICgkcGFyZW50RGF0YSkgKyAnICwgJyArICgkcGFyZW50RGF0YVByb3BlcnR5KSArICcgLCByb290RGF0YSApICAnO1xuICAgIHZhciBkZWZfY2FsbFJ1bGVWYWxpZGF0ZSA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICgkckRlZi5lcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gJztcbiAgICAgIGlmICgkYXN5bmNLZXl3b3JkKSB7XG4gICAgICAgIG91dCArPSAnYXdhaXQgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnJyArIChkZWZfY2FsbFJ1bGVWYWxpZGF0ZSkgKyAnOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoJGFzeW5jS2V5d29yZCkge1xuICAgICAgICAkcnVsZUVycnMgPSAnY3VzdG9tRXJyb3JzJyArICRsdmw7XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCRydWxlRXJycykgKyAnID0gbnVsbDsgdHJ5IHsgJyArICgkdmFsaWQpICsgJyA9IGF3YWl0ICcgKyAoZGVmX2NhbGxSdWxlVmFsaWRhdGUpICsgJzsgfSBjYXRjaCAoZSkgeyAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7IGlmIChlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSAnICsgKCRydWxlRXJycykgKyAnID0gZS5lcnJvcnM7IGVsc2UgdGhyb3cgZTsgfSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkcnVsZUVycnMpICsgJyA9IG51bGw7ICcgKyAoJHZhbGlkKSArICcgPSAnICsgKGRlZl9jYWxsUnVsZVZhbGlkYXRlKSArICc7ICc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkckRlZi5tb2RpZnlpbmcpIHtcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkcGFyZW50RGF0YSkgKyAnKSAnICsgKCRkYXRhKSArICcgPSAnICsgKCRwYXJlbnREYXRhKSArICdbJyArICgkcGFyZW50RGF0YVByb3BlcnR5KSArICddOyc7XG4gIH1cbiAgb3V0ICs9ICcnICsgKCRjbG9zaW5nQnJhY2VzKTtcbiAgaWYgKCRyRGVmLnZhbGlkKSB7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIGlmICggJztcbiAgICBpZiAoJHJEZWYudmFsaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0ICs9ICcgISc7XG4gICAgICBpZiAoJG1hY3JvKSB7XG4gICAgICAgIG91dCArPSAnJyArICgkbmV4dFZhbGlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkdmFsaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCEkckRlZi52YWxpZCkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnKSB7ICc7XG4gICAgJGVycm9yS2V5d29yZCA9ICRydWxlLmtleXdvcmQ7XG4gICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgIG91dCA9ICcnO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ2N1c3RvbScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsga2V5d29yZDogXFwnJyArICgkcnVsZS5rZXl3b3JkKSArICdcXCcgfSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIHBhc3MgXCInICsgKCRydWxlLmtleXdvcmQpICsgJ1wiIGtleXdvcmQgdmFsaWRhdGlvblxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgfVxuICAgIHZhciBkZWZfY3VzdG9tRXJyb3IgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoJGlubGluZSkge1xuICAgICAgaWYgKCRyRGVmLmVycm9ycykge1xuICAgICAgICBpZiAoJHJEZWYuZXJyb3JzICE9ICdmdWxsJykge1xuICAgICAgICAgIG91dCArPSAnICBmb3IgKHZhciAnICsgKCRpKSArICc9JyArICgkZXJycykgKyAnOyAnICsgKCRpKSArICc8ZXJyb3JzOyAnICsgKCRpKSArICcrKykgeyB2YXIgJyArICgkcnVsZUVycikgKyAnID0gdkVycm9yc1snICsgKCRpKSArICddOyBpZiAoJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID09PSB1bmRlZmluZWQpICcgKyAoJHJ1bGVFcnIpICsgJy5kYXRhUGF0aCA9IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJzsgaWYgKCcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWFQYXRoID09PSB1bmRlZmluZWQpIHsgJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPSBcIicgKyAoJGVyclNjaGVtYVBhdGgpICsgJ1wiOyB9ICc7XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArICgkcnVsZUVycikgKyAnLnNjaGVtYSA9ICcgKyAoJHNjaGVtYVZhbHVlKSArICc7ICcgKyAoJHJ1bGVFcnIpICsgJy5kYXRhID0gJyArICgkZGF0YSkgKyAnOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgkckRlZi5lcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgJyArIChkZWZfY3VzdG9tRXJyb3IpICsgJyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7ICcgKyAoZGVmX2N1c3RvbUVycm9yKSArICcgfSBlbHNlIHsgIGZvciAodmFyICcgKyAoJGkpICsgJz0nICsgKCRlcnJzKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZhciAnICsgKCRydWxlRXJyKSArICcgPSB2RXJyb3JzWycgKyAoJGkpICsgJ107IGlmICgnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPT09IHVuZGVmaW5lZCkgJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID0gKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnOyBpZiAoJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPT09IHVuZGVmaW5lZCkgeyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hUGF0aCA9IFwiJyArICgkZXJyU2NoZW1hUGF0aCkgKyAnXCI7IH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hID0gJyArICgkc2NoZW1hVmFsdWUpICsgJzsgJyArICgkcnVsZUVycikgKyAnLmRhdGEgPSAnICsgKCRkYXRhKSArICc7ICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIH0gfSAnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgkbWFjcm8pIHtcbiAgICAgIG91dCArPSAnICAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICdjdXN0b20nKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGtleXdvcmQ6IFxcJycgKyAoJHJ1bGUua2V5d29yZCkgKyAnXFwnIH0gJztcbiAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgcGFzcyBcIicgKyAoJHJ1bGUua2V5d29yZCkgKyAnXCIga2V5d29yZCB2YWxpZGF0aW9uXFwnICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCRyRGVmLmVycm9ycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgJyArIChkZWZfY3VzdG9tRXJyb3IpICsgJyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKEFycmF5LmlzQXJyYXkoJyArICgkcnVsZUVycnMpICsgJykpIHsgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSAnICsgKCRydWxlRXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSB2RXJyb3JzLmNvbmNhdCgnICsgKCRydWxlRXJycykgKyAnKTsgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7ICBmb3IgKHZhciAnICsgKCRpKSArICc9JyArICgkZXJycykgKyAnOyAnICsgKCRpKSArICc8ZXJyb3JzOyAnICsgKCRpKSArICcrKykgeyB2YXIgJyArICgkcnVsZUVycikgKyAnID0gdkVycm9yc1snICsgKCRpKSArICddOyBpZiAoJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID09PSB1bmRlZmluZWQpICcgKyAoJHJ1bGVFcnIpICsgJy5kYXRhUGF0aCA9IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJzsgICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWFQYXRoID0gXCInICsgKCRlcnJTY2hlbWFQYXRoKSArICdcIjsgICc7XG4gICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hID0gJyArICgkc2NoZW1hVmFsdWUpICsgJzsgJyArICgkcnVsZUVycikgKyAnLmRhdGEgPSAnICsgKCRkYXRhKSArICc7ICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgfSB9IGVsc2UgeyAnICsgKGRlZl9jdXN0b21FcnJvcikgKyAnIH0gJztcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfZGVwZW5kZW5jaWVzKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJHNjaGVtYURlcHMgPSB7fSxcbiAgICAkcHJvcGVydHlEZXBzID0ge30sXG4gICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXM7XG4gIGZvciAoJHByb3BlcnR5IGluICRzY2hlbWEpIHtcbiAgICBpZiAoJHByb3BlcnR5ID09ICdfX3Byb3RvX18nKSBjb250aW51ZTtcbiAgICB2YXIgJHNjaCA9ICRzY2hlbWFbJHByb3BlcnR5XTtcbiAgICB2YXIgJGRlcHMgPSBBcnJheS5pc0FycmF5KCRzY2gpID8gJHByb3BlcnR5RGVwcyA6ICRzY2hlbWFEZXBzO1xuICAgICRkZXBzWyRwcm9wZXJ0eV0gPSAkc2NoO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsnO1xuICB2YXIgJGN1cnJlbnRFcnJvclBhdGggPSBpdC5lcnJvclBhdGg7XG4gIG91dCArPSAndmFyIG1pc3NpbmcnICsgKCRsdmwpICsgJzsnO1xuICBmb3IgKHZhciAkcHJvcGVydHkgaW4gJHByb3BlcnR5RGVwcykge1xuICAgICRkZXBzID0gJHByb3BlcnR5RGVwc1skcHJvcGVydHldO1xuICAgIGlmICgkZGVwcy5sZW5ndGgpIHtcbiAgICAgIG91dCArPSAnIGlmICggJyArICgkZGF0YSkgKyAoaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHkpKSArICcgIT09IHVuZGVmaW5lZCAnO1xuICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIG91dCArPSAnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnXFwnKSAnO1xuICAgICAgfVxuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgJiYgKCAnO1xuICAgICAgICB2YXIgYXJyMSA9ICRkZXBzO1xuICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksICRpID0gLTEsXG4gICAgICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMSkge1xuICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyMVskaSArPSAxXTtcbiAgICAgICAgICAgIGlmICgkaSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkdXNlRGF0YSA9ICRkYXRhICsgJHByb3A7XG4gICAgICAgICAgICBvdXQgKz0gJyAoICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpICYmIChtaXNzaW5nJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoaXQub3B0cy5qc29uUG9pbnRlcnMgPyAkcHJvcGVydHlLZXkgOiAkcHJvcCkpICsgJykgKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykpIHsgICc7XG4gICAgICAgIHZhciAkcHJvcGVydHlQYXRoID0gJ21pc3NpbmcnICsgJGx2bCxcbiAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gJ1xcJyArICcgKyAkcHJvcGVydHlQYXRoICsgJyArIFxcJyc7XG4gICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC5vcHRzLmpzb25Qb2ludGVycyA/IGl0LnV0aWwuZ2V0UGF0aEV4cHIoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eVBhdGgsIHRydWUpIDogJGN1cnJlbnRFcnJvclBhdGggKyAnICsgJyArICRwcm9wZXJ0eVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdkZXBlbmRlbmNpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHByb3BlcnR5OiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eSkpICsgJ1xcJywgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJywgZGVwc0NvdW50OiAnICsgKCRkZXBzLmxlbmd0aCkgKyAnLCBkZXBzOiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzLmxlbmd0aCA9PSAxID8gJGRlcHNbMF0gOiAkZGVwcy5qb2luKFwiLCBcIikpKSArICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgaGF2ZSAnO1xuICAgICAgICAgICAgaWYgKCRkZXBzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgIG91dCArPSAncHJvcGVydHkgJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkZGVwc1swXSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0aWVzICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJGRlcHMuam9pbihcIiwgXCIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJyB3aGVuIHByb3BlcnR5ICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnIGlzIHByZXNlbnRcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgKSB7ICc7XG4gICAgICAgIHZhciBhcnIyID0gJGRlcHM7XG4gICAgICAgIGlmIChhcnIyKSB7XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTIgPSAtMSxcbiAgICAgICAgICAgIGwyID0gYXJyMi5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlIChpMiA8IGwyKSB7XG4gICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIyW2kyICs9IDFdO1xuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJHVzZURhdGEgPSAkZGF0YSArICRwcm9wO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpKSArICdcXCcpICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnZGVwZW5kZW5jaWVzJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwcm9wZXJ0eTogXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICdcXCcsIG1pc3NpbmdQcm9wZXJ0eTogXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXCcsIGRlcHNDb3VudDogJyArICgkZGVwcy5sZW5ndGgpICsgJywgZGVwczogXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkZGVwcy5sZW5ndGggPT0gMSA/ICRkZXBzWzBdIDogJGRlcHMuam9pbihcIiwgXCIpKSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgaGF2ZSAnO1xuICAgICAgICAgICAgICAgIGlmICgkZGVwcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0eSAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzWzBdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAncHJvcGVydGllcyAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzLmpvaW4oXCIsIFwiKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB3aGVuIHByb3BlcnR5ICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnIGlzIHByZXNlbnRcXCcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAgICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgdmFyICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZDtcbiAgZm9yICh2YXIgJHByb3BlcnR5IGluICRzY2hlbWFEZXBzKSB7XG4gICAgdmFyICRzY2ggPSAkc2NoZW1hRGVwc1skcHJvcGVydHldO1xuICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgaWYgKCAnICsgKCRkYXRhKSArIChpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eSkpICsgJyAhPT0gdW5kZWZpbmVkICc7XG4gICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgb3V0ICs9ICcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICdcXCcpICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJykgeyAnO1xuICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHkpO1xuICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aCArICcvJyArIGl0LnV0aWwuZXNjYXBlRnJhZ21lbnQoJHByb3BlcnR5KTtcbiAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgICAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2VudW0oaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICRpID0gJ2knICsgJGx2bCxcbiAgICAkdlNjaGVtYSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgaWYgKCEkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJHZTY2hlbWEpICsgJyA9IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJzsnO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJHZhbGlkKSArICc7JztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyBpZiAoc2NoZW1hJyArICgkbHZsKSArICcgPT09IHVuZGVmaW5lZCkgJyArICgkdmFsaWQpICsgJyA9IHRydWU7IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYScgKyAoJGx2bCkgKyAnKSkgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyBlbHNlIHsnO1xuICB9XG4gIG91dCArPSAnJyArICgkdmFsaWQpICsgJyA9IGZhbHNlO2ZvciAodmFyICcgKyAoJGkpICsgJz0wOyAnICsgKCRpKSArICc8JyArICgkdlNjaGVtYSkgKyAnLmxlbmd0aDsgJyArICgkaSkgKyAnKyspIGlmIChlcXVhbCgnICsgKCRkYXRhKSArICcsICcgKyAoJHZTY2hlbWEpICsgJ1snICsgKCRpKSArICddKSkgeyAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgYnJlYWs7IH0nO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICB9ICAnO1xuICB9XG4gIG91dCArPSAnIGlmICghJyArICgkdmFsaWQpICsgJykgeyAgICc7XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnZW51bScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgYWxsb3dlZFZhbHVlczogc2NoZW1hJyArICgkbHZsKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlc1xcJyAnO1xuICAgIH1cbiAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnIH0nO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2Zvcm1hdChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICBpZiAoaXQub3B0cy5mb3JtYXQgPT09IGZhbHNlKSB7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkdW5rbm93bkZvcm1hdHMgPSBpdC5vcHRzLnVua25vd25Gb3JtYXRzLFxuICAgICRhbGxvd1Vua25vd24gPSBBcnJheS5pc0FycmF5KCR1bmtub3duRm9ybWF0cyk7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgdmFyICRmb3JtYXQgPSAnZm9ybWF0JyArICRsdmwsXG4gICAgICAkaXNPYmplY3QgPSAnaXNPYmplY3QnICsgJGx2bCxcbiAgICAgICRmb3JtYXRUeXBlID0gJ2Zvcm1hdFR5cGUnICsgJGx2bDtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZm9ybWF0KSArICcgPSBmb3JtYXRzWycgKyAoJHNjaGVtYVZhbHVlKSArICddOyB2YXIgJyArICgkaXNPYmplY3QpICsgJyA9IHR5cGVvZiAnICsgKCRmb3JtYXQpICsgJyA9PSBcXCdvYmplY3RcXCcgJiYgISgnICsgKCRmb3JtYXQpICsgJyBpbnN0YW5jZW9mIFJlZ0V4cCkgJiYgJyArICgkZm9ybWF0KSArICcudmFsaWRhdGU7IHZhciAnICsgKCRmb3JtYXRUeXBlKSArICcgPSAnICsgKCRpc09iamVjdCkgKyAnICYmICcgKyAoJGZvcm1hdCkgKyAnLnR5cGUgfHwgXFwnc3RyaW5nXFwnOyBpZiAoJyArICgkaXNPYmplY3QpICsgJykgeyAnO1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdmFyIGFzeW5jJyArICgkbHZsKSArICcgPSAnICsgKCRmb3JtYXQpICsgJy5hc3luYzsgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgJyArICgkZm9ybWF0KSArICcgPSAnICsgKCRmb3JtYXQpICsgJy52YWxpZGF0ZTsgfSBpZiAoICAnO1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ3N0cmluZ1xcJykgfHwgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgKCc7XG4gICAgaWYgKCR1bmtub3duRm9ybWF0cyAhPSAnaWdub3JlJykge1xuICAgICAgb3V0ICs9ICcgKCcgKyAoJHNjaGVtYVZhbHVlKSArICcgJiYgIScgKyAoJGZvcm1hdCkgKyAnICc7XG4gICAgICBpZiAoJGFsbG93VW5rbm93bikge1xuICAgICAgICBvdXQgKz0gJyAmJiBzZWxmLl9vcHRzLnVua25vd25Gb3JtYXRzLmluZGV4T2YoJyArICgkc2NoZW1hVmFsdWUpICsgJykgPT0gLTEgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnKSB8fCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAoJyArICgkZm9ybWF0KSArICcgJiYgJyArICgkZm9ybWF0VHlwZSkgKyAnID09IFxcJycgKyAoJHJ1bGVUeXBlKSArICdcXCcgJiYgISh0eXBlb2YgJyArICgkZm9ybWF0KSArICcgPT0gXFwnZnVuY3Rpb25cXCcgPyAnO1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgKGFzeW5jJyArICgkbHZsKSArICcgPyBhd2FpdCAnICsgKCRmb3JtYXQpICsgJygnICsgKCRkYXRhKSArICcpIDogJyArICgkZm9ybWF0KSArICcoJyArICgkZGF0YSkgKyAnKSkgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgJyArICgkZm9ybWF0KSArICcoJyArICgkZGF0YSkgKyAnKSAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyA6ICcgKyAoJGZvcm1hdCkgKyAnLnRlc3QoJyArICgkZGF0YSkgKyAnKSkpKSkgeyc7XG4gIH0gZWxzZSB7XG4gICAgdmFyICRmb3JtYXQgPSBpdC5mb3JtYXRzWyRzY2hlbWFdO1xuICAgIGlmICghJGZvcm1hdCkge1xuICAgICAgaWYgKCR1bmtub3duRm9ybWF0cyA9PSAnaWdub3JlJykge1xuICAgICAgICBpdC5sb2dnZXIud2FybigndW5rbm93biBmb3JtYXQgXCInICsgJHNjaGVtYSArICdcIiBpZ25vcmVkIGluIHNjaGVtYSBhdCBwYXRoIFwiJyArIGl0LmVyclNjaGVtYVBhdGggKyAnXCInKTtcbiAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAodHJ1ZSkgeyAnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9IGVsc2UgaWYgKCRhbGxvd1Vua25vd24gJiYgJHVua25vd25Gb3JtYXRzLmluZGV4T2YoJHNjaGVtYSkgPj0gMCkge1xuICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBmb3JtYXQgXCInICsgJHNjaGVtYSArICdcIiBpcyB1c2VkIGluIHNjaGVtYSBhdCBwYXRoIFwiJyArIGl0LmVyclNjaGVtYVBhdGggKyAnXCInKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyICRpc09iamVjdCA9IHR5cGVvZiAkZm9ybWF0ID09ICdvYmplY3QnICYmICEoJGZvcm1hdCBpbnN0YW5jZW9mIFJlZ0V4cCkgJiYgJGZvcm1hdC52YWxpZGF0ZTtcbiAgICB2YXIgJGZvcm1hdFR5cGUgPSAkaXNPYmplY3QgJiYgJGZvcm1hdC50eXBlIHx8ICdzdHJpbmcnO1xuICAgIGlmICgkaXNPYmplY3QpIHtcbiAgICAgIHZhciAkYXN5bmMgPSAkZm9ybWF0LmFzeW5jID09PSB0cnVlO1xuICAgICAgJGZvcm1hdCA9ICRmb3JtYXQudmFsaWRhdGU7XG4gICAgfVxuICAgIGlmICgkZm9ybWF0VHlwZSAhPSAkcnVsZVR5cGUpIHtcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBpZiAoJGFzeW5jKSB7XG4gICAgICBpZiAoIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIGZvcm1hdCBpbiBzeW5jIHNjaGVtYScpO1xuICAgICAgdmFyICRmb3JtYXRSZWYgPSAnZm9ybWF0cycgKyBpdC51dGlsLmdldFByb3BlcnR5KCRzY2hlbWEpICsgJy52YWxpZGF0ZSc7XG4gICAgICBvdXQgKz0gJyBpZiAoIShhd2FpdCAnICsgKCRmb3JtYXRSZWYpICsgJygnICsgKCRkYXRhKSArICcpKSkgeyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyBpZiAoISAnO1xuICAgICAgdmFyICRmb3JtYXRSZWYgPSAnZm9ybWF0cycgKyBpdC51dGlsLmdldFByb3BlcnR5KCRzY2hlbWEpO1xuICAgICAgaWYgKCRpc09iamVjdCkgJGZvcm1hdFJlZiArPSAnLnZhbGlkYXRlJztcbiAgICAgIGlmICh0eXBlb2YgJGZvcm1hdCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJGZvcm1hdFJlZikgKyAnKCcgKyAoJGRhdGEpICsgJykgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJGZvcm1hdFJlZikgKyAnLnRlc3QoJyArICgkZGF0YSkgKyAnKSAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcpIHsgJztcbiAgICB9XG4gIH1cbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdmb3JtYXQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGZvcm1hdDogICc7XG4gICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgIG91dCArPSAnJyArICgkc2NoZW1hVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJycgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSk7XG4gICAgfVxuICAgIG91dCArPSAnICB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBtYXRjaCBmb3JtYXQgXCInO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArIChpdC51dGlsLmVzY2FwZVF1b3Rlcygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJ1wiXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnIH0gJztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9pZihpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkdGhlblNjaCA9IGl0LnNjaGVtYVsndGhlbiddLFxuICAgICRlbHNlU2NoID0gaXQuc2NoZW1hWydlbHNlJ10sXG4gICAgJHRoZW5QcmVzZW50ID0gJHRoZW5TY2ggIT09IHVuZGVmaW5lZCAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHRoZW5TY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHRoZW5TY2gpLmxlbmd0aCA+IDApIHx8ICR0aGVuU2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHRoZW5TY2gsIGl0LlJVTEVTLmFsbCkpLFxuICAgICRlbHNlUHJlc2VudCA9ICRlbHNlU2NoICE9PSB1bmRlZmluZWQgJiYgKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRlbHNlU2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRlbHNlU2NoKS5sZW5ndGggPiAwKSB8fCAkZWxzZVNjaCA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRlbHNlU2NoLCBpdC5SVUxFUy5hbGwpKSxcbiAgICAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQ7XG4gIGlmICgkdGhlblByZXNlbnQgfHwgJGVsc2VQcmVzZW50KSB7XG4gICAgdmFyICRpZkNsYXVzZTtcbiAgICAkaXQuY3JlYXRlRXJyb3JzID0gZmFsc2U7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7IHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgICc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICRpdC5jcmVhdGVFcnJvcnMgPSB0cnVlO1xuICAgIG91dCArPSAnICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICAnO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgaWYgKCR0aGVuUHJlc2VudCkge1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICAnO1xuICAgICAgJGl0LnNjaGVtYSA9IGl0LnNjaGVtYVsndGhlbiddO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50aGVuJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvdGhlbic7XG4gICAgICBvdXQgKz0gJyAgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRuZXh0VmFsaWQpICsgJzsgJztcbiAgICAgIGlmICgkdGhlblByZXNlbnQgJiYgJGVsc2VQcmVzZW50KSB7XG4gICAgICAgICRpZkNsYXVzZSA9ICdpZkNsYXVzZScgKyAkbHZsO1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkaWZDbGF1c2UpICsgJyA9IFxcJ3RoZW5cXCc7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkaWZDbGF1c2UgPSAnXFwndGhlblxcJyc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICBpZiAoJGVsc2VQcmVzZW50KSB7XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkZWxzZVByZXNlbnQpIHtcbiAgICAgICRpdC5zY2hlbWEgPSBpdC5zY2hlbWFbJ2Vsc2UnXTtcbiAgICAgICRpdC5zY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcuZWxzZSc7XG4gICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2Vsc2UnO1xuICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkbmV4dFZhbGlkKSArICc7ICc7XG4gICAgICBpZiAoJHRoZW5QcmVzZW50ICYmICRlbHNlUHJlc2VudCkge1xuICAgICAgICAkaWZDbGF1c2UgPSAnaWZDbGF1c2UnICsgJGx2bDtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJGlmQ2xhdXNlKSArICcgPSBcXCdlbHNlXFwnOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGlmQ2xhdXNlID0gJ1xcJ2Vsc2VcXCcnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2lmJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBmYWlsaW5nS2V5d29yZDogJyArICgkaWZDbGF1c2UpICsgJyB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgbWF0Y2ggXCJcXCcgKyAnICsgKCRpZkNsYXVzZSkgKyAnICsgXFwnXCIgc2NoZW1hXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIG91dCArPSAnIH0gICAnO1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vYWxsIHJlcXVpcmVzIG11c3QgYmUgZXhwbGljaXQgYmVjYXVzZSBicm93c2VyaWZ5IHdvbid0IHdvcmsgd2l0aCBkeW5hbWljIHJlcXVpcmVzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJyRyZWYnOiByZXF1aXJlKCcuL3JlZicpLFxuICBhbGxPZjogcmVxdWlyZSgnLi9hbGxPZicpLFxuICBhbnlPZjogcmVxdWlyZSgnLi9hbnlPZicpLFxuICAnJGNvbW1lbnQnOiByZXF1aXJlKCcuL2NvbW1lbnQnKSxcbiAgY29uc3Q6IHJlcXVpcmUoJy4vY29uc3QnKSxcbiAgY29udGFpbnM6IHJlcXVpcmUoJy4vY29udGFpbnMnKSxcbiAgZGVwZW5kZW5jaWVzOiByZXF1aXJlKCcuL2RlcGVuZGVuY2llcycpLFxuICAnZW51bSc6IHJlcXVpcmUoJy4vZW51bScpLFxuICBmb3JtYXQ6IHJlcXVpcmUoJy4vZm9ybWF0JyksXG4gICdpZic6IHJlcXVpcmUoJy4vaWYnKSxcbiAgaXRlbXM6IHJlcXVpcmUoJy4vaXRlbXMnKSxcbiAgbWF4aW11bTogcmVxdWlyZSgnLi9fbGltaXQnKSxcbiAgbWluaW11bTogcmVxdWlyZSgnLi9fbGltaXQnKSxcbiAgbWF4SXRlbXM6IHJlcXVpcmUoJy4vX2xpbWl0SXRlbXMnKSxcbiAgbWluSXRlbXM6IHJlcXVpcmUoJy4vX2xpbWl0SXRlbXMnKSxcbiAgbWF4TGVuZ3RoOiByZXF1aXJlKCcuL19saW1pdExlbmd0aCcpLFxuICBtaW5MZW5ndGg6IHJlcXVpcmUoJy4vX2xpbWl0TGVuZ3RoJyksXG4gIG1heFByb3BlcnRpZXM6IHJlcXVpcmUoJy4vX2xpbWl0UHJvcGVydGllcycpLFxuICBtaW5Qcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19saW1pdFByb3BlcnRpZXMnKSxcbiAgbXVsdGlwbGVPZjogcmVxdWlyZSgnLi9tdWx0aXBsZU9mJyksXG4gIG5vdDogcmVxdWlyZSgnLi9ub3QnKSxcbiAgb25lT2Y6IHJlcXVpcmUoJy4vb25lT2YnKSxcbiAgcGF0dGVybjogcmVxdWlyZSgnLi9wYXR0ZXJuJyksXG4gIHByb3BlcnRpZXM6IHJlcXVpcmUoJy4vcHJvcGVydGllcycpLFxuICBwcm9wZXJ0eU5hbWVzOiByZXF1aXJlKCcuL3Byb3BlcnR5TmFtZXMnKSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmUoJy4vcmVxdWlyZWQnKSxcbiAgdW5pcXVlSXRlbXM6IHJlcXVpcmUoJy4vdW5pcXVlSXRlbXMnKSxcbiAgdmFsaWRhdGU6IHJlcXVpcmUoJy4vdmFsaWRhdGUnKVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfaXRlbXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgdmFyICRpZHggPSAnaScgKyAkbHZsLFxuICAgICRkYXRhTnh0ID0gJGl0LmRhdGFMZXZlbCA9IGl0LmRhdGFMZXZlbCArIDEsXG4gICAgJG5leHREYXRhID0gJ2RhdGEnICsgJGRhdGFOeHQsXG4gICAgJGN1cnJlbnRCYXNlSWQgPSBpdC5iYXNlSWQ7XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczt2YXIgJyArICgkdmFsaWQpICsgJzsnO1xuICBpZiAoQXJyYXkuaXNBcnJheSgkc2NoZW1hKSkge1xuICAgIHZhciAkYWRkaXRpb25hbEl0ZW1zID0gaXQuc2NoZW1hLmFkZGl0aW9uYWxJdGVtcztcbiAgICBpZiAoJGFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRkYXRhKSArICcubGVuZ3RoIDw9ICcgKyAoJHNjaGVtYS5sZW5ndGgpICsgJzsgJztcbiAgICAgIHZhciAkY3VyckVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aDtcbiAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvYWRkaXRpb25hbEl0ZW1zJztcbiAgICAgIG91dCArPSAnICBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnYWRkaXRpb25hbEl0ZW1zJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBsaW1pdDogJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnIH0gJztcbiAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGhhdmUgbW9yZSB0aGFuICcgKyAoJHNjaGVtYS5sZW5ndGgpICsgJyBpdGVtc1xcJyAnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogZmFsc2UgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgIH1cbiAgICAgIHZhciBfX2VyciA9IG91dDtcbiAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgJGVyclNjaGVtYVBhdGggPSAkY3VyckVyclNjaGVtYVBhdGg7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgYXJyMSA9ICRzY2hlbWE7XG4gICAgaWYgKGFycjEpIHtcbiAgICAgIHZhciAkc2NoLCAkaSA9IC0xLFxuICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAgICRzY2ggPSBhcnIxWyRpICs9IDFdO1xuICAgICAgICBpZiAoKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaCkubGVuZ3RoID4gMCkgfHwgJHNjaCA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2gsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgICAgICAgb3V0ICs9ICcgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyBpZiAoJyArICgkZGF0YSkgKyAnLmxlbmd0aCA+ICcgKyAoJGkpICsgJykgeyAnO1xuICAgICAgICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArICdbJyArICRpICsgJ10nO1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkc2NoO1xuICAgICAgICAgICRpdC5zY2hlbWFQYXRoID0gJHNjaGVtYVBhdGggKyAnWycgKyAkaSArICddJztcbiAgICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgJGk7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAkaSwgaXQub3B0cy5qc29uUG9pbnRlcnMsIHRydWUpO1xuICAgICAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSAkaTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIH0gICc7XG4gICAgICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mICRhZGRpdGlvbmFsSXRlbXMgPT0gJ29iamVjdCcgJiYgKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRhZGRpdGlvbmFsSXRlbXMgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJGFkZGl0aW9uYWxJdGVtcykubGVuZ3RoID4gMCkgfHwgJGFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRhZGRpdGlvbmFsSXRlbXMsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgICAkaXQuc2NoZW1hID0gJGFkZGl0aW9uYWxJdGVtcztcbiAgICAgICRpdC5zY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcuYWRkaXRpb25hbEl0ZW1zJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvYWRkaXRpb25hbEl0ZW1zJztcbiAgICAgIG91dCArPSAnICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgaWYgKCcgKyAoJGRhdGEpICsgJy5sZW5ndGggPiAnICsgKCRzY2hlbWEubGVuZ3RoKSArICcpIHsgIGZvciAodmFyICcgKyAoJGlkeCkgKyAnID0gJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnOyAnICsgKCRpZHgpICsgJyA8ICcgKyAoJGRhdGEpICsgJy5sZW5ndGg7ICcgKyAoJGlkeCkgKyAnKyspIHsgJztcbiAgICAgICRpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGhFeHByKGl0LmVycm9yUGF0aCwgJGlkeCwgaXQub3B0cy5qc29uUG9pbnRlcnMsIHRydWUpO1xuICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGlkeCArICddJztcbiAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSAkaWR4O1xuICAgICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSkpICsgJyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgIH1cbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIGJyZWFrOyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSB9ICAnO1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2hlbWEgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaGVtYSkubGVuZ3RoID4gMCkgfHwgJHNjaGVtYSA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2hlbWEsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnICBmb3IgKHZhciAnICsgKCRpZHgpICsgJyA9ICcgKyAoMCkgKyAnOyAnICsgKCRpZHgpICsgJyA8ICcgKyAoJGRhdGEpICsgJy5sZW5ndGg7ICcgKyAoJGlkeCkgKyAnKyspIHsgJztcbiAgICAkaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRpZHgsIGl0Lm9wdHMuanNvblBvaW50ZXJzLCB0cnVlKTtcbiAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAkaWR4ICsgJ10nO1xuICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSAkaWR4O1xuICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICB9XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIGJyZWFrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9JztcbiAgfVxuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMpICsgJyBpZiAoJyArICgkZXJycykgKyAnID09IGVycm9ycykgeyc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfbXVsdGlwbGVPZihpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgaWYgKCEoJGlzRGF0YSB8fCB0eXBlb2YgJHNjaGVtYSA9PSAnbnVtYmVyJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJGtleXdvcmQgKyAnIG11c3QgYmUgbnVtYmVyJyk7XG4gIH1cbiAgb3V0ICs9ICd2YXIgZGl2aXNpb24nICsgKCRsdmwpICsgJztpZiAoJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgKCB0eXBlb2YgJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPSBcXCdudW1iZXJcXCcgfHwgJztcbiAgfVxuICBvdXQgKz0gJyAoZGl2aXNpb24nICsgKCRsdmwpICsgJyA9ICcgKyAoJGRhdGEpICsgJyAvICcgKyAoJHNjaGVtYVZhbHVlKSArICcsICc7XG4gIGlmIChpdC5vcHRzLm11bHRpcGxlT2ZQcmVjaXNpb24pIHtcbiAgICBvdXQgKz0gJyBNYXRoLmFicyhNYXRoLnJvdW5kKGRpdmlzaW9uJyArICgkbHZsKSArICcpIC0gZGl2aXNpb24nICsgKCRsdmwpICsgJykgPiAxZS0nICsgKGl0Lm9wdHMubXVsdGlwbGVPZlByZWNpc2lvbikgKyAnICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgZGl2aXNpb24nICsgKCRsdmwpICsgJyAhPT0gcGFyc2VJbnQoZGl2aXNpb24nICsgKCRsdmwpICsgJykgJztcbiAgfVxuICBvdXQgKz0gJyApICc7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgICkgICc7XG4gIH1cbiAgb3V0ICs9ICcgKSB7ICAgJztcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdtdWx0aXBsZU9mJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtdWx0aXBsZU9mOiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlIG11bHRpcGxlIG9mICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hVmFsdWUpICsgJ1xcJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX25vdChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICBpZiAoKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2hlbWEgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaGVtYSkubGVuZ3RoID4gMCkgfHwgJHNjaGVtYSA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2hlbWEsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7ICAnO1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgICRpdC5jcmVhdGVFcnJvcnMgPSBmYWxzZTtcbiAgICB2YXIgJGFsbEVycm9yc09wdGlvbjtcbiAgICBpZiAoJGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICAkYWxsRXJyb3JzT3B0aW9uID0gJGl0Lm9wdHMuYWxsRXJyb3JzO1xuICAgICAgJGl0Lm9wdHMuYWxsRXJyb3JzID0gZmFsc2U7XG4gICAgfVxuICAgIG91dCArPSAnICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgJGl0LmNyZWF0ZUVycm9ycyA9IHRydWU7XG4gICAgaWYgKCRhbGxFcnJvcnNPcHRpb24pICRpdC5vcHRzLmFsbEVycm9ycyA9ICRhbGxFcnJvcnNPcHRpb247XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgICAnO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdub3QnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBiZSB2YWxpZFxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gZWxzZSB7ICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ25vdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGJlIHZhbGlkXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmIChmYWxzZSkgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9vbmVPZihpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGN1cnJlbnRCYXNlSWQgPSAkaXQuYmFzZUlkLFxuICAgICRwcmV2VmFsaWQgPSAncHJldlZhbGlkJyArICRsdmwsXG4gICAgJHBhc3NpbmdTY2hlbWFzID0gJ3Bhc3NpbmdTY2hlbWFzJyArICRsdmw7XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9ycyAsICcgKyAoJHByZXZWYWxpZCkgKyAnID0gZmFsc2UgLCAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2UgLCAnICsgKCRwYXNzaW5nU2NoZW1hcykgKyAnID0gbnVsbDsgJztcbiAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICB2YXIgYXJyMSA9ICRzY2hlbWE7XG4gIGlmIChhcnIxKSB7XG4gICAgdmFyICRzY2gsICRpID0gLTEsXG4gICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoJGkgPCBsMSkge1xuICAgICAgJHNjaCA9IGFycjFbJGkgKz0gMV07XG4gICAgICBpZiAoKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaCkubGVuZ3RoID4gMCkgfHwgJHNjaCA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2gsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgICAgICRpdC5zY2hlbWEgPSAkc2NoO1xuICAgICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyAkaTtcbiAgICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0VmFsaWQpICsgJyA9IHRydWU7ICc7XG4gICAgICB9XG4gICAgICBpZiAoJGkpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnICYmICcgKyAoJHByZXZWYWxpZCkgKyAnKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgJyArICgkcGFzc2luZ1NjaGVtYXMpICsgJyA9IFsnICsgKCRwYXNzaW5nU2NoZW1hcykgKyAnLCAnICsgKCRpKSArICddOyB9IGVsc2UgeyAnO1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoJHByZXZWYWxpZCkgKyAnID0gdHJ1ZTsgJyArICgkcGFzc2luZ1NjaGVtYXMpICsgJyA9ICcgKyAoJGkpICsgJzsgfSc7XG4gICAgfVxuICB9XG4gIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gIG91dCArPSAnJyArICgkY2xvc2luZ0JyYWNlcykgKyAnaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ29uZU9mJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwYXNzaW5nU2NoZW1hczogJyArICgkcGFzc2luZ1NjaGVtYXMpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBtYXRjaCBleGFjdGx5IG9uZSBzY2hlbWEgaW4gb25lT2ZcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHt9ICc7XG4gIH1cbiAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH1cbiAgb3V0ICs9ICd9IGVsc2UgeyAgZXJyb3JzID0gJyArICgkZXJycykgKyAnOyBpZiAodkVycm9ycyAhPT0gbnVsbCkgeyBpZiAoJyArICgkZXJycykgKyAnKSB2RXJyb3JzLmxlbmd0aCA9ICcgKyAoJGVycnMpICsgJzsgZWxzZSB2RXJyb3JzID0gbnVsbDsgfSc7XG4gIGlmIChpdC5vcHRzLmFsbEVycm9ycykge1xuICAgIG91dCArPSAnIH0gJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9wYXR0ZXJuKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICB2YXIgJHJlZ2V4cCA9ICRpc0RhdGEgPyAnKG5ldyBSZWdFeHAoJyArICRzY2hlbWFWYWx1ZSArICcpKScgOiBpdC51c2VQYXR0ZXJuKCRzY2hlbWEpO1xuICBvdXQgKz0gJ2lmICggJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ3N0cmluZ1xcJykgfHwgJztcbiAgfVxuICBvdXQgKz0gJyAhJyArICgkcmVnZXhwKSArICcudGVzdCgnICsgKCRkYXRhKSArICcpICkgeyAgICc7XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgncGF0dGVybicpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcGF0dGVybjogICc7XG4gICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgIG91dCArPSAnJyArICgkc2NoZW1hVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJycgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSk7XG4gICAgfVxuICAgIG91dCArPSAnICB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBtYXRjaCBwYXR0ZXJuIFwiJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpICsgJyArIFxcJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHNjaGVtYSkpO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICdcIlxcJyAnO1xuICAgIH1cbiAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICBvdXQgKz0gJyAsIHNjaGVtYTogICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ3ZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHNjaGVtYSkpO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgICAgICAgICAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHt9ICc7XG4gIH1cbiAgdmFyIF9fZXJyID0gb3V0O1xuICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgfVxuICBvdXQgKz0gJ30gJztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9wcm9wZXJ0aWVzKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGtleSA9ICdrZXknICsgJGx2bCxcbiAgICAkaWR4ID0gJ2lkeCcgKyAkbHZsLFxuICAgICRkYXRhTnh0ID0gJGl0LmRhdGFMZXZlbCA9IGl0LmRhdGFMZXZlbCArIDEsXG4gICAgJG5leHREYXRhID0gJ2RhdGEnICsgJGRhdGFOeHQsXG4gICAgJGRhdGFQcm9wZXJ0aWVzID0gJ2RhdGFQcm9wZXJ0aWVzJyArICRsdmw7XG4gIHZhciAkc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKCRzY2hlbWEgfHwge30pLmZpbHRlcihub3RQcm90byksXG4gICAgJHBQcm9wZXJ0aWVzID0gaXQuc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzIHx8IHt9LFxuICAgICRwUHJvcGVydHlLZXlzID0gT2JqZWN0LmtleXMoJHBQcm9wZXJ0aWVzKS5maWx0ZXIobm90UHJvdG8pLFxuICAgICRhUHJvcGVydGllcyA9IGl0LnNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAkc29tZVByb3BlcnRpZXMgPSAkc2NoZW1hS2V5cy5sZW5ndGggfHwgJHBQcm9wZXJ0eUtleXMubGVuZ3RoLFxuICAgICRub0FkZGl0aW9uYWwgPSAkYVByb3BlcnRpZXMgPT09IGZhbHNlLFxuICAgICRhZGRpdGlvbmFsSXNTY2hlbWEgPSB0eXBlb2YgJGFQcm9wZXJ0aWVzID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRhUHJvcGVydGllcykubGVuZ3RoLFxuICAgICRyZW1vdmVBZGRpdGlvbmFsID0gaXQub3B0cy5yZW1vdmVBZGRpdGlvbmFsLFxuICAgICRjaGVja0FkZGl0aW9uYWwgPSAkbm9BZGRpdGlvbmFsIHx8ICRhZGRpdGlvbmFsSXNTY2hlbWEgfHwgJHJlbW92ZUFkZGl0aW9uYWwsXG4gICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXMsXG4gICAgJGN1cnJlbnRCYXNlSWQgPSBpdC5iYXNlSWQ7XG4gIHZhciAkcmVxdWlyZWQgPSBpdC5zY2hlbWEucmVxdWlyZWQ7XG4gIGlmICgkcmVxdWlyZWQgJiYgIShpdC5vcHRzLiRkYXRhICYmICRyZXF1aXJlZC4kZGF0YSkgJiYgJHJlcXVpcmVkLmxlbmd0aCA8IGl0Lm9wdHMubG9vcFJlcXVpcmVkKSB7XG4gICAgdmFyICRyZXF1aXJlZEhhc2ggPSBpdC51dGlsLnRvSGFzaCgkcmVxdWlyZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90UHJvdG8ocCkge1xuICAgIHJldHVybiBwICE9PSAnX19wcm90b19fJztcbiAgfVxuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7dmFyICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsnO1xuICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyA9IHVuZGVmaW5lZDsnO1xuICB9XG4gIGlmICgkY2hlY2tBZGRpdGlvbmFsKSB7XG4gICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnID0gJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyB8fCBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpOyBmb3IgKHZhciAnICsgKCRpZHgpICsgJz0wOyAnICsgKCRpZHgpICsgJzwnICsgKCRkYXRhUHJvcGVydGllcykgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyB2YXIgJyArICgka2V5KSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnWycgKyAoJGlkeCkgKyAnXTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgZm9yICh2YXIgJyArICgka2V5KSArICcgaW4gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkc29tZVByb3BlcnRpZXMpIHtcbiAgICAgIG91dCArPSAnIHZhciBpc0FkZGl0aW9uYWwnICsgKCRsdmwpICsgJyA9ICEoZmFsc2UgJztcbiAgICAgIGlmICgkc2NoZW1hS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCRzY2hlbWFLZXlzLmxlbmd0aCA+IDgpIHtcbiAgICAgICAgICBvdXQgKz0gJyB8fCB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcuaGFzT3duUHJvcGVydHkoJyArICgka2V5KSArICcpICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFycjEgPSAkc2NoZW1hS2V5cztcbiAgICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTEgPSAtMSxcbiAgICAgICAgICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoaTEgPCBsMSkge1xuICAgICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIxW2kxICs9IDFdO1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKCRrZXkpICsgJyA9PSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHByb3BlcnR5S2V5KSkgKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoJHBQcm9wZXJ0eUtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnIyID0gJHBQcm9wZXJ0eUtleXM7XG4gICAgICAgIGlmIChhcnIyKSB7XG4gICAgICAgICAgdmFyICRwUHJvcGVydHksICRpID0gLTEsXG4gICAgICAgICAgICBsMiA9IGFycjIubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMikge1xuICAgICAgICAgICAgJHBQcm9wZXJ0eSA9IGFycjJbJGkgKz0gMV07XG4gICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKGl0LnVzZVBhdHRlcm4oJHBQcm9wZXJ0eSkpICsgJy50ZXN0KCcgKyAoJGtleSkgKyAnKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgKTsgaWYgKGlzQWRkaXRpb25hbCcgKyAoJGx2bCkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkcmVtb3ZlQWRkaXRpb25hbCA9PSAnYWxsJykge1xuICAgICAgb3V0ICs9ICcgZGVsZXRlICcgKyAoJGRhdGEpICsgJ1snICsgKCRrZXkpICsgJ107ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aDtcbiAgICAgIHZhciAkYWRkaXRpb25hbFByb3BlcnR5ID0gJ1xcJyArICcgKyAka2V5ICsgJyArIFxcJyc7XG4gICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgIGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICB9XG4gICAgICBpZiAoJG5vQWRkaXRpb25hbCkge1xuICAgICAgICBpZiAoJHJlbW92ZUFkZGl0aW9uYWwpIHtcbiAgICAgICAgICBvdXQgKz0gJyBkZWxldGUgJyArICgkZGF0YSkgKyAnWycgKyAoJGtleSkgKyAnXTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgICAgIHZhciAkY3VyckVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aDtcbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJztcbiAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnYWRkaXRpb25hbFByb3BlcnRpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGFkZGl0aW9uYWxQcm9wZXJ0eTogXFwnJyArICgkYWRkaXRpb25hbFByb3BlcnR5KSArICdcXCcgfSAnO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnaXMgYW4gaW52YWxpZCBhZGRpdGlvbmFsIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJ3Nob3VsZCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9ICRjdXJyRXJyU2NoZW1hUGF0aDtcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgYnJlYWs7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCRhZGRpdGlvbmFsSXNTY2hlbWEpIHtcbiAgICAgICAgaWYgKCRyZW1vdmVBZGRpdGlvbmFsID09ICdmYWlsaW5nJykge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7ICAnO1xuICAgICAgICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICAgICAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkYVByb3BlcnRpZXM7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA/IGl0LmVycm9yUGF0aCA6IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIHsgZXJyb3JzID0gJyArICgkZXJycykgKyAnOyBpZiAodmFsaWRhdGUuZXJyb3JzICE9PSBudWxsKSB7IGlmIChlcnJvcnMpIHZhbGlkYXRlLmVycm9ycy5sZW5ndGggPSBlcnJvcnM7IGVsc2UgdmFsaWRhdGUuZXJyb3JzID0gbnVsbDsgfSBkZWxldGUgJyArICgkZGF0YSkgKyAnWycgKyAoJGtleSkgKyAnXTsgfSAgJztcbiAgICAgICAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkYVByb3BlcnRpZXM7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA/IGl0LmVycm9yUGF0aCA6IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSBicmVhazsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGl0LmVycm9yUGF0aCA9ICRjdXJyZW50RXJyb3JQYXRoO1xuICAgIH1cbiAgICBpZiAoJHNvbWVQcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgIH1cbiAgfVxuICB2YXIgJHVzZURlZmF1bHRzID0gaXQub3B0cy51c2VEZWZhdWx0cyAmJiAhaXQuY29tcG9zaXRlUnVsZTtcbiAgaWYgKCRzY2hlbWFLZXlzLmxlbmd0aCkge1xuICAgIHZhciBhcnIzID0gJHNjaGVtYUtleXM7XG4gICAgaWYgKGFycjMpIHtcbiAgICAgIHZhciAkcHJvcGVydHlLZXksIGkzID0gLTEsXG4gICAgICAgIGwzID0gYXJyMy5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkzIDwgbDMpIHtcbiAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyM1tpMyArPSAxXTtcbiAgICAgICAgdmFyICRzY2ggPSAkc2NoZW1hWyRwcm9wZXJ0eUtleV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICB2YXIgJHByb3AgPSBpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eUtleSksXG4gICAgICAgICAgICAkcGFzc0RhdGEgPSAkZGF0YSArICRwcm9wLFxuICAgICAgICAgICAgJGhhc0RlZmF1bHQgPSAkdXNlRGVmYXVsdHMgJiYgJHNjaC5kZWZhdWx0ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICRwcm9wO1xuICAgICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyBpdC51dGlsLmVzY2FwZUZyYWdtZW50KCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aChpdC5lcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSBpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICAgICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgICAgICAgICRjb2RlID0gaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSk7XG4gICAgICAgICAgICB2YXIgJHVzZURhdGEgPSAkcGFzc0RhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciAkdXNlRGF0YSA9ICRuZXh0RGF0YTtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRoYXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCRyZXF1aXJlZEhhc2ggJiYgJHJlcXVpcmVkSGFzaFskcHJvcGVydHlLZXldKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGlmICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJykgeyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgICAgICAgICB2YXIgJGN1cnJlbnRFcnJvclBhdGggPSBpdC5lcnJvclBhdGgsXG4gICAgICAgICAgICAgICAgJGN1cnJFcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGgsXG4gICAgICAgICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9IGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvcmVxdWlyZWQnO1xuICAgICAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gJGN1cnJFcnJTY2hlbWFQYXRoO1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgfSBlbHNlIHsgJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcpIHsgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyB9IGVsc2UgeyAnO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCR1c2VEYXRhKSArICcgIT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJiYgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgKSB7ICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyB9ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkcFByb3BlcnR5S2V5cy5sZW5ndGgpIHtcbiAgICB2YXIgYXJyNCA9ICRwUHJvcGVydHlLZXlzO1xuICAgIGlmIChhcnI0KSB7XG4gICAgICB2YXIgJHBQcm9wZXJ0eSwgaTQgPSAtMSxcbiAgICAgICAgbDQgPSBhcnI0Lmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaTQgPCBsNCkge1xuICAgICAgICAkcFByb3BlcnR5ID0gYXJyNFtpNCArPSAxXTtcbiAgICAgICAgdmFyICRzY2ggPSAkcFByb3BlcnRpZXNbJHBQcm9wZXJ0eV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgICAkaXQuc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnBhdHRlcm5Qcm9wZXJ0aWVzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHBQcm9wZXJ0eSk7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9wYXR0ZXJuUHJvcGVydGllcy8nICsgaXQudXRpbC5lc2NhcGVGcmFnbWVudCgkcFByb3BlcnR5KTtcbiAgICAgICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnIHx8IE9iamVjdC5rZXlzKCcgKyAoJGRhdGEpICsgJyk7IGZvciAodmFyICcgKyAoJGlkeCkgKyAnPTA7ICcgKyAoJGlkeCkgKyAnPCcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcubGVuZ3RoOyAnICsgKCRpZHgpICsgJysrKSB7IHZhciAnICsgKCRrZXkpICsgJyA9ICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICdbJyArICgkaWR4KSArICddOyAnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBmb3IgKHZhciAnICsgKCRrZXkpICsgJyBpbiAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXNlUGF0dGVybigkcFByb3BlcnR5KSkgKyAnLnRlc3QoJyArICgka2V5KSArICcpKSB7ICc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSBicmVhazsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBlbHNlICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9wcm9wZXJ0eU5hbWVzKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7JztcbiAgaWYgKChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoZW1hID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2hlbWEpLmxlbmd0aCA+IDApIHx8ICRzY2hlbWEgPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoZW1hLCBpdC5SVUxFUy5hbGwpKSkge1xuICAgICRpdC5zY2hlbWEgPSAkc2NoZW1hO1xuICAgICRpdC5zY2hlbWFQYXRoID0gJHNjaGVtYVBhdGg7XG4gICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aDtcbiAgICB2YXIgJGtleSA9ICdrZXknICsgJGx2bCxcbiAgICAgICRpZHggPSAnaWR4JyArICRsdmwsXG4gICAgICAkaSA9ICdpJyArICRsdmwsXG4gICAgICAkaW52YWxpZE5hbWUgPSAnXFwnICsgJyArICRrZXkgKyAnICsgXFwnJyxcbiAgICAgICRkYXRhTnh0ID0gJGl0LmRhdGFMZXZlbCA9IGl0LmRhdGFMZXZlbCArIDEsXG4gICAgICAkbmV4dERhdGEgPSAnZGF0YScgKyAkZGF0YU54dCxcbiAgICAgICRkYXRhUHJvcGVydGllcyA9ICdkYXRhUHJvcGVydGllcycgKyAkbHZsLFxuICAgICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXMsXG4gICAgICAkY3VycmVudEJhc2VJZCA9IGl0LmJhc2VJZDtcbiAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgIG91dCArPSAnIHZhciAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnID0gdW5kZWZpbmVkOyAnO1xuICAgIH1cbiAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnIHx8IE9iamVjdC5rZXlzKCcgKyAoJGRhdGEpICsgJyk7IGZvciAodmFyICcgKyAoJGlkeCkgKyAnPTA7ICcgKyAoJGlkeCkgKyAnPCcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcubGVuZ3RoOyAnICsgKCRpZHgpICsgJysrKSB7IHZhciAnICsgKCRrZXkpICsgJyA9ICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICdbJyArICgkaWR4KSArICddOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyBmb3IgKHZhciAnICsgKCRrZXkpICsgJyBpbiAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgdmFyIHN0YXJ0RXJycycgKyAoJGx2bCkgKyAnID0gZXJyb3JzOyAnO1xuICAgIHZhciAkcGFzc0RhdGEgPSAka2V5O1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICB9XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSB7IGZvciAodmFyICcgKyAoJGkpICsgJz1zdGFydEVycnMnICsgKCRsdmwpICsgJzsgJyArICgkaSkgKyAnPGVycm9yczsgJyArICgkaSkgKyAnKyspIHsgdkVycm9yc1snICsgKCRpKSArICddLnByb3BlcnR5TmFtZSA9ICcgKyAoJGtleSkgKyAnOyB9ICAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdwcm9wZXJ0eU5hbWVzJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwcm9wZXJ0eU5hbWU6IFxcJycgKyAoJGludmFsaWROYW1lKSArICdcXCcgfSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwncHJvcGVydHkgbmFtZSBcXFxcXFwnJyArICgkaW52YWxpZE5hbWUpICsgJ1xcXFxcXCcgaXMgaW52YWxpZFxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICBvdXQgKz0gJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gdkVycm9yczsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgYnJlYWs7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gfSc7XG4gIH1cbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3JlZihpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGFzeW5jLCAkcmVmQ29kZTtcbiAgaWYgKCRzY2hlbWEgPT0gJyMnIHx8ICRzY2hlbWEgPT0gJyMvJykge1xuICAgIGlmIChpdC5pc1Jvb3QpIHtcbiAgICAgICRhc3luYyA9IGl0LmFzeW5jO1xuICAgICAgJHJlZkNvZGUgPSAndmFsaWRhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICAkYXN5bmMgPSBpdC5yb290LnNjaGVtYS4kYXN5bmMgPT09IHRydWU7XG4gICAgICAkcmVmQ29kZSA9ICdyb290LnJlZlZhbFswXSc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciAkcmVmVmFsID0gaXQucmVzb2x2ZVJlZihpdC5iYXNlSWQsICRzY2hlbWEsIGl0LmlzUm9vdCk7XG4gICAgaWYgKCRyZWZWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyICRtZXNzYWdlID0gaXQuTWlzc2luZ1JlZkVycm9yLm1lc3NhZ2UoaXQuYmFzZUlkLCAkc2NoZW1hKTtcbiAgICAgIGlmIChpdC5vcHRzLm1pc3NpbmdSZWZzID09ICdmYWlsJykge1xuICAgICAgICBpdC5sb2dnZXIuZXJyb3IoJG1lc3NhZ2UpO1xuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJyRyZWYnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHJlZjogXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3Rlcygkc2NoZW1hKSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnY2FuXFxcXFxcJ3QgcmVzb2x2ZSByZWZlcmVuY2UgJyArIChpdC51dGlsLmVzY2FwZVF1b3Rlcygkc2NoZW1hKSkgKyAnXFwnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHNjaGVtYSkpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIG91dCArPSAnIGlmIChmYWxzZSkgeyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGl0Lm9wdHMubWlzc2luZ1JlZnMgPT0gJ2lnbm9yZScpIHtcbiAgICAgICAgaXQubG9nZ2VyLndhcm4oJG1lc3NhZ2UpO1xuICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBpdC5NaXNzaW5nUmVmRXJyb3IoaXQuYmFzZUlkLCAkc2NoZW1hLCAkbWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgkcmVmVmFsLmlubGluZSkge1xuICAgICAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICAgICAkaXQubGV2ZWwrKztcbiAgICAgIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgICAgICRpdC5zY2hlbWEgPSAkcmVmVmFsLnNjaGVtYTtcbiAgICAgICRpdC5zY2hlbWFQYXRoID0gJyc7XG4gICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRzY2hlbWE7XG4gICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpLnJlcGxhY2UoL3ZhbGlkYXRlXFwuc2NoZW1hL2csICRyZWZWYWwuY29kZSk7XG4gICAgICBvdXQgKz0gJyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAkYXN5bmMgPSAkcmVmVmFsLiRhc3luYyA9PT0gdHJ1ZSB8fCAoaXQuYXN5bmMgJiYgJHJlZlZhbC4kYXN5bmMgIT09IGZhbHNlKTtcbiAgICAgICRyZWZDb2RlID0gJHJlZlZhbC5jb2RlO1xuICAgIH1cbiAgfVxuICBpZiAoJHJlZkNvZGUpIHtcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7XG4gICAgaWYgKGl0Lm9wdHMucGFzc0NvbnRleHQpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHJlZkNvZGUpICsgJy5jYWxsKHRoaXMsICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHJlZkNvZGUpICsgJyggJztcbiAgICB9XG4gICAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnLCAoZGF0YVBhdGggfHwgXFwnXFwnKSc7XG4gICAgaWYgKGl0LmVycm9yUGF0aCAhPSAnXCJcIicpIHtcbiAgICAgIG91dCArPSAnICsgJyArIChpdC5lcnJvclBhdGgpO1xuICAgIH1cbiAgICB2YXIgJHBhcmVudERhdGEgPSAkZGF0YUx2bCA/ICdkYXRhJyArICgoJGRhdGFMdmwgLSAxKSB8fCAnJykgOiAncGFyZW50RGF0YScsXG4gICAgICAkcGFyZW50RGF0YVByb3BlcnR5ID0gJGRhdGFMdmwgPyBpdC5kYXRhUGF0aEFyclskZGF0YUx2bF0gOiAncGFyZW50RGF0YVByb3BlcnR5JztcbiAgICBvdXQgKz0gJyAsICcgKyAoJHBhcmVudERhdGEpICsgJyAsICcgKyAoJHBhcmVudERhdGFQcm9wZXJ0eSkgKyAnLCByb290RGF0YSkgICc7XG4gICAgdmFyIF9fY2FsbFZhbGlkYXRlID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCRhc3luYykge1xuICAgICAgaWYgKCFpdC5hc3luYykgdGhyb3cgbmV3IEVycm9yKCdhc3luYyBzY2hlbWEgcmVmZXJlbmNlZCBieSBzeW5jIHNjaGVtYScpO1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHZhbGlkKSArICc7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB0cnkgeyBhd2FpdCAnICsgKF9fY2FsbFZhbGlkYXRlKSArICc7ICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gY2F0Y2ggKGUpIHsgaWYgKCEoZSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikpIHRocm93IGU7IGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gZS5lcnJvcnM7IGVsc2UgdkVycm9ycyA9IHZFcnJvcnMuY29uY2F0KGUuZXJyb3JzKTsgZXJyb3JzID0gdkVycm9ycy5sZW5ndGg7ICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkdmFsaWQpICsgJykgeyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyBpZiAoIScgKyAoX19jYWxsVmFsaWRhdGUpICsgJykgeyBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9ICcgKyAoJHJlZkNvZGUpICsgJy5lcnJvcnM7IGVsc2UgdkVycm9ycyA9IHZFcnJvcnMuY29uY2F0KCcgKyAoJHJlZkNvZGUpICsgJy5lcnJvcnMpOyBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsgfSAnO1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3JlcXVpcmVkKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkdlNjaGVtYSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgaWYgKCEkaXNEYXRhKSB7XG4gICAgaWYgKCRzY2hlbWEubGVuZ3RoIDwgaXQub3B0cy5sb29wUmVxdWlyZWQgJiYgaXQuc2NoZW1hLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMoaXQuc2NoZW1hLnByb3BlcnRpZXMpLmxlbmd0aCkge1xuICAgICAgdmFyICRyZXF1aXJlZCA9IFtdO1xuICAgICAgdmFyIGFycjEgPSAkc2NoZW1hO1xuICAgICAgaWYgKGFycjEpIHtcbiAgICAgICAgdmFyICRwcm9wZXJ0eSwgaTEgPSAtMSxcbiAgICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKGkxIDwgbDEpIHtcbiAgICAgICAgICAkcHJvcGVydHkgPSBhcnIxW2kxICs9IDFdO1xuICAgICAgICAgIHZhciAkcHJvcGVydHlTY2ggPSBpdC5zY2hlbWEucHJvcGVydGllc1skcHJvcGVydHldO1xuICAgICAgICAgIGlmICghKCRwcm9wZXJ0eVNjaCAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHByb3BlcnR5U2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRwcm9wZXJ0eVNjaCkubGVuZ3RoID4gMCkgfHwgJHByb3BlcnR5U2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHByb3BlcnR5U2NoLCBpdC5SVUxFUy5hbGwpKSkpIHtcbiAgICAgICAgICAgICRyZXF1aXJlZFskcmVxdWlyZWQubGVuZ3RoXSA9ICRwcm9wZXJ0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyICRyZXF1aXJlZCA9ICRzY2hlbWE7XG4gICAgfVxuICB9XG4gIGlmICgkaXNEYXRhIHx8ICRyZXF1aXJlZC5sZW5ndGgpIHtcbiAgICB2YXIgJGN1cnJlbnRFcnJvclBhdGggPSBpdC5lcnJvclBhdGgsXG4gICAgICAkbG9vcFJlcXVpcmVkID0gJGlzRGF0YSB8fCAkcmVxdWlyZWQubGVuZ3RoID49IGl0Lm9wdHMubG9vcFJlcXVpcmVkLFxuICAgICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXM7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIHZhciBtaXNzaW5nJyArICgkbHZsKSArICc7ICc7XG4gICAgICBpZiAoJGxvb3BSZXF1aXJlZCkge1xuICAgICAgICBpZiAoISRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdlNjaGVtYSkgKyAnID0gdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnOyAnO1xuICAgICAgICB9XG4gICAgICAgIHZhciAkaSA9ICdpJyArICRsdmwsXG4gICAgICAgICAgJHByb3BlcnR5UGF0aCA9ICdzY2hlbWEnICsgJGx2bCArICdbJyArICRpICsgJ10nLFxuICAgICAgICAgICRtaXNzaW5nUHJvcGVydHkgPSAnXFwnICsgJyArICRwcm9wZXJ0eVBhdGggKyAnICsgXFwnJztcbiAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eVBhdGgsIGl0Lm9wdHMuanNvblBvaW50ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJyA9IHRydWU7ICc7XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKHNjaGVtYScgKyAoJGx2bCkgKyAnID09PSB1bmRlZmluZWQpICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyBlbHNlIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEnICsgKCRsdmwpICsgJykpICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgZWxzZSB7JztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyBmb3IgKHZhciAnICsgKCRpKSArICcgPSAwOyAnICsgKCRpKSArICcgPCAnICsgKCR2U2NoZW1hKSArICcubGVuZ3RoOyAnICsgKCRpKSArICcrKykgeyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkZGF0YSkgKyAnWycgKyAoJHZTY2hlbWEpICsgJ1snICsgKCRpKSArICddXSAhPT0gdW5kZWZpbmVkICc7XG4gICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgIG91dCArPSAnICYmICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ10pICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICc7IGlmICghJyArICgkdmFsaWQpICsgJykgYnJlYWs7IH0gJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyAgfSAgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyAgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICAgJztcbiAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdyZXF1aXJlZCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJyB9ICc7XG4gICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIG91dCArPSAnaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJ3Nob3VsZCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5IFxcXFxcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcXFxcXCcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9IGVsc2UgeyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCAnO1xuICAgICAgICB2YXIgYXJyMiA9ICRyZXF1aXJlZDtcbiAgICAgICAgaWYgKGFycjIpIHtcbiAgICAgICAgICB2YXIgJHByb3BlcnR5S2V5LCAkaSA9IC0xLFxuICAgICAgICAgICAgbDIgPSBhcnIyLmxlbmd0aCAtIDE7XG4gICAgICAgICAgd2hpbGUgKCRpIDwgbDIpIHtcbiAgICAgICAgICAgICRwcm9wZXJ0eUtleSA9IGFycjJbJGkgKz0gMV07XG4gICAgICAgICAgICBpZiAoJGkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciAkcHJvcCA9IGl0LnV0aWwuZ2V0UHJvcGVydHkoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJHVzZURhdGEgPSAkZGF0YSArICRwcm9wO1xuICAgICAgICAgICAgb3V0ICs9ICcgKCAoICcgKyAoJHVzZURhdGEpICsgJyA9PT0gdW5kZWZpbmVkICc7XG4gICAgICAgICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnKSAmJiAobWlzc2luZycgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKGl0Lm9wdHMuanNvblBvaW50ZXJzID8gJHByb3BlcnR5S2V5IDogJHByb3ApKSArICcpICkgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcpIHsgICc7XG4gICAgICAgIHZhciAkcHJvcGVydHlQYXRoID0gJ21pc3NpbmcnICsgJGx2bCxcbiAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gJ1xcJyArICcgKyAkcHJvcGVydHlQYXRoICsgJyArIFxcJyc7XG4gICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC5vcHRzLmpzb25Qb2ludGVycyA/IGl0LnV0aWwuZ2V0UGF0aEV4cHIoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eVBhdGgsIHRydWUpIDogJGN1cnJlbnRFcnJvclBhdGggKyAnICsgJyArICRwcm9wZXJ0eVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdyZXF1aXJlZCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJyB9ICc7XG4gICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIG91dCArPSAnaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJ3Nob3VsZCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5IFxcXFxcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcXFxcXCcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9IGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoJGxvb3BSZXF1aXJlZCkge1xuICAgICAgICBpZiAoISRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdlNjaGVtYSkgKyAnID0gdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnOyAnO1xuICAgICAgICB9XG4gICAgICAgIHZhciAkaSA9ICdpJyArICRsdmwsXG4gICAgICAgICAgJHByb3BlcnR5UGF0aCA9ICdzY2hlbWEnICsgJGx2bCArICdbJyArICRpICsgJ10nLFxuICAgICAgICAgICRtaXNzaW5nUHJvcGVydHkgPSAnXFwnICsgJyArICRwcm9wZXJ0eVBhdGggKyAnICsgXFwnJztcbiAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eVBhdGgsIGl0Lm9wdHMuanNvblBvaW50ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCR2U2NoZW1hKSArICcgJiYgIUFycmF5LmlzQXJyYXkoJyArICgkdlNjaGVtYSkgKyAnKSkgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdyZXF1aXJlZCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJyB9ICc7XG4gICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCcnO1xuICAgICAgICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJ3Nob3VsZCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5IFxcXFxcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcXFxcXCcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7IH0gZWxzZSBpZiAoJyArICgkdlNjaGVtYSkgKyAnICE9PSB1bmRlZmluZWQpIHsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyBmb3IgKHZhciAnICsgKCRpKSArICcgPSAwOyAnICsgKCRpKSArICcgPCAnICsgKCR2U2NoZW1hKSArICcubGVuZ3RoOyAnICsgKCRpKSArICcrKykgeyBpZiAoJyArICgkZGF0YSkgKyAnWycgKyAoJHZTY2hlbWEpICsgJ1snICsgKCRpKSArICddXSA9PT0gdW5kZWZpbmVkICc7XG4gICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ10pICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcpIHsgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdyZXF1aXJlZCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJyB9ICc7XG4gICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIG91dCArPSAnaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJ3Nob3VsZCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5IFxcXFxcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcXFxcXCcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSB9ICc7XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICcgIH0gICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcnIzID0gJHJlcXVpcmVkO1xuICAgICAgICBpZiAoYXJyMykge1xuICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksIGkzID0gLTEsXG4gICAgICAgICAgICBsMyA9IGFycjMubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoaTMgPCBsMykge1xuICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyM1tpMyArPSAxXTtcbiAgICAgICAgICAgIHZhciAkcHJvcCA9IGl0LnV0aWwuZ2V0UHJvcGVydHkoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9IGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSksXG4gICAgICAgICAgICAgICR1c2VEYXRhID0gJGRhdGEgKyAkcHJvcDtcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoKCRjdXJyZW50RXJyb3JQYXRoLCAkcHJvcGVydHlLZXksIGl0Lm9wdHMuanNvblBvaW50ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIGlmICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpIHsgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCcnO1xuICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7IH0gJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaXQuZXJyb3JQYXRoID0gJGN1cnJlbnRFcnJvclBhdGg7XG4gIH0gZWxzZSBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGlmICh0cnVlKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV91bmlxdWVJdGVtcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoKCRzY2hlbWEgfHwgJGlzRGF0YSkgJiYgaXQub3B0cy51bmlxdWVJdGVtcyAhPT0gZmFsc2UpIHtcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHZhbGlkKSArICc7IGlmICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSBmYWxzZSB8fCAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSB1bmRlZmluZWQpICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyBlbHNlIGlmICh0eXBlb2YgJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPSBcXCdib29sZWFuXFwnKSAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7IGVsc2UgeyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB2YXIgaSA9ICcgKyAoJGRhdGEpICsgJy5sZW5ndGggLCAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZSAsIGo7IGlmIChpID4gMSkgeyAnO1xuICAgIHZhciAkaXRlbVR5cGUgPSBpdC5zY2hlbWEuaXRlbXMgJiYgaXQuc2NoZW1hLml0ZW1zLnR5cGUsXG4gICAgICAkdHlwZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCRpdGVtVHlwZSk7XG4gICAgaWYgKCEkaXRlbVR5cGUgfHwgJGl0ZW1UeXBlID09ICdvYmplY3QnIHx8ICRpdGVtVHlwZSA9PSAnYXJyYXknIHx8ICgkdHlwZUlzQXJyYXkgJiYgKCRpdGVtVHlwZS5pbmRleE9mKCdvYmplY3QnKSA+PSAwIHx8ICRpdGVtVHlwZS5pbmRleE9mKCdhcnJheScpID49IDApKSkge1xuICAgICAgb3V0ICs9ICcgb3V0ZXI6IGZvciAoO2ktLTspIHsgZm9yIChqID0gaTsgai0tOykgeyBpZiAoZXF1YWwoJyArICgkZGF0YSkgKyAnW2ldLCAnICsgKCRkYXRhKSArICdbal0pKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgYnJlYWsgb3V0ZXI7IH0gfSB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciBpdGVtSW5kaWNlcyA9IHt9LCBpdGVtOyBmb3IgKDtpLS07KSB7IHZhciBpdGVtID0gJyArICgkZGF0YSkgKyAnW2ldOyAnO1xuICAgICAgdmFyICRtZXRob2QgPSAnY2hlY2tEYXRhVHlwZScgKyAoJHR5cGVJc0FycmF5ID8gJ3MnIDogJycpO1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXRpbFskbWV0aG9kXSgkaXRlbVR5cGUsICdpdGVtJywgaXQub3B0cy5zdHJpY3ROdW1iZXJzLCB0cnVlKSkgKyAnKSBjb250aW51ZTsgJztcbiAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKHR5cGVvZiBpdGVtID09IFxcJ3N0cmluZ1xcJykgaXRlbSA9IFxcJ1wiXFwnICsgaXRlbTsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGlmICh0eXBlb2YgaXRlbUluZGljZXNbaXRlbV0gPT0gXFwnbnVtYmVyXFwnKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgaiA9IGl0ZW1JbmRpY2VzW2l0ZW1dOyBicmVhazsgfSBpdGVtSW5kaWNlc1tpdGVtXSA9IGk7IH0gJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyAgfSAgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICAgJztcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgndW5pcXVlSXRlbXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGk6IGksIGo6IGogfSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBoYXZlIGR1cGxpY2F0ZSBpdGVtcyAoaXRlbXMgIyMgXFwnICsgaiArIFxcJyBhbmQgXFwnICsgaSArIFxcJyBhcmUgaWRlbnRpY2FsKVxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogICc7XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgICAgICAgICAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgdmFyIF9fZXJyID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfdmFsaWRhdGUoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcnO1xuICB2YXIgJGFzeW5jID0gaXQuc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZSxcbiAgICAkcmVmS2V5d29yZHMgPSBpdC51dGlsLnNjaGVtYUhhc1J1bGVzRXhjZXB0KGl0LnNjaGVtYSwgaXQuUlVMRVMuYWxsLCAnJHJlZicpLFxuICAgICRpZCA9IGl0LnNlbGYuX2dldElkKGl0LnNjaGVtYSk7XG4gIGlmIChpdC5vcHRzLnN0cmljdEtleXdvcmRzKSB7XG4gICAgdmFyICR1bmtub3duS3dkID0gaXQudXRpbC5zY2hlbWFVbmtub3duUnVsZXMoaXQuc2NoZW1hLCBpdC5SVUxFUy5rZXl3b3Jkcyk7XG4gICAgaWYgKCR1bmtub3duS3dkKSB7XG4gICAgICB2YXIgJGtleXdvcmRzTXNnID0gJ3Vua25vd24ga2V5d29yZDogJyArICR1bmtub3duS3dkO1xuICAgICAgaWYgKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPT09ICdsb2cnKSBpdC5sb2dnZXIud2Fybigka2V5d29yZHNNc2cpO1xuICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJGtleXdvcmRzTXNnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGl0LmlzVG9wKSB7XG4gICAgb3V0ICs9ICcgdmFyIHZhbGlkYXRlID0gJztcbiAgICBpZiAoJGFzeW5jKSB7XG4gICAgICBpdC5hc3luYyA9IHRydWU7XG4gICAgICBvdXQgKz0gJ2FzeW5jICc7XG4gICAgfVxuICAgIG91dCArPSAnZnVuY3Rpb24oZGF0YSwgZGF0YVBhdGgsIHBhcmVudERhdGEsIHBhcmVudERhdGFQcm9wZXJ0eSwgcm9vdERhdGEpIHsgXFwndXNlIHN0cmljdFxcJzsgJztcbiAgICBpZiAoJGlkICYmIChpdC5vcHRzLnNvdXJjZUNvZGUgfHwgaXQub3B0cy5wcm9jZXNzQ29kZSkpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJy9cXCojIHNvdXJjZVVSTD0nICsgJGlkICsgJyAqLycpICsgJyAnO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIGl0LnNjaGVtYSA9PSAnYm9vbGVhbicgfHwgISgkcmVmS2V5d29yZHMgfHwgaXQuc2NoZW1hLiRyZWYpKSB7XG4gICAgdmFyICRrZXl3b3JkID0gJ2ZhbHNlIHNjaGVtYSc7XG4gICAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gICAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICAgIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gICAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gICAgdmFyICRlcnJvcktleXdvcmQ7XG4gICAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gICAgaWYgKGl0LnNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChpdC5pc1RvcCkge1xuICAgICAgICAkYnJlYWtPbkVycm9yID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ2ZhbHNlIHNjaGVtYScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnYm9vbGVhbiBzY2hlbWEgaXMgZmFsc2VcXCcgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IGZhbHNlICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICB9XG4gICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGl0LmlzVG9wKSB7XG4gICAgICAgIGlmICgkYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyByZXR1cm4gZGF0YTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBudWxsOyByZXR1cm4gdHJ1ZTsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyAnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXQuaXNUb3ApIHtcbiAgICAgIG91dCArPSAnIH07IHJldHVybiB2YWxpZGF0ZTsgJztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICBpZiAoaXQuaXNUb3ApIHtcbiAgICB2YXIgJHRvcCA9IGl0LmlzVG9wLFxuICAgICAgJGx2bCA9IGl0LmxldmVsID0gMCxcbiAgICAgICRkYXRhTHZsID0gaXQuZGF0YUxldmVsID0gMCxcbiAgICAgICRkYXRhID0gJ2RhdGEnO1xuICAgIGl0LnJvb3RJZCA9IGl0LnJlc29sdmUuZnVsbFBhdGgoaXQuc2VsZi5fZ2V0SWQoaXQucm9vdC5zY2hlbWEpKTtcbiAgICBpdC5iYXNlSWQgPSBpdC5iYXNlSWQgfHwgaXQucm9vdElkO1xuICAgIGRlbGV0ZSBpdC5pc1RvcDtcbiAgICBpdC5kYXRhUGF0aEFyciA9IFtcIlwiXTtcbiAgICBpZiAoaXQuc2NoZW1hLmRlZmF1bHQgIT09IHVuZGVmaW5lZCAmJiBpdC5vcHRzLnVzZURlZmF1bHRzICYmIGl0Lm9wdHMuc3RyaWN0RGVmYXVsdHMpIHtcbiAgICAgIHZhciAkZGVmYXVsdE1zZyA9ICdkZWZhdWx0IGlzIGlnbm9yZWQgaW4gdGhlIHNjaGVtYSByb290JztcbiAgICAgIGlmIChpdC5vcHRzLnN0cmljdERlZmF1bHRzID09PSAnbG9nJykgaXQubG9nZ2VyLndhcm4oJGRlZmF1bHRNc2cpO1xuICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJGRlZmF1bHRNc2cpO1xuICAgIH1cbiAgICBvdXQgKz0gJyB2YXIgdkVycm9ycyA9IG51bGw7ICc7XG4gICAgb3V0ICs9ICcgdmFyIGVycm9ycyA9IDA7ICAgICAnO1xuICAgIG91dCArPSAnIGlmIChyb290RGF0YSA9PT0gdW5kZWZpbmVkKSByb290RGF0YSA9IGRhdGE7ICc7XG4gIH0gZWxzZSB7XG4gICAgdmFyICRsdmwgPSBpdC5sZXZlbCxcbiAgICAgICRkYXRhTHZsID0gaXQuZGF0YUxldmVsLFxuICAgICAgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICAgIGlmICgkaWQpIGl0LmJhc2VJZCA9IGl0LnJlc29sdmUudXJsKGl0LmJhc2VJZCwgJGlkKTtcbiAgICBpZiAoJGFzeW5jICYmICFpdC5hc3luYykgdGhyb3cgbmV3IEVycm9yKCdhc3luYyBzY2hlbWEgaW4gc3luYyBzY2hlbWEnKTtcbiAgICBvdXQgKz0gJyB2YXIgZXJyc18nICsgKCRsdmwpICsgJyA9IGVycm9yczsnO1xuICB9XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bCxcbiAgICAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzLFxuICAgICRjbG9zaW5nQnJhY2VzMSA9ICcnLFxuICAgICRjbG9zaW5nQnJhY2VzMiA9ICcnO1xuICB2YXIgJGVycm9yS2V5d29yZDtcbiAgdmFyICR0eXBlU2NoZW1hID0gaXQuc2NoZW1hLnR5cGUsXG4gICAgJHR5cGVJc0FycmF5ID0gQXJyYXkuaXNBcnJheSgkdHlwZVNjaGVtYSk7XG4gIGlmICgkdHlwZVNjaGVtYSAmJiBpdC5vcHRzLm51bGxhYmxlICYmIGl0LnNjaGVtYS5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgIGlmICgkdHlwZVNjaGVtYS5pbmRleE9mKCdudWxsJykgPT0gLTEpICR0eXBlU2NoZW1hID0gJHR5cGVTY2hlbWEuY29uY2F0KCdudWxsJyk7XG4gICAgfSBlbHNlIGlmICgkdHlwZVNjaGVtYSAhPSAnbnVsbCcpIHtcbiAgICAgICR0eXBlU2NoZW1hID0gWyR0eXBlU2NoZW1hLCAnbnVsbCddO1xuICAgICAgJHR5cGVJc0FycmF5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCR0eXBlSXNBcnJheSAmJiAkdHlwZVNjaGVtYS5sZW5ndGggPT0gMSkge1xuICAgICR0eXBlU2NoZW1hID0gJHR5cGVTY2hlbWFbMF07XG4gICAgJHR5cGVJc0FycmF5ID0gZmFsc2U7XG4gIH1cbiAgaWYgKGl0LnNjaGVtYS4kcmVmICYmICRyZWZLZXl3b3Jkcykge1xuICAgIGlmIChpdC5vcHRzLmV4dGVuZFJlZnMgPT0gJ2ZhaWwnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJyRyZWY6IHZhbGlkYXRpb24ga2V5d29yZHMgdXNlZCBpbiBzY2hlbWEgYXQgcGF0aCBcIicgKyBpdC5lcnJTY2hlbWFQYXRoICsgJ1wiIChzZWUgb3B0aW9uIGV4dGVuZFJlZnMpJyk7XG4gICAgfSBlbHNlIGlmIChpdC5vcHRzLmV4dGVuZFJlZnMgIT09IHRydWUpIHtcbiAgICAgICRyZWZLZXl3b3JkcyA9IGZhbHNlO1xuICAgICAgaXQubG9nZ2VyLndhcm4oJyRyZWY6IGtleXdvcmRzIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIicpO1xuICAgIH1cbiAgfVxuICBpZiAoaXQuc2NoZW1hLiRjb21tZW50ICYmIGl0Lm9wdHMuJGNvbW1lbnQpIHtcbiAgICBvdXQgKz0gJyAnICsgKGl0LlJVTEVTLmFsbC4kY29tbWVudC5jb2RlKGl0LCAnJGNvbW1lbnQnKSk7XG4gIH1cbiAgaWYgKCR0eXBlU2NoZW1hKSB7XG4gICAgaWYgKGl0Lm9wdHMuY29lcmNlVHlwZXMpIHtcbiAgICAgIHZhciAkY29lcmNlVG9UeXBlcyA9IGl0LnV0aWwuY29lcmNlVG9UeXBlcyhpdC5vcHRzLmNvZXJjZVR5cGVzLCAkdHlwZVNjaGVtYSk7XG4gICAgfVxuICAgIHZhciAkcnVsZXNHcm91cCA9IGl0LlJVTEVTLnR5cGVzWyR0eXBlU2NoZW1hXTtcbiAgICBpZiAoJGNvZXJjZVRvVHlwZXMgfHwgJHR5cGVJc0FycmF5IHx8ICRydWxlc0dyb3VwID09PSB0cnVlIHx8ICgkcnVsZXNHcm91cCAmJiAhJHNob3VsZFVzZUdyb3VwKCRydWxlc0dyb3VwKSkpIHtcbiAgICAgIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnR5cGUnLFxuICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL3R5cGUnO1xuICAgICAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcudHlwZScsXG4gICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvdHlwZScsXG4gICAgICAgICRtZXRob2QgPSAkdHlwZUlzQXJyYXkgPyAnY2hlY2tEYXRhVHlwZXMnIDogJ2NoZWNrRGF0YVR5cGUnO1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXRpbFskbWV0aG9kXSgkdHlwZVNjaGVtYSwgJGRhdGEsIGl0Lm9wdHMuc3RyaWN0TnVtYmVycywgdHJ1ZSkpICsgJykgeyAnO1xuICAgICAgaWYgKCRjb2VyY2VUb1R5cGVzKSB7XG4gICAgICAgIHZhciAkZGF0YVR5cGUgPSAnZGF0YVR5cGUnICsgJGx2bCxcbiAgICAgICAgICAkY29lcmNlZCA9ICdjb2VyY2VkJyArICRsdmw7XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCRkYXRhVHlwZSkgKyAnID0gdHlwZW9mICcgKyAoJGRhdGEpICsgJzsgdmFyICcgKyAoJGNvZXJjZWQpICsgJyA9IHVuZGVmaW5lZDsgJztcbiAgICAgICAgaWYgKGl0Lm9wdHMuY29lcmNlVHlwZXMgPT0gJ2FycmF5Jykge1xuICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ29iamVjdFxcJyAmJiBBcnJheS5pc0FycmF5KCcgKyAoJGRhdGEpICsgJykgJiYgJyArICgkZGF0YSkgKyAnLmxlbmd0aCA9PSAxKSB7ICcgKyAoJGRhdGEpICsgJyA9ICcgKyAoJGRhdGEpICsgJ1swXTsgJyArICgkZGF0YVR5cGUpICsgJyA9IHR5cGVvZiAnICsgKCRkYXRhKSArICc7IGlmICgnICsgKGl0LnV0aWwuY2hlY2tEYXRhVHlwZShpdC5zY2hlbWEudHlwZSwgJGRhdGEsIGl0Lm9wdHMuc3RyaWN0TnVtYmVycykpICsgJykgJyArICgkY29lcmNlZCkgKyAnID0gJyArICgkZGF0YSkgKyAnOyB9ICc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJGNvZXJjZWQpICsgJyAhPT0gdW5kZWZpbmVkKSA7ICc7XG4gICAgICAgIHZhciBhcnIxID0gJGNvZXJjZVRvVHlwZXM7XG4gICAgICAgIGlmIChhcnIxKSB7XG4gICAgICAgICAgdmFyICR0eXBlLCAkaSA9IC0xLFxuICAgICAgICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgICAgICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICAgICAgICR0eXBlID0gYXJyMVskaSArPSAxXTtcbiAgICAgICAgICAgIGlmICgkdHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyBlbHNlIGlmICgnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ251bWJlclxcJyB8fCAnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ2Jvb2xlYW5cXCcpICcgKyAoJGNvZXJjZWQpICsgJyA9IFxcJ1xcJyArICcgKyAoJGRhdGEpICsgJzsgZWxzZSBpZiAoJyArICgkZGF0YSkgKyAnID09PSBudWxsKSAnICsgKCRjb2VyY2VkKSArICcgPSBcXCdcXCc7ICc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR0eXBlID09ICdudW1iZXInIHx8ICR0eXBlID09ICdpbnRlZ2VyJykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyBlbHNlIGlmICgnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ2Jvb2xlYW5cXCcgfHwgJyArICgkZGF0YSkgKyAnID09PSBudWxsIHx8ICgnICsgKCRkYXRhVHlwZSkgKyAnID09IFxcJ3N0cmluZ1xcJyAmJiAnICsgKCRkYXRhKSArICcgJiYgJyArICgkZGF0YSkgKyAnID09ICsnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgaWYgKCR0eXBlID09ICdpbnRlZ2VyJykge1xuICAgICAgICAgICAgICAgIG91dCArPSAnICYmICEoJyArICgkZGF0YSkgKyAnICUgMSknO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnKSkgJyArICgkY29lcmNlZCkgKyAnID0gKycgKyAoJGRhdGEpICsgJzsgJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHR5cGUgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgaWYgKCcgKyAoJGRhdGEpICsgJyA9PT0gXFwnZmFsc2VcXCcgfHwgJyArICgkZGF0YSkgKyAnID09PSAwIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gbnVsbCkgJyArICgkY29lcmNlZCkgKyAnID0gZmFsc2U7IGVsc2UgaWYgKCcgKyAoJGRhdGEpICsgJyA9PT0gXFwndHJ1ZVxcJyB8fCAnICsgKCRkYXRhKSArICcgPT09IDEpICcgKyAoJGNvZXJjZWQpICsgJyA9IHRydWU7ICc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR0eXBlID09ICdudWxsJykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyBlbHNlIGlmICgnICsgKCRkYXRhKSArICcgPT09IFxcJ1xcJyB8fCAnICsgKCRkYXRhKSArICcgPT09IDAgfHwgJyArICgkZGF0YSkgKyAnID09PSBmYWxzZSkgJyArICgkY29lcmNlZCkgKyAnID0gbnVsbDsgJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQub3B0cy5jb2VyY2VUeXBlcyA9PSAnYXJyYXknICYmICR0eXBlID09ICdhcnJheScpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdzdHJpbmdcXCcgfHwgJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdudW1iZXJcXCcgfHwgJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdib29sZWFuXFwnIHx8ICcgKyAoJGRhdGEpICsgJyA9PSBudWxsKSAnICsgKCRjb2VyY2VkKSArICcgPSBbJyArICgkZGF0YSkgKyAnXTsgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICAgJztcbiAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ3R5cGUnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHR5cGU6IFxcJyc7XG4gICAgICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgJztcbiAgICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gaWYgKCcgKyAoJGNvZXJjZWQpICsgJyAhPT0gdW5kZWZpbmVkKSB7ICAnO1xuICAgICAgICB2YXIgJHBhcmVudERhdGEgPSAkZGF0YUx2bCA/ICdkYXRhJyArICgoJGRhdGFMdmwgLSAxKSB8fCAnJykgOiAncGFyZW50RGF0YScsXG4gICAgICAgICAgJHBhcmVudERhdGFQcm9wZXJ0eSA9ICRkYXRhTHZsID8gaXQuZGF0YVBhdGhBcnJbJGRhdGFMdmxdIDogJ3BhcmVudERhdGFQcm9wZXJ0eSc7XG4gICAgICAgIG91dCArPSAnICcgKyAoJGRhdGEpICsgJyA9ICcgKyAoJGNvZXJjZWQpICsgJzsgJztcbiAgICAgICAgaWYgKCEkZGF0YUx2bCkge1xuICAgICAgICAgIG91dCArPSAnaWYgKCcgKyAoJHBhcmVudERhdGEpICsgJyAhPT0gdW5kZWZpbmVkKSc7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgJyArICgkcGFyZW50RGF0YSkgKyAnWycgKyAoJHBhcmVudERhdGFQcm9wZXJ0eSkgKyAnXSA9ICcgKyAoJGNvZXJjZWQpICsgJzsgfSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ3R5cGUnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHR5cGU6IFxcJyc7XG4gICAgICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgJztcbiAgICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICB9XG4gIGlmIChpdC5zY2hlbWEuJHJlZiAmJiAhJHJlZktleXdvcmRzKSB7XG4gICAgb3V0ICs9ICcgJyArIChpdC5SVUxFUy5hbGwuJHJlZi5jb2RlKGl0LCAnJHJlZicpKSArICcgJztcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgfSBpZiAoZXJyb3JzID09PSAnO1xuICAgICAgaWYgKCR0b3ApIHtcbiAgICAgICAgb3V0ICs9ICcwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnZXJyc18nICsgKCRsdmwpO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcpIHsgJztcbiAgICAgICRjbG9zaW5nQnJhY2VzMiArPSAnfSc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBhcnIyID0gaXQuUlVMRVM7XG4gICAgaWYgKGFycjIpIHtcbiAgICAgIHZhciAkcnVsZXNHcm91cCwgaTIgPSAtMSxcbiAgICAgICAgbDIgPSBhcnIyLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaTIgPCBsMikge1xuICAgICAgICAkcnVsZXNHcm91cCA9IGFycjJbaTIgKz0gMV07XG4gICAgICAgIGlmICgkc2hvdWxkVXNlR3JvdXAoJHJ1bGVzR3JvdXApKSB7XG4gICAgICAgICAgaWYgKCRydWxlc0dyb3VwLnR5cGUpIHtcbiAgICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKGl0LnV0aWwuY2hlY2tEYXRhVHlwZSgkcnVsZXNHcm91cC50eXBlLCAkZGF0YSwgaXQub3B0cy5zdHJpY3ROdW1iZXJzKSkgKyAnKSB7ICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdC5vcHRzLnVzZURlZmF1bHRzKSB7XG4gICAgICAgICAgICBpZiAoJHJ1bGVzR3JvdXAudHlwZSA9PSAnb2JqZWN0JyAmJiBpdC5zY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgICAgICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICRzY2hlbWFLZXlzID0gT2JqZWN0LmtleXMoJHNjaGVtYSk7XG4gICAgICAgICAgICAgIHZhciBhcnIzID0gJHNjaGVtYUtleXM7XG4gICAgICAgICAgICAgIGlmIChhcnIzKSB7XG4gICAgICAgICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTMgPSAtMSxcbiAgICAgICAgICAgICAgICAgIGwzID0gYXJyMy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpMyA8IGwzKSB7XG4gICAgICAgICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIzW2kzICs9IDFdO1xuICAgICAgICAgICAgICAgICAgdmFyICRzY2ggPSAkc2NoZW1hWyRwcm9wZXJ0eUtleV07XG4gICAgICAgICAgICAgICAgICBpZiAoJHNjaC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQuY29tcG9zaXRlUnVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnN0cmljdERlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGRlZmF1bHRNc2cgPSAnZGVmYXVsdCBpcyBpZ25vcmVkIGZvcjogJyArICRwYXNzRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnN0cmljdERlZmF1bHRzID09PSAnbG9nJykgaXQubG9nZ2VyLndhcm4oJGRlZmF1bHRNc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJGRlZmF1bHRNc2cpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkcGFzc0RhdGEpICsgJyA9PT0gdW5kZWZpbmVkICc7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudXNlRGVmYXVsdHMgPT0gJ2VtcHR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgJyArICgkcGFzc0RhdGEpICsgJyA9PT0gbnVsbCB8fCAnICsgKCRwYXNzRGF0YSkgKyAnID09PSBcXCdcXCcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgKSAnICsgKCRwYXNzRGF0YSkgKyAnID0gJztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy51c2VEZWZhdWx0cyA9PSAnc2hhcmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51c2VEZWZhdWx0KCRzY2guZGVmYXVsdCkpICsgJyAnO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyAnICsgKEpTT04uc3RyaW5naWZ5KCRzY2guZGVmYXVsdCkpICsgJyAnO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJzsgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgkcnVsZXNHcm91cC50eXBlID09ICdhcnJheScgJiYgQXJyYXkuaXNBcnJheShpdC5zY2hlbWEuaXRlbXMpKSB7XG4gICAgICAgICAgICAgIHZhciBhcnI0ID0gaXQuc2NoZW1hLml0ZW1zO1xuICAgICAgICAgICAgICBpZiAoYXJyNCkge1xuICAgICAgICAgICAgICAgIHZhciAkc2NoLCAkaSA9IC0xLFxuICAgICAgICAgICAgICAgICAgbDQgPSBhcnI0Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCRpIDwgbDQpIHtcbiAgICAgICAgICAgICAgICAgICRzY2ggPSBhcnI0WyRpICs9IDFdO1xuICAgICAgICAgICAgICAgICAgaWYgKCRzY2guZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArICdbJyArICRpICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQuY29tcG9zaXRlUnVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnN0cmljdERlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGRlZmF1bHRNc2cgPSAnZGVmYXVsdCBpcyBpZ25vcmVkIGZvcjogJyArICRwYXNzRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnN0cmljdERlZmF1bHRzID09PSAnbG9nJykgaXQubG9nZ2VyLndhcm4oJGRlZmF1bHRNc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJGRlZmF1bHRNc2cpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkcGFzc0RhdGEpICsgJyA9PT0gdW5kZWZpbmVkICc7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudXNlRGVmYXVsdHMgPT0gJ2VtcHR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgJyArICgkcGFzc0RhdGEpICsgJyA9PT0gbnVsbCB8fCAnICsgKCRwYXNzRGF0YSkgKyAnID09PSBcXCdcXCcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgKSAnICsgKCRwYXNzRGF0YSkgKyAnID0gJztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy51c2VEZWZhdWx0cyA9PSAnc2hhcmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51c2VEZWZhdWx0KCRzY2guZGVmYXVsdCkpICsgJyAnO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyAnICsgKEpTT04uc3RyaW5naWZ5KCRzY2guZGVmYXVsdCkpICsgJyAnO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJzsgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYXJyNSA9ICRydWxlc0dyb3VwLnJ1bGVzO1xuICAgICAgICAgIGlmIChhcnI1KSB7XG4gICAgICAgICAgICB2YXIgJHJ1bGUsIGk1ID0gLTEsXG4gICAgICAgICAgICAgIGw1ID0gYXJyNS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgd2hpbGUgKGk1IDwgbDUpIHtcbiAgICAgICAgICAgICAgJHJ1bGUgPSBhcnI1W2k1ICs9IDFdO1xuICAgICAgICAgICAgICBpZiAoJHNob3VsZFVzZVJ1bGUoJHJ1bGUpKSB7XG4gICAgICAgICAgICAgICAgdmFyICRjb2RlID0gJHJ1bGUuY29kZShpdCwgJHJ1bGUua2V5d29yZCwgJHJ1bGVzR3JvdXAudHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCRjb2RlKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICRjbG9zaW5nQnJhY2VzMSArPSAnfSc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRjbG9zaW5nQnJhY2VzMSkgKyAnICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlczEgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRydWxlc0dyb3VwLnR5cGUpIHtcbiAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICAgIGlmICgkdHlwZVNjaGVtYSAmJiAkdHlwZVNjaGVtYSA9PT0gJHJ1bGVzR3JvdXAudHlwZSAmJiAhJGNvZXJjZVRvVHlwZXMpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgICAgICAgICAgIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnR5cGUnLFxuICAgICAgICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvdHlwZSc7XG4gICAgICAgICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICd0eXBlJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyB0eXBlOiBcXCcnO1xuICAgICAgICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dCArPSAnXFwnIH0gJztcbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlICc7XG4gICAgICAgICAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoZXJyb3JzID09PSAnO1xuICAgICAgICAgICAgaWYgKCR0b3ApIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcwJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnZXJyc18nICsgKCRsdmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpIHsgJztcbiAgICAgICAgICAgICRjbG9zaW5nQnJhY2VzMiArPSAnfSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlczIpICsgJyAnO1xuICB9XG4gIGlmICgkdG9wKSB7XG4gICAgaWYgKCRhc3luYykge1xuICAgICAgb3V0ICs9ICcgaWYgKGVycm9ycyA9PT0gMCkgcmV0dXJuIGRhdGE7ICAgICAgICAgICAnO1xuICAgICAgb3V0ICs9ICcgZWxzZSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyAnO1xuICAgICAgb3V0ICs9ICcgcmV0dXJuIGVycm9ycyA9PT0gMDsgICAgICAgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfTsgcmV0dXJuIHZhbGlkYXRlOyc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJHZhbGlkKSArICcgPSBlcnJvcnMgPT09IGVycnNfJyArICgkbHZsKSArICc7JztcbiAgfVxuXG4gIGZ1bmN0aW9uICRzaG91bGRVc2VHcm91cCgkcnVsZXNHcm91cCkge1xuICAgIHZhciBydWxlcyA9ICRydWxlc0dyb3VwLnJ1bGVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspXG4gICAgICBpZiAoJHNob3VsZFVzZVJ1bGUocnVsZXNbaV0pKSByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRzaG91bGRVc2VSdWxlKCRydWxlKSB7XG4gICAgcmV0dXJuIGl0LnNjaGVtYVskcnVsZS5rZXl3b3JkXSAhPT0gdW5kZWZpbmVkIHx8ICgkcnVsZS5pbXBsZW1lbnRzICYmICRydWxlSW1wbGVtZW50c1NvbWVLZXl3b3JkKCRydWxlKSk7XG4gIH1cblxuICBmdW5jdGlvbiAkcnVsZUltcGxlbWVudHNTb21lS2V5d29yZCgkcnVsZSkge1xuICAgIHZhciBpbXBsID0gJHJ1bGUuaW1wbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGltcGwubGVuZ3RoOyBpKyspXG4gICAgICBpZiAoaXQuc2NoZW1hW2ltcGxbaV1dICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBJREVOVElGSUVSID0gL15bYS16XyRdW2EtejAtOV8kLV0qJC9pO1xudmFyIGN1c3RvbVJ1bGVDb2RlID0gcmVxdWlyZSgnLi9kb3Rqcy9jdXN0b20nKTtcbnZhciBkZWZpbml0aW9uU2NoZW1hID0gcmVxdWlyZSgnLi9kZWZpbml0aW9uX3NjaGVtYScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRkOiBhZGRLZXl3b3JkLFxuICBnZXQ6IGdldEtleXdvcmQsXG4gIHJlbW92ZTogcmVtb3ZlS2V5d29yZCxcbiAgdmFsaWRhdGU6IHZhbGlkYXRlS2V5d29yZFxufTtcblxuXG4vKipcbiAqIERlZmluZSBjdXN0b20ga2V5d29yZFxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IGtleXdvcmQgY3VzdG9tIGtleXdvcmQsIHNob3VsZCBiZSB1bmlxdWUgKGluY2x1ZGluZyBkaWZmZXJlbnQgZnJvbSBhbGwgc3RhbmRhcmQsIGN1c3RvbSBhbmQgbWFjcm8ga2V5d29yZHMpLlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmluaXRpb24ga2V5d29yZCBkZWZpbml0aW9uIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHR5cGVgICh0eXBlKHMpIHdoaWNoIHRoZSBrZXl3b3JkIGFwcGxpZXMgdG8pLCBgdmFsaWRhdGVgIG9yIGBjb21waWxlYC5cbiAqIEByZXR1cm4ge0Fqdn0gdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gKi9cbmZ1bmN0aW9uIGFkZEtleXdvcmQoa2V5d29yZCwgZGVmaW5pdGlvbikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIC8qIGVzbGludCBuby1zaGFkb3c6IDAgKi9cbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcbiAgaWYgKFJVTEVTLmtleXdvcmRzW2tleXdvcmRdKVxuICAgIHRocm93IG5ldyBFcnJvcignS2V5d29yZCAnICsga2V5d29yZCArICcgaXMgYWxyZWFkeSBkZWZpbmVkJyk7XG5cbiAgaWYgKCFJREVOVElGSUVSLnRlc3Qoa2V5d29yZCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdLZXl3b3JkICcgKyBrZXl3b3JkICsgJyBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyJyk7XG5cbiAgaWYgKGRlZmluaXRpb24pIHtcbiAgICB0aGlzLnZhbGlkYXRlS2V5d29yZChkZWZpbml0aW9uLCB0cnVlKTtcblxuICAgIHZhciBkYXRhVHlwZSA9IGRlZmluaXRpb24udHlwZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhVHlwZSkpIHtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhVHlwZS5sZW5ndGg7IGkrKylcbiAgICAgICAgX2FkZFJ1bGUoa2V5d29yZCwgZGF0YVR5cGVbaV0sIGRlZmluaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfYWRkUnVsZShrZXl3b3JkLCBkYXRhVHlwZSwgZGVmaW5pdGlvbik7XG4gICAgfVxuXG4gICAgdmFyIG1ldGFTY2hlbWEgPSBkZWZpbml0aW9uLm1ldGFTY2hlbWE7XG4gICAgaWYgKG1ldGFTY2hlbWEpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uLiRkYXRhICYmIHRoaXMuX29wdHMuJGRhdGEpIHtcbiAgICAgICAgbWV0YVNjaGVtYSA9IHtcbiAgICAgICAgICBhbnlPZjogW1xuICAgICAgICAgICAgbWV0YVNjaGVtYSxcbiAgICAgICAgICAgIHsgJyRyZWYnOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZGVmaW5pdGlvbi52YWxpZGF0ZVNjaGVtYSA9IHRoaXMuY29tcGlsZShtZXRhU2NoZW1hLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBSVUxFUy5rZXl3b3Jkc1trZXl3b3JkXSA9IFJVTEVTLmFsbFtrZXl3b3JkXSA9IHRydWU7XG5cblxuICBmdW5jdGlvbiBfYWRkUnVsZShrZXl3b3JkLCBkYXRhVHlwZSwgZGVmaW5pdGlvbikge1xuICAgIHZhciBydWxlR3JvdXA7XG4gICAgZm9yICh2YXIgaT0wOyBpPFJVTEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmcgPSBSVUxFU1tpXTtcbiAgICAgIGlmIChyZy50eXBlID09IGRhdGFUeXBlKSB7XG4gICAgICAgIHJ1bGVHcm91cCA9IHJnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJ1bGVHcm91cCkge1xuICAgICAgcnVsZUdyb3VwID0geyB0eXBlOiBkYXRhVHlwZSwgcnVsZXM6IFtdIH07XG4gICAgICBSVUxFUy5wdXNoKHJ1bGVHcm91cCk7XG4gICAgfVxuXG4gICAgdmFyIHJ1bGUgPSB7XG4gICAgICBrZXl3b3JkOiBrZXl3b3JkLFxuICAgICAgZGVmaW5pdGlvbjogZGVmaW5pdGlvbixcbiAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgIGNvZGU6IGN1c3RvbVJ1bGVDb2RlLFxuICAgICAgaW1wbGVtZW50czogZGVmaW5pdGlvbi5pbXBsZW1lbnRzXG4gICAgfTtcbiAgICBydWxlR3JvdXAucnVsZXMucHVzaChydWxlKTtcbiAgICBSVUxFUy5jdXN0b21ba2V5d29yZF0gPSBydWxlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBHZXQga2V5d29yZFxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IGtleXdvcmQgcHJlLWRlZmluZWQgb3IgY3VzdG9tIGtleXdvcmQuXG4gKiBAcmV0dXJuIHtPYmplY3R8Qm9vbGVhbn0gY3VzdG9tIGtleXdvcmQgZGVmaW5pdGlvbiwgYHRydWVgIGlmIGl0IGlzIGEgcHJlZGVmaW5lZCBrZXl3b3JkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gZ2V0S2V5d29yZChrZXl3b3JkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHJ1bGUgPSB0aGlzLlJVTEVTLmN1c3RvbVtrZXl3b3JkXTtcbiAgcmV0dXJuIHJ1bGUgPyBydWxlLmRlZmluaXRpb24gOiB0aGlzLlJVTEVTLmtleXdvcmRzW2tleXdvcmRdIHx8IGZhbHNlO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlIGtleXdvcmRcbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXl3b3JkIHByZS1kZWZpbmVkIG9yIGN1c3RvbSBrZXl3b3JkLlxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlS2V5d29yZChrZXl3b3JkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcbiAgZGVsZXRlIFJVTEVTLmtleXdvcmRzW2tleXdvcmRdO1xuICBkZWxldGUgUlVMRVMuYWxsW2tleXdvcmRdO1xuICBkZWxldGUgUlVMRVMuY3VzdG9tW2tleXdvcmRdO1xuICBmb3IgKHZhciBpPTA7IGk8UlVMRVMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcnVsZXMgPSBSVUxFU1tpXS5ydWxlcztcbiAgICBmb3IgKHZhciBqPTA7IGo8cnVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChydWxlc1tqXS5rZXl3b3JkID09IGtleXdvcmQpIHtcbiAgICAgICAgcnVsZXMuc3BsaWNlKGosIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBWYWxpZGF0ZSBrZXl3b3JkIGRlZmluaXRpb25cbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZpbml0aW9uIGtleXdvcmQgZGVmaW5pdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93RXJyb3IgdHJ1ZSB0byB0aHJvdyBleGNlcHRpb24gaWYgZGVmaW5pdGlvbiBpcyBpbnZhbGlkXG4gKiBAcmV0dXJuIHtib29sZWFufSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUtleXdvcmQoZGVmaW5pdGlvbiwgdGhyb3dFcnJvcikge1xuICB2YWxpZGF0ZUtleXdvcmQuZXJyb3JzID0gbnVsbDtcbiAgdmFyIHYgPSB0aGlzLl92YWxpZGF0ZUtleXdvcmQgPSB0aGlzLl92YWxpZGF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aGlzLmNvbXBpbGUoZGVmaW5pdGlvblNjaGVtYSwgdHJ1ZSk7XG5cbiAgaWYgKHYoZGVmaW5pdGlvbikpIHJldHVybiB0cnVlO1xuICB2YWxpZGF0ZUtleXdvcmQuZXJyb3JzID0gdi5lcnJvcnM7XG4gIGlmICh0aHJvd0Vycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9tIGtleXdvcmQgZGVmaW5pdGlvbiBpcyBpbnZhbGlkOiAnICArIHRoaXMuZXJyb3JzVGV4dCh2LmVycm9ycykpO1xuICBlbHNlXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiY29uc3QgREVGQVVMVF9JTkRFTlRBVElPTl9DSEFSQUNURVIgPSAnJztcbmNvbnN0IERFRkFVTFRfTElORV9KT0lOID0gJ1xcbic7XG5cbmV4cG9ydCB0eXBlIFBvc3RQcm9jZXNzb3IgPSAodW5yZXBsYWNlZENvZGU6IHN0cmluZykgPT4gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCdWlsZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXNpcmVkIGluZGVudGF0aW9uIGNoYXJhY3RlciBmb3IgYWdncmVnYXRlZCBsaW5lcyBvZiBjb2RlXG4gICAqIEBkZWZhdWx0ICcnXG4gICAqL1xuICBpbmRlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2lyZWQgY2hhcmFjdGVyIHRvIGpvaW4gZWFjaCBsaW5lIG9mIGNvZGVcbiAgICogQGRlZmF1bHQgXFxuXG4gICAqL1xuICBqb2luPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29kZUJ1aWxkZXIge1xuICBwb3N0UHJvY2Vzc29yczogUG9zdFByb2Nlc3NvcltdID0gW107XG4gIGNvZGU6IHN0cmluZ1tdID0gW107XG4gIGluZGVudGF0aW9uQ2hhcmFjdGVyOiBzdHJpbmcgPSBERUZBVUxUX0lOREVOVEFUSU9OX0NIQVJBQ1RFUjtcbiAgbGluZUpvaW4gPSBERUZBVUxUX0xJTkVfSk9JTjtcblxuICAvKipcbiAgICogSGVscGVyIG9iamVjdCB0byBmb3JtYXQgYW5kIGFnZ3JhZ2F0ZSBsaW5lcyBvZiBjb2RlLlxuICAgKiBMaW5lcyBhcmUgYWdncmVnYXRlZCBpbiBhIGBjb2RlYCBhcnJheSwgYW5kIG5lZWQgdG8gYmUgam9pbmVkIHRvIG9idGFpbiBhIHByb3BlciBjb2RlIHNuaXBwZXQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7IGluZGVudCwgam9pbiB9OiBDb2RlQnVpbGRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaW5kZW50YXRpb25DaGFyYWN0ZXIgPSBpbmRlbnQgfHwgREVGQVVMVF9JTkRFTlRBVElPTl9DSEFSQUNURVI7XG4gICAgdGhpcy5saW5lSm9pbiA9IGpvaW4gPz8gREVGQVVMVF9MSU5FX0pPSU47XG4gIH1cblxuICAvKipcbiAgICogQWRkIGdpdmVuIGluZGVudGF0aW9uIGxldmVsIHRvIGdpdmVuIGxpbmUgb2YgY29kZVxuICAgKi9cbiAgaW5kZW50TGluZSA9IChsaW5lOiBzdHJpbmcsIGluZGVudGF0aW9uTGV2ZWwgPSAwKSA9PiB7XG4gICAgY29uc3QgaW5kZW50ID0gdGhpcy5pbmRlbnRhdGlvbkNoYXJhY3Rlci5yZXBlYXQoaW5kZW50YXRpb25MZXZlbCk7XG4gICAgcmV0dXJuIGAke2luZGVudH0ke2xpbmV9YDtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgbGluZXNcbiAgICovXG4gIHVuc2hpZnQgPSAobGluZTogc3RyaW5nLCBpbmRlbnRhdGlvbkxldmVsPzogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbmV3TGluZSA9IHRoaXMuaW5kZW50TGluZShsaW5lLCBpbmRlbnRhdGlvbkxldmVsKTtcbiAgICB0aGlzLmNvZGUudW5zaGlmdChuZXdMaW5lKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSBsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZXNcbiAgICovXG4gIHB1c2ggPSAobGluZTogc3RyaW5nLCBpbmRlbnRhdGlvbkxldmVsPzogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbmV3TGluZSA9IHRoaXMuaW5kZW50TGluZShsaW5lLCBpbmRlbnRhdGlvbkxldmVsKTtcbiAgICB0aGlzLmNvZGUucHVzaChuZXdMaW5lKTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSBsaW5lIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZS4gQ3JlYXRlcyBhIG5ldyBsaW5lXG4gICAqIGlmIG5vIGxpbmVzIGV4aXN0IHlldC5cbiAgICovXG4gIHB1c2hUb0xhc3QgPSAobGluZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCF0aGlzLmNvZGUpIHtcbiAgICAgIHRoaXMucHVzaChsaW5lKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZExpbmUgPSBgJHt0aGlzLmNvZGVbdGhpcy5jb2RlLmxlbmd0aCAtIDFdfSR7bGluZX1gO1xuICAgIHRoaXMuY29kZVt0aGlzLmNvZGUubGVuZ3RoIC0gMV0gPSB1cGRhdGVkTGluZTtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGFuIGVtcHR5IGxpbmUgYXQgdGhlIGVuZCBvZiBjdXJyZW50IGxpbmVzXG4gICAqL1xuICBibGFuayA9ICgpID0+IHtcbiAgICB0aGlzLmNvZGUucHVzaCgnJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbmNhdGVuYXRlIGFsbCBjdXJyZW50IGxpbmVzIHVzaW5nIHRoZSBnaXZlbiBsaW5lSm9pbiwgdGhlbiBhcHBseSBhbnkgcmVwbGFjZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZFxuICAgKi9cbiAgam9pbiA9ICgpID0+IHtcbiAgICBjb25zdCB1bnJlcGxhY2VkQ29kZSA9IHRoaXMuY29kZS5qb2luKHRoaXMubGluZUpvaW4pO1xuICAgIGNvbnN0IHJlcGxhY2VkT3V0cHV0ID0gdGhpcy5wb3N0UHJvY2Vzc29ycy5yZWR1Y2UoXG4gICAgICAoYWNjdW11bGF0b3IsIHJlcGxhY2VyKSA9PiByZXBsYWNlcihhY2N1bXVsYXRvciksXG4gICAgICB1bnJlcGxhY2VkQ29kZSxcbiAgICApO1xuICAgIHJldHVybiByZXBsYWNlZE91dHB1dDtcbiAgfTtcblxuICAvKipcbiAgICogT2Z0ZW4gd2hlbiB3cml0aW5nIG1vZHVsZXMgeW91IG1heSB3aXNoIHRvIGFkZCBhIGxpdGVyYWwgdGFnIG9yIGJpdCBvZiBtZXRhZGF0YSB0aGF0IHlvdSB3aXNoIHRvIHRyYW5zZm9ybSBhZnRlciBvdGhlciBwcm9jZXNzaW5nIGFzIGEgZmluYWwgc3RlcC5cbiAgICogVG8gZG8gc28sIHlvdSBjYW4gcHJvdmlkZSBhIFBvc3RQcm9jZXNzb3IgZnVuY3Rpb24gYW5kIGl0IHdpbGwgYmUgcnVuIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSB3aGVuIHlvdSBjYWxsIGBqb2luKClgIGxhdGVyIG9uLlxuICAgKi9cbiAgYWRkUG9zdFByb2Nlc3NvciA9IChwb3N0UHJvY2Vzc29yOiBQb3N0UHJvY2Vzc29yKSA9PiB7XG4gICAgdGhpcy5wb3N0UHJvY2Vzc29ycyA9IFsuLi50aGlzLnBvc3RQcm9jZXNzb3JzLCBwb3N0UHJvY2Vzc29yXTtcbiAgfTtcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgRXNjYXBlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGVsaW1pdGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHdyYXAgdGhlIHN0cmluZyAoYW5kIHNvIG11c3QgYmUgZXNjYXBlZFxuICAgKiB3aGVuIHVzZWQgd2l0aGluIHRoZSBzdHJpbmcpLlxuICAgKiBEZWZhdWx0cyB0byBcIlxuICAgKi9cbiAgZGVsaW1pdGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhciB0byB1c2UgdG8gZXNjYXBlIHRoZSBkZWxpbWl0ZXIgYW5kIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAgICogRGVmYXVsdHMgdG8gXFxcbiAgICovXG4gIGVzY2FwZUNoYXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgbmV3bGluZXMgKFxcbiBhbmQgXFxyKSBzaG91bGQgYmUgZXNjYXBlZCB3aXRoaW4gdGhlIHN0cmluZy5cbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIGVzY2FwZU5ld2xpbmVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFc2NhcGUgY2hhcmFjdGVycyB3aXRoaW4gYSB2YWx1ZSB0byBtYWtlIGl0IHNhZmUgdG8gaW5zZXJ0IGRpcmVjdGx5IGludG8gYVxuICogc25pcHBldC4gVGFrZXMgb3B0aW9ucyB3aGljaCBkZWZpbmUgdGhlIGVzY2FwZSByZXF1aXJlbWVudHMuXG4gKlxuICogVGhpcyBpcyBjbG9zZWx5IGJhc2VkIG9uIHRoZSBKU09OLXN0cmluZ2lmeSBzdHJpbmcgc2VyaWFsaXphdGlvbiBhbGdvcml0aG0sXG4gKiBidXQgZ2VuZXJhbGl6ZWQgZm9yIG90aGVyIHN0cmluZyBkZWxpbWl0ZXJzIChlLmcuIFwiIG9yICcpIGFuZCBkaWZmZXJlbnQgZXNjYXBlXG4gKiBjaGFyYWN0ZXJzIChlLmcuIFBvd2Vyc2hlbGwgdXNlcyBgKVxuICpcbiAqIFNlZSBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi9tdWx0aXBhZ2Uvc3RydWN0dXJlZC1kYXRhLmh0bWwjc2VjLXF1b3RlanNvbnN0cmluZ1xuICogZm9yIHRoZSBjb21wbGV0ZSBvcmlnaW5hbCBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVTdHJpbmcocmF3VmFsdWU6IGFueSwgb3B0aW9uczogRXNjYXBlT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgZGVsaW1pdGVyID0gJ1wiJywgZXNjYXBlQ2hhciA9ICdcXFxcJywgZXNjYXBlTmV3bGluZXMgPSB0cnVlIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHN0cmluZ1ZhbHVlID0gcmF3VmFsdWUudG9TdHJpbmcoKTtcblxuICByZXR1cm4gWy4uLnN0cmluZ1ZhbHVlXVxuICAgIC5tYXAoYyA9PiB7XG4gICAgICBpZiAoYyA9PT0gJ1xcYicpIHtcbiAgICAgICAgcmV0dXJuIGAke2VzY2FwZUNoYXJ9YmA7XG4gICAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHQnKSB7XG4gICAgICAgIHJldHVybiBgJHtlc2NhcGVDaGFyfXRgO1xuICAgICAgfSBlbHNlIGlmIChjID09PSAnXFxuJykge1xuICAgICAgICBpZiAoZXNjYXBlTmV3bGluZXMpIHtcbiAgICAgICAgICByZXR1cm4gYCR7ZXNjYXBlQ2hhcn1uYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYzsgLy8gRG9uJ3QganVzdCBjb250aW51ZSwgb3IgdGhpcyBpcyBjYXVnaHQgYnkgPCBcXHUwMDIwXG4gICAgICB9IGVsc2UgaWYgKGMgPT09ICdcXGYnKSB7XG4gICAgICAgIHJldHVybiBgJHtlc2NhcGVDaGFyfWZgO1xuICAgICAgfSBlbHNlIGlmIChjID09PSAnXFxyJykge1xuICAgICAgICBpZiAoZXNjYXBlTmV3bGluZXMpIHtcbiAgICAgICAgICByZXR1cm4gYCR7ZXNjYXBlQ2hhcn1yYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYzsgLy8gRG9uJ3QganVzdCBjb250aW51ZSwgb3IgdGhpcyBpcyBjYXVnaHQgYnkgPCBcXHUwMDIwXG4gICAgICB9IGVsc2UgaWYgKGMgPT09IGVzY2FwZUNoYXIpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZUNoYXIgKyBlc2NhcGVDaGFyO1xuICAgICAgfSBlbHNlIGlmIChjID09PSBkZWxpbWl0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZUNoYXIgKyBkZWxpbWl0ZXI7XG4gICAgICB9IGVsc2UgaWYgKGMgPCAnXFx1MDAyMCcgfHwgYyA+ICdcXHUwMDdFJykge1xuICAgICAgICAvLyBEZWxlZ2F0ZSB0aGUgdHJpY2tpZXIgbm9uLUFTQ0lJIGNhc2VzIHRvIHRoZSBub3JtYWwgYWxnb3JpdGhtLiBTb21lIG9mIHRoZXNlXG4gICAgICAgIC8vIGFyZSBlc2NhcGVkIGFzIFxcdVhYWFgsIHdoaWxzdCBvdGhlcnMgYXJlIHJlcHJlc2VudGVkIGxpdGVyYWxseS4gU2luY2Ugd2UncmVcbiAgICAgICAgLy8gdXNpbmcgdGhpcyBwcmltYXJpbHkgZm9yIGhlYWRlciB2YWx1ZXMgdGhhdCBhcmUgZ2VuZXJhbGx5ICh0aG91Z2ggbm90IDEwMCVcbiAgICAgICAgLy8gc3RyaWN0bHk/KSBBU0NJSS1vbmx5LCB0aGlzIHNob3VsZCBhbG1vc3QgbmV2ZXIgaGFwcGVuLlxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYykuc2xpY2UoMSwgLTEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG59XG5cbi8qKlxuICogTWFrZSBhIHN0cmluZyB2YWx1ZSBzYWZlIHRvIGluc2VydCBsaXRlcmFsbHkgaW50byBhIHNuaXBwZXQgd2l0aGluIHNpbmdsZSBxdW90ZXMsXG4gKiBieSBlc2NhcGluZyBwcm9ibGVtYXRpYyBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgc2luZ2xlIHF1b3RlcyBpbnNpZGUgdGhlIHN0cmluZyxcbiAqIGJhY2tzbGFzaGVzLCBuZXdsaW5lcywgYW5kIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAqXG4gKiBJZiB2YWx1ZSBpcyBub3QgYSBzdHJpbmcsIGl0IHdpbGwgYmUgc3RyaW5naWZpZWQgd2l0aCAudG9TdHJpbmcoKSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZUZvclNpbmdsZVF1b3RlcyA9ICh2YWx1ZTogYW55KSA9PiBlc2NhcGVTdHJpbmcodmFsdWUsIHsgZGVsaW1pdGVyOiBcIidcIiB9KTtcblxuLyoqXG4gKiBNYWtlIGEgc3RyaW5nIHZhbHVlIHNhZmUgdG8gaW5zZXJ0IGxpdGVyYWxseSBpbnRvIGEgc25pcHBldCB3aXRoaW4gZG91YmxlIHF1b3RlcyxcbiAqIGJ5IGVzY2FwaW5nIHByb2JsZW1hdGljIGNoYXJhY3RlcnMsIGluY2x1ZGluZyBkb3VibGUgcXVvdGVzIGluc2lkZSB0aGUgc3RyaW5nLFxuICogYmFja3NsYXNoZXMsIG5ld2xpbmVzLCBhbmQgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICpcbiAqIElmIHZhbHVlIGlzIG5vdCBhIHN0cmluZywgaXQgd2lsbCBiZSBzdHJpbmdpZmllZCB3aXRoIC50b1N0cmluZygpIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgZXNjYXBlRm9yRG91YmxlUXVvdGVzID0gKHZhbHVlOiBhbnkpID0+IGVzY2FwZVN0cmluZyh2YWx1ZSwgeyBkZWxpbWl0ZXI6ICdcIicgfSk7XG4iLCIvKipcbiAqIEBsaWNlbnNlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ub2RlLWZldGNoL25vZGUtZmV0Y2gvbWFzdGVyL0xJQ0VOU0UubWRcbiAqXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgLSAyMDIwIE5vZGUgRmV0Y2ggVGVhbVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKlxuICogRXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL25vZGUtZmV0Y2gvbm9kZS1mZXRjaC9ibG9iLzY0YzVjMjk2YTAyNTBiODUyMDEwNzQ2Yzc2MTQ0Y2I5ZTE0Njk4ZDkvc3JjL3V0aWxzL2Zvcm0tZGF0YS5qc1xuICovXG5cbmltcG9ydCB0eXBlIEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5cbmNvbnN0IGNhcnJpYWdlID0gJ1xcclxcbic7XG5jb25zdCBkYXNoZXMgPSAnLScucmVwZWF0KDIpO1xuXG5jb25zdCBOQU1FID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuXG5leHBvcnQgY29uc3QgaXNCbG9iID0gKG9iamVjdDogYW55KSA9PlxuICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICB0eXBlb2Ygb2JqZWN0LmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiBvYmplY3QudHlwZSA9PT0gJ3N0cmluZycgJiZcbiAgdHlwZW9mIG9iamVjdC5zdHJlYW0gPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbTkFNRV0pO1xuXG5jb25zdCBnZXRGb290ZXIgPSAoYm91bmRhcnk6IHN0cmluZykgPT4gYCR7ZGFzaGVzfSR7Ym91bmRhcnl9JHtkYXNoZXN9JHtjYXJyaWFnZS5yZXBlYXQoMil9YDtcblxuY29uc3QgZ2V0SGVhZGVyID0gKGJvdW5kYXJ5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZmllbGQ6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfSkgPT4ge1xuICBsZXQgaGVhZGVyID0gJyc7XG5cbiAgaGVhZGVyICs9IGAke2Rhc2hlc30ke2JvdW5kYXJ5fSR7Y2FycmlhZ2V9YDtcbiAgaGVhZGVyICs9IGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIke25hbWV9XCJgO1xuXG4gIGlmIChpc0Jsb2IoZmllbGQpKSB7XG4gICAgaGVhZGVyICs9IGA7IGZpbGVuYW1lPVwiJHtmaWVsZC5uYW1lfVwiJHtjYXJyaWFnZX1gO1xuICAgIGhlYWRlciArPSBgQ29udGVudC1UeXBlOiAke2ZpZWxkLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSd9YDtcbiAgfVxuXG4gIHJldHVybiBgJHtoZWFkZXJ9JHtjYXJyaWFnZS5yZXBlYXQoMil9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtRGF0YUl0ZXJhdG9yID0gZnVuY3Rpb24qIChmb3JtOiBGb3JtRGF0YSwgYm91bmRhcnk6IHN0cmluZykge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIG5vdCBzdXJlIGhvdyB0aGlzIGV2ZXIgd29ya2VkXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBmb3JtKSB7XG4gICAgeWllbGQgZ2V0SGVhZGVyKGJvdW5kYXJ5LCBuYW1lLCB2YWx1ZSk7XG5cbiAgICBpZiAoaXNCbG9iKHZhbHVlKSkge1xuICAgICAgeWllbGQqIHZhbHVlLnN0cmVhbSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG5cbiAgICB5aWVsZCBjYXJyaWFnZTtcbiAgfVxuXG4gIHlpZWxkIGdldEZvb3Rlcihib3VuZGFyeSk7XG59O1xuIiwiaW1wb3J0IEFqdiwgeyBFcnJvck9iamVjdCB9IGZyb20gJ2Fqdic7XG5pbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnaGFyLWZvcm1hdCc7XG5pbXBvcnQgKiBhcyBzY2hlbWEgZnJvbSAnaGFyLXNjaGVtYSc7XG5cbmV4cG9ydCBjbGFzcyBIQVJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbmFtZSA9ICdIQVJFcnJvcic7XG4gIG1lc3NhZ2UgPSAndmFsaWRhdGlvbiBmYWlsZWQnO1xuICBlcnJvcnM6IEVycm9yT2JqZWN0W10gPSBbXTtcbiAgY29uc3RydWN0b3IoZXJyb3JzOiBFcnJvck9iamVjdFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG5jb25zdCBhanYgPSBuZXcgQWp2KHtcbiAgYWxsRXJyb3JzOiB0cnVlLFxufSk7XG5hanYuYWRkU2NoZW1hKHNjaGVtYSk7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUhhclJlcXVlc3QgPSAocmVxdWVzdDogYW55KTogcmVxdWVzdCBpcyBSZXF1ZXN0ID0+IHtcbiAgY29uc3QgdmFsaWRhdGUgPSBhanYuZ2V0U2NoZW1hKCdyZXF1ZXN0Lmpzb24nKTtcbiAgaWYgKCF2YWxpZGF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZpbmQgSEFSIHJlcXVlc3Qgc2NoZW1hJyk7XG4gIH1cbiAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZShyZXF1ZXN0KTtcbiAgaWYgKCF2YWxpZCAmJiB2YWxpZGF0ZS5lcnJvcnMpIHtcbiAgICB0aHJvdyBuZXcgSEFSRXJyb3IodmFsaWRhdGUuZXJyb3JzKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJ0eXBlIEhlYWRlcnM8VD4gPSBSZWNvcmQ8c3RyaW5nLCBUPjtcblxuLyoqXG4gKiBHaXZlbiBhIGhlYWRlcnMgb2JqZWN0IHJldHJpZXZlIGEgc3BlY2lmaWMgaGVhZGVyIG91dCBvZiBpdCB2aWEgYSBjYXNlLWluc2Vuc2l0aXZlIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEhlYWRlck5hbWUgPSA8VD4oaGVhZGVyczogSGVhZGVyczxUPiwgbmFtZTogc3RyaW5nKSA9PlxuICBPYmplY3Qua2V5cyhoZWFkZXJzKS5maW5kKGhlYWRlciA9PiBoZWFkZXIudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuLyoqXG4gKiBHaXZlbiBhIGhlYWRlcnMgb2JqZWN0IHJldHJpZXZlIHRoZSBjb250ZW50cyBvZiBhIGhlYWRlciBvdXQgb2YgaXQgdmlhIGEgY2FzZS1pbnNlbnNpdGl2ZSBrZXkuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRIZWFkZXIgPSA8VD4oaGVhZGVyczogSGVhZGVyczxUPiwgbmFtZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGhlYWRlck5hbWUgPSBnZXRIZWFkZXJOYW1lKGhlYWRlcnMsIG5hbWUpO1xuICBpZiAoIWhlYWRlck5hbWUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBoZWFkZXJzW2hlYWRlck5hbWVdO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBnaXZlbiBjYXNlLWluc2Vuc2l0aXZlIGhlYWRlciBleGlzdHMgd2l0aGluIGEgaGVhZGVyIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0hlYWRlciA9IDxUPihoZWFkZXJzOiBIZWFkZXJzPFQ+LCBuYW1lOiBzdHJpbmcpID0+XG4gIEJvb2xlYW4oZ2V0SGVhZGVyTmFtZShoZWFkZXJzLCBuYW1lKSk7XG5cbmNvbnN0IG1pbWVUeXBlSnNvbiA9IFtcbiAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnYXBwbGljYXRpb24veC1qc29uJyxcbiAgJ3RleHQvanNvbicsXG4gICd0ZXh0L3gtanNvbicsXG4gICcranNvbicsXG5dIGFzIGNvbnN0O1xuXG50eXBlIE1pbWVUeXBlSnNvbiA9IGAke3N0cmluZ30ke3R5cGVvZiBtaW1lVHlwZUpzb25bbnVtYmVyXX0ke3N0cmluZ31gO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBnaXZlbiBtaW1ldHlwZSBpcyBKU09OLCBvciBhIHZhcmlhbnQgb2Ygc3VjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTWltZVR5cGVKU09OID0gKG1pbWVUeXBlOiBzdHJpbmcpOiBtaW1lVHlwZSBpcyBNaW1lVHlwZUpzb24gPT5cbiAgbWltZVR5cGVKc29uLnNvbWUodHlwZSA9PiBtaW1lVHlwZS5pbmNsdWRlcyh0eXBlKSk7XG4iLCJleHBvcnQgdHlwZSBSZWR1Y2VkSGVscGVyT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBzdHJpbmc+O1xuXG5leHBvcnQgY29uc3QgcmVkdWNlciA9IDxUIGV4dGVuZHMgeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4oXG4gIGFjY3VtdWxhdG9yOiBSZWR1Y2VkSGVscGVyT2JqZWN0LFxuICBwYWlyOiBULFxuKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGFjY3VtdWxhdG9yW3BhaXIubmFtZV07XG4gIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGFjY3VtdWxhdG9yW3BhaXIubmFtZV0gPSBwYWlyLnZhbHVlO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBpdCBhcyBhcnJheSBqdXN0IHB1c2ggdGhlIHZhbHVlXG4gIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICBjdXJyZW50VmFsdWUucHVzaChwYWlyLnZhbHVlKTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvLyBjb252ZXJ0IHRvIGFycmF5IHNpbmNlIG5vdyB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgdmFsdWUgZm9yIHRoaXMga2V5XG4gIGFjY3VtdWxhdG9yW3BhaXIubmFtZV0gPSBbY3VycmVudFZhbHVlLCBwYWlyLnZhbHVlXTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufTtcbiIsIi8qKlxuICogVXNlICdzdHJvbmcgcXVvdGluZycgdXNpbmcgc2luZ2xlIHF1b3RlcyBzbyB0aGF0IHdlIG9ubHkgbmVlZCB0byBkZWFsIHdpdGggbmVzdGVkIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLlxuICogc2VlOiBodHRwOi8vd2lraS5iYXNoLWhhY2tlcnMub3JnL3N5bnRheC9xdW90aW5nI3N0cm9uZ19xdW90aW5nXG4gKi9cbmV4cG9ydCBjb25zdCBxdW90ZSA9ICh2YWx1ZSA9ICcnKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSAvXlthLXowLTktXy8uQCVePTpdKyQvaTtcblxuICBjb25zdCBpc1NoZWxsU2FmZSA9IHNhZmUudGVzdCh2YWx1ZSk7XG5cbiAgaWYgKGlzU2hlbGxTYWZlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCBzaGVsbCBzYWZlLCB0aGVuIHF1b3RlIGl0XG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2A7XG59O1xuXG5leHBvcnQgY29uc3QgZXNjYXBlID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKS5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJyk7XG4iLCJpbXBvcnQgeyBDbGllbnRJbmZvLCBUYXJnZXRJZCwgVGFyZ2V0SW5mbywgdGFyZ2V0cyB9IGZyb20gJy4uL3RhcmdldHMvdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXZhaWxhYmxlVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0SW5mbyB7XG4gIGNsaWVudHM6IENsaWVudEluZm9bXTtcbn1cblxuZXhwb3J0IGNvbnN0IGF2YWlsYWJsZVRhcmdldHMgPSAoKSA9PlxuICBPYmplY3Qua2V5cyh0YXJnZXRzKS5tYXA8QXZhaWxhYmxlVGFyZ2V0Pih0YXJnZXRJZCA9PiAoe1xuICAgIC4uLnRhcmdldHNbdGFyZ2V0SWQgYXMgVGFyZ2V0SWRdLmluZm8sXG4gICAgY2xpZW50czogT2JqZWN0LmtleXModGFyZ2V0c1t0YXJnZXRJZCBhcyBUYXJnZXRJZF0uY2xpZW50c0J5SWQpLm1hcChcbiAgICAgIGNsaWVudElkID0+IHRhcmdldHNbdGFyZ2V0SWQgYXMgVGFyZ2V0SWRdLmNsaWVudHNCeUlkW2NsaWVudElkXS5pbmZvLFxuICAgICksXG4gIH0pKTtcblxuZXhwb3J0IGNvbnN0IGV4dG5hbWUgPSAodGFyZ2V0SWQ6IFRhcmdldElkKSA9PiB0YXJnZXRzW3RhcmdldElkXT8uaW5mby5leHRuYW1lIHx8ICcnO1xuIiwiaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IGxpYmN1cmw6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2xpYmN1cmwnLFxuICAgIHRpdGxlOiAnTGliY3VybCcsXG4gICAgbGluazogJ2h0dHA6Ly9jdXJsLmhheHguc2UvbGliY3VybCcsXG4gICAgZGVzY3JpcHRpb246ICdTaW1wbGUgUkVTVCBhbmQgSFRUUCBBUEkgQ2xpZW50IGZvciBDJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBmdWxsVXJsLCBoZWFkZXJzT2JqLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSB9KSA9PiB7XG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKCk7XG5cbiAgICBwdXNoKCdDVVJMICpobmQgPSBjdXJsX2Vhc3lfaW5pdCgpOycpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaChgY3VybF9lYXN5X3NldG9wdChobmQsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgXCIke21ldGhvZC50b1VwcGVyQ2FzZSgpfVwiKTtgKTtcbiAgICBwdXNoKGBjdXJsX2Vhc3lfc2V0b3B0KGhuZCwgQ1VSTE9QVF9VUkwsIFwiJHtmdWxsVXJsfVwiKTtgKTtcblxuICAgIC8vIEFkZCBoZWFkZXJzLCBpbmNsdWRpbmcgdGhlIGNvb2tpZXNcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoaGVhZGVyc09iaik7XG5cbiAgICAvLyBjb25zdHJ1Y3QgaGVhZGVyc1xuICAgIGlmIChoZWFkZXJzLmxlbmd0aCkge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJ3N0cnVjdCBjdXJsX3NsaXN0ICpoZWFkZXJzID0gTlVMTDsnKTtcblxuICAgICAgaGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7XG4gICAgICAgIHB1c2goXG4gICAgICAgICAgYGhlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChoZWFkZXJzLCBcIiR7aGVhZGVyfTogJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoXG4gICAgICAgICAgICBoZWFkZXJzT2JqW2hlYWRlcl0sXG4gICAgICAgICAgKX1cIik7YCxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBwdXNoKCdjdXJsX2Vhc3lfc2V0b3B0KGhuZCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBoZWFkZXJzKTsnKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29va2llc1xuICAgIGlmIChhbGxIZWFkZXJzLmNvb2tpZSkge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goYGN1cmxfZWFzeV9zZXRvcHQoaG5kLCBDVVJMT1BUX0NPT0tJRSwgXCIke2FsbEhlYWRlcnMuY29va2llfVwiKTtgKTtcbiAgICB9XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goYGN1cmxfZWFzeV9zZXRvcHQoaG5kLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR7SlNPTi5zdHJpbmdpZnkocG9zdERhdGEudGV4dCl9KTtgKTtcbiAgICB9XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goJ0NVUkxjb2RlIHJldCA9IGN1cmxfZWFzeV9wZXJmb3JtKGhuZCk7Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbGliY3VybCB9IGZyb20gJy4vbGliY3VybC9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgYzogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnYycsXG4gICAgdGl0bGU6ICdDJyxcbiAgICBleHRuYW1lOiAnLmMnLFxuICAgIGRlZmF1bHQ6ICdsaWJjdXJsJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBsaWJjdXJsLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIENsb2p1cmUgdXNpbmcgY2xqLWh0dHAuXG4gKlxuICogQGF1dGhvclxuICogQHRnZ3JlZW5lXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGVyLCBnZXRIZWFkZXJOYW1lIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5jbGFzcyBLZXl3b3JkIHtcbiAgbmFtZSA9ICcnO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgdG9TdHJpbmcgPSAoKSA9PiBgOiR7dGhpcy5uYW1lfWA7XG59XG5cbmNsYXNzIEZpbGUge1xuICBwYXRoID0gJyc7XG4gIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gIH1cblxuICB0b1N0cmluZyA9ICgpID0+IGAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgXCIke3RoaXMucGF0aH1cIilgO1xufVxuXG5jb25zdCBqc1R5cGUgPSAoaW5wdXQ/OiBhbnkpID0+IHtcbiAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cblxuICByZXR1cm4gaW5wdXQuY29uc3RydWN0b3IubmFtZS50b0xvd2VyQ2FzZSgpO1xufTtcblxuY29uc3Qgb2JqRW1wdHkgPSAoaW5wdXQ/OiBhbnkpID0+IHtcbiAgaWYgKGpzVHlwZShpbnB1dCkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGlucHV0KS5sZW5ndGggPT09IDA7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgZmlsdGVyRW1wdHkgPSAoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgT2JqZWN0LmtleXMoaW5wdXQpXG4gICAgLmZpbHRlcih4ID0+IG9iakVtcHR5KGlucHV0W3hdKSlcbiAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgIGRlbGV0ZSBpbnB1dFt4XTtcbiAgICB9KTtcbiAgcmV0dXJuIGlucHV0O1xufTtcblxuY29uc3QgcGFkQmxvY2sgPSAocGFkU2l6ZTogbnVtYmVyLCBpbnB1dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KHBhZFNpemUpO1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxuL2csIGBcXG4ke3BhZGRpbmd9YCk7XG59O1xuXG5jb25zdCBqc1RvRWRuID0gKGpzOiBhbnkpID0+IHtcbiAgc3dpdGNoIChqc1R5cGUoanMpKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiBgXCIke2pzLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cImA7XG5cbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIHJldHVybiBqcy50b1N0cmluZygpO1xuXG4gICAgY2FzZSAna2V5d29yZCc6XG4gICAgICByZXR1cm4ganMudG9TdHJpbmcoKTtcblxuICAgIGNhc2UgJ251bGwnOlxuICAgICAgcmV0dXJuICduaWwnO1xuXG4gICAgY2FzZSAncmVnZXhwJzpcbiAgICAgIHJldHVybiBgI1wiJHtqcy5zb3VyY2V9XCJgO1xuXG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgLy8gc2ltcGxlIHZlcnRpY2FsIGZvcm1hdFxuICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmtleXMoanMpXG4gICAgICAgIC5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSBwYWRCbG9jayhrZXkubGVuZ3RoICsgMiwganNUb0Vkbihqc1trZXldKSk7XG4gICAgICAgICAgcmV0dXJuIGAke2FjY3VtdWxhdG9yfToke2tleX0gJHt2YWx9XFxuIGA7XG4gICAgICAgIH0sICcnKVxuICAgICAgICAudHJpbSgpO1xuICAgICAgcmV0dXJuIGB7JHtwYWRCbG9jaygxLCBvYmopfX1gO1xuICAgIH1cblxuICAgIGNhc2UgJ2FycmF5Jzoge1xuICAgICAgLy8gc2ltcGxlIGhvcml6b250YWwgZm9ybWF0XG4gICAgICBjb25zdCBhcnIgPSBqc1xuICAgICAgICAucmVkdWNlKChhY2N1bXVsYXRvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBgJHthY2N1bXVsYXRvcn0gJHtqc1RvRWRuKHZhbHVlKX1gLCAnJylcbiAgICAgICAgLnRyaW0oKTtcbiAgICAgIHJldHVybiBgWyR7cGFkQmxvY2soMSwgYXJyKX1dYDtcbiAgICB9XG5cbiAgICBkZWZhdWx0OiAvLyAnbnVtYmVyJyAnYm9vbGVhbidcbiAgICAgIHJldHVybiBqcy50b1N0cmluZygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2xqX2h0dHA6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2Nsal9odHRwJyxcbiAgICB0aXRsZTogJ2Nsai1odHRwJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL2Rha3JvbmUvY2xqLWh0dHAnLFxuICAgIGRlc2NyaXB0aW9uOiAnQW4gaWRpb21hdGljIGNsb2p1cmUgaHR0cCBjbGllbnQgd3JhcHBpbmcgdGhlIGFwYWNoZSBjbGllbnQuJyxcbiAgfSxcbiAgY29udmVydDogKHsgcXVlcnlPYmosIG1ldGhvZCwgcG9zdERhdGEsIHVybCwgYWxsSGVhZGVycyB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdGlvbnM/LmluZGVudCB9KTtcbiAgICBjb25zdCBtZXRob2RzID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJywgJ2hlYWQnLCAnb3B0aW9ucyddO1xuICAgIG1ldGhvZCA9IG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFtZXRob2RzLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgIHB1c2goJ01ldGhvZCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICByZXR1cm4gam9pbigpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGhlYWRlcnM6IGFsbEhlYWRlcnMsXG4gICAgICAncXVlcnktcGFyYW1zJzogcXVlcnlPYmosXG4gICAgfTtcblxuICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zWydjb250ZW50LXR5cGUnXSA9IG5ldyBLZXl3b3JkKCdqc29uJyk7XG4gICAgICAgICAgcGFyYW1zWydmb3JtLXBhcmFtcyddID0gcG9zdERhdGEuanNvbk9iajtcbiAgICAgICAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJOYW1lKHBhcmFtcy5oZWFkZXJzLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zWydmb3JtLXBhcmFtcyddID0gcG9zdERhdGEucGFyYW1zT2JqO1xuICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGdldEhlYWRlck5hbWUocGFyYW1zLmhlYWRlcnMsICdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RleHQvcGxhaW4nOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zLmJvZHkgPSBwb3N0RGF0YS50ZXh0O1xuICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGdldEhlYWRlck5hbWUocGFyYW1zLmhlYWRlcnMsICdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOiB7XG4gICAgICAgIGlmIChwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBwYXJhbXMubXVsdGlwYXJ0ID0gcG9zdERhdGEucGFyYW1zLm1hcChwYXJhbSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0uZmlsZU5hbWUgJiYgIXBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogcGFyYW0ubmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBuZXcgRmlsZShwYXJhbS5maWxlTmFtZSksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgICAgICAgICBjb250ZW50OiBwYXJhbS52YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJOYW1lKHBhcmFtcy5oZWFkZXJzLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoZ2V0SGVhZGVyKHBhcmFtcy5oZWFkZXJzLCAnYWNjZXB0JykpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zLmFjY2VwdCA9IG5ldyBLZXl3b3JkKCdqc29uJyk7XG5cbiAgICAgICAgICBjb25zdCBoZWFkZXIgPSBnZXRIZWFkZXJOYW1lKHBhcmFtcy5oZWFkZXJzLCAnYWNjZXB0Jyk7XG4gICAgICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHB1c2goXCIocmVxdWlyZSAnW2Nsai1odHRwLmNsaWVudCA6YXMgY2xpZW50XSlcXG5cIik7XG5cbiAgICBpZiAob2JqRW1wdHkoZmlsdGVyRW1wdHkocGFyYW1zKSkpIHtcbiAgICAgIHB1c2goYChjbGllbnQvJHttZXRob2R9IFwiJHt1cmx9XCIpYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSAxMSArIG1ldGhvZC5sZW5ndGggKyB1cmwubGVuZ3RoO1xuICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1zID0gcGFkQmxvY2socGFkZGluZywganNUb0VkbihmaWx0ZXJFbXB0eShwYXJhbXMpKSk7XG4gICAgICBwdXNoKGAoY2xpZW50LyR7bWV0aG9kfSBcIiR7dXJsfVwiICR7Zm9ybWF0dGVkUGFyYW1zfSlgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgY2xqX2h0dHAgfSBmcm9tICcuL2Nsal9odHRwL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBjbG9qdXJlOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdjbG9qdXJlJyxcbiAgICB0aXRsZTogJ0Nsb2p1cmUnLFxuICAgIGV4dG5hbWU6ICcuY2xqJyxcbiAgICBkZWZhdWx0OiAnY2xqX2h0dHAnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIGNsal9odHRwLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIG5hdGl2ZSBDcnlzdGFsXG4gKlxuICogQGF1dGhvclxuICogQDE4MTgzODgzMjk2XG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyeXN0YWxOYXRpdmVPcHRpb25zIHtcbiAgaW5zZWN1cmVTa2lwVmVyaWZ5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IG5hdGl2ZTogQ2xpZW50PENyeXN0YWxOYXRpdmVPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ25hdGl2ZScsXG4gICAgdGl0bGU6ICdodHRwOjpjbGllbnQnLFxuICAgIGxpbms6ICdodHRwczovL2NyeXN0YWwtbGFuZy5vcmcvYXBpL21hc3Rlci9IVFRQL0NsaWVudC5odG1sJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NyeXN0YWwgSFRUUCBjbGllbnQnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBtZXRob2Q6IHJhd01ldGhvZCwgZnVsbFVybCwgcG9zdERhdGEsIGFsbEhlYWRlcnMgfSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBpbnNlY3VyZVNraXBWZXJpZnkgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcigpO1xuXG4gICAgcHVzaCgncmVxdWlyZSBcImh0dHAvY2xpZW50XCInKTtcblxuICAgIGJsYW5rKCk7XG5cbiAgICBwdXNoKGB1cmwgPSBcIiR7ZnVsbFVybH1cImApO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpO1xuICAgIGlmIChoZWFkZXJzLmxlbmd0aCkge1xuICAgICAgcHVzaCgnaGVhZGVycyA9IEhUVFA6OkhlYWRlcnN7Jyk7XG4gICAgICBoZWFkZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgcHVzaChgICBcIiR7a2V5fVwiID0+IFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoYWxsSGVhZGVyc1trZXldKX1cImApO1xuICAgICAgfSk7XG4gICAgICBwdXNoKCd9Jyk7XG4gICAgfVxuXG4gICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgIHB1c2goYHJlcUJvZHkgPSAke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpfWApO1xuICAgIH1cblxuICAgIGJsYW5rKCk7XG5cbiAgICBjb25zdCBtZXRob2QgPSByYXdNZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBtZXRob2RzID0gWydHRVQnLCAnUE9TVCcsICdIRUFEJywgJ0RFTEVURScsICdQQVRDSCcsICdQVVQnLCAnT1BUSU9OUyddO1xuXG4gICAgY29uc3QgaGVhZGVyc0NvbnRleHQgPSBoZWFkZXJzLmxlbmd0aCA/ICcsIGhlYWRlcnM6IGhlYWRlcnMnIDogJyc7XG4gICAgY29uc3QgYm9keUNvbnRleHQgPSBwb3N0RGF0YS50ZXh0ID8gJywgYm9keTogcmVxQm9keScgOiAnJztcbiAgICBjb25zdCBzc2xDb250ZXh0ID0gaW5zZWN1cmVTa2lwVmVyaWZ5ID8gJywgdGxzOiBPcGVuU1NMOjpTU0w6OkNvbnRleHQ6OkNsaWVudC5pbnNlY3VyZScgOiAnJztcblxuICAgIGlmIChtZXRob2RzLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGByZXNwb25zZSA9IEhUVFA6OkNsaWVudC4ke21ldGhvZC50b0xvd2VyQ2FzZSgpfSB1cmwke2hlYWRlcnNDb250ZXh0fSR7Ym9keUNvbnRleHR9JHtzc2xDb250ZXh0fWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKFxuICAgICAgICBgcmVzcG9uc2UgPSBIVFRQOjpDbGllbnQuZXhlYyBcIiR7bWV0aG9kfVwiLCB1cmwke2hlYWRlcnNDb250ZXh0fSR7Ym9keUNvbnRleHR9JHtzc2xDb250ZXh0fWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHB1c2goJ3B1dHMgcmVzcG9uc2UuYm9keScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IG5hdGl2ZSB9IGZyb20gJy4vbmF0aXZlL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBjcnlzdGFsOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdjcnlzdGFsJyxcbiAgICB0aXRsZTogJ0NyeXN0YWwnLFxuICAgIGV4dG5hbWU6ICcuY3InLFxuICAgIGRlZmF1bHQ6ICduYXRpdmUnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIG5hdGl2ZSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IGdldEhlYWRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vaHR0cHNuaXBwZXQnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmNvbnN0IGdldERlY29tcHJlc3Npb25NZXRob2RzID0gKGFsbEhlYWRlcnM6IFJlcXVlc3RbJ2FsbEhlYWRlcnMnXSkgPT4ge1xuICBsZXQgYWNjZXB0RW5jb2RpbmdzID0gZ2V0SGVhZGVyKGFsbEhlYWRlcnMsICdhY2NlcHQtZW5jb2RpbmcnKTtcbiAgaWYgKCFhY2NlcHRFbmNvZGluZ3MpIHtcbiAgICByZXR1cm4gW107IC8vIG5vIGRlY29tcHJlc3Npb25cbiAgfVxuXG4gIGNvbnN0IHN1cHBvcnRlZE1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgZ3ppcDogJ0RlY29tcHJlc3Npb25NZXRob2RzLkdaaXAnLFxuICAgIGRlZmxhdGU6ICdEZWNvbXByZXNzaW9uTWV0aG9kcy5EZWZsYXRlJyxcbiAgfTtcblxuICBjb25zdCBtZXRob2RzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAodHlwZW9mIGFjY2VwdEVuY29kaW5ncyA9PT0gJ3N0cmluZycpIHtcbiAgICBhY2NlcHRFbmNvZGluZ3MgPSBbYWNjZXB0RW5jb2RpbmdzXTtcbiAgfVxuICBhY2NlcHRFbmNvZGluZ3MuZm9yRWFjaChhY2NlcHRFbmNvZGluZyA9PiB7XG4gICAgYWNjZXB0RW5jb2Rpbmcuc3BsaXQoJywnKS5mb3JFYWNoKGVuY29kaW5nID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gL1xccyooW147XFxzXSspLy5leGVjKGVuY29kaW5nKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBzdXBwb3J0ZWRNZXRob2RzW21hdGNoWzFdXTtcbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgIG1ldGhvZHMucHVzaChtZXRob2QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuZXhwb3J0IGNvbnN0IGh0dHBjbGllbnQ6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2h0dHBjbGllbnQnLFxuICAgIHRpdGxlOiAnSHR0cENsaWVudCcsXG4gICAgbGluazogJ2h0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9hcGkvc3lzdGVtLm5ldC5odHRwLmh0dHBjbGllbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnLk5FVCBTdGFuZGFyZCBIVFRQIENsaWVudCcsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IGFsbEhlYWRlcnMsIHBvc3REYXRhLCBtZXRob2QsIGZ1bGxVcmwgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIHB1c2goJ3VzaW5nIFN5c3RlbS5OZXQuSHR0cC5IZWFkZXJzOycpO1xuICAgIGxldCBjbGllbnRoYW5kbGVyID0gJyc7XG4gICAgY29uc3QgY29va2llcyA9IEJvb2xlYW4oYWxsSGVhZGVycy5jb29raWUpO1xuICAgIGNvbnN0IGRlY29tcHJlc3Npb25NZXRob2RzID0gZ2V0RGVjb21wcmVzc2lvbk1ldGhvZHMoYWxsSGVhZGVycyk7XG4gICAgaWYgKGNvb2tpZXMgfHwgZGVjb21wcmVzc2lvbk1ldGhvZHMubGVuZ3RoKSB7XG4gICAgICBjbGllbnRoYW5kbGVyID0gJ2NsaWVudEhhbmRsZXInO1xuICAgICAgcHVzaCgndmFyIGNsaWVudEhhbmRsZXIgPSBuZXcgSHR0cENsaWVudEhhbmRsZXInKTtcbiAgICAgIHB1c2goJ3snKTtcbiAgICAgIGlmIChjb29raWVzKSB7XG4gICAgICAgIC8vIGVuYWJsZSBzZXR0aW5nIHRoZSBjb29raWUgaGVhZGVyXG4gICAgICAgIHB1c2goJ1VzZUNvb2tpZXMgPSBmYWxzZSwnLCAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWNvbXByZXNzaW9uTWV0aG9kcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gZW5hYmxlIGRlY29tcHJlc3Npb24gZm9yIHN1cHBvcnRlZCBtZXRob2RzXG4gICAgICAgIHB1c2goYEF1dG9tYXRpY0RlY29tcHJlc3Npb24gPSAke2RlY29tcHJlc3Npb25NZXRob2RzLmpvaW4oJyB8ICcpfSxgLCAxKTtcbiAgICAgIH1cbiAgICAgIHB1c2goJ307Jyk7XG4gICAgfVxuXG4gICAgcHVzaChgdmFyIGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCR7Y2xpZW50aGFuZGxlcn0pO2ApO1xuXG4gICAgcHVzaCgndmFyIHJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3RNZXNzYWdlJyk7XG4gICAgcHVzaCgneycpO1xuXG4gICAgY29uc3QgbWV0aG9kcyA9IFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdQQVRDSCcsICdIRUFEJywgJ09QVElPTlMnLCAnVFJBQ0UnXTtcbiAgICBtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAobWV0aG9kICYmIG1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgLy8gYnVpbGRpbiBtZXRob2RcbiAgICAgIG1ldGhvZCA9IGBIdHRwTWV0aG9kLiR7bWV0aG9kWzBdfSR7bWV0aG9kLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGN1c3RvbSBtZXRob2RcbiAgICAgIG1ldGhvZCA9IGBuZXcgSHR0cE1ldGhvZChcIiR7bWV0aG9kfVwiKWA7XG4gICAgfVxuICAgIHB1c2goYE1ldGhvZCA9ICR7bWV0aG9kfSxgLCAxKTtcblxuICAgIHB1c2goYFJlcXVlc3RVcmkgPSBuZXcgVXJpKFwiJHtmdWxsVXJsfVwiKSxgLCAxKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IChrZXlvZiB0eXBlb2YgYWxsSGVhZGVycylbXSA9IE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmZpbHRlcihoZWFkZXIgPT4ge1xuICAgICAgc3dpdGNoIChoZWFkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdjb250ZW50LXR5cGUnOlxuICAgICAgICBjYXNlICdjb250ZW50LWxlbmd0aCc6XG4gICAgICAgIGNhc2UgJ2FjY2VwdC1lbmNvZGluZyc6XG4gICAgICAgICAgLy8gc2tpcCB0aGVzZSBoZWFkZXJzXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgIHB1c2goJ0hlYWRlcnMgPScsIDEpO1xuICAgICAgcHVzaCgneycsIDEpO1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHB1c2goYHsgXCIke2tleX1cIiwgXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhhbGxIZWFkZXJzW2tleV0pfVwiIH0sYCwgMik7XG4gICAgICB9KTtcbiAgICAgIHB1c2goJ30sJywgMSk7XG4gICAgfVxuXG4gICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcG9zdERhdGEubWltZVR5cGU7XG4gICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgICAgcHVzaCgnQ29udGVudCA9IG5ldyBGb3JtVXJsRW5jb2RlZENvbnRlbnQobmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+JywgMSk7XG4gICAgICAgICAgcHVzaCgneycsIDEpO1xuICAgICAgICAgIHBvc3REYXRhLnBhcmFtcz8uZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICBwdXNoKGB7IFwiJHtwYXJhbS5uYW1lfVwiLCBcIiR7cGFyYW0udmFsdWV9XCIgfSxgLCAyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwdXNoKCd9KSwnLCAxKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgICBwdXNoKCdDb250ZW50ID0gbmV3IE11bHRpcGFydEZvcm1EYXRhQ29udGVudCcsIDEpO1xuICAgICAgICAgIHB1c2goJ3snLCAxKTtcbiAgICAgICAgICBwb3N0RGF0YS5wYXJhbXM/LmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgcHVzaChgbmV3IFN0cmluZ0NvbnRlbnQoJHtKU09OLnN0cmluZ2lmeShwYXJhbS52YWx1ZSB8fCAnJyl9KWAsIDIpO1xuICAgICAgICAgICAgcHVzaCgneycsIDIpO1xuICAgICAgICAgICAgcHVzaCgnSGVhZGVycyA9JywgMyk7XG4gICAgICAgICAgICBwdXNoKCd7JywgMyk7XG4gICAgICAgICAgICBpZiAocGFyYW0uY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgcHVzaChgQ29udGVudFR5cGUgPSBuZXcgTWVkaWFUeXBlSGVhZGVyVmFsdWUoXCIke3BhcmFtLmNvbnRlbnRUeXBlfVwiKSxgLCA0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHB1c2goJ0NvbnRlbnREaXNwb3NpdGlvbiA9IG5ldyBDb250ZW50RGlzcG9zaXRpb25IZWFkZXJWYWx1ZShcImZvcm0tZGF0YVwiKScsIDQpO1xuICAgICAgICAgICAgcHVzaCgneycsIDQpO1xuICAgICAgICAgICAgcHVzaChgTmFtZSA9IFwiJHtwYXJhbS5uYW1lfVwiLGAsIDUpO1xuICAgICAgICAgICAgaWYgKHBhcmFtLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgIHB1c2goYEZpbGVOYW1lID0gXCIke3BhcmFtLmZpbGVOYW1lfVwiLGAsIDUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHVzaCgnfScsIDQpO1xuICAgICAgICAgICAgcHVzaCgnfScsIDMpO1xuICAgICAgICAgICAgcHVzaCgnfSwnLCAyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHB1c2goJ30sJywgMSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBwdXNoKGBDb250ZW50ID0gbmV3IFN0cmluZ0NvbnRlbnQoJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0IHx8ICcnKX0pYCwgMSk7XG4gICAgICAgICAgcHVzaCgneycsIDEpO1xuICAgICAgICAgIHB1c2goJ0hlYWRlcnMgPScsIDIpO1xuICAgICAgICAgIHB1c2goJ3snLCAyKTtcbiAgICAgICAgICBwdXNoKGBDb250ZW50VHlwZSA9IG5ldyBNZWRpYVR5cGVIZWFkZXJWYWx1ZShcIiR7Y29udGVudFR5cGV9XCIpYCwgMyk7XG4gICAgICAgICAgcHVzaCgnfScsIDIpO1xuICAgICAgICAgIHB1c2goJ30nLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcHVzaCgnfTsnKTtcblxuICAgIC8vIHNlbmQgYW5kIHJlYWQgcmVzcG9uc2VcbiAgICBwdXNoKCd1c2luZyAodmFyIHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LlNlbmRBc3luYyhyZXF1ZXN0KSknKTtcbiAgICBwdXNoKCd7Jyk7XG4gICAgcHVzaCgncmVzcG9uc2UuRW5zdXJlU3VjY2Vzc1N0YXR1c0NvZGUoKTsnLCAxKTtcbiAgICBwdXNoKCd2YXIgYm9keSA9IGF3YWl0IHJlc3BvbnNlLkNvbnRlbnQuUmVhZEFzU3RyaW5nQXN5bmMoKTsnLCAxKTtcbiAgICBwdXNoKCdDb25zb2xlLldyaXRlTGluZShib2R5KTsnLCAxKTtcbiAgICBwdXNoKCd9Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgcmVzdHNoYXJwOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdyZXN0c2hhcnAnLFxuICAgIHRpdGxlOiAnUmVzdFNoYXJwJyxcbiAgICBsaW5rOiAnaHR0cDovL3Jlc3RzaGFycC5vcmcvJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbXBsZSBSRVNUIGFuZCBIVFRQIEFQSSBDbGllbnQgZm9yIC5ORVQnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBhbGxIZWFkZXJzLCBtZXRob2QsIGZ1bGxVcmwsIGhlYWRlcnNPYmosIGNvb2tpZXMsIHBvc3REYXRhIH0pID0+IHtcbiAgICBjb25zdCB7IHB1c2gsIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcigpO1xuICAgIGNvbnN0IGlzU3VwcG9ydGVkTWV0aG9kID0gWydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ1BBVENIJywgJ0hFQUQnLCAnT1BUSU9OUyddLmluY2x1ZGVzKFxuICAgICAgbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgKTtcblxuICAgIGlmICghaXNTdXBwb3J0ZWRNZXRob2QpIHtcbiAgICAgIHJldHVybiAnTWV0aG9kIG5vdCBzdXBwb3J0ZWQnO1xuICAgIH1cblxuICAgIHB1c2goYHZhciBjbGllbnQgPSBuZXcgUmVzdENsaWVudChcIiR7ZnVsbFVybH1cIik7YCk7XG4gICAgcHVzaChgdmFyIHJlcXVlc3QgPSBuZXcgUmVzdFJlcXVlc3QoTWV0aG9kLiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9KTtgKTtcblxuICAgIC8vIEFkZCBoZWFkZXJzLCBpbmNsdWRpbmcgdGhlIGNvb2tpZXNcblxuICAgIE9iamVjdC5rZXlzKGhlYWRlcnNPYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHB1c2goYHJlcXVlc3QuQWRkSGVhZGVyKFwiJHtrZXl9XCIsIFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoaGVhZGVyc09ialtrZXldKX1cIik7YCk7XG4gICAgfSk7XG5cbiAgICBjb29raWVzLmZvckVhY2goKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgcHVzaChgcmVxdWVzdC5BZGRDb29raWUoXCIke25hbWV9XCIsIFwiJHt2YWx1ZX1cIik7YCk7XG4gICAgfSk7XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgY29uc3QgaGVhZGVyID0gZ2V0SGVhZGVyKGFsbEhlYWRlcnMsICdjb250ZW50LXR5cGUnKTtcbiAgICAgIGNvbnN0IHRleHQgPSBKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KTtcbiAgICAgIHB1c2goYHJlcXVlc3QuQWRkUGFyYW1ldGVyKFwiJHtoZWFkZXJ9XCIsICR7dGV4dH0sIFBhcmFtZXRlclR5cGUuUmVxdWVzdEJvZHkpO2ApO1xuICAgIH1cblxuICAgIHB1c2goJ0lSZXN0UmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQuRXhlY3V0ZShyZXF1ZXN0KTsnKTtcbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgaHR0cGNsaWVudCB9IGZyb20gJy4vaHR0cGNsaWVudC9jbGllbnQnO1xuaW1wb3J0IHsgcmVzdHNoYXJwIH0gZnJvbSAnLi9yZXN0c2hhcnAvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGNzaGFycDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnY3NoYXJwJyxcbiAgICB0aXRsZTogJ0MjJyxcbiAgICBleHRuYW1lOiAnLmNzJyxcbiAgICBkZWZhdWx0OiAncmVzdHNoYXJwJyxcbiAgfSxcblxuICBjbGllbnRzQnlJZDoge1xuICAgIGh0dHBjbGllbnQsXG4gICAgcmVzdHNoYXJwLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIG5hdGl2ZSBHby5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAbW9udGFuYWZseW5uXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR29OYXRpdmVPcHRpb25zIHtcbiAgc2hvd0JvaWxlcnBsYXRlPzogYm9vbGVhbjtcbiAgY2hlY2tFcnJvcnM/OiBib29sZWFuO1xuICBwcmludEJvZHk/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBpbnNlY3VyZVNraXBWZXJpZnk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgbmF0aXZlOiBDbGllbnQ8R29OYXRpdmVPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ25hdGl2ZScsXG4gICAgdGl0bGU6ICdOZXdSZXF1ZXN0JyxcbiAgICBsaW5rOiAnaHR0cDovL2dvbGFuZy5vcmcvcGtnL25ldC9odHRwLyNOZXdSZXF1ZXN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0dvbGFuZyBIVFRQIGNsaWVudCByZXF1ZXN0JyxcbiAgfSxcbiAgY29udmVydDogKHsgcG9zdERhdGEsIG1ldGhvZCwgYWxsSGVhZGVycywgZnVsbFVybCB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGJsYW5rLCBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6ICdcXHQnIH0pO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2hvd0JvaWxlcnBsYXRlID0gdHJ1ZSxcbiAgICAgIGNoZWNrRXJyb3JzID0gZmFsc2UsXG4gICAgICBwcmludEJvZHkgPSB0cnVlLFxuICAgICAgdGltZW91dCA9IC0xLFxuICAgICAgaW5zZWN1cmVTa2lwVmVyaWZ5ID0gZmFsc2UsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBlcnJvclBsYWNlaG9sZGVyID0gY2hlY2tFcnJvcnMgPyAnZXJyJyA6ICdfJztcblxuICAgIGNvbnN0IGluZGVudCA9IHNob3dCb2lsZXJwbGF0ZSA/IDEgOiAwO1xuXG4gICAgY29uc3QgZXJyb3JDaGVjayA9ICgpID0+IHtcbiAgICAgIGlmIChjaGVja0Vycm9ycykge1xuICAgICAgICBwdXNoKCdpZiBlcnIgIT0gbmlsIHsnLCBpbmRlbnQpO1xuICAgICAgICBwdXNoKCdwYW5pYyhlcnIpJywgaW5kZW50ICsgMSk7XG4gICAgICAgIHB1c2goJ30nLCBpbmRlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYm9pbGVycGxhdGVcbiAgICBpZiAoc2hvd0JvaWxlcnBsYXRlKSB7XG4gICAgICBwdXNoKCdwYWNrYWdlIG1haW4nKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgICBwdXNoKCdpbXBvcnQgKCcpO1xuICAgICAgcHVzaCgnXCJmbXRcIicsIGluZGVudCk7XG5cbiAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICBwdXNoKCdcInRpbWVcIicsIGluZGVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnNlY3VyZVNraXBWZXJpZnkpIHtcbiAgICAgICAgcHVzaCgnXCJjcnlwdG8vdGxzXCInLCBpbmRlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICBwdXNoKCdcInN0cmluZ3NcIicsIGluZGVudCk7XG4gICAgICB9XG5cbiAgICAgIHB1c2goJ1wibmV0L2h0dHBcIicsIGluZGVudCk7XG5cbiAgICAgIGlmIChwcmludEJvZHkpIHtcbiAgICAgICAgcHVzaCgnXCJpb1wiJywgaW5kZW50KTtcbiAgICAgIH1cblxuICAgICAgcHVzaCgnKScpO1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJ2Z1bmMgbWFpbigpIHsnKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuIGluc2VjdXJlIHRyYW5zcG9ydCBmb3IgdGhlIGNsaWVudFxuICAgIGlmIChpbnNlY3VyZVNraXBWZXJpZnkpIHtcbiAgICAgIHB1c2goJ2luc2VjdXJlVHJhbnNwb3J0IDo9IGh0dHAuRGVmYXVsdFRyYW5zcG9ydC4oKmh0dHAuVHJhbnNwb3J0KS5DbG9uZSgpJywgaW5kZW50KTtcbiAgICAgIHB1c2goJ2luc2VjdXJlVHJhbnNwb3J0LlRMU0NsaWVudENvbmZpZyA9ICZ0bHMuQ29uZmlne0luc2VjdXJlU2tpcFZlcmlmeTogdHJ1ZX0nLCBpbmRlbnQpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjbGllbnRcbiAgICBjb25zdCBoYXNUaW1lb3V0ID0gdGltZW91dCA+IDA7XG4gICAgY29uc3QgaGFzQ2xpZW50ID0gaGFzVGltZW91dCB8fCBpbnNlY3VyZVNraXBWZXJpZnk7XG4gICAgY29uc3QgY2xpZW50ID0gaGFzQ2xpZW50ID8gJ2NsaWVudCcgOiAnaHR0cC5EZWZhdWx0Q2xpZW50JztcblxuICAgIGlmIChoYXNDbGllbnQpIHtcbiAgICAgIHB1c2goJ2NsaWVudCA6PSBodHRwLkNsaWVudHsnLCBpbmRlbnQpO1xuXG4gICAgICBpZiAoaGFzVGltZW91dCkge1xuICAgICAgICBwdXNoKGBUaW1lb3V0OiB0aW1lLkR1cmF0aW9uKCR7dGltZW91dH0gKiB0aW1lLlNlY29uZCksYCwgaW5kZW50ICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnNlY3VyZVNraXBWZXJpZnkpIHtcbiAgICAgICAgcHVzaCgnVHJhbnNwb3J0OiBpbnNlY3VyZVRyYW5zcG9ydCwnLCBpbmRlbnQgKyAxKTtcbiAgICAgIH1cblxuICAgICAgcHVzaCgnfScsIGluZGVudCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHB1c2goYHVybCA6PSBcIiR7ZnVsbFVybH1cImAsIGluZGVudCk7XG4gICAgYmxhbmsoKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYm9keSBjb250ZW50IG9yIG5vdCBjcmVhdGUgdGhlIHZhciBhbmQgcmVhZGVyIG9yIG5pbFxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBwdXNoKGBwYXlsb2FkIDo9IHN0cmluZ3MuTmV3UmVhZGVyKCR7SlNPTi5zdHJpbmdpZnkocG9zdERhdGEudGV4dCl9KWAsIGluZGVudCk7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaChgcmVxLCAke2Vycm9yUGxhY2Vob2xkZXJ9IDo9IGh0dHAuTmV3UmVxdWVzdChcIiR7bWV0aG9kfVwiLCB1cmwsIHBheWxvYWQpYCwgaW5kZW50KTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goYHJlcSwgJHtlcnJvclBsYWNlaG9sZGVyfSA6PSBodHRwLk5ld1JlcXVlc3QoXCIke21ldGhvZH1cIiwgdXJsLCBuaWwpYCwgaW5kZW50KTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgZXJyb3JDaGVjaygpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnNcbiAgICBpZiAoT2JqZWN0LmtleXMoYWxsSGVhZGVycykubGVuZ3RoKSB7XG4gICAgICBPYmplY3Qua2V5cyhhbGxIZWFkZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHB1c2goYHJlcS5IZWFkZXIuQWRkKFwiJHtrZXl9XCIsIFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoYWxsSGVhZGVyc1trZXldKX1cIilgLCBpbmRlbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSByZXF1ZXN0XG4gICAgcHVzaChgcmVzLCAke2Vycm9yUGxhY2Vob2xkZXJ9IDo9ICR7Y2xpZW50fS5EbyhyZXEpYCwgaW5kZW50KTtcbiAgICBlcnJvckNoZWNrKCk7XG5cbiAgICAvLyBHZXQgQm9keVxuICAgIGlmIChwcmludEJvZHkpIHtcbiAgICAgIGJsYW5rKCk7XG4gICAgICBwdXNoKCdkZWZlciByZXMuQm9keS5DbG9zZSgpJywgaW5kZW50KTtcbiAgICAgIHB1c2goYGJvZHksICR7ZXJyb3JQbGFjZWhvbGRlcn0gOj0gaW8uUmVhZEFsbChyZXMuQm9keSlgLCBpbmRlbnQpO1xuICAgICAgZXJyb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8vIFByaW50IGl0XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdmbXQuUHJpbnRsbihyZXMpJywgaW5kZW50KTtcblxuICAgIGlmIChwcmludEJvZHkpIHtcbiAgICAgIHB1c2goJ2ZtdC5QcmludGxuKHN0cmluZyhib2R5KSknLCBpbmRlbnQpO1xuICAgIH1cblxuICAgIC8vIEVuZCBtYWluIGJsb2NrXG4gICAgaWYgKHNob3dCb2lsZXJwbGF0ZSkge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJ30nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbmF0aXZlIH0gZnJvbSAnLi9uYXRpdmUvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGdvOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdnbycsXG4gICAgdGl0bGU6ICdHbycsXG4gICAgZXh0bmFtZTogJy5nbycsXG4gICAgZGVmYXVsdDogJ25hdGl2ZScsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgbmF0aXZlLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgcmF3IEhUVFAvMS4xIHJlcXVlc3Qgc3RyaW5ncyxcbiAqIGluIGFjY29yZGFuY2UgdG8gdGhlIFJGQyA3MjMwIChhbmQgUkZDIDcyMzEpIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBhdXRob3JcbiAqIEBpcnZpbmxpbVxuICpcbiAqIEZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5jb25zdCBDUkxGID0gJ1xcclxcbic7XG5cbmludGVyZmFjZSBIdHRwMTFPcHRpb25zIHtcbiAgYWJzb2x1dGVVUkk/OiBib29sZWFuO1xuICBhdXRvQ29udGVudExlbmd0aD86IGJvb2xlYW47XG4gIGF1dG9Ib3N0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGZvbGxvd3MgdGhlIHJlcXVlc3QgbWVzc2FnZSBmb3JtYXQgaW4gYWNjb3JkYW5jZSB0byBSRkMgNzIzMCwgU2VjdGlvbiAzLlxuICogRWFjaCBzZWN0aW9uIGlzIHByZXBlbmRlZCB3aXRoIHRoZSBSRkMgYW5kIHNlY3Rpb24gbnVtYmVyLlxuICogU2VlIG1vcmUgYXQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLlxuICovXG5leHBvcnQgY29uc3QgaHR0cDExOiBDbGllbnQ8SHR0cDExT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdodHRwMS4xJyxcbiAgICB0aXRsZTogJ0hUVFAvMS4xJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAnLFxuICAgIGRlc2NyaXB0aW9uOiAnSFRUUC8xLjEgcmVxdWVzdCBzdHJpbmcgaW4gYWNjb3JkYW5jZSB3aXRoIFJGQyA3MjMwJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBmdWxsVXJsLCB1cmlPYmosIGh0dHBWZXJzaW9uLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGFic29sdXRlVVJJOiBmYWxzZSxcbiAgICAgIGF1dG9Db250ZW50TGVuZ3RoOiB0cnVlLFxuICAgICAgYXV0b0hvc3Q6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyBSRkMgNzIzMCBTZWN0aW9uIDMuIE1lc3NhZ2UgRm9ybWF0XG4gICAgLy8gQWxsIGxpbmVzIGhhdmUgbm8gaW5kZW50YXRpb24sIGFuZCBzaG91bGQgYmUgdGVybWluYXRlZCB3aXRoIENSTEYuXG4gICAgY29uc3QgeyBibGFuaywgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiAnJywgam9pbjogQ1JMRiB9KTtcblxuICAgIC8vIFJGQyA3MjMwIFNlY3Rpb24gNS4zLiBSZXF1ZXN0IFRhcmdldFxuICAgIC8vIERldGVybWluZXMgaWYgdGhlIFJlcXVlc3QtTGluZSBzaG91bGQgdXNlICdhYnNvbHV0ZS1mb3JtJyBvciAnb3JpZ2luLWZvcm0nLlxuICAgIC8vIEJhc2ljYWxseSBpdCBtZWFucyB3aGV0aGVyIHRoZSBcImh0dHA6Ly9kb21haW4uY29tXCIgd2lsbCBwcmVwZW5kIHRoZSBmdWxsIHVybC5cbiAgICBjb25zdCByZXF1ZXN0VXJsID0gb3B0cy5hYnNvbHV0ZVVSSSA/IGZ1bGxVcmwgOiB1cmlPYmoucGF0aDtcblxuICAgIC8vIFJGQyA3MjMwIFNlY3Rpb24gMy4xLjEuIFJlcXVlc3QtTGluZVxuICAgIHB1c2goYCR7bWV0aG9kfSAke3JlcXVlc3RVcmx9ICR7aHR0cFZlcnNpb259YCk7XG5cbiAgICBjb25zdCBoZWFkZXJLZXlzID0gT2JqZWN0LmtleXMoYWxsSGVhZGVycyk7XG4gICAgLy8gUkZDIDcyMzEgU2VjdGlvbiA1LiBIZWFkZXIgRmllbGRzXG4gICAgaGVhZGVyS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAvLyBDYXBpdGFsaXplIGhlYWRlciBrZXlzLCBldmVuIHRob3VnaCBpdCdzIG5vdCByZXF1aXJlZCBieSB0aGUgc3BlYy5cbiAgICAgIGNvbnN0IGtleUNhcGl0YWxpemVkID0ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKF58LSkoXFx3KS9nLCBpbnB1dCA9PiBpbnB1dC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgIHB1c2goYCR7a2V5Q2FwaXRhbGl6ZWR9OiAke2FsbEhlYWRlcnNba2V5XX1gKTtcbiAgICB9KTtcblxuICAgIC8vIFJGQyA3MjMwIFNlY3Rpb24gNS40LiBIb3N0XG4gICAgLy8gQXV0b21hdGljYWxseSBzZXQgSG9zdCBoZWFkZXIgaWYgb3B0aW9uIGlzIG9uIGFuZCBvbiBoZWFkZXIgYWxyZWFkeSBleGlzdHMuXG4gICAgaWYgKG9wdHMuYXV0b0hvc3QgJiYgIWhlYWRlcktleXMuaW5jbHVkZXMoJ2hvc3QnKSkge1xuICAgICAgcHVzaChgSG9zdDogJHt1cmlPYmouaG9zdH1gKTtcbiAgICB9XG5cbiAgICAvLyBSRkMgNzIzMCBTZWN0aW9uIDMuMy4zLiBNZXNzYWdlIEJvZHkgTGVuZ3RoXG4gICAgLy8gQXV0b21hdGljYWxseSBzZXQgQ29udGVudC1MZW5ndGggaGVhZGVyIGlmIG9wdGlvbiBpcyBvbiwgcG9zdERhdGEgaXMgcHJlc2VudCBhbmQgbm8gaGVhZGVyIGFscmVhZHkgZXhpc3RzLlxuICAgIGlmIChvcHRzLmF1dG9Db250ZW50TGVuZ3RoICYmIHBvc3REYXRhLnRleHQgJiYgIWhlYWRlcktleXMuaW5jbHVkZXMoJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHBvc3REYXRhLnRleHQsICdhc2NpaScpLnRvU3RyaW5nKCk7XG4gICAgICBwdXNoKGBDb250ZW50LUxlbmd0aDogJHtsZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGV4dHJhIGxpbmUgYWZ0ZXIgaGVhZGVyIHNlY3Rpb24uXG4gICAgYmxhbmsoKTtcblxuICAgIC8vIFNlcGFyYXRlIGhlYWRlciBzZWN0aW9uIGFuZCBtZXNzYWdlIGJvZHkgc2VjdGlvbi5cbiAgICBjb25zdCBoZWFkZXJTZWN0aW9uID0gam9pbigpO1xuXG4gICAgLy8gUkZDIDcyMzAgU2VjdGlvbiAzLjMuIE1lc3NhZ2UgQm9keVxuICAgIGNvbnN0IG1lc3NhZ2VCb2R5ID0gcG9zdERhdGEudGV4dCB8fCAnJztcblxuICAgIC8vIFJGQyA3MjMwIFNlY3Rpb24gMy4gTWVzc2FnZSBGb3JtYXRcbiAgICAvLyBFeHRyYSBDUkxGIHNlcGFyYXRpbmcgdGhlIGhlYWRlcnMgZnJvbSB0aGUgYm9keS5cbiAgICByZXR1cm4gYCR7aGVhZGVyU2VjdGlvbn0ke0NSTEZ9JHttZXNzYWdlQm9keX1gO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgaHR0cDExIH0gZnJvbSAnLi9odHRwMS4xL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBodHRwOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdodHRwJyxcbiAgICB0aXRsZTogJ0hUVFAnLFxuICAgIGV4dG5hbWU6IG51bGwsXG4gICAgZGVmYXVsdDogJzEuMScsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgJ2h0dHAxLjEnOiBodHRwMTEsXG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFzeW5jaHJvbm91cyBIdHRwIGFuZCBXZWJTb2NrZXQgQ2xpZW50IGxpYnJhcnkgZm9yIEphdmFcbiAqXG4gKiBAYXV0aG9yXG4gKiBAd2luZGFyZFxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgYXN5bmNodHRwOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdhc3luY2h0dHAnLFxuICAgIHRpdGxlOiAnQXN5bmNIdHRwJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL0FzeW5jSHR0cENsaWVudC9hc3luYy1odHRwLWNsaWVudCcsXG4gICAgZGVzY3JpcHRpb246ICdBc3luY2hyb25vdXMgSHR0cCBhbmQgV2ViU29ja2V0IENsaWVudCBsaWJyYXJ5IGZvciBKYXZhJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSwgZnVsbFVybCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICBjb25zdCB7IGJsYW5rLCBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgcHVzaCgnQXN5bmNIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBEZWZhdWx0QXN5bmNIdHRwQ2xpZW50KCk7Jyk7XG5cbiAgICBwdXNoKGBjbGllbnQucHJlcGFyZShcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCIsIFwiJHtmdWxsVXJsfVwiKWApO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMsIGluY2x1ZGluZyB0aGUgY29va2llc1xuICAgIE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHB1c2goYC5zZXRIZWFkZXIoXCIke2tleX1cIiwgXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhhbGxIZWFkZXJzW2tleV0pfVwiKWAsIDEpO1xuICAgIH0pO1xuXG4gICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgIHB1c2goYC5zZXRCb2R5KCR7SlNPTi5zdHJpbmdpZnkocG9zdERhdGEudGV4dCl9KWAsIDEpO1xuICAgIH1cblxuICAgIHB1c2goJy5leGVjdXRlKCknLCAxKTtcbiAgICBwdXNoKCcudG9Db21wbGV0YWJsZUZ1dHVyZSgpJywgMSk7XG4gICAgcHVzaCgnLnRoZW5BY2NlcHQoU3lzdGVtLm91dDo6cHJpbnRsbiknLCAxKTtcbiAgICBwdXNoKCcuam9pbigpOycsIDEpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnY2xpZW50LmNsb3NlKCk7Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIEphdmEgdXNpbmcgamF2YS5uZXQuaHR0cC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAd3RldHN1XG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV0SHR0cE9wdGlvbnMge1xuICBpbmRlbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBuZXRodHRwOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICduZXRodHRwJyxcbiAgICB0aXRsZTogJ2phdmEubmV0Lmh0dHAnLFxuICAgIGxpbms6ICdodHRwczovL29wZW5qZGsuamF2YS5uZXQvZ3JvdXBzL25ldC9odHRwY2xpZW50L2ludHJvLmh0bWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnSmF2YSBTdGFuZGFyZGl6ZWQgSFRUUCBDbGllbnQgQVBJJyxcbiAgfSxcbiAgY29udmVydDogKHsgYWxsSGVhZGVycywgZnVsbFVybCwgbWV0aG9kLCBwb3N0RGF0YSB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIHB1c2goJ0h0dHBSZXF1ZXN0IHJlcXVlc3QgPSBIdHRwUmVxdWVzdC5uZXdCdWlsZGVyKCknKTtcbiAgICBwdXNoKGAudXJpKFVSSS5jcmVhdGUoXCIke2Z1bGxVcmx9XCIpKWAsIDIpO1xuXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgcHVzaChgLmhlYWRlcihcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIpYCwgMik7XG4gICAgfSk7XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgcHVzaChcbiAgICAgICAgYC5tZXRob2QoXCIke21ldGhvZC50b1VwcGVyQ2FzZSgpfVwiLCBIdHRwUmVxdWVzdC5Cb2R5UHVibGlzaGVycy5vZlN0cmluZygke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBvc3REYXRhLnRleHQsXG4gICAgICAgICl9KSlgLFxuICAgICAgICAyLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChgLm1ldGhvZChcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCIsIEh0dHBSZXF1ZXN0LkJvZHlQdWJsaXNoZXJzLm5vQm9keSgpKWAsIDIpO1xuICAgIH1cblxuICAgIHB1c2goJy5idWlsZCgpOycsIDIpO1xuXG4gICAgcHVzaChcbiAgICAgICdIdHRwUmVzcG9uc2U8U3RyaW5nPiByZXNwb25zZSA9IEh0dHBDbGllbnQubmV3SHR0cENsaWVudCgpLnNlbmQocmVxdWVzdCwgSHR0cFJlc3BvbnNlLkJvZHlIYW5kbGVycy5vZlN0cmluZygpKTsnLFxuICAgICk7XG4gICAgcHVzaCgnU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLmJvZHkoKSk7Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIEphdmEgdXNpbmcgT2tIdHRwLlxuICpcbiAqIEBhdXRob3JcbiAqIEBzaGFzaGlyYW5qYW44NFxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvckRvdWJsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3Qgb2todHRwOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdva2h0dHAnLFxuICAgIHRpdGxlOiAnT2tIdHRwJyxcbiAgICBsaW5rOiAnaHR0cDovL3NxdWFyZS5naXRodWIuaW8vb2todHRwLycsXG4gICAgZGVzY3JpcHRpb246ICdBbiBIVFRQIFJlcXVlc3QgQ2xpZW50IExpYnJhcnknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBwb3N0RGF0YSwgbWV0aG9kLCBmdWxsVXJsLCBhbGxIZWFkZXJzIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBjb25zdCBtZXRob2RzID0gWydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ1BBVENIJywgJ0hFQUQnXTtcbiAgICBjb25zdCBtZXRob2RzV2l0aEJvZHkgPSBbJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdQQVRDSCddO1xuXG4gICAgcHVzaCgnT2tIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBPa0h0dHBDbGllbnQoKTsnKTtcbiAgICBibGFuaygpO1xuXG4gICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgIGlmIChwb3N0RGF0YS5ib3VuZGFyeSkge1xuICAgICAgICBwdXNoKFxuICAgICAgICAgIGBNZWRpYVR5cGUgbWVkaWFUeXBlID0gTWVkaWFUeXBlLnBhcnNlKFwiJHtwb3N0RGF0YS5taW1lVHlwZX07IGJvdW5kYXJ5PSR7cG9zdERhdGEuYm91bmRhcnl9XCIpO2AsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKGBNZWRpYVR5cGUgbWVkaWFUeXBlID0gTWVkaWFUeXBlLnBhcnNlKFwiJHtwb3N0RGF0YS5taW1lVHlwZX1cIik7YCk7XG4gICAgICB9XG4gICAgICBwdXNoKGBSZXF1ZXN0Qm9keSBib2R5ID0gUmVxdWVzdEJvZHkuY3JlYXRlKG1lZGlhVHlwZSwgJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX0pO2ApO1xuICAgIH1cblxuICAgIHB1c2goJ1JlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0LkJ1aWxkZXIoKScpO1xuICAgIHB1c2goYC51cmwoXCIke2Z1bGxVcmx9XCIpYCwgMSk7XG4gICAgaWYgKCFtZXRob2RzLmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgcHVzaChgLm1ldGhvZChcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCIsIGJvZHkpYCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKGAubWV0aG9kKFwiJHttZXRob2QudG9VcHBlckNhc2UoKX1cIiwgbnVsbClgLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1ldGhvZHNXaXRoQm9keS5pbmNsdWRlcyhtZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgIHB1c2goYC4ke21ldGhvZC50b0xvd2VyQ2FzZSgpfShib2R5KWAsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaChgLiR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9KG51bGwpYCwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goYC4ke21ldGhvZC50b0xvd2VyQ2FzZSgpfSgpYCwgMSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGhlYWRlcnMsIGluY2x1ZGluZyB0aGUgY29va2llc1xuICAgIE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHB1c2goYC5hZGRIZWFkZXIoXCIke2tleX1cIiwgXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhhbGxIZWFkZXJzW2tleV0pfVwiKWAsIDEpO1xuICAgIH0pO1xuXG4gICAgcHVzaCgnLmJ1aWxkKCk7JywgMSk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC5uZXdDYWxsKHJlcXVlc3QpLmV4ZWN1dGUoKTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBhc3luY2h0dHAgfSBmcm9tICcuL2FzeW5jaHR0cC9jbGllbnQnO1xuaW1wb3J0IHsgbmV0aHR0cCB9IGZyb20gJy4vbmV0aHR0cC9jbGllbnQnO1xuaW1wb3J0IHsgb2todHRwIH0gZnJvbSAnLi9va2h0dHAvY2xpZW50JztcbmltcG9ydCB7IHVuaXJlc3QgfSBmcm9tICcuL3VuaXJlc3QvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGphdmE6IFRhcmdldCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2phdmEnLFxuICAgIHRpdGxlOiAnSmF2YScsXG4gICAgZXh0bmFtZTogJy5qYXZhJyxcbiAgICBkZWZhdWx0OiAndW5pcmVzdCcsXG4gIH0sXG5cbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBhc3luY2h0dHAsXG4gICAgbmV0aHR0cCxcbiAgICBva2h0dHAsXG4gICAgdW5pcmVzdCxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBKYXZhIHVzaW5nIFVuaXJlc3QuXG4gKlxuICogQGF1dGhvclxuICogQHNoYXNoaXJhbmphbjg0XG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCB1bmlyZXN0OiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICd1bmlyZXN0JyxcbiAgICB0aXRsZTogJ1VuaXJlc3QnLFxuICAgIGxpbms6ICdodHRwOi8vdW5pcmVzdC5pby9qYXZhLmh0bWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnTGlnaHR3ZWlnaHQgSFRUUCBSZXF1ZXN0IENsaWVudCBMaWJyYXJ5JyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSwgZnVsbFVybCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgam9pbiwgcHVzaCB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIGNvbnN0IG1ldGhvZHMgPSBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnLCAnUEFUQ0gnLCAnSEVBRCcsICdPUFRJT05TJ107XG5cbiAgICBpZiAoIW1ldGhvZHMuaW5jbHVkZXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICBwdXNoKFxuICAgICAgICBgSHR0cFJlc3BvbnNlPFN0cmluZz4gcmVzcG9uc2UgPSBVbmlyZXN0LmN1c3RvbU1ldGhvZChcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCIsXCIke2Z1bGxVcmx9XCIpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goYEh0dHBSZXNwb25zZTxTdHJpbmc+IHJlc3BvbnNlID0gVW5pcmVzdC4ke21ldGhvZC50b0xvd2VyQ2FzZSgpfShcIiR7ZnVsbFVybH1cIilgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycywgaW5jbHVkaW5nIHRoZSBjb29raWVzXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgcHVzaChgLmhlYWRlcihcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIpYCwgMSk7XG4gICAgfSk7XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgcHVzaChgLmJvZHkoJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX0pYCwgMSk7XG4gICAgfVxuXG4gICAgcHVzaCgnLmFzU3RyaW5nKCk7JywgMSk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIEphdmFzY3JpcHQgJiBOb2RlLmpzIHVzaW5nIEF4aW9zLlxuICpcbiAqIEBhdXRob3JcbiAqIEByb2hpdC1nb2hyaVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgc3RyaW5naWZ5T2JqZWN0IGZyb20gJ3N0cmluZ2lmeS1vYmplY3QnO1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgYXhpb3M6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2F4aW9zJyxcbiAgICB0aXRsZTogJ0F4aW9zJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Byb21pc2UgYmFzZWQgSFRUUCBjbGllbnQgZm9yIHRoZSBicm93c2VyIGFuZCBub2RlLmpzJyxcbiAgfSxcbiAgY29udmVydDogKHsgYWxsSGVhZGVycywgbWV0aG9kLCB1cmwsIHF1ZXJ5T2JqLCBwb3N0RGF0YSB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgYmxhbmssIHB1c2gsIGpvaW4sIGFkZFBvc3RQcm9jZXNzb3IgfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBwdXNoKFwiaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcIik7XG4gICAgYmxhbmsoKTtcblxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgIH07XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcmVxdWVzdE9wdGlvbnMucGFyYW1zID0gcXVlcnlPYmo7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmxlbmd0aCkge1xuICAgICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IGFsbEhlYWRlcnM7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIHB1c2goJ2NvbnN0IGVuY29kZWRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7Jyk7XG4gICAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgcHVzaChgZW5jb2RlZFBhcmFtcy5zZXQoJyR7cGFyYW0ubmFtZX0nLCAnJHtwYXJhbS52YWx1ZX0nKTtgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGJsYW5rKCk7XG5cbiAgICAgICAgICByZXF1ZXN0T3B0aW9ucy5kYXRhID0gJ2VuY29kZWRQYXJhbXMsJztcbiAgICAgICAgICBhZGRQb3N0UHJvY2Vzc29yKGNvZGUgPT4gY29kZS5yZXBsYWNlKC8nZW5jb2RlZFBhcmFtcywnLywgJ2VuY29kZWRQYXJhbXMsJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgIHJlcXVlc3RPcHRpb25zLmRhdGEgPSBwb3N0RGF0YS5qc29uT2JqO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgaWYgKCFwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goJ2NvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTsnKTtcblxuICAgICAgICBwb3N0RGF0YS5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgcHVzaChgZm9ybS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCAnJHtwYXJhbS52YWx1ZSB8fCBwYXJhbS5maWxlTmFtZSB8fCAnJ30nKTtgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYmxhbmsoKTtcblxuICAgICAgICByZXF1ZXN0T3B0aW9ucy5kYXRhID0gJ1tmb3JtXSc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIHJlcXVlc3RPcHRpb25zLmRhdGEgPSBwb3N0RGF0YS50ZXh0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uU3RyaW5nID0gc3RyaW5naWZ5T2JqZWN0KHJlcXVlc3RPcHRpb25zLCB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICBpbmxpbmVDaGFyYWN0ZXJMaW1pdDogODAsXG4gICAgfSkucmVwbGFjZSgnXCJbZm9ybV1cIicsICdmb3JtJyk7XG4gICAgcHVzaChgY29uc3Qgb3B0aW9ucyA9ICR7b3B0aW9uU3RyaW5nfTtgKTtcbiAgICBibGFuaygpO1xuXG4gICAgcHVzaCgndHJ5IHsnKTtcbiAgICBwdXNoKCdjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGF4aW9zLnJlcXVlc3Qob3B0aW9ucyk7JywgMSk7XG4gICAgcHVzaCgnY29uc29sZS5sb2coZGF0YSk7JywgMSk7XG4gICAgcHVzaCgnfSBjYXRjaCAoZXJyb3IpIHsnKTtcbiAgICBwdXNoKCdjb25zb2xlLmVycm9yKGVycm9yKTsnLCAxKTtcbiAgICBwdXNoKCd9Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIGZldGNoXG4gKlxuICogQGF1dGhvclxuICogQHBtZHJvaWRcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBnZXRIZWFkZXJOYW1lIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5pbnRlcmZhY2UgRmV0Y2hPcHRpb25zIHtcbiAgY3JlZGVudGlhbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IGZldGNoOiBDbGllbnQ8RmV0Y2hPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2ZldGNoJyxcbiAgICB0aXRsZTogJ2ZldGNoJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZldGNoX0FQSS9Vc2luZ19GZXRjaCcsXG4gICAgZGVzY3JpcHRpb246ICdQZXJmb3JtIGFzeW5jaHJvbm91cyBIVFRQIHJlcXVlc3RzIHdpdGggdGhlIEZldGNoIEFQSScsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IG1ldGhvZCwgYWxsSGVhZGVycywgcG9zdERhdGEsIGZ1bGxVcmwgfSwgaW5wdXRPcHRzKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIGNyZWRlbnRpYWxzOiBudWxsLFxuICAgICAgLi4uaW5wdXRPcHRzLFxuICAgIH07XG5cbiAgICBjb25zdCB7IGJsYW5rLCBqb2luLCBwdXNoIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICB9O1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmxlbmd0aCkge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzID0gYWxsSGVhZGVycztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jcmVkZW50aWFscyAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5jcmVkZW50aWFscyA9IG9wdHMuY3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgcHVzaChgY29uc3QgdXJsID0gJyR7ZnVsbFVybH0nO2ApO1xuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gcG9zdERhdGEucGFyYW1zT2JqID8gcG9zdERhdGEucGFyYW1zT2JqIDogcG9zdERhdGEudGV4dDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShwb3N0RGF0YS5qc29uT2JqKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgICBpZiAoIXBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIEZvcm1EYXRhIEFQSSBhdXRvbWF0aWNhbGx5IGFkZHMgYSBgQ29udGVudC1UeXBlYCBoZWFkZXIgZm9yIGBtdWx0aXBhcnQvZm9ybS1kYXRhYCBjb250ZW50IGFuZCBpZiB3ZSBhZGQgb3VyIG93biBoZXJlIGRhdGEgd29uJ3QgYmUgY29ycmVjdGx5IHRyYW5zbWl0dGVkLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnMgLS0gV2UncmUgb25seSB1c2luZyBgY29udGVudFR5cGVIZWFkZXJgIHdpdGhpbiB0aGlzIGJsb2NrLlxuICAgICAgICBjb25zdCBjb250ZW50VHlwZUhlYWRlciA9IGdldEhlYWRlck5hbWUoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgICBpZiAoY29udGVudFR5cGVIZWFkZXIpIHtcbiAgICAgICAgICBkZWxldGUgYWxsSGVhZGVyc1tjb250ZW50VHlwZUhlYWRlcl07XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKCdjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7Jyk7XG5cbiAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgIHB1c2goYGZvcm0uYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgJyR7cGFyYW0udmFsdWUgfHwgcGFyYW0uZmlsZU5hbWUgfHwgJyd9Jyk7YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIG9wdGlvbnMuYm9keSA9IHBvc3REYXRhLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSB1bHRpbWF0ZWx5IGRvbid0IGhhdmUgYW55IGhlYWRlcnMgdG8gc2VuZCB0aGVuIHdlIHNob3VsZG4ndCBhZGQgYW4gZW1wdHkgb2JqZWN0IGludG8gdGhlIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICBpZiAob3B0aW9ucy5oZWFkZXJzICYmICFPYmplY3Qua2V5cyhvcHRpb25zLmhlYWRlcnMpLmxlbmd0aCkge1xuICAgICAgZGVsZXRlIG9wdGlvbnMuaGVhZGVycztcbiAgICB9XG5cbiAgICBwdXNoKFxuICAgICAgYGNvbnN0IG9wdGlvbnMgPSAke3N0cmluZ2lmeU9iamVjdChvcHRpb25zLCB7XG4gICAgICAgIGluZGVudDogb3B0cy5pbmRlbnQsXG4gICAgICAgIGlubGluZUNoYXJhY3RlckxpbWl0OiA4MCxcbiAgICAgICAgdHJhbnNmb3JtOiAoXywgcHJvcGVydHksIG9yaWdpbmFsUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHByb3BlcnR5ID09PSAnYm9keScgJiYgcG9zdERhdGEubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gYG5ldyBVUkxTZWFyY2hQYXJhbXMoJHtvcmlnaW5hbFJlc3VsdH0pYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSl9O2AsXG4gICAgKTtcbiAgICBibGFuaygpO1xuXG4gICAgaWYgKHBvc3REYXRhLnBhcmFtcyAmJiBwb3N0RGF0YS5taW1lVHlwZSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKSB7XG4gICAgICBwdXNoKCdvcHRpb25zLmJvZHkgPSBmb3JtOycpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBwdXNoKCd0cnkgeycpO1xuICAgIHB1c2goYGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtgLCAxKTtcbiAgICBwdXNoKCdjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOycsIDEpO1xuICAgIHB1c2goJ2NvbnNvbGUubG9nKGRhdGEpOycsIDEpO1xuICAgIHB1c2goJ30gY2F0Y2ggKGVycm9yKSB7Jyk7XG4gICAgcHVzaCgnY29uc29sZS5lcnJvcihlcnJvcik7JywgMSk7XG4gICAgcHVzaCgnfScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBuYXRpdmUgWE1MSHR0cFJlcXVlc3RcbiAqXG4gKiBAYXV0aG9yXG4gKiBAQWhtYWROYXNzcmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBnZXRIZWFkZXIsIGdldEhlYWRlck5hbWUsIGhhc0hlYWRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IGpxdWVyeTogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnanF1ZXJ5JyxcbiAgICB0aXRsZTogJ2pRdWVyeScsXG4gICAgbGluazogJ2h0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9qcXVlcnkuYWpheC8nLFxuICAgIGRlc2NyaXB0aW9uOiAnUGVyZm9ybSBhbiBhc3luY2hyb25vdXMgSFRUUCAoQWpheCkgcmVxdWVzdHMgd2l0aCBqUXVlcnknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBmdWxsVXJsLCBtZXRob2QsIGFsbEhlYWRlcnMsIHBvc3REYXRhIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBibGFuaywgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgYXN5bmM6IHRydWUsXG4gICAgICBjcm9zc0RvbWFpbjogdHJ1ZSxcbiAgICAgIHVybDogZnVsbFVybCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IGFsbEhlYWRlcnMsXG4gICAgfTtcblxuICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgIHNldHRpbmdzLmRhdGEgPSBwb3N0RGF0YS5wYXJhbXNPYmogPyBwb3N0RGF0YS5wYXJhbXNPYmogOiBwb3N0RGF0YS50ZXh0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIHNldHRpbmdzLnByb2Nlc3NEYXRhID0gZmFsc2U7XG4gICAgICAgIHNldHRpbmdzLmRhdGEgPSBwb3N0RGF0YS50ZXh0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgIGlmICghcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKCdjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7Jyk7XG5cbiAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgIHB1c2goYGZvcm0uYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgJyR7cGFyYW0udmFsdWUgfHwgcGFyYW0uZmlsZU5hbWUgfHwgJyd9Jyk7YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldHRpbmdzLnByb2Nlc3NEYXRhID0gZmFsc2U7XG4gICAgICAgIHNldHRpbmdzLmNvbnRlbnRUeXBlID0gZmFsc2U7XG4gICAgICAgIHNldHRpbmdzLm1pbWVUeXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xuICAgICAgICBzZXR0aW5ncy5kYXRhID0gJ1tmb3JtXSc7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjb250ZW50VHlwZSBoZWFkZXJcbiAgICAgICAgaWYgKGhhc0hlYWRlcihhbGxIZWFkZXJzLCAnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICBpZiAoZ2V0SGVhZGVyKGFsbEhlYWRlcnMsICdjb250ZW50LXR5cGUnKT8uaW5jbHVkZXMoJ2JvdW5kYXJ5JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBnZXRIZWFkZXJOYW1lKGFsbEhlYWRlcnMsICdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBzZXR0aW5ncy5oZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIHNldHRpbmdzLmRhdGEgPSBwb3N0RGF0YS50ZXh0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyaW5naWZpZWRTZXR0aW5ncyA9IHN0cmluZ2lmeU9iamVjdChzZXR0aW5ncywgeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pLnJlcGxhY2UoXG4gICAgICBcIidbZm9ybV0nXCIsXG4gICAgICAnZm9ybScsXG4gICAgKTtcblxuICAgIHB1c2goYGNvbnN0IHNldHRpbmdzID0gJHtzdHJpbmdpZmllZFNldHRpbmdzfTtgKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJyQuYWpheChzZXR0aW5ncykuZG9uZShmdW5jdGlvbiAocmVzcG9uc2UpIHsnKTtcbiAgICBwdXNoKCdjb25zb2xlLmxvZyhyZXNwb25zZSk7JywgMSk7XG4gICAgcHVzaCgnfSk7Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgYXhpb3MgfSBmcm9tICcuL2F4aW9zL2NsaWVudCc7XG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJy4vZmV0Y2gvY2xpZW50JztcbmltcG9ydCB7IGpxdWVyeSB9IGZyb20gJy4vanF1ZXJ5L2NsaWVudCc7XG5pbXBvcnQgeyB4aHIgfSBmcm9tICcuL3hoci9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgamF2YXNjcmlwdDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnamF2YXNjcmlwdCcsXG4gICAgdGl0bGU6ICdKYXZhU2NyaXB0JyxcbiAgICBleHRuYW1lOiAnLmpzJyxcbiAgICBkZWZhdWx0OiAneGhyJyxcbiAgfSxcblxuICBjbGllbnRzQnlJZDoge1xuICAgIHhocixcbiAgICBheGlvcyxcbiAgICBmZXRjaCxcbiAgICBqcXVlcnksXG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgbmF0aXZlIFhNTEh0dHBSZXF1ZXN0XG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCBzdHJpbmdpZnlPYmplY3QgZnJvbSAnc3RyaW5naWZ5LW9iamVjdCc7XG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yU2luZ2xlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyLCBnZXRIZWFkZXJOYW1lLCBoYXNIZWFkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgWGhyT3B0aW9ucyB7XG4gIGNvcnM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgeGhyOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICd4aHInLFxuICAgIHRpdGxlOiAnWE1MSHR0cFJlcXVlc3QnLFxuICAgIGxpbms6ICdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnVzNDIFN0YW5kYXJkIEFQSSB0aGF0IHByb3ZpZGVzIHNjcmlwdGVkIGNsaWVudCBmdW5jdGlvbmFsaXR5JyxcbiAgfSxcbiAgY29udmVydDogKHsgcG9zdERhdGEsIGFsbEhlYWRlcnMsIG1ldGhvZCwgZnVsbFVybCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIGNvcnM6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCB7IGJsYW5rLCBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIHB1c2goXG4gICAgICAgICAgYGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeSgke3N0cmluZ2lmeU9iamVjdChwb3N0RGF0YS5qc29uT2JqLCB7XG4gICAgICAgICAgICBpbmRlbnQ6IG9wdHMuaW5kZW50LFxuICAgICAgICAgIH0pfSk7YCxcbiAgICAgICAgKTtcbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgICBpZiAoIXBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaCgnY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOycpO1xuXG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBwdXNoKGBkYXRhLmFwcGVuZCgnJHtwYXJhbS5uYW1lfScsICcke3BhcmFtLnZhbHVlIHx8IHBhcmFtLmZpbGVOYW1lIHx8ICcnfScpO2ApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGNvbnRlbnRUeXBlIGhlYWRlclxuICAgICAgICBpZiAoaGFzSGVhZGVyKGFsbEhlYWRlcnMsICdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICAgIGlmIChnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpPy5pbmNsdWRlcygnYm91bmRhcnknKSkge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyTmFtZSA9IGdldEhlYWRlck5hbWUoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGFsbEhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHB1c2goYGNvbnN0IGRhdGEgPSAke3Bvc3REYXRhLnRleHQgPyBgJyR7cG9zdERhdGEudGV4dH0nYCA6ICdudWxsJ307YCk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgcHVzaCgnY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7Jyk7XG5cbiAgICBpZiAob3B0cy5jb3JzKSB7XG4gICAgICBwdXNoKCd4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsnKTtcbiAgICB9XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goXCJ4aHIuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIGZ1bmN0aW9uICgpIHtcIik7XG4gICAgcHVzaCgnaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5ET05FKSB7JywgMSk7XG4gICAgcHVzaCgnY29uc29sZS5sb2codGhpcy5yZXNwb25zZVRleHQpOycsIDIpO1xuICAgIHB1c2goJ30nLCAxKTtcbiAgICBwdXNoKCd9KTsnKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goYHhoci5vcGVuKCcke21ldGhvZH0nLCAnJHtmdWxsVXJsfScpO2ApO1xuXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgcHVzaChgeGhyLnNldFJlcXVlc3RIZWFkZXIoJyR7a2V5fScsICcke2VzY2FwZUZvclNpbmdsZVF1b3RlcyhhbGxIZWFkZXJzW2tleV0pfScpO2ApO1xuICAgIH0pO1xuXG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCd4aHIuc2VuZChkYXRhKTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgS290bGluIHVzaW5nIE9rSHR0cC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAc2VhbmdoYXlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IG9raHR0cDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnb2todHRwJyxcbiAgICB0aXRsZTogJ09rSHR0cCcsXG4gICAgbGluazogJ2h0dHA6Ly9zcXVhcmUuZ2l0aHViLmlvL29raHR0cC8nLFxuICAgIGRlc2NyaXB0aW9uOiAnQW4gSFRUUCBSZXF1ZXN0IENsaWVudCBMaWJyYXJ5JyxcbiAgfSxcbiAgY29udmVydDogKHsgcG9zdERhdGEsIGZ1bGxVcmwsIG1ldGhvZCwgYWxsSGVhZGVycyB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICBjb25zdCB7IGJsYW5rLCBqb2luLCBwdXNoIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgY29uc3QgbWV0aG9kcyA9IFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdQQVRDSCcsICdIRUFEJ107XG5cbiAgICBjb25zdCBtZXRob2RzV2l0aEJvZHkgPSBbJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdQQVRDSCddO1xuXG4gICAgcHVzaCgndmFsIGNsaWVudCA9IE9rSHR0cENsaWVudCgpJyk7XG4gICAgYmxhbmsoKTtcblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBpZiAocG9zdERhdGEuYm91bmRhcnkpIHtcbiAgICAgICAgcHVzaChcbiAgICAgICAgICBgdmFsIG1lZGlhVHlwZSA9IE1lZGlhVHlwZS5wYXJzZShcIiR7cG9zdERhdGEubWltZVR5cGV9OyBib3VuZGFyeT0ke3Bvc3REYXRhLmJvdW5kYXJ5fVwiKWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKGB2YWwgbWVkaWFUeXBlID0gTWVkaWFUeXBlLnBhcnNlKFwiJHtwb3N0RGF0YS5taW1lVHlwZX1cIilgKTtcbiAgICAgIH1cbiAgICAgIHB1c2goYHZhbCBib2R5ID0gUmVxdWVzdEJvZHkuY3JlYXRlKG1lZGlhVHlwZSwgJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX0pYCk7XG4gICAgfVxuXG4gICAgcHVzaCgndmFsIHJlcXVlc3QgPSBSZXF1ZXN0LkJ1aWxkZXIoKScpO1xuICAgIHB1c2goYC51cmwoXCIke2Z1bGxVcmx9XCIpYCwgMSk7XG4gICAgaWYgKCFtZXRob2RzLmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgcHVzaChgLm1ldGhvZChcIiR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9XCIsIGJvZHkpYCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKGAubWV0aG9kKFwiJHttZXRob2QudG9VcHBlckNhc2UoKX1cIiwgbnVsbClgLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1ldGhvZHNXaXRoQm9keS5pbmNsdWRlcyhtZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgIHB1c2goYC4ke21ldGhvZC50b0xvd2VyQ2FzZSgpfShib2R5KWAsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaChgLiR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9KG51bGwpYCwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goYC4ke21ldGhvZC50b0xvd2VyQ2FzZSgpfSgpYCwgMSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGhlYWRlcnMsIGluY2x1ZGluZyB0aGUgY29va2llc1xuICAgIE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHB1c2goYC5hZGRIZWFkZXIoXCIke2tleX1cIiwgXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhhbGxIZWFkZXJzW2tleV0pfVwiKWAsIDEpO1xuICAgIH0pO1xuXG4gICAgcHVzaCgnLmJ1aWxkKCknLCAxKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ3ZhbCByZXNwb25zZSA9IGNsaWVudC5uZXdDYWxsKHJlcXVlc3QpLmV4ZWN1dGUoKScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IG9raHR0cCB9IGZyb20gJy4vb2todHRwL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBrb3RsaW46IFRhcmdldCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2tvdGxpbicsXG4gICAgdGl0bGU6ICdLb3RsaW4nLFxuICAgIGV4dG5hbWU6ICcua3QnLFxuICAgIGRlZmF1bHQ6ICdva2h0dHAnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIG9raHR0cCxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBKYXZhc2NyaXB0ICYgTm9kZS5qcyB1c2luZyBBeGlvcy5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAcm9oaXQtZ29ocmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IGF4aW9zOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdheGlvcycsXG4gICAgdGl0bGU6ICdBeGlvcycsXG4gICAgbGluazogJ2h0dHBzOi8vZ2l0aHViLmNvbS9heGlvcy9heGlvcycsXG4gICAgZGVzY3JpcHRpb246ICdQcm9taXNlIGJhc2VkIEhUVFAgY2xpZW50IGZvciB0aGUgYnJvd3NlciBhbmQgbm9kZS5qcycsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IG1ldGhvZCwgdXJsLCBxdWVyeU9iaiwgYWxsSGVhZGVycywgcG9zdERhdGEgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgY29uc3QgeyBibGFuaywgam9pbiwgcHVzaCwgYWRkUG9zdFByb2Nlc3NvciB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIHB1c2goXCJjb25zdCBheGlvcyA9IHJlcXVpcmUoJ2F4aW9zJykuZGVmYXVsdDtcIik7XG5cbiAgICBjb25zdCByZXFPcHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgIH07XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcmVxT3B0cy5wYXJhbXMgPSBxdWVyeU9iajtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYWxsSGVhZGVycykubGVuZ3RoKSB7XG4gICAgICByZXFPcHRzLmhlYWRlcnMgPSBhbGxIZWFkZXJzO1xuICAgIH1cblxuICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgIGlmIChwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBwdXNoKFwiY29uc3QgeyBVUkxTZWFyY2hQYXJhbXMgfSA9IHJlcXVpcmUoJ3VybCcpO1wiKTtcbiAgICAgICAgICBibGFuaygpO1xuXG4gICAgICAgICAgcHVzaCgnY29uc3QgZW5jb2RlZFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsnKTtcbiAgICAgICAgICBwb3N0RGF0YS5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICBwdXNoKGBlbmNvZGVkUGFyYW1zLnNldCgnJHtwYXJhbS5uYW1lfScsICcke3BhcmFtLnZhbHVlfScpO2ApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYmxhbmsoKTtcblxuICAgICAgICAgIHJlcU9wdHMuZGF0YSA9ICdlbmNvZGVkUGFyYW1zLCc7XG4gICAgICAgICAgYWRkUG9zdFByb2Nlc3Nvcihjb2RlID0+IGNvZGUucmVwbGFjZSgvJ2VuY29kZWRQYXJhbXMsJy8sICdlbmNvZGVkUGFyYW1zLCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgaWYgKHBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgICAgICByZXFPcHRzLmRhdGEgPSBwb3N0RGF0YS5qc29uT2JqO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBibGFuaygpO1xuICAgICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIHJlcU9wdHMuZGF0YSA9IHBvc3REYXRhLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdHJpbmdpZmllZE9wdGlvbnMgPSBzdHJpbmdpZnlPYmplY3QocmVxT3B0cywgeyBpbmRlbnQ6ICcgICcsIGlubGluZUNoYXJhY3RlckxpbWl0OiA4MCB9KTtcbiAgICBwdXNoKGBjb25zdCBvcHRpb25zID0gJHtzdHJpbmdpZmllZE9wdGlvbnN9O2ApO1xuICAgIGJsYW5rKCk7XG5cbiAgICBwdXNoKCd0cnkgeycpO1xuICAgIHB1c2goJ2NvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXhpb3MucmVxdWVzdChvcHRpb25zKTsnLCAxKTtcbiAgICBwdXNoKCdjb25zb2xlLmxvZyhkYXRhKTsnLCAxKTtcbiAgICBwdXNoKCd9IGNhdGNoIChlcnJvcikgeycpO1xuICAgIHB1c2goJ2NvbnNvbGUuZXJyb3IoZXJyb3IpOycsIDEpO1xuICAgIHB1c2goJ30nKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgTm9kZS5qcyB1c2luZyBub2RlLWZldGNoLlxuICpcbiAqIEBhdXRob3JcbiAqIEBoaXJlbm9ibGVcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBnZXRIZWFkZXJOYW1lIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgY29uc3QgZmV0Y2g6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2ZldGNoJyxcbiAgICB0aXRsZTogJ0ZldGNoJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL2JpdGlubi9ub2RlLWZldGNoJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbXBsaWZpZWQgSFRUUCBub2RlLWZldGNoIGNsaWVudCcsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IG1ldGhvZCwgZnVsbFVybCwgcG9zdERhdGEsIGhlYWRlcnNPYmosIGNvb2tpZXMgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBsZXQgaW5jbHVkZUZTID0gZmFsc2U7XG4gICAgY29uc3QgeyBibGFuaywgcHVzaCwgam9pbiwgdW5zaGlmdCB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIHB1c2goXCJjb25zdCBmZXRjaCA9IHJlcXVpcmUoJ25vZGUtZmV0Y2gnKTtcIik7XG4gICAgYmxhbmsoKTtcblxuICAgIGNvbnN0IHJlcU9wdHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBtZXRob2QsXG4gICAgfTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICAgIHJlcU9wdHMuaGVhZGVycyA9IGhlYWRlcnNPYmo7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgdW5zaGlmdChcImNvbnN0IHsgVVJMU2VhcmNoUGFyYW1zIH0gPSByZXF1aXJlKCd1cmwnKTtcIik7XG4gICAgICAgIHB1c2goJ2NvbnN0IGVuY29kZWRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7Jyk7XG4gICAgICAgIHBvc3REYXRhLnBhcmFtcz8uZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgcHVzaChgZW5jb2RlZFBhcmFtcy5zZXQoJyR7cGFyYW0ubmFtZX0nLCAnJHtwYXJhbS52YWx1ZX0nKTtgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJsYW5rKCk7XG5cbiAgICAgICAgcmVxT3B0cy5ib2R5ID0gJ2VuY29kZWRQYXJhbXMnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIGlmIChwb3N0RGF0YS5qc29uT2JqKSB7XG4gICAgICAgICAgcmVxT3B0cy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocG9zdERhdGEuanNvbk9iaik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgICBpZiAoIXBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGBmb3JtLWRhdGFgIG1vZHVsZSBhdXRvbWF0aWNhbGx5IGFkZHMgYSBgQ29udGVudC1UeXBlYCBoZWFkZXIgZm9yIGBtdWx0aXBhcnQvZm9ybS1kYXRhYCBjb250ZW50IGFuZCBpZiB3ZSBhZGQgb3VyIG93biBoZXJlIGRhdGEgd29uJ3QgYmUgY29ycmVjdGx5IHRyYW5zbWl0dGVkLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnMgLS0gV2UncmUgb25seSB1c2luZyBgY29udGVudFR5cGVIZWFkZXJgIHdpdGhpbiB0aGlzIGJsb2NrLlxuICAgICAgICBjb25zdCBjb250ZW50VHlwZUhlYWRlciA9IGdldEhlYWRlck5hbWUoaGVhZGVyc09iaiwgJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgICBpZiAoY29udGVudFR5cGVIZWFkZXIpIHtcbiAgICAgICAgICBkZWxldGUgaGVhZGVyc09ialtjb250ZW50VHlwZUhlYWRlcl07XG4gICAgICAgIH1cblxuICAgICAgICB1bnNoaWZ0KFwiY29uc3QgRm9ybURhdGEgPSByZXF1aXJlKCdmb3JtLWRhdGEnKTtcIik7XG4gICAgICAgIHB1c2goJ2NvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7Jyk7XG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBpZiAoIXBhcmFtLmZpbGVOYW1lICYmICFwYXJhbS5maWxlTmFtZSAmJiAhcGFyYW0uY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgIHB1c2goYGZvcm1EYXRhLmFwcGVuZCgnJHtwYXJhbS5uYW1lfScsICcke3BhcmFtLnZhbHVlfScpO2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXJhbS5maWxlTmFtZSkge1xuICAgICAgICAgICAgaW5jbHVkZUZTID0gdHJ1ZTtcbiAgICAgICAgICAgIHB1c2goYGZvcm1EYXRhLmFwcGVuZCgnJHtwYXJhbS5uYW1lfScsIGZzLmNyZWF0ZVJlYWRTdHJlYW0oJyR7cGFyYW0uZmlsZU5hbWV9JykpO2ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIHJlcU9wdHMuYm9keSA9IHBvc3REYXRhLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29va2llcyBhcmd1bWVudFxuICAgIGlmIChjb29raWVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY29va2llc1N0cmluZyA9IGNvb2tpZXNcbiAgICAgICAgLm1hcChjb29raWUgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5uYW1lKX09JHtlbmNvZGVVUklDb21wb25lbnQoY29va2llLnZhbHVlKX1gKVxuICAgICAgICAuam9pbignOyAnKTtcbiAgICAgIGlmIChyZXFPcHRzLmhlYWRlcnMpIHtcbiAgICAgICAgcmVxT3B0cy5oZWFkZXJzLmNvb2tpZSA9IGNvb2tpZXNTdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXFPcHRzLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgcmVxT3B0cy5oZWFkZXJzLmNvb2tpZSA9IGNvb2tpZXNTdHJpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChgY29uc3QgdXJsID0gJyR7ZnVsbFVybH0nO2ApO1xuXG4gICAgLy8gSWYgd2UgdWx0aW1hdGVseSBkb24ndCBoYXZlIGFueSBoZWFkZXJzIHRvIHNlbmQgdGhlbiB3ZSBzaG91bGRuJ3QgYWRkIGFuIGVtcHR5IG9iamVjdCBpbnRvIHRoZSByZXF1ZXN0IG9wdGlvbnMuXG4gICAgaWYgKHJlcU9wdHMuaGVhZGVycyAmJiAhT2JqZWN0LmtleXMocmVxT3B0cy5oZWFkZXJzKS5sZW5ndGgpIHtcbiAgICAgIGRlbGV0ZSByZXFPcHRzLmhlYWRlcnM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyaW5naWZpZWRPcHRpb25zID0gc3RyaW5naWZ5T2JqZWN0KHJlcU9wdHMsIHsgaW5kZW50OiAnICAnLCBpbmxpbmVDaGFyYWN0ZXJMaW1pdDogODAgfSk7XG4gICAgcHVzaChgY29uc3Qgb3B0aW9ucyA9ICR7c3RyaW5naWZpZWRPcHRpb25zfTtgKTtcblxuICAgIGlmIChpbmNsdWRlRlMpIHtcbiAgICAgIHVuc2hpZnQoXCJjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XCIpO1xuICAgIH1cbiAgICBpZiAocG9zdERhdGEucGFyYW1zICYmIHBvc3REYXRhLm1pbWVUeXBlID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpIHtcbiAgICAgIHB1c2goJ29wdGlvbnMuYm9keSA9IGZvcm1EYXRhOycpO1xuICAgIH1cbiAgICBibGFuaygpO1xuXG4gICAgcHVzaCgndHJ5IHsnKTtcbiAgICBwdXNoKGBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7YCwgMSk7XG4gICAgcHVzaCgnY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsnLCAxKTtcbiAgICBwdXNoKCdjb25zb2xlLmxvZyhkYXRhKTsnLCAxKTtcbiAgICBwdXNoKCd9IGNhdGNoIChlcnJvcikgeycpO1xuICAgIHB1c2goJ2NvbnNvbGUuZXJyb3IoZXJyb3IpOycsIDEpO1xuICAgIHB1c2goJ30nKTtcblxuICAgIHJldHVybiBqb2luKClcbiAgICAgIC5yZXBsYWNlKC8nZW5jb2RlZFBhcmFtcycvLCAnZW5jb2RlZFBhcmFtcycpXG4gICAgICAucmVwbGFjZSgvXCJmc1xcLmNyZWF0ZVJlYWRTdHJlYW1cXChcXFxcXCIoLispXFxcXFwiXFwpXCIvLCAnZnMuY3JlYXRlUmVhZFN0cmVhbShcIiQxXCIpJyk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgbmF0aXZlIE5vZGUuanMuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCBzdHJpbmdpZnlPYmplY3QgZnJvbSAnc3RyaW5naWZ5LW9iamVjdCc7XG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZU5hdGl2ZU9wdGlvbnMge1xuICBpbnNlY3VyZVNraXBWZXJpZnk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgbmF0aXZlOiBDbGllbnQ8Tm9kZU5hdGl2ZU9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnbmF0aXZlJyxcbiAgICB0aXRsZTogJ0hUVFAnLFxuICAgIGxpbms6ICdodHRwOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfaHR0cF9yZXF1ZXN0X29wdGlvbnNfY2FsbGJhY2snLFxuICAgIGRlc2NyaXB0aW9uOiAnTm9kZS5qcyBuYXRpdmUgSFRUUCBpbnRlcmZhY2UnLFxuICB9LFxuICBjb252ZXJ0OiAoeyB1cmlPYmosIG1ldGhvZCwgYWxsSGVhZGVycywgcG9zdERhdGEgfSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBpbmRlbnQgPSAnICAnLCBpbnNlY3VyZVNraXBWZXJpZnkgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGJsYW5rLCBqb2luLCBwdXNoLCB1bnNoaWZ0IH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQgfSk7XG5cbiAgICBjb25zdCByZXFPcHRzID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaG9zdG5hbWU6IHVyaU9iai5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHVyaU9iai5wb3J0LFxuICAgICAgcGF0aDogdXJpT2JqLnBhdGgsXG4gICAgICBoZWFkZXJzOiBhbGxIZWFkZXJzLFxuICAgICAgLi4uKGluc2VjdXJlU2tpcFZlcmlmeSA/IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9IDoge30pLFxuICAgIH07XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE8gc2VlbXMgbGlrZSBhIGxlZ2l0IGVycm9yXG4gICAgcHVzaChgY29uc3QgaHR0cCA9IHJlcXVpcmUoJyR7dXJpT2JqLnByb3RvY29sLnJlcGxhY2UoJzonLCAnJyl9Jyk7YCk7XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goYGNvbnN0IG9wdGlvbnMgPSAke3N0cmluZ2lmeU9iamVjdChyZXFPcHRzLCB7IGluZGVudCB9KX07YCk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdjb25zdCByZXEgPSBodHRwLnJlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24gKHJlcykgeycpO1xuICAgIHB1c2goJ2NvbnN0IGNodW5rcyA9IFtdOycsIDEpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaChcInJlcy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1wiLCAxKTtcbiAgICBwdXNoKCdjaHVua3MucHVzaChjaHVuayk7JywgMik7XG4gICAgcHVzaCgnfSk7JywgMSk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKFwicmVzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XCIsIDEpO1xuICAgIHB1c2goJ2NvbnN0IGJvZHkgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7JywgMik7XG4gICAgcHVzaCgnY29uc29sZS5sb2coYm9keS50b1N0cmluZygpKTsnLCAyKTtcbiAgICBwdXNoKCd9KTsnLCAxKTtcbiAgICBwdXNoKCd9KTsnKTtcbiAgICBibGFuaygpO1xuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtc09iaikge1xuICAgICAgICAgIHVuc2hpZnQoXCJjb25zdCBxcyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XCIpO1xuICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICBgcmVxLndyaXRlKHFzLnN0cmluZ2lmeSgke3N0cmluZ2lmeU9iamVjdChwb3N0RGF0YS5wYXJhbXNPYmosIHtcbiAgICAgICAgICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgICAgICAgICBpbmxpbmVDaGFyYWN0ZXJMaW1pdDogODAsXG4gICAgICAgICAgICB9KX0pKTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICBgcmVxLndyaXRlKEpTT04uc3RyaW5naWZ5KCR7c3RyaW5naWZ5T2JqZWN0KHBvc3REYXRhLmpzb25PYmosIHtcbiAgICAgICAgICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgICAgICAgICBpbmxpbmVDaGFyYWN0ZXJMaW1pdDogODAsXG4gICAgICAgICAgICB9KX0pKTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcHVzaChgcmVxLndyaXRlKCR7c3RyaW5naWZ5T2JqZWN0KHBvc3REYXRhLnRleHQsIHsgaW5kZW50IH0pfSk7YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKCdyZXEuZW5kKCk7Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIE5vZGUuanMgdXNpbmcgUmVxdWVzdC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAQWhtYWROYXNzcmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHN0cmluZ2lmeU9iamVjdCBmcm9tICdzdHJpbmdpZnktb2JqZWN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IHJlcXVlc3Q6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3JlcXVlc3QnLFxuICAgIHRpdGxlOiAnUmVxdWVzdCcsXG4gICAgbGluazogJ2h0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0L3JlcXVlc3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2ltcGxpZmllZCBIVFRQIHJlcXVlc3QgY2xpZW50JyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCB1cmwsIHF1ZXJ5T2JqLCBwb3N0RGF0YSwgaGVhZGVyc09iaiwgY29va2llcyB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGxldCBpbmNsdWRlRlMgPSBmYWxzZTtcbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luLCB1bnNoaWZ0IH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuXG4gICAgcHVzaChcImNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCdyZXF1ZXN0Jyk7XCIpO1xuICAgIGJsYW5rKCk7XG5cbiAgICBjb25zdCByZXFPcHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgIH07XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcmVxT3B0cy5xcyA9IHF1ZXJ5T2JqO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICAgIHJlcU9wdHMuaGVhZGVycyA9IGhlYWRlcnNPYmo7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgcmVxT3B0cy5mb3JtID0gcG9zdERhdGEucGFyYW1zT2JqO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIGlmIChwb3N0RGF0YS5qc29uT2JqKSB7XG4gICAgICAgICAgcmVxT3B0cy5ib2R5ID0gcG9zdERhdGEuanNvbk9iajtcbiAgICAgICAgICByZXFPcHRzLmpzb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgaWYgKCFwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcU9wdHMuZm9ybURhdGEgPSB7fTtcblxuICAgICAgICBwb3N0RGF0YS5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgaWYgKCFwYXJhbS5maWxlTmFtZSAmJiAhcGFyYW0uZmlsZU5hbWUgJiYgIXBhcmFtLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICByZXFPcHRzLmZvcm1EYXRhW3BhcmFtLm5hbWVdID0gcGFyYW0udmFsdWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGF0dGFjaG1lbnQ6IHtcbiAgICAgICAgICAgIHZhbHVlPzogc3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgY29udGVudFR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gPSB7fTtcblxuICAgICAgICAgIGlmIChwYXJhbS5maWxlTmFtZSkge1xuICAgICAgICAgICAgaW5jbHVkZUZTID0gdHJ1ZTtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQgPSB7XG4gICAgICAgICAgICAgIHZhbHVlOiBgZnMuY3JlYXRlUmVhZFN0cmVhbSgke3BhcmFtLmZpbGVOYW1lfSlgLFxuICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcmFtLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBwYXJhbS5jb250ZW50VHlwZSA/IHBhcmFtLmNvbnRlbnRUeXBlIDogbnVsbCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS52YWx1ZSkge1xuICAgICAgICAgICAgYXR0YWNobWVudC52YWx1ZSA9IHBhcmFtLnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcU9wdHMuZm9ybURhdGFbcGFyYW0ubmFtZV0gPSBhdHRhY2htZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcmVxT3B0cy5ib2R5ID0gcG9zdERhdGEudGV4dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBjb29raWVzIGFyZ3VtZW50XG4gICAgaWYgKGNvb2tpZXMubGVuZ3RoKSB7XG4gICAgICByZXFPcHRzLmphciA9ICdKQVInO1xuXG4gICAgICBwdXNoKCdjb25zdCBqYXIgPSByZXF1ZXN0LmphcigpOycpO1xuXG4gICAgICBjb29raWVzLmZvckVhY2goY29va2llID0+IHtcbiAgICAgICAgcHVzaChcbiAgICAgICAgICBgamFyLnNldENvb2tpZShyZXF1ZXN0LmNvb2tpZSgnJHtlbmNvZGVVUklDb21wb25lbnQoY29va2llLm5hbWUpfT0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgICAgICAgIGNvb2tpZS52YWx1ZSxcbiAgICAgICAgICApfScpLCAnJHt1cmx9Jyk7YCxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZUZTKSB7XG4gICAgICB1bnNoaWZ0KFwiY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1wiKTtcbiAgICB9XG5cbiAgICBwdXNoKFxuICAgICAgYGNvbnN0IG9wdGlvbnMgPSAke3N0cmluZ2lmeU9iamVjdChyZXFPcHRzLCB7IGluZGVudDogJyAgJywgaW5saW5lQ2hhcmFjdGVyTGltaXQ6IDgwIH0pfTtgLFxuICAgICk7XG4gICAgYmxhbmsoKTtcblxuICAgIHB1c2goJ3JlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSwgYm9keSkgeycpO1xuICAgIHB1c2goJ2lmIChlcnJvcikgdGhyb3cgbmV3IEVycm9yKGVycm9yKTsnLCAxKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ2NvbnNvbGUubG9nKGJvZHkpOycsIDEpO1xuICAgIHB1c2goJ30pOycpO1xuXG4gICAgcmV0dXJuIGpvaW4oKVxuICAgICAgLnJlcGxhY2UoXCInSkFSJ1wiLCAnamFyJylcbiAgICAgIC5yZXBsYWNlKC8nZnNcXC5jcmVhdGVSZWFkU3RyZWFtXFwoKC4qKVxcKScvLCBcImZzLmNyZWF0ZVJlYWRTdHJlYW0oJyQxJylcIik7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBheGlvcyB9IGZyb20gJy4vYXhpb3MvY2xpZW50JztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAnLi9mZXRjaC9jbGllbnQnO1xuaW1wb3J0IHsgbmF0aXZlIH0gZnJvbSAnLi9uYXRpdmUvY2xpZW50JztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICcuL3JlcXVlc3QvY2xpZW50JztcbmltcG9ydCB7IHVuaXJlc3QgfSBmcm9tICcuL3VuaXJlc3QvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IG5vZGU6IFRhcmdldCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ25vZGUnLFxuICAgIHRpdGxlOiAnTm9kZS5qcycsXG4gICAgZXh0bmFtZTogJy5qcycsXG4gICAgZGVmYXVsdDogJ25hdGl2ZScsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgbmF0aXZlLFxuICAgIHJlcXVlc3QsXG4gICAgdW5pcmVzdCxcbiAgICBheGlvcyxcbiAgICBmZXRjaCxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBOb2RlLmpzIHVzaW5nIFVuaXJlc3QuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCBzdHJpbmdpZnlPYmplY3QgZnJvbSAnc3RyaW5naWZ5LW9iamVjdCc7XG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCB1bmlyZXN0OiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICd1bmlyZXN0JyxcbiAgICB0aXRsZTogJ1VuaXJlc3QnLFxuICAgIGxpbms6ICdodHRwOi8vdW5pcmVzdC5pby9ub2RlanMuaHRtbCcsXG4gICAgZGVzY3JpcHRpb246ICdMaWdodHdlaWdodCBIVFRQIFJlcXVlc3QgQ2xpZW50IExpYnJhcnknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBtZXRob2QsIHVybCwgY29va2llcywgcXVlcnlPYmosIHBvc3REYXRhLCBoZWFkZXJzT2JqIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgbGV0IGluY2x1ZGVGUyA9IGZhbHNlO1xuICAgIGNvbnN0IHsgYWRkUG9zdFByb2Nlc3NvciwgYmxhbmssIGpvaW4sIHB1c2gsIHVuc2hpZnQgfSA9IG5ldyBDb2RlQnVpbGRlcih7XG4gICAgICBpbmRlbnQ6IG9wdHMuaW5kZW50LFxuICAgIH0pO1xuXG4gICAgcHVzaChcImNvbnN0IHVuaXJlc3QgPSByZXF1aXJlKCd1bmlyZXN0Jyk7XCIpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaChgY29uc3QgcmVxID0gdW5pcmVzdCgnJHttZXRob2R9JywgJyR7dXJsfScpO2ApO1xuICAgIGJsYW5rKCk7XG5cbiAgICBpZiAoY29va2llcy5sZW5ndGgpIHtcbiAgICAgIHB1c2goJ2NvbnN0IENvb2tpZUphciA9IHVuaXJlc3QuamFyKCk7Jyk7XG5cbiAgICAgIGNvb2tpZXMuZm9yRWFjaChjb29raWUgPT4ge1xuICAgICAgICBwdXNoKFxuICAgICAgICAgIGBDb29raWVKYXIuYWRkKCcke2VuY29kZVVSSUNvbXBvbmVudChjb29raWUubmFtZSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgICAgY29va2llLnZhbHVlLFxuICAgICAgICAgICl9JywgJyR7dXJsfScpO2AsXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgcHVzaCgncmVxLmphcihDb29raWVKYXIpOycpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcHVzaChgcmVxLnF1ZXJ5KCR7c3RyaW5naWZ5T2JqZWN0KHF1ZXJ5T2JqLCB7IGluZGVudDogb3B0cy5pbmRlbnQgfSl9KTtgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGhlYWRlcnNPYmopLmxlbmd0aCkge1xuICAgICAgcHVzaChgcmVxLmhlYWRlcnMoJHtzdHJpbmdpZnlPYmplY3QoaGVhZGVyc09iaiwgeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pfSk7YCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgIGlmIChwb3N0RGF0YS5wYXJhbXNPYmopIHtcbiAgICAgICAgICBwdXNoKGByZXEuZm9ybSgke3N0cmluZ2lmeU9iamVjdChwb3N0RGF0YS5wYXJhbXNPYmosIHsgaW5kZW50OiBvcHRzLmluZGVudCB9KX0pO2ApO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgIHB1c2goXCJyZXEudHlwZSgnanNvbicpO1wiKTtcbiAgICAgICAgICBwdXNoKGByZXEuc2VuZCgke3N0cmluZ2lmeU9iamVjdChwb3N0RGF0YS5qc29uT2JqLCB7IGluZGVudDogb3B0cy5pbmRlbnQgfSl9KTtgKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzoge1xuICAgICAgICBpZiAoIXBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbXVsdGlwYXJ0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBbXTtcblxuICAgICAgICBwb3N0RGF0YS5wYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgaWYgKHBhcmFtLmZpbGVOYW1lICYmICFwYXJhbS52YWx1ZSkge1xuICAgICAgICAgICAgaW5jbHVkZUZTID0gdHJ1ZTtcblxuICAgICAgICAgICAgcGFydC5ib2R5ID0gYGZzLmNyZWF0ZVJlYWRTdHJlYW0oJyR7cGFyYW0uZmlsZU5hbWV9JylgO1xuICAgICAgICAgICAgYWRkUG9zdFByb2Nlc3Nvcihjb2RlID0+XG4gICAgICAgICAgICAgIGNvZGUucmVwbGFjZSgvJ2ZzXFwuY3JlYXRlUmVhZFN0cmVhbVxcKFxcXFwnKC4rKVxcXFwnXFwpJy8sIFwiZnMuY3JlYXRlUmVhZFN0cmVhbSgnJDEnKVwiKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS52YWx1ZSkge1xuICAgICAgICAgICAgcGFydC5ib2R5ID0gcGFyYW0udmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcnQuYm9keSkge1xuICAgICAgICAgICAgaWYgKHBhcmFtLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICAgIHBhcnRbJ2NvbnRlbnQtdHlwZSddID0gcGFyYW0uY29udGVudFR5cGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG11bHRpcGFydC5wdXNoKHBhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHVzaChgcmVxLm11bHRpcGFydCgke3N0cmluZ2lmeU9iamVjdChtdWx0aXBhcnQsIHsgaW5kZW50OiBvcHRzLmluZGVudCB9KX0pO2ApO1xuICAgICAgICBibGFuaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgICBwdXNoKGByZXEuc2VuZCgke3N0cmluZ2lmeU9iamVjdChwb3N0RGF0YS50ZXh0LCB7IGluZGVudDogb3B0cy5pbmRlbnQgfSl9KTtgKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluY2x1ZGVGUykge1xuICAgICAgdW5zaGlmdChcImNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcIik7XG4gICAgfVxuXG4gICAgcHVzaCgncmVxLmVuZChmdW5jdGlvbiAocmVzKSB7Jyk7XG4gICAgcHVzaCgnaWYgKHJlcy5lcnJvcikgdGhyb3cgbmV3IEVycm9yKHJlcy5lcnJvcik7JywgMSk7XG4gICAgYmxhbmsoKTtcblxuICAgIHB1c2goJ2NvbnNvbGUubG9nKHJlcy5ib2R5KTsnLCAxKTtcbiAgICBwdXNoKCd9KTsnKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBDcmVhdGUgYSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBhIHZhbGlkIGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiBvZiBhbiBPYmplY3RpdmUtQyBvYmplY3QgbGl0ZXJhbC5cbiAqXG4gKiBAcGFyYW0gbnNDbGFzcyBDbGFzcyBvZiB0aGUgbGl0dGVyYWxcbiAqIEBwYXJhbSBuYW1lIERlc2lyZWQgbmFtZSBvZiB0aGUgaW5zdGFuY2VcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIEtleS12YWx1ZSBvYmplY3Qgb2YgcGFyYW1ldGVycyB0byB0cmFuc2xhdGUgdG8gYW4gT2JqZWN0aXZlLUMgb2JqZWN0IGxpdGVhcmFsXG4gKiBAcGFyYW0gaW5kZW50IElmIHRydWUsIHdpbGwgZGVjbGFyZSB0aGUgbGl0dGVyYWwgYnkgaW5kZW50aW5nIGVhY2ggbmV3IGtleS92YWx1ZSBwYWlyLlxuICogQHJldHVybiBBIHZhbGlkIE9iamVjdGl2ZS1DIGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiBvZiBhbiBPYmplY3RpdmUtQyBvYmplY3QgbGl0dGVyYWwuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgbnNEZWNsYXJhdGlvbignTlNEaWN0aW9uYXJ5JywgJ3BhcmFtcycsIHthOiAnYicsIGM6ICdkJ30sIHRydWUpXG4gKiAgIC8vIHJldHVybnM6XG4gKiAgIE5TRGljdGlvbmFyeSAqcGFyYW1zID0gQHsgQFwiYVwiOiBAXCJiXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFwiY1wiOiBAXCJkXCIgfTtcbiAqXG4gKiAgIG5zRGVjbGFyYXRpb24oJ05TRGljdGlvbmFyeScsICdwYXJhbXMnLCB7YTogJ2InLCBjOiAnZCd9KVxuICogICAvLyByZXR1cm5zOlxuICogICBOU0RpY3Rpb25hcnkgKnBhcmFtcyA9IEB7IEBcImFcIjogQFwiYlwiLCBAXCJjXCI6IEBcImRcIiB9O1xuICovXG5leHBvcnQgY29uc3QgbnNEZWNsYXJhdGlvbiA9IChcbiAgbnNDbGFzczogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGluZGVudD86IGJvb2xlYW4sXG4pID0+IHtcbiAgY29uc3Qgb3BlbmluZyA9IGAke25zQ2xhc3N9ICoke25hbWV9ID0gYDtcbiAgY29uc3QgbGl0ZXJhbCA9IGxpdGVyYWxSZXByZXNlbnRhdGlvbihwYXJhbWV0ZXJzLCBpbmRlbnQgPyBvcGVuaW5nLmxlbmd0aCA6IHVuZGVmaW5lZCk7XG4gIHJldHVybiBgJHtvcGVuaW5nfSR7bGl0ZXJhbH07YDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgdmFsaWQgT2JqZWN0aXZlLUMgc3RyaW5nIG9mIGEgbGl0ZXJhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIEFueSBKYXZhU2NyaXB0IGxpdGVyYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGxpdGVyYWxSZXByZXNlbnRhdGlvbiA9ICh2YWx1ZTogYW55LCBpbmRlbnRhdGlvbj86IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGpvaW4gPSBpbmRlbnRhdGlvbiA9PT0gdW5kZWZpbmVkID8gJywgJyA6IGAsXFxuICAgJHsnICcucmVwZWF0KGluZGVudGF0aW9uKX1gO1xuXG4gIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSkge1xuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICByZXR1cm4gYEAke3ZhbHVlfWA7XG5cbiAgICBjYXNlICdbb2JqZWN0IEFycmF5XSc6IHtcbiAgICAgIGNvbnN0IHZhbHVlc1JlcHJlc2VudGF0aW9uID0gdmFsdWUubWFwKCh2YWx1ZTogYW55KSA9PiBsaXRlcmFsUmVwcmVzZW50YXRpb24odmFsdWUpKTtcbiAgICAgIHJldHVybiBgQFsgJHt2YWx1ZXNSZXByZXNlbnRhdGlvbi5qb2luKGpvaW4pfSBdYDtcbiAgICB9XG5cbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOiB7XG4gICAgICBjb25zdCBrZXlWYWx1ZVBhaXJzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBrZXlWYWx1ZVBhaXJzLnB1c2goYEBcIiR7a2V5fVwiOiAke2xpdGVyYWxSZXByZXNlbnRhdGlvbih2YWx1ZVtrZXldKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgQHsgJHtrZXlWYWx1ZVBhaXJzLmpvaW4oam9pbil9IH1gO1xuICAgIH1cblxuICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgcmV0dXJuIHZhbHVlID8gJ0BZRVMnIDogJ0BOTyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBAXCIke3ZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIE9iamVjdGl2ZS1DIHVzaW5nIE5TVVJMU2Vzc2lvbi5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAdGhpYmF1bHRDaGFcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IG5zRGVjbGFyYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGludGVyZmFjZSBOc3VybHNlc3Npb25PcHRpb25zIHtcbiAgcHJldHR5PzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IG5zdXJsc2Vzc2lvbjogQ2xpZW50PE5zdXJsc2Vzc2lvbk9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnbnN1cmxzZXNzaW9uJyxcbiAgICB0aXRsZTogJ05TVVJMU2Vzc2lvbicsXG4gICAgbGluazogJ2h0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy9kb2N1bWVudGF0aW9uL0ZvdW5kYXRpb24vUmVmZXJlbmNlL05TVVJMU2Vzc2lvbl9jbGFzcy9pbmRleC5odG1sJyxcbiAgICBkZXNjcmlwdGlvbjogXCJGb3VuZGF0aW9uJ3MgTlNVUkxTZXNzaW9uIHJlcXVlc3RcIixcbiAgfSxcbiAgY29udmVydDogKHsgYWxsSGVhZGVycywgcG9zdERhdGEsIG1ldGhvZCwgZnVsbFVybCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgICAnLFxuICAgICAgcHJldHR5OiB0cnVlLFxuICAgICAgdGltZW91dDogMTAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCB7IHB1c2gsIGpvaW4sIGJsYW5rIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuICAgIC8vIE1hcmtlcnMgZm9yIGhlYWRlcnMgdG8gYmUgY3JlYXRlZCBhcyBsaXRlcmFsIG9iamVjdHMgYW5kIGxhdGVyIGJlIHNldCBvbiB0aGUgTlNVUkxSZXF1ZXN0IGlmIGV4aXN0XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgaGFzSGVhZGVyczogZmFsc2UsXG4gICAgICBoYXNCb2R5OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gV2UganVzdCB3YW50IHRvIG1ha2Ugc3VyZSBwZW9wbGUgdW5kZXJzdGFuZCB0aGF0IGlzIHRoZSBvbmx5IGRlcGVuZGVuY3lcbiAgICBwdXNoKCcjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4nKTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhhbGxIZWFkZXJzKS5sZW5ndGgpIHtcbiAgICAgIHJlcS5oYXNIZWFkZXJzID0gdHJ1ZTtcbiAgICAgIGJsYW5rKCk7XG4gICAgICBwdXNoKG5zRGVjbGFyYXRpb24oJ05TRGljdGlvbmFyeScsICdoZWFkZXJzJywgYWxsSGVhZGVycywgb3B0cy5wcmV0dHkpKTtcbiAgICB9XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCB8fCBwb3N0RGF0YS5qc29uT2JqIHx8IHBvc3REYXRhLnBhcmFtcykge1xuICAgICAgcmVxLmhhc0JvZHkgPSB0cnVlO1xuXG4gICAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBCeSBhcHBlbmRpbmcgcGFyYW1ldGVycyBvbmUgYnkgb25lIGluIHRoZSByZXN1bHRpbmcgc25pcHBldCxcbiAgICAgICAgICAgIC8vIHdlIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgdXNlciB0byBlZGl0IGl0IGFjY29yZGluZyB0byBoaXMgb3IgaGVyIG5lZWRzIGFmdGVyIHBhc3RpbmcuXG4gICAgICAgICAgICAvLyBUaGUgdXNlciBjYW4ganVzdCBhZGQvcmVtb3ZlIGxpbmVzIGFkZGluZy9yZW1vdmluZyBib2R5IHBhcmFtZXRlcnMuXG4gICAgICAgICAgICBibGFuaygpO1xuXG4gICAgICAgICAgICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBwb3N0RGF0YS5wYXJhbXM7XG4gICAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgICBgTlNNdXRhYmxlRGF0YSAqcG9zdERhdGEgPSBbW05TTXV0YWJsZURhdGEgYWxsb2NdIGluaXRXaXRoRGF0YTpbQFwiJHtoZWFkLm5hbWV9PSR7aGVhZC52YWx1ZX1cIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ11dO2AsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0YWlsLmZvckVhY2goKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgICAgIGBbcG9zdERhdGEgYXBwZW5kRGF0YTpbQFwiJiR7bmFtZX09JHt2YWx1ZX1cIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ11dO2AsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxLmhhc0JvZHkgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgICAgaWYgKHBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgICAgICAgIHB1c2gobnNEZWNsYXJhdGlvbignTlNEaWN0aW9uYXJ5JywgJ3BhcmFtZXRlcnMnLCBwb3N0RGF0YS5qc29uT2JqLCBvcHRzLnByZXR0eSkpO1xuICAgICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAgICdOU0RhdGEgKnBvc3REYXRhID0gW05TSlNPTlNlcmlhbGl6YXRpb24gZGF0YVdpdGhKU09OT2JqZWN0OnBhcmFtZXRlcnMgb3B0aW9uczowIGVycm9yOm5pbF07JyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgICAgIC8vIEJ5IGFwcGVuZGluZyBtdWx0aXBhcnQgcGFyYW1ldGVycyBvbmUgYnkgb25lIGluIHRoZSByZXN1bHRpbmcgc25pcHBldCxcbiAgICAgICAgICAvLyB3ZSBtYWtlIGl0IGVhc2llciBmb3IgdGhlIHVzZXIgdG8gZWRpdCBpdCBhY2NvcmRpbmcgdG8gaGlzIG9yIGhlciBuZWVkcyBhZnRlciBwYXN0aW5nLlxuICAgICAgICAgIC8vIFRoZSB1c2VyIGNhbiBqdXN0IGVkaXQgdGhlIHBhcmFtZXRlcnMgTlNEaWN0aW9uYXJ5IG9yIHB1dCB0aGlzIHBhcnQgb2YgYSBzbmlwcGV0IGluIGEgbXVsdGlwYXJ0IGJ1aWxkZXIgbWV0aG9kLlxuICAgICAgICAgIHB1c2gobnNEZWNsYXJhdGlvbignTlNBcnJheScsICdwYXJhbWV0ZXJzJywgcG9zdERhdGEucGFyYW1zIHx8IFtdLCBvcHRzLnByZXR0eSkpO1xuICAgICAgICAgIHB1c2goYE5TU3RyaW5nICpib3VuZGFyeSA9IEBcIiR7cG9zdERhdGEuYm91bmRhcnl9XCI7YCk7XG4gICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgICBwdXNoKCdOU0Vycm9yICplcnJvcjsnKTtcbiAgICAgICAgICBwdXNoKCdOU011dGFibGVTdHJpbmcgKmJvZHkgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ107Jyk7XG4gICAgICAgICAgcHVzaCgnZm9yIChOU0RpY3Rpb25hcnkgKnBhcmFtIGluIHBhcmFtZXRlcnMpIHsnKTtcbiAgICAgICAgICBwdXNoKCdbYm9keSBhcHBlbmRGb3JtYXQ6QFwiLS0lQFxcXFxyXFxcXG5cIiwgYm91bmRhcnldOycsIDEpO1xuICAgICAgICAgIHB1c2goJ2lmIChwYXJhbVtAXCJmaWxlTmFtZVwiXSkgeycsIDEpO1xuICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAnW2JvZHkgYXBwZW5kRm9ybWF0OkBcIkNvbnRlbnQtRGlzcG9zaXRpb246Zm9ybS1kYXRhOyBuYW1lPVxcXFxcIiVAXFxcXFwiOyBmaWxlbmFtZT1cXFxcXCIlQFxcXFxcIlxcXFxyXFxcXG5cIiwgcGFyYW1bQFwibmFtZVwiXSwgcGFyYW1bQFwiZmlsZU5hbWVcIl1dOycsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcHVzaCgnW2JvZHkgYXBwZW5kRm9ybWF0OkBcIkNvbnRlbnQtVHlwZTogJUBcXFxcclxcXFxuXFxcXHJcXFxcblwiLCBwYXJhbVtAXCJjb250ZW50VHlwZVwiXV07JywgMik7XG4gICAgICAgICAgcHVzaChcbiAgICAgICAgICAgICdbYm9keSBhcHBlbmRGb3JtYXQ6QFwiJUBcIiwgW05TU3RyaW5nIHN0cmluZ1dpdGhDb250ZW50c09mRmlsZTpwYXJhbVtAXCJmaWxlTmFtZVwiXSBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZyBlcnJvcjomZXJyb3JdXTsnLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApO1xuICAgICAgICAgIHB1c2goJ2lmIChlcnJvcikgeycsIDIpO1xuICAgICAgICAgIHB1c2goJ05TTG9nKEBcIiVAXCIsIGVycm9yKTsnLCAzKTtcbiAgICAgICAgICBwdXNoKCd9JywgMik7XG4gICAgICAgICAgcHVzaCgnfSBlbHNlIHsnLCAxKTtcbiAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgJ1tib2R5IGFwcGVuZEZvcm1hdDpAXCJDb250ZW50LURpc3Bvc2l0aW9uOmZvcm0tZGF0YTsgbmFtZT1cXFxcXCIlQFxcXFxcIlxcXFxyXFxcXG5cXFxcclxcXFxuXCIsIHBhcmFtW0BcIm5hbWVcIl1dOycsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcHVzaCgnW2JvZHkgYXBwZW5kRm9ybWF0OkBcIiVAXCIsIHBhcmFtW0BcInZhbHVlXCJdXTsnLCAyKTtcbiAgICAgICAgICBwdXNoKCd9JywgMSk7XG4gICAgICAgICAgcHVzaCgnfScpO1xuICAgICAgICAgIHB1c2goJ1tib2R5IGFwcGVuZEZvcm1hdDpAXCJcXFxcclxcXFxuLS0lQC0tXFxcXHJcXFxcblwiLCBib3VuZGFyeV07Jyk7XG4gICAgICAgICAgcHVzaCgnTlNEYXRhICpwb3N0RGF0YSA9IFtib2R5IGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsnKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgcHVzaChcbiAgICAgICAgICAgIGBOU0RhdGEgKnBvc3REYXRhID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoRGF0YTpbQFwiJHtwb3N0RGF0YS50ZXh0fVwiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXV07YCxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGJsYW5rKCk7XG4gICAgcHVzaChcbiAgICAgIGBOU011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0ID0gW05TTXV0YWJsZVVSTFJlcXVlc3QgcmVxdWVzdFdpdGhVUkw6W05TVVJMIFVSTFdpdGhTdHJpbmc6QFwiJHtmdWxsVXJsfVwiXWAsXG4gICAgKTtcblxuICAgIC8vIE5TVVJMUmVxdWVzdFVzZVByb3RvY29sQ2FjaGVQb2xpY3kgaXMgdGhlIGRlZmF1bHQgcG9saWN5LCBsZXQncyBqdXN0IGFsd2F5cyBzZXQgaXQgdG8gYXZvaWQgY29uZnVzaW9uLlxuICAgIHB1c2goXG4gICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlUG9saWN5Ok5TVVJMUmVxdWVzdFVzZVByb3RvY29sQ2FjaGVQb2xpY3knLFxuICAgICk7XG4gICAgcHVzaChcbiAgICAgIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SW50ZXJ2YWw6JHtvcHRzLnRpbWVvdXQudG9GaXhlZChcbiAgICAgICAgMSxcbiAgICAgICl9XTtgLFxuICAgICk7XG4gICAgcHVzaChgW3JlcXVlc3Qgc2V0SFRUUE1ldGhvZDpAXCIke21ldGhvZH1cIl07YCk7XG5cbiAgICBpZiAocmVxLmhhc0hlYWRlcnMpIHtcbiAgICAgIHB1c2goJ1tyZXF1ZXN0IHNldEFsbEhUVFBIZWFkZXJGaWVsZHM6aGVhZGVyc107Jyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcS5oYXNCb2R5KSB7XG4gICAgICBwdXNoKCdbcmVxdWVzdCBzZXRIVFRQQm9keTpwb3N0RGF0YV07Jyk7XG4gICAgfVxuXG4gICAgYmxhbmsoKTtcblxuICAgIC8vIFJldHJpZXZpbmcgdGhlIHNoYXJlZCBzZXNzaW9uIHdpbGwgYmUgbGVzcyB2ZXJib3NlIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIHB1c2goJ05TVVJMU2Vzc2lvbiAqc2Vzc2lvbiA9IFtOU1VSTFNlc3Npb24gc2hhcmVkU2Vzc2lvbl07Jyk7XG4gICAgcHVzaCgnTlNVUkxTZXNzaW9uRGF0YVRhc2sgKmRhdGFUYXNrID0gW3Nlc3Npb24gZGF0YVRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0Jyk7XG4gICAgcHVzaChcbiAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyOl4oTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpIHsnLFxuICAgICk7XG4gICAgcHVzaCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsnLCAxKTtcbiAgICBwdXNoKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTG9nKEBcIiVAXCIsIGVycm9yKTsnLCAyKTtcbiAgICBwdXNoKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7JywgMSk7XG5cbiAgICAvLyBDYXN0aW5nIHRoZSBOU1VSTFJlc3BvbnNlIHRvIE5TSFRUUFVSTFJlc3BvbnNlIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIHN0YXR1cyAgICAgLlxuICAgIHB1c2goXG4gICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0hUVFBVUkxSZXNwb25zZSAqaHR0cFJlc3BvbnNlID0gKE5TSFRUUFVSTFJlc3BvbnNlICopIHJlc3BvbnNlOycsXG4gICAgICAyLFxuICAgICk7XG4gICAgcHVzaCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0xvZyhAXCIlQFwiLCBodHRwUmVzcG9uc2UpOycsIDIpO1xuICAgIHB1c2goJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfScsIDEpO1xuICAgIHB1c2goJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07Jyk7XG4gICAgcHVzaCgnW2RhdGFUYXNrIHJlc3VtZV07Jyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbnN1cmxzZXNzaW9uIH0gZnJvbSAnLi9uc3VybHNlc3Npb24vY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IG9iamM6IFRhcmdldCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ29iamMnLFxuICAgIHRpdGxlOiAnT2JqZWN0aXZlLUMnLFxuICAgIGV4dG5hbWU6ICcubScsXG4gICAgZGVmYXVsdDogJ25zdXJsc2Vzc2lvbicsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgbnN1cmxzZXNzaW9uLFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIE9DYW1sIHVzaW5nIENvSFRUUC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAU0dyb25kaW5cbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IGNvaHR0cDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnY29odHRwJyxcbiAgICB0aXRsZTogJ0NvSFRUUCcsXG4gICAgbGluazogJ2h0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2Uvb2NhbWwtY29odHRwJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvaHR0cCBpcyBhIHZlcnkgbGlnaHR3ZWlnaHQgSFRUUCBzZXJ2ZXIgdXNpbmcgTHd0IG9yIEFzeW5jIGZvciBPQ2FtbCcsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IGZ1bGxVcmwsIGFsbEhlYWRlcnMsIHBvc3REYXRhLCBtZXRob2QgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCBtZXRob2RzID0gWydnZXQnLCAncG9zdCcsICdoZWFkJywgJ2RlbGV0ZScsICdwYXRjaCcsICdwdXQnLCAnb3B0aW9ucyddO1xuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICBwdXNoKCdvcGVuIENvaHR0cF9sd3RfdW5peCcpO1xuICAgIHB1c2goJ29wZW4gQ29odHRwJyk7XG4gICAgcHVzaCgnb3BlbiBMd3QnKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goYGxldCB1cmkgPSBVcmkub2Zfc3RyaW5nIFwiJHtmdWxsVXJsfVwiIGluYCk7XG5cbiAgICAvLyBBZGQgaGVhZGVycywgaW5jbHVkaW5nIHRoZSBjb29raWVzXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpO1xuXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBwdXNoKFxuICAgICAgICBgbGV0IGhlYWRlcnMgPSBIZWFkZXIuYWRkIChIZWFkZXIuaW5pdCAoKSkgXCIke2hlYWRlcnNbMF19XCIgXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhcbiAgICAgICAgICBhbGxIZWFkZXJzW2hlYWRlcnNbMF1dLFxuICAgICAgICApfVwiIGluYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHB1c2goJ2xldCBoZWFkZXJzID0gSGVhZGVyLmFkZF9saXN0IChIZWFkZXIuaW5pdCAoKSkgWycpO1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHB1c2goYChcIiR7a2V5fVwiLCBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9XCIpO2AsIDEpO1xuICAgICAgfSk7XG4gICAgICBwdXNoKCddIGluJyk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJvZHlcbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgLy8gSnVzdCB0ZXh0XG4gICAgICBwdXNoKGBsZXQgYm9keSA9IENvaHR0cF9sd3RfYm9keS5vZl9zdHJpbmcgJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX0gaW5gKTtcbiAgICB9XG5cbiAgICAvLyBEbyB0aGUgcmVxdWVzdFxuICAgIGJsYW5rKCk7XG5cbiAgICBjb25zdCBoID0gaGVhZGVycy5sZW5ndGggPyAnfmhlYWRlcnMgJyA6ICcnO1xuICAgIGNvbnN0IGIgPSBwb3N0RGF0YS50ZXh0ID8gJ35ib2R5ICcgOiAnJztcbiAgICBjb25zdCBtID0gbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QudG9Mb3dlckNhc2UoKSlcbiAgICAgID8gYFxcYCR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9YFxuICAgICAgOiBgKENvZGUubWV0aG9kX29mX3N0cmluZyBcIiR7bWV0aG9kfVwiKWA7XG5cbiAgICBwdXNoKGBDbGllbnQuY2FsbCAke2h9JHtifSR7bX0gdXJpYCk7XG5cbiAgICAvLyBDYXRjaCByZXN1bHRcbiAgICBwdXNoKCc+Pj0gZnVuIChyZXMsIGJvZHlfc3RyZWFtKSAtPicpO1xuICAgIHB1c2goJygqIERvIHN0dWZmIHdpdGggdGhlIHJlc3VsdCAqKScsIDEpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IGNvaHR0cCB9IGZyb20gJy4vY29odHRwL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBvY2FtbDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnb2NhbWwnLFxuICAgIHRpdGxlOiAnT0NhbWwnLFxuICAgIGV4dG5hbWU6ICcubWwnLFxuICAgIGRlZmF1bHQ6ICdjb2h0dHAnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIGNvaHR0cCxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBQSFAgdXNpbmcgY3VybC1leHQuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1cmxPcHRpb25zIHtcbiAgY2xvc2luZ1RhZz86IGJvb2xlYW47XG4gIG1heFJlZGlyZWN0cz86IG51bWJlcjtcbiAgbmFtZWRFcnJvcnM/OiBib29sZWFuO1xuICBub1RhZ3M/OiBib29sZWFuO1xuICBzaG9ydFRhZ3M/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgY3VybDogQ2xpZW50PEN1cmxPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2N1cmwnLFxuICAgIHRpdGxlOiAnY1VSTCcsXG4gICAgbGluazogJ2h0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9ib29rLmN1cmwucGhwJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BIUCB3aXRoIGV4dC1jdXJsJyxcbiAgfSxcbiAgY29udmVydDogKFxuICAgIHsgdXJpT2JqLCBwb3N0RGF0YSwgZnVsbFVybCwgbWV0aG9kLCBodHRwVmVyc2lvbiwgY29va2llcywgaGVhZGVyc09iaiB9LFxuICAgIG9wdGlvbnMgPSB7fSxcbiAgKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY2xvc2luZ1RhZyA9IGZhbHNlLFxuICAgICAgaW5kZW50ID0gJyAgJyxcbiAgICAgIG1heFJlZGlyZWN0cyA9IDEwLFxuICAgICAgbmFtZWRFcnJvcnMgPSBmYWxzZSxcbiAgICAgIG5vVGFncyA9IGZhbHNlLFxuICAgICAgc2hvcnRUYWdzID0gZmFsc2UsXG4gICAgICB0aW1lb3V0ID0gMzAsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQgfSk7XG5cbiAgICBpZiAoIW5vVGFncykge1xuICAgICAgcHVzaChzaG9ydFRhZ3MgPyAnPD8nIDogJzw/cGhwJyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHB1c2goJyRjdXJsID0gY3VybF9pbml0KCk7Jyk7XG4gICAgYmxhbmsoKTtcblxuICAgIGNvbnN0IGN1cmxPcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlc2NhcGU6IHRydWUsXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX1BPUlQnLFxuICAgICAgICB2YWx1ZTogdXJpT2JqLnBvcnQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlc2NhcGU6IHRydWUsXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX1VSTCcsXG4gICAgICAgIHZhbHVlOiBmdWxsVXJsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXNjYXBlOiBmYWxzZSxcbiAgICAgICAgbmFtZTogJ0NVUkxPUFRfUkVUVVJOVFJBTlNGRVInLFxuICAgICAgICB2YWx1ZTogJ3RydWUnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXNjYXBlOiB0cnVlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9FTkNPRElORycsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVzY2FwZTogZmFsc2UsXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX01BWFJFRElSUycsXG4gICAgICAgIHZhbHVlOiBtYXhSZWRpcmVjdHMsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlc2NhcGU6IGZhbHNlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9USU1FT1VUJyxcbiAgICAgICAgdmFsdWU6IHRpbWVvdXQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlc2NhcGU6IGZhbHNlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9IVFRQX1ZFUlNJT04nLFxuICAgICAgICB2YWx1ZTogaHR0cFZlcnNpb24gPT09ICdIVFRQLzEuMCcgPyAnQ1VSTF9IVFRQX1ZFUlNJT05fMV8wJyA6ICdDVVJMX0hUVFBfVkVSU0lPTl8xXzEnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXNjYXBlOiB0cnVlLFxuICAgICAgICBuYW1lOiAnQ1VSTE9QVF9DVVNUT01SRVFVRVNUJyxcbiAgICAgICAgdmFsdWU6IG1ldGhvZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVzY2FwZTogIXBvc3REYXRhLmpzb25PYmosXG4gICAgICAgIG5hbWU6ICdDVVJMT1BUX1BPU1RGSUVMRFMnLFxuICAgICAgICB2YWx1ZTogcG9zdERhdGFcbiAgICAgICAgICA/IHBvc3REYXRhLmpzb25PYmpcbiAgICAgICAgICAgID8gYGpzb25fZW5jb2RlKCR7Y29udmVydFR5cGUocG9zdERhdGEuanNvbk9iaiwgaW5kZW50LnJlcGVhdCgyKSwgaW5kZW50KX0pYFxuICAgICAgICAgICAgOiBwb3N0RGF0YS50ZXh0XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBwdXNoKCdjdXJsX3NldG9wdF9hcnJheSgkY3VybCwgWycpO1xuXG4gICAgY29uc3QgY3VybG9wdHMgPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQsIGpvaW46IGBcXG4ke2luZGVudH1gIH0pO1xuXG4gICAgY3VybE9wdGlvbnMuZm9yRWFjaCgoeyB2YWx1ZSwgbmFtZSwgZXNjYXBlIH0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGN1cmxvcHRzLnB1c2goYCR7bmFtZX0gPT4gJHtlc2NhcGUgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiB2YWx1ZX0sYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBjb25zdHJ1Y3QgY29va2llc1xuICAgIGNvbnN0IGN1cmxDb29raWVzID0gY29va2llcy5tYXAoXG4gICAgICBjb29raWUgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5uYW1lKX09JHtlbmNvZGVVUklDb21wb25lbnQoY29va2llLnZhbHVlKX1gLFxuICAgICk7XG4gICAgaWYgKGN1cmxDb29raWVzLmxlbmd0aCkge1xuICAgICAgY3VybG9wdHMucHVzaChgQ1VSTE9QVF9DT09LSUUgPT4gXCIke2N1cmxDb29raWVzLmpvaW4oJzsgJyl9XCIsYCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGNvb2tpZXNcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoaGVhZGVyc09iailcbiAgICAgIC5zb3J0KClcbiAgICAgIC5tYXAoa2V5ID0+IGBcIiR7a2V5fTogJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoaGVhZGVyc09ialtrZXldKX1cImApO1xuXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICBjdXJsb3B0cy5wdXNoKCdDVVJMT1BUX0hUVFBIRUFERVIgPT4gWycpO1xuICAgICAgY3VybG9wdHMucHVzaChoZWFkZXJzLmpvaW4oYCxcXG4ke2luZGVudH0ke2luZGVudH1gKSwgMSk7XG4gICAgICBjdXJsb3B0cy5wdXNoKCddLCcpO1xuICAgIH1cblxuICAgIHB1c2goY3VybG9wdHMuam9pbigpLCAxKTtcbiAgICBwdXNoKCddKTsnKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJyRyZXNwb25zZSA9IGN1cmxfZXhlYygkY3VybCk7Jyk7XG4gICAgcHVzaCgnJGVyciA9IGN1cmxfZXJyb3IoJGN1cmwpOycpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnY3VybF9jbG9zZSgkY3VybCk7Jyk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdpZiAoJGVycikgeycpO1xuXG4gICAgaWYgKG5hbWVkRXJyb3JzKSB7XG4gICAgICBwdXNoKCdlY2hvIGFycmF5X2ZsaXAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpW1wiY3VybFwiXSlbJGVycl07JywgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2goJ2VjaG8gXCJjVVJMIEVycm9yICM6XCIgLiAkZXJyOycsIDEpO1xuICAgIH1cblxuICAgIHB1c2goJ30gZWxzZSB7Jyk7XG4gICAgcHVzaCgnZWNobyAkcmVzcG9uc2U7JywgMSk7XG4gICAgcHVzaCgnfScpO1xuXG4gICAgaWYgKCFub1RhZ3MgJiYgY2xvc2luZ1RhZykge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJz8+Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBQSFAgdXNpbmcgR3V6emxlLlxuICpcbiAqIEBhdXRob3IgQFJvYmVydG9BcnJ1ZGFcbiAqIEBhdXRob3IgQGVydW5pb25cbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JTaW5nbGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBnZXRIZWFkZXIsIGdldEhlYWRlck5hbWUsIGhhc0hlYWRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGNvbnZlcnRUeXBlIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3V6emxlT3B0aW9ucyB7XG4gIGNsb3NpbmdUYWc/OiBib29sZWFuO1xuICBpbmRlbnQ/OiBzdHJpbmc7XG4gIG5vVGFncz86IGJvb2xlYW47XG4gIHNob3J0VGFncz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBndXp6bGU6IENsaWVudDxHdXp6bGVPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2d1enpsZScsXG4gICAgdGl0bGU6ICdHdXp6bGUnLFxuICAgIGxpbms6ICdodHRwOi8vZG9jcy5ndXp6bGVwaHAub3JnL2VuL3N0YWJsZS8nLFxuICAgIGRlc2NyaXB0aW9uOiAnUEhQIHdpdGggR3V6emxlJyxcbiAgfSxcbiAgY29udmVydDogKHsgcG9zdERhdGEsIGZ1bGxVcmwsIG1ldGhvZCwgY29va2llcywgaGVhZGVyc09iaiB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGNsb3NpbmdUYWc6IGZhbHNlLFxuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgbm9UYWdzOiBmYWxzZSxcbiAgICAgIHNob3J0VGFnczogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoeyBpbmRlbnQ6IG9wdHMuaW5kZW50IH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvZGU6IHJlcXVlc3RDb2RlLFxuICAgICAgcHVzaDogcmVxdWVzdFB1c2gsXG4gICAgICBqb2luOiByZXF1ZXN0Sm9pbixcbiAgICB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50OiBvcHRzLmluZGVudCB9KTtcblxuICAgIGlmICghb3B0cy5ub1RhZ3MpIHtcbiAgICAgIHB1c2gob3B0cy5zaG9ydFRhZ3MgPyAnPD8nIDogJzw/cGhwJyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgICAgIHJlcXVlc3RQdXNoKFxuICAgICAgICAgIGAnZm9ybV9wYXJhbXMnID0+ICR7Y29udmVydFR5cGUoXG4gICAgICAgICAgICBwb3N0RGF0YS5wYXJhbXNPYmosXG4gICAgICAgICAgICBvcHRzLmluZGVudCArIG9wdHMuaW5kZW50LFxuICAgICAgICAgICAgb3B0cy5pbmRlbnQsXG4gICAgICAgICAgKX0sYCxcbiAgICAgICAgICAxLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6IHtcbiAgICAgICAgdHlwZSBNdWx0aXBhcnRGaWVsZCA9IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgY29udGVudHM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaWVsZHM6IE11bHRpcGFydEZpZWxkW10gPSBbXTtcblxuICAgICAgICBpZiAocG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICBpZiAocGFyYW0uZmlsZU5hbWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZmllbGQ6IE11bHRpcGFydEZpZWxkID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcmFtLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBwYXJhbS52YWx1ZSxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAocGFyYW0uY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5oZWFkZXJzID0geyAnQ29udGVudC1UeXBlJzogcGFyYW0uY29udGVudFR5cGUgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudHM6IHBhcmFtLnZhbHVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgcmVxdWVzdFB1c2goXG4gICAgICAgICAgICBgJ211bHRpcGFydCcgPT4gJHtjb252ZXJ0VHlwZShmaWVsZHMsIG9wdHMuaW5kZW50ICsgb3B0cy5pbmRlbnQsIG9wdHMuaW5kZW50KX1gLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gR3V6emxlIGFkZHMgaXRzIG93biBib3VuZGFyeSBmb3IgbXVsdGlwYXJ0IHJlcXVlc3RzLlxuICAgICAgICAgIGlmIChoYXNIZWFkZXIoaGVhZGVyc09iaiwgJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgICAgICBpZiAoZ2V0SGVhZGVyKGhlYWRlcnNPYmosICdjb250ZW50LXR5cGUnKT8uaW5kZXhPZignYm91bmRhcnknKSkge1xuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gZ2V0SGVhZGVyTmFtZShoZWFkZXJzT2JqLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNPYmpbaGVhZGVyTmFtZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcmVxdWVzdFB1c2goYCdib2R5JyA9PiAke2NvbnZlcnRUeXBlKHBvc3REYXRhLnRleHQpfSxgLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBoZWFkZXJzXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGhlYWRlcnNPYmopXG4gICAgICAuc29ydCgpXG4gICAgICAubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgIG9wdHMuaW5kZW50XG4gICAgICAgIH0ke29wdHMuaW5kZW50fScke2tleX0nID0+ICcke2VzY2FwZUZvclNpbmdsZVF1b3RlcyhoZWFkZXJzT2JqW2tleV0pfScsYDtcbiAgICAgIH0pO1xuXG4gICAgLy8gY29uc3RydWN0IGNvb2tpZXNcbiAgICBjb25zdCBjb29raWVTdHJpbmcgPSBjb29raWVzXG4gICAgICAubWFwKGNvb2tpZSA9PiBgJHtlbmNvZGVVUklDb21wb25lbnQoY29va2llLm5hbWUpfT0ke2VuY29kZVVSSUNvbXBvbmVudChjb29raWUudmFsdWUpfWApXG4gICAgICAuam9pbignOyAnKTtcbiAgICBpZiAoY29va2llU3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGVhZGVycy5wdXNoKFxuICAgICAgICBgJHtvcHRzLmluZGVudH0ke29wdHMuaW5kZW50fSdjb29raWUnID0+ICcke2VzY2FwZUZvclNpbmdsZVF1b3Rlcyhjb29raWVTdHJpbmcpfScsYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICByZXF1ZXN0UHVzaChcIidoZWFkZXJzJyA9PiBbXCIsIDEpO1xuICAgICAgcmVxdWVzdFB1c2goaGVhZGVycy5qb2luKCdcXG4nKSk7XG4gICAgICByZXF1ZXN0UHVzaCgnXSwnLCAxKTtcbiAgICB9XG5cbiAgICBwdXNoKCckY2xpZW50ID0gbmV3IFxcXFxHdXp6bGVIdHRwXFxcXENsaWVudCgpOycpO1xuICAgIGJsYW5rKCk7XG5cbiAgICBpZiAocmVxdWVzdENvZGUubGVuZ3RoKSB7XG4gICAgICBwdXNoKGAkcmVzcG9uc2UgPSAkY2xpZW50LT5yZXF1ZXN0KCcke21ldGhvZH0nLCAnJHtmdWxsVXJsfScsIFtgKTtcbiAgICAgIHB1c2gocmVxdWVzdEpvaW4oKSk7XG4gICAgICBwdXNoKCddKTsnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChgJHJlc3BvbnNlID0gJGNsaWVudC0+cmVxdWVzdCgnJHttZXRob2R9JywgJyR7ZnVsbFVybH0nKTtgKTtcbiAgICB9XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goJ2VjaG8gJHJlc3BvbnNlLT5nZXRCb2R5KCk7Jyk7XG5cbiAgICBpZiAoIW9wdHMubm9UYWdzICYmIG9wdHMuY2xvc2luZ1RhZykge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJz8+Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBlc2NhcGVTdHJpbmcgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0VHlwZSA9IChvYmo6IGFueVtdIHwgYW55LCBpbmRlbnQ/OiBzdHJpbmcsIGxhc3RJbmRlbnQ/OiBzdHJpbmcpID0+IHtcbiAgbGFzdEluZGVudCA9IGxhc3RJbmRlbnQgfHwgJyc7XG4gIGluZGVudCA9IGluZGVudCB8fCAnJztcblxuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgY2FzZSAnW29iamVjdCBOdWxsXSc6XG4gICAgICByZXR1cm4gJ251bGwnO1xuXG4gICAgY2FzZSAnW29iamVjdCBVbmRlZmluZWRdJzpcbiAgICAgIHJldHVybiAnbnVsbCc7XG5cbiAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgcmV0dXJuIGAnJHtlc2NhcGVTdHJpbmcob2JqLCB7IGRlbGltaXRlcjogXCInXCIsIGVzY2FwZU5ld2xpbmVzOiBmYWxzZSB9KX0nYDtcblxuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG5cbiAgICBjYXNlICdbb2JqZWN0IEFycmF5XSc6IHtcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gb2JqXG4gICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gY29udmVydFR5cGUoaXRlbSwgYCR7aW5kZW50fSR7aW5kZW50fWAsIGluZGVudCkpXG4gICAgICAgIC5qb2luKGAsXFxuJHtpbmRlbnR9YCk7XG4gICAgICByZXR1cm4gYFtcXG4ke2luZGVudH0ke2NvbnRlbnRzfVxcbiR7bGFzdEluZGVudH1dYDtcbiAgICB9XG5cbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOiB7XG4gICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgYCR7Y29udmVydFR5cGUoaSwgaW5kZW50KX0gPT4gJHtjb252ZXJ0VHlwZShvYmpbaV0sIGAke2luZGVudH0ke2luZGVudH1gLCBpbmRlbnQpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGBbXFxuJHtpbmRlbnR9JHtyZXN1bHQuam9pbihgLFxcbiR7aW5kZW50fWApfVxcbiR7bGFzdEluZGVudH1dYDtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdudWxsJztcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRlZE1ldGhvZHMgPSBbXG4gICdBQ0wnLFxuICAnQkFTRUxJTkVfQ09OVFJPTCcsXG4gICdDSEVDS0lOJyxcbiAgJ0NIRUNLT1VUJyxcbiAgJ0NPTk5FQ1QnLFxuICAnQ09QWScsXG4gICdERUxFVEUnLFxuICAnR0VUJyxcbiAgJ0hFQUQnLFxuICAnTEFCRUwnLFxuICAnTE9DSycsXG4gICdNRVJHRScsXG4gICdNS0FDVElWSVRZJyxcbiAgJ01LQ09MJyxcbiAgJ01LV09SS1NQQUNFJyxcbiAgJ01PVkUnLFxuICAnT1BUSU9OUycsXG4gICdQT1NUJyxcbiAgJ1BST1BGSU5EJyxcbiAgJ1BST1BQQVRDSCcsXG4gICdQVVQnLFxuICAnUkVQT1JUJyxcbiAgJ1RSQUNFJyxcbiAgJ1VOQ0hFQ0tPVVQnLFxuICAnVU5MT0NLJyxcbiAgJ1VQREFURScsXG4gICdWRVJTSU9OX0NPTlRST0wnLFxuXTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIFBIUCB1c2luZyBjdXJsLWV4dC5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAQWhtYWROYXNzcmlcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGNvbnZlcnRUeXBlLCBzdXBwb3J0ZWRNZXRob2RzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cDFPcHRpb25zIHtcbiAgY2xvc2luZ1RhZz86IGJvb2xlYW47XG4gIG5vVGFncz86IGJvb2xlYW47XG4gIHNob3J0VGFncz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBodHRwMTogQ2xpZW50PEh0dHAxT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdodHRwMScsXG4gICAgdGl0bGU6ICdIVFRQIHYxJyxcbiAgICBsaW5rOiAnaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Jvb2suaHR0cC5waHAnLFxuICAgIGRlc2NyaXB0aW9uOiAnUEhQIHdpdGggcGVjbC9odHRwIHYxJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCB1cmwsIHBvc3REYXRhLCBxdWVyeU9iaiwgaGVhZGVyc09iaiwgY29va2llc09iaiB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNsb3NpbmdUYWcgPSBmYWxzZSwgaW5kZW50ID0gJyAgJywgbm9UYWdzID0gZmFsc2UsIHNob3J0VGFncyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50IH0pO1xuXG4gICAgaWYgKCFub1RhZ3MpIHtcbiAgICAgIHB1c2goc2hvcnRUYWdzID8gJzw/JyA6ICc8P3BocCcpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoIXN1cHBvcnRlZE1ldGhvZHMuaW5jbHVkZXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICBwdXNoKGBIdHRwUmVxdWVzdDo6bWV0aG9kUmVnaXN0ZXIoJyR7bWV0aG9kfScpO2ApO1xuICAgIH1cblxuICAgIHB1c2goJyRyZXF1ZXN0ID0gbmV3IEh0dHBSZXF1ZXN0KCk7Jyk7XG4gICAgcHVzaChgJHJlcXVlc3QtPnNldFVybCgke2NvbnZlcnRUeXBlKHVybCl9KTtgKTtcblxuICAgIGlmIChzdXBwb3J0ZWRNZXRob2RzLmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgcHVzaChgJHJlcXVlc3QtPnNldE1ldGhvZChIVFRQX01FVEhfJHttZXRob2QudG9VcHBlckNhc2UoKX0pO2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKGAkcmVxdWVzdC0+c2V0TWV0aG9kKEh0dHBSZXF1ZXN0OjpIVFRQX01FVEhfJHttZXRob2QudG9VcHBlckNhc2UoKX0pO2ApO1xuICAgIH1cblxuICAgIGJsYW5rKCk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcHVzaChgJHJlcXVlc3QtPnNldFF1ZXJ5RGF0YSgke2NvbnZlcnRUeXBlKHF1ZXJ5T2JqLCBpbmRlbnQpfSk7YCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRIZWFkZXJzKCR7Y29udmVydFR5cGUoaGVhZGVyc09iaiwgaW5kZW50KX0pO2ApO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY29va2llc09iaikubGVuZ3RoKSB7XG4gICAgICBwdXNoKGAkcmVxdWVzdC0+c2V0Q29va2llcygke2NvbnZlcnRUeXBlKGNvb2tpZXNPYmosIGluZGVudCl9KTtgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgcHVzaChgJHJlcXVlc3QtPnNldENvbnRlbnRUeXBlKCR7Y29udmVydFR5cGUocG9zdERhdGEubWltZVR5cGUpfSk7YCk7XG4gICAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRQb3N0RmllbGRzKCR7Y29udmVydFR5cGUocG9zdERhdGEucGFyYW1zT2JqLCBpbmRlbnQpfSk7YCk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgcHVzaChgJHJlcXVlc3QtPnNldENvbnRlbnRUeXBlKCR7Y29udmVydFR5cGUocG9zdERhdGEubWltZVR5cGUpfSk7YCk7XG4gICAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRCb2R5KGpzb25fZW5jb2RlKCR7Y29udmVydFR5cGUocG9zdERhdGEuanNvbk9iaiwgaW5kZW50KX0pKTtgKTtcbiAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICAgICAgcHVzaChgJHJlcXVlc3QtPnNldEJvZHkoJHtjb252ZXJ0VHlwZShwb3N0RGF0YS50ZXh0KX0pO2ApO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKCd0cnkgeycpO1xuICAgIHB1c2goJyRyZXNwb25zZSA9ICRyZXF1ZXN0LT5zZW5kKCk7JywgMSk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdlY2hvICRyZXNwb25zZS0+Z2V0Qm9keSgpOycsIDEpO1xuICAgIHB1c2goJ30gY2F0Y2ggKEh0dHBFeGNlcHRpb24gJGV4KSB7Jyk7XG4gICAgcHVzaCgnZWNobyAkZXg7JywgMSk7XG4gICAgcHVzaCgnfScpO1xuXG4gICAgaWYgKCFub1RhZ3MgJiYgY2xvc2luZ1RhZykge1xuICAgICAgYmxhbmsoKTtcbiAgICAgIHB1c2goJz8+Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBQSFAgdXNpbmcgY3VybC1leHQuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGVyLCBnZXRIZWFkZXJOYW1lLCBoYXNIZWFkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHAyT3B0aW9ucyB7XG4gIGNsb3NpbmdUYWc/OiBib29sZWFuO1xuICBub1RhZ3M/OiBib29sZWFuO1xuICBzaG9ydFRhZ3M/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgaHR0cDI6IENsaWVudDxIdHRwMk9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnaHR0cDInLFxuICAgIHRpdGxlOiAnSFRUUCB2MicsXG4gICAgbGluazogJ2h0dHA6Ly9kZXZlbC1tNnc2LnJoY2xvdWQuY29tL21kcmVmL2h0dHAnLFxuICAgIGRlc2NyaXB0aW9uOiAnUEhQIHdpdGggcGVjbC9odHRwIHYyJyxcbiAgfSxcbiAgY29udmVydDogKHsgcG9zdERhdGEsIGhlYWRlcnNPYmosIG1ldGhvZCwgcXVlcnlPYmosIGNvb2tpZXNPYmosIHVybCB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNsb3NpbmdUYWcgPSBmYWxzZSwgaW5kZW50ID0gJyAgJywgbm9UYWdzID0gZmFsc2UsIHNob3J0VGFncyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHsgaW5kZW50IH0pO1xuICAgIGxldCBoYXNCb2R5ID0gZmFsc2U7XG5cbiAgICBpZiAoIW5vVGFncykge1xuICAgICAgcHVzaChzaG9ydFRhZ3MgPyAnPD8nIDogJzw/cGhwJyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIHB1c2goJyRjbGllbnQgPSBuZXcgaHR0cFxcXFxDbGllbnQ7Jyk7XG4gICAgcHVzaCgnJHJlcXVlc3QgPSBuZXcgaHR0cFxcXFxDbGllbnRcXFxcUmVxdWVzdDsnKTtcbiAgICBibGFuaygpO1xuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgcHVzaCgnJGJvZHkgPSBuZXcgaHR0cFxcXFxNZXNzYWdlXFxcXEJvZHk7Jyk7XG4gICAgICAgIHB1c2goYCRib2R5LT5hcHBlbmQobmV3IGh0dHBcXFxcUXVlcnlTdHJpbmcoJHtjb252ZXJ0VHlwZShwb3N0RGF0YS5wYXJhbXNPYmosIGluZGVudCl9KSk7YCk7XG4gICAgICAgIGJsYW5rKCk7XG4gICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6IHtcbiAgICAgICAgaWYgKCFwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmaWxlOiBzdHJpbmc7XG4gICAgICAgICAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIFthbnl0aGluZzogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKCh7IG5hbWUsIGZpbGVOYW1lLCB2YWx1ZSwgY29udGVudFR5cGUgfSkgPT4ge1xuICAgICAgICAgIGlmIChmaWxlTmFtZSkge1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHR5cGU6IGNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICBmaWxlOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBmaWVsZHNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZpZWxkID0gT2JqZWN0LmtleXMoZmllbGRzKS5sZW5ndGggPyBjb252ZXJ0VHlwZShmaWVsZHMsIGluZGVudCkgOiAnbnVsbCc7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZpbGVzLmxlbmd0aCA/IGNvbnZlcnRUeXBlKGZpbGVzLCBpbmRlbnQpIDogJ251bGwnO1xuXG4gICAgICAgIHB1c2goJyRib2R5ID0gbmV3IGh0dHBcXFxcTWVzc2FnZVxcXFxCb2R5OycpO1xuICAgICAgICBwdXNoKGAkYm9keS0+YWRkRm9ybSgke2ZpZWxkfSwgJHtmb3JtVmFsdWV9KTtgKTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGNvbnRlbnRUeXBlIGhlYWRlclxuICAgICAgICBpZiAoaGFzSGVhZGVyKGhlYWRlcnNPYmosICdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICAgIGlmIChnZXRIZWFkZXIoaGVhZGVyc09iaiwgJ2NvbnRlbnQtdHlwZScpPy5pbmRleE9mKCdib3VuZGFyeScpKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gZ2V0SGVhZGVyTmFtZShoZWFkZXJzT2JqLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc09ialtoZWFkZXJOYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBibGFuaygpO1xuXG4gICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBwdXNoKCckYm9keSA9IG5ldyBodHRwXFxcXE1lc3NhZ2VcXFxcQm9keTsnKTtcbiAgICAgICAgcHVzaChgJGJvZHktPmFwcGVuZChqc29uX2VuY29kZSgke2NvbnZlcnRUeXBlKHBvc3REYXRhLmpzb25PYmosIGluZGVudCl9KSk7YCk7XG4gICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgICBwdXNoKCckYm9keSA9IG5ldyBodHRwXFxcXE1lc3NhZ2VcXFxcQm9keTsnKTtcbiAgICAgICAgICBwdXNoKGAkYm9keS0+YXBwZW5kKCR7Y29udmVydFR5cGUocG9zdERhdGEudGV4dCl9KTtgKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChgJHJlcXVlc3QtPnNldFJlcXVlc3RVcmwoJHtjb252ZXJ0VHlwZSh1cmwpfSk7YCk7XG4gICAgcHVzaChgJHJlcXVlc3QtPnNldFJlcXVlc3RNZXRob2QoJHtjb252ZXJ0VHlwZShtZXRob2QpfSk7YCk7XG5cbiAgICBpZiAoaGFzQm9keSkge1xuICAgICAgcHVzaCgnJHJlcXVlc3QtPnNldEJvZHkoJGJvZHkpOycpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcHVzaChgJHJlcXVlc3QtPnNldFF1ZXJ5KG5ldyBodHRwXFxcXFF1ZXJ5U3RyaW5nKCR7Y29udmVydFR5cGUocXVlcnlPYmosIGluZGVudCl9KSk7YCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICAgIHB1c2goYCRyZXF1ZXN0LT5zZXRIZWFkZXJzKCR7Y29udmVydFR5cGUoaGVhZGVyc09iaiwgaW5kZW50KX0pO2ApO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY29va2llc09iaikubGVuZ3RoKSB7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaChgJGNsaWVudC0+c2V0Q29va2llcygke2NvbnZlcnRUeXBlKGNvb2tpZXNPYmosIGluZGVudCl9KTtgKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgcHVzaCgnJGNsaWVudC0+ZW5xdWV1ZSgkcmVxdWVzdCktPnNlbmQoKTsnKTtcbiAgICBwdXNoKCckcmVzcG9uc2UgPSAkY2xpZW50LT5nZXRSZXNwb25zZSgpOycpO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnZWNobyAkcmVzcG9uc2UtPmdldEJvZHkoKTsnKTtcblxuICAgIGlmICghbm9UYWdzICYmIGNsb3NpbmdUYWcpIHtcbiAgICAgIGJsYW5rKCk7XG4gICAgICBwdXNoKCc/PicpO1xuICAgIH1cblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBjdXJsIH0gZnJvbSAnLi9jdXJsL2NsaWVudCc7XG5pbXBvcnQgeyBndXp6bGUgfSBmcm9tICcuL2d1enpsZS9jbGllbnQnO1xuaW1wb3J0IHsgaHR0cDEgfSBmcm9tICcuL2h0dHAxL2NsaWVudCc7XG5pbXBvcnQgeyBodHRwMiB9IGZyb20gJy4vaHR0cDIvY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IHBocDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncGhwJyxcbiAgICB0aXRsZTogJ1BIUCcsXG4gICAgZXh0bmFtZTogJy5waHAnLFxuICAgIGRlZmF1bHQ6ICdjdXJsJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBjdXJsLFxuICAgIGd1enpsZSxcbiAgICBodHRwMSxcbiAgICBodHRwMixcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZVN0cmluZyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IGdldEhlYWRlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBDb252ZXJ0ZXIgfSBmcm9tICcuLi90YXJnZXRzJztcblxuZXhwb3J0IHR5cGUgUG93ZXJzaGVsbENvbW1hbmQgPSAnSW52b2tlLVJlc3RNZXRob2QnIHwgJ0ludm9rZS1XZWJSZXF1ZXN0JztcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUG93ZXJzaGVsbENvbnZlcnQgPSAoY29tbWFuZDogUG93ZXJzaGVsbENvbW1hbmQpID0+IHtcbiAgY29uc3QgY29udmVydDogQ29udmVydGVyPGFueT4gPSAoe1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzT2JqLFxuICAgIGNvb2tpZXMsXG4gICAgdXJpT2JqLFxuICAgIGZ1bGxVcmwsXG4gICAgcG9zdERhdGEsXG4gICAgYWxsSGVhZGVycyxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHsgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKCk7XG4gICAgY29uc3QgbWV0aG9kcyA9IFtcbiAgICAgICdERUZBVUxUJyxcbiAgICAgICdERUxFVEUnLFxuICAgICAgJ0dFVCcsXG4gICAgICAnSEVBRCcsXG4gICAgICAnTUVSR0UnLFxuICAgICAgJ09QVElPTlMnLFxuICAgICAgJ1BBVENIJyxcbiAgICAgICdQT1NUJyxcbiAgICAgICdQVVQnLFxuICAgICAgJ1RSQUNFJyxcbiAgICBdO1xuICAgIGNvbnN0IG1ldGhvZEFyZyA9IG1ldGhvZHMuaW5jbHVkZXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpID8gJy1NZXRob2QnIDogJy1DdXN0b21NZXRob2QnO1xuXG4gICAgY29uc3QgY29tbWFuZE9wdGlvbnMgPSBbXTtcblxuICAgIC8vIEFkZCBoZWFkZXJzLCBpbmNsdWRpbmcgdGhlIGNvb2tpZXNcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoaGVhZGVyc09iaik7XG5cbiAgICAvLyBjb25zdHJ1Y3QgaGVhZGVyc1xuICAgIGlmIChoZWFkZXJzLmxlbmd0aCkge1xuICAgICAgcHVzaCgnJGhlYWRlcnM9QHt9Jyk7XG4gICAgICBoZWFkZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ2Nvbm5lY3Rpb24nKSB7XG4gICAgICAgICAgLy8gTm90IGFsbG93ZWRcbiAgICAgICAgICBwdXNoKGAkaGVhZGVycy5BZGQoXCIke2tleX1cIiwgXCIke2VzY2FwZVN0cmluZyhoZWFkZXJzT2JqW2tleV0sIHsgZXNjYXBlQ2hhcjogJ2AnIH0pfVwiKWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbW1hbmRPcHRpb25zLnB1c2goJy1IZWFkZXJzICRoZWFkZXJzJyk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGNvb2tpZXNcbiAgICBpZiAoY29va2llcy5sZW5ndGgpIHtcbiAgICAgIHB1c2goJyRzZXNzaW9uID0gTmV3LU9iamVjdCBNaWNyb3NvZnQuUG93ZXJTaGVsbC5Db21tYW5kcy5XZWJSZXF1ZXN0U2Vzc2lvbicpO1xuXG4gICAgICBjb29raWVzLmZvckVhY2goY29va2llID0+IHtcbiAgICAgICAgcHVzaCgnJGNvb2tpZSA9IE5ldy1PYmplY3QgU3lzdGVtLk5ldC5Db29raWUnKTtcblxuICAgICAgICBwdXNoKGAkY29va2llLk5hbWUgPSAnJHtjb29raWUubmFtZX0nYCk7XG4gICAgICAgIHB1c2goYCRjb29raWUuVmFsdWUgPSAnJHtjb29raWUudmFsdWV9J2ApO1xuICAgICAgICBwdXNoKGAkY29va2llLkRvbWFpbiA9ICcke3VyaU9iai5ob3N0fSdgKTtcblxuICAgICAgICBwdXNoKCckc2Vzc2lvbi5Db29raWVzLkFkZCgkY29va2llKScpO1xuICAgICAgfSk7XG4gICAgICBjb21tYW5kT3B0aW9ucy5wdXNoKCctV2ViU2Vzc2lvbiAkc2Vzc2lvbicpO1xuICAgIH1cblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBjb21tYW5kT3B0aW9ucy5wdXNoKFxuICAgICAgICBgLUNvbnRlbnRUeXBlICcke2VzY2FwZVN0cmluZyhnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2NvbnRlbnQtdHlwZScpLCB7XG4gICAgICAgICAgZGVsaW1pdGVyOiBcIidcIixcbiAgICAgICAgICBlc2NhcGVDaGFyOiAnYCcsXG4gICAgICAgIH0pfSdgLFxuICAgICAgKTtcbiAgICAgIGNvbW1hbmRPcHRpb25zLnB1c2goYC1Cb2R5ICcke3Bvc3REYXRhLnRleHR9J2ApO1xuICAgIH1cblxuICAgIHB1c2goXG4gICAgICBgJHJlc3BvbnNlID0gJHtjb21tYW5kfSAtVXJpICcke2Z1bGxVcmx9JyAke21ldGhvZEFyZ30gJHttZXRob2R9ICR7Y29tbWFuZE9wdGlvbnMuam9pbignICcpfWAsXG4gICAgKTtcbiAgICByZXR1cm4gam9pbigpO1xuICB9O1xuICByZXR1cm4gY29udmVydDtcbn07XG4iLCJpbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGdlbmVyYXRlUG93ZXJzaGVsbENvbnZlcnQgfSBmcm9tICcuLi9jb21tb24nO1xuXG5leHBvcnQgY29uc3QgcmVzdG1ldGhvZDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncmVzdG1ldGhvZCcsXG4gICAgdGl0bGU6ICdJbnZva2UtUmVzdE1ldGhvZCcsXG4gICAgbGluazogJ2h0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Bvd2Vyc2hlbGwvbW9kdWxlL01pY3Jvc29mdC5Qb3dlclNoZWxsLlV0aWxpdHkvSW52b2tlLVJlc3RNZXRob2QnLFxuICAgIGRlc2NyaXB0aW9uOiAnUG93ZXJzaGVsbCBJbnZva2UtUmVzdE1ldGhvZCBjbGllbnQnLFxuICB9LFxuICBjb252ZXJ0OiBnZW5lcmF0ZVBvd2Vyc2hlbGxDb252ZXJ0KCdJbnZva2UtUmVzdE1ldGhvZCcpLFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgcmVzdG1ldGhvZCB9IGZyb20gJy4vcmVzdG1ldGhvZC9jbGllbnQnO1xuaW1wb3J0IHsgd2VicmVxdWVzdCB9IGZyb20gJy4vd2VicmVxdWVzdC9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgcG93ZXJzaGVsbDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncG93ZXJzaGVsbCcsXG4gICAgdGl0bGU6ICdQb3dlcnNoZWxsJyxcbiAgICBleHRuYW1lOiAnLnBzMScsXG4gICAgZGVmYXVsdDogJ3dlYnJlcXVlc3QnLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIHdlYnJlcXVlc3QsXG4gICAgcmVzdG1ldGhvZCxcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGdlbmVyYXRlUG93ZXJzaGVsbENvbnZlcnQgfSBmcm9tICcuLi9jb21tb24nO1xuXG5leHBvcnQgY29uc3Qgd2VicmVxdWVzdDogQ2xpZW50ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnd2VicmVxdWVzdCcsXG4gICAgdGl0bGU6ICdJbnZva2UtV2ViUmVxdWVzdCcsXG4gICAgbGluazogJ2h0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Bvd2Vyc2hlbGwvbW9kdWxlL01pY3Jvc29mdC5Qb3dlclNoZWxsLlV0aWxpdHkvSW52b2tlLVdlYlJlcXVlc3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnUG93ZXJzaGVsbCBJbnZva2UtV2ViUmVxdWVzdCBjbGllbnQnLFxuICB9LFxuICBjb252ZXJ0OiBnZW5lcmF0ZVBvd2Vyc2hlbGxDb252ZXJ0KCdJbnZva2UtV2ViUmVxdWVzdCcpLFxufTtcbiIsIi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSBEaWN0aW9uYXJ5IG9yIEFycmF5IGxpdGVyYWwgcmVwcmVzZW50YXRpb24gd2l0aCBwcmV0dHkgb3B0aW9uXG4gKiBhbmQgaW5kZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdFZhbHVlcyhcbiAgY29uY2F0VHlwZTogJ2FycmF5JyB8ICdvYmplY3QnLFxuICB2YWx1ZXM6IGFueSxcbiAgcHJldHR5OiBib29sZWFuLFxuICBpbmRlbnRhdGlvbjogc3RyaW5nLFxuICBpbmRlbnRMZXZlbDogbnVtYmVyLFxuKSB7XG4gIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBpbmRlbnRhdGlvbi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICBjb25zdCBjbG9zaW5nQnJhY2VJbmRlbnQgPSBpbmRlbnRhdGlvbi5yZXBlYXQoaW5kZW50TGV2ZWwgLSAxKTtcbiAgY29uc3Qgam9pbiA9IHByZXR0eSA/IGAsXFxuJHtjdXJyZW50SW5kZW50fWAgOiAnLCAnO1xuICBjb25zdCBvcGVuaW5nQnJhY2UgPSBjb25jYXRUeXBlID09PSAnb2JqZWN0JyA/ICd7JyA6ICdbJztcbiAgY29uc3QgY2xvc2luZ0JyYWNlID0gY29uY2F0VHlwZSA9PT0gJ29iamVjdCcgPyAnfScgOiAnXSc7XG5cbiAgaWYgKHByZXR0eSkge1xuICAgIHJldHVybiBgJHtvcGVuaW5nQnJhY2V9XFxuJHtjdXJyZW50SW5kZW50fSR7dmFsdWVzLmpvaW4oXG4gICAgICBqb2luLFxuICAgICl9XFxuJHtjbG9zaW5nQnJhY2VJbmRlbnR9JHtjbG9zaW5nQnJhY2V9YDtcbiAgfVxuXG4gIGlmIChjb25jYXRUeXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgJHtvcGVuaW5nQnJhY2V9ICR7dmFsdWVzLmpvaW4oam9pbil9ICR7Y2xvc2luZ0JyYWNlfWA7XG4gIH1cblxuICByZXR1cm4gYCR7b3BlbmluZ0JyYWNlfSR7dmFsdWVzLmpvaW4oam9pbil9JHtjbG9zaW5nQnJhY2V9YDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSB2YWxpZCBQeXRob24gc3RyaW5nIG9mIGEgbGl0ZXJhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgSmF2YVNjcmlwdCBsaXRlcmFsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBUYXJnZXQgb3B0aW9uc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgbGl0ZXJhbFJlcHJlc2VudGF0aW9uID0gKFxuICB2YWx1ZTogYW55LFxuICBvcHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBpbmRlbnRMZXZlbD86IG51bWJlcixcbik6IGFueSA9PiB7XG4gIGluZGVudExldmVsID0gaW5kZW50TGV2ZWwgPT09IHVuZGVmaW5lZCA/IDEgOiBpbmRlbnRMZXZlbCArIDE7XG5cbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpKSB7XG4gICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGNhc2UgJ1tvYmplY3QgQXJyYXldJzoge1xuICAgICAgbGV0IHByZXR0eSA9IGZhbHNlO1xuICAgICAgY29uc3QgdmFsdWVzUmVwcmVzZW50YXRpb246IGFueSA9ICh2YWx1ZSBhcyBhbnlbXSkubWFwKHYgPT4ge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gcHJldHRpZnkgaWYgdGhlIHZhbHVlIGlzIGEgZGljdGlvbmFyeSB3aXRoIG11bHRpcGxlIGtleXNcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgICBwcmV0dHkgPSBPYmplY3Qua2V5cyh2KS5sZW5ndGggPiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXRlcmFsUmVwcmVzZW50YXRpb24odiwgb3B0cywgaW5kZW50TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29uY2F0VmFsdWVzKCdhcnJheScsIHZhbHVlc1JlcHJlc2VudGF0aW9uLCBwcmV0dHksIG9wdHMuaW5kZW50LCBpbmRlbnRMZXZlbCk7XG4gICAgfVxuXG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzoge1xuICAgICAgY29uc3Qga2V5VmFsdWVQYWlycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAga2V5VmFsdWVQYWlycy5wdXNoKGBcIiR7a2V5fVwiOiAke2xpdGVyYWxSZXByZXNlbnRhdGlvbih2YWx1ZVtrZXldLCBvcHRzLCBpbmRlbnRMZXZlbCl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uY2F0VmFsdWVzKFxuICAgICAgICAnb2JqZWN0JyxcbiAgICAgICAga2V5VmFsdWVQYWlycyxcbiAgICAgICAgb3B0cy5wcmV0dHkgJiYga2V5VmFsdWVQYWlycy5sZW5ndGggPiAxLFxuICAgICAgICBvcHRzLmluZGVudCxcbiAgICAgICAgaW5kZW50TGV2ZWwsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNhc2UgJ1tvYmplY3QgTnVsbF0nOlxuICAgICAgcmV0dXJuICdOb25lJztcblxuICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgcmV0dXJuIHZhbHVlID8gJ1RydWUnIDogJ0ZhbHNlJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYFwiJHt2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cImA7XG4gIH1cbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBuYXRpdmUgUHl0aG9uMy5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAbW9udGFuYWZseW5uXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9lc2NhcGUnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHl0aG9uM09wdGlvbnMge1xuICBpbnNlY3VyZVNraXBWZXJpZnk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgcHl0aG9uMzogQ2xpZW50PFB5dGhvbjNPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ3B5dGhvbjMnLFxuICAgIHRpdGxlOiAnaHR0cC5jbGllbnQnLFxuICAgIGxpbms6ICdodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvaHR0cC5jbGllbnQuaHRtbCcsXG4gICAgZGVzY3JpcHRpb246ICdQeXRob24zIEhUVFAgQ2xpZW50JyxcbiAgfSxcbiAgY29udmVydDogKHsgdXJpT2JqOiB7IHBhdGgsIHByb3RvY29sLCBob3N0IH0sIHBvc3REYXRhLCBhbGxIZWFkZXJzLCBtZXRob2QgfSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBpbnNlY3VyZVNraXBWZXJpZnkgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcigpO1xuICAgIC8vIFN0YXJ0IFJlcXVlc3RcbiAgICBwdXNoKCdpbXBvcnQgaHR0cC5jbGllbnQnKTtcbiAgICBpZiAoaW5zZWN1cmVTa2lwVmVyaWZ5KSB7XG4gICAgICBwdXNoKCdpbXBvcnQgc3NsJyk7XG4gICAgfVxuICAgIGJsYW5rKCk7XG5cbiAgICAvLyBDaGVjayB3aGljaCBwcm90b2NvbCB0byBiZSB1c2VkIGZvciB0aGUgY2xpZW50IGNvbm5lY3Rpb25cbiAgICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICBjb25zdCBzc2xDb250ZXh0ID0gaW5zZWN1cmVTa2lwVmVyaWZ5ID8gJywgY29udGV4dCA9IHNzbC5fY3JlYXRlX3VudmVyaWZpZWRfY29udGV4dCgpJyA6ICcnO1xuICAgICAgcHVzaChgY29ubiA9IGh0dHAuY2xpZW50LkhUVFBTQ29ubmVjdGlvbihcIiR7aG9zdH1cIiR7c3NsQ29udGV4dH0pYCk7XG4gICAgICBibGFuaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKGBjb25uID0gaHR0cC5jbGllbnQuSFRUUENvbm5lY3Rpb24oXCIke2hvc3R9XCIpYCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwYXlsb2FkIHN0cmluZyBpZiBpdCBleGlzdHNcbiAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkocG9zdERhdGEudGV4dCk7XG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHB1c2goYHBheWxvYWQgPSAke3BheWxvYWR9YCk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBIZWFkZXJzXG4gICAgY29uc3QgaGVhZGVycyA9IGFsbEhlYWRlcnM7XG4gICAgY29uc3QgaGVhZGVyQ291bnQgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5sZW5ndGg7XG4gICAgaWYgKGhlYWRlckNvdW50ID09PSAxKSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIHB1c2goYGhlYWRlcnMgPSB7ICcke2hlYWRlcn0nOiBcIiR7ZXNjYXBlRm9yRG91YmxlUXVvdGVzKGhlYWRlcnNbaGVhZGVyXSl9XCIgfWApO1xuICAgICAgICBibGFuaygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVyQ291bnQgPiAxKSB7XG4gICAgICBsZXQgY291bnQgPSAxO1xuXG4gICAgICBwdXNoKCdoZWFkZXJzID0geycpO1xuXG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChjb3VudCsrICE9PSBoZWFkZXJDb3VudCkge1xuICAgICAgICAgIHB1c2goYCAgICAnJHtoZWFkZXJ9JzogXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhoZWFkZXJzW2hlYWRlcl0pfVwiLGApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2goYCAgICAnJHtoZWFkZXJ9JzogXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhoZWFkZXJzW2hlYWRlcl0pfVwiYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVzaCgnfScpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIFJlcXVlc3RcbiAgICBpZiAocGF5bG9hZCAmJiBoZWFkZXJDb3VudCkge1xuICAgICAgcHVzaChgY29ubi5yZXF1ZXN0KFwiJHttZXRob2R9XCIsIFwiJHtwYXRofVwiLCBwYXlsb2FkLCBoZWFkZXJzKWApO1xuICAgIH0gZWxzZSBpZiAocGF5bG9hZCAmJiAhaGVhZGVyQ291bnQpIHtcbiAgICAgIHB1c2goYGNvbm4ucmVxdWVzdChcIiR7bWV0aG9kfVwiLCBcIiR7cGF0aH1cIiwgcGF5bG9hZClgKTtcbiAgICB9IGVsc2UgaWYgKCFwYXlsb2FkICYmIGhlYWRlckNvdW50KSB7XG4gICAgICBwdXNoKGBjb25uLnJlcXVlc3QoXCIke21ldGhvZH1cIiwgXCIke3BhdGh9XCIsIGhlYWRlcnM9aGVhZGVycylgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChgY29ubi5yZXF1ZXN0KFwiJHttZXRob2R9XCIsIFwiJHtwYXRofVwiKWApO1xuICAgIH1cblxuICAgIC8vIEdldCBSZXNwb25zZVxuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgncmVzID0gY29ubi5nZXRyZXNwb25zZSgpJyk7XG4gICAgcHVzaCgnZGF0YSA9IHJlcy5yZWFkKCknKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ3ByaW50KGRhdGEuZGVjb2RlKFwidXRmLThcIikpJyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIFB5dGhvbiB1c2luZyBSZXF1ZXN0c1xuICpcbiAqIEBhdXRob3JcbiAqIEBtb250YW5hZmx5bm5cbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JEb3VibGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBnZXRIZWFkZXJOYW1lIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9oZWFkZXJzJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbGl0ZXJhbFJlcHJlc2VudGF0aW9uIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IGJ1aWx0SW5NZXRob2RzID0gWydIRUFEJywgJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdQQVRDSCcsICdERUxFVEUnLCAnT1BUSU9OUyddO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RzT3B0aW9ucyB7XG4gIHByZXR0eT86IHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCByZXF1ZXN0czogQ2xpZW50PFJlcXVlc3RzT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdyZXF1ZXN0cycsXG4gICAgdGl0bGU6ICdSZXF1ZXN0cycsXG4gICAgbGluazogJ2h0dHA6Ly9kb2NzLnB5dGhvbi1yZXF1ZXN0cy5vcmcvZW4vbGF0ZXN0L2FwaS8jcmVxdWVzdHMucmVxdWVzdCcsXG4gICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0cyBIVFRQIGxpYnJhcnknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBxdWVyeU9iaiwgdXJsLCBwb3N0RGF0YSwgYWxsSGVhZGVycywgbWV0aG9kIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAgICcsXG4gICAgICBwcmV0dHk6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgLy8gU3RhcnQgc25pcHBldFxuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICAvLyBJbXBvcnQgcmVxdWVzdHNcbiAgICBwdXNoKCdpbXBvcnQgcmVxdWVzdHMnKTtcbiAgICBibGFuaygpO1xuXG4gICAgLy8gU2V0IFVSTFxuICAgIHB1c2goYHVybCA9IFwiJHt1cmx9XCJgKTtcbiAgICBibGFuaygpO1xuXG4gICAgLy8gQ29uc3RydWN0IHF1ZXJ5IHN0cmluZ1xuICAgIGxldCBxcztcbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgcXMgPSBgcXVlcnlzdHJpbmcgPSAke0pTT04uc3RyaW5naWZ5KHF1ZXJ5T2JqKX1gO1xuXG4gICAgICBwdXNoKHFzKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IGFsbEhlYWRlcnM7XG5cbiAgICAvLyBDb25zdHJ1Y3QgcGF5bG9hZFxuICAgIGxldCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZmlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGxldCBoYXNGaWxlcyA9IGZhbHNlO1xuICAgIGxldCBoYXNQYXlsb2FkID0gZmFsc2U7XG4gICAgbGV0IGpzb25QYXlsb2FkID0gZmFsc2U7XG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICAgIGlmIChwb3N0RGF0YS5qc29uT2JqKSB7XG4gICAgICAgICAgcHVzaChgcGF5bG9hZCA9ICR7bGl0ZXJhbFJlcHJlc2VudGF0aW9uKHBvc3REYXRhLmpzb25PYmosIG9wdHMpfWApO1xuICAgICAgICAgIGpzb25QYXlsb2FkID0gdHJ1ZTtcbiAgICAgICAgICBoYXNQYXlsb2FkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgIGlmICghcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkID0ge307XG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgIGlmIChwLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICBmaWxlc1twLm5hbWVdID0gYG9wZW4oJyR7cC5maWxlTmFtZX0nLCAncmInKWA7XG4gICAgICAgICAgICBoYXNGaWxlcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWRbcC5uYW1lXSA9IHAudmFsdWU7XG4gICAgICAgICAgICBoYXNQYXlsb2FkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNGaWxlcykge1xuICAgICAgICAgIHB1c2goYGZpbGVzID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24oZmlsZXMsIG9wdHMpfWApO1xuXG4gICAgICAgICAgaWYgKGhhc1BheWxvYWQpIHtcbiAgICAgICAgICAgIHB1c2goYHBheWxvYWQgPSAke2xpdGVyYWxSZXByZXNlbnRhdGlvbihwYXlsb2FkLCBvcHRzKX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgcmVxdWVzdHMgbGlicmFyeSB3aWxsIG9ubHkgYXV0b21hdGljYWxseSBhZGQgYSBgbXVsdGlwYXJ0L2Zvcm0tZGF0YWAgaGVhZGVyIGlmIHRoZXJlIGFyZSBmaWxlcyBiZWluZyBzZW50LiBJZiB3ZSdyZSAqKm9ubHkqKiBzZW5kaW5nIGZvcm0gZGF0YSB3ZSBzdGlsbCBuZWVkIHRvIHNlbmQgdGhlIGJvdW5kYXJ5IG91cnNlbHZlcy5cbiAgICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gZ2V0SGVhZGVyTmFtZShoZWFkZXJzLCAnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgaWYgKGhlYWRlck5hbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBub25GaWxlUGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpO1xuICAgICAgICAgIGlmIChub25GaWxlUGF5bG9hZCkge1xuICAgICAgICAgICAgcHVzaChgcGF5bG9hZCA9ICR7bm9uRmlsZVBheWxvYWR9YCk7XG4gICAgICAgICAgICBoYXNQYXlsb2FkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHBvc3REYXRhLm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyAmJiBwb3N0RGF0YS5wYXJhbXNPYmopIHtcbiAgICAgICAgICBwdXNoKGBwYXlsb2FkID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24ocG9zdERhdGEucGFyYW1zT2JqLCBvcHRzKX1gKTtcbiAgICAgICAgICBoYXNQYXlsb2FkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KTtcbiAgICAgICAgaWYgKHBheWxvYWQpIHtcbiAgICAgICAgICBwdXNoKGBwYXlsb2FkID0gJHtwYXlsb2FkfWApO1xuICAgICAgICAgIGhhc1BheWxvYWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IGhlYWRlcnNcbiAgICBjb25zdCBoZWFkZXJDb3VudCA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLmxlbmd0aDtcblxuICAgIGlmIChoZWFkZXJDb3VudCA9PT0gMCAmJiAoaGFzUGF5bG9hZCB8fCBoYXNGaWxlcykpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IGhlYWRzIGJ1dCB3ZSBkbyBoYXZlIGEgcGF5bG9hZCB3ZSBzaG91bGQgcHV0IGEgYmxhbmsgbGluZSBoZXJlIGJldHdlZW4gdGhhdCBwYXlsb2FkIGNvbnN0dXJjdGlvbiBhbmQgb3VyIGV4ZWN1dGlvbiBvZiB0aGUgcmVxdWVzdHMgbGlicmFyeS5cbiAgICAgIGJsYW5rKCk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJDb3VudCA9PT0gMSkge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBwdXNoKGBoZWFkZXJzID0ge1wiJHtoZWFkZXJ9XCI6IFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoaGVhZGVyc1toZWFkZXJdKX1cIn1gKTtcbiAgICAgICAgYmxhbmsoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlckNvdW50ID4gMSkge1xuICAgICAgbGV0IGNvdW50ID0gMTtcblxuICAgICAgcHVzaCgnaGVhZGVycyA9IHsnKTtcblxuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoY291bnQgIT09IGhlYWRlckNvdW50KSB7XG4gICAgICAgICAgcHVzaChgXCIke2hlYWRlcn1cIjogXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhoZWFkZXJzW2hlYWRlcl0pfVwiLGAsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2goYFwiJHtoZWFkZXJ9XCI6IFwiJHtlc2NhcGVGb3JEb3VibGVRdW90ZXMoaGVhZGVyc1toZWFkZXJdKX1cImAsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ICs9IDE7XG4gICAgICB9XG5cbiAgICAgIHB1c2goJ30nKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHJlcXVlc3RcbiAgICBsZXQgcmVxdWVzdCA9IGJ1aWx0SW5NZXRob2RzLmluY2x1ZGVzKG1ldGhvZClcbiAgICAgID8gYHJlc3BvbnNlID0gcmVxdWVzdHMuJHttZXRob2QudG9Mb3dlckNhc2UoKX0odXJsYFxuICAgICAgOiBgcmVzcG9uc2UgPSByZXF1ZXN0cy5yZXF1ZXN0KFwiJHttZXRob2R9XCIsIHVybGA7XG5cbiAgICBpZiAoaGFzUGF5bG9hZCkge1xuICAgICAgaWYgKGpzb25QYXlsb2FkKSB7XG4gICAgICAgIHJlcXVlc3QgKz0gJywganNvbj1wYXlsb2FkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3QgKz0gJywgZGF0YT1wYXlsb2FkJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRmlsZXMpIHtcbiAgICAgIHJlcXVlc3QgKz0gJywgZmlsZXM9ZmlsZXMnO1xuICAgIH1cblxuICAgIGlmIChoZWFkZXJDb3VudCA+IDApIHtcbiAgICAgIHJlcXVlc3QgKz0gJywgaGVhZGVycz1oZWFkZXJzJztcbiAgICB9XG5cbiAgICBpZiAocXMpIHtcbiAgICAgIHJlcXVlc3QgKz0gJywgcGFyYW1zPXF1ZXJ5c3RyaW5nJztcbiAgICB9XG5cbiAgICByZXF1ZXN0ICs9ICcpJztcblxuICAgIHB1c2gocmVxdWVzdCk7XG4gICAgYmxhbmsoKTtcblxuICAgIC8vIFByaW50IHJlc3BvbnNlXG4gICAgcHVzaCgncHJpbnQocmVzcG9uc2UuanNvbigpKScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IHB5dGhvbjMgfSBmcm9tICcuL3B5dGhvbjMvY2xpZW50JztcbmltcG9ydCB7IHJlcXVlc3RzIH0gZnJvbSAnLi9yZXF1ZXN0cy9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgcHl0aG9uOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdweXRob24nLFxuICAgIHRpdGxlOiAnUHl0aG9uJyxcbiAgICBleHRuYW1lOiAnLnB5JyxcbiAgICBkZWZhdWx0OiAncHl0aG9uMycsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgcHl0aG9uMyxcbiAgICByZXF1ZXN0cyxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBjb2RlIHNuaXBwZXQgZ2VuZXJhdG9yIGZvciBSIHVzaW5nIGh0dHJcbiAqXG4gKiBAYXV0aG9yXG4gKiBAZ2FicmllbGFrb3JlZWRhXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0ck9wdGlvbnMge1xuICAvKiogQGRlZmF1bHQgJyAgJyAqL1xuICBpbmRlbnQ/OiBzdHJpbmc7XG59XG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZXNjYXBlRm9yRG91YmxlUXVvdGVzLCBlc2NhcGVGb3JTaW5nbGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBnZXRIZWFkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBjb25zdCBodHRyOiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdodHRyJyxcbiAgICB0aXRsZTogJ2h0dHInLFxuICAgIGxpbms6ICdodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvaHR0ci92aWduZXR0ZXMvcXVpY2tzdGFydC5odG1sJyxcbiAgICBkZXNjcmlwdGlvbjogJ2h0dHI6IFRvb2xzIGZvciBXb3JraW5nIHdpdGggVVJMcyBhbmQgSFRUUCcsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IHVybCwgcXVlcnlPYmosIHF1ZXJ5U3RyaW5nLCBwb3N0RGF0YSwgYWxsSGVhZGVycywgbWV0aG9kIH0sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8vIFN0YXJ0IHNuaXBwZXRcbiAgICBjb25zdCB7IHB1c2gsIGJsYW5rLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoe1xuICAgICAgaW5kZW50OiBvcHRpb25zLmluZGVudCA/PyAnICAnLFxuICAgIH0pO1xuXG4gICAgLy8gSW1wb3J0IGh0dHJcbiAgICBwdXNoKCdsaWJyYXJ5KGh0dHIpJyk7XG4gICAgYmxhbmsoKTtcblxuICAgIC8vIFNldCBVUkxcbiAgICBwdXNoKGB1cmwgPC0gXCIke3VybH1cImApO1xuICAgIGJsYW5rKCk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgcXVlcnkgc3RyaW5nXG4gICAgY29uc3QgcXMgPSBxdWVyeU9iajtcbiAgICBkZWxldGUgcXVlcnlPYmoua2V5O1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHFzKTtcbiAgICBjb25zdCBlbnRyaWVzQ291bnQgPSBlbnRyaWVzLmxlbmd0aDtcblxuICAgIGlmIChlbnRyaWVzQ291bnQgPT09IDEpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgIHB1c2goYHF1ZXJ5U3RyaW5nIDwtIGxpc3QoJHtlbnRyeVswXX0gPSBcIiR7ZW50cnlbMV19XCIpYCk7XG4gICAgICBibGFuaygpO1xuICAgIH0gZWxzZSBpZiAoZW50cmllc0NvdW50ID4gMSkge1xuICAgICAgcHVzaCgncXVlcnlTdHJpbmcgPC0gbGlzdCgnKTtcblxuICAgICAgZW50cmllcy5mb3JFYWNoKChba2V5LCB2YWx1ZV0sIGkpID0+IHtcbiAgICAgICAgY29uc3QgaXNMYXN0SXRlbSA9IGkgIT09IGVudHJpZXNDb3VudCAtIDE7XG4gICAgICAgIGNvbnN0IG1heWJlQ29tbWEgPSBpc0xhc3RJdGVtID8gJywnIDogJyc7XG4gICAgICAgIHB1c2goYCR7a2V5fSA9IFwiJHt2YWx1ZX1cIiR7bWF5YmVDb21tYX1gLCAxKTtcbiAgICAgIH0pO1xuXG4gICAgICBwdXNoKCcpJyk7XG4gICAgICBibGFuaygpO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCBwYXlsb2FkXG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpO1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHB1c2goYHBheWxvYWQgPC0gJHtwYXlsb2FkfWApO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgZW5jb2RlXG4gICAgaWYgKHBvc3REYXRhLnRleHQgfHwgcG9zdERhdGEuanNvbk9iaiB8fCBwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgIHN3aXRjaCAocG9zdERhdGEubWltZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgICBwdXNoKCdlbmNvZGUgPC0gXCJmb3JtXCInKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICAgIHB1c2goJ2VuY29kZSA8LSBcImpzb25cIicpO1xuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgICAgcHVzaCgnZW5jb2RlIDwtIFwibXVsdGlwYXJ0XCInKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcHVzaCgnZW5jb2RlIDwtIFwicmF3XCInKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCBoZWFkZXJzXG4gICAgY29uc3QgY29va2llSGVhZGVyID0gZ2V0SGVhZGVyKGFsbEhlYWRlcnMsICdjb29raWUnKTtcbiAgICBjb25zdCBhY2NlcHRIZWFkZXIgPSBnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2FjY2VwdCcpO1xuXG4gICAgY29uc3Qgc2V0Q29va2llcyA9IGNvb2tpZUhlYWRlclxuICAgICAgPyBgc2V0X2Nvb2tpZXMoXFxgJHtTdHJpbmcoY29va2llSGVhZGVyKVxuICAgICAgICAgIC5yZXBsYWNlKC87L2csICdcIiwgYCcpXG4gICAgICAgICAgLnJlcGxhY2UoL2AgL2csICdgJylcbiAgICAgICAgICAucmVwbGFjZSgvWz1dL2csICdgID0gXCInKX1cIilgXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNldEFjY2VwdCA9IGFjY2VwdEhlYWRlciA/IGBhY2NlcHQoXCIke2VzY2FwZUZvckRvdWJsZVF1b3RlcyhhY2NlcHRIZWFkZXIpfVwiKWAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzZXRDb250ZW50VHlwZSA9IGBjb250ZW50X3R5cGUoXCIke2VzY2FwZUZvckRvdWJsZVF1b3Rlcyhwb3N0RGF0YS5taW1lVHlwZSl9XCIpYDtcblxuICAgIGNvbnN0IG90aGVySGVhZGVycyA9IE9iamVjdC5lbnRyaWVzKGFsbEhlYWRlcnMpXG4gICAgICAvLyBUaGVzZSBoZWFkZXJzIGFyZSBhbGwgaGFuZGxlZCBzZXBhcmF0ZWx5OlxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFbJ2Nvb2tpZScsICdhY2NlcHQnLCAnY29udGVudC10eXBlJ10uaW5jbHVkZXMoa2V5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJyR7a2V5fScgPSAnJHtlc2NhcGVGb3JTaW5nbGVRdW90ZXModmFsdWUpfSdgKVxuICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gb3RoZXJIZWFkZXJzID8gYGFkZF9oZWFkZXJzKCR7b3RoZXJIZWFkZXJzfSlgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gQ29uc3RydWN0IHJlcXVlc3RcbiAgICBsZXQgcmVxdWVzdCA9IGByZXNwb25zZSA8LSBWRVJCKFwiJHttZXRob2R9XCIsIHVybGA7XG5cbiAgICBpZiAocGF5bG9hZCkge1xuICAgICAgcmVxdWVzdCArPSAnLCBib2R5ID0gcGF5bG9hZCc7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5U3RyaW5nLmxlbmd0aCkge1xuICAgICAgcmVxdWVzdCArPSAnLCBxdWVyeSA9IHF1ZXJ5U3RyaW5nJztcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJBZGRpdGlvbnMgPSBbc2V0SGVhZGVycywgc2V0Q29udGVudFR5cGUsIHNldEFjY2VwdCwgc2V0Q29va2llc11cbiAgICAgIC5maWx0ZXIoeCA9PiAhIXgpXG4gICAgICAuam9pbignLCAnKTtcblxuICAgIGlmIChoZWFkZXJBZGRpdGlvbnMpIHtcbiAgICAgIHJlcXVlc3QgKz0gYCwgJHtoZWFkZXJBZGRpdGlvbnN9YDtcbiAgICB9XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCB8fCBwb3N0RGF0YS5qc29uT2JqIHx8IHBvc3REYXRhLnBhcmFtcykge1xuICAgICAgcmVxdWVzdCArPSAnLCBlbmNvZGUgPSBlbmNvZGUnO1xuICAgIH1cblxuICAgIHJlcXVlc3QgKz0gJyknO1xuXG4gICAgcHVzaChyZXF1ZXN0KTtcblxuICAgIGJsYW5rKCk7XG4gICAgLy8gUHJpbnQgcmVzcG9uc2VcbiAgICBwdXNoKCdjb250ZW50KHJlc3BvbnNlLCBcInRleHRcIiknKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBodHRyIH0gZnJvbSAnLi9odHRyL2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCByOiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdyJyxcbiAgICB0aXRsZTogJ1InLFxuICAgIGV4dG5hbWU6ICcucicsXG4gICAgZGVmYXVsdDogJ2h0dHInLFxuICB9LFxuICBjbGllbnRzQnlJZDoge1xuICAgIGh0dHIsXG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBlc2NhcGVGb3JTaW5nbGVRdW90ZXMgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2VzY2FwZSc7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcblxuZXhwb3J0IGNvbnN0IGZhcmFkYXk6IENsaWVudCA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ2ZhcmFkYXknLFxuICAgIHRpdGxlOiAnZmFyYWRheScsXG4gICAgbGluazogJ2h0dHBzOi8vZ2l0aHViLmNvbS9sb3N0aXNsYW5kL2ZhcmFkYXknLFxuICAgIGRlc2NyaXB0aW9uOiAnRmFyYWRheSBIVFRQIGNsaWVudCcsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IHVyaU9iaiwgcXVlcnlPYmosIG1ldGhvZDogcmF3TWV0aG9kLCBwb3N0RGF0YSwgYWxsSGVhZGVycyB9KSA9PiB7XG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKCk7XG5cbiAgICAvLyBUbyBzdXBwb3J0IGN1c3RvbSBtZXRob2RzIHdlIGNoZWNrIGZvciB0aGUgc3VwcG9ydGVkIG1ldGhvZHNcbiAgICAvLyBhbmQgaWYgZG9lc24ndCBleGlzdCB0aGVuIHdlIGJ1aWxkIGEgY3VzdG9tIGNsYXNzIGZvciBpdFxuICAgIGNvbnN0IG1ldGhvZCA9IHJhd01ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IG1ldGhvZHMgPSBbXG4gICAgICAnR0VUJyxcbiAgICAgICdQT1NUJyxcbiAgICAgICdIRUFEJyxcbiAgICAgICdERUxFVEUnLFxuICAgICAgJ1BBVENIJyxcbiAgICAgICdQVVQnLFxuICAgICAgJ09QVElPTlMnLFxuICAgICAgJ0NPUFknLFxuICAgICAgJ0xPQ0snLFxuICAgICAgJ1VOTE9DSycsXG4gICAgICAnTU9WRScsXG4gICAgICAnVFJBQ0UnLFxuICAgIF07XG5cbiAgICBpZiAoIW1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgcHVzaChgIyBGYXJhZGF5IGNhbm5vdCBjdXJyZW50bHkgcnVuICR7bWV0aG9kfSByZXF1ZXN0cy4gUGxlYXNlIHVzZSBhbm90aGVyIGNsaWVudC5gKTtcbiAgICAgIHJldHVybiBqb2luKCk7XG4gICAgfVxuXG4gICAgcHVzaChcInJlcXVpcmUgJ2ZhcmFkYXknXCIpO1xuICAgIGJsYW5rKCk7XG5cbiAgICAvLyBXcml0ZSBib2R5IHRvIGJlZ2lubmluZyBvZiBzY3JpcHRcbiAgICBpZiAocG9zdERhdGEubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICBpZiAocG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgIHB1c2goYGRhdGEgPSB7YCk7XG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBwdXNoKGAgIDoke3BhcmFtLm5hbWV9ID0+ICR7SlNPTi5zdHJpbmdpZnkocGFyYW0udmFsdWUpfSxgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHB1c2goYH1gKTtcbiAgICAgICAgYmxhbmsoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGBjb25uID0gRmFyYWRheS5uZXcoYCk7XG4gICAgcHVzaChgICB1cmw6ICcke3VyaU9iai5wcm90b2NvbH0vLyR7dXJpT2JqLmhvc3R9JyxgKTtcbiAgICBpZiAoYWxsSGVhZGVyc1snY29udGVudC10eXBlJ10gfHwgYWxsSGVhZGVyc1snQ29udGVudC1UeXBlJ10pIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGAgIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJyA9PiAnJHtcbiAgICAgICAgICBhbGxIZWFkZXJzWydjb250ZW50LXR5cGUnXSB8fCBhbGxIZWFkZXJzWydDb250ZW50LVR5cGUnXVxuICAgICAgICB9J31gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcHVzaChgKWApO1xuXG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKGByZXNwb25zZSA9IGNvbm4uJHttZXRob2QudG9Mb3dlckNhc2UoKX0oJyR7dXJpT2JqLnBhdGhuYW1lfScpIGRvIHxyZXF8YCk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoYWxsSGVhZGVycyk7XG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpICE9PSAnY29udGVudC10eXBlJykge1xuICAgICAgICAgIHB1c2goYCAgcmVxLmhlYWRlcnNbJyR7a2V5fSddID0gJyR7ZXNjYXBlRm9yU2luZ2xlUXVvdGVzKGFsbEhlYWRlcnNba2V5XSl9J2ApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhxdWVyeU9iaikuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcXVlcnlPYmpbbmFtZV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcHVzaChgICByZXEucGFyYW1zWycke25hbWV9J10gPSAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2goYCAgcmVxLnBhcmFtc1snJHtuYW1lfSddID0gJyR7dmFsdWV9J2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIHB1c2goYCAgcmVxLmJvZHkgPSBVUkkuZW5jb2RlX3d3d19mb3JtKGRhdGEpYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2pzb24nOlxuICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgIHB1c2goYCAgcmVxLmJvZHkgPSAke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIHB1c2goYCAgcmVxLmJvZHkgPSAke0pTT04uc3RyaW5naWZ5KHBvc3REYXRhLnRleHQpfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCgnZW5kJyk7XG4gICAgYmxhbmsoKTtcbiAgICBwdXNoKCdwdXRzIHJlc3BvbnNlLnN0YXR1cycpO1xuICAgIHB1c2goJ3B1dHMgcmVzcG9uc2UuYm9keScpO1xuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZUZvclNpbmdsZVF1b3RlcyB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZXNjYXBlJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1YnlOYXRpdmVPcHRpb25zIHtcbiAgaW5zZWN1cmVTa2lwVmVyaWZ5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IG5hdGl2ZTogQ2xpZW50PFJ1YnlOYXRpdmVPcHRpb25zPiA9IHtcbiAgaW5mbzoge1xuICAgIGtleTogJ25hdGl2ZScsXG4gICAgdGl0bGU6ICduZXQ6Omh0dHAnLFxuICAgIGxpbms6ICdodHRwOi8vcnVieS1kb2Mub3JnL3N0ZGxpYi0yLjIuMS9saWJkb2MvbmV0L2h0dHAvcmRvYy9OZXQvSFRUUC5odG1sJyxcbiAgICBkZXNjcmlwdGlvbjogJ1J1YnkgSFRUUCBjbGllbnQnLFxuICB9LFxuICBjb252ZXJ0OiAoeyB1cmlPYmosIG1ldGhvZDogcmF3TWV0aG9kLCBmdWxsVXJsLCBwb3N0RGF0YSwgYWxsSGVhZGVycyB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGluc2VjdXJlU2tpcFZlcmlmeSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgeyBwdXNoLCBibGFuaywgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKCk7XG5cbiAgICBwdXNoKFwicmVxdWlyZSAndXJpJ1wiKTtcbiAgICBwdXNoKFwicmVxdWlyZSAnbmV0L2h0dHAnXCIpO1xuICAgIGJsYW5rKCk7XG5cbiAgICAvLyBUbyBzdXBwb3J0IGN1c3RvbSBtZXRob2RzIHdlIGNoZWNrIGZvciB0aGUgc3VwcG9ydGVkIG1ldGhvZHNcbiAgICAvLyBhbmQgaWYgZG9lc24ndCBleGlzdCB0aGVuIHdlIGJ1aWxkIGEgY3VzdG9tIGNsYXNzIGZvciBpdFxuICAgIGNvbnN0IG1ldGhvZCA9IHJhd01ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IG1ldGhvZHMgPSBbXG4gICAgICAnR0VUJyxcbiAgICAgICdQT1NUJyxcbiAgICAgICdIRUFEJyxcbiAgICAgICdERUxFVEUnLFxuICAgICAgJ1BBVENIJyxcbiAgICAgICdQVVQnLFxuICAgICAgJ09QVElPTlMnLFxuICAgICAgJ0NPUFknLFxuICAgICAgJ0xPQ0snLFxuICAgICAgJ1VOTE9DSycsXG4gICAgICAnTU9WRScsXG4gICAgICAnVFJBQ0UnLFxuICAgIF07XG4gICAgY29uc3QgY2FwTWV0aG9kID0gbWV0aG9kLmNoYXJBdCgwKSArIG1ldGhvZC5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIW1ldGhvZHMuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgcHVzaChgY2xhc3MgTmV0OjpIVFRQOjoke2NhcE1ldGhvZH0gPCBOZXQ6OkhUVFBSZXF1ZXN0YCk7XG4gICAgICBwdXNoKGAgIE1FVEhPRCA9ICcke21ldGhvZC50b1VwcGVyQ2FzZSgpfSdgKTtcbiAgICAgIHB1c2goYCAgUkVRVUVTVF9IQVNfQk9EWSA9ICcke3Bvc3REYXRhLnRleHQgPyAndHJ1ZScgOiAnZmFsc2UnfSdgKTtcbiAgICAgIHB1c2goJyAgUkVTUE9OU0VfSEFTX0JPRFkgPSB0cnVlJyk7XG4gICAgICBwdXNoKCdlbmQnKTtcbiAgICAgIGJsYW5rKCk7XG4gICAgfVxuXG4gICAgcHVzaChgdXJsID0gVVJJKFwiJHtmdWxsVXJsfVwiKWApO1xuICAgIGJsYW5rKCk7XG4gICAgcHVzaCgnaHR0cCA9IE5ldDo6SFRUUC5uZXcodXJsLmhvc3QsIHVybC5wb3J0KScpO1xuXG4gICAgaWYgKHVyaU9iai5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgIHB1c2goJ2h0dHAudXNlX3NzbCA9IHRydWUnKTtcbiAgICAgIGlmIChpbnNlY3VyZVNraXBWZXJpZnkpIHtcbiAgICAgICAgcHVzaCgnaHR0cC52ZXJpZnlfbW9kZSA9IE9wZW5TU0w6OlNTTDo6VkVSSUZZX05PTkUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goYHJlcXVlc3QgPSBOZXQ6OkhUVFA6OiR7Y2FwTWV0aG9kfS5uZXcodXJsKWApO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpO1xuICAgIGlmIChoZWFkZXJzLmxlbmd0aCkge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHB1c2goYHJlcXVlc3RbXCIke2tleX1cIl0gPSAnJHtlc2NhcGVGb3JTaW5nbGVRdW90ZXMoYWxsSGVhZGVyc1trZXldKX0nYCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocG9zdERhdGEudGV4dCkge1xuICAgICAgcHVzaChgcmVxdWVzdC5ib2R5ID0gJHtKU09OLnN0cmluZ2lmeShwb3N0RGF0YS50ZXh0KX1gKTtcbiAgICB9XG5cbiAgICBibGFuaygpO1xuICAgIHB1c2goJ3Jlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KHJlcXVlc3QpJyk7XG4gICAgcHVzaCgncHV0cyByZXNwb25zZS5yZWFkX2JvZHknKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vdGFyZ2V0cyc7XG5pbXBvcnQgeyBmYXJhZGF5IH0gZnJvbSAnLi9mYXJhZGF5L2NsaWVudCc7XG5pbXBvcnQgeyBuYXRpdmUgfSBmcm9tICcuL25hdGl2ZS9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgcnVieTogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncnVieScsXG4gICAgdGl0bGU6ICdSdWJ5JyxcbiAgICBleHRuYW1lOiAnLnJiJyxcbiAgICBkZWZhdWx0OiAnbmF0aXZlJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBuYXRpdmUsXG4gICAgZmFyYWRheSxcbiAgfSxcbn07XG4iLCJmdW5jdGlvbiBjb25jYXRWYWx1ZXMoXG4gIGNvbmNhdFR5cGU6ICdhcnJheScgfCAnb2JqZWN0JyxcbiAgdmFsdWVzOiBhbnksXG4gIHByZXR0eTogYm9vbGVhbixcbiAgaW5kZW50YXRpb246IHN0cmluZyxcbiAgaW5kZW50TGV2ZWw6IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBpbmRlbnRhdGlvbi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICBjb25zdCBjbG9zaW5nQnJhY2VJbmRlbnQgPSBpbmRlbnRhdGlvbi5yZXBlYXQoaW5kZW50TGV2ZWwgLSAxKTtcbiAgY29uc3Qgam9pbiA9IHByZXR0eSA/IGAsXFxuJHtjdXJyZW50SW5kZW50fWAgOiAnLCAnO1xuICBjb25zdCBvcGVuaW5nQnJhY2UgPSBjb25jYXRUeXBlID09PSAnb2JqZWN0JyA/ICdqc29uISh7JyA6ICcoJztcbiAgY29uc3QgY2xvc2luZ0JyYWNlID0gY29uY2F0VHlwZSA9PT0gJ29iamVjdCcgPyAnfSknIDogJyknO1xuXG4gIGlmIChwcmV0dHkpIHtcbiAgICByZXR1cm4gYCR7b3BlbmluZ0JyYWNlfVxcbiR7Y3VycmVudEluZGVudH0ke3ZhbHVlcy5qb2luKFxuICAgICAgam9pbixcbiAgICApfVxcbiR7Y2xvc2luZ0JyYWNlSW5kZW50fSR7Y2xvc2luZ0JyYWNlfWA7XG4gIH1cblxuICByZXR1cm4gYCR7b3BlbmluZ0JyYWNlfSR7dmFsdWVzLmpvaW4oam9pbil9JHtjbG9zaW5nQnJhY2V9YDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSB2YWxpZCBSdXN0IHN0cmluZyBvZiBhIGxpdGVyYWwgdmFsdWUgdXNpbmcgc2VyZGVfanNvbiBhY2NvcmRpbmcgdG8gaXRzIHR5cGUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgSmF2YXNjcmlwdCBsaXRlcmFsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBUYXJnZXQgb3B0aW9uc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgbGl0ZXJhbFJlcHJlc2VudGF0aW9uID0gKFxuICB2YWx1ZTogYW55LFxuICBvcHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBpbmRlbnRMZXZlbD86IG51bWJlcixcbik6IGFueSA9PiB7XG4gIC8qXG4gICAqIE5vdGU6IHRoaXMgdmVyc2lvbiBpcyBhbG1vc3QgZW50aXJlbHkgYm9ycm93ZWQgZnJvbSB0aGUgUHl0aG9uIGNsaWVudCBoZWxwZXIuIFRoZVxuICAgKiBvbmx5IHJlYWwgbW9kaWZpY2F0aW9uIGludm9sdmVzIHRoZSBicmFjZXMgYW5kIHRoZSB0eXBlcy4gVGhlIGhlbHBlclxuICAgKiBjb3VsZCBwb3RlbnRpYWxseSBiZSBwYXJhbWV0ZXJpc2VkIGZvciByZXVzZS5cbiAgICovXG4gIGluZGVudExldmVsID0gaW5kZW50TGV2ZWwgPT09IHVuZGVmaW5lZCA/IDEgOiBpbmRlbnRMZXZlbCArIDE7XG5cbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpKSB7XG4gICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGNhc2UgJ1tvYmplY3QgQXJyYXldJzoge1xuICAgICAgbGV0IHByZXR0eSA9IGZhbHNlO1xuICAgICAgY29uc3QgdmFsdWVzUmVwOiBhbnkgPSAodmFsdWUgYXMgYW55W10pLm1hcCh2ID0+IHtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHByZXR0aWZ5IGlmIHRoZSB2YWx1ZSBpcyBhIGRpY3Qgd2l0aCBtb3JlIHRoYW4gb25lIGtleS5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgICBwcmV0dHkgPSBPYmplY3Qua2V5cyh2KS5sZW5ndGggPiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXRlcmFsUmVwcmVzZW50YXRpb24odiwgb3B0cywgaW5kZW50TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29uY2F0VmFsdWVzKCdhcnJheScsIHZhbHVlc1JlcCwgcHJldHR5LCBvcHRzLmluZGVudCwgaW5kZW50TGV2ZWwpO1xuICAgIH1cblxuICAgIGNhc2UgJ1tvYmplY3QgT2JqZWN0XSc6IHtcbiAgICAgIGNvbnN0IGtleVZhbHVlUGFpcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGtleVZhbHVlUGFpcnMucHVzaChgXCIke2tleX1cIjogJHtsaXRlcmFsUmVwcmVzZW50YXRpb24odmFsdWVba2V5XSwgb3B0cywgaW5kZW50TGV2ZWwpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmNhdFZhbHVlcyhcbiAgICAgICAgJ29iamVjdCcsXG4gICAgICAgIGtleVZhbHVlUGFpcnMsXG4gICAgICAgIG9wdHMucHJldHR5ICYmIGtleVZhbHVlUGFpcnMubGVuZ3RoID4gMSxcbiAgICAgICAgb3B0cy5pbmRlbnQsXG4gICAgICAgIGluZGVudExldmVsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjYXNlICdbb2JqZWN0IE51bGxdJzpcbiAgICAgIHJldHVybiAnanNvbiEobnVsbCknO1xuXG4gICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG4gICAgICByZXR1cm4gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgXCIke3ZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIFJ1c3QgdXNpbmcgcmVxd2VzdFxuICpcbiAqIEBhdXRob3JcbiAqIEBCZW5qc2Nob1xuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbGl0ZXJhbFJlcHJlc2VudGF0aW9uIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCByZXF3ZXN0OiBDbGllbnQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdyZXF3ZXN0JyxcbiAgICB0aXRsZTogJ3JlcXdlc3QnLFxuICAgIGxpbms6ICdodHRwczovL2RvY3MucnMvcmVxd2VzdC9sYXRlc3QvcmVxd2VzdC8nLFxuICAgIGRlc2NyaXB0aW9uOiAncmVxd2VzdCBIVFRQIGxpYnJhcnknLFxuICB9LFxuICBjb252ZXJ0OiAoeyBxdWVyeU9iaiwgdXJsLCBwb3N0RGF0YSwgYWxsSGVhZGVycywgbWV0aG9kIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAgICcsXG4gICAgICBwcmV0dHk6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBsZXQgaW5kZW50TGV2ZWwgPSAwO1xuXG4gICAgLy8gc3RhcnQgc25pcHBldFxuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4sIHB1c2hUb0xhc3QsIHVuc2hpZnQgfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICAvLyBpbXBvcnQgcmVxd2VzdFxuICAgIHB1c2goJ3VzZSByZXF3ZXN0OycsIGluZGVudExldmVsKTtcbiAgICBibGFuaygpO1xuXG4gICAgLy8gc3RhcnQgYXN5bmMgbWFpbiBmb3IgdG9raW9cbiAgICBwdXNoKCcjW3Rva2lvOjptYWluXScsIGluZGVudExldmVsKTtcbiAgICBwdXNoKCdwdWIgYXN5bmMgZm4gbWFpbigpIHsnLCBpbmRlbnRMZXZlbCk7XG4gICAgaW5kZW50TGV2ZWwgKz0gMTtcblxuICAgIC8vIGFkZCB1cmxcbiAgICBwdXNoKGBsZXQgdXJsID0gXCIke3VybH1cIjtgLCBpbmRlbnRMZXZlbCk7XG4gICAgYmxhbmsoKTtcblxuICAgIGxldCBoYXNRdWVyeSA9IGZhbHNlO1xuICAgIC8vIGNvbnN0cnVjdCBxdWVyeSBzdHJpbmdcbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlPYmopLmxlbmd0aCkge1xuICAgICAgaGFzUXVlcnkgPSB0cnVlO1xuICAgICAgcHVzaCgnbGV0IHF1ZXJ5c3RyaW5nID0gWycsIGluZGVudExldmVsKTtcbiAgICAgIGluZGVudExldmVsICs9IDE7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeU9iaikpIHtcbiAgICAgICAgcHVzaChgKFwiJHtrZXl9XCIsIFwiJHt2YWx1ZX1cIiksYCwgaW5kZW50TGV2ZWwpO1xuICAgICAgfVxuICAgICAgaW5kZW50TGV2ZWwgLT0gMTtcbiAgICAgIHB1c2goJ107JywgaW5kZW50TGV2ZWwpO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgcGF5bG9hZFxuICAgIGxldCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZmlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGxldCBoYXNGaWxlcyA9IGZhbHNlO1xuICAgIGxldCBoYXNGb3JtID0gZmFsc2U7XG4gICAgbGV0IGhhc0JvZHkgPSBmYWxzZTtcbiAgICBsZXQganNvblBheWxvYWQgPSBmYWxzZTtcbiAgICBsZXQgaXNNdWx0aXBhcnQgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgaWYgKHBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgYGxldCBwYXlsb2FkID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24ocG9zdERhdGEuanNvbk9iaiwgb3B0cywgaW5kZW50TGV2ZWwpfTtgLFxuICAgICAgICAgICAgaW5kZW50TGV2ZWwsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBqc29uUGF5bG9hZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgaXNNdWx0aXBhcnQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghcG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgcHVzaChgbGV0IGZvcm0gPSByZXF3ZXN0OjptdWx0aXBhcnQ6OkZvcm06Om5ldygpYCwgaW5kZW50TGV2ZWwpO1xuICAgICAgICAgIHB1c2goYC50ZXh0KFwiXCIsIFwiXCIpO2AsIGluZGVudExldmVsICsgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkID0ge307XG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgIGlmIChwLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICBmaWxlc1twLm5hbWVdID0gcC5maWxlTmFtZTtcbiAgICAgICAgICAgIGhhc0ZpbGVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZFtwLm5hbWVdID0gcC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNGaWxlcykge1xuICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmaWxlVG9QYXJ0U3RyaW5nKSB7XG4gICAgICAgICAgICBwdXNoKGxpbmUsIGluZGVudExldmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoKGBsZXQgZm9ybSA9IHJlcXdlc3Q6Om11bHRpcGFydDo6Rm9ybTo6bmV3KClgLCBpbmRlbnRMZXZlbCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZmlsZU5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVzKSkge1xuICAgICAgICAgIHB1c2goYC5wYXJ0KFwiJHtuYW1lfVwiLCBmaWxlX3RvX3BhcnQoXCIke2ZpbGVOYW1lfVwiKS5hd2FpdClgLCBpbmRlbnRMZXZlbCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXlsb2FkKSkge1xuICAgICAgICAgIHB1c2goYC50ZXh0KFwiJHtuYW1lfVwiLCBcIiR7dmFsdWV9XCIpYCwgaW5kZW50TGV2ZWwgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoVG9MYXN0KCc7Jyk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHBvc3REYXRhLm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyAmJiBwb3N0RGF0YS5wYXJhbXNPYmopIHtcbiAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgYGxldCBwYXlsb2FkID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24ocG9zdERhdGEucGFyYW1zT2JqLCBvcHRzLCBpbmRlbnRMZXZlbCl9O2AsXG4gICAgICAgICAgICBpbmRlbnRMZXZlbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGhhc0Zvcm0gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgYGxldCBwYXlsb2FkID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24ocG9zdERhdGEudGV4dCwgb3B0cywgaW5kZW50TGV2ZWwpfTtgLFxuICAgICAgICAgICAgaW5kZW50TGV2ZWwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBoYXNCb2R5ID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNGb3JtIHx8IGpzb25QYXlsb2FkIHx8IGhhc0JvZHkpIHtcbiAgICAgIHVuc2hpZnQoYHVzZSBzZXJkZV9qc29uOjpqc29uO2ApO1xuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzSGVhZGVycyA9IGZhbHNlO1xuICAgIC8vIGNvbnN0cnVjdCBoZWFkZXJzXG4gICAgaWYgKE9iamVjdC5rZXlzKGFsbEhlYWRlcnMpLmxlbmd0aCkge1xuICAgICAgaGFzSGVhZGVycyA9IHRydWU7XG4gICAgICBwdXNoKCdsZXQgbXV0IGhlYWRlcnMgPSByZXF3ZXN0OjpoZWFkZXI6OkhlYWRlck1hcDo6bmV3KCk7JywgaW5kZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWxsSGVhZGVycykpIHtcbiAgICAgICAgLy8gU2tpcCBzZXR0aW5nIGNvbnRlbnQtdHlwZSBpZiB0aGVyZSBpcyBhIGZpbGUsIGFzIHRoaXMgaGVhZGVyIHdpbGxcbiAgICAgICAgLy8gY2F1c2UgdGhlIHJlcXVlc3QgdG8gaGFuZywgYW5kIHJlcXdlc3Qgd2lsbCBzZXQgaXQgZm9yIHVzLlxuICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnICYmIGlzTXVsdGlwYXJ0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaChcbiAgICAgICAgICBgaGVhZGVycy5pbnNlcnQoXCIke2tleX1cIiwgJHtsaXRlcmFsUmVwcmVzZW50YXRpb24odmFsdWUsIG9wdHMpfS5wYXJzZSgpLnVud3JhcCgpKTtgLFxuICAgICAgICAgIGluZGVudExldmVsLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmxhbmsoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgY2xpZW50XG4gICAgcHVzaCgnbGV0IGNsaWVudCA9IHJlcXdlc3Q6OkNsaWVudDo6bmV3KCk7JywgaW5kZW50TGV2ZWwpO1xuXG4gICAgLy8gY29uc3RydWN0IHF1ZXJ5XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ1BPU1QnOlxuICAgICAgICBwdXNoKGBsZXQgcmVzcG9uc2UgPSBjbGllbnQucG9zdCh1cmwpYCwgaW5kZW50TGV2ZWwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnR0VUJzpcbiAgICAgICAgcHVzaChgbGV0IHJlc3BvbnNlID0gY2xpZW50LmdldCh1cmwpYCwgaW5kZW50TGV2ZWwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBwdXNoKFxuICAgICAgICAgIGBsZXQgcmVzcG9uc2UgPSBjbGllbnQucmVxdWVzdChyZXF3ZXN0OjpNZXRob2Q6OmZyb21fc3RyKFwiJHttZXRob2R9XCIpLnVud3JhcCgpLCB1cmwpYCxcbiAgICAgICAgICBpbmRlbnRMZXZlbCxcbiAgICAgICAgKTtcbiAgICAgICAgdW5zaGlmdChgdXNlIHN0ZDo6c3RyOjpGcm9tU3RyO2ApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzUXVlcnkpIHtcbiAgICAgIHB1c2goYC5xdWVyeSgmcXVlcnlzdHJpbmcpYCwgaW5kZW50TGV2ZWwgKyAxKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNdWx0aXBhcnQpIHtcbiAgICAgIHB1c2goYC5tdWx0aXBhcnQoZm9ybSlgLCBpbmRlbnRMZXZlbCArIDEpO1xuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXJzKSB7XG4gICAgICBwdXNoKGAuaGVhZGVycyhoZWFkZXJzKWAsIGluZGVudExldmVsICsgMSk7XG4gICAgfVxuXG4gICAgaWYgKGpzb25QYXlsb2FkKSB7XG4gICAgICBwdXNoKGAuanNvbigmcGF5bG9hZClgLCBpbmRlbnRMZXZlbCArIDEpO1xuICAgIH1cblxuICAgIGlmIChoYXNGb3JtKSB7XG4gICAgICBwdXNoKGAuZm9ybSgmcGF5bG9hZClgLCBpbmRlbnRMZXZlbCArIDEpO1xuICAgIH1cblxuICAgIGlmIChoYXNCb2R5KSB7XG4gICAgICBwdXNoKGAuYm9keShwYXlsb2FkKWAsIGluZGVudExldmVsICsgMSk7XG4gICAgfVxuXG4gICAgLy8gc2VuZCBxdWVyeVxuICAgIHB1c2goJy5zZW5kKCknLCBpbmRlbnRMZXZlbCArIDEpO1xuICAgIHB1c2goJy5hd2FpdDsnLCBpbmRlbnRMZXZlbCArIDEpO1xuICAgIGJsYW5rKCk7XG5cbiAgICAvLyBQcmludCByZXNwb25zZVxuICAgIHB1c2goJ2xldCByZXN1bHRzID0gcmVzcG9uc2UudW53cmFwKCknLCBpbmRlbnRMZXZlbCk7XG4gICAgcHVzaCgnLmpzb246OjxzZXJkZV9qc29uOjpWYWx1ZT4oKScsIGluZGVudExldmVsICsgMSk7XG4gICAgcHVzaCgnLmF3YWl0JywgaW5kZW50TGV2ZWwgKyAxKTtcbiAgICBwdXNoKCcudW53cmFwKCk7JywgaW5kZW50TGV2ZWwgKyAxKTtcbiAgICBibGFuaygpO1xuXG4gICAgcHVzaCgnZGJnIShyZXN1bHRzKTsnLCBpbmRlbnRMZXZlbCk7XG5cbiAgICBwdXNoKCd9XFxuJyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcblxuY29uc3QgZmlsZVRvUGFydFN0cmluZyA9IFtcbiAgYGFzeW5jIGZuIGZpbGVfdG9fcGFydChmaWxlX25hbWU6ICYnc3RhdGljIHN0cikgLT4gcmVxd2VzdDo6bXVsdGlwYXJ0OjpQYXJ0IHtgLFxuICBgICAgIGxldCBmaWxlID0gdG9raW86OmZzOjpGaWxlOjpvcGVuKGZpbGVfbmFtZSkuYXdhaXQudW53cmFwKCk7YCxcbiAgYCAgICBsZXQgc3RyZWFtID0gdG9raW9fdXRpbDo6Y29kZWM6OkZyYW1lZFJlYWQ6Om5ldyhmaWxlLCB0b2tpb191dGlsOjpjb2RlYzo6Qnl0ZXNDb2RlYzo6bmV3KCkpO2AsXG4gIGAgICAgbGV0IGJvZHkgPSByZXF3ZXN0OjpCb2R5Ojp3cmFwX3N0cmVhbShzdHJlYW0pO2AsXG4gIGAgICAgcmVxd2VzdDo6bXVsdGlwYXJ0OjpQYXJ0OjpzdHJlYW0oYm9keSlgLFxuICBgICAgICAgICAuZmlsZV9uYW1lKGZpbGVfbmFtZSlgLFxuICBgICAgICAgICAubWltZV9zdHIoXCJ0ZXh0L3BsYWluXCIpLnVud3JhcCgpYCxcbiAgYH1gLFxuXTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgcmVxd2VzdCB9IGZyb20gJy4vcmVxd2VzdC9jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgcnVzdDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAncnVzdCcsXG4gICAgdGl0bGU6ICdSdXN0JyxcbiAgICBleHRuYW1lOiAnLnJzJyxcbiAgICBkZWZhdWx0OiAncmVxd2VzdCcsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgcmVxd2VzdCxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEhUVFAgY29kZSBzbmlwcGV0IGdlbmVyYXRvciBmb3IgdGhlIFNoZWxsIHVzaW5nIGNVUkwuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgZ2V0SGVhZGVyLCBnZXRIZWFkZXJOYW1lLCBpc01pbWVUeXBlSlNPTiB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvaGVhZGVycyc7XG5pbXBvcnQgeyBxdW90ZSB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvc2hlbGwnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vdGFyZ2V0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VybE9wdGlvbnMge1xuICBiaW5hcnk/OiBib29sZWFuO1xuICBnbG9iT2ZmPzogYm9vbGVhbjtcbiAgaW5kZW50Pzogc3RyaW5nIHwgZmFsc2U7XG4gIGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG4gIHByZXR0aWZ5SnNvbj86IGJvb2xlYW47XG4gIHNob3J0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGEgY29uc3QgcmVjb3JkIHdpdGgga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGxvbmcgbmFtZXMgYW5kIHZhbHVlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNob3J0IG5hbWVzIGZvciBjVVJMIGFyZ3VtZW50cy5cbiAqL1xuY29uc3QgcGFyYW1zID0ge1xuICAnaHR0cDEuMCc6ICcwJyxcbiAgJ3VybCAnOiAnJyxcbiAgY29va2llOiAnYicsXG4gIGRhdGE6ICdkJyxcbiAgZm9ybTogJ0YnLFxuICBnbG9ib2ZmOiAnZycsXG4gIGhlYWRlcjogJ0gnLFxuICBpbnNlY3VyZTogJ2snLFxuICByZXF1ZXN0OiAnWCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBnZXRBcmcgPSAoc2hvcnQ6IGJvb2xlYW4pID0+IChsb25nTmFtZToga2V5b2YgdHlwZW9mIHBhcmFtcykgPT4ge1xuICBpZiAoc2hvcnQpIHtcbiAgICBjb25zdCBzaG9ydE5hbWUgPSBwYXJhbXNbbG9uZ05hbWVdO1xuICAgIGlmICghc2hvcnROYW1lKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgLSR7c2hvcnROYW1lfWA7XG4gIH1cbiAgcmV0dXJuIGAtLSR7bG9uZ05hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBjdXJsOiBDbGllbnQ8Q3VybE9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnY3VybCcsXG4gICAgdGl0bGU6ICdjVVJMJyxcbiAgICBsaW5rOiAnaHR0cDovL2N1cmwuaGF4eC5zZS8nLFxuICAgIGRlc2NyaXB0aW9uOiAnY1VSTCBpcyBhIGNvbW1hbmQgbGluZSB0b29sIGFuZCBsaWJyYXJ5IGZvciB0cmFuc2ZlcnJpbmcgZGF0YSB3aXRoIFVSTCBzeW50YXgnLFxuICB9LFxuICBjb252ZXJ0OiAoeyBmdWxsVXJsLCBtZXRob2QsIGh0dHBWZXJzaW9uLCBoZWFkZXJzT2JqLCBhbGxIZWFkZXJzLCBwb3N0RGF0YSB9LCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBiaW5hcnkgPSBmYWxzZSxcbiAgICAgIGdsb2JPZmYgPSBmYWxzZSxcbiAgICAgIGluZGVudCA9ICcgICcsXG4gICAgICBpbnNlY3VyZVNraXBWZXJpZnkgPSBmYWxzZSxcbiAgICAgIHByZXR0aWZ5SnNvbiA9IGZhbHNlLFxuICAgICAgc2hvcnQgPSBmYWxzZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHsgcHVzaCwgam9pbiB9ID0gbmV3IENvZGVCdWlsZGVyKHtcbiAgICAgIC4uLih0eXBlb2YgaW5kZW50ID09PSAnc3RyaW5nJyA/IHsgaW5kZW50OiBpbmRlbnQgfSA6IHt9KSxcbiAgICAgIGpvaW46IGluZGVudCAhPT0gZmFsc2UgPyBgIFxcXFxcXG4ke2luZGVudH1gIDogJyAnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXJnID0gZ2V0QXJnKHNob3J0KTtcblxuICAgIGxldCBmb3JtYXR0ZWRVcmwgPSBxdW90ZShmdWxsVXJsKTtcblxuICAgIHB1c2goYGN1cmwgJHthcmcoJ3JlcXVlc3QnKX0gJHttZXRob2R9YCk7XG4gICAgaWYgKGdsb2JPZmYpIHtcbiAgICAgIGZvcm1hdHRlZFVybCA9IHVuZXNjYXBlKGZvcm1hdHRlZFVybCk7XG4gICAgICBwdXNoKGFyZygnZ2xvYm9mZicpKTtcbiAgICB9XG4gICAgcHVzaChgJHthcmcoJ3VybCAnKX0ke2Zvcm1hdHRlZFVybH1gKTtcblxuICAgIGlmIChpbnNlY3VyZVNraXBWZXJpZnkpIHtcbiAgICAgIHB1c2goYXJnKCdpbnNlY3VyZScpKTtcbiAgICB9XG5cbiAgICBpZiAoaHR0cFZlcnNpb24gPT09ICdIVFRQLzEuMCcpIHtcbiAgICAgIHB1c2goYXJnKCdodHRwMS4wJykpO1xuICAgIH1cblxuICAgIGlmIChnZXRIZWFkZXIoYWxsSGVhZGVycywgJ2FjY2VwdC1lbmNvZGluZycpKSB7XG4gICAgICAvLyBub3RlOiB0aGVyZSBpcyBubyBzaG9ydGhhbmQgZm9yIHRoaXMgY1VSTCBvcHRpb25cbiAgICAgIHB1c2goJy0tY29tcHJlc3NlZCcpO1xuICAgIH1cblxuICAgIC8vIGlmIG11bHRpcGFydCBmb3JtIGRhdGEsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBib3VuZGFyeVxuICAgIGlmIChwb3N0RGF0YS5taW1lVHlwZSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKSB7XG4gICAgICBjb25zdCBjb250ZW50VHlwZUhlYWRlck5hbWUgPSBnZXRIZWFkZXJOYW1lKGhlYWRlcnNPYmosICdjb250ZW50LXR5cGUnKTtcbiAgICAgIGlmIChjb250ZW50VHlwZUhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGVIZWFkZXIgPSBoZWFkZXJzT2JqW2NvbnRlbnRUeXBlSGVhZGVyTmFtZV07XG4gICAgICAgIGlmIChjb250ZW50VHlwZUhlYWRlck5hbWUgJiYgY29udGVudFR5cGVIZWFkZXIpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGxlYWRpbmcgc2VtaSBjb2xvbiBhbmQgYm91bmRhcnlcbiAgICAgICAgICAvLyB1cCB0byB0aGUgbmV4dCBzZW1pIGNvbG9uIG9yIHRoZSBlbmQgb2Ygc3RyaW5nXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpdCBpcyBhIHJlYWxpdHkgdGhhdCB0aGUgaGVhZGVyc09iaiBjYW4gaGF2ZSB2YWx1ZXMgd2hpY2ggYXJlIHN0cmluZyBhcnJheXMuICBUaGlzIGlzIGEgZ2VudWluZSBidWcgdGhhdCB0aGlzIGNhc2UgaXNuJ3QgaGFuZGxlZCBvciB0ZXN0ZWQuICBJdCBpcywgaG93ZXZlciB0ZXN0ZWQgaW4gYHJlZHVjZXIudGVzdC50c2AuICBHbyBjaGVjayB0aGF0IG91dCB0byBzZWUgbW9yZS5cbiAgICAgICAgICBjb25zdCBub0JvdW5kYXJ5ID0gY29udGVudFR5cGVIZWFkZXIucmVwbGFjZSgvOyBib3VuZGFyeS4rPyg/PSg7fCQpKS8sICcnKTtcblxuICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIgd2l0aCBubyBib3VuZGFyeSBpbiBib3RoIGhlYWRlcnNPYmogYW5kIGFsbEhlYWRlcnNcbiAgICAgICAgICBoZWFkZXJzT2JqW2NvbnRlbnRUeXBlSGVhZGVyTmFtZV0gPSBub0JvdW5kYXJ5O1xuICAgICAgICAgIGFsbEhlYWRlcnNbY29udGVudFR5cGVIZWFkZXJOYW1lXSA9IG5vQm91bmRhcnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgaGVhZGVyc1xuICAgIE9iamVjdC5rZXlzKGhlYWRlcnNPYmopXG4gICAgICAuc29ydCgpXG4gICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBgJHtrZXl9OiAke2hlYWRlcnNPYmpba2V5XX1gO1xuICAgICAgICBwdXNoKGAke2FyZygnaGVhZGVyJyl9ICR7cXVvdGUoaGVhZGVyKX1gKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGFsbEhlYWRlcnMuY29va2llKSB7XG4gICAgICBwdXNoKGAke2FyZygnY29va2llJyl9ICR7cXVvdGUoYWxsSGVhZGVycy5jb29raWUgYXMgc3RyaW5nKX1gKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgcG9zdCBwYXJhbXNcbiAgICBzd2l0Y2ggKHBvc3REYXRhLm1pbWVUeXBlKSB7XG4gICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgcG9zdERhdGEucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBsZXQgcG9zdCA9ICcnO1xuICAgICAgICAgIGlmIChwYXJhbS5maWxlTmFtZSkge1xuICAgICAgICAgICAgcG9zdCA9IGAke3BhcmFtLm5hbWV9PUAke3BhcmFtLmZpbGVOYW1lfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc3QgPSBgJHtwYXJhbS5uYW1lfT0ke3BhcmFtLnZhbHVlfWA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaChgJHthcmcoJ2Zvcm0nKX0gJHtxdW90ZShwb3N0KX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICBpZiAocG9zdERhdGEucGFyYW1zKSB7XG4gICAgICAgICAgcG9zdERhdGEucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5lbmNvZGVkID0gcGFyYW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBuZWVkc0VuY29kaW5nID0gZW5jb2RlZCAhPT0gdW5lbmNvZGVkO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5lZWRzRW5jb2RpbmcgPyBlbmNvZGVkIDogdW5lbmNvZGVkO1xuICAgICAgICAgICAgY29uc3QgZmxhZyA9IGJpbmFyeSA/ICctLWRhdGEtYmluYXJ5JyA6IGAtLWRhdGEke25lZWRzRW5jb2RpbmcgPyAnLXVybGVuY29kZScgOiAnJ31gO1xuICAgICAgICAgICAgcHVzaChgJHtmbGFnfSAke3F1b3RlKGAke25hbWV9PSR7cGFyYW0udmFsdWV9YCl9YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaChgJHtiaW5hcnkgPyAnLS1kYXRhLWJpbmFyeScgOiBhcmcoJ2RhdGEnKX0gJHtxdW90ZShwb3N0RGF0YS50ZXh0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyByYXcgcmVxdWVzdCBib2R5XG4gICAgICAgIGlmICghcG9zdERhdGEudGV4dCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmxhZyA9IGJpbmFyeSA/ICctLWRhdGEtYmluYXJ5JyA6IGFyZygnZGF0YScpO1xuXG4gICAgICAgIGxldCBidWlsdFBheWxvYWQgPSBmYWxzZTtcbiAgICAgICAgLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgSlNPTiB2YXJpYW50LCBhbmQgb3VyIHBheWxvYWQgaXMgSlNPTiBsZXQncyBtYWtlIGl0IGxvb2sgYSBsaXR0bGUgbmljZXIuXG4gICAgICAgIGlmIChpc01pbWVUeXBlSlNPTihwb3N0RGF0YS5taW1lVHlwZSkpIHtcbiAgICAgICAgICAvLyBJZiBvdXIgcG9zdERhdGEgaXMgbGVzcyB0aGFuIDIwIGNoYXJhY3RlcnMsIGxldCdzIGtlZXAgaXQgYWxsIG9uIG9uZSBsaW5lIHNvIGFzIHRvIG5vdCBtYWtlIHRoZSBzbmlwcGV0IG92ZXJseSBsZW5ndGh5LlxuICAgICAgICAgIGNvbnN0IGNvdWxkQmVKU09OID0gcG9zdERhdGEudGV4dC5sZW5ndGggPiAyO1xuICAgICAgICAgIGlmIChjb3VsZEJlSlNPTiAmJiBwcmV0dGlmeUpzb24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGpzb25QYXlsb2FkID0gSlNPTi5wYXJzZShwb3N0RGF0YS50ZXh0KTtcblxuICAgICAgICAgICAgICAvLyBJZiB0aGUgSlNPTiBvYmplY3QgaGFzIGEgc2luZ2xlIHF1b3RlIHdlIHNob3VsZCBwcmVwYXJlIGl0IGluc2lkZSBvZiBhIEhFUkVET0MgYmVjYXVzZSB0aGUgc2luZ2xlIHF1b3RlIGluIHNvbWV0aGluZyBsaWtlIGBzdHJpbmcnc2AgY2FuJ3QgYmUgZXNjYXBlZCB3aGVuIHVzZWQgd2l0aCBgLS1kYXRhYC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gQmFzaWNhbGx5IHRoaXMgYm9pbHMgZG93biB0byBgLS1kYXRhIEAtIDw8RU9GLi4uRU9GYCB2cyBgLS1kYXRhICcuLi4nYC5cbiAgICAgICAgICAgICAgYnVpbHRQYXlsb2FkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoanNvblBheWxvYWQsIHVuZGVmaW5lZCwgaW5kZW50IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgIGlmIChwb3N0RGF0YS50ZXh0LmluZGV4T2YoXCInXCIpID4gMCkge1xuICAgICAgICAgICAgICAgIHB1c2goYCR7ZmxhZ30gQC0gPDxFT0ZcXG4ke3BheWxvYWR9XFxuRU9GYCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaChgJHtmbGFnfSAnXFxuJHtwYXlsb2FkfVxcbidgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIG5vLW9wXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFidWlsdFBheWxvYWQpIHtcbiAgICAgICAgICBwdXNoKGAke2ZsYWd9ICR7cXVvdGUocG9zdERhdGEudGV4dCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIHRoZSBTaGVsbCB1c2luZyBIVFRQaWUuXG4gKlxuICogQGF1dGhvclxuICogQEFobWFkTmFzc3JpXG4gKlxuICogZm9yIGFueSBxdWVzdGlvbnMgb3IgaXNzdWVzIHJlZ2FyZGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldCwgcGxlYXNlIG9wZW4gYW4gaXNzdWUgbWVudGlvbmluZyB0aGUgYXV0aG9yLlxuICovXG5cbmltcG9ydCB7IENvZGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgcXVvdGUgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL3NoZWxsJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBpZU9wdGlvbnMge1xuICBib2R5PzogYm9vbGVhbjtcbiAgY2VydD86IGJvb2xlYW47XG4gIGhlYWRlcnM/OiBib29sZWFuO1xuICBwcmV0dHk/OiBib29sZWFuO1xuICBwcmludD86IGJvb2xlYW47XG4gIHF1ZXJ5UGFyYW1zPzogYm9vbGVhbjtcbiAgc2hvcnQ/OiBib29sZWFuO1xuICBzdHlsZT86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgdmVyaWZ5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBpZTogQ2xpZW50PEh0dHBpZU9wdGlvbnM+ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnaHR0cGllJyxcbiAgICB0aXRsZTogJ0hUVFBpZScsXG4gICAgbGluazogJ2h0dHA6Ly9odHRwaWUub3JnLycsXG4gICAgZGVzY3JpcHRpb246ICdhIENMSSwgY1VSTC1saWtlIHRvb2wgZm9yIGh1bWFucycsXG4gIH0sXG4gIGNvbnZlcnQ6ICh7IGFsbEhlYWRlcnMsIHBvc3REYXRhLCBxdWVyeU9iaiwgZnVsbFVybCwgbWV0aG9kLCB1cmwgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBib2R5OiBmYWxzZSxcbiAgICAgIGNlcnQ6IGZhbHNlLFxuICAgICAgaGVhZGVyczogZmFsc2UsXG4gICAgICBpbmRlbnQ6ICcgICcsXG4gICAgICBwcmV0dHk6IGZhbHNlLFxuICAgICAgcHJpbnQ6IGZhbHNlLFxuICAgICAgcXVlcnlQYXJhbXM6IGZhbHNlLFxuICAgICAgc2hvcnQ6IGZhbHNlLFxuICAgICAgc3R5bGU6IGZhbHNlLFxuICAgICAgdGltZW91dDogZmFsc2UsXG4gICAgICB2ZXJib3NlOiBmYWxzZSxcbiAgICAgIHZlcmlmeTogZmFsc2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCB7IHB1c2gsIGpvaW4sIHVuc2hpZnQgfSA9IG5ldyBDb2RlQnVpbGRlcih7XG4gICAgICBpbmRlbnQ6IG9wdHMuaW5kZW50LFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBTRUVNUyBMRUdJVFxuICAgICAgam9pbjogb3B0cy5pbmRlbnQgIT09IGZhbHNlID8gYCBcXFxcXFxuJHtvcHRzLmluZGVudH1gIDogJyAnLFxuICAgIH0pO1xuXG4gICAgbGV0IHJhdyA9IGZhbHNlO1xuICAgIGNvbnN0IGZsYWdzID0gW107XG5cbiAgICBpZiAob3B0cy5oZWFkZXJzKSB7XG4gICAgICBmbGFncy5wdXNoKG9wdHMuc2hvcnQgPyAnLWgnIDogJy0taGVhZGVycycpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmJvZHkpIHtcbiAgICAgIGZsYWdzLnB1c2gob3B0cy5zaG9ydCA/ICctYicgOiAnLS1ib2R5Jyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMudmVyYm9zZSkge1xuICAgICAgZmxhZ3MucHVzaChvcHRzLnNob3J0ID8gJy12JyA6ICctLXZlcmJvc2UnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5wcmludCkge1xuICAgICAgZmxhZ3MucHVzaChgJHtvcHRzLnNob3J0ID8gJy1wJyA6ICctLXByaW50J309JHtvcHRzLnByaW50fWApO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnZlcmlmeSkge1xuICAgICAgZmxhZ3MucHVzaChgLS12ZXJpZnk9JHtvcHRzLnZlcmlmeX1gKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jZXJ0KSB7XG4gICAgICBmbGFncy5wdXNoKGAtLWNlcnQ9JHtvcHRzLmNlcnR9YCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucHJldHR5KSB7XG4gICAgICBmbGFncy5wdXNoKGAtLXByZXR0eT0ke29wdHMucHJldHR5fWApO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnN0eWxlKSB7XG4gICAgICBmbGFncy5wdXNoKGAtLXN0eWxlPSR7b3B0cy5zdHlsZX1gKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy50aW1lb3V0KSB7XG4gICAgICBmbGFncy5wdXNoKGAtLXRpbWVvdXQ9JHtvcHRzLnRpbWVvdXR9YCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IHF1ZXJ5IHBhcmFtc1xuICAgIGlmIChvcHRzLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICBPYmplY3Qua2V5cyhxdWVyeU9iaikuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBxdWVyeU9ialtuYW1lXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICBwdXNoKGAke25hbWV9PT0ke3F1b3RlKHZhbCl9YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaChgJHtuYW1lfT09JHtxdW90ZSh2YWx1ZSl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBoZWFkZXJzXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycylcbiAgICAgIC5zb3J0KClcbiAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHB1c2goYCR7a2V5fToke3F1b3RlKGFsbEhlYWRlcnNba2V5XSBhcyBzdHJpbmcpfWApO1xuICAgICAgfSk7XG5cbiAgICBpZiAocG9zdERhdGEubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgICAvLyBjb25zdHJ1Y3QgcG9zdCBwYXJhbXNcbiAgICAgIGlmIChwb3N0RGF0YS5wYXJhbXMgJiYgcG9zdERhdGEucGFyYW1zLmxlbmd0aCkge1xuICAgICAgICBmbGFncy5wdXNoKG9wdHMuc2hvcnQgPyAnLWYnIDogJy0tZm9ybScpO1xuXG4gICAgICAgIHBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICBwdXNoKGAke3BhcmFtLm5hbWV9PSR7cXVvdGUocGFyYW0udmFsdWUpfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmF3ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjbGlGbGFncyA9IGZsYWdzLmxlbmd0aCA/IGAke2ZsYWdzLmpvaW4oJyAnKX0gYCA6ICcnO1xuICAgIHVybCA9IHF1b3RlKG9wdHMucXVlcnlQYXJhbXMgPyB1cmwgOiBmdWxsVXJsKTtcbiAgICB1bnNoaWZ0KGBodHRwICR7Y2xpRmxhZ3N9JHttZXRob2R9ICR7dXJsfWApO1xuXG4gICAgaWYgKHJhdyAmJiBwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBjb25zdCBwb3N0RGF0YVRleHQgPSBxdW90ZShwb3N0RGF0YS50ZXh0KTtcbiAgICAgIHVuc2hpZnQoYGVjaG8gJHtwb3N0RGF0YVRleHR9IHwgYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW4oKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi90YXJnZXRzJztcbmltcG9ydCB7IGN1cmwgfSBmcm9tICcuL2N1cmwvY2xpZW50JztcbmltcG9ydCB7IGh0dHBpZSB9IGZyb20gJy4vaHR0cGllL2NsaWVudCc7XG5pbXBvcnQgeyB3Z2V0IH0gZnJvbSAnLi93Z2V0L2NsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBzaGVsbDogVGFyZ2V0ID0ge1xuICBpbmZvOiB7XG4gICAga2V5OiAnc2hlbGwnLFxuICAgIHRpdGxlOiAnU2hlbGwnLFxuICAgIGV4dG5hbWU6ICcuc2gnLFxuICAgIGRlZmF1bHQ6ICdjdXJsJyxcbiAgfSxcbiAgY2xpZW50c0J5SWQ6IHtcbiAgICBjdXJsLFxuICAgIGh0dHBpZSxcbiAgICB3Z2V0LFxuICB9LFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIHRoZSBTaGVsbCB1c2luZyBXZ2V0LlxuICpcbiAqIEBhdXRob3JcbiAqIEBBaG1hZE5hc3NyaVxuICpcbiAqIGZvciBhbnkgcXVlc3Rpb25zIG9yIGlzc3VlcyByZWdhcmRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIG1lbnRpb25pbmcgdGhlIGF1dGhvci5cbiAqL1xuXG5pbXBvcnQgeyBDb2RlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvY29kZS1idWlsZGVyJztcbmltcG9ydCB7IGVzY2FwZSwgcXVvdGUgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL3NoZWxsJztcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL3RhcmdldHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdnZXRPcHRpb25zIHtcbiAgc2hvcnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHdnZXQ6IENsaWVudDxXZ2V0T3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICd3Z2V0JyxcbiAgICB0aXRsZTogJ1dnZXQnLFxuICAgIGxpbms6ICdodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3dnZXQvJyxcbiAgICBkZXNjcmlwdGlvbjogJ2EgZnJlZSBzb2Z0d2FyZSBwYWNrYWdlIGZvciByZXRyaWV2aW5nIGZpbGVzIHVzaW5nIEhUVFAsIEhUVFBTJyxcbiAgfSxcbiAgY29udmVydDogKHsgbWV0aG9kLCBwb3N0RGF0YSwgYWxsSGVhZGVycywgZnVsbFVybCB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGluZGVudDogJyAgJyxcbiAgICAgIHNob3J0OiBmYWxzZSxcbiAgICAgIHZlcmJvc2U6IGZhbHNlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBwdXNoLCBqb2luIH0gPSBuZXcgQ29kZUJ1aWxkZXIoe1xuICAgICAgaW5kZW50OiBvcHRzLmluZGVudCxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgU0VFTVMgTEVHSVRcbiAgICAgIGpvaW46IG9wdHMuaW5kZW50ICE9PSBmYWxzZSA/IGAgXFxcXFxcbiR7b3B0cy5pbmRlbnR9YCA6ICcgJyxcbiAgICB9KTtcblxuICAgIGlmIChvcHRzLnZlcmJvc2UpIHtcbiAgICAgIHB1c2goYHdnZXQgJHtvcHRzLnNob3J0ID8gJy12JyA6ICctLXZlcmJvc2UnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKGB3Z2V0ICR7b3B0cy5zaG9ydCA/ICctcScgOiAnLS1xdWlldCd9YCk7XG4gICAgfVxuXG4gICAgcHVzaChgLS1tZXRob2QgJHtxdW90ZShtZXRob2QpfWApO1xuXG4gICAgT2JqZWN0LmtleXMoYWxsSGVhZGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyID0gYCR7a2V5fTogJHthbGxIZWFkZXJzW2tleV19YDtcbiAgICAgIHB1c2goYC0taGVhZGVyICR7cXVvdGUoaGVhZGVyKX1gKTtcbiAgICB9KTtcblxuICAgIGlmIChwb3N0RGF0YS50ZXh0KSB7XG4gICAgICBwdXNoKGAtLWJvZHktZGF0YSAke2VzY2FwZShxdW90ZShwb3N0RGF0YS50ZXh0KSl9YCk7XG4gICAgfVxuXG4gICAgcHVzaChvcHRzLnNob3J0ID8gJy1PJyA6ICctLW91dHB1dC1kb2N1bWVudCcpO1xuICAgIHB1c2goYC0gJHtxdW90ZShmdWxsVXJsKX1gKTtcblxuICAgIHJldHVybiBqb2luKCk7XG4gIH0sXG59O1xuIiwiLyoqXG4gKiBDcmVhdGUgYW4gc3RyaW5nIG9mIGdpdmVuIGxlbmd0aCBmaWxsZWQgd2l0aCBibGFuayBzcGFjZXNcbiAqXG4gKiBAcGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgYXJyYXkgdG8gcmV0dXJuXG4gKiBAcGFyYW0gc3RyIFN0cmluZyB0byBwYWQgb3V0IHdpdGhcbiAqL1xuY29uc3QgYnVpbGRTdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIsIHN0cjogc3RyaW5nKSA9PiBzdHIucmVwZWF0KGxlbmd0aCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSBEaWN0aW9uYXJ5IG9yIEFycmF5IGxpdGVyYWwgcmVwcmVzZW50YXRpb24gd2l0aCBwcmV0dHkgb3B0aW9uIGFuZCBpbmRlbnRhdGlvbi5cbiAqL1xuY29uc3QgY29uY2F0QXJyYXkgPSA8VD4oYXJyOiBUW10sIHByZXR0eTogYm9vbGVhbiwgaW5kZW50YXRpb246IHN0cmluZywgaW5kZW50TGV2ZWw6IG51bWJlcikgPT4ge1xuICBjb25zdCBjdXJyZW50SW5kZW50ID0gYnVpbGRTdHJpbmcoaW5kZW50TGV2ZWwsIGluZGVudGF0aW9uKTtcbiAgY29uc3QgY2xvc2luZ0JyYWNlSW5kZW50ID0gYnVpbGRTdHJpbmcoaW5kZW50TGV2ZWwgLSAxLCBpbmRlbnRhdGlvbik7XG4gIGNvbnN0IGpvaW4gPSBwcmV0dHkgPyBgLFxcbiR7Y3VycmVudEluZGVudH1gIDogJywgJztcblxuICBpZiAocHJldHR5KSB7XG4gICAgcmV0dXJuIGBbXFxuJHtjdXJyZW50SW5kZW50fSR7YXJyLmpvaW4oam9pbil9XFxuJHtjbG9zaW5nQnJhY2VJbmRlbnR9XWA7XG4gIH1cbiAgcmV0dXJuIGBbJHthcnIuam9pbihqb2luKX1dYDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSB2YWxpZCBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgYSBTd2lmdCBhcnJheSBvciBkaWN0aW9uYXJ5IGxpdGVyYWxcbiAqXG4gKiBAcGFyYW0gbmFtZSBEZXNpcmVkIG5hbWUgb2YgdGhlIGluc3RhbmNlXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBLZXktdmFsdWUgb2JqZWN0IG9mIHBhcmFtZXRlcnMgdG8gdHJhbnNsYXRlIHRvIGEgU3dpZnQgb2JqZWN0IGxpdGVhcmFsXG4gKiBAcGFyYW0gb3B0cyBUYXJnZXQgb3B0aW9uc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgbGl0ZXJhbERlY2xhcmF0aW9uID0gPFQsIFU+KG5hbWU6IHN0cmluZywgcGFyYW1ldGVyczogVCwgb3B0czogVSkgPT5cbiAgYGxldCAke25hbWV9ID0gJHtsaXRlcmFsUmVwcmVzZW50YXRpb24ocGFyYW1ldGVycywgb3B0cyl9YDtcblxuLyoqXG4gKiBDcmVhdGUgYSB2YWxpZCBTd2lmdCBzdHJpbmcgb2YgYSBsaXRlcmFsIHZhbHVlIGFjY29yZGluZyB0byBpdHMgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgQW55IEphdmFTY3JpcHQgbGl0ZXJhbFxuICogQHBhcmFtIG9wdHMgVGFyZ2V0IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGxpdGVyYWxSZXByZXNlbnRhdGlvbiA9IDxULCBVPihcbiAgdmFsdWU6IFQsXG4gIG9wdHM6IFUsXG4gIGluZGVudExldmVsPzogbnVtYmVyLFxuKTogbnVtYmVyIHwgc3RyaW5nID0+IHtcbiAgaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbCA9PT0gdW5kZWZpbmVkID8gMSA6IGluZGVudExldmVsICsgMTtcblxuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpIHtcbiAgICBjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuICAgICAgcmV0dXJuIHZhbHVlIGFzIHVua25vd24gYXMgbnVtYmVyO1xuXG4gICAgY2FzZSAnW29iamVjdCBBcnJheV0nOiB7XG4gICAgICAvLyBEb24ndCBwcmV0dGlmeSBhcnJheXMgbnRvIG5vdCB0YWtlIHRvbyBtdWNoIHNwYWNlXG4gICAgICBsZXQgcHJldHR5ID0gZmFsc2U7XG4gICAgICBjb25zdCB2YWx1ZXNSZXByZXNlbnRhdGlvbiA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIGFueVtdKS5tYXAoKHY6IGFueSkgPT4ge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gcHJldHRpZnkgaWYgdGhlIHZhbHVlIGlzIGEgZGljdGlvbmFyeSB3aXRoIG11bHRpcGxlIGtleXNcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgICBwcmV0dHkgPSBPYmplY3Qua2V5cyh2KS5sZW5ndGggPiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXRlcmFsUmVwcmVzZW50YXRpb24odiwgb3B0cywgaW5kZW50TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lZWRzIGJldHRlciB0eXBlc1xuICAgICAgcmV0dXJuIGNvbmNhdEFycmF5KHZhbHVlc1JlcHJlc2VudGF0aW9uLCBwcmV0dHksIG9wdHMuaW5kZW50LCBpbmRlbnRMZXZlbCk7XG4gICAgfVxuXG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzoge1xuICAgICAgY29uc3Qga2V5VmFsdWVQYWlycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAga2V5VmFsdWVQYWlycy5wdXNoKGBcIiR7a2V5fVwiOiAke2xpdGVyYWxSZXByZXNlbnRhdGlvbih2YWx1ZVtrZXldLCBvcHRzLCBpbmRlbnRMZXZlbCl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uY2F0QXJyYXkoXG4gICAgICAgIGtleVZhbHVlUGFpcnMsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVlZHMgYmV0dGVyIHR5cGVzXG4gICAgICAgIG9wdHMucHJldHR5ICYmIGtleVZhbHVlUGFpcnMubGVuZ3RoID4gMSxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkcyBiZXR0ZXIgdHlwZXNcbiAgICAgICAgb3B0cy5pbmRlbnQsXG4gICAgICAgIGluZGVudExldmVsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgIHJldHVybiAodmFsdWUgYXMgdW5rbm93biBhcyBib29sZWFuKS50b1N0cmluZygpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgXCIkeyh2YWx1ZSBhcyBhbnkpLnRvU3RyaW5nKCkucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbiAgfVxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVFRQIGNvZGUgc25pcHBldCBnZW5lcmF0b3IgZm9yIFN3aWZ0IHVzaW5nIE5TVVJMU2Vzc2lvbi5cbiAqXG4gKiBAYXV0aG9yXG4gKiBAdGhpYmF1bHRDaGFcbiAqXG4gKiBmb3IgYW55IHF1ZXN0aW9ucyBvciBpc3N1ZXMgcmVnYXJkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LCBwbGVhc2Ugb3BlbiBhbiBpc3N1ZSBtZW50aW9uaW5nIHRoZSBhdXRob3IuXG4gKi9cblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZGUtYnVpbGRlcic7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi90YXJnZXRzJztcbmltcG9ydCB7IGxpdGVyYWxEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5zdXJsc2Vzc2lvbk9wdGlvbnMge1xuICBwcmV0dHk/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgbnN1cmxzZXNzaW9uOiBDbGllbnQ8TnN1cmxzZXNzaW9uT3B0aW9ucz4gPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICduc3VybHNlc3Npb24nLFxuICAgIHRpdGxlOiAnTlNVUkxTZXNzaW9uJyxcbiAgICBsaW5rOiAnaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjL2RvY3VtZW50YXRpb24vRm91bmRhdGlvbi9SZWZlcmVuY2UvTlNVUkxTZXNzaW9uX2NsYXNzL2luZGV4Lmh0bWwnLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZvdW5kYXRpb24ncyBOU1VSTFNlc3Npb24gcmVxdWVzdFwiLFxuICB9LFxuICBjb252ZXJ0OiAoeyBhbGxIZWFkZXJzLCBwb3N0RGF0YSwgZnVsbFVybCwgbWV0aG9kIH0sIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgaW5kZW50OiAnICAnLFxuICAgICAgcHJldHR5OiB0cnVlLFxuICAgICAgdGltZW91dDogJzEwJyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgcHVzaCwgYmxhbmssIGpvaW4gfSA9IG5ldyBDb2RlQnVpbGRlcih7IGluZGVudDogb3B0cy5pbmRlbnQgfSk7XG5cbiAgICAvLyBNYXJrZXJzIGZvciBoZWFkZXJzIHRvIGJlIGNyZWF0ZWQgYXMgbGl0dGVyYWwgb2JqZWN0cyBhbmQgbGF0ZXIgYmUgc2V0IG9uIHRoZSBOU1VSTFJlcXVlc3QgaWYgZXhpc3RcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBoYXNIZWFkZXJzOiBmYWxzZSxcbiAgICAgIGhhc0JvZHk6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBXZSBqdXN0IHdhbnQgdG8gbWFrZSBzdXJlIHBlb3BsZSB1bmRlcnN0YW5kIHRoYXQgaXMgdGhlIG9ubHkgZGVwZW5kZW5jeVxuICAgIHB1c2goJ2ltcG9ydCBGb3VuZGF0aW9uJyk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYWxsSGVhZGVycykubGVuZ3RoKSB7XG4gICAgICByZXEuaGFzSGVhZGVycyA9IHRydWU7XG4gICAgICBibGFuaygpO1xuICAgICAgcHVzaChsaXRlcmFsRGVjbGFyYXRpb24oJ2hlYWRlcnMnLCBhbGxIZWFkZXJzLCBvcHRzKSk7XG4gICAgfVxuXG4gICAgaWYgKHBvc3REYXRhLnRleHQgfHwgcG9zdERhdGEuanNvbk9iaiB8fCBwb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgIHJlcS5oYXNCb2R5ID0gdHJ1ZTtcblxuICAgICAgc3dpdGNoIChwb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOlxuICAgICAgICAgIC8vIEJ5IGFwcGVuZGluZyBwYXJhbWV0ZXJzIG9uZSBieSBvbmUgaW4gdGhlIHJlc3VsdGluZyBzbmlwcGV0LFxuICAgICAgICAgIC8vIHdlIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgdXNlciB0byBlZGl0IGl0IGFjY29yZGluZyB0byBoaXMgb3IgaGVyIG5lZWRzIGFmdGVyIHBhc3RpbmcuXG4gICAgICAgICAgLy8gVGhlIHVzZXIgY2FuIGp1c3QgYWRkL3JlbW92ZSBsaW5lcyBhZGRpbmcvcmVtb3ZpbmcgYm9keSBwYXJhbWV0ZXJzLlxuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgaWYgKHBvc3REYXRhLnBhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBwb3N0RGF0YS5wYXJhbXM7XG4gICAgICAgICAgICBwdXNoKFxuICAgICAgICAgICAgICBgbGV0IHBvc3REYXRhID0gTlNNdXRhYmxlRGF0YShkYXRhOiBcIiR7aGVhZC5uYW1lfT0ke2hlYWQudmFsdWV9XCIuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRhaWwuZm9yRWFjaCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgIHB1c2goYHBvc3REYXRhLmFwcGVuZChcIiYke25hbWV9PSR7dmFsdWV9XCIuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISlgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXEuaGFzQm9keSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgICBpZiAocG9zdERhdGEuanNvbk9iaikge1xuICAgICAgICAgICAgcHVzaChgJHtsaXRlcmFsRGVjbGFyYXRpb24oJ3BhcmFtZXRlcnMnLCBwb3N0RGF0YS5qc29uT2JqLCBvcHRzKX0gYXMgW1N0cmluZyA6IEFueV1gKTtcbiAgICAgICAgICAgIGJsYW5rKCk7XG5cbiAgICAgICAgICAgIHB1c2goJ2xldCBwb3N0RGF0YSA9IEpTT05TZXJpYWxpemF0aW9uLmRhdGEod2l0aEpTT05PYmplY3Q6IHBhcmFtZXRlcnMsIG9wdGlvbnM6IFtdKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtdWx0aXBhcnQvZm9ybS1kYXRhJzpcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBCeSBhcHBlbmRpbmcgbXVsdGlwYXJ0IHBhcmFtZXRlcnMgb25lIGJ5IG9uZSBpbiB0aGUgcmVzdWx0aW5nIHNuaXBwZXQsXG4gICAgICAgICAgICogd2UgbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSB1c2VyIHRvIGVkaXQgaXQgYWNjb3JkaW5nIHRvIGhpcyBvciBoZXIgbmVlZHMgYWZ0ZXIgcGFzdGluZy5cbiAgICAgICAgICAgKiBUaGUgdXNlciBjYW4ganVzdCBlZGl0IHRoZSBwYXJhbWV0ZXJzIE5TRGljdGlvbmFyeSBvciBwdXQgdGhpcyBwYXJ0IG9mIGEgc25pcHBldCBpbiBhIG11bHRpcGFydCBidWlsZGVyIG1ldGhvZC5cbiAgICAgICAgICAgKi9cblxuICAgICAgICAgIHB1c2gobGl0ZXJhbERlY2xhcmF0aW9uKCdwYXJhbWV0ZXJzJywgcG9zdERhdGEucGFyYW1zLCBvcHRzKSk7XG4gICAgICAgICAgYmxhbmsoKTtcbiAgICAgICAgICBwdXNoKGBsZXQgYm91bmRhcnkgPSBcIiR7cG9zdERhdGEuYm91bmRhcnl9XCJgKTtcbiAgICAgICAgICBibGFuaygpO1xuICAgICAgICAgIHB1c2goJ3ZhciBib2R5ID0gXCJcIicpO1xuICAgICAgICAgIHB1c2goJ3ZhciBlcnJvcjogTlNFcnJvcj8gPSBuaWwnKTtcbiAgICAgICAgICBwdXNoKCdmb3IgcGFyYW0gaW4gcGFyYW1ldGVycyB7Jyk7XG4gICAgICAgICAgcHVzaCgnbGV0IHBhcmFtTmFtZSA9IHBhcmFtW1wibmFtZVwiXSEnLCAxKTtcbiAgICAgICAgICBwdXNoKCdib2R5ICs9IFwiLS1cXFxcKGJvdW5kYXJ5KVxcXFxyXFxcXG5cIicsIDEpO1xuICAgICAgICAgIHB1c2goJ2JvZHkgKz0gXCJDb250ZW50LURpc3Bvc2l0aW9uOmZvcm0tZGF0YTsgbmFtZT1cXFxcXCJcXFxcKHBhcmFtTmFtZSlcXFxcXCJcIicsIDEpO1xuICAgICAgICAgIHB1c2goJ2lmIGxldCBmaWxlbmFtZSA9IHBhcmFtW1wiZmlsZU5hbWVcIl0geycsIDEpO1xuICAgICAgICAgIHB1c2goJ2xldCBjb250ZW50VHlwZSA9IHBhcmFtW1wiY29udGVudC10eXBlXCJdIScsIDIpO1xuICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAnbGV0IGZpbGVDb250ZW50ID0gU3RyaW5nKGNvbnRlbnRzT2ZGaWxlOiBmaWxlbmFtZSwgZW5jb2Rpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KScsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcHVzaCgnaWYgKGVycm9yICE9IG5pbCkgeycsIDIpO1xuICAgICAgICAgIHB1c2goJ3ByaW50KGVycm9yIGFzIEFueSknLCAzKTtcbiAgICAgICAgICBwdXNoKCd9JywgMik7XG4gICAgICAgICAgcHVzaCgnYm9keSArPSBcIjsgZmlsZW5hbWU9XFxcXFwiXFxcXChmaWxlbmFtZSlcXFxcXCJcXFxcclxcXFxuXCInLCAyKTtcbiAgICAgICAgICBwdXNoKCdib2R5ICs9IFwiQ29udGVudC1UeXBlOiBcXFxcKGNvbnRlbnRUeXBlKVxcXFxyXFxcXG5cXFxcclxcXFxuXCInLCAyKTtcbiAgICAgICAgICBwdXNoKCdib2R5ICs9IGZpbGVDb250ZW50JywgMik7XG4gICAgICAgICAgcHVzaCgnfSBlbHNlIGlmIGxldCBwYXJhbVZhbHVlID0gcGFyYW1bXCJ2YWx1ZVwiXSB7JywgMSk7XG4gICAgICAgICAgcHVzaCgnYm9keSArPSBcIlxcXFxyXFxcXG5cXFxcclxcXFxuXFxcXChwYXJhbVZhbHVlKVwiJywgMik7XG4gICAgICAgICAgcHVzaCgnfScsIDEpO1xuICAgICAgICAgIHB1c2goJ30nKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJsYW5rKCk7XG4gICAgICAgICAgcHVzaChcbiAgICAgICAgICAgIGBsZXQgcG9zdERhdGEgPSBOU0RhdGEoZGF0YTogXCIke3Bvc3REYXRhLnRleHR9XCIuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISlgLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmxhbmsoKTtcblxuICAgIC8vIE5TVVJMUmVxdWVzdFVzZVByb3RvY29sQ2FjaGVQb2xpY3kgaXMgdGhlIGRlZmF1bHQgcG9saWN5LCBsZXQncyBqdXN0IGFsd2F5cyBzZXQgaXQgdG8gYXZvaWQgY29uZnVzaW9uLlxuICAgIHB1c2goYGxldCByZXF1ZXN0ID0gTlNNdXRhYmxlVVJMUmVxdWVzdCh1cmw6IE5TVVJMKHN0cmluZzogXCIke2Z1bGxVcmx9XCIpISBhcyBVUkwsYCk7XG4gICAgcHVzaCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlUG9saWN5OiAudXNlUHJvdG9jb2xDYWNoZVBvbGljeSwnKTtcbiAgICBwdXNoKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkcyBiZXR0ZXIgdHlwZXNcbiAgICAgIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SW50ZXJ2YWw6ICR7cGFyc2VJbnQob3B0cy50aW1lb3V0LCAxMCkudG9GaXhlZChcbiAgICAgICAgMSxcbiAgICAgICl9KWAsXG4gICAgKTtcbiAgICBwdXNoKGByZXF1ZXN0Lmh0dHBNZXRob2QgPSBcIiR7bWV0aG9kfVwiYCk7XG5cbiAgICBpZiAocmVxLmhhc0hlYWRlcnMpIHtcbiAgICAgIHB1c2goJ3JlcXVlc3QuYWxsSFRUUEhlYWRlckZpZWxkcyA9IGhlYWRlcnMnKTtcbiAgICB9XG5cbiAgICBpZiAocmVxLmhhc0JvZHkpIHtcbiAgICAgIHB1c2goJ3JlcXVlc3QuaHR0cEJvZHkgPSBwb3N0RGF0YSBhcyBEYXRhJyk7XG4gICAgfVxuXG4gICAgYmxhbmsoKTtcbiAgICAvLyBSZXRyaWV2aW5nIHRoZSBzaGFyZWQgc2Vzc2lvbiB3aWxsIGJlIGxlc3MgdmVyYm9zZSB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS5cblxuICAgIHB1c2goJ2xldCBzZXNzaW9uID0gVVJMU2Vzc2lvbi5zaGFyZWQnKTtcbiAgICBwdXNoKFxuICAgICAgJ2xldCBkYXRhVGFzayA9IHNlc3Npb24uZGF0YVRhc2sod2l0aDogcmVxdWVzdCBhcyBVUkxSZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogeyAoZGF0YSwgcmVzcG9uc2UsIGVycm9yKSAtPiBWb2lkIGluJyxcbiAgICApO1xuICAgIHB1c2goJ2lmIChlcnJvciAhPSBuaWwpIHsnLCAxKTtcbiAgICBwdXNoKCdwcmludChlcnJvciBhcyBBbnkpJywgMik7XG4gICAgcHVzaCgnfSBlbHNlIHsnLCAxKTsgLy8gQ2FzdGluZyB0aGUgTlNVUkxSZXNwb25zZSB0byBOU0hUVFBVUkxSZXNwb25zZSBzbyB0aGUgdXNlciBjYW4gc2VlIHRoZSBzdGF0dXMgICAgIC5cbiAgICBwdXNoKCdsZXQgaHR0cFJlc3BvbnNlID0gcmVzcG9uc2UgYXM/IEhUVFBVUkxSZXNwb25zZScsIDIpO1xuICAgIHB1c2goJ3ByaW50KGh0dHBSZXNwb25zZSknLCAyKTtcbiAgICBwdXNoKCd9JywgMSk7XG4gICAgcHVzaCgnfSknKTtcbiAgICBibGFuaygpO1xuICAgIHB1c2goJ2RhdGFUYXNrLnJlc3VtZSgpJyk7XG5cbiAgICByZXR1cm4gam9pbigpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFRhcmdldCB9IGZyb20gJy4uL3RhcmdldHMnO1xuaW1wb3J0IHsgbnN1cmxzZXNzaW9uIH0gZnJvbSAnLi9uc3VybHNlc3Npb24vY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IHN3aWZ0OiBUYXJnZXQgPSB7XG4gIGluZm86IHtcbiAgICBrZXk6ICdzd2lmdCcsXG4gICAgdGl0bGU6ICdTd2lmdCcsXG4gICAgZXh0bmFtZTogJy5zd2lmdCcsXG4gICAgZGVmYXVsdDogJ25zdXJsc2Vzc2lvbicsXG4gIH0sXG4gIGNsaWVudHNCeUlkOiB7XG4gICAgbnN1cmxzZXNzaW9uLFxuICB9LFxufTtcbiIsImltcG9ydCB7IE1lcmdlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ29kZUJ1aWxkZXJPcHRpb25zIH0gZnJvbSAnLi4vaGVscGVycy9jb2RlLWJ1aWxkZXInO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4uL2h0dHBzbmlwcGV0JztcbmltcG9ydCB7IGMgfSBmcm9tICcuL2MvdGFyZ2V0JztcbmltcG9ydCB7IGNsb2p1cmUgfSBmcm9tICcuL2Nsb2p1cmUvdGFyZ2V0JztcbmltcG9ydCB7IGNyeXN0YWwgfSBmcm9tICcuL2NyeXN0YWwvdGFyZ2V0JztcbmltcG9ydCB7IGNzaGFycCB9IGZyb20gJy4vY3NoYXJwL3RhcmdldCc7XG5pbXBvcnQgeyBnbyB9IGZyb20gJy4vZ28vdGFyZ2V0JztcbmltcG9ydCB7IGh0dHAgfSBmcm9tICcuL2h0dHAvdGFyZ2V0JztcbmltcG9ydCB7IGphdmEgfSBmcm9tICcuL2phdmEvdGFyZ2V0JztcbmltcG9ydCB7IGphdmFzY3JpcHQgfSBmcm9tICcuL2phdmFzY3JpcHQvdGFyZ2V0JztcbmltcG9ydCB7IGtvdGxpbiB9IGZyb20gJy4va290bGluL3RhcmdldCc7XG5pbXBvcnQgeyBub2RlIH0gZnJvbSAnLi9ub2RlL3RhcmdldCc7XG5pbXBvcnQgeyBvYmpjIH0gZnJvbSAnLi9vYmpjL3RhcmdldCc7XG5pbXBvcnQgeyBvY2FtbCB9IGZyb20gJy4vb2NhbWwvdGFyZ2V0JztcbmltcG9ydCB7IHBocCB9IGZyb20gJy4vcGhwL3RhcmdldCc7XG5pbXBvcnQgeyBwb3dlcnNoZWxsIH0gZnJvbSAnLi9wb3dlcnNoZWxsL3RhcmdldCc7XG5pbXBvcnQgeyBweXRob24gfSBmcm9tICcuL3B5dGhvbi90YXJnZXQnO1xuaW1wb3J0IHsgciB9IGZyb20gJy4vci90YXJnZXQnO1xuaW1wb3J0IHsgcnVieSB9IGZyb20gJy4vcnVieS90YXJnZXQnO1xuaW1wb3J0IHsgcnVzdCB9IGZyb20gJy4vcnVzdC90YXJnZXQnO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuL3NoZWxsL3RhcmdldCc7XG5pbXBvcnQgeyBzd2lmdCB9IGZyb20gJy4vc3dpZnQvdGFyZ2V0JztcblxuZXhwb3J0IHR5cGUgVGFyZ2V0SWQgPSBrZXlvZiB0eXBlb2YgdGFyZ2V0cztcblxuZXhwb3J0IHR5cGUgQ2xpZW50SWQgPSBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50SW5mbyB7XG4gIGtleTogQ2xpZW50SWQ7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGxpbms6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ29udmVydGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgb3B0aW9ucz86IE1lcmdlPENvZGVCdWlsZGVyT3B0aW9ucywgVD4sXG4pID0+IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIGluZm86IENsaWVudEluZm87XG4gIGNvbnZlcnQ6IENvbnZlcnRlcjxUPjtcbn1cblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uID0gYC4ke3N0cmluZ31gIHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRJbmZvIHtcbiAga2V5OiBUYXJnZXRJZDtcbiAgdGl0bGU6IHN0cmluZztcbiAgZXh0bmFtZTogRXh0ZW5zaW9uO1xuICBkZWZhdWx0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0IHtcbiAgaW5mbzogVGFyZ2V0SW5mbztcbiAgY2xpZW50c0J5SWQ6IFJlY29yZDxDbGllbnRJZCwgQ2xpZW50Pjtcbn1cblxuZXhwb3J0IGNvbnN0IHRhcmdldHMgPSB7XG4gIGMsXG4gIGNsb2p1cmUsXG4gIGNyeXN0YWwsXG4gIGNzaGFycCxcbiAgZ28sXG4gIGh0dHAsXG4gIGphdmEsXG4gIGphdmFzY3JpcHQsXG4gIGtvdGxpbixcbiAgbm9kZSxcbiAgb2JqYyxcbiAgb2NhbWwsXG4gIHBocCxcbiAgcG93ZXJzaGVsbCxcbiAgcHl0aG9uLFxuICByLFxuICBydWJ5LFxuICBydXN0LFxuICBzaGVsbCxcbiAgc3dpZnQsXG59O1xuXG5leHBvcnQgY29uc3QgaXNUYXJnZXQgPSAodGFyZ2V0OiBUYXJnZXQpOiB0YXJnZXQgaXMgVGFyZ2V0ID0+IHtcbiAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnIHx8IHRhcmdldCA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICBjb25zdCBnb3QgPSB0YXJnZXQgPT09IG51bGwgPyAnbnVsbCcgOiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyAnYXJyYXknIDogdHlwZW9mIHRhcmdldDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHlvdSB0cmllZCB0byBhZGQgYSB0YXJnZXQgd2hpY2ggaXMgbm90IGFuIG9iamVjdCwgZ290IHR5cGU6IFwiJHtnb3R9XCJgKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgJ2luZm8nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGNvbnRhaW4gYW4gYGluZm9gIG9iamVjdCcpO1xuICB9XG5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LmluZm8sICdrZXknKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSBga2V5YCcpO1xuICB9XG5cbiAgaWYgKCF0YXJnZXQuaW5mby5rZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldCBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0cywgdGFyZ2V0LmluZm8ua2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYSB0YXJnZXQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGlzIGtleSwgXFxgJHt0YXJnZXQuaW5mby5rZXl9XFxgYCk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQuaW5mbywgJ3RpdGxlJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldHMgbXVzdCBoYXZlIGFuIGBpbmZvYCBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydHkgYHRpdGxlYCcpO1xuICB9XG5cbiAgaWYgKCF0YXJnZXQuaW5mby50aXRsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0IHRpdGxlIG11c3QgYmUgYSBub24temVyby1sZW5ndGggc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQuaW5mbywgJ2V4dG5hbWUnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSBgZXh0bmFtZWAnKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgJ2NsaWVudHNCeUlkJykgfHxcbiAgICAhdGFyZ2V0LmNsaWVudHNCeUlkIHx8XG4gICAgT2JqZWN0LmtleXModGFyZ2V0LmNsaWVudHNCeUlkKS5sZW5ndGggPT09IDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIGNsaWVudHMgcHJvdmlkZWQgaW4gdGFyZ2V0ICR7dGFyZ2V0LmluZm8ua2V5fS4gIFlvdSBtdXN0IHByb3ZpZGUgdGhlIHByb3BlcnR5IFxcYGNsaWVudHNCeUlkXFxgIGNvbnRhaW5nIHlvdXIgY2xpZW50cy5gLFxuICAgICk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQuaW5mbywgJ2RlZmF1bHQnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSBgZGVmYXVsdGAnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldC5jbGllbnRzQnlJZCwgdGFyZ2V0LmluZm8uZGVmYXVsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgdGFyZ2V0ICR7dGFyZ2V0LmluZm8ua2V5fSBpcyBjb25maWd1cmVkIHdpdGggYSBkZWZhdWx0IGNsaWVudCAke1xuICAgICAgICB0YXJnZXQuaW5mby5kZWZhdWx0XG4gICAgICB9LCBidXQgbm8gc3VjaCBjbGllbnQgd2FzIGZvdW5kIGluIHRoZSBwcm9wZXJ0eSBcXGBjbGllbnRzQnlJZFxcYCAoZm91bmQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgT2JqZWN0LmtleXModGFyZ2V0LmNsaWVudHNCeUlkKSxcbiAgICAgICl9KWAsXG4gICAgKTtcbiAgfVxuXG4gIE9iamVjdC52YWx1ZXModGFyZ2V0LmNsaWVudHNCeUlkKS5mb3JFYWNoKGlzQ2xpZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYXJnZXQgPSAodGFyZ2V0OiBUYXJnZXQpID0+IHtcbiAgaWYgKCFpc1RhcmdldCh0YXJnZXQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRhcmdldHNbdGFyZ2V0LmluZm8ua2V5XSA9IHRhcmdldDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NsaWVudCA9IChjbGllbnQ6IENsaWVudCk6IGNsaWVudCBpcyBDbGllbnQgPT4ge1xuICBpZiAoIWNsaWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xpZW50cyBtdXN0IGJlIG9iamVjdHMnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNsaWVudCwgJ2luZm8nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0cyBjbGllbnQgbXVzdCBjb250YWluIGFuIGBpbmZvYCBvYmplY3QnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNsaWVudC5pbmZvLCAna2V5JykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldHMgY2xpZW50IG11c3QgaGF2ZSBhbiBgaW5mb2Agb2JqZWN0IHdpdGggcHJvcGVydHkgYGtleWAnKTtcbiAgfVxuXG4gIGlmICghY2xpZW50LmluZm8ua2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnQuaW5mby5rZXkgbXVzdCBjb250YWluIGFuIGlkZW50aWZpZXIgdW5pcXVlIHRvIHRoaXMgdGFyZ2V0Jyk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjbGllbnQuaW5mbywgJ3RpdGxlJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldHMgY2xpZW50IG11c3QgaGF2ZSBhbiBgaW5mb2Agb2JqZWN0IHdpdGggcHJvcGVydHkgYHRpdGxlYCcpO1xuICB9XG5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2xpZW50LmluZm8sICdkZXNjcmlwdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRzIGNsaWVudCBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHByb3BlcnR5IGBkZXNjcmlwdGlvbmAnKTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNsaWVudC5pbmZvLCAnbGluaycpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRzIGNsaWVudCBtdXN0IGhhdmUgYW4gYGluZm9gIG9iamVjdCB3aXRoIHByb3BlcnR5IGBsaW5rYCcpO1xuICB9XG5cbiAgaWYgKFxuICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2xpZW50LCAnY29udmVydCcpIHx8XG4gICAgdHlwZW9mIGNsaWVudC5jb252ZXJ0ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd0YXJnZXRzIGNsaWVudCBtdXN0IGhhdmUgYSBgY29udmVydGAgcHJvcGVydHkgY29udGFpbmluZyBhIGNvbnZlcnNpb24gZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYXJnZXRDbGllbnQgPSAodGFyZ2V0SWQ6IFRhcmdldElkLCBjbGllbnQ6IENsaWVudCkgPT4ge1xuICBpZiAoIWlzQ2xpZW50KGNsaWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXRzLCB0YXJnZXRJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvcnJ5LCBidXQgbm8gJHt0YXJnZXRJZH0gdGFyZ2V0IGV4aXN0cyB0byBhZGQgY2xpZW50cyB0b2ApO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXRzW3RhcmdldElkXSwgY2xpZW50LmluZm8ua2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB0aGUgdGFyZ2V0ICR7dGFyZ2V0SWR9IGFscmVhZHkgaGFzIGEgY2xpZW50IHdpdGggdGhlIGtleSAke2NsaWVudC5pbmZvLmtleX0sIHBsZWFzZSB1c2UgYSBkaWZmZXJlbnQga2V5YCxcbiAgICApO1xuICB9XG5cbiAgdGFyZ2V0c1t0YXJnZXRJZF0uY2xpZW50c0J5SWRbY2xpZW50LmluZm8ua2V5XSA9IGNsaWVudDtcbn07XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG5jb25zdCBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5jb25zdCBjdXN0b21JbnNwZWN0U3ltYm9sID1cbiAgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbFsnZm9yJ10gPT09ICdmdW5jdGlvbicpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgPyBTeW1ib2xbJ2ZvciddKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgOiBudWxsXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuY29uc3QgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBjb25zdCBwcm90byA9IHsgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH1cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihhcnIsIHByb3RvKVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlWaWV3KHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKVxuICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGNvbnN0IGIgPSBmcm9tT2JqZWN0KHZhbHVlKVxuICBpZiAoYikgcmV0dXJuIGJcblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gIClcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlci5wcm90b3R5cGUsIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlciwgVWludDhBcnJheSlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgbGV0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgY29uc3QgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlWaWV3IChhcnJheVZpZXcpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYXJyYXlWaWV3LCBVaW50OEFycmF5KSkge1xuICAgIGNvbnN0IGNvcHkgPSBuZXcgVWludDhBcnJheShhcnJheVZpZXcpXG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihjb3B5LmJ1ZmZlciwgY29weS5ieXRlT2Zmc2V0LCBjb3B5LmJ5dGVMZW5ndGgpXG4gIH1cbiAgcmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KVxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgbGV0IGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICBjb25zdCBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIGNvbnN0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICBsZXQgeCA9IGEubGVuZ3RoXG4gIGxldCB5ID0gYi5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIGxldCBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGlmIChwb3MgKyBidWYubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBwb3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICB9XG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICBjb25zdCBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGNvbnN0IG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2VyY2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIGNvbnN0IGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIGxldCBzdHIgPSAnJ1xuICBjb25zdCBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuaWYgKGN1c3RvbUluc3BlY3RTeW1ib2wpIHtcbiAgQnVmZmVyLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IEJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICBsZXQgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgbGV0IHkgPSBlbmQgLSBzdGFydFxuICBjb25zdCBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIGNvbnN0IHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIGNvbnN0IHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFt2YWxdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICBsZXQgaW5kZXhTaXplID0gMVxuICBsZXQgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICBsZXQgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICBsZXQgaVxuICBpZiAoZGlyKSB7XG4gICAgbGV0IGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICBjb25zdCByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgbGV0IGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIGNvbnN0IHJlcyA9IFtdXG5cbiAgbGV0IGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIGxldCBjb2RlUG9pbnQgPSBudWxsXG4gICAgbGV0IGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRilcbiAgICAgID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERilcbiAgICAgICAgICA/IDNcbiAgICAgICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKVxuICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICBsZXQgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG5jb25zdCBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgY29uc3QgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGxldCByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBsZXQgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgbGV0IG91dCA9ICcnXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2ldXVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgbGV0IHJlcyA9ICcnXG4gIC8vIElmIGJ5dGVzLmxlbmd0aCBpcyBvZGQsIHRoZSBsYXN0IDggYml0cyBtdXN0IGJlIGlnbm9yZWQgKHNhbWUgYXMgbm9kZS5qcylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgY29uc3QgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldF1cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICBsZXQgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4ID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRMRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IGxvID0gZmlyc3QgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAyNFxuXG4gIGNvbnN0IGhpID0gdGhpc1srK29mZnNldF0gK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIGxhc3QgKiAyICoqIDI0XG5cbiAgcmV0dXJuIEJpZ0ludChsbykgKyAoQmlnSW50KGhpKSA8PCBCaWdJbnQoMzIpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgaGkgPSBmaXJzdCAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdXG5cbiAgY29uc3QgbG8gPSB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIGxhc3RcblxuICByZXR1cm4gKEJpZ0ludChoaSkgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQobG8pXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXRdXG4gIGxldCBtdWwgPSAxXG4gIGxldCBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoXG4gIGxldCBtdWwgPSAxXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0TEUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDRdICtcbiAgICB0aGlzW29mZnNldCArIDVdICogMiAqKiA4ICtcbiAgICB0aGlzW29mZnNldCArIDZdICogMiAqKiAxNiArXG4gICAgKGxhc3QgPDwgMjQpIC8vIE92ZXJmbG93XG5cbiAgcmV0dXJuIChCaWdJbnQodmFsKSA8PCBCaWdJbnQoMzIpKSArXG4gICAgQmlnSW50KGZpcnN0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgdmFsID0gKGZpcnN0IDw8IDI0KSArIC8vIE92ZXJmbG93XG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF1cblxuICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICtcbiAgICBCaWdJbnQodGhpc1srK29mZnNldF0gKiAyICoqIDI0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICBsYXN0KVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50TEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICBsZXQgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIGxldCBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiB3cnRCaWdVSW50NjRMRSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBtaW4sIG1heCkge1xuICBjaGVja0ludEJJKHZhbHVlLCBtaW4sIG1heCwgYnVmLCBvZmZzZXQsIDcpXG5cbiAgbGV0IGxvID0gTnVtYmVyKHZhbHVlICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICByZXR1cm4gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHdydEJpZ1VJbnQ2NEJFIChidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7XG4gIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNylcblxuICBsZXQgbG8gPSBOdW1iZXIodmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQgKyA3XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNl0gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDVdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA0XSA9IGxvXG4gIGxldCBoaSA9IE51bWJlcih2YWx1ZSA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0ICsgM10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCArIDJdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQgKyAxXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0XSA9IGhpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NExFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcywgdmFsdWUsIG9mZnNldCwgQmlnSW50KDApLCBCaWdJbnQoJzB4ZmZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0QkUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gMFxuICBsZXQgbXVsID0gMVxuICBsZXQgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnSW50NjRMRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NExFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIC1CaWdJbnQoJzB4ODAwMDAwMDAwMDAwMDAwMCcpLCBCaWdJbnQoJzB4N2ZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NEJFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0QkUodGhpcywgdmFsdWUsIG9mZnNldCwgLUJpZ0ludCgnMHg4MDAwMDAwMDAwMDAwMDAwJyksIEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgY29uc3QgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgdmFsID0gTnVtYmVyKHZhbClcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICBsZXQgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBDVVNUT00gRVJST1JTXG4vLyA9PT09PT09PT09PT09XG5cbi8vIFNpbXBsaWZpZWQgdmVyc2lvbnMgZnJvbSBOb2RlLCBjaGFuZ2VkIGZvciBCdWZmZXItb25seSB1c2FnZVxuY29uc3QgZXJyb3JzID0ge31cbmZ1bmN0aW9uIEUgKHN5bSwgZ2V0TWVzc2FnZSwgQmFzZSkge1xuICBlcnJvcnNbc3ltXSA9IGNsYXNzIE5vZGVFcnJvciBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgIHN1cGVyKClcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzYWdlJywge1xuICAgICAgICB2YWx1ZTogZ2V0TWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KVxuXG4gICAgICAvLyBBZGQgdGhlIGVycm9yIGNvZGUgdG8gdGhlIG5hbWUgdG8gaW5jbHVkZSBpdCBpbiB0aGUgc3RhY2sgdHJhY2UuXG4gICAgICB0aGlzLm5hbWUgPSBgJHt0aGlzLm5hbWV9IFske3N5bX1dYFxuICAgICAgLy8gQWNjZXNzIHRoZSBzdGFjayB0byBnZW5lcmF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIGVycm9yIGNvZGVcbiAgICAgIC8vIGZyb20gdGhlIG5hbWUuXG4gICAgICB0aGlzLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAvLyBSZXNldCB0aGUgbmFtZSB0byB0aGUgYWN0dWFsIG5hbWUuXG4gICAgICBkZWxldGUgdGhpcy5uYW1lXG4gICAgfVxuXG4gICAgZ2V0IGNvZGUgKCkge1xuICAgICAgcmV0dXJuIHN5bVxuICAgIH1cblxuICAgIHNldCBjb2RlICh2YWx1ZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2RlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtzeW19XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgIH1cbiAgfVxufVxuXG5FKCdFUlJfQlVGRkVSX09VVF9PRl9CT1VORFMnLFxuICBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gYCR7bmFtZX0gaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzYFxuICAgIH1cblxuICAgIHJldHVybiAnQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kcydcbiAgfSwgUmFuZ2VFcnJvcilcbkUoJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgZnVuY3Rpb24gKG5hbWUsIGFjdHVhbCkge1xuICAgIHJldHVybiBgVGhlIFwiJHtuYW1lfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWBcbiAgfSwgVHlwZUVycm9yKVxuRSgnRVJSX09VVF9PRl9SQU5HRScsXG4gIGZ1bmN0aW9uIChzdHIsIHJhbmdlLCBpbnB1dCkge1xuICAgIGxldCBtc2cgPSBgVGhlIHZhbHVlIG9mIFwiJHtzdHJ9XCIgaXMgb3V0IG9mIHJhbmdlLmBcbiAgICBsZXQgcmVjZWl2ZWQgPSBpbnB1dFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiBCaWdJbnQoMikgKiogQmlnSW50KDMyKSB8fCBpbnB1dCA8IC0oQmlnSW50KDIpICoqIEJpZ0ludCgzMikpKSB7XG4gICAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHJlY2VpdmVkKVxuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gJ24nXG4gICAgfVxuICAgIG1zZyArPSBgIEl0IG11c3QgYmUgJHtyYW5nZX0uIFJlY2VpdmVkICR7cmVjZWl2ZWR9YFxuICAgIHJldHVybiBtc2dcbiAgfSwgUmFuZ2VFcnJvcilcblxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yICh2YWwpIHtcbiAgbGV0IHJlcyA9ICcnXG4gIGxldCBpID0gdmFsLmxlbmd0aFxuICBjb25zdCBzdGFydCA9IHZhbFswXSA9PT0gJy0nID8gMSA6IDBcbiAgZm9yICg7IGkgPj0gc3RhcnQgKyA0OyBpIC09IDMpIHtcbiAgICByZXMgPSBgXyR7dmFsLnNsaWNlKGkgLSAzLCBpKX0ke3Jlc31gXG4gIH1cbiAgcmV0dXJuIGAke3ZhbC5zbGljZSgwLCBpKX0ke3Jlc31gXG59XG5cbi8vIENIRUNLIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNoZWNrQm91bmRzIChidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBpZiAoYnVmW29mZnNldF0gPT09IHVuZGVmaW5lZCB8fCBidWZbb2Zmc2V0ICsgYnl0ZUxlbmd0aF0gPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgYnVmLmxlbmd0aCAtIChieXRlTGVuZ3RoICsgMSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tJbnRCSSAodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHtcbiAgICBjb25zdCBuID0gdHlwZW9mIG1pbiA9PT0gJ2JpZ2ludCcgPyAnbicgOiAnJ1xuICAgIGxldCByYW5nZVxuICAgIGlmIChieXRlTGVuZ3RoID4gMykge1xuICAgICAgaWYgKG1pbiA9PT0gMCB8fCBtaW4gPT09IEJpZ0ludCgwKSkge1xuICAgICAgICByYW5nZSA9IGA+PSAwJHtufSBhbmQgPCAyJHtufSAqKiAkeyhieXRlTGVuZ3RoICsgMSkgKiA4fSR7bn1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9IGA+PSAtKDIke259ICoqICR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn0pIGFuZCA8IDIgKiogYCArXG4gICAgICAgICAgICAgICAgYCR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlID0gYD49ICR7bWlufSR7bn0gYW5kIDw9ICR7bWF4fSR7bn1gXG4gICAgfVxuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSgndmFsdWUnLCByYW5nZSwgdmFsdWUpXG4gIH1cbiAgY2hlY2tCb3VuZHMoYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyICh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvdW5kc0Vycm9yICh2YWx1ZSwgbGVuZ3RoLCB0eXBlKSB7XG4gIGlmIChNYXRoLmZsb29yKHZhbHVlKSAhPT0gdmFsdWUpIHtcbiAgICB2YWxpZGF0ZU51bWJlcih2YWx1ZSwgdHlwZSlcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UodHlwZSB8fCAnb2Zmc2V0JywgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgfVxuXG4gIGlmIChsZW5ndGggPCAwKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKVxuICB9XG5cbiAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKHR5cGUgfHwgJ29mZnNldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPj0gJHt0eXBlID8gMSA6IDB9IGFuZCA8PSAke2xlbmd0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxuY29uc3QgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIGxldCBjb2RlUG9pbnRcbiAgY29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICBsZXQgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICBjb25zdCBieXRlQXJyYXkgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIGxldCBjLCBoaSwgbG9cbiAgY29uc3QgYnl0ZUFycmF5ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBsZXQgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3IgYHRvU3RyaW5nKCdoZXgnKWBcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzIxOVxuY29uc3QgaGV4U2xpY2VMb29rdXBUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWYnXG4gIGNvbnN0IHRhYmxlID0gbmV3IEFycmF5KDI1NilcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgY29uc3QgaTE2ID0gaSAqIDE2XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICB0YWJsZVtpMTYgKyBqXSA9IGFscGhhYmV0W2ldICsgYWxwaGFiZXRbal1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhYmxlXG59KSgpXG5cbi8vIFJldHVybiBub3QgZnVuY3Rpb24gd2l0aCBFcnJvciBpZiBCaWdJbnQgbm90IHN1cHBvcnRlZFxuZnVuY3Rpb24gZGVmaW5lQmlnSW50TWV0aG9kIChmbikge1xuICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyBCdWZmZXJCaWdJbnROb3REZWZpbmVkIDogZm5cbn1cblxuZnVuY3Rpb24gQnVmZmVyQmlnSW50Tm90RGVmaW5lZCAoKSB7XG4gIHRocm93IG5ldyBFcnJvcignQmlnSW50IG5vdCBzdXBwb3J0ZWQnKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBzZXRGdW5jdGlvbkxlbmd0aCA9IHJlcXVpcmUoJ3NldC1mdW5jdGlvbi1sZW5ndGgnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRhcHBseSA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUnKTtcbnZhciAkY2FsbCA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJScpO1xudmFyICRyZWZsZWN0QXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVSZWZsZWN0LmFwcGx5JScsIHRydWUpIHx8IGJpbmQuY2FsbCgkY2FsbCwgJGFwcGx5KTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xudmFyICRtYXggPSBHZXRJbnRyaW5zaWMoJyVNYXRoLm1heCUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZChvcmlnaW5hbEZ1bmN0aW9uKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ2luYWxGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblx0dmFyIGZ1bmMgPSAkcmVmbGVjdEFwcGx5KGJpbmQsICRjYWxsLCBhcmd1bWVudHMpO1xuXHRyZXR1cm4gc2V0RnVuY3Rpb25MZW5ndGgoXG5cdFx0ZnVuYyxcblx0XHQxICsgJG1heCgwLCBvcmlnaW5hbEZ1bmN0aW9uLmxlbmd0aCAtIChhcmd1bWVudHMubGVuZ3RoIC0gMSkpLFxuXHRcdHRydWVcblx0KTtcbn07XG5cbnZhciBhcHBseUJpbmQgPSBmdW5jdGlvbiBhcHBseUJpbmQoKSB7XG5cdHJldHVybiAkcmVmbGVjdEFwcGx5KGJpbmQsICRhcHBseSwgYXJndW1lbnRzKTtcbn07XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0JGRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYXBwbHknLCB7IHZhbHVlOiBhcHBseUJpbmQgfSk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cy5hcHBseSA9IGFwcGx5QmluZDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgJFN5bnRheEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3N5bnRheCcpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG52YXIgZ29wZCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lRGF0YVByb3BlcnR5KFxuXHRvYmosXG5cdHByb3BlcnR5LFxuXHR2YWx1ZVxuKSB7XG5cdGlmICghb2JqIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgb2JqYCBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uYCcpO1xuXHR9XG5cdGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N5bWJvbCcpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYHByb3BlcnR5YCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sYCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzNdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25FbnVtZXJhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgdHlwZW9mIGFyZ3VtZW50c1s0XSAhPT0gJ2Jvb2xlYW4nICYmIGFyZ3VtZW50c1s0XSAhPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbm9uV3JpdGFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNSAmJiB0eXBlb2YgYXJndW1lbnRzWzVdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzVdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Db25maWd1cmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNiAmJiB0eXBlb2YgYXJndW1lbnRzWzZdICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGxvb3NlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHR2YXIgbm9uRW51bWVyYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblx0dmFyIG5vbldyaXRhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgPyBhcmd1bWVudHNbNF0gOiBudWxsO1xuXHR2YXIgbm9uQ29uZmlndXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgPyBhcmd1bWVudHNbNV0gOiBudWxsO1xuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IGZhbHNlO1xuXG5cdC8qIEB0eXBlIHtmYWxzZSB8IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+fSAqL1xuXHR2YXIgZGVzYyA9ICEhZ29wZCAmJiBnb3BkKG9iaiwgcHJvcGVydHkpO1xuXG5cdGlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0XHQkZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eSwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiBub25Db25maWd1cmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuY29uZmlndXJhYmxlIDogIW5vbkNvbmZpZ3VyYWJsZSxcblx0XHRcdGVudW1lcmFibGU6IG5vbkVudW1lcmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuZW51bWVyYWJsZSA6ICFub25FbnVtZXJhYmxlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IG5vbldyaXRhYmxlID09PSBudWxsICYmIGRlc2MgPyBkZXNjLndyaXRhYmxlIDogIW5vbldyaXRhYmxlXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAobG9vc2UgfHwgKCFub25FbnVtZXJhYmxlICYmICFub25Xcml0YWJsZSAmJiAhbm9uQ29uZmlndXJhYmxlKSkge1xuXHRcdC8vIG11c3QgZmFsbCBiYWNrIHRvIFtbU2V0XV0sIGFuZCB3YXMgbm90IGV4cGxpY2l0bHkgYXNrZWQgdG8gbWFrZSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tY29uZmlndXJhYmxlXG5cdFx0b2JqW3Byb3BlcnR5XSA9IHZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlZmluaW5nIGEgcHJvcGVydHkgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tZW51bWVyYWJsZS4nKTtcblx0fVxufTtcbiIsInZhciBTdHJlYW0gPSByZXF1aXJlKFwic3RyZWFtXCIpXG52YXIgd3JpdGVNZXRob2RzID0gW1wid3JpdGVcIiwgXCJlbmRcIiwgXCJkZXN0cm95XCJdXG52YXIgcmVhZE1ldGhvZHMgPSBbXCJyZXN1bWVcIiwgXCJwYXVzZVwiXVxudmFyIHJlYWRFdmVudHMgPSBbXCJkYXRhXCIsIFwiY2xvc2VcIl1cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IGR1cGxleFxuXG5mdW5jdGlvbiBmb3JFYWNoIChhcnIsIGZuKSB7XG4gICAgaWYgKGFyci5mb3JFYWNoKSB7XG4gICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChmbilcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmbihhcnJbaV0sIGkpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBkdXBsZXgod3JpdGVyLCByZWFkZXIpIHtcbiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gICAgdmFyIGVuZGVkID0gZmFsc2VcblxuICAgIGZvckVhY2god3JpdGVNZXRob2RzLCBwcm94eVdyaXRlcilcblxuICAgIGZvckVhY2gocmVhZE1ldGhvZHMsIHByb3h5UmVhZGVyKVxuXG4gICAgZm9yRWFjaChyZWFkRXZlbnRzLCBwcm94eVN0cmVhbSlcblxuICAgIHJlYWRlci5vbihcImVuZFwiLCBoYW5kbGVFbmQpXG5cbiAgICB3cml0ZXIub24oXCJkcmFpblwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHN0cmVhbS5lbWl0KFwiZHJhaW5cIilcbiAgICB9KVxuXG4gICAgd3JpdGVyLm9uKFwiZXJyb3JcIiwgcmVlbWl0KVxuICAgIHJlYWRlci5vbihcImVycm9yXCIsIHJlZW1pdClcblxuICAgIHN0cmVhbS53cml0YWJsZSA9IHdyaXRlci53cml0YWJsZVxuICAgIHN0cmVhbS5yZWFkYWJsZSA9IHJlYWRlci5yZWFkYWJsZVxuXG4gICAgcmV0dXJuIHN0cmVhbVxuXG4gICAgZnVuY3Rpb24gcHJveHlXcml0ZXIobWV0aG9kTmFtZSkge1xuICAgICAgICBzdHJlYW1bbWV0aG9kTmFtZV0gPSBtZXRob2RcblxuICAgICAgICBmdW5jdGlvbiBtZXRob2QoKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JpdGVyW21ldGhvZE5hbWVdLmFwcGx5KHdyaXRlciwgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJveHlSZWFkZXIobWV0aG9kTmFtZSkge1xuICAgICAgICBzdHJlYW1bbWV0aG9kTmFtZV0gPSBtZXRob2RcblxuICAgICAgICBmdW5jdGlvbiBtZXRob2QoKSB7XG4gICAgICAgICAgICBzdHJlYW0uZW1pdChtZXRob2ROYW1lKVxuICAgICAgICAgICAgdmFyIGZ1bmMgPSByZWFkZXJbbWV0aG9kTmFtZV1cbiAgICAgICAgICAgIGlmIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkocmVhZGVyLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuZW1pdChtZXRob2ROYW1lKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJveHlTdHJlYW0obWV0aG9kTmFtZSkge1xuICAgICAgICByZWFkZXIub24obWV0aG9kTmFtZSwgcmVlbWl0KVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlZW1pdCgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICBhcmdzLnVuc2hpZnQobWV0aG9kTmFtZSlcbiAgICAgICAgICAgIHN0cmVhbS5lbWl0LmFwcGx5KHN0cmVhbSwgYXJncylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUVuZCgpIHtcbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICAgICAgYXJncy51bnNoaWZ0KFwiZW5kXCIpXG4gICAgICAgIHN0cmVhbS5lbWl0LmFwcGx5KHN0cmVhbSwgYXJncylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWVtaXQoZXJyKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KFwiZXJyb3JcIiwgZXJyKVxuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZGVmaW5lUHJvcGVydHklJywgdHJ1ZSkgfHwgZmFsc2U7XG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGRlZmluZVByb3BlcnR5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9ldmFsJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEV2YWxFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JhbmdlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZWZlcmVuY2VFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi90eXBlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGVFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXJpJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFVSSUVycm9yO1xuIiwiLy9maWx0ZXIgd2lsbCByZWVtaXQgdGhlIGRhdGEgaWYgY2IoZXJyLHBhc3MpIHBhc3MgaXMgdHJ1dGh5XG5cbi8vIHJlZHVjZSBpcyBtb3JlIHRyaWNreVxuLy8gbWF5YmUgd2Ugd2FudCB0byBncm91cCB0aGUgcmVkdWN0aW9ucyBvciBlbWl0IHByb2dyZXNzIHVwZGF0ZXMgb2NjYXNpb25hbGx5XG4vLyB0aGUgbW9zdCBiYXNpYyByZWR1Y2UganVzdCBlbWl0cyBvbmUgJ2RhdGEnIGV2ZW50IGFmdGVyIGl0IGhhcyByZWNpZXZlZCAnZW5kJ1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtXG4gICwgZXMgPSBleHBvcnRzXG4gICwgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKVxuICAsIGZyb20gPSByZXF1aXJlKCdmcm9tJylcbiAgLCBkdXBsZXggPSByZXF1aXJlKCdkdXBsZXhlcicpXG4gICwgbWFwID0gcmVxdWlyZSgnbWFwLXN0cmVhbScpXG4gICwgcGF1c2UgPSByZXF1aXJlKCdwYXVzZS1zdHJlYW0nKVxuICAsIHNwbGl0ID0gcmVxdWlyZSgnc3BsaXQnKVxuICAsIHBpcGVsaW5lID0gcmVxdWlyZSgnc3RyZWFtLWNvbWJpbmVyJylcbiAgLCBpbW1lZGlhdGVseSA9IGdsb2JhbC5zZXRJbW1lZGlhdGUgfHwgcHJvY2Vzcy5uZXh0VGljaztcblxuZXMuU3RyZWFtID0gU3RyZWFtIC8vcmUtZXhwb3J0IFN0cmVhbSBmcm9tIGNvcmVcbmVzLnRocm91Z2ggPSB0aHJvdWdoXG5lcy5mcm9tID0gZnJvbVxuZXMuZHVwbGV4ID0gZHVwbGV4XG5lcy5tYXAgPSBtYXBcbmVzLnBhdXNlID0gcGF1c2VcbmVzLnNwbGl0ID0gc3BsaXRcbmVzLnBpcGVsaW5lID0gZXMuY29ubmVjdCA9IGVzLnBpcGUgPSBwaXBlbGluZVxuLy8gbWVyZ2UgLyBjb25jYXRcbi8vXG4vLyBjb21iaW5lIG11bHRpcGxlIHN0cmVhbXMgaW50byBhIHNpbmdsZSBzdHJlYW0uXG4vLyB3aWxsIGVtaXQgZW5kIG9ubHkgb25jZVxuXG5lcy5jb25jYXQgPSAvL2FjdHVhbGx5IHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBjb25jYXRcbmVzLm1lcmdlID0gZnVuY3Rpb24gKC8qc3RyZWFtcy4uLiovKSB7XG4gIHZhciB0b01lcmdlID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIGlmICh0b01lcmdlLmxlbmd0aCA9PT0gMSAmJiAodG9NZXJnZVswXSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgIHRvTWVyZ2UgPSB0b01lcmdlWzBdIC8vaGFuZGxlIGFycmF5IGFzIGFyZ3VtZW50cyBvYmplY3RcbiAgfVxuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gIHN0cmVhbS5zZXRNYXhMaXN0ZW5lcnMoMCkgLy8gYWxsb3cgYWRkaW5nIG1vcmUgdGhhbiAxMSBzdHJlYW1zXG4gIHZhciBlbmRDb3VudCA9IDBcbiAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZVxuXG4gIGlmICh0b01lcmdlLmxlbmd0aCkge1xuICAgIHRvTWVyZ2UuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgZS5waXBlKHN0cmVhbSwge2VuZDogZmFsc2V9KVxuICAgICAgdmFyIGVuZGVkID0gZmFsc2VcbiAgICAgIGUub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoZW5kZWQpIHJldHVyblxuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgZW5kQ291bnQgKytcbiAgICAgICAgaWYoZW5kQ291bnQgPT0gdG9NZXJnZS5sZW5ndGgpXG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgICB9KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICB9KVxuICB9XG4gIFxuICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpXG4gIH1cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdG9NZXJnZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZihlLmRlc3Ryb3kpIGUuZGVzdHJveSgpXG4gICAgfSlcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cblxuLy8gd3JpdGFibGUgc3RyZWFtLCBjb2xsZWN0cyBhbGwgZXZlbnRzIGludG8gYW4gYXJyYXlcbi8vIGFuZCBjYWxscyBiYWNrIHdoZW4gJ2VuZCcgb2NjdXJzXG4vLyBtYWlubHkgSSdtIHVzaW5nIHRoaXMgdG8gdGVzdCB0aGUgb3RoZXIgZnVuY3Rpb25zXG5cbmVzLmNvbGxlY3QgPVxuZXMud3JpdGVBcnJheSA9IGZ1bmN0aW9uIChkb25lKSB7XG4gIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgZG9uZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Z1bmN0aW9uIHdyaXRlQXJyYXkgKGRvbmUpOiBkb25lIG11c3QgYmUgZnVuY3Rpb24nKVxuXG4gIHZhciBhID0gbmV3IFN0cmVhbSAoKVxuICAgICwgYXJyYXkgPSBbXSwgaXNEb25lID0gZmFsc2VcbiAgYS53cml0ZSA9IGZ1bmN0aW9uIChsKSB7XG4gICAgYXJyYXkucHVzaChsKVxuICB9XG4gIGEuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgIGlzRG9uZSA9IHRydWVcbiAgICBkb25lKG51bGwsIGFycmF5KVxuICB9XG4gIGEud3JpdGFibGUgPSB0cnVlXG4gIGEucmVhZGFibGUgPSBmYWxzZVxuICBhLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgYS53cml0YWJsZSA9IGEucmVhZGFibGUgPSBmYWxzZVxuICAgIGlmKGlzRG9uZSkgcmV0dXJuXG4gICAgZG9uZShuZXcgRXJyb3IoJ2Rlc3Ryb3llZCBiZWZvcmUgZW5kJyksIGFycmF5KVxuICB9XG4gIHJldHVybiBhXG59XG5cbi8vcmV0dXJuIGEgU3RyZWFtIHRoYXQgcmVhZHMgdGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0XG4vL3Jlc3BlY3RpbmcgcGF1c2UoKSBhbmQgcmVzdW1lKClcblxuZXMucmVhZEFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgICAsIGkgPSAwXG4gICAgLCBwYXVzZWQgPSBmYWxzZVxuICAgICwgZW5kZWQgPSBmYWxzZVxuXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWVcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcblxuICBpZighQXJyYXkuaXNBcnJheShhcnJheSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdldmVudC1zdHJlYW0ucmVhZCBleHBlY3RzIGFuIGFycmF5JylcblxuICBzdHJlYW0ucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICBwYXVzZWQgPSBmYWxzZVxuICAgIHZhciBsID0gYXJyYXkubGVuZ3RoXG4gICAgd2hpbGUoaSA8IGwgJiYgIXBhdXNlZCAmJiAhZW5kZWQpIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgYXJyYXlbaSsrXSlcbiAgICB9XG4gICAgaWYoaSA9PSBsICYmICFlbmRlZClcbiAgICAgIGVuZGVkID0gdHJ1ZSwgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2UsIHN0cmVhbS5lbWl0KCdlbmQnKVxuICB9XG4gIHByb2Nlc3MubmV4dFRpY2soc3RyZWFtLnJlc3VtZSlcbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICBwYXVzZWQgPSB0cnVlXG4gIH1cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgZW5kZWQgPSB0cnVlXG4gICAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cbi8vXG4vLyByZWFkYWJsZSAoYXN5bmNGdW5jdGlvbilcbi8vIHJldHVybiBhIHN0cmVhbSB0aGF0IGNhbGxzIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWxlIHRoZSBzdHJlYW0gaXMgbm90IHBhdXNlZC5cbi8vXG4vLyB0aGUgZnVuY3Rpb24gbXVzdCB0YWtlOiAoY291bnQsIGNhbGxiYWNrKSB7Li4uXG4vL1xuXG5lcy5yZWFkYWJsZSA9XG5mdW5jdGlvbiAoZnVuYywgY29udGludWVPbkVycm9yKSB7XG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgICAsIGkgPSAwXG4gICAgLCBwYXVzZWQgPSBmYWxzZVxuICAgICwgZW5kZWQgPSBmYWxzZVxuICAgICwgcmVhZGluZyA9IGZhbHNlXG5cbiAgc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZVxuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZVxuXG4gIGlmKCdmdW5jdGlvbicgIT09IHR5cGVvZiBmdW5jKVxuICAgIHRocm93IG5ldyBFcnJvcignZXZlbnQtc3RyZWFtLnJlYWRhYmxlIGV4cGVjdHMgYXN5bmMgZnVuY3Rpb24nKVxuXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBlbmRlZCA9IHRydWUgfSlcblxuICBmdW5jdGlvbiBnZXQgKGVyciwgZGF0YSkge1xuXG4gICAgaWYoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICBpZighY29udGludWVPbkVycm9yKSBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKVxuICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBkYXRhKVxuXG4gICAgaW1tZWRpYXRlbHkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYoZW5kZWQgfHwgcGF1c2VkIHx8IHJlYWRpbmcpIHJldHVyblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhZGluZyA9IHRydWVcbiAgICAgICAgZnVuYy5jYWxsKHN0cmVhbSwgaSsrLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgICAgZ2V0LmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBzdHJlYW0ucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIHBhdXNlZCA9IGZhbHNlXG4gICAgZ2V0KClcbiAgfVxuICBwcm9jZXNzLm5leHRUaWNrKGdldClcbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICBwYXVzZWQgPSB0cnVlXG4gIH1cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbiAgICBlbmRlZCA9IHRydWVcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cblxuLy9cbi8vIG1hcCBzeW5jXG4vL1xuXG5lcy5tYXBTeW5jID0gZnVuY3Rpb24gKHN5bmMpIHtcbiAgcmV0dXJuIGVzLnRocm91Z2goZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICAgIHZhciBtYXBwZWREYXRhXG4gICAgdHJ5IHtcbiAgICAgIG1hcHBlZERhdGEgPSBzeW5jKGRhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICB9XG4gICAgaWYgKG1hcHBlZERhdGEgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZW1pdCgnZGF0YScsIG1hcHBlZERhdGEpXG4gIH0pXG59XG5cbi8vXG4vLyBmaWx0ZXJTeW5jXG4vL1xuXG5lcy5maWx0ZXJTeW5jID0gZnVuY3Rpb24gKHRlc3QpIHtcbiAgcmV0dXJuIGVzLnRocm91Z2goZnVuY3Rpb24oZGF0YSl7XG4gICAgdmFyIHMgPSB0aGlzXG4gICAgaWYgKHRlc3QoZGF0YSkpIHtcbiAgICAgIHMucXVldWUoZGF0YSlcbiAgICB9XG4gIH0pO1xufVxuXG4vL1xuLy8gZmxhdG1hcFN5bmNcbi8vXG5cbmVzLmZsYXRtYXBTeW5jID0gZnVuY3Rpb24gKG1hcHBlcikge1xuICByZXR1cm4gZXMudGhyb3VnaChmdW5jdGlvbihkYXRhKSB7XG4gICAgdmFyIHMgPSB0aGlzXG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgIHMucXVldWUobWFwcGVyKGUpKVxuICAgIH0pXG4gIH0pXG59XG5cbi8vXG4vLyBsb2cganVzdCBwcmludCBvdXQgd2hhdCBpcyBjb21pbmcgdGhyb3VnaCB0aGUgc3RyZWFtLCBmb3IgZGVidWdnaW5nXG4vL1xuXG5lcy5sb2cgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gZXMudGhyb3VnaChmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgaWYobmFtZSkgY29uc29sZS5lcnJvcihuYW1lLCBkYXRhKVxuICAgIGVsc2UgICAgIGNvbnNvbGUuZXJyb3IoZGF0YSlcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICB9KVxufVxuXG5cbi8vXG4vLyBjaGlsZCAtLSBwaXBlIHRocm91Z2ggYSBjaGlsZCBwcm9jZXNzXG4vL1xuXG5lcy5jaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuXG4gIHJldHVybiBlcy5kdXBsZXgoY2hpbGQuc3RkaW4sIGNoaWxkLnN0ZG91dClcblxufVxuXG4vL1xuLy8gcGFyc2Vcbi8vXG4vLyBtdXN0IGJlIHVzZWQgYWZ0ZXIgZXMuc3BsaXQoKSB0byBlbnN1cmUgdGhhdCBlYWNoIGNodW5rIHJlcHJlc2VudHMgYSBsaW5lXG4vLyBzb3VyY2UucGlwZShlcy5zcGxpdCgpKS5waXBlKGVzLnBhcnNlKCkpXG5cbmVzLnBhcnNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIGVtaXRFcnJvciA9ICEhKG9wdGlvbnMgPyBvcHRpb25zLmVycm9yIDogZmFsc2UpXG4gIHJldHVybiBlcy50aHJvdWdoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIG9ialxuICAgIHRyeSB7XG4gICAgICBpZihkYXRhKSAvL2lnbm9yZSBlbXB0eSBsaW5lc1xuICAgICAgICBvYmogPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlbWl0RXJyb3IpXG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyLCAnYXR0ZW1wdGluZyB0byBwYXJzZTonLCBkYXRhKVxuICAgIH1cbiAgICAvL2lnbm9yZSBsaW5lcyB0aGF0IHdoZXJlIG9ubHkgd2hpdGVzcGFjZS5cbiAgICBpZihvYmogIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZW1pdCgnZGF0YScsIG9iailcbiAgfSlcbn1cbi8vXG4vLyBzdHJpbmdpZnlcbi8vXG5cbmVzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlclxuICByZXR1cm4gZXMubWFwU3luYyhmdW5jdGlvbiAoZSl7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJ1ZmZlci5pc0J1ZmZlcihlKSA/IGUudG9TdHJpbmcoKSA6IGUpICsgJ1xcbidcbiAgfSlcbn1cblxuLy9cbi8vIHJlcGxhY2UgYSBzdHJpbmcgd2l0aGluIGEgc3RyZWFtLlxuLy9cbi8vIHdhcm46IGp1c3QgY29uY2F0ZW5hdGVzIHRoZSBzdHJpbmcgYW5kIHRoZW4gZG9lcyBzdHIuc3BsaXQoKS5qb2luKCkuXG4vLyBwcm9iYWJseSBub3Qgb3B0aW1hbC5cbi8vIGZvciBzbWFsbGlzaCByZXNwb25zZXMsIHdobyBjYXJlcz9cbi8vIEkgbmVlZCB0aGlzIGZvciBzaGFkb3ctbnBtIHNvIGl0J3Mgb25seSByZWxhdGl2ZWx5IHNtYWxsIGpzb24gZmlsZXMuXG5cbmVzLnJlcGxhY2UgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGVzLnBpcGVsaW5lKGVzLnNwbGl0KGZyb20pLCBlcy5qb2luKHRvKSlcbn1cblxuLy9cbi8vIGpvaW4gY2h1bmtzIHdpdGggYSBqb2luZXIuIGp1c3QgbGlrZSBBcnJheSNqb2luXG4vLyBhbHNvIGFjY2VwdHMgYSBjYWxsYmFjayB0aGF0IGlzIHBhc3NlZCB0aGUgY2h1bmtzIGFwcGVuZGVkIHRvZ2V0aGVyXG4vLyB0aGlzIGlzIHN0aWxsIHN1cHBvcnRlZCBmb3IgbGVnYWN5IHJlYXNvbnMuXG4vL1xuXG5lcy5qb2luID0gZnVuY3Rpb24gKHN0cikge1xuXG4gIC8vbGVnYWN5IGFwaVxuICBpZignZnVuY3Rpb24nID09PSB0eXBlb2Ygc3RyKVxuICAgIHJldHVybiBlcy53YWl0KHN0cilcblxuICB2YXIgZmlyc3QgPSB0cnVlXG4gIHJldHVybiBlcy50aHJvdWdoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoIWZpcnN0KVxuICAgICAgdGhpcy5lbWl0KCdkYXRhJywgc3RyKVxuICAgIGZpcnN0ID0gZmFsc2VcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIHJldHVybiB0cnVlXG4gIH0pXG59XG5cblxuLy9cbi8vIHdhaXQuIGNhbGxiYWNrIHdoZW4gJ2VuZCcgaXMgZW1pdHRlZCwgd2l0aCBhbGwgY2h1bmtzIGFwcGVuZGVkIGFzIHN0cmluZy5cbi8vXG5cbmVzLndhaXQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIGFyciA9IFtdXG4gIHJldHVybiBlcy50aHJvdWdoKGZ1bmN0aW9uIChkYXRhKSB7IGFyci5wdXNoKGRhdGEpIH0sXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGJvZHkgPSBCdWZmZXIuaXNCdWZmZXIoYXJyWzBdKSA/IEJ1ZmZlci5jb25jYXQoYXJyKVxuICAgICAgICA6IGFyci5qb2luKCcnKVxuICAgICAgdGhpcy5lbWl0KCdkYXRhJywgYm9keSlcbiAgICAgIHRoaXMuZW1pdCgnZW5kJylcbiAgICAgIGlmKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCBib2R5KVxuICAgIH0pXG59XG5cbmVzLnBpcGVhYmxlID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1tFVkVOVC1TVFJFQU1dIGVzLnBpcGVhYmxlIGlzIGRlcHJlY2F0ZWQnKVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFlcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgYm90aCBOYU4sIGZhbHNlIG90aGVyd2lzZVxuICByZXR1cm4gYSE9PWEgJiYgYiE9PWI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkYXRhLCBvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSBvcHRzID0ge307XG4gICAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSBvcHRzID0geyBjbXA6IG9wdHMgfTtcbiAgICB2YXIgY3ljbGVzID0gKHR5cGVvZiBvcHRzLmN5Y2xlcyA9PT0gJ2Jvb2xlYW4nKSA/IG9wdHMuY3ljbGVzIDogZmFsc2U7XG5cbiAgICB2YXIgY21wID0gb3B0cy5jbXAgJiYgKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFvYmogPSB7IGtleTogYSwgdmFsdWU6IG5vZGVbYV0gfTtcbiAgICAgICAgICAgICAgICB2YXIgYm9iaiA9IHsga2V5OiBiLCB2YWx1ZTogbm9kZVtiXSB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBmKGFvYmosIGJvYmopO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9KShvcHRzLmNtcCk7XG5cbiAgICB2YXIgc2VlbiA9IFtdO1xuICAgIHJldHVybiAoZnVuY3Rpb24gc3RyaW5naWZ5IChub2RlKSB7XG4gICAgICAgIGlmIChub2RlICYmIG5vZGUudG9KU09OICYmIHR5cGVvZiBub2RlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUudG9KU09OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PSAnbnVtYmVyJykgcmV0dXJuIGlzRmluaXRlKG5vZGUpID8gJycgKyBub2RlIDogJ251bGwnO1xuICAgICAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9kZSk7XG5cbiAgICAgICAgdmFyIGksIG91dDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgICAgICAgIG91dCA9ICdbJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkpIG91dCArPSAnLCc7XG4gICAgICAgICAgICAgICAgb3V0ICs9IHN0cmluZ2lmeShub2RlW2ldKSB8fCAnbnVsbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0ICsgJ10nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG5cbiAgICAgICAgaWYgKHNlZW4uaW5kZXhPZihub2RlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChjeWNsZXMpIHJldHVybiBKU09OLnN0cmluZ2lmeSgnX19jeWNsZV9fJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5wdXNoKG5vZGUpIC0gMTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhub2RlKS5zb3J0KGNtcCAmJiBjbXAobm9kZSkpO1xuICAgICAgICBvdXQgPSAnJztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gc3RyaW5naWZ5KG5vZGVba2V5XSk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG91dCkgb3V0ICs9ICcsJztcbiAgICAgICAgICAgIG91dCArPSBKU09OLnN0cmluZ2lmeShrZXkpICsgJzonICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5zcGxpY2Uoc2VlbkluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuICd7JyArIG91dCArICd9JztcbiAgICB9KShkYXRhKTtcbn07XG4iLCIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwiXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG4vLyBmcm9tXG4vL1xuLy8gYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIGFuIHNvdXJjZS5cbi8vIHNvdXJjZSBtYXkgYmUgYW4gYXJyYXksIG9yIGEgZnVuY3Rpb24uXG4vLyBmcm9tIGhhbmRsZXMgcGF1c2UgYmVoYXZpb3VyIGZvciB5b3UuXG5cbm1vZHVsZS5leHBvcnRzID1cbmZ1bmN0aW9uIGZyb20gKHNvdXJjZSkge1xuICBpZihBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcblx0XHR2YXIgc291cmNlX2luZGV4ID0gMCwgc291cmNlX2xlbiA9IHNvdXJjZS5sZW5ndGg7XG4gICAgcmV0dXJuIGZyb20gKGZ1bmN0aW9uIChpKSB7XG4gICAgICBpZihzb3VyY2VfaW5kZXggPCBzb3VyY2VfbGVuKVxuICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBzb3VyY2Vbc291cmNlX2luZGV4KytdKVxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pXG4gIH1cbiAgdmFyIHMgPSBuZXcgU3RyZWFtKCksIGkgPSAwXG4gIHMuZW5kZWQgPSBmYWxzZVxuICBzLnN0YXJ0ZWQgPSBmYWxzZVxuICBzLnJlYWRhYmxlID0gdHJ1ZVxuICBzLndyaXRhYmxlID0gZmFsc2VcbiAgcy5wYXVzZWQgPSBmYWxzZVxuICBzLmVuZGVkID0gZmFsc2VcbiAgcy5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgcy5wYXVzZWQgPSB0cnVlXG4gIH1cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgcy5zdGFydGVkID0gdHJ1ZVxuICAgIGlmKHMuZW5kZWQpIHJldHVyblxuICAgIHdoaWxlKCFzLmVuZGVkICYmICFzLnBhdXNlZCAmJiBzb3VyY2UuY2FsbChzLCBpKyssIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKCFzLmVuZGVkICYmICFzLnBhdXNlZClcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKG5leHQpO1xuICAgIH0pKVxuICAgICAgO1xuICB9XG4gIHMucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIHMuc3RhcnRlZCA9IHRydWVcbiAgICBzLnBhdXNlZCA9IGZhbHNlXG4gICAgbmV4dCgpXG4gIH1cbiAgcy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHMuZW5kZWQgPSB0cnVlXG4gICAgcy5yZWFkYWJsZSA9IGZhbHNlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhzLmRlc3Ryb3kpXG4gIH0pXG4gIHMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBzLmVuZGVkID0gdHJ1ZVxuICAgIHMuZW1pdCgnY2xvc2UnKSBcbiAgfVxuICAvKlxuICAgIGJ5IGRlZmF1bHQsIHRoZSBzdHJlYW0gd2lsbCBzdGFydCBlbWl0dGluZyBhdCBuZXh0VGlja1xuICAgIGlmIHlvdSB3YW50LCB5b3UgY2FuIHBhdXNlIGl0LCBhZnRlciBwaXBlaW5nLlxuICAgIHlvdSBjYW4gYWxzbyByZXN1bWUgYmVmb3JlIG5leHQgdGljaywgYW5kIHRoYXQgd2lsbCBhbHNvXG4gICAgd29yay5cbiAgKi9cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgaWYoIXMuc3RhcnRlZCkgcy5yZXN1bWUoKVxuICB9KVxuICByZXR1cm4gc1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG52YXIgY29uY2F0dHkgPSBmdW5jdGlvbiBjb25jYXR0eShhLCBiKSB7XG4gICAgdmFyIGFyciA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGFycltpXSA9IGFbaV07XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYi5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICBhcnJbaiArIGEubGVuZ3RoXSA9IGJbal07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbn07XG5cbnZhciBzbGljeSA9IGZ1bmN0aW9uIHNsaWN5KGFyckxpa2UsIG9mZnNldCkge1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gb2Zmc2V0IHx8IDAsIGogPSAwOyBpIDwgYXJyTGlrZS5sZW5ndGg7IGkgKz0gMSwgaiArPSAxKSB7XG4gICAgICAgIGFycltqXSA9IGFyckxpa2VbaV07XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgam9pbnkgPSBmdW5jdGlvbiAoYXJyLCBqb2luZXIpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc3RyICs9IGFycltpXTtcbiAgICAgICAgaWYgKGkgKyAxIDwgYXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RyICs9IGpvaW5lcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5hcHBseSh0YXJnZXQpICE9PSBmdW5jVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUk9SX01FU1NBR0UgKyB0YXJnZXQpO1xuICAgIH1cbiAgICB2YXIgYXJncyA9IHNsaWN5KGFyZ3VtZW50cywgMSk7XG5cbiAgICB2YXIgYm91bmQ7XG4gICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGNvbmNhdHR5KGFyZ3MsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgIGNvbmNhdHR5KGFyZ3MsIGFyZ3VtZW50cylcbiAgICAgICAgKTtcblxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBtYXgoMCwgdGFyZ2V0Lmxlbmd0aCAtIGFyZ3MubGVuZ3RoKTtcbiAgICB2YXIgYm91bmRBcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZExlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJvdW5kQXJnc1tpXSA9ICckJyArIGk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGpvaW55KGJvdW5kQXJncywgJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMnKTtcbnZhciAkRXZhbEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL2V2YWwnKTtcbnZhciAkUmFuZ2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yYW5nZScpO1xudmFyICRSZWZlcmVuY2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yZWYnKTtcbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFVSSUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3VyaScpO1xuXG52YXIgJEZ1bmN0aW9uID0gRnVuY3Rpb247XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxudmFyIGdldEV2YWxsZWRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uU3ludGF4KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuICRGdW5jdGlvbignXCJ1c2Ugc3RyaWN0XCI7IHJldHVybiAoJyArIGV4cHJlc3Npb25TeW50YXggKyAnKS5jb25zdHJ1Y3RvcjsnKSgpO1xuXHR9IGNhdGNoIChlKSB7fVxufTtcblxudmFyICRnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbmlmICgkZ09QRCkge1xuXHR0cnkge1xuXHRcdCRnT1BEKHt9LCAnJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQkZ09QRCA9IG51bGw7IC8vIHRoaXMgaXMgSUUgOCwgd2hpY2ggaGFzIGEgYnJva2VuIGdPUERcblx0fVxufVxuXG52YXIgdGhyb3dUeXBlRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdHRocm93IG5ldyAkVHlwZUVycm9yKCk7XG59O1xudmFyIFRocm93VHlwZUVycm9yID0gJGdPUERcblx0PyAoZnVuY3Rpb24gKCkge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zLCBuby1jYWxsZXIsIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllc1xuXHRcdFx0YXJndW1lbnRzLmNhbGxlZTsgLy8gSUUgOCBkb2VzIG5vdCB0aHJvdyBoZXJlXG5cdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0fSBjYXRjaCAoY2FsbGVlVGhyb3dzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBJRSA4IHRocm93cyBvbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFyZ3VtZW50cywgJycpXG5cdFx0XHRcdHJldHVybiAkZ09QRChhcmd1bWVudHMsICdjYWxsZWUnKS5nZXQ7XG5cdFx0XHR9IGNhdGNoIChnT1BEdGhyb3dzKSB7XG5cdFx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cdH0oKSlcblx0OiB0aHJvd1R5cGVFcnJvcjtcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scycpKCk7XG52YXIgaGFzUHJvdG8gPSByZXF1aXJlKCdoYXMtcHJvdG8nKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgKFxuXHRoYXNQcm90b1xuXHRcdD8gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblx0XHQ6IG51bGxcbik7XG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG5cbnZhciBJTlRSSU5TSUNTID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQmlnSW50NjRBcnJheSUnOiB0eXBlb2YgQmlnSW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQ2NEFycmF5LFxuXHQnJUJpZ1VpbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdVaW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdVaW50NjRBcnJheSxcblx0JyVCb29sZWFuJSc6IEJvb2xlYW4sXG5cdCclRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LFxuXHQnJURhdGUlJzogRGF0ZSxcblx0JyVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuXHQnJWRlY29kZVVSSUNvbXBvbmVudCUnOiBkZWNvZGVVUklDb21wb25lbnQsXG5cdCclZW5jb2RlVVJJJSc6IGVuY29kZVVSSSxcblx0JyVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuXHQnJUVycm9yJSc6ICRFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiAkRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6ICRSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6ICRSZWZlcmVuY2VFcnJvcixcblx0JyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCclUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLFxuXHQnJVN0cmluZyUnOiBTdHJpbmcsXG5cdCclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclU3ltYm9sJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wgOiB1bmRlZmluZWQsXG5cdCclU3ludGF4RXJyb3IlJzogJFN5bnRheEVycm9yLFxuXHQnJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuXHQnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcblx0JyVVaW50OEFycmF5JSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4QXJyYXksXG5cdCclVWludDhDbGFtcGVkQXJyYXklJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHQnJVVpbnQxNkFycmF5JSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MTZBcnJheSxcblx0JyVVaW50MzJBcnJheSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDMyQXJyYXksXG5cdCclVVJJRXJyb3IlJzogJFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ0FycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG90eXBlJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b19lbnRyaWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2VudHJpZXMnXSxcblx0JyVBcnJheVByb3RvX2ZvckVhY2glJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZm9yRWFjaCddLFxuXHQnJUFycmF5UHJvdG9fa2V5cyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdrZXlzJ10sXG5cdCclQXJyYXlQcm90b192YWx1ZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAndmFsdWVzJ10sXG5cdCclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0FzeW5jRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclQm9vbGVhblByb3RvdHlwZSUnOiBbJ0Jvb2xlYW4nLCAncHJvdG90eXBlJ10sXG5cdCclRGF0YVZpZXdQcm90b3R5cGUlJzogWydEYXRhVmlldycsICdwcm90b3R5cGUnXSxcblx0JyVEYXRlUHJvdG90eXBlJSc6IFsnRGF0ZScsICdwcm90b3R5cGUnXSxcblx0JyVFcnJvclByb3RvdHlwZSUnOiBbJ0Vycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBbJ0V2YWxFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQ2NEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IFsnRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDhBcnJheVByb3RvdHlwZSUnOiBbJ0ludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnSW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnSW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVKU09OUGFyc2UlJzogWydKU09OJywgJ3BhcnNlJ10sXG5cdCclSlNPTlN0cmluZ2lmeSUnOiBbJ0pTT04nLCAnc3RyaW5naWZ5J10sXG5cdCclTWFwUHJvdG90eXBlJSc6IFsnTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJU51bWJlclByb3RvdHlwZSUnOiBbJ051bWJlcicsICdwcm90b3R5cGUnXSxcblx0JyVPYmplY3RQcm90b3R5cGUlJzogWydPYmplY3QnLCAncHJvdG90eXBlJ10sXG5cdCclT2JqUHJvdG9fdG9TdHJpbmclJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3RvU3RyaW5nJ10sXG5cdCclT2JqUHJvdG9fdmFsdWVPZiUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndmFsdWVPZiddLFxuXHQnJVByb21pc2VQcm90b3R5cGUlJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZSddLFxuXHQnJVByb21pc2VQcm90b190aGVuJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnLCAndGhlbiddLFxuXHQnJVByb21pc2VfYWxsJSc6IFsnUHJvbWlzZScsICdhbGwnXSxcblx0JyVQcm9taXNlX3JlamVjdCUnOiBbJ1Byb21pc2UnLCAncmVqZWN0J10sXG5cdCclUHJvbWlzZV9yZXNvbHZlJSc6IFsnUHJvbWlzZScsICdyZXNvbHZlJ10sXG5cdCclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBbJ1JhbmdlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogWydSZWZlcmVuY2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWdFeHBQcm90b3R5cGUlJzogWydSZWdFeHAnLCAncHJvdG90eXBlJ10sXG5cdCclU2V0UHJvdG90eXBlJSc6IFsnU2V0JywgJ3Byb3RvdHlwZSddLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnU2hhcmVkQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclU3RyaW5nUHJvdG90eXBlJSc6IFsnU3RyaW5nJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bWJvbFByb3RvdHlwZSUnOiBbJ1N5bWJvbCcsICdwcm90b3R5cGUnXSxcblx0JyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBbJ1N5bnRheEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogWydUeXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVFcnJvclByb3RvdHlwZSUnOiBbJ1R5cGVFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnVWludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDMyQXJyYXlQcm90b3R5cGUlJzogWydVaW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVUklFcnJvclByb3RvdHlwZSUnOiBbJ1VSSUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtNYXBQcm90b3R5cGUlJzogWydXZWFrTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtTZXRQcm90b3R5cGUlJzogWydXZWFrU2V0JywgJ3Byb3RvdHlwZSddXG59O1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciAkY29uY2F0ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIEFycmF5LnByb3RvdHlwZS5jb25jYXQpO1xudmFyICRzcGxpY2VBcHBseSA9IGJpbmQuY2FsbChGdW5jdGlvbi5hcHBseSwgQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG52YXIgJHJlcGxhY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciAkc3RyU2xpY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG52YXIgJGV4ZWMgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgUmVnRXhwLnByb3RvdHlwZS5leGVjKTtcblxuLyogYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvNC4xNy4xNS9kaXN0L2xvZGFzaC5qcyNMNjczNS1MNjc0NCAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14lLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCUkKSkvZztcbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZzsgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgc3RyaW5nVG9QYXRoID0gZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHN0cmluZykge1xuXHR2YXIgZmlyc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAwLCAxKTtcblx0dmFyIGxhc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAtMSk7XG5cdGlmIChmaXJzdCA9PT0gJyUnICYmIGxhc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAnKTtcblx0fSBlbHNlIGlmIChsYXN0ID09PSAnJScgJiYgZmlyc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgb3BlbmluZyBgJWAnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gW107XG5cdCRyZXBsYWNlKHN0cmluZywgcmVQcm9wTmFtZSwgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcblx0XHRyZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBxdW90ZSA/ICRyZXBsYWNlKHN1YlN0cmluZywgcmVFc2NhcGVDaGFyLCAnJDEnKSA6IG51bWJlciB8fCBtYXRjaDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuLyogZW5kIGFkYXB0YXRpb24gKi9cblxudmFyIGdldEJhc2VJbnRyaW5zaWMgPSBmdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljTmFtZSA9IG5hbWU7XG5cdHZhciBhbGlhcztcblx0aWYgKGhhc093bihMRUdBQ1lfQUxJQVNFUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHRhbGlhcyA9IExFR0FDWV9BTElBU0VTW2ludHJpbnNpY05hbWVdO1xuXHRcdGludHJpbnNpY05hbWUgPSAnJScgKyBhbGlhc1swXSArICclJztcblx0fVxuXG5cdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHR2YXIgdmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY05hbWVdO1xuXHRcdGlmICh2YWx1ZSA9PT0gbmVlZHNFdmFsKSB7XG5cdFx0XHR2YWx1ZSA9IGRvRXZhbChpbnRyaW5zaWNOYW1lKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFsaWFzOiBhbGlhcyxcblx0XHRcdG5hbWU6IGludHJpbnNpY05hbWUsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG5cblx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImFsbG93TWlzc2luZ1wiIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHRpZiAoJGV4ZWMoL14lP1teJV0qJT8kLywgbmFtZSkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lJyk7XG5cdH1cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXHR2YXIgaW50cmluc2ljQmFzZU5hbWUgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJztcblxuXHR2YXIgaW50cmluc2ljID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0dmFyIGludHJpbnNpY1JlYWxOYW1lID0gaW50cmluc2ljLm5hbWU7XG5cdHZhciB2YWx1ZSA9IGludHJpbnNpYy52YWx1ZTtcblx0dmFyIHNraXBGdXJ0aGVyQ2FjaGluZyA9IGZhbHNlO1xuXG5cdHZhciBhbGlhcyA9IGludHJpbnNpYy5hbGlhcztcblx0aWYgKGFsaWFzKSB7XG5cdFx0aW50cmluc2ljQmFzZU5hbWUgPSBhbGlhc1swXTtcblx0XHQkc3BsaWNlQXBwbHkocGFydHMsICRjb25jYXQoWzAsIDFdLCBhbGlhcykpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDEsIGlzT3duID0gdHJ1ZTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIHBhcnQgPSBwYXJ0c1tpXTtcblx0XHR2YXIgZmlyc3QgPSAkc3RyU2xpY2UocGFydCwgMCwgMSk7XG5cdFx0dmFyIGxhc3QgPSAkc3RyU2xpY2UocGFydCwgLTEpO1xuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0KGZpcnN0ID09PSAnXCInIHx8IGZpcnN0ID09PSBcIidcIiB8fCBmaXJzdCA9PT0gJ2AnKVxuXHRcdFx0XHR8fCAobGFzdCA9PT0gJ1wiJyB8fCBsYXN0ID09PSBcIidcIiB8fCBsYXN0ID09PSAnYCcpXG5cdFx0XHQpXG5cdFx0XHQmJiBmaXJzdCAhPT0gbGFzdFxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcigncHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcycpO1xuXHRcdH1cblx0XHRpZiAocGFydCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhaXNPd24pIHtcblx0XHRcdHNraXBGdXJ0aGVyQ2FjaGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aW50cmluc2ljQmFzZU5hbWUgKz0gJy4nICsgcGFydDtcblx0XHRpbnRyaW5zaWNSZWFsTmFtZSA9ICclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnO1xuXG5cdFx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNSZWFsTmFtZSkpIHtcblx0XHRcdHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoIShwYXJ0IGluIHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoIWFsbG93TWlzc2luZykge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICgkZ09QRCAmJiAoaSArIDEpID49IHBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0aXNPd24gPSAhIWRlc2M7XG5cblx0XHRcdFx0Ly8gQnkgY29udmVudGlvbiwgd2hlbiBhIGRhdGEgcHJvcGVydHkgaXMgY29udmVydGVkIHRvIGFuIGFjY2Vzc29yXG5cdFx0XHRcdC8vIHByb3BlcnR5IHRvIGVtdWxhdGUgYSBkYXRhIHByb3BlcnR5IHRoYXQgZG9lcyBub3Qgc3VmZmVyIGZyb21cblx0XHRcdFx0Ly8gdGhlIG92ZXJyaWRlIG1pc3Rha2UsIHRoYXQgYWNjZXNzb3IncyBnZXR0ZXIgaXMgbWFya2VkIHdpdGhcblx0XHRcdFx0Ly8gYW4gYG9yaWdpbmFsVmFsdWVgIHByb3BlcnR5LiBIZXJlLCB3aGVuIHdlIGRldGVjdCB0aGlzLCB3ZVxuXHRcdFx0XHQvLyB1cGhvbGQgdGhlIGlsbHVzaW9uIGJ5IHByZXRlbmRpbmcgdG8gc2VlIHRoYXQgb3JpZ2luYWwgZGF0YVxuXHRcdFx0XHQvLyBwcm9wZXJ0eSwgaS5lLiwgcmV0dXJuaW5nIHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZ2V0dGVyXG5cdFx0XHRcdC8vIGl0c2VsZi5cblx0XHRcdFx0aWYgKGlzT3duICYmICdnZXQnIGluIGRlc2MgJiYgISgnb3JpZ2luYWxWYWx1ZScgaW4gZGVzYy5nZXQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZXNjLmdldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpc093biA9IGhhc093bih2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc093biAmJiAhc2tpcEZ1cnRoZXJDYWNoaW5nKSB7XG5cdFx0XHRcdElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IChvYmplY3QpID0+IE9iamVjdFxuICAgIC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KVxuICAgIC5maWx0ZXIoKGtleVN5bWJvbCkgPT4gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwga2V5U3ltYm9sKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbnZhciAkZ09QRCA9IEdldEludHJpbnNpYygnJU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IlJywgdHJ1ZSk7XG5cbmlmICgkZ09QRCkge1xuXHR0cnkge1xuXHRcdCRnT1BEKFtdLCAnbGVuZ3RoJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBnT1BEXG5cdFx0JGdPUEQgPSBudWxsO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGdPUEQ7XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFmdGVyUmVxdWVzdDogcmVxdWlyZSgnLi9hZnRlclJlcXVlc3QuanNvbicpLFxuICBiZWZvcmVSZXF1ZXN0OiByZXF1aXJlKCcuL2JlZm9yZVJlcXVlc3QuanNvbicpLFxuICBicm93c2VyOiByZXF1aXJlKCcuL2Jyb3dzZXIuanNvbicpLFxuICBjYWNoZTogcmVxdWlyZSgnLi9jYWNoZS5qc29uJyksXG4gIGNvbnRlbnQ6IHJlcXVpcmUoJy4vY29udGVudC5qc29uJyksXG4gIGNvb2tpZTogcmVxdWlyZSgnLi9jb29raWUuanNvbicpLFxuICBjcmVhdG9yOiByZXF1aXJlKCcuL2NyZWF0b3IuanNvbicpLFxuICBlbnRyeTogcmVxdWlyZSgnLi9lbnRyeS5qc29uJyksXG4gIGhhcjogcmVxdWlyZSgnLi9oYXIuanNvbicpLFxuICBoZWFkZXI6IHJlcXVpcmUoJy4vaGVhZGVyLmpzb24nKSxcbiAgbG9nOiByZXF1aXJlKCcuL2xvZy5qc29uJyksXG4gIHBhZ2U6IHJlcXVpcmUoJy4vcGFnZS5qc29uJyksXG4gIHBhZ2VUaW1pbmdzOiByZXF1aXJlKCcuL3BhZ2VUaW1pbmdzLmpzb24nKSxcbiAgcG9zdERhdGE6IHJlcXVpcmUoJy4vcG9zdERhdGEuanNvbicpLFxuICBxdWVyeTogcmVxdWlyZSgnLi9xdWVyeS5qc29uJyksXG4gIHJlcXVlc3Q6IHJlcXVpcmUoJy4vcmVxdWVzdC5qc29uJyksXG4gIHJlc3BvbnNlOiByZXF1aXJlKCcuL3Jlc3BvbnNlLmpzb24nKSxcbiAgdGltaW5nczogcmVxdWlyZSgnLi90aW1pbmdzLmpzb24nKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnZXMtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3JzID0gZnVuY3Rpb24gaGFzUHJvcGVydHlEZXNjcmlwdG9ycygpIHtcblx0cmV0dXJuICEhJGRlZmluZVByb3BlcnR5O1xufTtcblxuaGFzUHJvcGVydHlEZXNjcmlwdG9ycy5oYXNBcnJheUxlbmd0aERlZmluZUJ1ZyA9IGZ1bmN0aW9uIGhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnKCkge1xuXHQvLyBub2RlIHYwLjYgaGFzIGEgYnVnIHdoZXJlIGFycmF5IGxlbmd0aHMgY2FuIGJlIFNldCBidXQgbm90IERlZmluZWRcblx0aWYgKCEkZGVmaW5lUHJvcGVydHkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiAkZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHZhbHVlOiAxIH0pLmxlbmd0aCAhPT0gMTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIEZpcmVmb3ggNC0yMiwgZGVmaW5pbmcgbGVuZ3RoIG9uIGFuIGFycmF5IHRocm93cyBhbiBleGNlcHRpb24uXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHlEZXNjcmlwdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRlc3QgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0Zm9vOiB7fVxufTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1Byb3RvKCkge1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yOiBUUyBlcnJvcnMgb24gYW4gaW5oZXJpdGVkIHByb3BlcnR5IGZvciBzb21lIHJlYXNvblxuXHRyZXR1cm4geyBfX3Byb3RvX186IHRlc3QgfS5mb28gPT09IHRlc3QuZm9vXG5cdFx0JiYgISh0ZXN0IGluc3RhbmNlb2YgJE9iamVjdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgY29tcGxleGl0eTogWzIsIDE4XSwgbWF4LXN0YXRlbWVudHM6IFsyLCAzM10gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJykgeyByZXR1cm4gdHJ1ZTsgfVxuXG5cdHZhciBvYmogPSB7fTtcblx0dmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuXHR2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cdGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcblx0Ly8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG5cdC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1WYWwgPSA0Mjtcblx0b2JqW3N5bV0gPSBzeW1WYWw7XG5cdGZvciAoc3ltIGluIG9iaikgeyByZXR1cm4gZmFsc2U7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tdW5yZWFjaGFibGUtbG9vcFxuXHRpZiAodHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG5cdGlmIChzeW1zLmxlbmd0aCAhPT0gMSB8fCBzeW1zWzBdICE9PSBzeW0pIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSk7XG5cdFx0aWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG52YXIgJGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKGNhbGwsICRoYXNPd24pO1xuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHgpIHtcblx0dmFyIHR5cGUgPSB0eXBlb2YgeDtcblx0cmV0dXJuIHggIT09IG51bGwgJiYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdmdW5jdGlvbicpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlKSB7XG5cdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0cmF2ZXJzZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNjaGVtYSwgb3B0cywgY2IpIHtcbiAgLy8gTGVnYWN5IHN1cHBvcnQgZm9yIHYwLjMuMSBhbmQgZWFybGllci5cbiAgaWYgKHR5cGVvZiBvcHRzID09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgY2IgPSBvcHRzLmNiIHx8IGNiO1xuICB2YXIgcHJlID0gKHR5cGVvZiBjYiA9PSAnZnVuY3Rpb24nKSA/IGNiIDogY2IucHJlIHx8IGZ1bmN0aW9uKCkge307XG4gIHZhciBwb3N0ID0gY2IucG9zdCB8fCBmdW5jdGlvbigpIHt9O1xuXG4gIF90cmF2ZXJzZShvcHRzLCBwcmUsIHBvc3QsIHNjaGVtYSwgJycsIHNjaGVtYSk7XG59O1xuXG5cbnRyYXZlcnNlLmtleXdvcmRzID0ge1xuICBhZGRpdGlvbmFsSXRlbXM6IHRydWUsXG4gIGl0ZW1zOiB0cnVlLFxuICBjb250YWluczogdHJ1ZSxcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gIHByb3BlcnR5TmFtZXM6IHRydWUsXG4gIG5vdDogdHJ1ZVxufTtcblxudHJhdmVyc2UuYXJyYXlLZXl3b3JkcyA9IHtcbiAgaXRlbXM6IHRydWUsXG4gIGFsbE9mOiB0cnVlLFxuICBhbnlPZjogdHJ1ZSxcbiAgb25lT2Y6IHRydWVcbn07XG5cbnRyYXZlcnNlLnByb3BzS2V5d29yZHMgPSB7XG4gIGRlZmluaXRpb25zOiB0cnVlLFxuICBwcm9wZXJ0aWVzOiB0cnVlLFxuICBwYXR0ZXJuUHJvcGVydGllczogdHJ1ZSxcbiAgZGVwZW5kZW5jaWVzOiB0cnVlXG59O1xuXG50cmF2ZXJzZS5za2lwS2V5d29yZHMgPSB7XG4gIGRlZmF1bHQ6IHRydWUsXG4gIGVudW06IHRydWUsXG4gIGNvbnN0OiB0cnVlLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgbWF4aW11bTogdHJ1ZSxcbiAgbWluaW11bTogdHJ1ZSxcbiAgZXhjbHVzaXZlTWF4aW11bTogdHJ1ZSxcbiAgZXhjbHVzaXZlTWluaW11bTogdHJ1ZSxcbiAgbXVsdGlwbGVPZjogdHJ1ZSxcbiAgbWF4TGVuZ3RoOiB0cnVlLFxuICBtaW5MZW5ndGg6IHRydWUsXG4gIHBhdHRlcm46IHRydWUsXG4gIGZvcm1hdDogdHJ1ZSxcbiAgbWF4SXRlbXM6IHRydWUsXG4gIG1pbkl0ZW1zOiB0cnVlLFxuICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgbWF4UHJvcGVydGllczogdHJ1ZSxcbiAgbWluUHJvcGVydGllczogdHJ1ZVxufTtcblxuXG5mdW5jdGlvbiBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hlbWEsIGpzb25QdHIsIHJvb3RTY2hlbWEsIHBhcmVudEpzb25QdHIsIHBhcmVudEtleXdvcmQsIHBhcmVudFNjaGVtYSwga2V5SW5kZXgpIHtcbiAgaWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICBwcmUoc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICB2YXIgc2NoID0gc2NoZW1hW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2gpKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdHJhdmVyc2UuYXJyYXlLZXl3b3Jkcykge1xuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzY2gubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hbaV0sIGpzb25QdHIgKyAnLycgKyBrZXkgKyAnLycgKyBpLCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHRyYXZlcnNlLnByb3BzS2V5d29yZHMpIHtcbiAgICAgICAgaWYgKHNjaCAmJiB0eXBlb2Ygc2NoID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzY2gpXG4gICAgICAgICAgICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hbcHJvcF0sIGpzb25QdHIgKyAnLycgKyBrZXkgKyAnLycgKyBlc2NhcGVKc29uUHRyKHByb3ApLCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSwgcHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHRyYXZlcnNlLmtleXdvcmRzIHx8IChvcHRzLmFsbEtleXMgJiYgIShrZXkgaW4gdHJhdmVyc2Uuc2tpcEtleXdvcmRzKSkpIHtcbiAgICAgICAgX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoLCBqc29uUHRyICsgJy8nICsga2V5LCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIHBvc3Qoc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGVzY2FwZUpzb25QdHIoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XG59XG4iLCIvL2ZpbHRlciB3aWxsIHJlZW1pdCB0aGUgZGF0YSBpZiBjYihlcnIscGFzcykgcGFzcyBpcyB0cnV0aHlcblxuLy8gcmVkdWNlIGlzIG1vcmUgdHJpY2t5XG4vLyBtYXliZSB3ZSB3YW50IHRvIGdyb3VwIHRoZSByZWR1Y3Rpb25zIG9yIGVtaXQgcHJvZ3Jlc3MgdXBkYXRlcyBvY2Nhc2lvbmFsbHlcbi8vIHRoZSBtb3N0IGJhc2ljIHJlZHVjZSBqdXN0IGVtaXRzIG9uZSAnZGF0YScgZXZlbnQgYWZ0ZXIgaXQgaGFzIHJlY2lldmVkICdlbmQnXG5cblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuXG5cbi8vY3JlYXRlIGFuIGV2ZW50IHN0cmVhbSBhbmQgYXBwbHkgZnVuY3Rpb24gdG8gZWFjaCAud3JpdGVcbi8vZW1pdHRpbmcgZWFjaCByZXNwb25zZSBhcyBkYXRhXG4vL3VubGVzcyBpdCdzIGFuIGVtcHR5IGNhbGxiYWNrXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1hcHBlciwgb3B0cykge1xuXG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgICAsIGlucHV0cyA9IDBcbiAgICAsIG91dHB1dHMgPSAwXG4gICAgLCBlbmRlZCA9IGZhbHNlXG4gICAgLCBwYXVzZWQgPSBmYWxzZVxuICAgICwgZGVzdHJveWVkID0gZmFsc2VcbiAgICAsIGxhc3RXcml0dGVuID0gMFxuICAgICwgaW5OZXh0ID0gZmFsc2VcblxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIGVycm9yRXZlbnROYW1lID0gb3B0cy5mYWlsdXJlcyA/ICdmYWlsdXJlJyA6ICdlcnJvcic7XG5cbiAgLy8gSXRlbXMgdGhhdCBhcmUgbm90IHJlYWR5IHRvIGJlIHdyaXR0ZW4geWV0IChiZWNhdXNlIHRoZXkgd291bGQgY29tZSBvdXQgb2ZcbiAgLy8gb3JkZXIpIGdldCBzdHVjayBpbiBhIHF1ZXVlIGZvciBsYXRlci5cbiAgdmFyIHdyaXRlUXVldWUgPSB7fVxuXG4gIHN0cmVhbS53cml0YWJsZSA9IHRydWVcbiAgc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZVxuXG4gIGZ1bmN0aW9uIHF1ZXVlRGF0YSAoZGF0YSwgbnVtYmVyKSB7XG4gICAgdmFyIG5leHRUb1dyaXRlID0gbGFzdFdyaXR0ZW4gKyAxXG5cbiAgICBpZiAobnVtYmVyID09PSBuZXh0VG9Xcml0ZSkge1xuICAgICAgLy8gSWYgaXQncyBuZXh0LCBhbmQgaXRzIG5vdCB1bmRlZmluZWQgd3JpdGUgaXRcbiAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RyZWFtLmVtaXQuYXBwbHkoc3RyZWFtLCBbJ2RhdGEnLCBkYXRhXSlcbiAgICAgIH1cbiAgICAgIGxhc3RXcml0dGVuICsrXG4gICAgICBuZXh0VG9Xcml0ZSArK1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UgcXVldWUgaXQgZm9yIGxhdGVyLlxuICAgICAgd3JpdGVRdWV1ZVtudW1iZXJdID0gZGF0YVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBuZXh0IHZhbHVlIGlzIGluIHRoZSBxdWV1ZSwgd3JpdGUgaXRcbiAgICBpZiAod3JpdGVRdWV1ZS5oYXNPd25Qcm9wZXJ0eShuZXh0VG9Xcml0ZSkpIHtcbiAgICAgIHZhciBkYXRhVG9Xcml0ZSA9IHdyaXRlUXVldWVbbmV4dFRvV3JpdGVdXG4gICAgICBkZWxldGUgd3JpdGVRdWV1ZVtuZXh0VG9Xcml0ZV1cbiAgICAgIHJldHVybiBxdWV1ZURhdGEoZGF0YVRvV3JpdGUsIG5leHRUb1dyaXRlKVxuICAgIH1cblxuICAgIG91dHB1dHMgKytcbiAgICBpZihpbnB1dHMgPT09IG91dHB1dHMpIHtcbiAgICAgIGlmKHBhdXNlZCkgcGF1c2VkID0gZmFsc2UsIHN0cmVhbS5lbWl0KCdkcmFpbicpIC8vd3JpdHRlbiBhbGwgdGhlIGluY29taW5nIGV2ZW50c1xuICAgICAgaWYoZW5kZWQpIGVuZCgpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoZXJyLCBkYXRhLCBudW1iZXIpIHtcbiAgICBpZihkZXN0cm95ZWQpIHJldHVyblxuICAgIGluTmV4dCA9IHRydWVcblxuICAgIGlmICghZXJyIHx8IG9wdHMuZmFpbHVyZXMpIHtcbiAgICAgIHF1ZXVlRGF0YShkYXRhLCBudW1iZXIpXG4gICAgfVxuXG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQuYXBwbHkoc3RyZWFtLCBbIGVycm9yRXZlbnROYW1lLCBlcnIgXSk7XG4gICAgfVxuXG4gICAgaW5OZXh0ID0gZmFsc2U7XG4gIH1cblxuICAvLyBXcmFwIHRoZSBtYXBwZXIgZnVuY3Rpb24gYnkgY2FsbGluZyBpdHMgY2FsbGJhY2sgd2l0aCB0aGUgb3JkZXIgbnVtYmVyIG9mXG4gIC8vIHRoZSBpdGVtIGluIHRoZSBzdHJlYW0uXG4gIGZ1bmN0aW9uIHdyYXBwZWRNYXBwZXIgKGlucHV0LCBudW1iZXIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG1hcHBlci5jYWxsKG51bGwsIGlucHV0LCBmdW5jdGlvbihlcnIsIGRhdGEpe1xuICAgICAgY2FsbGJhY2soZXJyLCBkYXRhLCBudW1iZXIpXG4gICAgfSlcbiAgfVxuXG4gIHN0cmVhbS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoZW5kZWQpIHRocm93IG5ldyBFcnJvcignbWFwIHN0cmVhbSBpcyBub3Qgd3JpdGFibGUnKVxuICAgIGluTmV4dCA9IGZhbHNlXG4gICAgaW5wdXRzICsrXG5cbiAgICB0cnkge1xuICAgICAgLy9jYXRjaCBzeW5jIGVycm9ycyBhbmQgaGFuZGxlIHRoZW0gbGlrZSBhc3luYyBlcnJvcnNcbiAgICAgIHZhciB3cml0dGVuID0gd3JhcHBlZE1hcHBlcihkYXRhLCBpbnB1dHMsIG5leHQpXG4gICAgICBwYXVzZWQgPSAod3JpdHRlbiA9PT0gZmFsc2UpXG4gICAgICByZXR1cm4gIXBhdXNlZFxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy9pZiB0aGUgY2FsbGJhY2sgaGFzIGJlZW4gY2FsbGVkIHN5bmNyb25vdXNseSwgYW5kIHRoZSBlcnJvclxuICAgICAgLy9oYXMgb2NjdXJlZCBpbiBhbiBsaXN0ZW5lciwgdGhyb3cgaXQgYWdhaW4uXG4gICAgICBpZihpbk5leHQpXG4gICAgICAgIHRocm93IGVyclxuICAgICAgbmV4dChlcnIpXG4gICAgICByZXR1cm4gIXBhdXNlZFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZCAoZGF0YSkge1xuICAgIC8vaWYgZW5kIHdhcyBjYWxsZWQgd2l0aCBhcmdzLCB3cml0ZSBpdCwgXG4gICAgZW5kZWQgPSB0cnVlIC8vd3JpdGUgd2lsbCBlbWl0ICdlbmQnIGlmIGVuZGVkIGlzIHRydWVcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZVxuICAgIGlmKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHF1ZXVlRGF0YShkYXRhLCBpbnB1dHMpXG4gICAgfSBlbHNlIGlmIChpbnB1dHMgPT0gb3V0cHV0cykgeyAvL3dhaXQgZm9yIHByb2Nlc3NpbmcgXG4gICAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZSwgc3RyZWFtLmVtaXQoJ2VuZCcpLCBzdHJlYW0uZGVzdHJveSgpIFxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5lbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICBlbmQoZGF0YSlcbiAgfVxuXG4gIHN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGVuZGVkID0gZGVzdHJveWVkID0gdHJ1ZVxuICAgIHN0cmVhbS53cml0YWJsZSA9IHN0cmVhbS5yZWFkYWJsZSA9IHBhdXNlZCA9IGZhbHNlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnY2xvc2UnKVxuICAgIH0pXG4gIH1cbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIHBhdXNlZCA9IHRydWVcbiAgfVxuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGF1c2VkID0gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBzdHJlYW1cbn1cblxuXG5cblxuIiwidmFyIGhhc01hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbicgJiYgTWFwLnByb3RvdHlwZTtcbnZhciBtYXBTaXplRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgaGFzTWFwID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihNYXAucHJvdG90eXBlLCAnc2l6ZScpIDogbnVsbDtcbnZhciBtYXBTaXplID0gaGFzTWFwICYmIG1hcFNpemVEZXNjcmlwdG9yICYmIHR5cGVvZiBtYXBTaXplRGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgPyBtYXBTaXplRGVzY3JpcHRvci5nZXQgOiBudWxsO1xudmFyIG1hcEZvckVhY2ggPSBoYXNNYXAgJiYgTWFwLnByb3RvdHlwZS5mb3JFYWNoO1xudmFyIGhhc1NldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgJiYgU2V0LnByb3RvdHlwZTtcbnZhciBzZXRTaXplRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgaGFzU2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTZXQucHJvdG90eXBlLCAnc2l6ZScpIDogbnVsbDtcbnZhciBzZXRTaXplID0gaGFzU2V0ICYmIHNldFNpemVEZXNjcmlwdG9yICYmIHR5cGVvZiBzZXRTaXplRGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgPyBzZXRTaXplRGVzY3JpcHRvci5nZXQgOiBudWxsO1xudmFyIHNldEZvckVhY2ggPSBoYXNTZXQgJiYgU2V0LnByb3RvdHlwZS5mb3JFYWNoO1xudmFyIGhhc1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrTWFwLnByb3RvdHlwZTtcbnZhciB3ZWFrTWFwSGFzID0gaGFzV2Vha01hcCA/IFdlYWtNYXAucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nICYmIFdlYWtTZXQucHJvdG90eXBlO1xudmFyIHdlYWtTZXRIYXMgPSBoYXNXZWFrU2V0ID8gV2Vha1NldC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrUmVmID0gdHlwZW9mIFdlYWtSZWYgPT09ICdmdW5jdGlvbicgJiYgV2Vha1JlZi5wcm90b3R5cGU7XG52YXIgd2Vha1JlZkRlcmVmID0gaGFzV2Vha1JlZiA/IFdlYWtSZWYucHJvdG90eXBlLmRlcmVmIDogbnVsbDtcbnZhciBib29sZWFuVmFsdWVPZiA9IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2Y7XG52YXIgb2JqZWN0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgJG1hdGNoID0gU3RyaW5nLnByb3RvdHlwZS5tYXRjaDtcbnZhciAkc2xpY2UgPSBTdHJpbmcucHJvdG90eXBlLnNsaWNlO1xudmFyICRyZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xudmFyICR0b1VwcGVyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9VcHBlckNhc2U7XG52YXIgJHRvTG93ZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZTtcbnZhciAkdGVzdCA9IFJlZ0V4cC5wcm90b3R5cGUudGVzdDtcbnZhciAkY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciAkam9pbiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xudmFyICRhcnJTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciAkZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGJpZ0ludFZhbHVlT2YgPSB0eXBlb2YgQmlnSW50ID09PSAnZnVuY3Rpb24nID8gQmlnSW50LnByb3RvdHlwZS52YWx1ZU9mIDogbnVsbDtcbnZhciBnT1BTID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBzeW1Ub1N0cmluZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcgPyBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nIDogbnVsbDtcbnZhciBoYXNTaGFtbWVkU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ29iamVjdCc7XG4vLyBpZSwgYGhhcy10b3N0cmluZ3RhZy9zaGFtc1xudmFyIHRvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgJiYgKHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IGhhc1NoYW1tZWRTeW1ib2xzID8gJ29iamVjdCcgOiAnc3ltYm9sJylcbiAgICA/IFN5bWJvbC50b1N0cmluZ1RhZ1xuICAgIDogbnVsbDtcbnZhciBpc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG52YXIgZ1BPID0gKHR5cGVvZiBSZWZsZWN0ID09PSAnZnVuY3Rpb24nID8gUmVmbGVjdC5nZXRQcm90b3R5cGVPZiA6IE9iamVjdC5nZXRQcm90b3R5cGVPZikgfHwgKFxuICAgIFtdLl9fcHJvdG9fXyA9PT0gQXJyYXkucHJvdG90eXBlIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgPyBmdW5jdGlvbiAoTykge1xuICAgICAgICAgICAgcmV0dXJuIE8uX19wcm90b19fOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsXG4pO1xuXG5mdW5jdGlvbiBhZGROdW1lcmljU2VwYXJhdG9yKG51bSwgc3RyKSB7XG4gICAgaWYgKFxuICAgICAgICBudW0gPT09IEluZmluaXR5XG4gICAgICAgIHx8IG51bSA9PT0gLUluZmluaXR5XG4gICAgICAgIHx8IG51bSAhPT0gbnVtXG4gICAgICAgIHx8IChudW0gJiYgbnVtID4gLTEwMDAgJiYgbnVtIDwgMTAwMClcbiAgICAgICAgfHwgJHRlc3QuY2FsbCgvZS8sIHN0cilcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgdmFyIHNlcFJlZ2V4ID0gL1swLTldKD89KD86WzAtOV17M30pKyg/IVswLTldKSkvZztcbiAgICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIGludCA9IG51bSA8IDAgPyAtJGZsb29yKC1udW0pIDogJGZsb29yKG51bSk7IC8vIHRydW5jKG51bSlcbiAgICAgICAgaWYgKGludCAhPT0gbnVtKSB7XG4gICAgICAgICAgICB2YXIgaW50U3RyID0gU3RyaW5nKGludCk7XG4gICAgICAgICAgICB2YXIgZGVjID0gJHNsaWNlLmNhbGwoc3RyLCBpbnRTdHIubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChpbnRTdHIsIHNlcFJlZ2V4LCAnJCZfJykgKyAnLicgKyAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoZGVjLCAvKFswLTldezN9KS9nLCAnJCZfJyksIC9fJC8sICcnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChzdHIsIHNlcFJlZ2V4LCAnJCZfJyk7XG59XG5cbnZhciB1dGlsSW5zcGVjdCA9IHJlcXVpcmUoJy4vdXRpbC5pbnNwZWN0Jyk7XG52YXIgaW5zcGVjdEN1c3RvbSA9IHV0aWxJbnNwZWN0LmN1c3RvbTtcbnZhciBpbnNwZWN0U3ltYm9sID0gaXNTeW1ib2woaW5zcGVjdEN1c3RvbSkgPyBpbnNwZWN0Q3VzdG9tIDogbnVsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbnNwZWN0XyhvYmosIG9wdGlvbnMsIGRlcHRoLCBzZWVuKSB7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKGhhcyhvcHRzLCAncXVvdGVTdHlsZScpICYmIChvcHRzLnF1b3RlU3R5bGUgIT09ICdzaW5nbGUnICYmIG9wdHMucXVvdGVTdHlsZSAhPT0gJ2RvdWJsZScpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcInF1b3RlU3R5bGVcIiBtdXN0IGJlIFwic2luZ2xlXCIgb3IgXCJkb3VibGVcIicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnbWF4U3RyaW5nTGVuZ3RoJykgJiYgKHR5cGVvZiBvcHRzLm1heFN0cmluZ0xlbmd0aCA9PT0gJ251bWJlcidcbiAgICAgICAgICAgID8gb3B0cy5tYXhTdHJpbmdMZW5ndGggPCAwICYmIG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBJbmZpbml0eVxuICAgICAgICAgICAgOiBvcHRzLm1heFN0cmluZ0xlbmd0aCAhPT0gbnVsbFxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm1heFN0cmluZ0xlbmd0aFwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIEluZmluaXR5LCBvciBgbnVsbGAnKTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbUluc3BlY3QgPSBoYXMob3B0cywgJ2N1c3RvbUluc3BlY3QnKSA/IG9wdHMuY3VzdG9tSW5zcGVjdCA6IHRydWU7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21JbnNwZWN0ICE9PSAnYm9vbGVhbicgJiYgY3VzdG9tSW5zcGVjdCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwiY3VzdG9tSW5zcGVjdFwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAsIGBmYWxzZWAsIG9yIGBcXCdzeW1ib2xcXCdgJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBoYXMob3B0cywgJ2luZGVudCcpXG4gICAgICAgICYmIG9wdHMuaW5kZW50ICE9PSBudWxsXG4gICAgICAgICYmIG9wdHMuaW5kZW50ICE9PSAnXFx0J1xuICAgICAgICAmJiAhKHBhcnNlSW50KG9wdHMuaW5kZW50LCAxMCkgPT09IG9wdHMuaW5kZW50ICYmIG9wdHMuaW5kZW50ID4gMClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwiaW5kZW50XCIgbXVzdCBiZSBcIlxcXFx0XCIsIGFuIGludGVnZXIgPiAwLCBvciBgbnVsbGAnKTtcbiAgICB9XG4gICAgaWYgKGhhcyhvcHRzLCAnbnVtZXJpY1NlcGFyYXRvcicpICYmIHR5cGVvZiBvcHRzLm51bWVyaWNTZXBhcmF0b3IgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJudW1lcmljU2VwYXJhdG9yXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCBvciBgZmFsc2VgJyk7XG4gICAgfVxuICAgIHZhciBudW1lcmljU2VwYXJhdG9yID0gb3B0cy5udW1lcmljU2VwYXJhdG9yO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBvYmogPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZyhvYmosIG9wdHMpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKG9iaiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5IC8gb2JqID4gMCA/ICcwJyA6ICctMCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ciA9IFN0cmluZyhvYmopO1xuICAgICAgICByZXR1cm4gbnVtZXJpY1NlcGFyYXRvciA/IGFkZE51bWVyaWNTZXBhcmF0b3Iob2JqLCBzdHIpIDogc3RyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgdmFyIGJpZ0ludFN0ciA9IFN0cmluZyhvYmopICsgJ24nO1xuICAgICAgICByZXR1cm4gbnVtZXJpY1NlcGFyYXRvciA/IGFkZE51bWVyaWNTZXBhcmF0b3Iob2JqLCBiaWdJbnRTdHIpIDogYmlnSW50U3RyO1xuICAgIH1cblxuICAgIHZhciBtYXhEZXB0aCA9IHR5cGVvZiBvcHRzLmRlcHRoID09PSAndW5kZWZpbmVkJyA/IDUgOiBvcHRzLmRlcHRoO1xuICAgIGlmICh0eXBlb2YgZGVwdGggPT09ICd1bmRlZmluZWQnKSB7IGRlcHRoID0gMDsgfVxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCAmJiBtYXhEZXB0aCA+IDAgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkob2JqKSA/ICdbQXJyYXldJyA6ICdbT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgdmFyIGluZGVudCA9IGdldEluZGVudChvcHRzLCBkZXB0aCk7XG5cbiAgICBpZiAodHlwZW9mIHNlZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlZW4gPSBbXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4T2Yoc2Vlbiwgb2JqKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zcGVjdCh2YWx1ZSwgZnJvbSwgbm9JbmRlbnQpIHtcbiAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgIHNlZW4gPSAkYXJyU2xpY2UuY2FsbChzZWVuKTtcbiAgICAgICAgICAgIHNlZW4ucHVzaChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9JbmRlbnQpIHtcbiAgICAgICAgICAgIHZhciBuZXdPcHRzID0ge1xuICAgICAgICAgICAgICAgIGRlcHRoOiBvcHRzLmRlcHRoXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGhhcyhvcHRzLCAncXVvdGVTdHlsZScpKSB7XG4gICAgICAgICAgICAgICAgbmV3T3B0cy5xdW90ZVN0eWxlID0gb3B0cy5xdW90ZVN0eWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBuZXdPcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnNwZWN0Xyh2YWx1ZSwgb3B0cywgZGVwdGggKyAxLCBzZWVuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNSZWdFeHAob2JqKSkgeyAvLyBpbiBvbGRlciBlbmdpbmVzLCByZWdleGVzIGFyZSBjYWxsYWJsZVxuICAgICAgICB2YXIgbmFtZSA9IG5hbWVPZihvYmopO1xuICAgICAgICB2YXIga2V5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgcmV0dXJuICdbRnVuY3Rpb24nICsgKG5hbWUgPyAnOiAnICsgbmFtZSA6ICcgKGFub255bW91cyknKSArICddJyArIChrZXlzLmxlbmd0aCA+IDAgPyAnIHsgJyArICRqb2luLmNhbGwoa2V5cywgJywgJykgKyAnIH0nIDogJycpO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wob2JqKSkge1xuICAgICAgICB2YXIgc3ltU3RyaW5nID0gaGFzU2hhbW1lZFN5bWJvbHMgPyAkcmVwbGFjZS5jYWxsKFN0cmluZyhvYmopLCAvXihTeW1ib2xcXCguKlxcKSlfW14pXSokLywgJyQxJykgOiBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhaGFzU2hhbW1lZFN5bWJvbHMgPyBtYXJrQm94ZWQoc3ltU3RyaW5nKSA6IHN5bVN0cmluZztcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChvYmopKSB7XG4gICAgICAgIHZhciBzID0gJzwnICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpO1xuICAgICAgICB2YXIgYXR0cnMgPSBvYmouYXR0cmlidXRlcyB8fCBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcyArPSAnICcgKyBhdHRyc1tpXS5uYW1lICsgJz0nICsgd3JhcFF1b3RlcyhxdW90ZShhdHRyc1tpXS52YWx1ZSksICdkb3VibGUnLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBzICs9ICc+JztcbiAgICAgICAgaWYgKG9iai5jaGlsZE5vZGVzICYmIG9iai5jaGlsZE5vZGVzLmxlbmd0aCkgeyBzICs9ICcuLi4nOyB9XG4gICAgICAgIHMgKz0gJzwvJyArICR0b0xvd2VyQ2FzZS5jYWxsKFN0cmluZyhvYmoubm9kZU5hbWUpKSArICc+JztcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKG9iai5sZW5ndGggPT09IDApIHsgcmV0dXJuICdbXSc7IH1cbiAgICAgICAgdmFyIHhzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAoaW5kZW50ICYmICFzaW5nbGVMaW5lVmFsdWVzKHhzKSkge1xuICAgICAgICAgICAgcmV0dXJuICdbJyArIGluZGVudGVkSm9pbih4cywgaW5kZW50KSArICddJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ1sgJyArICRqb2luLmNhbGwoeHMsICcsICcpICsgJyBdJztcbiAgICB9XG4gICAgaWYgKGlzRXJyb3Iob2JqKSkge1xuICAgICAgICB2YXIgcGFydHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmICghKCdjYXVzZScgaW4gRXJyb3IucHJvdG90eXBlKSAmJiAnY2F1c2UnIGluIG9iaiAmJiAhaXNFbnVtZXJhYmxlLmNhbGwob2JqLCAnY2F1c2UnKSkge1xuICAgICAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoJ1tjYXVzZV06ICcgKyBpbnNwZWN0KG9iai5jYXVzZSksIHBhcnRzKSwgJywgJykgKyAnIH0nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHsgcmV0dXJuICdbJyArIFN0cmluZyhvYmopICsgJ10nOyB9XG4gICAgICAgIHJldHVybiAneyBbJyArIFN0cmluZyhvYmopICsgJ10gJyArICRqb2luLmNhbGwocGFydHMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIGN1c3RvbUluc3BlY3QpIHtcbiAgICAgICAgaWYgKGluc3BlY3RTeW1ib2wgJiYgdHlwZW9mIG9ialtpbnNwZWN0U3ltYm9sXSA9PT0gJ2Z1bmN0aW9uJyAmJiB1dGlsSW5zcGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxJbnNwZWN0KG9iaiwgeyBkZXB0aDogbWF4RGVwdGggLSBkZXB0aCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJyAmJiB0eXBlb2Ygb2JqLmluc3BlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmouaW5zcGVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc01hcChvYmopKSB7XG4gICAgICAgIHZhciBtYXBQYXJ0cyA9IFtdO1xuICAgICAgICBpZiAobWFwRm9yRWFjaCkge1xuICAgICAgICAgICAgbWFwRm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICBtYXBQYXJ0cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmosIHRydWUpICsgJyA9PiAnICsgaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdNYXAnLCBtYXBTaXplLmNhbGwob2JqKSwgbWFwUGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1NldChvYmopKSB7XG4gICAgICAgIHZhciBzZXRQYXJ0cyA9IFtdO1xuICAgICAgICBpZiAoc2V0Rm9yRWFjaCkge1xuICAgICAgICAgICAgc2V0Rm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0UGFydHMucHVzaChpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ1NldCcsIHNldFNpemUuY2FsbChvYmopLCBzZXRQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha01hcChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrTWFwJyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtTZXQob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1NldCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrUmVmKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtSZWYnKTtcbiAgICB9XG4gICAgaWYgKGlzTnVtYmVyKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KE51bWJlcihvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ0ludChvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCb29sZWFuKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChib29sZWFuVmFsdWVPZi5jYWxsKG9iaikpO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoU3RyaW5nKG9iaikpKTtcbiAgICB9XG4gICAgLy8gbm90ZTogaW4gSUUgOCwgc29tZXRpbWVzIGBnbG9iYWwgIT09IHdpbmRvd2AgYnV0IGJvdGggYXJlIHRoZSBwcm90b3R5cGVzIG9mIGVhY2ggb3RoZXJcbiAgICAvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSB3aW5kb3cpIHtcbiAgICAgICAgcmV0dXJuICd7IFtvYmplY3QgV2luZG93XSB9JztcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gZ2xvYmFsVGhpcylcbiAgICAgICAgfHwgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gZ2xvYmFsKVxuICAgICkge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBnbG9iYWxUaGlzXSB9JztcbiAgICB9XG4gICAgaWYgKCFpc0RhdGUob2JqKSAmJiAhaXNSZWdFeHAob2JqKSkge1xuICAgICAgICB2YXIgeXMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIHZhciBpc1BsYWluT2JqZWN0ID0gZ1BPID8gZ1BPKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGUgOiBvYmogaW5zdGFuY2VvZiBPYmplY3QgfHwgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG4gICAgICAgIHZhciBwcm90b1RhZyA9IG9iaiBpbnN0YW5jZW9mIE9iamVjdCA/ICcnIDogJ251bGwgcHJvdG90eXBlJztcbiAgICAgICAgdmFyIHN0cmluZ1RhZyA9ICFpc1BsYWluT2JqZWN0ICYmIHRvU3RyaW5nVGFnICYmIE9iamVjdChvYmopID09PSBvYmogJiYgdG9TdHJpbmdUYWcgaW4gb2JqID8gJHNsaWNlLmNhbGwodG9TdHIob2JqKSwgOCwgLTEpIDogcHJvdG9UYWcgPyAnT2JqZWN0JyA6ICcnO1xuICAgICAgICB2YXIgY29uc3RydWN0b3JUYWcgPSBpc1BsYWluT2JqZWN0IHx8IHR5cGVvZiBvYmouY29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicgPyAnJyA6IG9iai5jb25zdHJ1Y3Rvci5uYW1lID8gb2JqLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgOiAnJztcbiAgICAgICAgdmFyIHRhZyA9IGNvbnN0cnVjdG9yVGFnICsgKHN0cmluZ1RhZyB8fCBwcm90b1RhZyA/ICdbJyArICRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKFtdLCBzdHJpbmdUYWcgfHwgW10sIHByb3RvVGFnIHx8IFtdKSwgJzogJykgKyAnXSAnIDogJycpO1xuICAgICAgICBpZiAoeXMubGVuZ3RoID09PSAwKSB7IHJldHVybiB0YWcgKyAne30nOyB9XG4gICAgICAgIGlmIChpbmRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWcgKyAneycgKyBpbmRlbnRlZEpvaW4oeXMsIGluZGVudCkgKyAnfSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhZyArICd7ICcgKyAkam9pbi5jYWxsKHlzLCAnLCAnKSArICcgfSc7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcob2JqKTtcbn07XG5cbmZ1bmN0aW9uIHdyYXBRdW90ZXMocywgZGVmYXVsdFN0eWxlLCBvcHRzKSB7XG4gICAgdmFyIHF1b3RlQ2hhciA9IChvcHRzLnF1b3RlU3R5bGUgfHwgZGVmYXVsdFN0eWxlKSA9PT0gJ2RvdWJsZScgPyAnXCInIDogXCInXCI7XG4gICAgcmV0dXJuIHF1b3RlQ2hhciArIHMgKyBxdW90ZUNoYXI7XG59XG5cbmZ1bmN0aW9uIHF1b3RlKHMpIHtcbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChTdHJpbmcocyksIC9cIi9nLCAnJnF1b3Q7Jyk7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBBcnJheV0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNEYXRlKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBSZWdFeHBdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBFcnJvcl0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBTdHJpbmddJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzTnVtYmVyKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBCb29sZWFuXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5cbi8vIFN5bWJvbCBhbmQgQmlnSW50IGRvIGhhdmUgU3ltYm9sLnRvU3RyaW5nVGFnIGJ5IHNwZWMsIHNvIHRoYXQgY2FuJ3QgYmUgdXNlZCB0byBlbGltaW5hdGUgZmFsc2UgcG9zaXRpdmVzXG5mdW5jdGlvbiBpc1N5bWJvbChvYmopIHtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogaW5zdGFuY2VvZiBTeW1ib2w7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIXN5bVRvU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3ltVG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNCaWdJbnQob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIWJpZ0ludFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5IHx8IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiB0aGlzOyB9O1xuZnVuY3Rpb24gaGFzKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIGhhc093bi5jYWxsKG9iaiwga2V5KTtcbn1cblxuZnVuY3Rpb24gdG9TdHIob2JqKSB7XG4gICAgcmV0dXJuIG9iamVjdFRvU3RyaW5nLmNhbGwob2JqKTtcbn1cblxuZnVuY3Rpb24gbmFtZU9mKGYpIHtcbiAgICBpZiAoZi5uYW1lKSB7IHJldHVybiBmLm5hbWU7IH1cbiAgICB2YXIgbSA9ICRtYXRjaC5jYWxsKGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChmKSwgL15mdW5jdGlvblxccyooW1xcdyRdKykvKTtcbiAgICBpZiAobSkgeyByZXR1cm4gbVsxXTsgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gICAgaWYgKHhzLmluZGV4T2YpIHsgcmV0dXJuIHhzLmluZGV4T2YoeCk7IH1cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoeHNbaV0gPT09IHgpIHsgcmV0dXJuIGk7IH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBpc01hcCh4KSB7XG4gICAgaWYgKCFtYXBTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuICAgIGlmICghd2Vha01hcEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha01hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1JlZih4KSB7XG4gICAgaWYgKCF3ZWFrUmVmRGVyZWYgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha1JlZkRlcmVmLmNhbGwoeCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1NldCh4KSB7XG4gICAgaWYgKCFzZXRTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtTZXQoeCkge1xuICAgIGlmICghd2Vha1NldEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha1NldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCh4KSB7XG4gICAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB4IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgeC5ub2RlTmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHguZ2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0ciwgb3B0cykge1xuICAgIGlmIChzdHIubGVuZ3RoID4gb3B0cy5tYXhTdHJpbmdMZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IHN0ci5sZW5ndGggLSBvcHRzLm1heFN0cmluZ0xlbmd0aDtcbiAgICAgICAgdmFyIHRyYWlsZXIgPSAnLi4uICcgKyByZW1haW5pbmcgKyAnIG1vcmUgY2hhcmFjdGVyJyArIChyZW1haW5pbmcgPiAxID8gJ3MnIDogJycpO1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZygkc2xpY2UuY2FsbChzdHIsIDAsIG9wdHMubWF4U3RyaW5nTGVuZ3RoKSwgb3B0cykgKyB0cmFpbGVyO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIHZhciBzID0gJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKHN0ciwgLyhbJ1xcXFxdKS9nLCAnXFxcXCQxJyksIC9bXFx4MDAtXFx4MWZdL2csIGxvd2J5dGUpO1xuICAgIHJldHVybiB3cmFwUXVvdGVzKHMsICdzaW5nbGUnLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gbG93Ynl0ZShjKSB7XG4gICAgdmFyIG4gPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHggPSB7XG4gICAgICAgIDg6ICdiJyxcbiAgICAgICAgOTogJ3QnLFxuICAgICAgICAxMDogJ24nLFxuICAgICAgICAxMjogJ2YnLFxuICAgICAgICAxMzogJ3InXG4gICAgfVtuXTtcbiAgICBpZiAoeCkgeyByZXR1cm4gJ1xcXFwnICsgeDsgfVxuICAgIHJldHVybiAnXFxcXHgnICsgKG4gPCAweDEwID8gJzAnIDogJycpICsgJHRvVXBwZXJDYXNlLmNhbGwobi50b1N0cmluZygxNikpO1xufVxuXG5mdW5jdGlvbiBtYXJrQm94ZWQoc3RyKSB7XG4gICAgcmV0dXJuICdPYmplY3QoJyArIHN0ciArICcpJztcbn1cblxuZnVuY3Rpb24gd2Vha0NvbGxlY3Rpb25PZih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUgKyAnIHsgPyB9Jztcbn1cblxuZnVuY3Rpb24gY29sbGVjdGlvbk9mKHR5cGUsIHNpemUsIGVudHJpZXMsIGluZGVudCkge1xuICAgIHZhciBqb2luZWRFbnRyaWVzID0gaW5kZW50ID8gaW5kZW50ZWRKb2luKGVudHJpZXMsIGluZGVudCkgOiAkam9pbi5jYWxsKGVudHJpZXMsICcsICcpO1xuICAgIHJldHVybiB0eXBlICsgJyAoJyArIHNpemUgKyAnKSB7JyArIGpvaW5lZEVudHJpZXMgKyAnfSc7XG59XG5cbmZ1bmN0aW9uIHNpbmdsZUxpbmVWYWx1ZXMoeHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpbmRleE9mKHhzW2ldLCAnXFxuJykgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRJbmRlbnQob3B0cywgZGVwdGgpIHtcbiAgICB2YXIgYmFzZUluZGVudDtcbiAgICBpZiAob3B0cy5pbmRlbnQgPT09ICdcXHQnKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAnXFx0JztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmluZGVudCA9PT0gJ251bWJlcicgJiYgb3B0cy5pbmRlbnQgPiAwKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAkam9pbi5jYWxsKEFycmF5KG9wdHMuaW5kZW50ICsgMSksICcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IGJhc2VJbmRlbnQsXG4gICAgICAgIHByZXY6ICRqb2luLmNhbGwoQXJyYXkoZGVwdGggKyAxKSwgYmFzZUluZGVudClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBpbmRlbnRlZEpvaW4oeHMsIGluZGVudCkge1xuICAgIGlmICh4cy5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XG4gICAgdmFyIGxpbmVKb2luZXIgPSAnXFxuJyArIGluZGVudC5wcmV2ICsgaW5kZW50LmJhc2U7XG4gICAgcmV0dXJuIGxpbmVKb2luZXIgKyAkam9pbi5jYWxsKHhzLCAnLCcgKyBsaW5lSm9pbmVyKSArICdcXG4nICsgaW5kZW50LnByZXY7XG59XG5cbmZ1bmN0aW9uIGFyck9iaktleXMob2JqLCBpbnNwZWN0KSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmopO1xuICAgIHZhciB4cyA9IFtdO1xuICAgIGlmIChpc0Fycikge1xuICAgICAgICB4cy5sZW5ndGggPSBvYmoubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeHNbaV0gPSBoYXMob2JqLCBpKSA/IGluc3BlY3Qob2JqW2ldLCBvYmopIDogJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN5bXMgPSB0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJyA/IGdPUFMob2JqKSA6IFtdO1xuICAgIHZhciBzeW1NYXA7XG4gICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzKSB7XG4gICAgICAgIHN5bU1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHN5bXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHN5bU1hcFsnJCcgKyBzeW1zW2tdXSA9IHN5bXNba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgaWYgKCFoYXMob2JqLCBrZXkpKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChpc0FyciAmJiBTdHJpbmcoTnVtYmVyKGtleSkpID09PSBrZXkgJiYga2V5IDwgb2JqLmxlbmd0aCkgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMgJiYgc3ltTWFwWyckJyArIGtleV0gaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBzaGFtbWVkIFN5bWJvbHMsIHdoaWNoIGFyZSBzdG9yZWQgYXMgc3RyaW5ncywgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIGtleSBzZWN0aW9uXG4gICAgICAgICAgICBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmICgkdGVzdC5jYWxsKC9bXlxcdyRdLywga2V5KSkge1xuICAgICAgICAgICAgeHMucHVzaChpbnNwZWN0KGtleSwgb2JqKSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhzLnB1c2goa2V5ICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN5bXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VudW1lcmFibGUuY2FsbChvYmosIHN5bXNbal0pKSB7XG4gICAgICAgICAgICAgICAgeHMucHVzaCgnWycgKyBpbnNwZWN0KHN5bXNbal0pICsgJ106ICcgKyBpbnNwZWN0KG9ialtzeW1zW2pdXSwgb2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHhzO1xufVxuIiwiLy90aHJvdWdoQDIgaGFuZGxlcyB0aGlzIGJ5IGRlZmF1bHQhXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ3Rocm91Z2gnKVxuXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbnZhciBGb3JtYXQgPSB7XG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2RlZmF1bHQnOiBGb3JtYXQuUkZDMzk4NixcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiBGb3JtYXQuUkZDMTczOCxcbiAgICBSRkMzOTg2OiBGb3JtYXQuUkZDMzk4NlxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGRlZmF1bHRzID0ge1xuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dFbXB0eUFycmF5czogZmFsc2UsXG4gICAgYWxsb3dQcm90b3R5cGVzOiBmYWxzZSxcbiAgICBhbGxvd1NwYXJzZTogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hOiBmYWxzZSxcbiAgICBkZWNvZGVEb3RJbktleXM6IGZhbHNlLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBkdXBsaWNhdGVzOiAnY29tYmluZScsXG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogZmFsc2UsXG4gICAgcGFyYW1ldGVyTGltaXQ6IDEwMDAsXG4gICAgcGFyc2VBcnJheXM6IHRydWUsXG4gICAgcGxhaW5PYmplY3RzOiBmYWxzZSxcbiAgICBzdHJpY3REZXB0aDogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICB2YXIgY2xlYW5TdHIgPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID8gc3RyLnJlcGxhY2UoL15cXD8vLCAnJykgOiBzdHI7XG4gICAgY2xlYW5TdHIgPSBjbGVhblN0ci5yZXBsYWNlKC8lNUIvZ2ksICdbJykucmVwbGFjZSgvJTVEL2dpLCAnXScpO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICdrZXknKTtcbiAgICAgICAgICAgIHZhbCA9IHV0aWxzLm1heWJlTWFwKFxuICAgICAgICAgICAgICAgIHBhcnNlQXJyYXlWYWx1ZShwYXJ0LnNsaWNlKHBvcyArIDEpLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZW5jb2RlZFZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZWNvZGVyKGVuY29kZWRWYWwsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydC5pbmRleE9mKCdbXT0nKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWwgPSBpc0FycmF5KHZhbCkgPyBbdmFsXSA6IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleGlzdGluZyA9IGhhcy5jYWxsKG9iaiwga2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2NvbWJpbmUnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nIHx8IG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgdmFyIGxlYWYgPSB2YWx1ZXNQYXJzZWQgPyB2YWwgOiBwYXJzZUFycmF5VmFsdWUodmFsLCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMuYWxsb3dFbXB0eUFycmF5cyAmJiAobGVhZiA9PT0gJycgfHwgKG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nICYmIGxlYWYgPT09IG51bGwpKVxuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGRlY29kZWRSb290ID0gb3B0aW9ucy5kZWNvZGVEb3RJbktleXMgPyBjbGVhblJvb3QucmVwbGFjZSgvJTJFL2csICcuJykgOiBjbGVhblJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChkZWNvZGVkUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcnNlQXJyYXlzICYmIGRlY29kZWRSb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gZGVjb2RlZFJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAmJiAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgICAgICBvYmpbaW5kZXhdID0gbGVhZjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlZFJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2RlY29kZWRSb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCkge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBvcHRpb25zLmRlcHRoID4gMCAmJiBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob3B0aW9ucy5kZXB0aCA+IDAgJiYgKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGNoZWNrIHN0cmljdERlcHRoIG9wdGlvbiBmb3IgdGhyb3csIGVsc2UganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0RGVwdGggPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnB1dCBkZXB0aCBleGNlZWRlZCBkZXB0aCBvcHRpb24gb2YgJyArIG9wdGlvbnMuZGVwdGggKyAnIGFuZCBzdHJpY3REZXB0aCBpcyB0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKTtcbn07XG5cbnZhciBub3JtYWxpemVQYXJzZU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgYWxsb3dFbXB0eUFycmF5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGRlY29kZURvdEluS2V5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVjb2RlciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0RlY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICB2YXIgY2hhcnNldCA9IHR5cGVvZiBvcHRzLmNoYXJzZXQgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuY2hhcnNldCA6IG9wdHMuY2hhcnNldDtcblxuICAgIHZhciBkdXBsaWNhdGVzID0gdHlwZW9mIG9wdHMuZHVwbGljYXRlcyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kdXBsaWNhdGVzIDogb3B0cy5kdXBsaWNhdGVzO1xuXG4gICAgaWYgKGR1cGxpY2F0ZXMgIT09ICdjb21iaW5lJyAmJiBkdXBsaWNhdGVzICE9PSAnZmlyc3QnICYmIGR1cGxpY2F0ZXMgIT09ICdsYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZHVwbGljYXRlcyBvcHRpb24gbXVzdCBiZSBlaXRoZXIgY29tYmluZSwgZmlyc3QsIG9yIGxhc3QnKTtcbiAgICB9XG5cbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IG9wdHMuZGVjb2RlRG90SW5LZXlzID09PSB0cnVlID8gdHJ1ZSA6IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd0RvdHM6IGFsbG93RG90cyxcbiAgICAgICAgYWxsb3dFbXB0eUFycmF5czogdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLmFsbG93RW1wdHlBcnJheXMgOiBkZWZhdWx0cy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICBhbGxvd1Byb3RvdHlwZXM6IHR5cGVvZiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXMsXG4gICAgICAgIGFsbG93U3BhcnNlOiB0eXBlb2Ygb3B0cy5hbGxvd1NwYXJzZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1NwYXJzZSA6IGRlZmF1bHRzLmFsbG93U3BhcnNlLFxuICAgICAgICBhcnJheUxpbWl0OiB0eXBlb2Ygb3B0cy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWE6IHR5cGVvZiBvcHRzLmNvbW1hID09PSAnYm9vbGVhbicgPyBvcHRzLmNvbW1hIDogZGVmYXVsdHMuY29tbWEsXG4gICAgICAgIGRlY29kZURvdEluS2V5czogdHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzID09PSAnYm9vbGVhbicgPyBvcHRzLmRlY29kZURvdEluS2V5cyA6IGRlZmF1bHRzLmRlY29kZURvdEluS2V5cyxcbiAgICAgICAgZGVjb2RlcjogdHlwZW9mIG9wdHMuZGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZGVjb2RlciA6IGRlZmF1bHRzLmRlY29kZXIsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAnc3RyaW5nJyB8fCB1dGlscy5pc1JlZ0V4cChvcHRzLmRlbGltaXRlcikgPyBvcHRzLmRlbGltaXRlciA6IGRlZmF1bHRzLmRlbGltaXRlcixcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uLCBuby1leHRyYS1wYXJlbnNcbiAgICAgICAgZGVwdGg6ICh0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ251bWJlcicgfHwgb3B0cy5kZXB0aCA9PT0gZmFsc2UpID8gK29wdHMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aCxcbiAgICAgICAgZHVwbGljYXRlczogZHVwbGljYXRlcyxcbiAgICAgICAgaWdub3JlUXVlcnlQcmVmaXg6IG9wdHMuaWdub3JlUXVlcnlQcmVmaXggPT09IHRydWUsXG4gICAgICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogdHlwZW9mIG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID09PSAnYm9vbGVhbicgPyBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA6IGRlZmF1bHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyxcbiAgICAgICAgcGFyYW1ldGVyTGltaXQ6IHR5cGVvZiBvcHRzLnBhcmFtZXRlckxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMucGFyYW1ldGVyTGltaXQgOiBkZWZhdWx0cy5wYXJhbWV0ZXJMaW1pdCxcbiAgICAgICAgcGFyc2VBcnJheXM6IG9wdHMucGFyc2VBcnJheXMgIT09IGZhbHNlLFxuICAgICAgICBwbGFpbk9iamVjdHM6IHR5cGVvZiBvcHRzLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHMsXG4gICAgICAgIHN0cmljdERlcHRoOiB0eXBlb2Ygb3B0cy5zdHJpY3REZXB0aCA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLnN0cmljdERlcHRoIDogZGVmYXVsdHMuc3RyaWN0RGVwdGgsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKTtcblxuICAgIGlmIChzdHIgPT09ICcnIHx8IHN0ciA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgfVxuXG4gICAgdmFyIHRlbXBPYmogPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHBhcnNlVmFsdWVzKHN0ciwgb3B0aW9ucykgOiBzdHI7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBrZXlzIGFuZCBzZXR1cCB0aGUgbmV3IG9iamVjdFxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0ZW1wT2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBuZXdPYmogPSBwYXJzZUtleXMoa2V5LCB0ZW1wT2JqW2tleV0sIG9wdGlvbnMsIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKTtcbiAgICAgICAgb2JqID0gdXRpbHMubWVyZ2Uob2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFsbG93U3BhcnNlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLmNvbXBhY3Qob2JqKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRTaWRlQ2hhbm5lbCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgYXJyYXlQcmVmaXhHZW5lcmF0b3JzID0ge1xuICAgIGJyYWNrZXRzOiBmdW5jdGlvbiBicmFja2V0cyhwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbXSc7XG4gICAgfSxcbiAgICBjb21tYTogJ2NvbW1hJyxcbiAgICBpbmRpY2VzOiBmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnWycgKyBrZXkgKyAnXSc7XG4gICAgfSxcbiAgICByZXBlYXQ6IGZ1bmN0aW9uIHJlcGVhdChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdEZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd0VtcHR5QXJyYXlzOiBmYWxzZSxcbiAgICBhcnJheUZvcm1hdDogJ2luZGljZXMnLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBlbmNvZGU6IHRydWUsXG4gICAgZW5jb2RlRG90SW5LZXlzOiBmYWxzZSxcbiAgICBlbmNvZGVyOiB1dGlscy5lbmNvZGUsXG4gICAgZW5jb2RlVmFsdWVzT25seTogZmFsc2UsXG4gICAgZm9ybWF0OiBkZWZhdWx0Rm9ybWF0LFxuICAgIGZvcm1hdHRlcjogZm9ybWF0cy5mb3JtYXR0ZXJzW2RlZmF1bHRGb3JtYXRdLFxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBpc05vbk51bGxpc2hQcmltaXRpdmUgPSBmdW5jdGlvbiBpc05vbk51bGxpc2hQcmltaXRpdmUodikge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3N0cmluZydcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdudW1iZXInXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnYm9vbGVhbidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdzeW1ib2wnXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnYmlnaW50Jztcbn07XG5cbnZhciBzZW50aW5lbCA9IHt9O1xuXG52YXIgc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KFxuICAgIG9iamVjdCxcbiAgICBwcmVmaXgsXG4gICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICBjb21tYVJvdW5kVHJpcCxcbiAgICBhbGxvd0VtcHR5QXJyYXlzLFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlRG90SW5LZXlzLFxuICAgIGVuY29kZXIsXG4gICAgZmlsdGVyLFxuICAgIHNvcnQsXG4gICAgYWxsb3dEb3RzLFxuICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgZm9ybWF0LFxuICAgIGZvcm1hdHRlcixcbiAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgIGNoYXJzZXQsXG4gICAgc2lkZUNoYW5uZWxcbikge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG5cbiAgICB2YXIgdG1wU2MgPSBzaWRlQ2hhbm5lbDtcbiAgICB2YXIgc3RlcCA9IDA7XG4gICAgdmFyIGZpbmRGbGFnID0gZmFsc2U7XG4gICAgd2hpbGUgKCh0bXBTYyA9IHRtcFNjLmdldChzZW50aW5lbCkpICE9PSB2b2lkIHVuZGVmaW5lZCAmJiAhZmluZEZsYWcpIHtcbiAgICAgICAgLy8gV2hlcmUgb2JqZWN0IGxhc3QgYXBwZWFyZWQgaW4gdGhlIHJlZiB0cmVlXG4gICAgICAgIHZhciBwb3MgPSB0bXBTYy5nZXQob2JqZWN0KTtcbiAgICAgICAgc3RlcCArPSAxO1xuICAgICAgICBpZiAodHlwZW9mIHBvcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChwb3MgPT09IHN0ZXApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQ3ljbGljIG9iamVjdCB2YWx1ZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5kRmxhZyA9IHRydWU7IC8vIEJyZWFrIHdoaWxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0bXBTYy5nZXQoc2VudGluZWwpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3RlcCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSBmaWx0ZXIocHJlZml4LCBvYmopO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvYmogPSBzZXJpYWxpemVEYXRlKG9iaik7XG4gICAgfSBlbHNlIGlmIChnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmogPSB1dGlscy5tYXliZU1hcChvYmosIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0LCAna2V5JywgZm9ybWF0KSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmIChpc05vbk51bGxpc2hQcmltaXRpdmUob2JqKSB8fCB1dGlscy5pc0J1ZmZlcihvYmopKSB7XG4gICAgICAgIGlmIChlbmNvZGVyKSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsdWUgPSBlbmNvZGVWYWx1ZXNPbmx5ID8gcHJlZml4IDogZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpO1xuICAgICAgICAgICAgcmV0dXJuIFtmb3JtYXR0ZXIoa2V5VmFsdWUpICsgJz0nICsgZm9ybWF0dGVyKGVuY29kZXIob2JqLCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0LCAndmFsdWUnLCBmb3JtYXQpKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtmb3JtYXR0ZXIocHJlZml4KSArICc9JyArIGZvcm1hdHRlcihTdHJpbmcob2JqKSldO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIHZhciBvYmpLZXlzO1xuICAgIGlmIChnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGlzQXJyYXkob2JqKSkge1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIGpvaW4gZWxlbWVudHMgaW5cbiAgICAgICAgaWYgKGVuY29kZVZhbHVlc09ubHkgJiYgZW5jb2Rlcikge1xuICAgICAgICAgICAgb2JqID0gdXRpbHMubWF5YmVNYXAob2JqLCBlbmNvZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBvYmpLZXlzID0gW3sgdmFsdWU6IG9iai5sZW5ndGggPiAwID8gb2JqLmpvaW4oJywnKSB8fCBudWxsIDogdm9pZCB1bmRlZmluZWQgfV07XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIG9iaktleXMgPSBzb3J0ID8ga2V5cy5zb3J0KHNvcnQpIDoga2V5cztcbiAgICB9XG5cbiAgICB2YXIgZW5jb2RlZFByZWZpeCA9IGVuY29kZURvdEluS2V5cyA/IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgJyUyRScpIDogcHJlZml4O1xuXG4gICAgdmFyIGFkanVzdGVkUHJlZml4ID0gY29tbWFSb3VuZFRyaXAgJiYgaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggPT09IDEgPyBlbmNvZGVkUHJlZml4ICsgJ1tdJyA6IGVuY29kZWRQcmVmaXg7XG5cbiAgICBpZiAoYWxsb3dFbXB0eUFycmF5cyAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYWRqdXN0ZWRQcmVmaXggKyAnW10nO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqS2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tqXTtcbiAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGtleS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBrZXkudmFsdWUgOiBvYmpba2V5XTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlbmNvZGVkS2V5ID0gYWxsb3dEb3RzICYmIGVuY29kZURvdEluS2V5cyA/IGtleS5yZXBsYWNlKC9cXC4vZywgJyUyRScpIDoga2V5O1xuICAgICAgICB2YXIga2V5UHJlZml4ID0gaXNBcnJheShvYmopXG4gICAgICAgICAgICA/IHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChhZGp1c3RlZFByZWZpeCwgZW5jb2RlZEtleSkgOiBhZGp1c3RlZFByZWZpeFxuICAgICAgICAgICAgOiBhZGp1c3RlZFByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBlbmNvZGVkS2V5IDogJ1snICsgZW5jb2RlZEtleSArICddJyk7XG5cbiAgICAgICAgc2lkZUNoYW5uZWwuc2V0KG9iamVjdCwgc3RlcCk7XG4gICAgICAgIHZhciB2YWx1ZVNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbC5zZXQoc2VudGluZWwsIHNpZGVDaGFubmVsKTtcbiAgICAgICAgcHVzaFRvQXJyYXkodmFsdWVzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleVByZWZpeCxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBjb21tYVJvdW5kVHJpcCxcbiAgICAgICAgICAgIGFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICBlbmNvZGVEb3RJbktleXMsXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGVuY29kZVZhbHVlc09ubHkgJiYgaXNBcnJheShvYmopID8gbnVsbCA6IGVuY29kZXIsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBjaGFyc2V0LFxuICAgICAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxudmFyIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGFsbG93RW1wdHlBcnJheXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZURvdEluS2V5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BlbmNvZGVEb3RJbktleXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gb3B0cy5jaGFyc2V0IHx8IGRlZmF1bHRzLmNoYXJzZXQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsIG9wdHMuZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1hdCA9IG9wdHMuZm9ybWF0O1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cbiAgICB2YXIgZmlsdGVyID0gZGVmYXVsdHMuZmlsdGVyO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgaXNBcnJheShvcHRzLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5Rm9ybWF0O1xuICAgIGlmIChvcHRzLmFycmF5Rm9ybWF0IGluIGFycmF5UHJlZml4R2VuZXJhdG9ycykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuYXJyYXlGb3JtYXQ7XG4gICAgfSBlbHNlIGlmICgnaW5kaWNlcycgaW4gb3B0cykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuaW5kaWNlcyA/ICdpbmRpY2VzJyA6ICdyZXBlYXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gZGVmYXVsdHMuYXJyYXlGb3JtYXQ7XG4gICAgfVxuXG4gICAgaWYgKCdjb21tYVJvdW5kVHJpcCcgaW4gb3B0cyAmJiB0eXBlb2Ygb3B0cy5jb21tYVJvdW5kVHJpcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bjb21tYVJvdW5kVHJpcGAgbXVzdCBiZSBhIGJvb2xlYW4sIG9yIGFic2VudCcpO1xuICAgIH1cblxuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gb3B0cy5lbmNvZGVEb3RJbktleXMgPT09IHRydWUgPyB0cnVlIDogZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cztcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZFF1ZXJ5UHJlZml4OiB0eXBlb2Ygb3B0cy5hZGRRdWVyeVByZWZpeCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hZGRRdWVyeVByZWZpeCA6IGRlZmF1bHRzLmFkZFF1ZXJ5UHJlZml4LFxuICAgICAgICBhbGxvd0RvdHM6IGFsbG93RG90cyxcbiAgICAgICAgYWxsb3dFbXB0eUFycmF5czogdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLmFsbG93RW1wdHlBcnJheXMgOiBkZWZhdWx0cy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICBhcnJheUZvcm1hdDogYXJyYXlGb3JtYXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWFSb3VuZFRyaXA6IG9wdHMuY29tbWFSb3VuZFRyaXAsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmRlbGltaXRlciA6IG9wdHMuZGVsaW1pdGVyLFxuICAgICAgICBlbmNvZGU6IHR5cGVvZiBvcHRzLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGUsXG4gICAgICAgIGVuY29kZURvdEluS2V5czogdHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZURvdEluS2V5cyA6IGRlZmF1bHRzLmVuY29kZURvdEluS2V5cyxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW29wdGlvbnMuYXJyYXlGb3JtYXRdO1xuICAgIHZhciBjb21tYVJvdW5kVHJpcCA9IGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgb3B0aW9ucy5jb21tYVJvdW5kVHJpcDtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIHZhciBzaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaFRvQXJyYXkoa2V5cywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgICAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcE51bGxzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGVEb3RJbktleXMsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZSA/IG9wdGlvbnMuZW5jb2RlciA6IG51bGwsXG4gICAgICAgICAgICBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuc29ydCxcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dEb3RzLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXQsXG4gICAgICAgICAgICBvcHRpb25zLmZvcm1hdHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgIG9wdGlvbnMuY2hhcnNldCxcbiAgICAgICAgICAgIHNpZGVDaGFubmVsXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIHZhciBqb2luZWQgPSBrZXlzLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIpO1xuICAgIHZhciBwcmVmaXggPSBvcHRpb25zLmFkZFF1ZXJ5UHJlZml4ID09PSB0cnVlID8gJz8nIDogJyc7XG5cbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JyksIHRoZSBcIm51bWVyaWMgZW50aXR5XCIgcmVwcmVzZW50YXRpb24gb2YgYSBjaGVja21hcmtcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lMjYlMjMxMDAwMyUzQiYnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCfinJMnKVxuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSVFMiU5QyU5MyYnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW5lZC5sZW5ndGggPiAwID8gcHJlZml4ICsgam9pbmVkIDogJyc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGhleFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgIGFycmF5LnB1c2goJyUnICsgKChpIDwgMTYgPyAnMCcgOiAnJykgKyBpLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xufSgpKTtcblxudmFyIGNvbXBhY3RRdWV1ZSA9IGZ1bmN0aW9uIGNvbXBhY3RRdWV1ZShxdWV1ZSkge1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWUucG9wKCk7XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHZhciBjb21wYWN0ZWQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmoubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ialtqXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdGVkLnB1c2gob2JqW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0ub2JqW2l0ZW0ucHJvcF0gPSBjb21wYWN0ZWQ7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgYXJyYXlUb09iamVjdCA9IGZ1bmN0aW9uIGFycmF5VG9PYmplY3Qoc291cmNlLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VbaV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvYmpbaV0gPSBzb3VyY2VbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIG1lcmdlID0gZnVuY3Rpb24gbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAvKiBlc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246IDAgKi9cbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChzb3VyY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKChvcHRpb25zICYmIChvcHRpb25zLnBsYWluT2JqZWN0cyB8fCBvcHRpb25zLmFsbG93UHJvdG90eXBlcykpIHx8ICFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3NvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXQsIHNvdXJjZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0IHx8IHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbdGFyZ2V0XS5jb25jYXQoc291cmNlKTtcbiAgICB9XG5cbiAgICB2YXIgbWVyZ2VUYXJnZXQgPSB0YXJnZXQ7XG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiAhaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIG1lcmdlVGFyZ2V0ID0gYXJyYXlUb09iamVjdCh0YXJnZXQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgICBpZiAoaGFzLmNhbGwodGFyZ2V0LCBpKSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRJdGVtID0gdGFyZ2V0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJdGVtICYmIHR5cGVvZiB0YXJnZXRJdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBtZXJnZSh0YXJnZXRJdGVtLCBpdGVtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW2tleV07XG5cbiAgICAgICAgaWYgKGhhcy5jYWxsKGFjYywga2V5KSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBtZXJnZShhY2Nba2V5XSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIG1lcmdlVGFyZ2V0KTtcbn07XG5cbnZhciBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ25TaW5nbGVTb3VyY2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gc291cmNlW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgdGFyZ2V0KTtcbn07XG5cbnZhciBkZWNvZGUgPSBmdW5jdGlvbiAoc3RyLCBkZWNvZGVyLCBjaGFyc2V0KSB7XG4gICAgdmFyIHN0cldpdGhvdXRQbHVzID0gc3RyLnJlcGxhY2UoL1xcKy9nLCAnICcpO1xuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgLy8gdW5lc2NhcGUgbmV2ZXIgdGhyb3dzLCBubyB0cnkuLi5jYXRjaCBuZWVkZWQ6XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cy5yZXBsYWNlKC8lWzAtOWEtZl17Mn0vZ2ksIHVuZXNjYXBlKTtcbiAgICB9XG4gICAgLy8gdXRmLThcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cldpdGhvdXRQbHVzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cztcbiAgICB9XG59O1xuXG52YXIgbGltaXQgPSAxMDI0O1xuXG4vKiBlc2xpbnQgb3BlcmF0b3ItbGluZWJyZWFrOiBbMiwgXCJiZWZvcmVcIl0gKi9cblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGRlZmF1bHRFbmNvZGVyLCBjaGFyc2V0LCBraW5kLCBmb3JtYXQpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHN0cjtcbiAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgc3RyaW5nID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJpbmcgPSBTdHJpbmcoc3RyKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGUoc3RyaW5nKS5yZXBsYWNlKC8ldVswLTlhLWZdezR9L2dpLCBmdW5jdGlvbiAoJDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJTI2JTIzJyArIHBhcnNlSW50KCQwLnNsaWNlKDIpLCAxNikgKyAnJTNCJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RyaW5nLmxlbmd0aDsgaiArPSBsaW1pdCkge1xuICAgICAgICB2YXIgc2VnbWVudCA9IHN0cmluZy5sZW5ndGggPj0gbGltaXQgPyBzdHJpbmcuc2xpY2UoaiwgaiArIGxpbWl0KSA6IHN0cmluZztcbiAgICAgICAgdmFyIGFyciA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGMgPSBzZWdtZW50LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgYyA9PT0gMHgyRCAvLyAtXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHg1RiAvLyBfXG4gICAgICAgICAgICAgICAgfHwgYyA9PT0gMHg3RSAvLyB+XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDVBKSAvLyBhLXpcbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSkgLy8gQS1aXG4gICAgICAgICAgICAgICAgfHwgKGZvcm1hdCA9PT0gZm9ybWF0cy5SRkMxNzM4ICYmIChjID09PSAweDI4IHx8IGMgPT09IDB4MjkpKSAvLyAoIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IHNlZ21lbnQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPj0gMHhFMDAwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhFMCB8IChjID4+IDEyKV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNGRikgPDwgMTApIHwgKHNlZ21lbnQuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG5cbiAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ICs9IGFyci5qb2luKCcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxudmFyIGNvbXBhY3QgPSBmdW5jdGlvbiBjb21wYWN0KHZhbHVlKSB7XG4gICAgdmFyIHF1ZXVlID0gW3sgb2JqOiB7IG86IHZhbHVlIH0sIHByb3A6ICdvJyB9XTtcbiAgICB2YXIgcmVmcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlW2ldO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHJlZnMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goeyBvYmo6IG9iaiwgcHJvcDoga2V5IH0pO1xuICAgICAgICAgICAgICAgIHJlZnMucHVzaCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcGFjdFF1ZXVlKHF1ZXVlKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxudmFyIGNvbWJpbmUgPSBmdW5jdGlvbiBjb21iaW5lKGEsIGIpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGEsIGIpO1xufTtcblxudmFyIG1heWJlTWFwID0gZnVuY3Rpb24gbWF5YmVNYXAodmFsLCBmbikge1xuICAgIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgbWFwcGVkLnB1c2goZm4odmFsW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZuKHZhbCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbWJpbmU6IGNvbWJpbmUsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gICAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICAgIG1heWJlTWFwOiBtYXliZU1hcCxcbiAgICBtZXJnZTogbWVyZ2Vcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBJZiBvYmouaGFzT3duUHJvcGVydHkgaGFzIGJlZW4gb3ZlcnJpZGRlbiwgdGhlbiBjYWxsaW5nXG4vLyBvYmouaGFzT3duUHJvcGVydHkocHJvcCkgd2lsbCBicmVhay5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzA3XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG1hcChvYmplY3RLZXlzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBtYXAob2JqW2tdLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5mdW5jdGlvbiBtYXAgKHhzLCBmKSB7XG4gIGlmICh4cy5tYXApIHJldHVybiB4cy5tYXAoZik7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5wdXNoKGYoeHNbaV0sIGkpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHJlcy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5leHBvcnRzLmVuY29kZSA9IGV4cG9ydHMuc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBjb2RlcyA9IHt9O1xuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclR5cGUoY29kZSwgbWVzc2FnZSwgQmFzZSkge1xuICBpZiAoIUJhc2UpIHtcbiAgICBCYXNlID0gRXJyb3I7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXNzYWdlKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1lc3NhZ2UoYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIE5vZGVFcnJvciA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKF9CYXNlKSB7XG4gICAgX2luaGVyaXRzTG9vc2UoTm9kZUVycm9yLCBfQmFzZSk7XG5cbiAgICBmdW5jdGlvbiBOb2RlRXJyb3IoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgcmV0dXJuIF9CYXNlLmNhbGwodGhpcywgZ2V0TWVzc2FnZShhcmcxLCBhcmcyLCBhcmczKSkgfHwgdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gTm9kZUVycm9yO1xuICB9KEJhc2UpO1xuXG4gIE5vZGVFcnJvci5wcm90b3R5cGUubmFtZSA9IEJhc2UubmFtZTtcbiAgTm9kZUVycm9yLnByb3RvdHlwZS5jb2RlID0gY29kZTtcbiAgY29kZXNbY29kZV0gPSBOb2RlRXJyb3I7XG59IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL3YxMC44LjAvbGliL2ludGVybmFsL2Vycm9ycy5qc1xuXG5cbmZ1bmN0aW9uIG9uZU9mKGV4cGVjdGVkLCB0aGluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICB2YXIgbGVuID0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGkpO1xuICAgIH0pO1xuXG4gICAgaWYgKGxlbiA+IDIpIHtcbiAgICAgIHJldHVybiBcIm9uZSBvZiBcIi5jb25jYXQodGhpbmcsIFwiIFwiKS5jb25jYXQoZXhwZWN0ZWQuc2xpY2UoMCwgbGVuIC0gMSkuam9pbignLCAnKSwgXCIsIG9yIFwiKSArIGV4cGVjdGVkW2xlbiAtIDFdO1xuICAgIH0gZWxzZSBpZiAobGVuID09PSAyKSB7XG4gICAgICByZXR1cm4gXCJvbmUgb2YgXCIuY29uY2F0KHRoaW5nLCBcIiBcIikuY29uY2F0KGV4cGVjdGVkWzBdLCBcIiBvciBcIikuY29uY2F0KGV4cGVjdGVkWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwib2YgXCIuY29uY2F0KHRoaW5nLCBcIiBcIikuY29uY2F0KGV4cGVjdGVkWzBdKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwib2YgXCIuY29uY2F0KHRoaW5nLCBcIiBcIikuY29uY2F0KFN0cmluZyhleHBlY3RlZCkpO1xuICB9XG59IC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9zdGFydHNXaXRoXG5cblxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHNlYXJjaCwgcG9zKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyKCFwb3MgfHwgcG9zIDwgMCA/IDAgOiArcG9zLCBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xufSAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvZW5kc1dpdGhcblxuXG5mdW5jdGlvbiBlbmRzV2l0aChzdHIsIHNlYXJjaCwgdGhpc19sZW4pIHtcbiAgaWYgKHRoaXNfbGVuID09PSB1bmRlZmluZWQgfHwgdGhpc19sZW4gPiBzdHIubGVuZ3RoKSB7XG4gICAgdGhpc19sZW4gPSBzdHIubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcodGhpc19sZW4gLSBzZWFyY2gubGVuZ3RoLCB0aGlzX2xlbikgPT09IHNlYXJjaDtcbn0gLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2luY2x1ZGVzXG5cblxuZnVuY3Rpb24gaW5jbHVkZXMoc3RyLCBzZWFyY2gsIHN0YXJ0KSB7XG4gIGlmICh0eXBlb2Ygc3RhcnQgIT09ICdudW1iZXInKSB7XG4gICAgc3RhcnQgPSAwO1xuICB9XG5cbiAgaWYgKHN0YXJ0ICsgc2VhcmNoLmxlbmd0aCA+IHN0ci5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5pbmRleE9mKHNlYXJjaCwgc3RhcnQpICE9PSAtMTtcbiAgfVxufVxuXG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9JTlZBTElEX09QVF9WQUxVRScsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gJ1RoZSB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCInICsgbmFtZSArICdcIic7XG59LCBUeXBlRXJyb3IpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfSU5WQUxJRF9BUkdfVFlQRScsIGZ1bmN0aW9uIChuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSB7XG4gIC8vIGRldGVybWluZXI6ICdtdXN0IGJlJyBvciAnbXVzdCBub3QgYmUnXG4gIHZhciBkZXRlcm1pbmVyO1xuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnICYmIHN0YXJ0c1dpdGgoZXhwZWN0ZWQsICdub3QgJykpIHtcbiAgICBkZXRlcm1pbmVyID0gJ211c3Qgbm90IGJlJztcbiAgICBleHBlY3RlZCA9IGV4cGVjdGVkLnJlcGxhY2UoL15ub3QgLywgJycpO1xuICB9IGVsc2Uge1xuICAgIGRldGVybWluZXIgPSAnbXVzdCBiZSc7XG4gIH1cblxuICB2YXIgbXNnO1xuXG4gIGlmIChlbmRzV2l0aChuYW1lLCAnIGFyZ3VtZW50JykpIHtcbiAgICAvLyBGb3IgY2FzZXMgbGlrZSAnZmlyc3QgYXJndW1lbnQnXG4gICAgbXNnID0gXCJUaGUgXCIuY29uY2F0KG5hbWUsIFwiIFwiKS5jb25jYXQoZGV0ZXJtaW5lciwgXCIgXCIpLmNvbmNhdChvbmVPZihleHBlY3RlZCwgJ3R5cGUnKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHR5cGUgPSBpbmNsdWRlcyhuYW1lLCAnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCc7XG4gICAgbXNnID0gXCJUaGUgXFxcIlwiLmNvbmNhdChuYW1lLCBcIlxcXCIgXCIpLmNvbmNhdCh0eXBlLCBcIiBcIikuY29uY2F0KGRldGVybWluZXIsIFwiIFwiKS5jb25jYXQob25lT2YoZXhwZWN0ZWQsICd0eXBlJykpO1xuICB9XG5cbiAgbXNnICs9IFwiLiBSZWNlaXZlZCB0eXBlIFwiLmNvbmNhdCh0eXBlb2YgYWN0dWFsKTtcbiAgcmV0dXJuIG1zZztcbn0sIFR5cGVFcnJvcik7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YnLCAnc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQnLCBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gJ1RoZSAnICsgbmFtZSArICcgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCc7XG59KTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnLCAnUHJlbWF0dXJlIGNsb3NlJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fREVTVFJPWUVEJywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuICdDYW5ub3QgY2FsbCAnICsgbmFtZSArICcgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZCc7XG59KTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX01VTFRJUExFX0NBTExCQUNLJywgJ0NhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcycpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfU1RSRUFNX0NBTk5PVF9QSVBFJywgJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQnLCAnd3JpdGUgYWZ0ZXIgZW5kJyk7XG5jcmVhdGVFcnJvclR5cGUoJ0VSUl9TVFJFQU1fTlVMTF9WQUxVRVMnLCAnTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nLCBUeXBlRXJyb3IpO1xuY3JlYXRlRXJyb3JUeXBlKCdFUlJfVU5LTk9XTl9FTkNPRElORycsIGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuICdVbmtub3duIGVuY29kaW5nOiAnICsgYXJnO1xufSwgVHlwZUVycm9yKTtcbmNyZWF0ZUVycm9yVHlwZSgnRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCcsICdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xubW9kdWxlLmV4cG9ydHMuY29kZXMgPSBjb2RlcztcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikga2V5cy5wdXNoKGtleSk7XG4gIHJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5yZXF1aXJlKCdpbmhlcml0cycpKER1cGxleCwgUmVhZGFibGUpO1xue1xuICAvLyBBbGxvdyB0aGUga2V5cyBhcnJheSB0byBiZSBHQydlZC5cbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG4gIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbiAgfVxufVxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xuICAgIH1cbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pO1xuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gSWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzcy5uZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5yZXF1aXJlKCdpbmhlcml0cycpKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBFRWxpc3RlbmVyQ291bnQoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZztcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gZGVidWcoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyTGlzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9idWZmZXJfbGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZScpLFxuICBnZXRIaWdoV2F0ZXJNYXJrID0gX3JlcXVpcmUuZ2V0SGlnaFdhdGVyTWFyaztcbnZhciBfcmVxdWlyZSRjb2RlcyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpLmNvZGVzLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFLFxuICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxcbiAgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ7XG5cbi8vIExhenkgbG9hZGVkIHRvIGltcHJvdmUgdGhlIHN0YXJ0dXAgcGVyZm9ybWFuY2UuXG52YXIgU3RyaW5nRGVjb2RlcjtcbnZhciBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3I7XG52YXIgZnJvbTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoUmVhZGFibGUsIFN0cmVhbSk7XG52YXIgZXJyb3JPckRlc3Ryb3kgPSBkZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtcbnZhciBrUHJveHlFdmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlO1xuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZW5kJyAoYW5kIHBvdGVudGlhbGx5ICdmaW5pc2gnKVxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95O1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICAvLyBDaGVja2luZyBmb3IgYSBTdHJlYW0uRHVwbGV4IGluc3RhbmNlIGlzIGZhc3RlciBoZXJlIGluc3RlYWQgb2YgaW5zaWRlXG4gIC8vIHRoZSBSZWFkYWJsZVN0YXRlIGNvbnN0cnVjdG9yLCBhdCBsZWFzdCB3aXRoIFY4IDYuNVxuICB2YXIgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgRHVwbGV4O1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5SZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UsIHNraXBDaHVua0NoZWNrKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xufTtcbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIGRlYnVnKCdyZWFkYWJsZUFkZENodW5rJywgY2h1bmspO1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UKCkpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GKCkpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgY2FuIHB1c2ggbW9yZSBkYXRhIGlmIHdlIGFyZSBiZWxvdyB0aGUgaGlnaFdhdGVyTWFyay5cbiAgLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWUgbW9yZSBieXRlcy5cbiAgLy8gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCwgc3VjaCBhcyB0aGUgcmVwbC5cbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfVxuICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xufVxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJywgJ1VpbnQ4QXJyYXknXSwgY2h1bmspO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdmFyIGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBkZWNvZGVyO1xuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOFxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nO1xuXG4gIC8vIEl0ZXJhdGUgb3ZlciBjdXJyZW50IGJ1ZmZlciB0byBjb252ZXJ0IGFscmVhZHkgc3RvcmVkIEJ1ZmZlcnM6XG4gIHZhciBwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZDtcbiAgdmFyIGNvbnRlbnQgPSAnJztcbiAgd2hpbGUgKHAgIT09IG51bGwpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUocC5kYXRhKTtcbiAgICBwID0gcC5uZXh0O1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIGlmIChjb250ZW50ICE9PSAnJykgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChjb250ZW50KTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBjb250ZW50Lmxlbmd0aDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMUdCXG52YXIgTUFYX0hXTSA9IDB4NDAwMDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICAvLyBUT0RPKHJvbmFnKTogVGhyb3cgRVJSX1ZBTFVFX09VVF9PRl9SQU5HRS5cbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmICgoc3RhdGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIDogc3RhdGUubGVuZ3RoID4gMCkgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICAgIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGRlYnVnKCdvbkVvZkNodW5rJyk7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIGlmIChzdGF0ZS5zeW5jKSB7XG4gICAgLy8gaWYgd2UgYXJlIHN5bmMsIHdhaXQgdW50aWwgbmV4dCB0aWNrIHRvIGVtaXQgdGhlIGRhdGEuXG4gICAgLy8gT3RoZXJ3aXNlIHdlIHJpc2sgZW1pdHRpbmcgZGF0YSBpbiB0aGUgZmxvdygpXG4gICAgLy8gdGhlIHJlYWRhYmxlIGNvZGUgdHJpZ2dlcnMgZHVyaW5nIGEgcmVhZCgpIGNhbGxcbiAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2VtaXRSZWFkYWJsZV8nLCBzdGF0ZS5kZXN0cm95ZWQsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICBpZiAoIXN0YXRlLmRlc3Ryb3llZCAmJiAoc3RhdGUubGVuZ3RoIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gVGhlIHN0cmVhbSBuZWVkcyBhbm90aGVyIHJlYWRhYmxlIGV2ZW50IGlmXG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICAvLyBBdHRlbXB0IHRvIHJlYWQgbW9yZSBkYXRhIGlmIHdlIHNob3VsZC5cbiAgLy9cbiAgLy8gVGhlIGNvbmRpdGlvbnMgZm9yIHJlYWRpbmcgbW9yZSBkYXRhIGFyZSAob25lIG9mKTpcbiAgLy8gLSBOb3QgZW5vdWdoIGRhdGEgYnVmZmVyZWQgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspLiBUaGUgbG9vcFxuICAvLyAgIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIHRoZSBidWZmZXIgd2l0aCBlbm91Z2ggZGF0YSBpZiBzdWNoIGRhdGFcbiAgLy8gICBpcyBhdmFpbGFibGUuIElmIGhpZ2hXYXRlck1hcmsgaXMgMCBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgZmxvd2luZyBtb2RlXG4gIC8vICAgd2Ugc2hvdWxkIF9ub3RfIGF0dGVtcHQgdG8gYnVmZmVyIGFueSBleHRyYSBkYXRhLiBXZSdsbCBnZXQgbW9yZSBkYXRhXG4gIC8vICAgd2hlbiB0aGUgc3RyZWFtIGNvbnN1bWVyIGNhbGxzIHJlYWQoKSBpbnN0ZWFkLlxuICAvLyAtIE5vIGRhdGEgaW4gdGhlIGJ1ZmZlciwgYW5kIHRoZSBzdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLiBJbiB0aGlzIG1vZGVcbiAgLy8gICB0aGUgbG9vcCBiZWxvdyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgcmVhZCgpIGlzIGNhbGxlZC4gRmFpbGluZyB0b1xuICAvLyAgIGNhbGwgcmVhZCBoZXJlIHdvdWxkIGFib3J0IHRoZSBmbG93IGFuZCB0aGVyZSdzIG5vIG90aGVyIG1lY2hhbmlzbSBmb3JcbiAgLy8gICBjb250aW51aW5nIHRoZSBmbG93IGlmIHRoZSBzdHJlYW0gY29uc3VtZXIgaGFzIGp1c3Qgc3Vic2NyaWJlZCB0byB0aGVcbiAgLy8gICAnZGF0YScgZXZlbnQuXG4gIC8vXG4gIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBjb25kaXRpb25zIHRvIGtlZXAgcmVhZGluZyBkYXRhLCB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHJlYWQ6XG4gIC8vIC0gVGhlIHN0cmVhbSBoYXMgZW5kZWQgKHN0YXRlLmVuZGVkKS5cbiAgLy8gLSBUaGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyAncmVhZCcgb3BlcmF0aW9uIChzdGF0ZS5yZWFkaW5nKS4gVGhpcyBpcyBhXG4gIC8vICAgY2FzZSB3aGVyZSB0aGUgdGhlIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIF9yZWFkKClcbiAgLy8gICBtZXRob2QsIGJ1dCB0aGV5IGFyZSBwcm9jZXNzaW5nIHRoZSBjYWxsIGFzeW5jaHJvbm91c2x5IGFuZCBoYXZlIF9ub3RfXG4gIC8vICAgY2FsbGVkIHB1c2goKSB3aXRoIG5ldyBkYXRhLiBJbiB0aGlzIGNhc2Ugd2Ugc2tpcCBwZXJmb3JtaW5nIG1vcmVcbiAgLy8gICByZWFkKClzLiBUaGUgZXhlY3V0aW9uIGVuZHMgaW4gdGhpcyBtZXRob2QgYWdhaW4gYWZ0ZXIgdGhlIF9yZWFkKCkgZW5kc1xuICAvLyAgIHVwIGNhbGxpbmcgcHVzaCgpIHdpdGggbW9yZSBkYXRhLlxuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSkge1xuICAgIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfcmVhZCgpJykpO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3MubmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgdW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KTtcbiAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgICAgaWYgKChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlLnBpcGVzID09PSBkZXN0IHx8IHN0YXRlLnBpcGVzQ291bnQgPiAxICYmIGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn07XG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVPbkRyYWluRnVuY3Rpb25SZXN1bHQoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH07XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB7XG4gICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGluZGV4ID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzO1xuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyB1cGRhdGUgcmVhZGFibGVMaXN0ZW5pbmcgc28gdGhhdCByZXN1bWUoKSBtYXkgYmUgYSBuby1vcFxuICAgIC8vIGEgZmV3IGxpbmVzIGRvd24uIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgb25jZSgncmVhZGFibGUnKS5cbiAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRoaXMubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG5cbiAgICAvLyBUcnkgc3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBkZWJ1Zygnb24gcmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLnJlYWRpbmcpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbik7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoZXYpIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICB2YXIgc3RhdGUgPSBzZWxmLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHNlbGYubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgIXN0YXRlLnBhdXNlZCkge1xuICAgIC8vIGZsb3dpbmcgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgbm93LCBvdGhlcndpc2VcbiAgICAvLyB0aGUgdXBjb21pbmcgcmVzdW1lIHdpbGwgbm90IGZsb3cuXG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG5cbiAgICAvLyBjcnVkZSB3YXkgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIHJlc3VtZVxuICB9IGVsc2UgaWYgKHNlbGYubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIHNlbGYucmVzdW1lKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIC8vIHdlIGZsb3cgb25seSBpZiB0aGVyZSBpcyBubyBvbmUgbGlzdGVuaW5nXG4gICAgLy8gZm9yIHJlYWRhYmxlLCBidXQgd2Ugc3RpbGwgaGF2ZSB0byBjYWxsXG4gICAgLy8gcmVzdW1lKClcbiAgICBzdGF0ZS5mbG93aW5nID0gIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpO1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKTtcbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuICAgIF90aGlzLnB1c2gobnVsbCk7XG4gIH0pO1xuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIG1ldGhvZFdyYXAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtZXRob2RXcmFwUmV0dXJuRnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICBmb3IgKHZhciBuID0gMDsgbiA8IGtQcm94eUV2ZW50cy5sZW5ndGg7IG4rKykge1xuICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpO1xuICB9XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgdGhpcy5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0aGlzO1xufTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvYXN5bmNfaXRlcmF0b3InKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKTtcbiAgfTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVGbG93aW5nJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldChzdGF0ZSkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUxlbmd0aCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoO1xuICB9XG59KTtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25zdW1lKG4sIHN0YXRlLmRlY29kZXIpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKTtcbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aCk7XG5cbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAvLyBpZiB0aGUgd3JpdGFibGUgc2lkZSBpcyByZWFkeSBmb3IgYXV0b0Rlc3Ryb3kgYXMgd2VsbFxuICAgICAgdmFyIHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgICAgIGlmICghd1N0YXRlIHx8IHdTdGF0ZS5hdXRvRGVzdHJveSAmJiB3U3RhdGUuZmluaXNoZWQpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcm9tID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xudmFyIF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gX3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcsXG4gIEVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMDtcbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5yZXF1aXJlKCdpbmhlcml0cycpKFRyYW5zZm9ybSwgRHVwbGV4KTtcbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcbiAgaWYgKGNiID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLKCkpO1xuICB9XG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcbiAgaWYgKGRhdGEgIT0gbnVsbClcbiAgICAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG4gIGNiKGVyKTtcbiAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IHtcbiAgICBhZnRlclRyYW5zZm9ybTogYWZ0ZXJUcmFuc2Zvcm0uYmluZCh0aGlzKSxcbiAgICBuZWVkVHJhbnNmb3JtOiBmYWxzZSxcbiAgICB0cmFuc2Zvcm1pbmc6IGZhbHNlLFxuICAgIHdyaXRlY2I6IG51bGwsXG4gICAgd3JpdGVjaHVuazogbnVsbCxcbiAgICB3cml0ZWVuY29kaW5nOiBudWxsXG4gIH07XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpO1xufVxuZnVuY3Rpb24gcHJlZmluaXNoKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCkge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ190cmFuc2Zvcm0oKScpKTtcbn07XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgZnVuY3Rpb24gKGVycjIpIHtcbiAgICBjYihlcnIyKTtcbiAgfSk7XG59O1xuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgaWYgKGRhdGEgIT0gbnVsbClcbiAgICAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICBzdHJlYW0ucHVzaChkYXRhKTtcblxuICAvLyBUT0RPKEJyaWRnZUFSKTogV3JpdGUgYSB0ZXN0IGZvciB0aGVzZSB0d28gZXJyb3IgY2FzZXNcbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgaWYgKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpIHRocm93IG5ldyBFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAoKTtcbiAgaWYgKHN0cmVhbS5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORygpO1xuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBvbkNvcmtlZEZpbmlzaChfdGhpcywgc3RhdGUpO1xuICB9O1xufVxuLyogPC9yZXBsYWNlbWVudD4gKi9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RhdGUnKSxcbiAgZ2V0SGlnaFdhdGVyTWFyayA9IF9yZXF1aXJlLmdldEhpZ2hXYXRlck1hcms7XG52YXIgX3JlcXVpcmUkY29kZXMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKS5jb2RlcyxcbiAgRVJSX0lOVkFMSURfQVJHX1RZUEUgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxcbiAgRVJSX01VTFRJUExFX0NBTExCQUNLID0gX3JlcXVpcmUkY29kZXMuRVJSX01VTFRJUExFX0NBTExCQUNLLFxuICBFUlJfU1RSRUFNX0NBTk5PVF9QSVBFID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxcbiAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX0RFU1RST1lFRCxcbiAgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsXG4gIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQsXG4gIEVSUl9VTktOT1dOX0VOQ09ESU5HID0gX3JlcXVpcmUkY29kZXMuRVJSX1VOS05PV05fRU5DT0RJTkc7XG52YXIgZXJyb3JPckRlc3Ryb3kgPSBkZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoV3JpdGFibGUsIFN0cmVhbSk7XG5mdW5jdGlvbiBub3AoKSB7fVxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLFxuICAvLyBlLmcuIG9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlIHZzLiBvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZSwgZXRjLlxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleCk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlO1xuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZmluaXNoJyAoYW5kIHBvdGVudGlhbGx5ICdlbmQnKVxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95O1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVCdWZmZXJHZXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nLCAnREVQMDAwMycpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG4vLyBUZXN0IF93cml0YWJsZVN0YXRlIGZvciBpbmhlcml0YW5jZSB0byBhY2NvdW50IGZvciBEdXBsZXggc3RyZWFtcyxcbi8vIHdob3NlIHByb3RvdHlwZSBjaGFpbiBvbmx5IHBvaW50cyB0byBSZWFkYWJsZS5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICByZWFsSGFzSW5zdGFuY2UgPSBmdW5jdGlvbiByZWFsSGFzSW5zdGFuY2Uob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgV3JpdGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjVcbiAgdmFyIGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIER1cGxleDtcbiAgaWYgKCFpc0R1cGxleCAmJiAhcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpKSByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICBlcnJvck9yRGVzdHJveSh0aGlzLCBuZXcgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSgpKTtcbn07XG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EKCk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIENoZWNrcyB0aGF0IGEgdXNlci1zdXBwbGllZCBjaHVuayBpcyB2YWxpZCwgZXNwZWNpYWxseSBmb3IgdGhlIHBhcnRpY3VsYXJcbi8vIG1vZGUgdGhlIHN0cmVhbSBpcyBpbi4gQ3VycmVudGx5IHRoaXMgbWVhbnMgdGhhdCBgbnVsbGAgaXMgbmV2ZXIgYWNjZXB0ZWRcbi8vIGFuZCB1bmRlZmluZWQvbm9uLXN0cmluZyB2YWx1ZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBvYmplY3QgbW9kZS5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciBlcjtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUygpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInXSwgY2h1bmspO1xuICB9XG4gIGlmIChlcikge1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVyKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIF9pc1VpbnQ4QXJyYXkoY2h1bmspO1xuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG4gIGlmIChzdGF0ZS5lbmRpbmcpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrKztcbn07XG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgRVJSX1VOS05PV05fRU5DT0RJTkcoZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVCdWZmZXInLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7XG4gIH1cbn0pO1xuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICB9XG59KTtcblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHN0YXRlLm9ud3JpdGUobmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpKTtlbHNlIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHtcbiAgICAvLyBkZWZlciB0aGUgY2FsbGJhY2sgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBzeW5jaHJvbm91c2x5XG4gICAgLy8gdG8gYXZvaWQgcGlsaW5nIHVwIHRoaW5ncyBvbiB0aGUgc3RhY2tcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGFuZCBpdCB3aWxsIGFsd2F5cyBoYXBwZW5cbiAgICAvLyBhZnRlciBlcnJvclxuICAgIHByb2Nlc3MubmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBjYWxsZXIgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGJlZm9yZSBpZlxuICAgIC8vIGl0IGlzIGFzeW5jXG4gICAgY2IoZXIpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBidXQgZmluaXNoIG11c3RcbiAgICAvLyBhbHdheXMgZm9sbG93IGVycm9yXG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSygpO1xuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSkgfHwgc3RyZWFtLmRlc3Ryb3llZDtcbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBhbGxCdWZmZXJzID0gdHJ1ZTtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGlmICghZW50cnkuaXNCdWYpIGFsbEJ1ZmZlcnMgPSBmYWxzZTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGJ1ZmZlci5hbGxCdWZmZXJzID0gYWxsQnVmZmVycztcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tO1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfd3JpdGUoKScpKTtcbn07XG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xuICByZXR1cm4gdGhpcztcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVMZW5ndGgnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aDtcbiAgfVxufSk7XG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVycik7XG4gICAgfVxuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCAmJiAhc3RhdGUuZmluYWxDYWxsZWQpIHtcbiAgICBpZiAodHlwZW9mIHN0cmVhbS5fZmluYWwgPT09ICdmdW5jdGlvbicgJiYgIXN0YXRlLmRlc3Ryb3llZCkge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxGaW5hbCwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgICAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAgIC8vIEluIGNhc2Ugb2YgZHVwbGV4IHN0cmVhbXMgd2UgbmVlZCBhIHdheSB0byBkZXRlY3RcbiAgICAgICAgLy8gaWYgdGhlIHJlYWRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGxcbiAgICAgICAgdmFyIHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgICAgICAgaWYgKCFyU3RhdGUgfHwgclN0YXRlLmF1dG9EZXN0cm95ICYmIHJTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3MubmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cblxuICAvLyByZXVzZSB0aGUgZnJlZSBjb3JrUmVxLlxuICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBjYihlcnIpO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfT2JqZWN0JHNldFByb3RvdHlwZU87XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG52YXIgZmluaXNoZWQgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKTtcbnZhciBrTGFzdFJlc29sdmUgPSBTeW1ib2woJ2xhc3RSZXNvbHZlJyk7XG52YXIga0xhc3RSZWplY3QgPSBTeW1ib2woJ2xhc3RSZWplY3QnKTtcbnZhciBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG52YXIga0VuZGVkID0gU3ltYm9sKCdlbmRlZCcpO1xudmFyIGtMYXN0UHJvbWlzZSA9IFN5bWJvbCgnbGFzdFByb21pc2UnKTtcbnZhciBrSGFuZGxlUHJvbWlzZSA9IFN5bWJvbCgnaGFuZGxlUHJvbWlzZScpO1xudmFyIGtTdHJlYW0gPSBTeW1ib2woJ3N0cmVhbScpO1xuZnVuY3Rpb24gY3JlYXRlSXRlclJlc3VsdCh2YWx1ZSwgZG9uZSkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBkb25lOiBkb25lXG4gIH07XG59XG5mdW5jdGlvbiByZWFkQW5kUmVzb2x2ZShpdGVyKSB7XG4gIHZhciByZXNvbHZlID0gaXRlcltrTGFzdFJlc29sdmVdO1xuICBpZiAocmVzb2x2ZSAhPT0gbnVsbCkge1xuICAgIHZhciBkYXRhID0gaXRlcltrU3RyZWFtXS5yZWFkKCk7XG4gICAgLy8gd2UgZGVmZXIgaWYgZGF0YSBpcyBudWxsXG4gICAgLy8gd2UgY2FuIGJlIGV4cGVjdGluZyBlaXRoZXIgJ2VuZCcgb3JcbiAgICAvLyAnZXJyb3InXG4gICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgIGl0ZXJba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICBpdGVyW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcltrTGFzdFJlamVjdF0gPSBudWxsO1xuICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblJlYWRhYmxlKGl0ZXIpIHtcbiAgLy8gd2Ugd2FpdCBmb3IgdGhlIG5leHQgdGljaywgYmVjYXVzZSBpdCBtaWdodFxuICAvLyBlbWl0IGFuIGVycm9yIHdpdGggcHJvY2Vzcy5uZXh0VGlja1xuICBwcm9jZXNzLm5leHRUaWNrKHJlYWRBbmRSZXNvbHZlLCBpdGVyKTtcbn1cbmZ1bmN0aW9uIHdyYXBGb3JOZXh0KGxhc3RQcm9taXNlLCBpdGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgbGFzdFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXRlcltrRW5kZWRdKSB7XG4gICAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlcltrSGFuZGxlUHJvbWlzZV0ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9LCByZWplY3QpO1xuICB9O1xufVxudmFyIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuY3Rpb24gKCkge30pO1xudmFyIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZigoX09iamVjdCRzZXRQcm90b3R5cGVPID0ge1xuICBnZXQgc3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzW2tTdHJlYW1dO1xuICB9LFxuICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLy8gaWYgd2UgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvciBpbiB0aGUgbWVhbndoaWxlXG4gICAgLy8gcmVqZWN0IHN0cmFpZ2h0IGF3YXlcbiAgICB2YXIgZXJyb3IgPSB0aGlzW2tFcnJvcl07XG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpc1trRW5kZWRdKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzW2tTdHJlYW1dLmRlc3Ryb3llZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB2aWEgbmV4dFRpY2sgYmVjYXVzZSBpZiAuZGVzdHJveShlcnIpIGlzXG4gICAgICAvLyBjYWxsZWQsIHRoZSBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgdmlhIG5leHRUaWNrLCBhbmRcbiAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcyBubyBlcnJvciBsaW5nZXJpbmcgYXJvdW5kXG4gICAgICAvLyB3YWl0aW5nIHRvIGJlIGVtaXR0ZWQuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXNba0Vycm9yXSkge1xuICAgICAgICAgICAgcmVqZWN0KF90aGlzW2tFcnJvcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbXVsdGlwbGUgbmV4dCgpIGNhbGxzXG4gICAgLy8gd2Ugd2lsbCB3YWl0IGZvciB0aGUgcHJldmlvdXMgUHJvbWlzZSB0byBmaW5pc2hcbiAgICAvLyB0aGlzIGxvZ2ljIGlzIG9wdGltaXplZCB0byBzdXBwb3J0IGZvciBhd2FpdCBsb29wcyxcbiAgICAvLyB3aGVyZSBuZXh0KCkgaXMgb25seSBjYWxsZWQgb25jZSBhdCBhIHRpbWVcbiAgICB2YXIgbGFzdFByb21pc2UgPSB0aGlzW2tMYXN0UHJvbWlzZV07XG4gICAgdmFyIHByb21pc2U7XG4gICAgaWYgKGxhc3RQcm9taXNlKSB7XG4gICAgICBwcm9taXNlID0gbmV3IFByb21pc2Uod3JhcEZvck5leHQobGFzdFByb21pc2UsIHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZmFzdCBwYXRoIG5lZWRlZCB0byBzdXBwb3J0IG11bHRpcGxlIHRoaXMucHVzaCgpXG4gICAgICAvLyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG5leHQoKSBxdWV1ZVxuICAgICAgdmFyIGRhdGEgPSB0aGlzW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChkYXRhLCBmYWxzZSkpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHRoaXNba0hhbmRsZVByb21pc2VdKTtcbiAgICB9XG4gICAgdGhpc1trTGFzdFByb21pc2VdID0gcHJvbWlzZTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgU3ltYm9sLmFzeW5jSXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7XG59KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgXCJyZXR1cm5cIiwgZnVuY3Rpb24gX3JldHVybigpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG4gIC8vIGRlc3Ryb3koZXJyLCBjYikgaXMgYSBwcml2YXRlIEFQSVxuICAvLyB3ZSBjYW4gZ3VhcmFudGVlIHdlIGhhdmUgdGhhdCBoZXJlLCBiZWNhdXNlIHdlIGNvbnRyb2wgdGhlXG4gIC8vIFJlYWRhYmxlIGNsYXNzIHRoaXMgaXMgYXR0YWNoZWQgdG9cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBfdGhpczJba1N0cmVhbV0uZGVzdHJveShudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfSk7XG4gIH0pO1xufSksIF9PYmplY3Qkc2V0UHJvdG90eXBlTyksIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xudmFyIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9IGZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcihzdHJlYW0pIHtcbiAgdmFyIF9PYmplY3QkY3JlYXRlO1xuICB2YXIgaXRlcmF0b3IgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgKF9PYmplY3QkY3JlYXRlID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga1N0cmVhbSwge1xuICAgIHZhbHVlOiBzdHJlYW0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZXNvbHZlLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZWplY3QsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRXJyb3IsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRW5kZWQsIHtcbiAgICB2YWx1ZTogc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0hhbmRsZVByb21pc2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZGF0YSA9IGl0ZXJhdG9yW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gcmVzb2x2ZTtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gcmVqZWN0O1xuICAgICAgfVxuICAgIH0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9PYmplY3QkY3JlYXRlKSk7XG4gIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICBmaW5pc2hlZChzdHJlYW0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlICE9PSAnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKSB7XG4gICAgICB2YXIgcmVqZWN0ID0gaXRlcmF0b3Jba0xhc3RSZWplY3RdO1xuICAgICAgLy8gcmVqZWN0IGlmIHdlIGFyZSB3YWl0aW5nIGZvciBkYXRhIGluIHRoZSBQcm9taXNlXG4gICAgICAvLyByZXR1cm5lZCBieSBuZXh0KCkgYW5kIHN0b3JlIHRoZSBlcnJvclxuICAgICAgaWYgKHJlamVjdCAhPT0gbnVsbCkge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IG51bGw7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgaXRlcmF0b3Jba0Vycm9yXSA9IGVycjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlc29sdmUgPSBpdGVyYXRvcltrTGFzdFJlc29sdmVdO1xuICAgIGlmIChyZXNvbHZlICE9PSBudWxsKSB7XG4gICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgIGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICB9XG4gICAgaXRlcmF0b3Jba0VuZGVkXSA9IHRydWU7XG4gIH0pO1xuICBzdHJlYW0ub24oJ3JlYWRhYmxlJywgb25SZWFkYWJsZS5iaW5kKG51bGwsIGl0ZXJhdG9yKSk7XG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcjsiLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIF90b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7IH0gfVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgeyBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnYnVmZmVyJyksXG4gIEJ1ZmZlciA9IF9yZXF1aXJlLkJ1ZmZlcjtcbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCd1dGlsJyksXG4gIGluc3BlY3QgPSBfcmVxdWlyZTIuaW5zcGVjdDtcbnZhciBjdXN0b20gPSBpbnNwZWN0ICYmIGluc3BlY3QuY3VzdG9tIHx8ICdpbnNwZWN0JztcbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbChzcmMsIHRhcmdldCwgb2Zmc2V0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQnVmZmVyTGlzdCwgW3tcbiAgICBrZXk6IFwicHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKHYpIHtcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgZGF0YTogdixcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICAgKyt0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHYpIHtcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgZGF0YTogdixcbiAgICAgICAgbmV4dDogdGhpcy5oZWFkXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICAgIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgICAgKyt0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgICAgLS10aGlzLmxlbmd0aDtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiam9pblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgICB3aGlsZSAocCA9IHAubmV4dCkgcmV0ICs9IHMgKyBwLmRhdGE7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb25jYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KG4pIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29uc3VtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25zdW1lKG4sIGhhc1N0cmluZ3MpIHtcbiAgICAgIHZhciByZXQ7XG4gICAgICBpZiAobiA8IHRoaXMuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAvLyBgc2xpY2VgIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgICByZXQgPSB0aGlzLmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICAgICAgdGhpcy5oZWFkLmRhdGEgPSB0aGlzLmhlYWQuZGF0YS5zbGljZShuKTtcbiAgICAgIH0gZWxzZSBpZiAobiA9PT0gdGhpcy5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIC8vIEZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaC5cbiAgICAgICAgcmV0ID0gdGhpcy5zaGlmdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyLlxuICAgICAgICByZXQgPSBoYXNTdHJpbmdzID8gdGhpcy5fZ2V0U3RyaW5nKG4pIDogdGhpcy5fZ2V0QnVmZmVyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmlyc3QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0U3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRTdHJpbmcobikge1xuICAgICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgICB2YXIgYyA9IDE7XG4gICAgICB2YXIgcmV0ID0gcC5kYXRhO1xuICAgICAgbiAtPSByZXQubGVuZ3RoO1xuICAgICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICAgICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICAgICAgbiAtPSBuYjtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICArK2M7XG4gICAgICB9XG4gICAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyZWQgZGF0YS5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0QnVmZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRCdWZmZXIobikge1xuICAgICAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgICAgdmFyIGMgPSAxO1xuICAgICAgcC5kYXRhLmNvcHkocmV0KTtcbiAgICAgIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICAgICAgbiAtPSBuYjtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgICsrYztcbiAgICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZCA9IHA7XG4gICAgICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICArK2M7XG4gICAgICB9XG4gICAgICB0aGlzLmxlbmd0aCAtPSBjO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGxpbmtlZCBsaXN0IG9ubHkgc2hvd3MgdGhlIG1pbmltYWwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLlxuICB9LCB7XG4gICAga2V5OiBjdXN0b20sXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKF8sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBpbnNwZWN0KHRoaXMsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgICAgIC8vIE9ubHkgaW5zcGVjdCBvbmUgbGV2ZWwuXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAvLyBJdCBzaG91bGQgbm90IHJlY3Vyc2UuXG4gICAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBCdWZmZXJMaXN0O1xufSgpOyIsIid1c2Ugc3RyaWN0JztcblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHZhciByZWFkYWJsZURlc3Ryb3llZCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIHZhciB3cml0YWJsZURlc3Ryb3llZCA9IHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIGlmIChyZWFkYWJsZURlc3Ryb3llZCB8fCB3cml0YWJsZURlc3Ryb3llZCkge1xuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBpcyBhIGR1cGxleCBzdHJlYW0gbWFyayB0aGUgd3JpdGFibGUgcGFydCBhcyBkZXN0cm95ZWQgYXMgd2VsbFxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuICB0aGlzLl9kZXN0cm95KGVyciB8fCBudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKCFjYiAmJiBlcnIpIHtcbiAgICAgIGlmICghX3RoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZU5ULCBfdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIV90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkge1xuICAgICAgICBfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvckFuZENsb3NlTlQsIF90aGlzLCBlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCwgX3RoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIF90aGlzKTtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIF90aGlzKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn1cbmZ1bmN0aW9uIGVtaXRFcnJvckFuZENsb3NlTlQoc2VsZiwgZXJyKSB7XG4gIGVtaXRFcnJvck5UKHNlbGYsIGVycik7XG4gIGVtaXRDbG9zZU5UKHNlbGYpO1xufVxuZnVuY3Rpb24gZW1pdENsb3NlTlQoc2VsZikge1xuICBpZiAoc2VsZi5fd3JpdGFibGVTdGF0ZSAmJiAhc2VsZi5fd3JpdGFibGVTdGF0ZS5lbWl0Q2xvc2UpIHJldHVybjtcbiAgaWYgKHNlbGYuX3JlYWRhYmxlU3RhdGUgJiYgIXNlbGYuX3JlYWRhYmxlU3RhdGUuZW1pdENsb3NlKSByZXR1cm47XG4gIHNlbGYuZW1pdCgnY2xvc2UnKTtcbn1cbmZ1bmN0aW9uIHVuZGVzdHJveSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5hbENhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpIHtcbiAgLy8gV2UgaGF2ZSB0ZXN0cyB0aGF0IHJlbHkgb24gZXJyb3JzIGJlaW5nIGVtaXR0ZWRcbiAgLy8gaW4gdGhlIHNhbWUgdGljaywgc28gY2hhbmdpbmcgdGhpcyBpcyBzZW12ZXIgbWFqb3IuXG4gIC8vIEZvciBub3cgd2hlbiB5b3Ugb3B0LWluIHRvIGF1dG9EZXN0cm95IHdlIGFsbG93XG4gIC8vIHRoZSBlcnJvciB0byBiZSBlbWl0dGVkIG5leHRUaWNrLiBJbiBhIGZ1dHVyZVxuICAvLyBzZW12ZXIgbWFqb3IgdXBkYXRlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gdGhpcy5cblxuICB2YXIgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICBpZiAoclN0YXRlICYmIHJTdGF0ZS5hdXRvRGVzdHJveSB8fCB3U3RhdGUgJiYgd1N0YXRlLmF1dG9EZXN0cm95KSBzdHJlYW0uZGVzdHJveShlcnIpO2Vsc2Ugc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZXN0cm95OiBkZXN0cm95LFxuICB1bmRlc3Ryb3k6IHVuZGVzdHJveSxcbiAgZXJyb3JPckRlc3Ryb3k6IGVycm9yT3JEZXN0cm95XG59OyIsIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvZW5kLW9mLXN0cmVhbSB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2Rlcy5FUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRTtcbmZ1bmN0aW9uIG9uY2UoY2FsbGJhY2spIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHJldHVybjtcbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG59XG5mdW5jdGlvbiBub29wKCkge31cbmZ1bmN0aW9uIGlzUmVxdWVzdChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGVvcyhzdHJlYW0sIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVvcyhzdHJlYW0sIG51bGwsIG9wdHMpO1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrIHx8IG5vb3ApO1xuICB2YXIgcmVhZGFibGUgPSBvcHRzLnJlYWRhYmxlIHx8IG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZTtcbiAgdmFyIHdyaXRhYmxlID0gb3B0cy53cml0YWJsZSB8fCBvcHRzLndyaXRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ud3JpdGFibGU7XG4gIHZhciBvbmxlZ2FjeWZpbmlzaCA9IGZ1bmN0aW9uIG9ubGVnYWN5ZmluaXNoKCkge1xuICAgIGlmICghc3RyZWFtLndyaXRhYmxlKSBvbmZpbmlzaCgpO1xuICB9O1xuICB2YXIgd3JpdGFibGVFbmRlZCA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZSAmJiBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ7XG4gIHZhciBvbmZpbmlzaCA9IGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIHdyaXRhYmxlID0gZmFsc2U7XG4gICAgd3JpdGFibGVFbmRlZCA9IHRydWU7XG4gICAgaWYgKCFyZWFkYWJsZSkgY2FsbGJhY2suY2FsbChzdHJlYW0pO1xuICB9O1xuICB2YXIgcmVhZGFibGVFbmRlZCA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZDtcbiAgdmFyIG9uZW5kID0gZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgcmVhZGFibGUgPSBmYWxzZTtcbiAgICByZWFkYWJsZUVuZGVkID0gdHJ1ZTtcbiAgICBpZiAoIXdyaXRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG4gIH07XG4gIHZhciBvbmVycm9yID0gZnVuY3Rpb24gb25lcnJvcihlcnIpIHtcbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgfTtcbiAgdmFyIG9uY2xvc2UgPSBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIHZhciBlcnI7XG4gICAgaWYgKHJlYWRhYmxlICYmICFyZWFkYWJsZUVuZGVkKSB7XG4gICAgICBpZiAoIXN0cmVhbS5fcmVhZGFibGVTdGF0ZSB8fCAhc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZGVkKSBlcnIgPSBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKTtcbiAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgICB9XG4gICAgaWYgKHdyaXRhYmxlICYmICF3cml0YWJsZUVuZGVkKSB7XG4gICAgICBpZiAoIXN0cmVhbS5fd3JpdGFibGVTdGF0ZSB8fCAhc3RyZWFtLl93cml0YWJsZVN0YXRlLmVuZGVkKSBlcnIgPSBuZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UoKTtcbiAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbnJlcXVlc3QgPSBmdW5jdGlvbiBvbnJlcXVlc3QoKSB7XG4gICAgc3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpO1xuICB9O1xuICBpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHtcbiAgICBzdHJlYW0ub24oJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKTtcbiAgICBpZiAoc3RyZWFtLnJlcSkgb25yZXF1ZXN0KCk7ZWxzZSBzdHJlYW0ub24oJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuICB9IGVsc2UgaWYgKHdyaXRhYmxlICYmICFzdHJlYW0uX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAvLyBsZWdhY3kgc3RyZWFtc1xuICAgIHN0cmVhbS5vbignZW5kJywgb25sZWdhY3lmaW5pc2gpO1xuICAgIHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaCk7XG4gIH1cbiAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG4gIHN0cmVhbS5vbignZmluaXNoJywgb25maW5pc2gpO1xuICBpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpIHN0cmVhbS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgc3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaCk7XG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIG9uY2xvc2UpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGVvczsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXInKVxufTtcbiIsIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW9zO1xuZnVuY3Rpb24gb25jZShjYWxsYmFjaykge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgY2FsbGJhY2suYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICB9O1xufVxudmFyIF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9NSVNTSU5HX0FSR1MgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUlTU0lOR19BUkdTLFxuICBFUlJfU1RSRUFNX0RFU1RST1lFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVEO1xuZnVuY3Rpb24gbm9vcChlcnIpIHtcbiAgLy8gUmV0aHJvdyB0aGUgZXJyb3IgaWYgaXQgZXhpc3RzIHRvIGF2b2lkIHN3YWxsb3dpbmcgaXRcbiAgaWYgKGVycikgdGhyb3cgZXJyO1xufVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrKTtcbiAgdmFyIGNsb3NlZCA9IGZhbHNlO1xuICBzdHJlYW0ub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gIH0pO1xuICBpZiAoZW9zID09PSB1bmRlZmluZWQpIGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpO1xuICBlb3Moc3RyZWFtLCB7XG4gICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgd3JpdGFibGU6IHdyaXRpbmdcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG4gIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG4gICAgaWYgKGRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIGRlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAvLyByZXF1ZXN0LmRlc3Ryb3kganVzdCBkbyAuZW5kIC0gLmFib3J0IGlzIHdoYXQgd2Ugd2FudFxuICAgIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkgcmV0dXJuIHN0cmVhbS5hYm9ydCgpO1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHJldHVybiBzdHJlYW0uZGVzdHJveSgpO1xuICAgIGNhbGxiYWNrKGVyciB8fCBuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3BpcGUnKSk7XG4gIH07XG59XG5mdW5jdGlvbiBjYWxsKGZuKSB7XG4gIGZuKCk7XG59XG5mdW5jdGlvbiBwaXBlKGZyb20sIHRvKSB7XG4gIHJldHVybiBmcm9tLnBpcGUodG8pO1xufVxuZnVuY3Rpb24gcG9wQ2FsbGJhY2soc3RyZWFtcykge1xuICBpZiAoIXN0cmVhbXMubGVuZ3RoKSByZXR1cm4gbm9vcDtcbiAgaWYgKHR5cGVvZiBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gIT09ICdmdW5jdGlvbicpIHJldHVybiBub29wO1xuICByZXR1cm4gc3RyZWFtcy5wb3AoKTtcbn1cbmZ1bmN0aW9uIHBpcGVsaW5lKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3RyZWFtcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzdHJlYW1zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHZhciBjYWxsYmFjayA9IHBvcENhbGxiYWNrKHN0cmVhbXMpO1xuICBpZiAoQXJyYXkuaXNBcnJheShzdHJlYW1zWzBdKSkgc3RyZWFtcyA9IHN0cmVhbXNbMF07XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygnc3RyZWFtcycpO1xuICB9XG4gIHZhciBlcnJvcjtcbiAgdmFyIGRlc3Ryb3lzID0gc3RyZWFtcy5tYXAoZnVuY3Rpb24gKHN0cmVhbSwgaSkge1xuICAgIHZhciByZWFkaW5nID0gaSA8IHN0cmVhbXMubGVuZ3RoIC0gMTtcbiAgICB2YXIgd3JpdGluZyA9IGkgPiAwO1xuICAgIHJldHVybiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiAgICAgIGlmIChlcnIpIGRlc3Ryb3lzLmZvckVhY2goY2FsbCk7XG4gICAgICBpZiAocmVhZGluZykgcmV0dXJuO1xuICAgICAgZGVzdHJveXMuZm9yRWFjaChjYWxsKTtcbiAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzdHJlYW1zLnJlZHVjZShwaXBlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gcGlwZWxpbmU7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVJSX0lOVkFMSURfT1BUX1ZBTFVFID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMuRVJSX0lOVkFMSURfT1BUX1ZBTFVFO1xuZnVuY3Rpb24gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucywgaXNEdXBsZXgsIGR1cGxleEtleSkge1xuICByZXR1cm4gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrICE9IG51bGwgPyBvcHRpb25zLmhpZ2hXYXRlck1hcmsgOiBpc0R1cGxleCA/IG9wdGlvbnNbZHVwbGV4S2V5XSA6IG51bGw7XG59XG5mdW5jdGlvbiBnZXRIaWdoV2F0ZXJNYXJrKHN0YXRlLCBvcHRpb25zLCBkdXBsZXhLZXksIGlzRHVwbGV4KSB7XG4gIHZhciBod20gPSBoaWdoV2F0ZXJNYXJrRnJvbShvcHRpb25zLCBpc0R1cGxleCwgZHVwbGV4S2V5KTtcbiAgaWYgKGh3bSAhPSBudWxsKSB7XG4gICAgaWYgKCEoaXNGaW5pdGUoaHdtKSAmJiBNYXRoLmZsb29yKGh3bSkgPT09IGh3bSkgfHwgaHdtIDwgMCkge1xuICAgICAgdmFyIG5hbWUgPSBpc0R1cGxleCA/IGR1cGxleEtleSA6ICdoaWdoV2F0ZXJNYXJrJztcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9PUFRfVkFMVUUobmFtZSwgaHdtKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoaHdtKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdmFsdWVcbiAgcmV0dXJuIHN0YXRlLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRIaWdoV2F0ZXJNYXJrOiBnZXRIaWdoV2F0ZXJNYXJrXG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1kYXRhLXByb3BlcnR5Jyk7XG52YXIgaGFzRGVzY3JpcHRvcnMgPSByZXF1aXJlKCdoYXMtcHJvcGVydHktZGVzY3JpcHRvcnMnKSgpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkZmxvb3IgPSBHZXRJbnRyaW5zaWMoJyVNYXRoLmZsb29yJScpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXRGdW5jdGlvbkxlbmd0aChmbiwgbGVuZ3RoKSB7XG5cdGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGZuYCBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHR9XG5cdGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBsZW5ndGggPCAwIHx8IGxlbmd0aCA+IDB4RkZGRkZGRkYgfHwgJGZsb29yKGxlbmd0aCkgIT09IGxlbmd0aCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbGVuZ3RoYCBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXInKTtcblx0fVxuXG5cdHZhciBsb29zZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmICEhYXJndW1lbnRzWzJdO1xuXG5cdHZhciBmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlID0gdHJ1ZTtcblx0dmFyIGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSA9IHRydWU7XG5cdGlmICgnbGVuZ3RoJyBpbiBmbiAmJiBnT1BEKSB7XG5cdFx0dmFyIGRlc2MgPSBnT1BEKGZuLCAnbGVuZ3RoJyk7XG5cdFx0aWYgKGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHRmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChkZXNjICYmICFkZXNjLndyaXRhYmxlKSB7XG5cdFx0XHRmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSB8fCBmdW5jdGlvbkxlbmd0aElzV3JpdGFibGUgfHwgIWxvb3NlKSB7XG5cdFx0aWYgKGhhc0Rlc2NyaXB0b3JzKSB7XG5cdFx0XHRkZWZpbmUoLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPGRlZmluZT5bMF19ICovIChmbiksICdsZW5ndGgnLCBsZW5ndGgsIHRydWUsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWZpbmUoLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPGRlZmluZT5bMF19ICovIChmbiksICdsZW5ndGgnLCBsZW5ndGgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZm47XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRXZWFrTWFwID0gR2V0SW50cmluc2ljKCclV2Vha01hcCUnLCB0cnVlKTtcbnZhciAkTWFwID0gR2V0SW50cmluc2ljKCclTWFwJScsIHRydWUpO1xuXG52YXIgJHdlYWtNYXBHZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xudmFyICR3ZWFrTWFwU2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbnZhciAkd2Vha01hcEhhcyA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG52YXIgJG1hcEdldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5nZXQnLCB0cnVlKTtcbnZhciAkbWFwU2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xudmFyICRtYXBIYXMgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG5cbi8qXG4qIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBsaXN0IHJldHVybmluZyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkuXG4qXG4qIFRoYXQgbm9kZSBpcyBhbHNvIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0IGlmIGl0J3MgYWNjZXNzZWQgYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSB0aGUgd2hvbGUgbGlzdC4gQnkgZG9pbmcgc28sIGFsbCB0aGUgcmVjZW50bHkgdXNlZCBub2RlcyBjYW4gYmUgYWNjZXNzZWQgcmVsYXRpdmVseSBxdWlja2x5LlxuKi9cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJykubGlzdEdldE5vZGV9ICovXG52YXIgbGlzdEdldE5vZGUgPSBmdW5jdGlvbiAobGlzdCwga2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0LyoqIEB0eXBlIHt0eXBlb2YgbGlzdCB8IE5vbk51bGxhYmxlPCh0eXBlb2YgbGlzdClbJ25leHQnXT59ICovXG5cdHZhciBwcmV2ID0gbGlzdDtcblx0LyoqIEB0eXBlIHsodHlwZW9mIGxpc3QpWyduZXh0J119ICovXG5cdHZhciBjdXJyO1xuXHRmb3IgKDsgKGN1cnIgPSBwcmV2Lm5leHQpICE9PSBudWxsOyBwcmV2ID0gY3Vycikge1xuXHRcdGlmIChjdXJyLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRwcmV2Lm5leHQgPSBjdXJyLm5leHQ7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRjdXJyLm5leHQgPSAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiBsaXN0Lm5leHQ+fSAqLyAobGlzdC5uZXh0KTtcblx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5saXN0R2V0fSAqL1xudmFyIGxpc3RHZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZTtcbn07XG4vKiogQHR5cGUge2ltcG9ydCgnLicpLmxpc3RTZXR9ICovXG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuJykuTGlzdE5vZGU8dHlwZW9mIHZhbHVlPn0gKi8gKHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnbiwgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdG5leHQ6IG9iamVjdHMubmV4dCxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH0pO1xuXHR9XG59O1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5saXN0SGFzfSAqL1xudmFyIGxpc3RIYXMgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRTaWRlQ2hhbm5lbCgpIHtcblx0LyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgdW5rbm93bj59ICovIHZhciAkd207XG5cdC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgdW5rbm93bj59ICovIHZhciAkbTtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5Sb290Tm9kZTx1bmtub3duPn0gKi8gdmFyICRvO1xuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuJykuQ2hhbm5lbH0gKi9cblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0OiBmdW5jdGlvbiAoa2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0R2V0KCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBIYXMoJHdtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRtYXBIYXMoJG0sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICgkbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmVseS1pZlxuXHRcdFx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoISR3bSkge1xuXHRcdFx0XHRcdCR3bSA9IG5ldyAkV2Vha01hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR3ZWFrTWFwU2V0KCR3bSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCRNYXApIHtcblx0XHRcdFx0aWYgKCEkbSkge1xuXHRcdFx0XHRcdCRtID0gbmV3ICRNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghJG8pIHtcblx0XHRcdFx0XHQvLyBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBhcyBhbiBlbXB0eSBub2RlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGhhbmRsaW5nIG9mIHRoZSBmaXJzdCBub2RlOiB3ZSBjYW4gYWx3YXlzIHJlZmVyIHRvIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdFx0JG8gPSB7IGtleToge30sIG5leHQ6IG51bGwgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaXN0U2V0KCRvLCBrZXksIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHJldHVybiBjaGFubmVsO1xufTtcbiIsIi8vZmlsdGVyIHdpbGwgcmVlbWl0IHRoZSBkYXRhIGlmIGNiKGVycixwYXNzKSBwYXNzIGlzIHRydXRoeVxuXG4vLyByZWR1Y2UgaXMgbW9yZSB0cmlja3lcbi8vIG1heWJlIHdlIHdhbnQgdG8gZ3JvdXAgdGhlIHJlZHVjdGlvbnMgb3IgZW1pdCBwcm9ncmVzcyB1cGRhdGVzIG9jY2FzaW9uYWxseVxuLy8gdGhlIG1vc3QgYmFzaWMgcmVkdWNlIGp1c3QgZW1pdHMgb25lICdkYXRhJyBldmVudCBhZnRlciBpdCBoYXMgcmVjaWV2ZWQgJ2VuZCdcblxuXG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKVxudmFyIERlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXJcblxubW9kdWxlLmV4cG9ydHMgPSBzcGxpdFxuXG4vL1RPRE8gcGFzcyBpbiBhIGZ1bmN0aW9uIHRvIG1hcCBhY3Jvc3MgdGhlIGxpbmVzLlxuXG5mdW5jdGlvbiBzcGxpdCAobWF0Y2hlciwgbWFwcGVyLCBvcHRpb25zKSB7XG4gIHZhciBkZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICB2YXIgc29GYXIgPSAnJ1xuICB2YXIgbWF4TGVuZ3RoID0gb3B0aW9ucyAmJiBvcHRpb25zLm1heExlbmd0aDtcbiAgdmFyIHRyYWlsaW5nID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYWlsaW5nID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVxuICBpZignZnVuY3Rpb24nID09PSB0eXBlb2YgbWF0Y2hlcilcbiAgICBtYXBwZXIgPSBtYXRjaGVyLCBtYXRjaGVyID0gbnVsbFxuICBpZiAoIW1hdGNoZXIpXG4gICAgbWF0Y2hlciA9IC9cXHI/XFxuL1xuXG4gIGZ1bmN0aW9uIGVtaXQoc3RyZWFtLCBwaWVjZSkge1xuICAgIGlmKG1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGllY2UgPSBtYXBwZXIocGllY2UpXG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgICBpZigndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHBpZWNlKVxuICAgICAgICBzdHJlYW0ucXVldWUocGllY2UpXG4gICAgfVxuICAgIGVsc2VcbiAgICAgIHN0cmVhbS5xdWV1ZShwaWVjZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQgKHN0cmVhbSwgYnVmZmVyKSB7XG4gICAgdmFyIHBpZWNlcyA9ICgoc29GYXIgIT0gbnVsbCA/IHNvRmFyIDogJycpICsgYnVmZmVyKS5zcGxpdChtYXRjaGVyKVxuICAgIHNvRmFyID0gcGllY2VzLnBvcCgpXG5cbiAgICBpZiAobWF4TGVuZ3RoICYmIHNvRmFyLmxlbmd0aCA+IG1heExlbmd0aClcbiAgICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ21heGltdW0gYnVmZmVyIHJlYWNoZWQnKSlcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGllY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGllY2UgPSBwaWVjZXNbaV1cbiAgICAgIGVtaXQoc3RyZWFtLCBwaWVjZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhyb3VnaChmdW5jdGlvbiAoYikge1xuICAgIG5leHQodGhpcywgZGVjb2Rlci53cml0ZShiKSlcbiAgfSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIGlmKGRlY29kZXIuZW5kKVxuICAgICAgbmV4dCh0aGlzLCBkZWNvZGVyLmVuZCgpKVxuICAgIGlmKHRyYWlsaW5nICYmIHNvRmFyICE9IG51bGwpXG4gICAgICBlbWl0KHRoaXMsIHNvRmFyKVxuICAgIHRoaXMucXVldWUobnVsbClcbiAgfSlcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuaW5oZXJpdHMoU3RyZWFtLCBFRSk7XG5TdHJlYW0uUmVhZGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcblN0cmVhbS5Xcml0YWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuU3RyZWFtLkR1cGxleCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcblN0cmVhbS5UcmFuc2Zvcm0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5TdHJlYW0uUGFzc1Rocm91Z2ggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcblN0cmVhbS5maW5pc2hlZCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtLmpzJylcblN0cmVhbS5waXBlbGluZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcycpXG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5cblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFRS5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEVFLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpO1xuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0O1xufTtcbiIsInZhciBkdXBsZXhlciA9IHJlcXVpcmUoJ2R1cGxleGVyJylcbnZhciB0aHJvdWdoID0gcmVxdWlyZSgndGhyb3VnaCcpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RyZWFtc1xuXG4gIGlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcbiAgICBzdHJlYW1zID0gYXJndW1lbnRzWzBdXG4gIH0gZWxzZSB7XG4gICAgc3RyZWFtcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICB9XG5cbiAgaWYoc3RyZWFtcy5sZW5ndGggPT0gMClcbiAgICByZXR1cm4gdGhyb3VnaCgpXG4gIGVsc2UgaWYoc3RyZWFtcy5sZW5ndGggPT0gMSlcbiAgICByZXR1cm4gc3RyZWFtc1swXVxuXG4gIHZhciBmaXJzdCA9IHN0cmVhbXNbMF1cbiAgICAsIGxhc3QgPSBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV1cbiAgICAsIHRoZXBpcGUgPSBkdXBsZXhlcihmaXJzdCwgbGFzdClcblxuICAvL3BpcGUgYWxsIHRoZSBzdHJlYW1zIHRvZ2V0aGVyXG5cbiAgZnVuY3Rpb24gcmVjdXJzZSAoc3RyZWFtcykge1xuICAgIGlmKHN0cmVhbXMubGVuZ3RoIDwgMilcbiAgICAgIHJldHVyblxuICAgIHN0cmVhbXNbMF0ucGlwZShzdHJlYW1zWzFdKVxuICAgIHJlY3Vyc2Uoc3RyZWFtcy5zbGljZSgxKSlcbiAgfVxuXG4gIHJlY3Vyc2Uoc3RyZWFtcylcblxuICBmdW5jdGlvbiBvbmVycm9yICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgIGFyZ3MudW5zaGlmdCgnZXJyb3InKVxuICAgIHRoZXBpcGUuZW1pdC5hcHBseSh0aGVwaXBlLCBhcmdzKVxuICB9XG5cbiAgLy9lcy5kdXBsZXggYWxyZWFkeSByZWVtaXRzIHRoZSBlcnJvciBmcm9tIHRoZSBmaXJzdCBhbmQgbGFzdCBzdHJlYW0uXG4gIC8vYWRkIGEgbGlzdGVuZXIgZm9yIHRoZSBpbm5lciBzdHJlYW1zIGluIHRoZSBwaXBlbGluZS5cbiAgZm9yKHZhciBpID0gMTsgaSA8IHN0cmVhbXMubGVuZ3RoIC0gMTsgaSArKylcbiAgICBzdHJlYW1zW2ldLm9uKCdlcnJvcicsIG9uZXJyb3IpXG5cbiAgcmV0dXJuIHRoZXBpcGVcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgaXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nIHx8IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICBlbmNvZGluZyA9ICcnICsgZW5jb2Rpbmc7XG4gIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6Y2FzZSAndXRmOCc6Y2FzZSAndXRmLTgnOmNhc2UgJ2FzY2lpJzpjYXNlICdiaW5hcnknOmNhc2UgJ2Jhc2U2NCc6Y2FzZSAndWNzMic6Y2FzZSAndWNzLTInOmNhc2UgJ3V0ZjE2bGUnOmNhc2UgJ3V0Zi0xNmxlJzpjYXNlICdyYXcnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX25vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICBpZiAoIWVuYykgcmV0dXJuICd1dGY4JztcbiAgdmFyIHJldHJpZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmMpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gJ3V0ZjgnO1xuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuICd1dGYxNmxlJztcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gJ2xhdGluMSc7XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGVuYztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChyZXRyaWVkKSByZXR1cm47IC8vIHVuZGVmaW5lZFxuICAgICAgICBlbmMgPSAoJycgKyBlbmMpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHJpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuLy8gRG8gbm90IGNhY2hlIGBCdWZmZXIuaXNFbmNvZGluZ2Agd2hlbiBjaGVja2luZyBlbmNvZGluZyBuYW1lcyBhcyBzb21lXG4vLyBtb2R1bGVzIG1vbmtleS1wYXRjaCBpdCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgZW5jb2RpbmdzXG5mdW5jdGlvbiBub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgdmFyIG5lbmMgPSBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKTtcbiAgaWYgKHR5cGVvZiBuZW5jICE9PSAnc3RyaW5nJyAmJiAoQnVmZmVyLmlzRW5jb2RpbmcgPT09IGlzRW5jb2RpbmcgfHwgIWlzRW5jb2RpbmcoZW5jKSkpIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuYyk7XG4gIHJldHVybiBuZW5jIHx8IGVuYztcbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLlxuZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gU3RyaW5nRGVjb2RlcjtcbmZ1bmN0aW9uIFN0cmluZ0RlY29kZXIoZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKTtcbiAgdmFyIG5iO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIHRoaXMudGV4dCA9IHV0ZjE2VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gdXRmMTZFbmQ7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIHRoaXMuZmlsbExhc3QgPSB1dGY4RmlsbExhc3Q7XG4gICAgICBuYiA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgdGhpcy50ZXh0ID0gYmFzZTY0VGV4dDtcbiAgICAgIHRoaXMuZW5kID0gYmFzZTY0RW5kO1xuICAgICAgbmIgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBzaW1wbGVXcml0ZTtcbiAgICAgIHRoaXMuZW5kID0gc2ltcGxlRW5kO1xuICAgICAgcmV0dXJuO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAwO1xuICB0aGlzLmxhc3RUb3RhbCA9IDA7XG4gIHRoaXMubGFzdENoYXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobmIpO1xufVxuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHI7XG4gIHZhciBpO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHIgPSB0aGlzLmZpbGxMYXN0KGJ1Zik7XG4gICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGkgPSB0aGlzLmxhc3ROZWVkO1xuICAgIHRoaXMubGFzdE5lZWQgPSAwO1xuICB9IGVsc2Uge1xuICAgIGkgPSAwO1xuICB9XG4gIGlmIChpIDwgYnVmLmxlbmd0aCkgcmV0dXJuIHIgPyByICsgdGhpcy50ZXh0KGJ1ZiwgaSkgOiB0aGlzLnRleHQoYnVmLCBpKTtcbiAgcmV0dXJuIHIgfHwgJyc7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSB1dGY4RW5kO1xuXG4vLyBSZXR1cm5zIG9ubHkgY29tcGxldGUgY2hhcmFjdGVycyBpbiBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUudGV4dCA9IHV0ZjhUZXh0O1xuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIHBhcnRpYWwgbm9uLVVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5maWxsTGFzdCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn07XG5cbi8vIENoZWNrcyB0aGUgdHlwZSBvZiBhIFVURi04IGJ5dGUsIHdoZXRoZXIgaXQncyBBU0NJSSwgYSBsZWFkaW5nIGJ5dGUsIG9yIGFcbi8vIGNvbnRpbnVhdGlvbiBieXRlLiBJZiBhbiBpbnZhbGlkIGJ5dGUgaXMgZGV0ZWN0ZWQsIC0yIGlzIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrQnl0ZShieXRlKSB7XG4gIGlmIChieXRlIDw9IDB4N0YpIHJldHVybiAwO2Vsc2UgaWYgKGJ5dGUgPj4gNSA9PT0gMHgwNikgcmV0dXJuIDI7ZWxzZSBpZiAoYnl0ZSA+PiA0ID09PSAweDBFKSByZXR1cm4gMztlbHNlIGlmIChieXRlID4+IDMgPT09IDB4MUUpIHJldHVybiA0O1xuICByZXR1cm4gYnl0ZSA+PiA2ID09PSAweDAyID8gLTEgOiAtMjtcbn1cblxuLy8gQ2hlY2tzIGF0IG1vc3QgMyBieXRlcyBhdCB0aGUgZW5kIG9mIGEgQnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCBhblxuLy8gaW5jb21wbGV0ZSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3Rlci4gVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyAoMiwgMywgb3IgNClcbi8vIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgVVRGLTggY2hhcmFjdGVyIChpZiBhcHBsaWNhYmxlKSBhcmUgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tJbmNvbXBsZXRlKHNlbGYsIGJ1ZiwgaSkge1xuICB2YXIgaiA9IGJ1Zi5sZW5ndGggLSAxO1xuICBpZiAoaiA8IGkpIHJldHVybiAwO1xuICB2YXIgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMTtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkgc2VsZi5sYXN0TmVlZCA9IG5iIC0gMjtcbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgaWYgKC0taiA8IGkgfHwgbmIgPT09IC0yKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gYSBzaW5nbGUgVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVyICgnXFx1ZmZmZCcpLCB0byBtYXRjaCB2OCdzIFVURi04IGRlY29kaW5nXG4vLyBiZWhhdmlvci4gVGhlIGNvbnRpbnVhdGlvbiBieXRlIGNoZWNrIGlzIGluY2x1ZGVkIHRocmVlIHRpbWVzIGluIHRoZSBjYXNlXG4vLyB3aGVyZSBhbGwgb2YgdGhlIGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBjaGFyYWN0ZXIgZXhpc3QgaW4gdGhlIHNhbWUgYnVmZmVyLlxuLy8gSXQgaXMgYWxzbyBkb25lIHRoaXMgd2F5IGFzIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGluY3JlYXNlIGluc3RlYWQgb2YgdXNpbmcgYVxuLy8gbG9vcC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0V4dHJhQnl0ZXMoc2VsZiwgYnVmLCBwKSB7XG4gIGlmICgoYnVmWzBdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICBzZWxmLmxhc3ROZWVkID0gMDtcbiAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICB9XG4gIGlmIChzZWxmLmxhc3ROZWVkID4gMSAmJiBidWYubGVuZ3RoID4gMSkge1xuICAgIGlmICgoYnVmWzFdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgIHNlbGYubGFzdE5lZWQgPSAxO1xuICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICB9XG4gICAgaWYgKHNlbGYubGFzdE5lZWQgPiAyICYmIGJ1Zi5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAoKGJ1ZlsyXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgIHNlbGYubGFzdE5lZWQgPSAyO1xuICAgICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGlzIGFkZGVkIHdoZW4gZW5kaW5nIG9uIGEgcGFydGlhbFxuLy8gY2hhcmFjdGVyLlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCc7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSIsIi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSlcblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBpc1JlZ2V4cCA9IHJlcXVpcmUoJ2lzLXJlZ2V4cCcpO1xuY29uc3QgaXNPYmogPSByZXF1aXJlKCdpcy1vYmonKTtcbmNvbnN0IGdldE93bkVudW1Qcm9wU3ltYm9scyA9IHJlcXVpcmUoJ2dldC1vd24tZW51bWVyYWJsZS1wcm9wZXJ0eS1zeW1ib2xzJykuZGVmYXVsdDtcblxubW9kdWxlLmV4cG9ydHMgPSAodmFsLCBvcHRzLCBwYWQpID0+IHtcblx0Y29uc3Qgc2VlbiA9IFtdO1xuXG5cdHJldHVybiAoZnVuY3Rpb24gc3RyaW5naWZ5KHZhbCwgb3B0cywgcGFkKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cdFx0b3B0cy5pbmRlbnQgPSBvcHRzLmluZGVudCB8fCAnXFx0Jztcblx0XHRwYWQgPSBwYWQgfHwgJyc7XG5cblx0XHRsZXQgdG9rZW5zO1xuXG5cdFx0aWYgKG9wdHMuaW5saW5lQ2hhcmFjdGVyTGltaXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dG9rZW5zID0ge1xuXHRcdFx0XHRuZXdMaW5lOiAnXFxuJyxcblx0XHRcdFx0bmV3TGluZU9yU3BhY2U6ICdcXG4nLFxuXHRcdFx0XHRwYWQsXG5cdFx0XHRcdGluZGVudDogcGFkICsgb3B0cy5pbmRlbnRcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRva2VucyA9IHtcblx0XHRcdFx0bmV3TGluZTogJ0BAX19TVFJJTkdJRllfT0JKRUNUX05FV19MSU5FX19AQCcsXG5cdFx0XHRcdG5ld0xpbmVPclNwYWNlOiAnQEBfX1NUUklOR0lGWV9PQkpFQ1RfTkVXX0xJTkVfT1JfU1BBQ0VfX0BAJyxcblx0XHRcdFx0cGFkOiAnQEBfX1NUUklOR0lGWV9PQkpFQ1RfUEFEX19AQCcsXG5cdFx0XHRcdGluZGVudDogJ0BAX19TVFJJTkdJRllfT0JKRUNUX0lOREVOVF9fQEAnXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGV4cGFuZFdoaXRlU3BhY2UgPSBzdHJpbmcgPT4ge1xuXHRcdFx0aWYgKG9wdHMuaW5saW5lQ2hhcmFjdGVyTGltaXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gc3RyaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvbmVMaW5lZCA9IHN0cmluZ1xuXHRcdFx0XHQucmVwbGFjZShuZXcgUmVnRXhwKHRva2Vucy5uZXdMaW5lLCAnZycpLCAnJylcblx0XHRcdFx0LnJlcGxhY2UobmV3IFJlZ0V4cCh0b2tlbnMubmV3TGluZU9yU3BhY2UsICdnJyksICcgJylcblx0XHRcdFx0LnJlcGxhY2UobmV3IFJlZ0V4cCh0b2tlbnMucGFkICsgJ3wnICsgdG9rZW5zLmluZGVudCwgJ2cnKSwgJycpO1xuXG5cdFx0XHRpZiAob25lTGluZWQubGVuZ3RoIDw9IG9wdHMuaW5saW5lQ2hhcmFjdGVyTGltaXQpIHtcblx0XHRcdFx0cmV0dXJuIG9uZUxpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3RyaW5nXG5cdFx0XHRcdC5yZXBsYWNlKG5ldyBSZWdFeHAodG9rZW5zLm5ld0xpbmUgKyAnfCcgKyB0b2tlbnMubmV3TGluZU9yU3BhY2UsICdnJyksICdcXG4nKVxuXHRcdFx0XHQucmVwbGFjZShuZXcgUmVnRXhwKHRva2Vucy5wYWQsICdnJyksIHBhZClcblx0XHRcdFx0LnJlcGxhY2UobmV3IFJlZ0V4cCh0b2tlbnMuaW5kZW50LCAnZycpLCBwYWQgKyBvcHRzLmluZGVudCk7XG5cdFx0fTtcblxuXHRcdGlmIChzZWVuLmluZGV4T2YodmFsKSAhPT0gLTEpIHtcblx0XHRcdHJldHVybiAnXCJbQ2lyY3VsYXJdXCInO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgPT09IG51bGwgfHxcblx0XHRcdHZhbCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHR0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fFxuXHRcdFx0dHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nIHx8XG5cdFx0XHR0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nIHx8XG5cdFx0XHR0eXBlb2YgdmFsID09PSAnc3ltYm9sJyB8fFxuXHRcdFx0aXNSZWdleHAodmFsKSkge1xuXHRcdFx0cmV0dXJuIFN0cmluZyh2YWwpO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRyZXR1cm4gYG5ldyBEYXRlKCcke3ZhbC50b0lTT1N0cmluZygpfScpYDtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gJ1tdJztcblx0XHRcdH1cblxuXHRcdFx0c2Vlbi5wdXNoKHZhbCk7XG5cblx0XHRcdGNvbnN0IHJldCA9ICdbJyArIHRva2Vucy5uZXdMaW5lICsgdmFsLm1hcCgoZWwsIGkpID0+IHtcblx0XHRcdFx0Y29uc3QgZW9sID0gdmFsLmxlbmd0aCAtIDEgPT09IGkgPyB0b2tlbnMubmV3TGluZSA6ICcsJyArIHRva2Vucy5uZXdMaW5lT3JTcGFjZTtcblx0XHRcdFx0bGV0IHZhbHVlID0gc3RyaW5naWZ5KGVsLCBvcHRzLCBwYWQgKyBvcHRzLmluZGVudCk7XG5cdFx0XHRcdGlmIChvcHRzLnRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdHZhbHVlID0gb3B0cy50cmFuc2Zvcm0odmFsLCBpLCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRva2Vucy5pbmRlbnQgKyB2YWx1ZSArIGVvbDtcblx0XHRcdH0pLmpvaW4oJycpICsgdG9rZW5zLnBhZCArICddJztcblxuXHRcdFx0c2Vlbi5wb3AoKTtcblxuXHRcdFx0cmV0dXJuIGV4cGFuZFdoaXRlU3BhY2UocmV0KTtcblx0XHR9XG5cblx0XHRpZiAoaXNPYmoodmFsKSkge1xuXHRcdFx0bGV0IG9iaktleXMgPSBPYmplY3Qua2V5cyh2YWwpLmNvbmNhdChnZXRPd25FbnVtUHJvcFN5bWJvbHModmFsKSk7XG5cblx0XHRcdGlmIChvcHRzLmZpbHRlcikge1xuXHRcdFx0XHRvYmpLZXlzID0gb2JqS2V5cy5maWx0ZXIoZWwgPT4gb3B0cy5maWx0ZXIodmFsLCBlbCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob2JqS2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuICd7fSc7XG5cdFx0XHR9XG5cblx0XHRcdHNlZW4ucHVzaCh2YWwpO1xuXG5cdFx0XHRjb25zdCByZXQgPSAneycgKyB0b2tlbnMubmV3TGluZSArIG9iaktleXMubWFwKChlbCwgaSkgPT4ge1xuXHRcdFx0XHRjb25zdCBlb2wgPSBvYmpLZXlzLmxlbmd0aCAtIDEgPT09IGkgPyB0b2tlbnMubmV3TGluZSA6ICcsJyArIHRva2Vucy5uZXdMaW5lT3JTcGFjZTtcblx0XHRcdFx0Y29uc3QgaXNTeW1ib2wgPSB0eXBlb2YgZWwgPT09ICdzeW1ib2wnO1xuXHRcdFx0XHRjb25zdCBpc0NsYXNzaWMgPSAhaXNTeW1ib2wgJiYgL15bYS16JF9dW2EteiRfMC05XSokL2kudGVzdChlbCk7XG5cdFx0XHRcdGNvbnN0IGtleSA9IGlzU3ltYm9sIHx8IGlzQ2xhc3NpYyA/IGVsIDogc3RyaW5naWZ5KGVsLCBvcHRzKTtcblx0XHRcdFx0bGV0IHZhbHVlID0gc3RyaW5naWZ5KHZhbFtlbF0sIG9wdHMsIHBhZCArIG9wdHMuaW5kZW50KTtcblx0XHRcdFx0aWYgKG9wdHMudHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBvcHRzLnRyYW5zZm9ybSh2YWwsIGVsLCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRva2Vucy5pbmRlbnQgKyBTdHJpbmcoa2V5KSArICc6ICcgKyB2YWx1ZSArIGVvbDtcblx0XHRcdH0pLmpvaW4oJycpICsgdG9rZW5zLnBhZCArICd9JztcblxuXHRcdFx0c2Vlbi5wb3AoKTtcblxuXHRcdFx0cmV0dXJuIGV4cGFuZFdoaXRlU3BhY2UocmV0KTtcblx0XHR9XG5cblx0XHR2YWwgPSBTdHJpbmcodmFsKS5yZXBsYWNlKC9bXFxyXFxuXS9nLCB4ID0+IHggPT09ICdcXG4nID8gJ1xcXFxuJyA6ICdcXFxccicpO1xuXG5cdFx0aWYgKG9wdHMuc2luZ2xlUXVvdGVzID09PSBmYWxzZSkge1xuXHRcdFx0dmFsID0gdmFsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKTtcblx0XHRcdHJldHVybiBgXCIke3ZhbH1cImA7XG5cdFx0fVxuXG5cdFx0dmFsID0gdmFsLnJlcGxhY2UoL1xcXFw/Jy9nLCAnXFxcXFxcJycpO1xuXHRcdHJldHVybiBgJyR7dmFsfSdgO1xuXHR9KSh2YWwsIG9wdHMsIHBhZCk7XG59O1xuIiwidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbi8vIHRocm91Z2hcbi8vXG4vLyBhIHN0cmVhbSB0aGF0IGRvZXMgbm90aGluZyBidXQgcmUtZW1pdCB0aGUgaW5wdXQuXG4vLyB1c2VmdWwgZm9yIGFnZ3JlZ2F0aW5nIGEgc2VyaWVzIG9mIGNoYW5naW5nIGJ1dCBub3QgZW5kaW5nIHN0cmVhbXMgaW50byBvbmUgc3RyZWFtKVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0aHJvdWdoXG50aHJvdWdoLnRocm91Z2ggPSB0aHJvdWdoXG5cbi8vY3JlYXRlIGEgcmVhZGFibGUgd3JpdGFibGUgc3RyZWFtLlxuXG5mdW5jdGlvbiB0aHJvdWdoICh3cml0ZSwgZW5kLCBvcHRzKSB7XG4gIHdyaXRlID0gd3JpdGUgfHwgZnVuY3Rpb24gKGRhdGEpIHsgdGhpcy5xdWV1ZShkYXRhKSB9XG4gIGVuZCA9IGVuZCB8fCBmdW5jdGlvbiAoKSB7IHRoaXMucXVldWUobnVsbCkgfVxuXG4gIHZhciBlbmRlZCA9IGZhbHNlLCBkZXN0cm95ZWQgPSBmYWxzZSwgYnVmZmVyID0gW10sIF9lbmRlZCA9IGZhbHNlXG4gIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKClcbiAgc3RyZWFtLnJlYWRhYmxlID0gc3RyZWFtLndyaXRhYmxlID0gdHJ1ZVxuICBzdHJlYW0ucGF1c2VkID0gZmFsc2VcblxuLy8gIHN0cmVhbS5hdXRvUGF1c2UgICA9ICEob3B0cyAmJiBvcHRzLmF1dG9QYXVzZSAgID09PSBmYWxzZSlcbiAgc3RyZWFtLmF1dG9EZXN0cm95ID0gIShvcHRzICYmIG9wdHMuYXV0b0Rlc3Ryb3kgPT09IGZhbHNlKVxuXG4gIHN0cmVhbS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgd3JpdGUuY2FsbCh0aGlzLCBkYXRhKVxuICAgIHJldHVybiAhc3RyZWFtLnBhdXNlZFxuICB9XG5cbiAgZnVuY3Rpb24gZHJhaW4oKSB7XG4gICAgd2hpbGUoYnVmZmVyLmxlbmd0aCAmJiAhc3RyZWFtLnBhdXNlZCkge1xuICAgICAgdmFyIGRhdGEgPSBidWZmZXIuc2hpZnQoKVxuICAgICAgaWYobnVsbCA9PT0gZGF0YSlcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgZWxzZVxuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgc3RyZWFtLnF1ZXVlID0gc3RyZWFtLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSkge1xuLy8gICAgY29uc29sZS5lcnJvcihlbmRlZClcbiAgICBpZihfZW5kZWQpIHJldHVybiBzdHJlYW1cbiAgICBpZihkYXRhID09PSBudWxsKSBfZW5kZWQgPSB0cnVlXG4gICAgYnVmZmVyLnB1c2goZGF0YSlcbiAgICBkcmFpbigpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgLy90aGlzIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyB0aGUgZmlyc3QgJ2VuZCcgbGlzdGVuZXJcbiAgLy9tdXN0IGNhbGwgZGVzdHJveSBuZXh0IHRpY2ssIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhZnRlciBhbnlcbiAgLy9zdHJlYW0gcGlwZWQgZnJvbSBoZXJlLlxuICAvL3RoaXMgaXMgb25seSBhIHByb2JsZW0gaWYgZW5kIGlzIG5vdCBlbWl0dGVkIHN5bmNocm9ub3VzbHkuXG4gIC8vYSBuaWNlciB3YXkgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgdGhpcyBpcyB0aGUgbGFzdCBsaXN0ZW5lciBmb3IgJ2VuZCdcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZVxuICAgIGlmKCFzdHJlYW0ud3JpdGFibGUgJiYgc3RyZWFtLmF1dG9EZXN0cm95KVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICAgIH0pXG4gIH0pXG5cbiAgZnVuY3Rpb24gX2VuZCAoKSB7XG4gICAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcbiAgICBlbmQuY2FsbChzdHJlYW0pXG4gICAgaWYoIXN0cmVhbS5yZWFkYWJsZSAmJiBzdHJlYW0uYXV0b0Rlc3Ryb3kpXG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gIH1cblxuICBzdHJlYW0uZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuXG4gICAgZW5kZWQgPSB0cnVlXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkgc3RyZWFtLndyaXRlKGRhdGEpXG4gICAgX2VuZCgpIC8vIHdpbGwgZW1pdCBvciBxdWV1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuICAgIGVuZGVkID0gdHJ1ZVxuICAgIGJ1ZmZlci5sZW5ndGggPSAwXG4gICAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gZmFsc2VcbiAgICBzdHJlYW0uZW1pdCgnY2xvc2UnKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihzdHJlYW0ucGF1c2VkKSByZXR1cm5cbiAgICBzdHJlYW0ucGF1c2VkID0gdHJ1ZVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoc3RyZWFtLnBhdXNlZCkge1xuICAgICAgc3RyZWFtLnBhdXNlZCA9IGZhbHNlXG4gICAgICBzdHJlYW0uZW1pdCgncmVzdW1lJylcbiAgICB9XG4gICAgZHJhaW4oKVxuICAgIC8vbWF5IGhhdmUgYmVjb21lIHBhdXNlZCBhZ2FpbixcbiAgICAvL2FzIGRyYWluIGVtaXRzICdkYXRhJy5cbiAgICBpZighc3RyZWFtLnBhdXNlZClcbiAgICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG4gIHJldHVybiBzdHJlYW1cbn1cblxuIiwiLyoqIEBsaWNlbnNlIFVSSS5qcyB2NC40LjEgKGMpIDIwMTEgR2FyeSBDb3VydC4gTGljZW5zZTogaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L3VyaS1qcyAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuXHQoZmFjdG9yeSgoZ2xvYmFsLlVSSSA9IGdsb2JhbC5VUkkgfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIG1lcmdlKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzZXRzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIHNldHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKHNldHMubGVuZ3RoID4gMSkge1xuICAgICAgICBzZXRzWzBdID0gc2V0c1swXS5zbGljZSgwLCAtMSk7XG4gICAgICAgIHZhciB4bCA9IHNldHMubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yICh2YXIgeCA9IDE7IHggPCB4bDsgKyt4KSB7XG4gICAgICAgICAgICBzZXRzW3hdID0gc2V0c1t4XS5zbGljZSgxLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0c1t4bF0gPSBzZXRzW3hsXS5zbGljZSgxKTtcbiAgICAgICAgcmV0dXJuIHNldHMuam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNldHNbMF07XG4gICAgfVxufVxuZnVuY3Rpb24gc3ViZXhwKHN0cikge1xuICAgIHJldHVybiBcIig/OlwiICsgc3RyICsgXCIpXCI7XG59XG5mdW5jdGlvbiB0eXBlT2Yobykge1xuICAgIHJldHVybiBvID09PSB1bmRlZmluZWQgPyBcInVuZGVmaW5lZFwiIDogbyA9PT0gbnVsbCA/IFwibnVsbFwiIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNwbGl0KFwiIFwiKS5wb3AoKS5zcGxpdChcIl1cIikuc2hpZnQoKS50b0xvd2VyQ2FzZSgpO1xufVxuZnVuY3Rpb24gdG9VcHBlckNhc2Uoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50b1VwcGVyQ2FzZSgpO1xufVxuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gb2JqIGluc3RhbmNlb2YgQXJyYXkgPyBvYmogOiB0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gXCJudW1iZXJcIiB8fCBvYmouc3BsaXQgfHwgb2JqLnNldEludGVydmFsIHx8IG9iai5jYWxsID8gW29ial0gOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopIDogW107XG59XG5mdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHtcbiAgICB2YXIgb2JqID0gdGFyZ2V0O1xuICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBidWlsZEV4cHMoaXNJUkkpIHtcbiAgICB2YXIgQUxQSEEkJCA9IFwiW0EtWmEtel1cIixcbiAgICAgICAgQ1IkID0gXCJbXFxcXHgwRF1cIixcbiAgICAgICAgRElHSVQkJCA9IFwiWzAtOV1cIixcbiAgICAgICAgRFFVT1RFJCQgPSBcIltcXFxceDIyXVwiLFxuICAgICAgICBIRVhESUckJCA9IG1lcmdlKERJR0lUJCQsIFwiW0EtRmEtZl1cIiksXG4gICAgICAgIC8vY2FzZS1pbnNlbnNpdGl2ZVxuICAgIExGJCQgPSBcIltcXFxceDBBXVwiLFxuICAgICAgICBTUCQkID0gXCJbXFxcXHgyMF1cIixcbiAgICAgICAgUENUX0VOQ09ERUQkID0gc3ViZXhwKHN1YmV4cChcIiVbRUZlZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVs4OUEtRmEtZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVwiICsgSEVYRElHJCQgKyBIRVhESUckJCkpLFxuICAgICAgICAvL2V4cGFuZGVkXG4gICAgR0VOX0RFTElNUyQkID0gXCJbXFxcXDpcXFxcL1xcXFw/XFxcXCNcXFxcW1xcXFxdXFxcXEBdXCIsXG4gICAgICAgIFNVQl9ERUxJTVMkJCA9IFwiW1xcXFwhXFxcXCRcXFxcJlxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFw7XFxcXD1dXCIsXG4gICAgICAgIFJFU0VSVkVEJCQgPSBtZXJnZShHRU5fREVMSU1TJCQsIFNVQl9ERUxJTVMkJCksXG4gICAgICAgIFVDU0NIQVIkJCA9IGlzSVJJID8gXCJbXFxcXHhBMC1cXFxcdTIwMERcXFxcdTIwMTAtXFxcXHUyMDI5XFxcXHUyMDJGLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkVGXVwiIDogXCJbXVwiLFxuICAgICAgICAvL3N1YnNldCwgZXhjbHVkZXMgYmlkaSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICBJUFJJVkFURSQkID0gaXNJUkkgPyBcIltcXFxcdUUwMDAtXFxcXHVGOEZGXVwiIDogXCJbXVwiLFxuICAgICAgICAvL3N1YnNldFxuICAgIFVOUkVTRVJWRUQkJCA9IG1lcmdlKEFMUEhBJCQsIERJR0lUJCQsIFwiW1xcXFwtXFxcXC5cXFxcX1xcXFx+XVwiLCBVQ1NDSEFSJCQpLFxuICAgICAgICBTQ0hFTUUkID0gc3ViZXhwKEFMUEhBJCQgKyBtZXJnZShBTFBIQSQkLCBESUdJVCQkLCBcIltcXFxcK1xcXFwtXFxcXC5dXCIpICsgXCIqXCIpLFxuICAgICAgICBVU0VSSU5GTyQgPSBzdWJleHAoc3ViZXhwKFBDVF9FTkNPREVEJCArIFwifFwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XVwiKSkgKyBcIipcIiksXG4gICAgICAgIERFQ19PQ1RFVCQgPSBzdWJleHAoc3ViZXhwKFwiMjVbMC01XVwiKSArIFwifFwiICsgc3ViZXhwKFwiMlswLTRdXCIgKyBESUdJVCQkKSArIFwifFwiICsgc3ViZXhwKFwiMVwiICsgRElHSVQkJCArIERJR0lUJCQpICsgXCJ8XCIgKyBzdWJleHAoXCJbMS05XVwiICsgRElHSVQkJCkgKyBcInxcIiArIERJR0lUJCQpLFxuICAgICAgICBERUNfT0NURVRfUkVMQVhFRCQgPSBzdWJleHAoc3ViZXhwKFwiMjVbMC01XVwiKSArIFwifFwiICsgc3ViZXhwKFwiMlswLTRdXCIgKyBESUdJVCQkKSArIFwifFwiICsgc3ViZXhwKFwiMVwiICsgRElHSVQkJCArIERJR0lUJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIwP1sxLTldXCIgKyBESUdJVCQkKSArIFwifDA/MD9cIiArIERJR0lUJCQpLFxuICAgICAgICAvL3JlbGF4ZWQgcGFyc2luZyBydWxlc1xuICAgIElQVjRBRERSRVNTJCA9IHN1YmV4cChERUNfT0NURVRfUkVMQVhFRCQgKyBcIlxcXFwuXCIgKyBERUNfT0NURVRfUkVMQVhFRCQgKyBcIlxcXFwuXCIgKyBERUNfT0NURVRfUkVMQVhFRCQgKyBcIlxcXFwuXCIgKyBERUNfT0NURVRfUkVMQVhFRCQpLFxuICAgICAgICBIMTYkID0gc3ViZXhwKEhFWERJRyQkICsgXCJ7MSw0fVwiKSxcbiAgICAgICAgTFMzMiQgPSBzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIgKyBIMTYkKSArIFwifFwiICsgSVBWNEFERFJFU1MkKSxcbiAgICAgICAgSVBWNkFERFJFU1MxJCA9IHN1YmV4cChzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcIns2fVwiICsgTFMzMiQpLFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDYoIGgxNiBcIjpcIiApIGxzMzJcbiAgICBJUFY2QUREUkVTUzIkID0gc3ViZXhwKFwiXFxcXDpcXFxcOlwiICsgc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7NX1cIiArIExTMzIkKSxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgXCI6OlwiIDUoIGgxNiBcIjpcIiApIGxzMzJcbiAgICBJUFY2QUREUkVTUzMkID0gc3ViZXhwKHN1YmV4cChIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiArIHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezR9XCIgKyBMUzMyJCksXG4gICAgICAgIC8vWyAgICAgICAgICAgICAgIGgxNiBdIFwiOjpcIiA0KCBoMTYgXCI6XCIgKSBsczMyXG4gICAgSVBWNkFERFJFU1M0JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwxfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInszfVwiICsgTFMzMiQpLFxuICAgICAgICAvL1sgKjEoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAzKCBoMTYgXCI6XCIgKSBsczMyXG4gICAgSVBWNkFERFJFU1M1JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwyfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInsyfVwiICsgTFMzMiQpLFxuICAgICAgICAvL1sgKjIoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAyKCBoMTYgXCI6XCIgKSBsczMyXG4gICAgSVBWNkFERFJFU1M2JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwzfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBIMTYkICsgXCJcXFxcOlwiICsgTFMzMiQpLFxuICAgICAgICAvL1sgKjMoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAgICBoMTYgXCI6XCIgICBsczMyXG4gICAgSVBWNkFERFJFU1M3JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCw0fVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBMUzMyJCksXG4gICAgICAgIC8vWyAqNCggaDE2IFwiOlwiICkgaDE2IF0gXCI6OlwiICAgICAgICAgICAgICBsczMyXG4gICAgSVBWNkFERFJFU1M4JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCw1fVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBIMTYkKSxcbiAgICAgICAgLy9bICo1KCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCIgICAgICAgICAgICAgIGgxNlxuICAgIElQVjZBRERSRVNTOSQgPSBzdWJleHAoc3ViZXhwKHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezAsNn1cIiArIEgxNiQpICsgXCI/XFxcXDpcXFxcOlwiKSxcbiAgICAgICAgLy9bICo2KCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCJcbiAgICBJUFY2QUREUkVTUyQgPSBzdWJleHAoW0lQVjZBRERSRVNTMSQsIElQVjZBRERSRVNTMiQsIElQVjZBRERSRVNTMyQsIElQVjZBRERSRVNTNCQsIElQVjZBRERSRVNTNSQsIElQVjZBRERSRVNTNiQsIElQVjZBRERSRVNTNyQsIElQVjZBRERSRVNTOCQsIElQVjZBRERSRVNTOSRdLmpvaW4oXCJ8XCIpKSxcbiAgICAgICAgWk9ORUlEJCA9IHN1YmV4cChzdWJleHAoVU5SRVNFUlZFRCQkICsgXCJ8XCIgKyBQQ1RfRU5DT0RFRCQpICsgXCIrXCIpLFxuICAgICAgICAvL1JGQyA2ODc0XG4gICAgSVBWNkFERFJaJCA9IHN1YmV4cChJUFY2QUREUkVTUyQgKyBcIlxcXFwlMjVcIiArIFpPTkVJRCQpLFxuICAgICAgICAvL1JGQyA2ODc0XG4gICAgSVBWNkFERFJaX1JFTEFYRUQkID0gc3ViZXhwKElQVjZBRERSRVNTJCArIHN1YmV4cChcIlxcXFwlMjV8XFxcXCUoPyFcIiArIEhFWERJRyQkICsgXCJ7Mn0pXCIpICsgWk9ORUlEJCksXG4gICAgICAgIC8vUkZDIDY4NzQsIHdpdGggcmVsYXhlZCBwYXJzaW5nIHJ1bGVzXG4gICAgSVBWRlVUVVJFJCA9IHN1YmV4cChcIlt2Vl1cIiArIEhFWERJRyQkICsgXCIrXFxcXC5cIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOl1cIikgKyBcIitcIiksXG4gICAgICAgIElQX0xJVEVSQUwkID0gc3ViZXhwKFwiXFxcXFtcIiArIHN1YmV4cChJUFY2QUREUlpfUkVMQVhFRCQgKyBcInxcIiArIElQVjZBRERSRVNTJCArIFwifFwiICsgSVBWRlVUVVJFJCkgKyBcIlxcXFxdXCIpLFxuICAgICAgICAvL1JGQyA2ODc0XG4gICAgUkVHX05BTUUkID0gc3ViZXhwKHN1YmV4cChQQ1RfRU5DT0RFRCQgKyBcInxcIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSkgKyBcIipcIiksXG4gICAgICAgIEhPU1QkID0gc3ViZXhwKElQX0xJVEVSQUwkICsgXCJ8XCIgKyBJUFY0QUREUkVTUyQgKyBcIig/IVwiICsgUkVHX05BTUUkICsgXCIpXCIgKyBcInxcIiArIFJFR19OQU1FJCksXG4gICAgICAgIFBPUlQkID0gc3ViZXhwKERJR0lUJCQgKyBcIipcIiksXG4gICAgICAgIEFVVEhPUklUWSQgPSBzdWJleHAoc3ViZXhwKFVTRVJJTkZPJCArIFwiQFwiKSArIFwiP1wiICsgSE9TVCQgKyBzdWJleHAoXCJcXFxcOlwiICsgUE9SVCQpICsgXCI/XCIpLFxuICAgICAgICBQQ0hBUiQgPSBzdWJleHAoUENUX0VOQ09ERUQkICsgXCJ8XCIgKyBtZXJnZShVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXDpcXFxcQF1cIikpLFxuICAgICAgICBTRUdNRU5UJCA9IHN1YmV4cChQQ0hBUiQgKyBcIipcIiksXG4gICAgICAgIFNFR01FTlRfTlokID0gc3ViZXhwKFBDSEFSJCArIFwiK1wiKSxcbiAgICAgICAgU0VHTUVOVF9OWl9OQyQgPSBzdWJleHAoc3ViZXhwKFBDVF9FTkNPREVEJCArIFwifFwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFxAXVwiKSkgKyBcIitcIiksXG4gICAgICAgIFBBVEhfQUJFTVBUWSQgPSBzdWJleHAoc3ViZXhwKFwiXFxcXC9cIiArIFNFR01FTlQkKSArIFwiKlwiKSxcbiAgICAgICAgUEFUSF9BQlNPTFVURSQgPSBzdWJleHAoXCJcXFxcL1wiICsgc3ViZXhwKFNFR01FTlRfTlokICsgUEFUSF9BQkVNUFRZJCkgKyBcIj9cIiksXG4gICAgICAgIC8vc2ltcGxpZmllZFxuICAgIFBBVEhfTk9TQ0hFTUUkID0gc3ViZXhwKFNFR01FTlRfTlpfTkMkICsgUEFUSF9BQkVNUFRZJCksXG4gICAgICAgIC8vc2ltcGxpZmllZFxuICAgIFBBVEhfUk9PVExFU1MkID0gc3ViZXhwKFNFR01FTlRfTlokICsgUEFUSF9BQkVNUFRZJCksXG4gICAgICAgIC8vc2ltcGxpZmllZFxuICAgIFBBVEhfRU1QVFkkID0gXCIoPyFcIiArIFBDSEFSJCArIFwiKVwiLFxuICAgICAgICBQQVRIJCA9IHN1YmV4cChQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9OT1NDSEVNRSQgKyBcInxcIiArIFBBVEhfUk9PVExFU1MkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG4gICAgICAgIFFVRVJZJCA9IHN1YmV4cChzdWJleHAoUENIQVIkICsgXCJ8XCIgKyBtZXJnZShcIltcXFxcL1xcXFw/XVwiLCBJUFJJVkFURSQkKSkgKyBcIipcIiksXG4gICAgICAgIEZSQUdNRU5UJCA9IHN1YmV4cChzdWJleHAoUENIQVIkICsgXCJ8W1xcXFwvXFxcXD9dXCIpICsgXCIqXCIpLFxuICAgICAgICBISUVSX1BBUlQkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC9cIiArIEFVVEhPUklUWSQgKyBQQVRIX0FCRU1QVFkkKSArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfUk9PVExFU1MkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG4gICAgICAgIFVSSSQgPSBzdWJleHAoU0NIRU1FJCArIFwiXFxcXDpcIiArIEhJRVJfUEFSVCQgKyBzdWJleHAoXCJcXFxcP1wiICsgUVVFUlkkKSArIFwiP1wiICsgc3ViZXhwKFwiXFxcXCNcIiArIEZSQUdNRU5UJCkgKyBcIj9cIiksXG4gICAgICAgIFJFTEFUSVZFX1BBUlQkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC9cIiArIEFVVEhPUklUWSQgKyBQQVRIX0FCRU1QVFkkKSArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG4gICAgICAgIFJFTEFUSVZFJCA9IHN1YmV4cChSRUxBVElWRV9QQVJUJCArIHN1YmV4cChcIlxcXFw/XCIgKyBRVUVSWSQpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcI1wiICsgRlJBR01FTlQkKSArIFwiP1wiKSxcbiAgICAgICAgVVJJX1JFRkVSRU5DRSQgPSBzdWJleHAoVVJJJCArIFwifFwiICsgUkVMQVRJVkUkKSxcbiAgICAgICAgQUJTT0xVVEVfVVJJJCA9IHN1YmV4cChTQ0hFTUUkICsgXCJcXFxcOlwiICsgSElFUl9QQVJUJCArIHN1YmV4cChcIlxcXFw/XCIgKyBRVUVSWSQpICsgXCI/XCIpLFxuICAgICAgICBHRU5FUklDX1JFRiQgPSBcIl4oXCIgKyBTQ0hFTUUkICsgXCIpXFxcXDpcIiArIHN1YmV4cChzdWJleHAoXCJcXFxcL1xcXFwvKFwiICsgc3ViZXhwKFwiKFwiICsgVVNFUklORk8kICsgXCIpQFwiKSArIFwiPyhcIiArIEhPU1QkICsgXCIpXCIgKyBzdWJleHAoXCJcXFxcOihcIiArIFBPUlQkICsgXCIpXCIpICsgXCI/KVwiKSArIFwiPyhcIiArIFBBVEhfQUJFTVBUWSQgKyBcInxcIiArIFBBVEhfQUJTT0xVVEUkICsgXCJ8XCIgKyBQQVRIX1JPT1RMRVNTJCArIFwifFwiICsgUEFUSF9FTVBUWSQgKyBcIilcIikgKyBzdWJleHAoXCJcXFxcPyhcIiArIFFVRVJZJCArIFwiKVwiKSArIFwiP1wiICsgc3ViZXhwKFwiXFxcXCMoXCIgKyBGUkFHTUVOVCQgKyBcIilcIikgKyBcIj8kXCIsXG4gICAgICAgIFJFTEFUSVZFX1JFRiQgPSBcIl4oKXswfVwiICsgc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC8oXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8pXCIpICsgXCI/KFwiICsgUEFUSF9BQkVNUFRZJCArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCArIFwiKVwiKSArIHN1YmV4cChcIlxcXFw/KFwiICsgUVVFUlkkICsgXCIpXCIpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcIyhcIiArIEZSQUdNRU5UJCArIFwiKVwiKSArIFwiPyRcIixcbiAgICAgICAgQUJTT0xVVEVfUkVGJCA9IFwiXihcIiArIFNDSEVNRSQgKyBcIilcXFxcOlwiICsgc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC8oXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8pXCIpICsgXCI/KFwiICsgUEFUSF9BQkVNUFRZJCArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfUk9PVExFU1MkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCArIFwiKVwiKSArIHN1YmV4cChcIlxcXFw/KFwiICsgUVVFUlkkICsgXCIpXCIpICsgXCI/JFwiLFxuICAgICAgICBTQU1FRE9DX1JFRiQgPSBcIl5cIiArIHN1YmV4cChcIlxcXFwjKFwiICsgRlJBR01FTlQkICsgXCIpXCIpICsgXCI/JFwiLFxuICAgICAgICBBVVRIT1JJVFlfUkVGJCA9IFwiXlwiICsgc3ViZXhwKFwiKFwiICsgVVNFUklORk8kICsgXCIpQFwiKSArIFwiPyhcIiArIEhPU1QkICsgXCIpXCIgKyBzdWJleHAoXCJcXFxcOihcIiArIFBPUlQkICsgXCIpXCIpICsgXCI/JFwiO1xuICAgIHJldHVybiB7XG4gICAgICAgIE5PVF9TQ0hFTUU6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXl1cIiwgQUxQSEEkJCwgRElHSVQkJCwgXCJbXFxcXCtcXFxcLVxcXFwuXVwiKSwgXCJnXCIpLFxuICAgICAgICBOT1RfVVNFUklORk86IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXDpdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfSE9TVDogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVcXFxcW1xcXFxdXFxcXDpdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfUEFUSDogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVcXFxcL1xcXFw6XFxcXEBdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfUEFUSF9OT1NDSEVNRTogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVcXFxcL1xcXFxAXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcbiAgICAgICAgTk9UX1FVRVJZOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJV1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XFxcXEBcXFxcL1xcXFw/XVwiLCBJUFJJVkFURSQkKSwgXCJnXCIpLFxuICAgICAgICBOT1RfRlJBR01FTlQ6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXDpcXFxcQFxcXFwvXFxcXD9dXCIpLCBcImdcIiksXG4gICAgICAgIEVTQ0FQRTogbmV3IFJlZ0V4cChtZXJnZShcIlteXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcbiAgICAgICAgVU5SRVNFUlZFRDogbmV3IFJlZ0V4cChVTlJFU0VSVkVEJCQsIFwiZ1wiKSxcbiAgICAgICAgT1RIRVJfQ0hBUlM6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXVwiLCBVTlJFU0VSVkVEJCQsIFJFU0VSVkVEJCQpLCBcImdcIiksXG4gICAgICAgIFBDVF9FTkNPREVEOiBuZXcgUmVnRXhwKFBDVF9FTkNPREVEJCwgXCJnXCIpLFxuICAgICAgICBJUFY0QUREUkVTUzogbmV3IFJlZ0V4cChcIl4oXCIgKyBJUFY0QUREUkVTUyQgKyBcIikkXCIpLFxuICAgICAgICBJUFY2QUREUkVTUzogbmV3IFJlZ0V4cChcIl5cXFxcWz8oXCIgKyBJUFY2QUREUkVTUyQgKyBcIilcIiArIHN1YmV4cChzdWJleHAoXCJcXFxcJTI1fFxcXFwlKD8hXCIgKyBIRVhESUckJCArIFwiezJ9KVwiKSArIFwiKFwiICsgWk9ORUlEJCArIFwiKVwiKSArIFwiP1xcXFxdPyRcIikgLy9SRkMgNjg3NCwgd2l0aCByZWxheGVkIHBhcnNpbmcgcnVsZXNcbiAgICB9O1xufVxudmFyIFVSSV9QUk9UT0NPTCA9IGJ1aWxkRXhwcyhmYWxzZSk7XG5cbnZhciBJUklfUFJPVE9DT0wgPSBidWlsZEV4cHModHJ1ZSk7XG5cbnZhciBzbGljZWRUb0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkge1xuICAgIHZhciBfYXJyID0gW107XG4gICAgdmFyIF9uID0gdHJ1ZTtcbiAgICB2YXIgX2QgPSBmYWxzZTtcbiAgICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9kID0gdHJ1ZTtcbiAgICAgIF9lID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2FycjtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkge1xuICAgICAgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG4gICAgfVxuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgdG9Db25zdW1hYmxlQXJyYXkgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gICAgcmV0dXJuIGFycjI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYXJyKTtcbiAgfVxufTtcblxuLyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXG52YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG4vKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG52YXIgYmFzZSA9IDM2O1xudmFyIHRNaW4gPSAxO1xudmFyIHRNYXggPSAyNjtcbnZhciBza2V3ID0gMzg7XG52YXIgZGFtcCA9IDcwMDtcbnZhciBpbml0aWFsQmlhcyA9IDcyO1xudmFyIGluaXRpYWxOID0gMTI4OyAvLyAweDgwXG52YXIgZGVsaW1pdGVyID0gJy0nOyAvLyAnXFx4MkQnXG5cbi8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG52YXIgcmVnZXhQdW55Y29kZSA9IC9eeG4tLS87XG52YXIgcmVnZXhOb25BU0NJSSA9IC9bXlxcMC1cXHg3RV0vOyAvLyBub24tQVNDSUkgY2hhcnNcbnZhciByZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cbi8qKiBFcnJvciBtZXNzYWdlcyAqL1xudmFyIGVycm9ycyA9IHtcblx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcbn07XG5cbi8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cbnZhciBiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW47XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBlcnJvciQxKHR5cGUpIHtcblx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcbn1cblxuLyoqXG4gKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG4gKiBpdGVtLlxuICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXAoYXJyYXksIGZuKSB7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuICogYWRkcmVzc2VzLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcbiAqIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0dmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XG5cdHZhciByZXN1bHQgPSAnJztcblx0aWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHQvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG5cdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRyZXN1bHQgPSBwYXJ0c1swXSArICdAJztcblx0XHRzdHJpbmcgPSBwYXJ0c1sxXTtcblx0fVxuXHQvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG5cdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG5cdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0dmFyIGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcbiAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGRlY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0dmFyIG91dHB1dCA9IFtdO1xuXHR2YXIgY291bnRlciA9IDA7XG5cdHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdHZhciB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gSXQncyBhIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3Rlci5cblx0XHRcdHZhciBleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHtcblx0XHRcdFx0Ly8gTG93IHN1cnJvZ2F0ZS5cblx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEl0J3MgYW4gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlXG5cdFx0XHRcdC8vIG5leHQgY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLlxuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdHJpbmcgYmFzZWQgb24gYW4gYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cbiAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGVuY29kZVxuICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBuZXcgVW5pY29kZSBzdHJpbmcgKFVDUy0yKS5cbiAqL1xudmFyIHVjczJlbmNvZGUgPSBmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIHRvQ29uc3VtYWJsZUFycmF5KGFycmF5KSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cbiAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG4gKi9cbnZhciBiYXNpY1RvRGlnaXQgPSBmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XG5cdGlmIChjb2RlUG9pbnQgLSAweDMwIDwgMHgwQSkge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDE2O1xuXHR9XG5cdGlmIChjb2RlUG9pbnQgLSAweDQxIDwgMHgxQSkge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDQxO1xuXHR9XG5cdGlmIChjb2RlUG9pbnQgLSAweDYxIDwgMHgxQSkge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDYxO1xuXHR9XG5cdHJldHVybiBiYXNlO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3JcbiAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG4gKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcbiAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG4gKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuICovXG52YXIgZGlnaXRUb0Jhc2ljID0gZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xufTtcblxuLyoqXG4gKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBhZGFwdCA9IGZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHR2YXIgayA9IDA7XG5cdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG5cdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0Zm9yICg7IC8qIG5vIGluaXRpYWxpemF0aW9uICovZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XG5cdH1cblx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXG4gKiBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKi9cbnZhciBkZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcblx0Ly8gRG9uJ3QgdXNlIFVDUy0yLlxuXHR2YXIgb3V0cHV0ID0gW107XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGkgPSAwO1xuXHR2YXIgbiA9IGluaXRpYWxOO1xuXHR2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuXHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHR2YXIgYmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0YmFzaWMgPSAwO1xuXHR9XG5cblx0Zm9yICh2YXIgaiA9IDA7IGogPCBiYXNpYzsgKytqKSB7XG5cdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0ZXJyb3IkMSgnbm90LWJhc2ljJyk7XG5cdFx0fVxuXHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHR9XG5cblx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxuXHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdGZvciAodmFyIGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDspIC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi97XG5cblx0XHQvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG5cdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0Ly8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcblx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdHZhciBvbGRpID0gaTtcblx0XHRmb3IgKHZhciB3ID0gMSwgayA9IGJhc2U7OyAvKiBubyBjb25kaXRpb24gKi9rICs9IGJhc2UpIHtcblxuXHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdGVycm9yJDEoJ2ludmFsaWQtaW5wdXQnKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdGVycm9yJDEoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGkgKz0gZGlnaXQgKiB3O1xuXHRcdFx0dmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcztcblxuXHRcdFx0aWYgKGRpZ2l0IDwgdCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dmFyIGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcblx0XHRcdFx0ZXJyb3IkMSgnb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXHRcdH1cblxuXHRcdHZhciBvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRlcnJvciQxKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdG4gKz0gZmxvb3IoaSAvIG91dCk7XG5cdFx0aSAlPSBvdXQ7XG5cblx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0LlxuXHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblx0fVxuXG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIG91dHB1dCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG4gKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcblx0dmFyIG91dHB1dCA9IFtdO1xuXG5cdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG5cdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0Ly8gQ2FjaGUgdGhlIGxlbmd0aC5cblx0dmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuXHR2YXIgbiA9IGluaXRpYWxOO1xuXHR2YXIgZGVsdGEgPSAwO1xuXHR2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG5cdHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcblx0dmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG5cdHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuXHR0cnkge1xuXHRcdGZvciAodmFyIF9pdGVyYXRvciA9IGlucHV0W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuXHRcdFx0dmFyIF9jdXJyZW50VmFsdWUyID0gX3N0ZXAudmFsdWU7XG5cblx0XHRcdGlmIChfY3VycmVudFZhbHVlMiA8IDB4ODApIHtcblx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKF9jdXJyZW50VmFsdWUyKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG5cdFx0X2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG5cdH0gZmluYWxseSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG5cdFx0XHRcdF9pdGVyYXRvci5yZXR1cm4oKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG5cdFx0XHRcdHRocm93IF9pdGVyYXRvckVycm9yO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHZhciBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cdHZhciBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoO1xuXG5cdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0Ly8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS5cblx0aWYgKGJhc2ljTGVuZ3RoKSB7XG5cdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0fVxuXG5cdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcblx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHQvLyBsYXJnZXIgb25lOlxuXHRcdHZhciBtID0gbWF4SW50O1xuXHRcdHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG5cdFx0dmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuXHRcdHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cblx0XHR0cnkge1xuXHRcdFx0Zm9yICh2YXIgX2l0ZXJhdG9yMiA9IGlucHV0W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG5cdFx0XHRcdHZhciBjdXJyZW50VmFsdWUgPSBfc3RlcDIudmFsdWU7XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0X2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcblx0XHRcdF9pdGVyYXRvckVycm9yMiA9IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiAmJiBfaXRlcmF0b3IyLnJldHVybikge1xuXHRcdFx0XHRcdF9pdGVyYXRvcjIucmV0dXJuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcblx0XHRcdFx0XHR0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgaGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuXHRcdGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG5cdFx0XHRlcnJvciQxKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG5cdFx0biA9IG07XG5cblx0XHR2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlO1xuXHRcdHZhciBfZGlkSXRlcmF0b3JFcnJvcjMgPSBmYWxzZTtcblx0XHR2YXIgX2l0ZXJhdG9yRXJyb3IzID0gdW5kZWZpbmVkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGZvciAodmFyIF9pdGVyYXRvcjMgPSBpbnB1dFtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IChfc3RlcDMgPSBfaXRlcmF0b3IzLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gdHJ1ZSkge1xuXHRcdFx0XHR2YXIgX2N1cnJlbnRWYWx1ZSA9IF9zdGVwMy52YWx1ZTtcblxuXHRcdFx0XHRpZiAoX2N1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuXHRcdFx0XHRcdGVycm9yJDEoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKF9jdXJyZW50VmFsdWUgPT0gbikge1xuXHRcdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuXHRcdFx0XHRcdHZhciBxID0gZGVsdGE7XG5cdFx0XHRcdFx0Zm9yICh2YXIgayA9IGJhc2U7OyAvKiBubyBjb25kaXRpb24gKi9rICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHZhciB0ID0gayA8PSBiaWFzID8gdE1pbiA6IGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXM7XG5cdFx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR2YXIgcU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0dmFyIGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSkpO1xuXHRcdFx0XHRcdFx0cSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG5cdFx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0XHRkZWx0YSA9IDA7XG5cdFx0XHRcdFx0KytoYW5kbGVkQ1BDb3VudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0X2RpZEl0ZXJhdG9yRXJyb3IzID0gdHJ1ZTtcblx0XHRcdF9pdGVyYXRvckVycm9yMyA9IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyAmJiBfaXRlcmF0b3IzLnJldHVybikge1xuXHRcdFx0XHRcdF9pdGVyYXRvcjMucmV0dXJuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChfZGlkSXRlcmF0b3JFcnJvcjMpIHtcblx0XHRcdFx0XHR0aHJvdyBfaXRlcmF0b3JFcnJvcjM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQrK2RlbHRhO1xuXHRcdCsrbjtcblx0fVxuXHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG4gKiB0byBVbmljb2RlLiBPbmx5IHRoZSBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkLCBpLmUuXG4gKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cbiAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG4gKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gUHVueWNvZGVcbiAqIHN0cmluZy5cbiAqL1xudmFyIHRvVW5pY29kZSA9IGZ1bmN0aW9uIHRvVW5pY29kZShpbnB1dCkge1xuXHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpID8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKSA6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG4gKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cbiAqIEFTQ0lJLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuICogVW5pY29kZSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG4gKiBlbWFpbCBhZGRyZXNzLlxuICovXG52YXIgdG9BU0NJSSA9IGZ1bmN0aW9uIHRvQVNDSUkoaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24gKHN0cmluZykge1xuXHRcdHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKSA/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpIDogc3RyaW5nO1xuXHR9KTtcbn07XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG52YXIgcHVueWNvZGUgPSB7XG5cdC8qKlxuICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cbiAgKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAgKiBAdHlwZSBTdHJpbmdcbiAgKi9cblx0J3ZlcnNpb24nOiAnMi4xLjAnLFxuXHQvKipcbiAgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuICAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG4gICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG4gICogQG1lbWJlck9mIHB1bnljb2RlXG4gICogQHR5cGUgT2JqZWN0XG4gICovXG5cdCd1Y3MyJzoge1xuXHRcdCdkZWNvZGUnOiB1Y3MyZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdH0sXG5cdCdkZWNvZGUnOiBkZWNvZGUsXG5cdCdlbmNvZGUnOiBlbmNvZGUsXG5cdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0J3RvVW5pY29kZSc6IHRvVW5pY29kZVxufTtcblxuLyoqXG4gKiBVUkkuanNcbiAqXG4gKiBAZmlsZW92ZXJ2aWV3IEFuIFJGQyAzOTg2IGNvbXBsaWFudCwgc2NoZW1lIGV4dGVuZGFibGUgVVJJIHBhcnNpbmcvdmFsaWRhdGluZy9yZXNvbHZpbmcgbGlicmFyeSBmb3IgSmF2YVNjcmlwdC5cbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzpnYXJ5LmNvdXJ0QGdtYWlsLmNvbVwiPkdhcnkgQ291cnQ8L2E+XG4gKiBAc2VlIGh0dHA6Ly9naXRodWIuY29tL2dhcnljb3VydC91cmktanNcbiAqL1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMSBHYXJ5IENvdXJ0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZVxuICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2ZcbiAqICAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdFxuICogICAgICAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHNcbiAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEdBUlkgQ09VUlQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEXG4gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR0FSWSBDT1VSVCBPUlxuICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbiAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRlxuICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKlxuICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGVcbiAqIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkXG4gKiBvciBpbXBsaWVkLCBvZiBHYXJ5IENvdXJ0LlxuICovXG52YXIgU0NIRU1FUyA9IHt9O1xuZnVuY3Rpb24gcGN0RW5jQ2hhcihjaHIpIHtcbiAgICB2YXIgYyA9IGNoci5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBlID0gdm9pZCAwO1xuICAgIGlmIChjIDwgMTYpIGUgPSBcIiUwXCIgKyBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO2Vsc2UgaWYgKGMgPCAxMjgpIGUgPSBcIiVcIiArIGMudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7ZWxzZSBpZiAoYyA8IDIwNDgpIGUgPSBcIiVcIiArIChjID4+IDYgfCAxOTIpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgXCIlXCIgKyAoYyAmIDYzIHwgMTI4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtlbHNlIGUgPSBcIiVcIiArIChjID4+IDEyIHwgMjI0KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKGMgPj4gNiAmIDYzIHwgMTI4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKGMgJiA2MyB8IDEyOCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBwY3REZWNDaGFycyhzdHIpIHtcbiAgICB2YXIgbmV3U3RyID0gXCJcIjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGlsID0gc3RyLmxlbmd0aDtcbiAgICB3aGlsZSAoaSA8IGlsKSB7XG4gICAgICAgIHZhciBjID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpICsgMSwgMiksIDE2KTtcbiAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgIG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgaSArPSAzO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPj0gMTk0ICYmIGMgPCAyMjQpIHtcbiAgICAgICAgICAgIGlmIChpbCAtIGkgPj0gNikge1xuICAgICAgICAgICAgICAgIHZhciBjMiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSArIDQsIDIpLCAxNik7XG4gICAgICAgICAgICAgICAgbmV3U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiAzMSkgPDwgNiB8IGMyICYgNjMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCA2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgKz0gNjtcbiAgICAgICAgfSBlbHNlIGlmIChjID49IDIyNCkge1xuICAgICAgICAgICAgaWYgKGlsIC0gaSA+PSA5KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9jID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpICsgNCwgMiksIDE2KTtcbiAgICAgICAgICAgICAgICB2YXIgYzMgPSBwYXJzZUludChzdHIuc3Vic3RyKGkgKyA3LCAyKSwgMTYpO1xuICAgICAgICAgICAgICAgIG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgMTUpIDw8IDEyIHwgKF9jICYgNjMpIDw8IDYgfCBjMyAmIDYzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U3RyICs9IHN0ci5zdWJzdHIoaSwgOSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpICs9IDk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCAzKTtcbiAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3U3RyO1xufVxuZnVuY3Rpb24gX25vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKGNvbXBvbmVudHMsIHByb3RvY29sKSB7XG4gICAgZnVuY3Rpb24gZGVjb2RlVW5yZXNlcnZlZChzdHIpIHtcbiAgICAgICAgdmFyIGRlY1N0ciA9IHBjdERlY0NoYXJzKHN0cik7XG4gICAgICAgIHJldHVybiAhZGVjU3RyLm1hdGNoKHByb3RvY29sLlVOUkVTRVJWRUQpID8gc3RyIDogZGVjU3RyO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50cy5zY2hlbWUpIGNvbXBvbmVudHMuc2NoZW1lID0gU3RyaW5nKGNvbXBvbmVudHMuc2NoZW1lKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocHJvdG9jb2wuTk9UX1NDSEVNRSwgXCJcIik7XG4gICAgaWYgKGNvbXBvbmVudHMudXNlcmluZm8gIT09IHVuZGVmaW5lZCkgY29tcG9uZW50cy51c2VyaW5mbyA9IFN0cmluZyhjb21wb25lbnRzLnVzZXJpbmZvKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKHByb3RvY29sLk5PVF9VU0VSSU5GTywgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xuICAgIGlmIChjb21wb25lbnRzLmhvc3QgIT09IHVuZGVmaW5lZCkgY29tcG9uZW50cy5ob3N0ID0gU3RyaW5nKGNvbXBvbmVudHMuaG9zdCkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHByb3RvY29sLk5PVF9IT1NULCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XG4gICAgaWYgKGNvbXBvbmVudHMucGF0aCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLnBhdGggPSBTdHJpbmcoY29tcG9uZW50cy5wYXRoKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKGNvbXBvbmVudHMuc2NoZW1lID8gcHJvdG9jb2wuTk9UX1BBVEggOiBwcm90b2NvbC5OT1RfUEFUSF9OT1NDSEVNRSwgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xuICAgIGlmIChjb21wb25lbnRzLnF1ZXJ5ICE9PSB1bmRlZmluZWQpIGNvbXBvbmVudHMucXVlcnkgPSBTdHJpbmcoY29tcG9uZW50cy5xdWVyeSkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShwcm90b2NvbC5OT1RfUVVFUlksIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcbiAgICBpZiAoY29tcG9uZW50cy5mcmFnbWVudCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLmZyYWdtZW50ID0gU3RyaW5nKGNvbXBvbmVudHMuZnJhZ21lbnQpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIGRlY29kZVVucmVzZXJ2ZWQpLnJlcGxhY2UocHJvdG9jb2wuTk9UX0ZSQUdNRU5ULCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG5cbmZ1bmN0aW9uIF9zdHJpcExlYWRpbmdaZXJvcyhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL14wKiguKikvLCBcIiQxXCIpIHx8IFwiMFwiO1xufVxuZnVuY3Rpb24gX25vcm1hbGl6ZUlQdjQoaG9zdCwgcHJvdG9jb2wpIHtcbiAgICB2YXIgbWF0Y2hlcyA9IGhvc3QubWF0Y2gocHJvdG9jb2wuSVBWNEFERFJFU1MpIHx8IFtdO1xuXG4gICAgdmFyIF9tYXRjaGVzID0gc2xpY2VkVG9BcnJheShtYXRjaGVzLCAyKSxcbiAgICAgICAgYWRkcmVzcyA9IF9tYXRjaGVzWzFdO1xuXG4gICAgaWYgKGFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIGFkZHJlc3Muc3BsaXQoXCIuXCIpLm1hcChfc3RyaXBMZWFkaW5nWmVyb3MpLmpvaW4oXCIuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBob3N0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9ub3JtYWxpemVJUHY2KGhvc3QsIHByb3RvY29sKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBob3N0Lm1hdGNoKHByb3RvY29sLklQVjZBRERSRVNTKSB8fCBbXTtcblxuICAgIHZhciBfbWF0Y2hlczIgPSBzbGljZWRUb0FycmF5KG1hdGNoZXMsIDMpLFxuICAgICAgICBhZGRyZXNzID0gX21hdGNoZXMyWzFdLFxuICAgICAgICB6b25lID0gX21hdGNoZXMyWzJdO1xuXG4gICAgaWYgKGFkZHJlc3MpIHtcbiAgICAgICAgdmFyIF9hZGRyZXNzJHRvTG93ZXJDYXNlJCA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKS5zcGxpdCgnOjonKS5yZXZlcnNlKCksXG4gICAgICAgICAgICBfYWRkcmVzcyR0b0xvd2VyQ2FzZSQyID0gc2xpY2VkVG9BcnJheShfYWRkcmVzcyR0b0xvd2VyQ2FzZSQsIDIpLFxuICAgICAgICAgICAgbGFzdCA9IF9hZGRyZXNzJHRvTG93ZXJDYXNlJDJbMF0sXG4gICAgICAgICAgICBmaXJzdCA9IF9hZGRyZXNzJHRvTG93ZXJDYXNlJDJbMV07XG5cbiAgICAgICAgdmFyIGZpcnN0RmllbGRzID0gZmlyc3QgPyBmaXJzdC5zcGxpdChcIjpcIikubWFwKF9zdHJpcExlYWRpbmdaZXJvcykgOiBbXTtcbiAgICAgICAgdmFyIGxhc3RGaWVsZHMgPSBsYXN0LnNwbGl0KFwiOlwiKS5tYXAoX3N0cmlwTGVhZGluZ1plcm9zKTtcbiAgICAgICAgdmFyIGlzTGFzdEZpZWxkSVB2NEFkZHJlc3MgPSBwcm90b2NvbC5JUFY0QUREUkVTUy50ZXN0KGxhc3RGaWVsZHNbbGFzdEZpZWxkcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIHZhciBmaWVsZENvdW50ID0gaXNMYXN0RmllbGRJUHY0QWRkcmVzcyA/IDcgOiA4O1xuICAgICAgICB2YXIgbGFzdEZpZWxkc1N0YXJ0ID0gbGFzdEZpZWxkcy5sZW5ndGggLSBmaWVsZENvdW50O1xuICAgICAgICB2YXIgZmllbGRzID0gQXJyYXkoZmllbGRDb3VudCk7XG4gICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgZmllbGRDb3VudDsgKyt4KSB7XG4gICAgICAgICAgICBmaWVsZHNbeF0gPSBmaXJzdEZpZWxkc1t4XSB8fCBsYXN0RmllbGRzW2xhc3RGaWVsZHNTdGFydCArIHhdIHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xhc3RGaWVsZElQdjRBZGRyZXNzKSB7XG4gICAgICAgICAgICBmaWVsZHNbZmllbGRDb3VudCAtIDFdID0gX25vcm1hbGl6ZUlQdjQoZmllbGRzW2ZpZWxkQ291bnQgLSAxXSwgcHJvdG9jb2wpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhbGxaZXJvRmllbGRzID0gZmllbGRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWVsZCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghZmllbGQgfHwgZmllbGQgPT09IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RMb25nZXN0ID0gYWNjW2FjYy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdExvbmdlc3QgJiYgbGFzdExvbmdlc3QuaW5kZXggKyBsYXN0TG9uZ2VzdC5sZW5ndGggPT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMb25nZXN0Lmxlbmd0aCsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFjYy5wdXNoKHsgaW5kZXg6IGluZGV4LCBsZW5ndGg6IDEgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuICAgICAgICB2YXIgbG9uZ2VzdFplcm9GaWVsZHMgPSBhbGxaZXJvRmllbGRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9KVswXTtcbiAgICAgICAgdmFyIG5ld0hvc3QgPSB2b2lkIDA7XG4gICAgICAgIGlmIChsb25nZXN0WmVyb0ZpZWxkcyAmJiBsb25nZXN0WmVyb0ZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgbmV3Rmlyc3QgPSBmaWVsZHMuc2xpY2UoMCwgbG9uZ2VzdFplcm9GaWVsZHMuaW5kZXgpO1xuICAgICAgICAgICAgdmFyIG5ld0xhc3QgPSBmaWVsZHMuc2xpY2UobG9uZ2VzdFplcm9GaWVsZHMuaW5kZXggKyBsb25nZXN0WmVyb0ZpZWxkcy5sZW5ndGgpO1xuICAgICAgICAgICAgbmV3SG9zdCA9IG5ld0ZpcnN0LmpvaW4oXCI6XCIpICsgXCI6OlwiICsgbmV3TGFzdC5qb2luKFwiOlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0hvc3QgPSBmaWVsZHMuam9pbihcIjpcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHpvbmUpIHtcbiAgICAgICAgICAgIG5ld0hvc3QgKz0gXCIlXCIgKyB6b25lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdIb3N0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBob3N0O1xuICAgIH1cbn1cbnZhciBVUklfUEFSU0UgPSAvXig/OihbXjpcXC8/I10rKTopPyg/OlxcL1xcLygoPzooW15cXC8/I0BdKilAKT8oXFxbW15cXC8/I1xcXV0rXFxdfFteXFwvPyM6XSopKD86XFw6KFxcZCopKT8pKT8oW14/I10qKSg/OlxcPyhbXiNdKikpPyg/OiMoKD86LnxcXG58XFxyKSopKT8vaTtcbnZhciBOT19NQVRDSF9JU19VTkRFRklORUQgPSBcIlwiLm1hdGNoKC8oKXswfS8pWzFdID09PSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBwYXJzZSh1cmlTdHJpbmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgY29tcG9uZW50cyA9IHt9O1xuICAgIHZhciBwcm90b2NvbCA9IG9wdGlvbnMuaXJpICE9PSBmYWxzZSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTDtcbiAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2UgPT09IFwic3VmZml4XCIpIHVyaVN0cmluZyA9IChvcHRpb25zLnNjaGVtZSA/IG9wdGlvbnMuc2NoZW1lICsgXCI6XCIgOiBcIlwiKSArIFwiLy9cIiArIHVyaVN0cmluZztcbiAgICB2YXIgbWF0Y2hlcyA9IHVyaVN0cmluZy5tYXRjaChVUklfUEFSU0UpO1xuICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIGlmIChOT19NQVRDSF9JU19VTkRFRklORUQpIHtcbiAgICAgICAgICAgIC8vc3RvcmUgZWFjaCBjb21wb25lbnRcbiAgICAgICAgICAgIGNvbXBvbmVudHMuc2NoZW1lID0gbWF0Y2hlc1sxXTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMudXNlcmluZm8gPSBtYXRjaGVzWzNdO1xuICAgICAgICAgICAgY29tcG9uZW50cy5ob3N0ID0gbWF0Y2hlc1s0XTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IG1hdGNoZXNbNl0gfHwgXCJcIjtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucXVlcnkgPSBtYXRjaGVzWzddO1xuICAgICAgICAgICAgY29tcG9uZW50cy5mcmFnbWVudCA9IG1hdGNoZXNbOF07XG4gICAgICAgICAgICAvL2ZpeCBwb3J0IG51bWJlclxuICAgICAgICAgICAgaWYgKGlzTmFOKGNvbXBvbmVudHMucG9ydCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnBvcnQgPSBtYXRjaGVzWzVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9JRSBGSVggZm9yIGltcHJvcGVyIFJlZ0V4cCBtYXRjaGluZ1xuICAgICAgICAgICAgLy9zdG9yZSBlYWNoIGNvbXBvbmVudFxuICAgICAgICAgICAgY29tcG9uZW50cy5zY2hlbWUgPSBtYXRjaGVzWzFdIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMudXNlcmluZm8gPSB1cmlTdHJpbmcuaW5kZXhPZihcIkBcIikgIT09IC0xID8gbWF0Y2hlc1szXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaG9zdCA9IHVyaVN0cmluZy5pbmRleE9mKFwiLy9cIikgIT09IC0xID8gbWF0Y2hlc1s0XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IG1hdGNoZXNbNl0gfHwgXCJcIjtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucXVlcnkgPSB1cmlTdHJpbmcuaW5kZXhPZihcIj9cIikgIT09IC0xID8gbWF0Y2hlc1s3XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZnJhZ21lbnQgPSB1cmlTdHJpbmcuaW5kZXhPZihcIiNcIikgIT09IC0xID8gbWF0Y2hlc1s4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vZml4IHBvcnQgbnVtYmVyXG4gICAgICAgICAgICBpZiAoaXNOYU4oY29tcG9uZW50cy5wb3J0KSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucG9ydCA9IHVyaVN0cmluZy5tYXRjaCgvXFwvXFwvKD86LnxcXG4pKlxcOig/OlxcL3xcXD98XFwjfCQpLykgPyBtYXRjaGVzWzRdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb25lbnRzLmhvc3QpIHtcbiAgICAgICAgICAgIC8vbm9ybWFsaXplIElQIGhvc3RzXG4gICAgICAgICAgICBjb21wb25lbnRzLmhvc3QgPSBfbm9ybWFsaXplSVB2Nihfbm9ybWFsaXplSVB2NChjb21wb25lbnRzLmhvc3QsIHByb3RvY29sKSwgcHJvdG9jb2wpO1xuICAgICAgICB9XG4gICAgICAgIC8vZGV0ZXJtaW5lIHJlZmVyZW5jZSB0eXBlXG4gICAgICAgIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkICYmIGNvbXBvbmVudHMudXNlcmluZm8gPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLmhvc3QgPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLnBvcnQgPT09IHVuZGVmaW5lZCAmJiAhY29tcG9uZW50cy5wYXRoICYmIGNvbXBvbmVudHMucXVlcnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5yZWZlcmVuY2UgPSBcInNhbWUtZG9jdW1lbnRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLnJlZmVyZW5jZSA9IFwicmVsYXRpdmVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRzLmZyYWdtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucmVmZXJlbmNlID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50cy5yZWZlcmVuY2UgPSBcInVyaVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vY2hlY2sgZm9yIHJlZmVyZW5jZSBlcnJvcnNcbiAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBjb21wb25lbnRzLnJlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVUkkgaXMgbm90IGEgXCIgKyBvcHRpb25zLnJlZmVyZW5jZSArIFwiIHJlZmVyZW5jZS5cIjtcbiAgICAgICAgfVxuICAgICAgICAvL2ZpbmQgc2NoZW1lIGhhbmRsZXJcbiAgICAgICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTWyhvcHRpb25zLnNjaGVtZSB8fCBjb21wb25lbnRzLnNjaGVtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgLy9jaGVjayBpZiBzY2hlbWUgY2FuJ3QgaGFuZGxlIElSSXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnVuaWNvZGVTdXBwb3J0ICYmICghc2NoZW1lSGFuZGxlciB8fCAhc2NoZW1lSGFuZGxlci51bmljb2RlU3VwcG9ydCkpIHtcbiAgICAgICAgICAgIC8vaWYgaG9zdCBjb21wb25lbnQgaXMgYSBkb21haW4gbmFtZVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuaG9zdCAmJiAob3B0aW9ucy5kb21haW5Ib3N0IHx8IHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5kb21haW5Ib3N0KSkge1xuICAgICAgICAgICAgICAgIC8vY29udmVydCBVbmljb2RlIElETiAtPiBBU0NJSSBJRE5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmhvc3QgPSBwdW55Y29kZS50b0FTQ0lJKGNvbXBvbmVudHMuaG9zdC5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBwY3REZWNDaGFycykudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnZlcnQgSVJJIC0+IFVSSVxuICAgICAgICAgICAgX25vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKGNvbXBvbmVudHMsIFVSSV9QUk9UT0NPTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL25vcm1hbGl6ZSBlbmNvZGluZ3NcbiAgICAgICAgICAgIF9ub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyhjb21wb25lbnRzLCBwcm90b2NvbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9wZXJmb3JtIHNjaGVtZSBzcGVjaWZpYyBwYXJzaW5nXG4gICAgICAgIGlmIChzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIucGFyc2UpIHtcbiAgICAgICAgICAgIHNjaGVtZUhhbmRsZXIucGFyc2UoY29tcG9uZW50cywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIlVSSSBjYW4gbm90IGJlIHBhcnNlZC5cIjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG5cbmZ1bmN0aW9uIF9yZWNvbXBvc2VBdXRob3JpdHkoY29tcG9uZW50cywgb3B0aW9ucykge1xuICAgIHZhciBwcm90b2NvbCA9IG9wdGlvbnMuaXJpICE9PSBmYWxzZSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTDtcbiAgICB2YXIgdXJpVG9rZW5zID0gW107XG4gICAgaWYgKGNvbXBvbmVudHMudXNlcmluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLnVzZXJpbmZvKTtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goXCJAXCIpO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50cy5ob3N0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9ub3JtYWxpemUgSVAgaG9zdHMsIGFkZCBicmFja2V0cyBhbmQgZXNjYXBlIHpvbmUgc2VwYXJhdG9yIGZvciBJUHY2XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKF9ub3JtYWxpemVJUHY2KF9ub3JtYWxpemVJUHY0KFN0cmluZyhjb21wb25lbnRzLmhvc3QpLCBwcm90b2NvbCksIHByb3RvY29sKS5yZXBsYWNlKHByb3RvY29sLklQVjZBRERSRVNTLCBmdW5jdGlvbiAoXywgJDEsICQyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJbXCIgKyAkMSArICgkMiA/IFwiJTI1XCIgKyAkMiA6IFwiXCIpICsgXCJdXCI7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnRzLnBvcnQgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNvbXBvbmVudHMucG9ydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB1cmlUb2tlbnMucHVzaChcIjpcIik7XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKFN0cmluZyhjb21wb25lbnRzLnBvcnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVyaVRva2Vucy5sZW5ndGggPyB1cmlUb2tlbnMuam9pbihcIlwiKSA6IHVuZGVmaW5lZDtcbn1cblxudmFyIFJEUzEgPSAvXlxcLlxcLj9cXC8vO1xudmFyIFJEUzIgPSAvXlxcL1xcLihcXC98JCkvO1xudmFyIFJEUzMgPSAvXlxcL1xcLlxcLihcXC98JCkvO1xudmFyIFJEUzUgPSAvXlxcLz8oPzoufFxcbikqPyg/PVxcL3wkKS87XG5mdW5jdGlvbiByZW1vdmVEb3RTZWdtZW50cyhpbnB1dCkge1xuICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICB3aGlsZSAoaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChpbnB1dC5tYXRjaChSRFMxKSkge1xuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFJEUzEsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzIpKSB7XG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMiwgXCIvXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzMpKSB7XG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMywgXCIvXCIpO1xuICAgICAgICAgICAgb3V0cHV0LnBvcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcIi5cIiB8fCBpbnB1dCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW0gPSBpbnB1dC5tYXRjaChSRFM1KTtcbiAgICAgICAgICAgIGlmIChpbSkge1xuICAgICAgICAgICAgICAgIHZhciBzID0gaW1bMF07XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zbGljZShzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gocyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZG90IHNlZ21lbnQgY29uZGl0aW9uXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplKGNvbXBvbmVudHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB2YXIgcHJvdG9jb2wgPSBvcHRpb25zLmlyaSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTDtcbiAgICB2YXIgdXJpVG9rZW5zID0gW107XG4gICAgLy9maW5kIHNjaGVtZSBoYW5kbGVyXG4gICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTWyhvcHRpb25zLnNjaGVtZSB8fCBjb21wb25lbnRzLnNjaGVtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpXTtcbiAgICAvL3BlcmZvcm0gc2NoZW1lIHNwZWNpZmljIHNlcmlhbGl6YXRpb25cbiAgICBpZiAoc2NoZW1lSGFuZGxlciAmJiBzY2hlbWVIYW5kbGVyLnNlcmlhbGl6ZSkgc2NoZW1lSGFuZGxlci5zZXJpYWxpemUoY29tcG9uZW50cywgb3B0aW9ucyk7XG4gICAgaWYgKGNvbXBvbmVudHMuaG9zdCkge1xuICAgICAgICAvL2lmIGhvc3QgY29tcG9uZW50IGlzIGFuIElQdjYgYWRkcmVzc1xuICAgICAgICBpZiAocHJvdG9jb2wuSVBWNkFERFJFU1MudGVzdChjb21wb25lbnRzLmhvc3QpKSB7fVxuICAgICAgICAvL1RPRE86IG5vcm1hbGl6ZSBJUHY2IGFkZHJlc3MgYXMgcGVyIFJGQyA1OTUyXG5cbiAgICAgICAgLy9pZiBob3N0IGNvbXBvbmVudCBpcyBhIGRvbWFpbiBuYW1lXG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZG9tYWluSG9zdCB8fCBzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIuZG9tYWluSG9zdCkge1xuICAgICAgICAgICAgICAgIC8vY29udmVydCBJRE4gdmlhIHB1bnljb2RlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5ob3N0ID0gIW9wdGlvbnMuaXJpID8gcHVueWNvZGUudG9BU0NJSShjb21wb25lbnRzLmhvc3QucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgcGN0RGVjQ2hhcnMpLnRvTG93ZXJDYXNlKCkpIDogcHVueWNvZGUudG9Vbmljb2RlKGNvbXBvbmVudHMuaG9zdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArICghb3B0aW9ucy5pcmkgPyBcIkFTQ0lJXCIgOiBcIlVuaWNvZGVcIikgKyBcIiB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8vbm9ybWFsaXplIGVuY29kaW5nXG4gICAgX25vcm1hbGl6ZUNvbXBvbmVudEVuY29kaW5nKGNvbXBvbmVudHMsIHByb3RvY29sKTtcbiAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2UgIT09IFwic3VmZml4XCIgJiYgY29tcG9uZW50cy5zY2hlbWUpIHtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5zY2hlbWUpO1xuICAgICAgICB1cmlUb2tlbnMucHVzaChcIjpcIik7XG4gICAgfVxuICAgIHZhciBhdXRob3JpdHkgPSBfcmVjb21wb3NlQXV0aG9yaXR5KGNvbXBvbmVudHMsIG9wdGlvbnMpO1xuICAgIGlmIChhdXRob3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2UgIT09IFwic3VmZml4XCIpIHtcbiAgICAgICAgICAgIHVyaVRva2Vucy5wdXNoKFwiLy9cIik7XG4gICAgICAgIH1cbiAgICAgICAgdXJpVG9rZW5zLnB1c2goYXV0aG9yaXR5KTtcbiAgICAgICAgaWYgKGNvbXBvbmVudHMucGF0aCAmJiBjb21wb25lbnRzLnBhdGguY2hhckF0KDApICE9PSBcIi9cIikge1xuICAgICAgICAgICAgdXJpVG9rZW5zLnB1c2goXCIvXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRzLnBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcyA9IGNvbXBvbmVudHMucGF0aDtcbiAgICAgICAgaWYgKCFvcHRpb25zLmFic29sdXRlUGF0aCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIuYWJzb2x1dGVQYXRoKSkge1xuICAgICAgICAgICAgcyA9IHJlbW92ZURvdFNlZ21lbnRzKHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXlxcL1xcLy8sIFwiLyUyRlwiKTsgLy9kb24ndCBhbGxvdyB0aGUgcGF0aCB0byBzdGFydCB3aXRoIFwiLy9cIlxuICAgICAgICB9XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKHMpO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50cy5xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVyaVRva2Vucy5wdXNoKFwiP1wiKTtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5xdWVyeSk7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRzLmZyYWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXJpVG9rZW5zLnB1c2goXCIjXCIpO1xuICAgICAgICB1cmlUb2tlbnMucHVzaChjb21wb25lbnRzLmZyYWdtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHVyaVRva2Vucy5qb2luKFwiXCIpOyAvL21lcmdlIHRva2VucyBpbnRvIGEgc3RyaW5nXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnRzKGJhc2UsIHJlbGF0aXZlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHZhciBza2lwTm9ybWFsaXphdGlvbiA9IGFyZ3VtZW50c1szXTtcblxuICAgIHZhciB0YXJnZXQgPSB7fTtcbiAgICBpZiAoIXNraXBOb3JtYWxpemF0aW9uKSB7XG4gICAgICAgIGJhc2UgPSBwYXJzZShzZXJpYWxpemUoYmFzZSwgb3B0aW9ucyksIG9wdGlvbnMpOyAvL25vcm1hbGl6ZSBiYXNlIGNvbXBvbmVudHNcbiAgICAgICAgcmVsYXRpdmUgPSBwYXJzZShzZXJpYWxpemUocmVsYXRpdmUsIG9wdGlvbnMpLCBvcHRpb25zKTsgLy9ub3JtYWxpemUgcmVsYXRpdmUgY29tcG9uZW50c1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMudG9sZXJhbnQgJiYgcmVsYXRpdmUuc2NoZW1lKSB7XG4gICAgICAgIHRhcmdldC5zY2hlbWUgPSByZWxhdGl2ZS5zY2hlbWU7XG4gICAgICAgIC8vdGFyZ2V0LmF1dGhvcml0eSA9IHJlbGF0aXZlLmF1dGhvcml0eTtcbiAgICAgICAgdGFyZ2V0LnVzZXJpbmZvID0gcmVsYXRpdmUudXNlcmluZm87XG4gICAgICAgIHRhcmdldC5ob3N0ID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgdGFyZ2V0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgICAgICB0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHJlbGF0aXZlLnBhdGggfHwgXCJcIik7XG4gICAgICAgIHRhcmdldC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZWxhdGl2ZS51c2VyaW5mbyAhPT0gdW5kZWZpbmVkIHx8IHJlbGF0aXZlLmhvc3QgIT09IHVuZGVmaW5lZCB8fCByZWxhdGl2ZS5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vdGFyZ2V0LmF1dGhvcml0eSA9IHJlbGF0aXZlLmF1dGhvcml0eTtcbiAgICAgICAgICAgIHRhcmdldC51c2VyaW5mbyA9IHJlbGF0aXZlLnVzZXJpbmZvO1xuICAgICAgICAgICAgdGFyZ2V0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0O1xuICAgICAgICAgICAgdGFyZ2V0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgICAgICAgICAgdGFyZ2V0LnBhdGggPSByZW1vdmVEb3RTZWdtZW50cyhyZWxhdGl2ZS5wYXRoIHx8IFwiXCIpO1xuICAgICAgICAgICAgdGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXJlbGF0aXZlLnBhdGgpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IGJhc2UucGF0aDtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmUucXVlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlLnBhdGguY2hhckF0KDApID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHJlbGF0aXZlLnBhdGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYmFzZS51c2VyaW5mbyAhPT0gdW5kZWZpbmVkIHx8IGJhc2UuaG9zdCAhPT0gdW5kZWZpbmVkIHx8IGJhc2UucG9ydCAhPT0gdW5kZWZpbmVkKSAmJiAhYmFzZS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IFwiL1wiICsgcmVsYXRpdmUucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmFzZS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IHJlbGF0aXZlLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCA9IGJhc2UucGF0aC5zbGljZSgwLCBiYXNlLnBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgKyByZWxhdGl2ZS5wYXRoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHModGFyZ2V0LnBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vdGFyZ2V0LmF1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5O1xuICAgICAgICAgICAgdGFyZ2V0LnVzZXJpbmZvID0gYmFzZS51c2VyaW5mbztcbiAgICAgICAgICAgIHRhcmdldC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdGFyZ2V0LnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LnNjaGVtZSA9IGJhc2Uuc2NoZW1lO1xuICAgIH1cbiAgICB0YXJnZXQuZnJhZ21lbnQgPSByZWxhdGl2ZS5mcmFnbWVudDtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlKGJhc2VVUkksIHJlbGF0aXZlVVJJLCBvcHRpb25zKSB7XG4gICAgdmFyIHNjaGVtZWxlc3NPcHRpb25zID0gYXNzaWduKHsgc2NoZW1lOiAnbnVsbCcgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZShyZXNvbHZlQ29tcG9uZW50cyhwYXJzZShiYXNlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHBhcnNlKHJlbGF0aXZlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHNjaGVtZWxlc3NPcHRpb25zLCB0cnVlKSwgc2NoZW1lbGVzc09wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUodXJpLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdXJpID0gc2VyaWFsaXplKHBhcnNlKHVyaSwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHlwZU9mKHVyaSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdXJpID0gcGFyc2Uoc2VyaWFsaXplKHVyaSwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdXJpO1xufVxuXG5mdW5jdGlvbiBlcXVhbCh1cmlBLCB1cmlCLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1cmlBID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHVyaUEgPSBzZXJpYWxpemUocGFyc2UodXJpQSwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHlwZU9mKHVyaUEpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHVyaUEgPSBzZXJpYWxpemUodXJpQSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdXJpQiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB1cmlCID0gc2VyaWFsaXplKHBhcnNlKHVyaUIsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVPZih1cmlCKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB1cmlCID0gc2VyaWFsaXplKHVyaUIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdXJpQSA9PT0gdXJpQjtcbn1cblxuZnVuY3Rpb24gZXNjYXBlQ29tcG9uZW50KHN0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBzdHIgJiYgc3RyLnRvU3RyaW5nKCkucmVwbGFjZSghb3B0aW9ucyB8fCAhb3B0aW9ucy5pcmkgPyBVUklfUFJPVE9DT0wuRVNDQVBFIDogSVJJX1BST1RPQ09MLkVTQ0FQRSwgcGN0RW5jQ2hhcik7XG59XG5cbmZ1bmN0aW9uIHVuZXNjYXBlQ29tcG9uZW50KHN0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBzdHIgJiYgc3RyLnRvU3RyaW5nKCkucmVwbGFjZSghb3B0aW9ucyB8fCAhb3B0aW9ucy5pcmkgPyBVUklfUFJPVE9DT0wuUENUX0VOQ09ERUQgOiBJUklfUFJPVE9DT0wuUENUX0VOQ09ERUQsIHBjdERlY0NoYXJzKTtcbn1cblxudmFyIGhhbmRsZXIgPSB7XG4gICAgc2NoZW1lOiBcImh0dHBcIixcbiAgICBkb21haW5Ib3N0OiB0cnVlLFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnRzLCBvcHRpb25zKSB7XG4gICAgICAgIC8vcmVwb3J0IG1pc3NpbmcgaG9zdFxuICAgICAgICBpZiAoIWNvbXBvbmVudHMuaG9zdCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJIVFRQIFVSSXMgbXVzdCBoYXZlIGEgaG9zdC5cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24gc2VyaWFsaXplKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHNlY3VyZSA9IFN0cmluZyhjb21wb25lbnRzLnNjaGVtZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJodHRwc1wiO1xuICAgICAgICAvL25vcm1hbGl6ZSB0aGUgZGVmYXVsdCBwb3J0XG4gICAgICAgIGlmIChjb21wb25lbnRzLnBvcnQgPT09IChzZWN1cmUgPyA0NDMgOiA4MCkgfHwgY29tcG9uZW50cy5wb3J0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLnBvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub3JtYWxpemUgdGhlIGVtcHR5IHBhdGhcbiAgICAgICAgaWYgKCFjb21wb25lbnRzLnBhdGgpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IFwiL1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vTk9URTogV2UgZG8gbm90IHBhcnNlIHF1ZXJ5IHN0cmluZ3MgZm9yIEhUVFAgVVJJc1xuICAgICAgICAvL2FzIFdXVyBGb3JtIFVybCBFbmNvZGVkIHF1ZXJ5IHN0cmluZ3MgYXJlIHBhcnQgb2YgdGhlIEhUTUw0KyBzcGVjLFxuICAgICAgICAvL2FuZCBub3QgdGhlIEhUVFAgc3BlYy5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufTtcblxudmFyIGhhbmRsZXIkMSA9IHtcbiAgICBzY2hlbWU6IFwiaHR0cHNcIixcbiAgICBkb21haW5Ib3N0OiBoYW5kbGVyLmRvbWFpbkhvc3QsXG4gICAgcGFyc2U6IGhhbmRsZXIucGFyc2UsXG4gICAgc2VyaWFsaXplOiBoYW5kbGVyLnNlcmlhbGl6ZVxufTtcblxuZnVuY3Rpb24gaXNTZWN1cmUod3NDb21wb25lbnRzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3c0NvbXBvbmVudHMuc2VjdXJlID09PSAnYm9vbGVhbicgPyB3c0NvbXBvbmVudHMuc2VjdXJlIDogU3RyaW5nKHdzQ29tcG9uZW50cy5zY2hlbWUpLnRvTG93ZXJDYXNlKCkgPT09IFwid3NzXCI7XG59XG4vL1JGQyA2NDU1XG52YXIgaGFuZGxlciQyID0ge1xuICAgIHNjaGVtZTogXCJ3c1wiLFxuICAgIGRvbWFpbkhvc3Q6IHRydWUsXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHdzQ29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gICAgICAgIC8vaW5kaWNhdGUgaWYgdGhlIHNlY3VyZSBmbGFnIGlzIHNldFxuICAgICAgICB3c0NvbXBvbmVudHMuc2VjdXJlID0gaXNTZWN1cmUod3NDb21wb25lbnRzKTtcbiAgICAgICAgLy9jb25zdHJ1Y3QgcmVzb3VjZSBuYW1lXG4gICAgICAgIHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUgPSAod3NDb21wb25lbnRzLnBhdGggfHwgJy8nKSArICh3c0NvbXBvbmVudHMucXVlcnkgPyAnPycgKyB3c0NvbXBvbmVudHMucXVlcnkgOiAnJyk7XG4gICAgICAgIHdzQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB3c0NvbXBvbmVudHMucXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3c0NvbXBvbmVudHM7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGZ1bmN0aW9uIHNlcmlhbGl6ZSh3c0NvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgLy9ub3JtYWxpemUgdGhlIGRlZmF1bHQgcG9ydFxuICAgICAgICBpZiAod3NDb21wb25lbnRzLnBvcnQgPT09IChpc1NlY3VyZSh3c0NvbXBvbmVudHMpID8gNDQzIDogODApIHx8IHdzQ29tcG9uZW50cy5wb3J0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICB3c0NvbXBvbmVudHMucG9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvL2Vuc3VyZSBzY2hlbWUgbWF0Y2hlcyBzZWN1cmUgZmxhZ1xuICAgICAgICBpZiAodHlwZW9mIHdzQ29tcG9uZW50cy5zZWN1cmUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgd3NDb21wb25lbnRzLnNjaGVtZSA9IHdzQ29tcG9uZW50cy5zZWN1cmUgPyAnd3NzJyA6ICd3cyc7XG4gICAgICAgICAgICB3c0NvbXBvbmVudHMuc2VjdXJlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVjb25zdHJ1Y3QgcGF0aCBmcm9tIHJlc291cmNlIG5hbWVcbiAgICAgICAgaWYgKHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUpIHtcbiAgICAgICAgICAgIHZhciBfd3NDb21wb25lbnRzJHJlc291cmMgPSB3c0NvbXBvbmVudHMucmVzb3VyY2VOYW1lLnNwbGl0KCc/JyksXG4gICAgICAgICAgICAgICAgX3dzQ29tcG9uZW50cyRyZXNvdXJjMiA9IHNsaWNlZFRvQXJyYXkoX3dzQ29tcG9uZW50cyRyZXNvdXJjLCAyKSxcbiAgICAgICAgICAgICAgICBwYXRoID0gX3dzQ29tcG9uZW50cyRyZXNvdXJjMlswXSxcbiAgICAgICAgICAgICAgICBxdWVyeSA9IF93c0NvbXBvbmVudHMkcmVzb3VyYzJbMV07XG5cbiAgICAgICAgICAgIHdzQ29tcG9uZW50cy5wYXRoID0gcGF0aCAmJiBwYXRoICE9PSAnLycgPyBwYXRoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgd3NDb21wb25lbnRzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgICB3c0NvbXBvbmVudHMucmVzb3VyY2VOYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vZm9yYmlkIGZyYWdtZW50IGNvbXBvbmVudFxuICAgICAgICB3c0NvbXBvbmVudHMuZnJhZ21lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3c0NvbXBvbmVudHM7XG4gICAgfVxufTtcblxudmFyIGhhbmRsZXIkMyA9IHtcbiAgICBzY2hlbWU6IFwid3NzXCIsXG4gICAgZG9tYWluSG9zdDogaGFuZGxlciQyLmRvbWFpbkhvc3QsXG4gICAgcGFyc2U6IGhhbmRsZXIkMi5wYXJzZSxcbiAgICBzZXJpYWxpemU6IGhhbmRsZXIkMi5zZXJpYWxpemVcbn07XG5cbnZhciBPID0ge307XG52YXIgaXNJUkkgPSB0cnVlO1xuLy9SRkMgMzk4NlxudmFyIFVOUkVTRVJWRUQkJCA9IFwiW0EtWmEtejAtOVxcXFwtXFxcXC5cXFxcX1xcXFx+XCIgKyAoaXNJUkkgPyBcIlxcXFx4QTAtXFxcXHUyMDBEXFxcXHUyMDEwLVxcXFx1MjAyOVxcXFx1MjAyRi1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZFRlwiIDogXCJcIikgKyBcIl1cIjtcbnZhciBIRVhESUckJCA9IFwiWzAtOUEtRmEtZl1cIjsgLy9jYXNlLWluc2Vuc2l0aXZlXG52YXIgUENUX0VOQ09ERUQkID0gc3ViZXhwKHN1YmV4cChcIiVbRUZlZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVs4OUEtRmEtZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVwiICsgSEVYRElHJCQgKyBIRVhESUckJCkpOyAvL2V4cGFuZGVkXG4vL1JGQyA1MzIyLCBleGNlcHQgdGhlc2Ugc3ltYm9scyBhcyBwZXIgUkZDIDYwNjg6IEAgOiAvID8gIyBbIF0gJiA7ID1cbi8vY29uc3QgQVRFWFQkJCA9IFwiW0EtWmEtejAtOVxcXFwhXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcJ1xcXFwqXFxcXCtcXFxcLVxcXFwvXFxcXD1cXFxcP1xcXFxeXFxcXF9cXFxcYFxcXFx7XFxcXHxcXFxcfVxcXFx+XVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVRFWFQkJCA9IFwiW1xcXFx4MDEtXFxcXHgwOFxcXFx4MEJcXFxceDBDXFxcXHgwRS1cXFxceDFGXFxcXHg3Rl1cIjsgIC8vKCVkMS04IC8gJWQxMS0xMiAvICVkMTQtMzEgLyAlZDEyNylcbi8vY29uc3QgUVRFWFQkJCA9IG1lcmdlKFwiW1xcXFx4MjFcXFxceDIzLVxcXFx4NUJcXFxceDVELVxcXFx4N0VdXCIsIE9CU19RVEVYVCQkKTsgIC8vJWQzMyAvICVkMzUtOTEgLyAlZDkzLTEyNiAvIG9icy1xdGV4dFxuLy9jb25zdCBWQ0hBUiQkID0gXCJbXFxcXHgyMS1cXFxceDdFXVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVAkID0gc3ViZXhwKFwiXFxcXFxcXFxcIiArIG1lcmdlKFwiW1xcXFx4MDBcXFxceDBEXFxcXHgwQV1cIiwgT0JTX1FURVhUJCQpKTsgIC8vJWQwIC8gQ1IgLyBMRiAvIG9icy1xdGV4dFxuLy9jb25zdCBGV1MkID0gc3ViZXhwKHN1YmV4cChXU1AkJCArIFwiKlwiICsgXCJcXFxceDBEXFxcXHgwQVwiKSArIFwiP1wiICsgV1NQJCQgKyBcIitcIik7XG4vL2NvbnN0IFFVT1RFRF9QQUlSJCA9IHN1YmV4cChzdWJleHAoXCJcXFxcXFxcXFwiICsgc3ViZXhwKFZDSEFSJCQgKyBcInxcIiArIFdTUCQkKSkgKyBcInxcIiArIE9CU19RUCQpO1xuLy9jb25zdCBRVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIHN1YmV4cChGV1MkICsgXCI/XCIgKyBRQ09OVEVOVCQpICsgXCIqXCIgKyBGV1MkICsgXCI/XCIgKyAnXFxcXFwiJyk7XG52YXIgQVRFWFQkJCA9IFwiW0EtWmEtejAtOVxcXFwhXFxcXCRcXFxcJVxcXFwnXFxcXCpcXFxcK1xcXFwtXFxcXF5cXFxcX1xcXFxgXFxcXHtcXFxcfFxcXFx9XFxcXH5dXCI7XG52YXIgUVRFWFQkJCA9IFwiW1xcXFwhXFxcXCRcXFxcJVxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFwtXFxcXC4wLTlcXFxcPFxcXFw+QS1aXFxcXHg1RS1cXFxceDdFXVwiO1xudmFyIFZDSEFSJCQgPSBtZXJnZShRVEVYVCQkLCBcIltcXFxcXFxcIlxcXFxcXFxcXVwiKTtcbnZhciBTT01FX0RFTElNUyQkID0gXCJbXFxcXCFcXFxcJFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFw7XFxcXDpcXFxcQF1cIjtcbnZhciBVTlJFU0VSVkVEID0gbmV3IFJlZ0V4cChVTlJFU0VSVkVEJCQsIFwiZ1wiKTtcbnZhciBQQ1RfRU5DT0RFRCA9IG5ldyBSZWdFeHAoUENUX0VOQ09ERUQkLCBcImdcIik7XG52YXIgTk9UX0xPQ0FMX1BBUlQgPSBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIEFURVhUJCQsIFwiW1xcXFwuXVwiLCAnW1xcXFxcIl0nLCBWQ0hBUiQkKSwgXCJnXCIpO1xudmFyIE5PVF9IRk5BTUUgPSBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIFVOUkVTRVJWRUQkJCwgU09NRV9ERUxJTVMkJCksIFwiZ1wiKTtcbnZhciBOT1RfSEZWQUxVRSA9IE5PVF9IRk5BTUU7XG5mdW5jdGlvbiBkZWNvZGVVbnJlc2VydmVkKHN0cikge1xuICAgIHZhciBkZWNTdHIgPSBwY3REZWNDaGFycyhzdHIpO1xuICAgIHJldHVybiAhZGVjU3RyLm1hdGNoKFVOUkVTRVJWRUQpID8gc3RyIDogZGVjU3RyO1xufVxudmFyIGhhbmRsZXIkNCA9IHtcbiAgICBzY2hlbWU6IFwibWFpbHRvXCIsXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlJCQxKGNvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG1haWx0b0NvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICAgICAgICB2YXIgdG8gPSBtYWlsdG9Db21wb25lbnRzLnRvID0gbWFpbHRvQ29tcG9uZW50cy5wYXRoID8gbWFpbHRvQ29tcG9uZW50cy5wYXRoLnNwbGl0KFwiLFwiKSA6IFtdO1xuICAgICAgICBtYWlsdG9Db21wb25lbnRzLnBhdGggPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChtYWlsdG9Db21wb25lbnRzLnF1ZXJ5KSB7XG4gICAgICAgICAgICB2YXIgdW5rbm93bkhlYWRlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBoZWFkZXJzID0ge307XG4gICAgICAgICAgICB2YXIgaGZpZWxkcyA9IG1haWx0b0NvbXBvbmVudHMucXVlcnkuc3BsaXQoXCImXCIpO1xuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDAsIHhsID0gaGZpZWxkcy5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGhmaWVsZCA9IGhmaWVsZHNbeF0uc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaGZpZWxkWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0b1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvQWRkcnMgPSBoZmllbGRbMV0uc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX3ggPSAwLCBfeGwgPSB0b0FkZHJzLmxlbmd0aDsgX3ggPCBfeGw7ICsrX3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by5wdXNoKHRvQWRkcnNbX3hdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3ViamVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0ID0gdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzFdLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbHRvQ29tcG9uZW50cy5ib2R5ID0gdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzFdLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bkhlYWRlcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1t1bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMF0sIG9wdGlvbnMpXSA9IHVuZXNjYXBlQ29tcG9uZW50KGhmaWVsZFsxXSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW5rbm93bkhlYWRlcnMpIG1haWx0b0NvbXBvbmVudHMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgbWFpbHRvQ29tcG9uZW50cy5xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yICh2YXIgX3gyID0gMCwgX3hsMiA9IHRvLmxlbmd0aDsgX3gyIDwgX3hsMjsgKytfeDIpIHtcbiAgICAgICAgICAgIHZhciBhZGRyID0gdG9bX3gyXS5zcGxpdChcIkBcIik7XG4gICAgICAgICAgICBhZGRyWzBdID0gdW5lc2NhcGVDb21wb25lbnQoYWRkclswXSk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudW5pY29kZVN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgVW5pY29kZSBJRE4gLT4gQVNDSUkgSUROXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkclsxXSA9IHB1bnljb2RlLnRvQVNDSUkodW5lc2NhcGVDb21wb25lbnQoYWRkclsxXSwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBtYWlsdG9Db21wb25lbnRzLmVycm9yID0gbWFpbHRvQ29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZHJbMV0gPSB1bmVzY2FwZUNvbXBvbmVudChhZGRyWzFdLCBvcHRpb25zKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9bX3gyXSA9IGFkZHIuam9pbihcIkBcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1haWx0b0NvbXBvbmVudHM7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGZ1bmN0aW9uIHNlcmlhbGl6ZSQkMShtYWlsdG9Db21wb25lbnRzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBjb21wb25lbnRzID0gbWFpbHRvQ29tcG9uZW50cztcbiAgICAgICAgdmFyIHRvID0gdG9BcnJheShtYWlsdG9Db21wb25lbnRzLnRvKTtcbiAgICAgICAgaWYgKHRvKSB7XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMCwgeGwgPSB0by5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQWRkciA9IFN0cmluZyh0b1t4XSk7XG4gICAgICAgICAgICAgICAgdmFyIGF0SWR4ID0gdG9BZGRyLmxhc3RJbmRleE9mKFwiQFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxQYXJ0ID0gdG9BZGRyLnNsaWNlKDAsIGF0SWR4KS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfTE9DQUxfUEFSVCwgcGN0RW5jQ2hhcik7XG4gICAgICAgICAgICAgICAgdmFyIGRvbWFpbiA9IHRvQWRkci5zbGljZShhdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIC8vY29udmVydCBJRE4gdmlhIHB1bnljb2RlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gIW9wdGlvbnMuaXJpID8gcHVueWNvZGUudG9BU0NJSSh1bmVzY2FwZUNvbXBvbmVudChkb21haW4sIG9wdGlvbnMpLnRvTG93ZXJDYXNlKCkpIDogcHVueWNvZGUudG9Vbmljb2RlKGRvbWFpbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArICghb3B0aW9ucy5pcmkgPyBcIkFTQ0lJXCIgOiBcIlVuaWNvZGVcIikgKyBcIiB2aWEgcHVueWNvZGU6IFwiICsgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9beF0gPSBsb2NhbFBhcnQgKyBcIkBcIiArIGRvbWFpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHMucGF0aCA9IHRvLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoZWFkZXJzID0gbWFpbHRvQ29tcG9uZW50cy5oZWFkZXJzID0gbWFpbHRvQ29tcG9uZW50cy5oZWFkZXJzIHx8IHt9O1xuICAgICAgICBpZiAobWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0KSBoZWFkZXJzW1wic3ViamVjdFwiXSA9IG1haWx0b0NvbXBvbmVudHMuc3ViamVjdDtcbiAgICAgICAgaWYgKG1haWx0b0NvbXBvbmVudHMuYm9keSkgaGVhZGVyc1tcImJvZHlcIl0gPSBtYWlsdG9Db21wb25lbnRzLmJvZHk7XG4gICAgICAgIHZhciBmaWVsZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGVyc1tuYW1lXSAhPT0gT1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKG5hbWUucmVwbGFjZShQQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShQQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpLnJlcGxhY2UoTk9UX0hGTkFNRSwgcGN0RW5jQ2hhcikgKyBcIj1cIiArIGhlYWRlcnNbbmFtZV0ucmVwbGFjZShQQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShQQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpLnJlcGxhY2UoTk9UX0hGVkFMVUUsIHBjdEVuY0NoYXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5xdWVyeSA9IGZpZWxkcy5qb2luKFwiJlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG59O1xuXG52YXIgVVJOX1BBUlNFID0gL14oW15cXDpdKylcXDooLiopLztcbi8vUkZDIDIxNDFcbnZhciBoYW5kbGVyJDUgPSB7XG4gICAgc2NoZW1lOiBcInVyblwiLFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSQkMShjb21wb25lbnRzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gY29tcG9uZW50cy5wYXRoICYmIGNvbXBvbmVudHMucGF0aC5tYXRjaChVUk5fUEFSU0UpO1xuICAgICAgICB2YXIgdXJuQ29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICB2YXIgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgXCJ1cm5cIjtcbiAgICAgICAgICAgIHZhciBuaWQgPSBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB2YXIgbnNzID0gbWF0Y2hlc1syXTtcbiAgICAgICAgICAgIHZhciB1cm5TY2hlbWUgPSBzY2hlbWUgKyBcIjpcIiArIChvcHRpb25zLm5pZCB8fCBuaWQpO1xuICAgICAgICAgICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTW3VyblNjaGVtZV07XG4gICAgICAgICAgICB1cm5Db21wb25lbnRzLm5pZCA9IG5pZDtcbiAgICAgICAgICAgIHVybkNvbXBvbmVudHMubnNzID0gbnNzO1xuICAgICAgICAgICAgdXJuQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHNjaGVtZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICB1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5wYXJzZSh1cm5Db21wb25lbnRzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybkNvbXBvbmVudHMuZXJyb3IgPSB1cm5Db21wb25lbnRzLmVycm9yIHx8IFwiVVJOIGNhbiBub3QgYmUgcGFyc2VkLlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cm5Db21wb25lbnRzO1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiBmdW5jdGlvbiBzZXJpYWxpemUkJDEodXJuQ29tcG9uZW50cywgb3B0aW9ucykge1xuICAgICAgICB2YXIgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgXCJ1cm5cIjtcbiAgICAgICAgdmFyIG5pZCA9IHVybkNvbXBvbmVudHMubmlkO1xuICAgICAgICB2YXIgdXJuU2NoZW1lID0gc2NoZW1lICsgXCI6XCIgKyAob3B0aW9ucy5uaWQgfHwgbmlkKTtcbiAgICAgICAgdmFyIHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTW3VyblNjaGVtZV07XG4gICAgICAgIGlmIChzY2hlbWVIYW5kbGVyKSB7XG4gICAgICAgICAgICB1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5zZXJpYWxpemUodXJuQ29tcG9uZW50cywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVyaUNvbXBvbmVudHMgPSB1cm5Db21wb25lbnRzO1xuICAgICAgICB2YXIgbnNzID0gdXJuQ29tcG9uZW50cy5uc3M7XG4gICAgICAgIHVyaUNvbXBvbmVudHMucGF0aCA9IChuaWQgfHwgb3B0aW9ucy5uaWQpICsgXCI6XCIgKyBuc3M7XG4gICAgICAgIHJldHVybiB1cmlDb21wb25lbnRzO1xuICAgIH1cbn07XG5cbnZhciBVVUlEID0gL15bMC05QS1GYS1mXXs4fSg/OlxcLVswLTlBLUZhLWZdezR9KXszfVxcLVswLTlBLUZhLWZdezEyfSQvO1xuLy9SRkMgNDEyMlxudmFyIGhhbmRsZXIkNiA9IHtcbiAgICBzY2hlbWU6IFwidXJuOnV1aWRcIixcbiAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UodXJuQ29tcG9uZW50cywgb3B0aW9ucykge1xuICAgICAgICB2YXIgdXVpZENvbXBvbmVudHMgPSB1cm5Db21wb25lbnRzO1xuICAgICAgICB1dWlkQ29tcG9uZW50cy51dWlkID0gdXVpZENvbXBvbmVudHMubnNzO1xuICAgICAgICB1dWlkQ29tcG9uZW50cy5uc3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghb3B0aW9ucy50b2xlcmFudCAmJiAoIXV1aWRDb21wb25lbnRzLnV1aWQgfHwgIXV1aWRDb21wb25lbnRzLnV1aWQubWF0Y2goVVVJRCkpKSB7XG4gICAgICAgICAgICB1dWlkQ29tcG9uZW50cy5lcnJvciA9IHV1aWRDb21wb25lbnRzLmVycm9yIHx8IFwiVVVJRCBpcyBub3QgdmFsaWQuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHV1aWRDb21wb25lbnRzO1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiBmdW5jdGlvbiBzZXJpYWxpemUodXVpZENvbXBvbmVudHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHVybkNvbXBvbmVudHMgPSB1dWlkQ29tcG9uZW50cztcbiAgICAgICAgLy9ub3JtYWxpemUgVVVJRFxuICAgICAgICB1cm5Db21wb25lbnRzLm5zcyA9ICh1dWlkQ29tcG9uZW50cy51dWlkIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiB1cm5Db21wb25lbnRzO1xuICAgIH1cbn07XG5cblNDSEVNRVNbaGFuZGxlci5zY2hlbWVdID0gaGFuZGxlcjtcblNDSEVNRVNbaGFuZGxlciQxLnNjaGVtZV0gPSBoYW5kbGVyJDE7XG5TQ0hFTUVTW2hhbmRsZXIkMi5zY2hlbWVdID0gaGFuZGxlciQyO1xuU0NIRU1FU1toYW5kbGVyJDMuc2NoZW1lXSA9IGhhbmRsZXIkMztcblNDSEVNRVNbaGFuZGxlciQ0LnNjaGVtZV0gPSBoYW5kbGVyJDQ7XG5TQ0hFTUVTW2hhbmRsZXIkNS5zY2hlbWVdID0gaGFuZGxlciQ1O1xuU0NIRU1FU1toYW5kbGVyJDYuc2NoZW1lXSA9IGhhbmRsZXIkNjtcblxuZXhwb3J0cy5TQ0hFTUVTID0gU0NIRU1FUztcbmV4cG9ydHMucGN0RW5jQ2hhciA9IHBjdEVuY0NoYXI7XG5leHBvcnRzLnBjdERlY0NoYXJzID0gcGN0RGVjQ2hhcnM7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLnJlbW92ZURvdFNlZ21lbnRzID0gcmVtb3ZlRG90U2VnbWVudHM7XG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcbmV4cG9ydHMucmVzb2x2ZUNvbXBvbmVudHMgPSByZXNvbHZlQ29tcG9uZW50cztcbmV4cG9ydHMucmVzb2x2ZSA9IHJlc29sdmU7XG5leHBvcnRzLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZTtcbmV4cG9ydHMuZXF1YWwgPSBlcXVhbDtcbmV4cG9ydHMuZXNjYXBlQ29tcG9uZW50ID0gZXNjYXBlQ29tcG9uZW50O1xuZXhwb3J0cy51bmVzY2FwZUNvbXBvbmVudCA9IHVuZXNjYXBlQ29tcG9uZW50O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXJpLmFsbC5qcy5tYXBcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuNC4xIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiZcblx0XHQhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0IW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChcblx0XHRmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC5zZWxmID09PSBmcmVlR2xvYmFsXG5cdCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW15cXHgyMC1cXHg3RV0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cblx0LyoqIEVycm9yIG1lc3NhZ2VzICovXG5cdGVycm9ycyA9IHtcblx0XHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHRcdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcblx0fSxcblxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5cdGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbixcblx0Zmxvb3IgPSBNYXRoLmZsb29yLFxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxuXG5cdC8qKiBUZW1wb3JhcnkgdmFyaWFibGUgKi9cblx0a2V5O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG5cdCAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcblx0ICogaXRlbS5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwKGFycmF5LCBmbikge1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXHRcdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3Mgb3IgZW1haWxcblx0ICogYWRkcmVzc2VzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcblx0ICogY2hhcmFjdGVyLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFja1xuXHQgKiBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcERvbWFpbihzdHJpbmcsIGZuKSB7XG5cdFx0dmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XG5cdFx0dmFyIHJlc3VsdCA9ICcnO1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG5cdFx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdFx0cmVzdWx0ID0gcGFydHNbMF0gKyAnQCc7XG5cdFx0XHRzdHJpbmcgPSBwYXJ0c1sxXTtcblx0XHR9XG5cdFx0Ly8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuXHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG5cdFx0dmFyIGxhYmVscyA9IHN0cmluZy5zcGxpdCgnLicpO1xuXHRcdHZhciBlbmNvZGVkID0gbWFwKGxhYmVscywgZm4pLmpvaW4oJy4nKTtcblx0XHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG5cdCAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcblx0ICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2hcblx0ICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG5cdCAqIG1hdGNoaW5nIFVURi0xNi5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5lbmNvZGVgXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBkZWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cblx0ICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGNvdW50ZXIgPSAwLFxuXHRcdCAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuXHRcdCAgICB2YWx1ZSxcblx0XHQgICAgZXh0cmE7XG5cdFx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdFx0Ly8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG5cdFx0XHRcdGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcblx0XHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG5cdFx0XHRcdFx0Ly8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzdHJpbmcgYmFzZWQgb24gYW4gYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGVuY29kZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdFx0cmV0dXJuIG1hcChhcnJheSwgZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHRcdGlmICh2YWx1ZSA+IDB4RkZGRikge1xuXHRcdFx0XHR2YWx1ZSAtPSAweDEwMDAwO1xuXHRcdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdFx0dmFsdWUgPSAweERDMDAgfCB2YWx1ZSAmIDB4M0ZGO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cblx0ICogQHNlZSBgZGlnaXRUb0Jhc2ljKClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50IChmb3IgdXNlIGluXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcblx0ICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XG5cdFx0aWYgKGNvZGVQb2ludCAtIDQ4IDwgMTApIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSAyMjtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDY1IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA2NTtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDk3IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA5Nztcblx0XHR9XG5cdFx0cmV0dXJuIGJhc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3Jcblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2Vcblx0ICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG5cdCAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG5cdCAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG5cdCAqL1xuXHRmdW5jdGlvbiBkaWdpdFRvQmFzaWMoZGlnaXQsIGZsYWcpIHtcblx0XHQvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuXHRcdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRcdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XG5cdH1cblxuXHQvKipcblx0ICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cblx0ICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHRcdHZhciBrID0gMDtcblx0XHRkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuXHRcdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0XHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuXHRcdFx0ZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuXHQgKiBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcblx0XHQvLyBEb24ndCB1c2UgVUNTLTJcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLFxuXHRcdCAgICBvdXQsXG5cdFx0ICAgIGkgPSAwLFxuXHRcdCAgICBuID0gaW5pdGlhbE4sXG5cdFx0ICAgIGJpYXMgPSBpbml0aWFsQmlhcyxcblx0XHQgICAgYmFzaWMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIGluZGV4LFxuXHRcdCAgICBvbGRpLFxuXHRcdCAgICB3LFxuXHRcdCAgICBrLFxuXHRcdCAgICBkaWdpdCxcblx0XHQgICAgdCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGJhc2VNaW51c1Q7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiBsZXQgYGJhc2ljYCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IGNvZGVcblx0XHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHRcdC8vIHRoZSBmaXJzdCBiYXNpYyBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LlxuXG5cdFx0YmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRcdGlmIChiYXNpYyA8IDApIHtcblx0XHRcdGJhc2ljID0gMDtcblx0XHR9XG5cblx0XHRmb3IgKGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuXHRcdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0XHRpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAweDgwKSB7XG5cdFx0XHRcdGVycm9yKCdub3QtYmFzaWMnKTtcblx0XHRcdH1cblx0XHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcblx0XHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdFx0Zm9yIChpbmRleCA9IGJhc2ljID4gMCA/IGJhc2ljICsgMSA6IDA7IGluZGV4IDwgaW5wdXRMZW5ndGg7IC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi8pIHtcblxuXHRcdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxuXHRcdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdFx0Ly8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcblx0XHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXG5cdFx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdFx0Zm9yIChvbGRpID0gaSwgdyA9IDEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXG5cdFx0XHRcdGlmIChpbmRleCA+PSBpbnB1dExlbmd0aCkge1xuXHRcdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0IDwgdCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0ID0gb3V0cHV0Lmxlbmd0aCArIDE7XG5cdFx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcblx0XHRcdC8vIGluY3JlbWVudGluZyBgbmAgZWFjaCB0aW1lLCBzbyB3ZSdsbCBmaXggdGhhdCBub3c6XG5cdFx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdFx0aSAlPSBvdXQ7XG5cblx0XHRcdC8vIEluc2VydCBgbmAgYXQgcG9zaXRpb24gYGlgIG9mIHRoZSBvdXRwdXRcblx0XHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1Y3MyZW5jb2RlKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcblx0ICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZW5jb2RlKGlucHV0KSB7XG5cdFx0dmFyIG4sXG5cdFx0ICAgIGRlbHRhLFxuXHRcdCAgICBoYW5kbGVkQ1BDb3VudCxcblx0XHQgICAgYmFzaWNMZW5ndGgsXG5cdFx0ICAgIGJpYXMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIG0sXG5cdFx0ICAgIHEsXG5cdFx0ICAgIGssXG5cdFx0ICAgIHQsXG5cdFx0ICAgIGN1cnJlbnRWYWx1ZSxcblx0XHQgICAgb3V0cHV0ID0gW10sXG5cdFx0ICAgIC8qKiBgaW5wdXRMZW5ndGhgIHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIGBpbnB1dGAuICovXG5cdFx0ICAgIGlucHV0TGVuZ3RoLFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgaGFuZGxlZENQQ291bnRQbHVzT25lLFxuXHRcdCAgICBiYXNlTWludXNULFxuXHRcdCAgICBxTWludXNUO1xuXG5cdFx0Ly8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gVW5pY29kZVxuXHRcdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0XHQvLyBDYWNoZSB0aGUgbGVuZ3RoXG5cdFx0aW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cblx0XHQvLyBJbml0aWFsaXplIHRoZSBzdGF0ZVxuXHRcdG4gPSBpbml0aWFsTjtcblx0XHRkZWx0YSA9IDA7XG5cdFx0YmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50c1xuXHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblxuXHRcdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHRcdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHRcdC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIC0gaWYgaXQgaXMgbm90IGVtcHR5IC0gd2l0aCBhIGRlbGltaXRlclxuXHRcdGlmIChiYXNpY0xlbmd0aCkge1xuXHRcdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGVuY29kaW5nIGxvb3A6XG5cdFx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdFx0Ly8gbGFyZ2VyIG9uZTpcblx0XHRcdGZvciAobSA9IG1heEludCwgaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuXHRcdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdFx0Ly8gYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3dcblx0XHRcdGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRcdGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuXHRcdFx0biA9IG07XG5cblx0XHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT0gbikge1xuXHRcdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyXG5cdFx0XHRcdFx0Zm9yIChxID0gZGVsdGEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXHRcdFx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cdFx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRxTWludXNUID0gcSAtIHQ7XG5cdFx0XHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChcblx0XHRcdFx0XHRcdFx0c3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xuXHRcdFx0XHRcdGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG5cdFx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0KytkZWx0YTtcblx0XHRcdCsrbjtcblxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3Ncblx0ICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuXHQgKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cblx0ICogY29udmVydGVkIHRvIFVuaWNvZGUuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIGNvbnZlcnQgdG8gVW5pY29kZS5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG5cdCAqIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvVW5pY29kZShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3MgdG9cblx0ICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG5cdCAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuXHQgKiBBU0NJSS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG5cdCAqIFVuaWNvZGUgc3RyaW5nLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG5cdCAqIGVtYWlsIGFkZHJlc3MuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0FTQ0lJKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyAneG4tLScgKyBlbmNvZGUoc3RyaW5nKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cblx0cHVueWNvZGUgPSB7XG5cdFx0LyoqXG5cdFx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFB1bnljb2RlLmpzIHZlcnNpb24gbnVtYmVyLlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdCd2ZXJzaW9uJzogJzEuNC4xJyxcblx0XHQvKipcblx0XHQgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuXHRcdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdFx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgT2JqZWN0XG5cdFx0ICovXG5cdFx0J3VjczInOiB7XG5cdFx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdFx0fSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiBlbmNvZGUsXG5cdFx0J3RvQVNDSUknOiB0b0FTQ0lJLFxuXHRcdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcblx0fTtcblxuXHQvKiogRXhwb3NlIGBwdW55Y29kZWAgKi9cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoJ3B1bnljb2RlJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcHVueWNvZGU7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSkge1xuXHRcdGlmIChtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cykge1xuXHRcdFx0Ly8gaW4gTm9kZS5qcywgaW8uanMsIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gcHVueWNvZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKGtleSBpbiBwdW55Y29kZSkge1xuXHRcdFx0XHRwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnB1bnljb2RlID0gcHVueWNvZGU7XG5cdH1cblxufSh0aGlzKSk7XG4iLCIvKlxuICogQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbiAqIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4gKiBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4gKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1JcbiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZS8nKTtcblxuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLypcbiAqIGRlZmluZSB0aGVzZSBoZXJlIHNvIGF0IGxlYXN0IHRoZXkgb25seSBoYXZlIHRvIGJlXG4gKiBjb21waWxlZCBvbmNlIG9uIHRoZSBmaXJzdCBtb2R1bGUgbG9hZC5cbiAqL1xudmFyIHByb3RvY29sUGF0dGVybiA9IC9eKFthLXowLTkuKy1dKzopL2ksXG4gIHBvcnRQYXR0ZXJuID0gLzpbMC05XSokLyxcblxuICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gIHNpbXBsZVBhdGhQYXR0ZXJuID0gL14oXFwvXFwvPyg/IVxcLylbXj9cXHNdKikoXFw/W15cXHNdKik/JC8sXG5cbiAgLypcbiAgICogUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgICogV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgICovXG4gIGRlbGltcyA9IFtcbiAgICAnPCcsICc+JywgJ1wiJywgJ2AnLCAnICcsICdcXHInLCAnXFxuJywgJ1xcdCdcbiAgXSxcblxuICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuICB1bndpc2UgPSBbXG4gICAgJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ1xuICBdLmNvbmNhdChkZWxpbXMpLFxuXG4gIC8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbiAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gIC8qXG4gICAqIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gICAqIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2VcbiAgICogYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gICAqIHRoZW0uXG4gICAqL1xuICBub25Ib3N0Q2hhcnMgPSBbXG4gICAgJyUnLCAnLycsICc/JywgJzsnLCAnIydcbiAgXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gIGhvc3RFbmRpbmdDaGFycyA9IFtcbiAgICAnLycsICc/JywgJyMnXG4gIF0sXG4gIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bK2EtejAtOUEtWl8tXXswLDYzfSQvLFxuICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4gIHVuc2FmZVByb3RvY29sID0ge1xuICAgIGphdmFzY3JpcHQ6IHRydWUsXG4gICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICB9LFxuICAvLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG4gIGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gICAgamF2YXNjcmlwdDogdHJ1ZSxcbiAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gIH0sXG4gIC8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuICBzbGFzaGVkUHJvdG9jb2wgPSB7XG4gICAgaHR0cDogdHJ1ZSxcbiAgICBodHRwczogdHJ1ZSxcbiAgICBmdHA6IHRydWUsXG4gICAgZ29waGVyOiB0cnVlLFxuICAgIGZpbGU6IHRydWUsXG4gICAgJ2h0dHA6JzogdHJ1ZSxcbiAgICAnaHR0cHM6JzogdHJ1ZSxcbiAgICAnZnRwOic6IHRydWUsXG4gICAgJ2dvcGhlcjonOiB0cnVlLFxuICAgICdmaWxlOic6IHRydWVcbiAgfSxcbiAgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxcycpO1xuXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgJiYgdHlwZW9mIHVybCA9PT0gJ29iamVjdCcgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSB7IHJldHVybiB1cmw7IH1cblxuICB2YXIgdSA9IG5ldyBVcmwoKTtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiB1cmwpO1xuICB9XG5cbiAgLypcbiAgICogQ29weSBjaHJvbWUsIElFLCBvcGVyYSBiYWNrc2xhc2gtaGFuZGxpbmcgYmVoYXZpb3IuXG4gICAqIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuICAgKiBTZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yNTkxNlxuICAgKi9cbiAgdmFyIHF1ZXJ5SW5kZXggPSB1cmwuaW5kZXhPZignPycpLFxuICAgIHNwbGl0dGVyID0gcXVlcnlJbmRleCAhPT0gLTEgJiYgcXVlcnlJbmRleCA8IHVybC5pbmRleE9mKCcjJykgPyAnPycgOiAnIycsXG4gICAgdVNwbGl0ID0gdXJsLnNwbGl0KHNwbGl0dGVyKSxcbiAgICBzbGFzaFJlZ2V4ID0gL1xcXFwvZztcbiAgdVNwbGl0WzBdID0gdVNwbGl0WzBdLnJlcGxhY2Uoc2xhc2hSZWdleCwgJy8nKTtcbiAgdXJsID0gdVNwbGl0LmpvaW4oc3BsaXR0ZXIpO1xuXG4gIHZhciByZXN0ID0gdXJsO1xuXG4gIC8qXG4gICAqIHRyaW0gYmVmb3JlIHByb2NlZWRpbmcuXG4gICAqIFRoaXMgaXMgdG8gc3VwcG9ydCBwYXJzZSBzdHVmZiBsaWtlIFwiICBodHRwOi8vZm9vLmNvbSAgXFxuXCJcbiAgICovXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICBpZiAoIXNsYXNoZXNEZW5vdGVIb3N0ICYmIHVybC5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBmYXN0IHBhdGggcmVnZXhwXG4gICAgdmFyIHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuICAgKiBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAgKiB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gICAqIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgICogaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gICAqL1xuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQC9dK0BbXkAvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJiAoc2xhc2hlcyB8fCAocHJvdG8gJiYgIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKSkge1xuXG4gICAgLypcbiAgICAgKiB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgICogdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAgKlxuICAgICAqIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAgKiB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgICAqIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgICogVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgICAqXG4gICAgICogZXg6XG4gICAgICogaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAgKiBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG4gICAgICovXG5cbiAgICAvKlxuICAgICAqIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAgKiBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuICAgICAqL1xuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSkgeyBob3N0RW5kID0gaGVjOyB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAgKiBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICAgKi9cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLypcbiAgICAgICAqIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgICAqIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICAgKi9cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE5vdyB3ZSBoYXZlIGEgcG9ydGlvbiB3aGljaCBpcyBkZWZpbml0ZWx5IHRoZSBhdXRoLlxuICAgICAqIFB1bGwgdGhhdCBvZmYuXG4gICAgICovXG4gICAgaWYgKGF0U2lnbiAhPT0gLTEpIHtcbiAgICAgIGF1dGggPSByZXN0LnNsaWNlKDAsIGF0U2lnbik7XG4gICAgICByZXN0ID0gcmVzdC5zbGljZShhdFNpZ24gKyAxKTtcbiAgICAgIHRoaXMuYXV0aCA9IGRlY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgaG9zdCBpcyB0aGUgcmVtYWluaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBub24taG9zdCBjaGFyXG4gICAgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9uSG9zdENoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKG5vbkhvc3RDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpIHsgaG9zdEVuZCA9IGhlYzsgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKSB7IGhvc3RFbmQgPSByZXN0Lmxlbmd0aDsgfVxuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8qXG4gICAgICogd2UndmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgaXMgYSBob3N0bmFtZSxcbiAgICAgKiBzbyBldmVuIGlmIGl0J3MgZW1wdHksIGl0IGhhcyB0byBiZSBwcmVzZW50LlxuICAgICAqL1xuICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuXG4gICAgLypcbiAgICAgKiBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgICAqIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgICAqL1xuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiYgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIHsgY29udGludWU7IH1cbiAgICAgICAgaWYgKCFwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgdmFyIG5ld3BhcnQgPSAnJztcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgayA9IHBhcnQubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFydC5jaGFyQ29kZUF0KGopID4gMTI3KSB7XG4gICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAqIHdlIHJlcGxhY2Ugbm9uLUFTQ0lJIGNoYXIgd2l0aCBhIHRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgKiB3ZSBuZWVkIHRoaXMgdG8gbWFrZSBzdXJlIHNpemUgb2YgaG9zdG5hbWUgaXMgbm90XG4gICAgICAgICAgICAgICAqIGJyb2tlbiBieSByZXBsYWNpbmcgbm9uLUFTQ0lJIGJ5IG5vdGhpbmdcbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLypcbiAgICAgICAqIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnljb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgICogSXQgb25seSBjb252ZXJ0cyBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgICogaGF2ZSBub24tQVNDSUkgY2hhcmFjdGVycywgaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZlxuICAgICAgICogeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0IGFscmVhZHkgaXMgQVNDSUktb25seS5cbiAgICAgICAqL1xuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8qXG4gICAgICogc3RyaXAgWyBhbmQgXSBmcm9tIHRoZSBob3N0bmFtZVxuICAgICAqIHRoZSBob3N0IGZpZWxkIHN0aWxsIHJldGFpbnMgdGhlbSwgdGhvdWdoXG4gICAgICovXG4gICAgaWYgKGlwdjZIb3N0bmFtZSkge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsIHRoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAgKiBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gICAqL1xuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvKlxuICAgICAqIEZpcnN0LCBtYWtlIDEwMCUgc3VyZSB0aGF0IGFueSBcImF1dG9Fc2NhcGVcIiBjaGFycyBnZXRcbiAgICAgKiBlc2NhcGVkLCBldmVuIGlmIGVuY29kZVVSSUNvbXBvbmVudCBkb2Vzbid0IHRoaW5rIHRoZXlcbiAgICAgKiBuZWVkIHRvIGJlLlxuICAgICAqL1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXV0b0VzY2FwZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBhZSA9IGF1dG9Fc2NhcGVbaV07XG4gICAgICBpZiAocmVzdC5pbmRleE9mKGFlKSA9PT0gLTEpIHsgY29udGludWU7IH1cbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgdmFyIGhhc2ggPSByZXN0LmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpO1xuICB9XG4gIHZhciBxbSA9IHJlc3QuaW5kZXhPZignPycpO1xuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSk7XG4gICAgdGhpcy5xdWVyeSA9IHJlc3Quc3Vic3RyKHFtICsgMSk7XG4gICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgcW0pO1xuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG4gIGlmIChyZXN0KSB7IHRoaXMucGF0aG5hbWUgPSByZXN0OyB9XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiYgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAodGhpcy5wYXRobmFtZSB8fCB0aGlzLnNlYXJjaCkge1xuICAgIHZhciBwID0gdGhpcy5wYXRobmFtZSB8fCAnJztcbiAgICB2YXIgcyA9IHRoaXMuc2VhcmNoIHx8ICcnO1xuICAgIHRoaXMucGF0aCA9IHAgKyBzO1xuICB9XG5cbiAgLy8gZmluYWxseSwgcmVjb25zdHJ1Y3QgdGhlIGhyZWYgYmFzZWQgb24gd2hhdCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gIHRoaXMuaHJlZiA9IHRoaXMuZm9ybWF0KCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZm9ybWF0IGEgcGFyc2VkIG9iamVjdCBpbnRvIGEgdXJsIHN0cmluZ1xuZnVuY3Rpb24gdXJsRm9ybWF0KG9iaikge1xuICAvKlxuICAgKiBlbnN1cmUgaXQncyBhbiBvYmplY3QsIGFuZCBub3QgYSBzdHJpbmcgdXJsLlxuICAgKiBJZiBpdCdzIGFuIG9iaiwgdGhpcyBpcyBhIG5vLW9wLlxuICAgKiB0aGlzIHdheSwgeW91IGNhbiBjYWxsIHVybF9mb3JtYXQoKSBvbiBzdHJpbmdzXG4gICAqIHRvIGNsZWFuIHVwIHBvdGVudGlhbGx5IHdvbmt5IHVybHMuXG4gICAqL1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHsgb2JqID0gdXJsUGFyc2Uob2JqKTsgfVxuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSB7IHJldHVybiBVcmwucHJvdG90eXBlLmZvcm1hdC5jYWxsKG9iaik7IH1cbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhdXRoID0gdGhpcy5hdXRoIHx8ICcnO1xuICBpZiAoYXV0aCkge1xuICAgIGF1dGggPSBlbmNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgYXV0aCA9IGF1dGgucmVwbGFjZSgvJTNBL2ksICc6Jyk7XG4gICAgYXV0aCArPSAnQCc7XG4gIH1cblxuICB2YXIgcHJvdG9jb2wgPSB0aGlzLnByb3RvY29sIHx8ICcnLFxuICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgIGhvc3QgPSBmYWxzZSxcbiAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID8gdGhpcy5ob3N0bmFtZSA6ICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHR5cGVvZiB0aGlzLnF1ZXJ5ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5LCB7XG4gICAgICBhcnJheUZvcm1hdDogJ3JlcGVhdCcsXG4gICAgICBhZGRRdWVyeVByZWZpeDogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCB8fCAocXVlcnkgJiYgKCc/JyArIHF1ZXJ5KSkgfHwgJyc7XG5cbiAgaWYgKHByb3RvY29sICYmIHByb3RvY29sLnN1YnN0cigtMSkgIT09ICc6JykgeyBwcm90b2NvbCArPSAnOic7IH1cblxuICAvKlxuICAgKiBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgICogdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgICovXG4gIGlmICh0aGlzLnNsYXNoZXMgfHwgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykgeyBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lOyB9XG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJyc7XG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoLmNoYXJBdCgwKSAhPT0gJyMnKSB7IGhhc2ggPSAnIycgKyBoYXNoOyB9XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSB7IHNlYXJjaCA9ICc/JyArIHNlYXJjaDsgfVxuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoKTtcbiAgfSk7XG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIHJldHVybiBwcm90b2NvbCArIGhvc3QgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiAocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgeyByZXR1cm4gcmVsYXRpdmU7IH1cbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmVPYmplY3QocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbiAocmVsYXRpdmUpIHtcbiAgaWYgKHR5cGVvZiByZWxhdGl2ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLypcbiAgICogaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gICAqIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICAgKi9cbiAgcmVzdWx0Lmhhc2ggPSByZWxhdGl2ZS5oYXNoO1xuXG4gIC8vIGlmIHRoZSByZWxhdGl2ZSB1cmwgaXMgZW1wdHksIHRoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gaGVyZS5cbiAgaWYgKHJlbGF0aXZlLmhyZWYgPT09ICcnKSB7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGhyZWZzIGxpa2UgLy9mb28vYmFyIGFsd2F5cyBjdXQgdG8gdGhlIHByb3RvY29sLlxuICBpZiAocmVsYXRpdmUuc2xhc2hlcyAmJiAhcmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAvLyB0YWtlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBwcm90b2NvbCBmcm9tIHJlbGF0aXZlXG4gICAgdmFyIHJrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgIGZvciAodmFyIHJrID0gMDsgcmsgPCBya2V5cy5sZW5ndGg7IHJrKyspIHtcbiAgICAgIHZhciBya2V5ID0gcmtleXNbcmtdO1xuICAgICAgaWYgKHJrZXkgIT09ICdwcm90b2NvbCcpIHsgcmVzdWx0W3JrZXldID0gcmVsYXRpdmVbcmtleV07IH1cbiAgICB9XG5cbiAgICAvLyB1cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiYgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8qXG4gICAgICogaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgICAqIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgICAqIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgICAqIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgICogdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgICAqIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgICogYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgICogYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgICAqL1xuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKSB7IH1cbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgeyByZWxhdGl2ZS5ob3N0ID0gJyc7IH1cbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHsgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJzsgfVxuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSB7IHJlbFBhdGgudW5zaGlmdCgnJyk7IH1cbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHsgcmVsUGF0aC51bnNoaWZ0KCcnKTsgfVxuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nLFxuICAgIGlzUmVsQWJzID0gcmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyxcbiAgICBtdXN0RW5kQWJzID0gaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSxcbiAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgIHJlbFBhdGggPSByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLypcbiAgICogaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAgKiBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gICAqIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgICogcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgICogTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gICAqL1xuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSB7IHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDsgfSBlbHNlIHsgc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTsgfVxuICAgIH1cbiAgICByZXN1bHQuaG9zdCA9ICcnO1xuICAgIGlmIChyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgPSBudWxsO1xuICAgICAgcmVsYXRpdmUucG9ydCA9IG51bGw7XG4gICAgICBpZiAocmVsYXRpdmUuaG9zdCkge1xuICAgICAgICBpZiAocmVsUGF0aFswXSA9PT0gJycpIHsgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7IH0gZWxzZSB7IHJlbFBhdGgudW5zaGlmdChyZWxhdGl2ZS5ob3N0KTsgfVxuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJyA/IHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycgPyByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLypcbiAgICAgKiBpdCdzIHJlbGF0aXZlXG4gICAgICogdGhyb3cgYXdheSB0aGUgZXhpc3RpbmcgZmlsZSwgYW5kIHRha2UgdGhlIG5ldyBwYXRoIGluc3RlYWQuXG4gICAgICovXG4gICAgaWYgKCFzcmNQYXRoKSB7IHNyY1BhdGggPSBbXTsgfVxuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAocmVsYXRpdmUuc2VhcmNoICE9IG51bGwpIHtcbiAgICAvKlxuICAgICAqIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAgKiBsaWtlIGhyZWY9Jz9mb28nLlxuICAgICAqIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgICAqL1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3Q7XG4gICAgICAvKlxuICAgICAgICogb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgICAqIHRoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgICAqIHVybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgICovXG4gICAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgPyByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgIT09IG51bGwgfHwgcmVzdWx0LnNlYXJjaCAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICsgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIC8qXG4gICAgICogbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgICAqIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgICovXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQuc2VhcmNoKSB7XG4gICAgICByZXN1bHQucGF0aCA9ICcvJyArIHJlc3VsdC5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqIGlmIGEgdXJsIEVORHMgaW4gLiBvciAuLiwgdGhlbiBpdCBtdXN0IGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICAgKiBob3dldmVyLCBpZiBpdCBlbmRzIGluIGFueXRoaW5nIGVsc2Ugbm9uLXNsYXNoeSxcbiAgICogdGhlbiBpdCBtdXN0IE5PVCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgICovXG4gIHZhciBsYXN0ID0gc3JjUGF0aC5zbGljZSgtMSlbMF07XG4gIHZhciBoYXNUcmFpbGluZ1NsYXNoID0gKHJlc3VsdC5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgfHwgc3JjUGF0aC5sZW5ndGggPiAxKSAmJiAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnO1xuXG4gIC8qXG4gICAqIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgICogaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgICovXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJiAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fCAoc3JjUGF0aFswXSAmJiBzcmNQYXRoWzBdLmNoYXJBdCgwKSA9PT0gJy8nKTtcblxuICAvLyBwdXQgdGhlIGhvc3QgYmFja1xuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gaXNBYnNvbHV0ZSA/ICcnIDogc3JjUGF0aC5sZW5ndGggPyBzcmNQYXRoLnNoaWZ0KCkgOiAnJztcbiAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZTtcbiAgICAvKlxuICAgICAqIG9jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICogdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAqIHVybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAqL1xuICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/IHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChzcmNQYXRoLmxlbmd0aCA+IDApIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfVxuXG4gIC8vIHRvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmIChyZXN1bHQucGF0aG5hbWUgIT09IG51bGwgfHwgcmVzdWx0LnNlYXJjaCAhPT0gbnVsbCkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgfVxuICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGggfHwgcmVzdWx0LmF1dGg7XG4gIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyKDAsIGhvc3QubGVuZ3RoIC0gcG9ydC5sZW5ndGgpO1xuICB9XG4gIGlmIChob3N0KSB7IHRoaXMuaG9zdG5hbWUgPSBob3N0OyB9XG59O1xuXG5leHBvcnRzLnBhcnNlID0gdXJsUGFyc2U7XG5leHBvcnRzLnJlc29sdmUgPSB1cmxSZXNvbHZlO1xuZXhwb3J0cy5yZXNvbHZlT2JqZWN0ID0gdXJsUmVzb2x2ZU9iamVjdDtcbmV4cG9ydHMuZm9ybWF0ID0gdXJsRm9ybWF0O1xuXG5leHBvcnRzLlVybCA9IFVybDtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsImltcG9ydCB7IG1hcCBhcyBldmVudFN0cmVhbU1hcCB9IGZyb20gJ2V2ZW50LXN0cmVhbSc7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJztcbmltcG9ydCB7IFBhcmFtLCBQb3N0RGF0YUNvbW1vbiwgUmVxdWVzdCBhcyBOcG1IYXJSZXF1ZXN0IH0gZnJvbSAnaGFyLWZvcm1hdCc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgYXMgcXVlcnlTdHJpbmdpZnkgfSBmcm9tICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgeyBmb3JtYXQgYXMgdXJsRm9ybWF0LCBwYXJzZSBhcyB1cmxQYXJzZSwgVXJsV2l0aFBhcnNlZFF1ZXJ5IH0gZnJvbSAndXJsJztcblxuaW1wb3J0IHsgZm9ybURhdGFJdGVyYXRvciwgaXNCbG9iIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm0tZGF0YSc7XG5pbXBvcnQgeyB2YWxpZGF0ZUhhclJlcXVlc3QgfSBmcm9tICcuL2hlbHBlcnMvaGFyLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBnZXRIZWFkZXJOYW1lIH0gZnJvbSAnLi9oZWxwZXJzL2hlYWRlcnMnO1xuaW1wb3J0IHsgUmVkdWNlZEhlbHBlck9iamVjdCwgcmVkdWNlciB9IGZyb20gJy4vaGVscGVycy9yZWR1Y2VyJztcbmltcG9ydCB7IENsaWVudElkLCBUYXJnZXRJZCwgdGFyZ2V0cyB9IGZyb20gJy4vdGFyZ2V0cy90YXJnZXRzJztcblxuZXhwb3J0IHsgYXZhaWxhYmxlVGFyZ2V0cywgZXh0bmFtZSB9IGZyb20gJy4vaGVscGVycy91dGlscyc7XG5leHBvcnQgeyBhZGRUYXJnZXQsIGFkZFRhcmdldENsaWVudCB9IGZyb20gJy4vdGFyZ2V0cy90YXJnZXRzJztcblxuY29uc3QgREVCVUdfTU9ERSA9IGZhbHNlO1xuXG5jb25zdCBkZWJ1ZyA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvbiAtLSBpbnRlbnRpb25hbCBub29wXG4gIGluZm86IERFQlVHX01PREUgPyBjb25zb2xlLmluZm8gOiAoKSA9PiB7fSxcbn07XG5cbi8qKiBpcyB0aGlzIHdyb25nPyAgeWVzLiAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjIChodHRwOi8vd3d3LnNvZnR3YXJlaXNoYXJkLmNvbS9ibG9nL2hhci0xMi1zcGVjLyNwb3N0RGF0YSkgaXQncyB0ZWNobmljYWxseSB3cm9uZyBzaW5jZSBgcGFyYW1zYCBhbmQgYHRleHRgIGFyZSAoYnkgdGhlIHNwZWMpIG11dHVhbGx5IGV4Y2x1c2l2ZS4gIEhvd2V2ZXIsIGluIHByYWN0aWNlLCB0aGlzIGlzIG5vdCB3aGF0IGlzIG9mdGVuIHRoZSBjYXNlLlxuICpcbiAqIEluIGdlbmVyYWwsIHRoaXMgbGlicmFyeSB0YWtlcyBhIF9kZXNjcmlwdGl2ZV8gcmF0aGVyIHRoYW4gX3BlcnNjcmlwdGl2ZV8gYXBwcm9hY2ggKHNlZSBodHRwczovL2FteXJleS53ZWIudW5jLmVkdS9jbGFzc2VzL2xpbmctMTAxLW9ubGluZS90dXRvcmlhbHMvdW5kZXJzdGFuZGluZy1wcmVzY3JpcHRpdmUtdnMtZGVzY3JpcHRpdmUtZ3JhbW1hci8pLlxuICpcbiAqIFRoZW4sIGluIGFkZGl0aW9uIHRvIHRoYXQsIGl0IHJlYWxseSBhZGRzIHRvIGNvbXBsZXhpdHkgd2l0aCBUeXBlU2NyaXB0IChUeXBlU2NyaXB0IHRha2VzIHRoaXMgY29uc3RyYWludCB2ZXJ5IHZlcnkgc2VyaW91c2x5KSBpbiBhIHdheSB0aGF0J3Mgbm90IGFjdHVhbGx5IHN1cGVyIHVzZWZ1bC4gIFNvLCB3ZSB0cmVhdCB0aGlzIG9iamVjdCBhcyB0aG91Z2ggaXQgY291bGQgaGF2ZSBib3RoIG9yIGVpdGhlciBvZiBgcGFyYW1zYCBhbmQvb3IgYHRleHRgLlxuICovXG50eXBlIFBvc3REYXRhQmFzZSA9IFBvc3REYXRhQ29tbW9uICYge1xuICB0ZXh0Pzogc3RyaW5nO1xuICBwYXJhbXM/OiBQYXJhbVtdO1xufTtcblxuZXhwb3J0IHR5cGUgSGFyUmVxdWVzdCA9IE9taXQ8TnBtSGFyUmVxdWVzdCwgJ3Bvc3REYXRhJz4gJiB7IHBvc3REYXRhOiBQb3N0RGF0YUJhc2UgfTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0RXh0cmFzIHtcbiAgcG9zdERhdGE6IFBvc3REYXRhQmFzZSAmIHtcbiAgICBqc29uT2JqPzogUmVkdWNlZEhlbHBlck9iamVjdDtcbiAgICBwYXJhbXNPYmo/OiBSZWR1Y2VkSGVscGVyT2JqZWN0O1xuICAgIGJvdW5kYXJ5Pzogc3RyaW5nO1xuICB9O1xuICBmdWxsVXJsOiBzdHJpbmc7XG4gIHF1ZXJ5T2JqOiBSZWR1Y2VkSGVscGVyT2JqZWN0O1xuICBoZWFkZXJzT2JqOiBSZWR1Y2VkSGVscGVyT2JqZWN0O1xuICB1cmlPYmo6IFVybFdpdGhQYXJzZWRRdWVyeTtcbiAgY29va2llc09iajogUmVkdWNlZEhlbHBlck9iamVjdDtcbiAgYWxsSGVhZGVyczogUmVkdWNlZEhlbHBlck9iamVjdDtcbn1cblxuZXhwb3J0IHR5cGUgUmVxdWVzdCA9IEhhclJlcXVlc3QgJiBSZXF1ZXN0RXh0cmFzO1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICByZXF1ZXN0OiBQYXJ0aWFsPEhhclJlcXVlc3Q+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhckVudHJ5IHtcbiAgbG9nOiB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGNyZWF0b3I6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZlcnNpb246IHN0cmluZztcbiAgICB9O1xuICAgIGVudHJpZXM6IEVudHJ5W107XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBpc0hhckVudHJ5ID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBIYXJFbnRyeSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICdsb2cnIGluIHZhbHVlICYmXG4gIHR5cGVvZiB2YWx1ZS5sb2cgPT09ICdvYmplY3QnICYmXG4gICdlbnRyaWVzJyBpbiB2YWx1ZS5sb2cgJiZcbiAgQXJyYXkuaXNBcnJheSh2YWx1ZS5sb2cuZW50cmllcyk7XG5cbmV4cG9ydCBjbGFzcyBIVFRQU25pcHBldCB7XG4gIHJlcXVlc3RzOiBSZXF1ZXN0W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogSGFyRW50cnkgfCBIYXJSZXF1ZXN0KSB7XG4gICAgbGV0IGVudHJpZXM6IEVudHJ5W10gPSBbXTtcblxuICAgIC8vIHByZXAgdGhlIG1haW4gY29udGFpbmVyXG4gICAgdGhpcy5yZXF1ZXN0cyA9IFtdO1xuXG4gICAgLy8gaXMgaXQgaGFyP1xuICAgIGlmIChpc0hhckVudHJ5KGlucHV0KSkge1xuICAgICAgZW50cmllcyA9IGlucHV0LmxvZy5lbnRyaWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRyaWVzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgcmVxdWVzdDogaW5wdXQsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGVudHJpZXMuZm9yRWFjaCgoeyByZXF1ZXN0IH0pID0+IHtcbiAgICAgIC8vIGFkZCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIG1ha2UgdmFsaWRhdGlvbiBzdWNjZXNzZnVsXG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIGJvZHlTaXplOiAwLFxuICAgICAgICBoZWFkZXJzU2l6ZTogMCxcbiAgICAgICAgaGVhZGVyczogW10sXG4gICAgICAgIGNvb2tpZXM6IFtdLFxuICAgICAgICBodHRwVmVyc2lvbjogJ0hUVFAvMS4xJyxcbiAgICAgICAgcXVlcnlTdHJpbmc6IFtdLFxuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICBwb3N0RGF0YTogcmVxdWVzdD8ucG9zdERhdGEgfHwge1xuICAgICAgICAgIG1pbWVUeXBlOiByZXF1ZXN0LnBvc3REYXRhPy5taW1lVHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGlmICh2YWxpZGF0ZUhhclJlcXVlc3QocmVxKSkge1xuICAgICAgICB0aGlzLnJlcXVlc3RzLnB1c2godGhpcy5wcmVwYXJlKHJlcSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJlcGFyZSA9IChoYXJSZXF1ZXN0OiBIYXJSZXF1ZXN0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdDogUmVxdWVzdCA9IHtcbiAgICAgIC4uLmhhclJlcXVlc3QsXG4gICAgICBmdWxsVXJsOiAnJyxcbiAgICAgIHVyaU9iajoge30gYXMgVXJsV2l0aFBhcnNlZFF1ZXJ5LFxuICAgICAgcXVlcnlPYmo6IHt9LFxuICAgICAgaGVhZGVyc09iajoge30sXG4gICAgICBjb29raWVzT2JqOiB7fSxcbiAgICAgIGFsbEhlYWRlcnM6IHt9LFxuICAgIH07XG5cbiAgICAvLyBjb25zdHJ1Y3QgcXVlcnkgb2JqZWN0c1xuICAgIGlmIChyZXF1ZXN0LnF1ZXJ5U3RyaW5nICYmIHJlcXVlc3QucXVlcnlTdHJpbmcubGVuZ3RoKSB7XG4gICAgICBkZWJ1Zy5pbmZvKCdxdWVyeVN0cmluZyBmb3VuZCwgY29uc3RydWN0aW5nIHF1ZXJ5U3RyaW5nIHBhaXIgbWFwJyk7XG5cbiAgICAgIHJlcXVlc3QucXVlcnlPYmogPSByZXF1ZXN0LnF1ZXJ5U3RyaW5nLnJlZHVjZShyZWR1Y2VyLCB7fSk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGhlYWRlcnMgb2JqZWN0c1xuICAgIGlmIChyZXF1ZXN0LmhlYWRlcnMgJiYgcmVxdWVzdC5oZWFkZXJzLmxlbmd0aCkge1xuICAgICAgY29uc3QgaHR0cDJWZXJzaW9uUmVnZXggPSAvXkhUVFBcXC8yLztcbiAgICAgIHJlcXVlc3QuaGVhZGVyc09iaiA9IHJlcXVlc3QuaGVhZGVycy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCB7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZSA9IGh0dHAyVmVyc2lvblJlZ2V4LmV4ZWMocmVxdWVzdC5odHRwVmVyc2lvbilcbiAgICAgICAgICA/IG5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgIDogbmFtZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY2N1bXVsYXRvcixcbiAgICAgICAgICBbaGVhZGVyTmFtZV06IHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBoZWFkZXJzIG9iamVjdHNcbiAgICBpZiAocmVxdWVzdC5jb29raWVzICYmIHJlcXVlc3QuY29va2llcy5sZW5ndGgpIHtcbiAgICAgIHJlcXVlc3QuY29va2llc09iaiA9IHJlcXVlc3QuY29va2llcy5yZWR1Y2VSaWdodChcbiAgICAgICAgKGFjY3VtdWxhdG9yLCB7IG5hbWUsIHZhbHVlIH0pID0+ICh7XG4gICAgICAgICAgLi4uYWNjdW11bGF0b3IsXG4gICAgICAgICAgW25hbWVdOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICAgIHt9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgQ29va2llIGhlYWRlclxuICAgIGNvbnN0IGNvb2tpZXMgPSByZXF1ZXN0LmNvb2tpZXM/Lm1hcChcbiAgICAgICh7IG5hbWUsIHZhbHVlIH0pID0+IGAke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfWAsXG4gICAgKTtcblxuICAgIGlmIChjb29raWVzPy5sZW5ndGgpIHtcbiAgICAgIHJlcXVlc3QuYWxsSGVhZGVycy5jb29raWUgPSBjb29raWVzLmpvaW4oJzsgJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXF1ZXN0Py5wb3N0RGF0YS5taW1lVHlwZSkge1xuICAgICAgY2FzZSAnbXVsdGlwYXJ0L21peGVkJzpcbiAgICAgIGNhc2UgJ211bHRpcGFydC9yZWxhdGVkJzpcbiAgICAgIGNhc2UgJ211bHRpcGFydC9mb3JtLWRhdGEnOlxuICAgICAgY2FzZSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzpcbiAgICAgICAgLy8gcmVzZXQgdmFsdWVzXG4gICAgICAgIHJlcXVlc3QucG9zdERhdGEudGV4dCA9ICcnO1xuICAgICAgICByZXF1ZXN0LnBvc3REYXRhLm1pbWVUeXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnBvc3REYXRhPy5wYXJhbXMpIHtcbiAgICAgICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAgICAgICAvLyBUaGUgYGZvcm0tZGF0YWAgbW9kdWxlIHJldHVybnMgb25lIG9mIHR3byB0aGluZ3M6IGEgbmF0aXZlIEZvcm1EYXRhIG9iamVjdCwgb3IgaXRzIG93biBwb2x5ZmlsbFxuICAgICAgICAgIC8vIFNpbmNlIHRoZSBwb2x5ZmlsbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmdWxsIEFQSSBvZiB0aGUgbmF0aXZlIEZvcm1EYXRhIG9iamVjdCwgd2hlbiB0aGlzIGxpYnJhcnkgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQgaXQnbGwgZmFpbCBvbiB0d28gdGhpbmdzOlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gIDEuIFRoZSBBUEkgZm9yIGBmb3JtLmFwcGVuZCgpYCBoYXMgdGhyZWUgYXJndW1lbnRzIGFuZCB0aGUgdGhpcmQgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCB3aGVuIHRoZSBzZWNvbmQgaXMgYVxuICAgICAgICAgIC8vICAgIEJsb2Igb3IgVVNWU3RyaW5nLlxuICAgICAgICAgIC8vICAxLiBgRm9ybURhdGEucGlwZSgpYCBpc24ndCBhIGZ1bmN0aW9uLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5hdGl2ZSBGb3JtRGF0YSBvYmplY3QgaXMgaXRlcmFibGUsIHdlIGVhc2lseSBkZXRlY3Qgd2hhdCB2ZXJzaW9uIG9mIGBmb3JtLWRhdGFgIHdlJ3JlIHdvcmtpbmcgd2l0aCBoZXJlIHRvIGFsbG93IGBtdWx0aXBhcnQvZm9ybS1kYXRhYCByZXF1ZXN0cyB0byBiZSBjb21waWxlZCB1bmRlciBib3RoIGJyb3dzZXIgYW5kIE5vZGUgZW52aXJvbm1lbnRzLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBoYWNrIGlzIHByZXR0eSBhd2Z1bCBidXQgaXQncyB0aGUgb25seSB3YXkgd2UgY2FuIHVzZSB0aGlzIGxpYnJhcnkgaW4gdGhlIGJyb3dzZXIgYXMgaWYgd2UgY29kZSB0aGlzIGFnYWluc3QganVzdCB0aGUgbmF0aXZlIEZvcm1EYXRhIG9iamVjdCwgd2UgY2FuJ3QgcG9seWZpbGwgdGhhdCBiYWNrIGludG8gTm9kZSBiZWNhdXNlIEJsb2IgYW5kIEZpbGUgb2JqZWN0cywgd2hpY2ggc29tZXRoaW5nIGxpa2UgYGZvcm1kYXRhLXBvbHlmaWxsYCByZXF1aXJlcywgZG9uJ3QgZXhpc3QgdGhlcmUuXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPXG4gICAgICAgICAgY29uc3QgaXNOYXRpdmVGb3JtRGF0YSA9IHR5cGVvZiBmb3JtW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG5cbiAgICAgICAgICAvLyBUT0RPOiBUSElTIEFCU09MVVRFTFkgTVVTVCBCRSBSRU1PVkVELlxuICAgICAgICAgIC8vIElUIEJSRUFLUyBTT01FIFVTRS1DQVNFUyBGT1IgTVVMVElQQVJUIEZPUk1TIFRIQVQgREVQRU5EIE9OIEJFSU5HIEFCTEUgVE8gU0VUIFRIRSBCT1VOREFSWS5cbiAgICAgICAgICAvLyBlYXN0ZXIgZWdnXG4gICAgICAgICAgY29uc3QgYm91bmRhcnkgPSAnLS0tMDExMDAwMDEwMTExMDAwMDAxMTAxMDAxJzsgLy8gdGhpcyBpcyBiaW5hcnkgZm9yIFwiYXBpXCIuIHllcC5cbiAgICAgICAgICBpZiAoIWlzTmF0aXZlRm9ybURhdGEpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVEhJUyBJUyBXUk9ORy4gIFZFUlkgV1JPTkcuXG4gICAgICAgICAgICBmb3JtLl9ib3VuZGFyeSA9IGJvdW5kYXJ5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcXVlc3QucG9zdERhdGE/LnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYXJhbS5uYW1lO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbS52YWx1ZSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyYW0uZmlsZU5hbWUgfHwgbnVsbDtcblxuICAgICAgICAgICAgaWYgKGlzTmF0aXZlRm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgaWYgKGlzQmxvYih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE9cbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9ybS5hcHBlbmQobmFtZSwgdmFsdWUsIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE9cbiAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE9cbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFyYW0uY29udGVudFR5cGUgfHwgbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoaXNOYXRpdmVGb3JtRGF0YSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkYXRhIG9mIGZvcm1EYXRhSXRlcmF0b3IoZm9ybSwgYm91bmRhcnkpKSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucG9zdERhdGEudGV4dCArPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtLnBpcGUoXG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ET1xuICAgICAgICAgICAgICBldmVudFN0cmVhbU1hcChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnBvc3REYXRhLnRleHQgKz0gZGF0YTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcXVlc3QucG9zdERhdGEuYm91bmRhcnkgPSBib3VuZGFyeTtcblxuICAgICAgICAgIC8vIFNpbmNlIGhlYWRlcnMgYXJlIGNhc2Utc2Vuc2l0aXZlIHdlIG5lZWQgdG8gc2VlIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgYENvbnRlbnQtVHlwZWAgaGVhZGVyIHRoYXQgd2UgY2FuIG92ZXJyaWRlLlxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlSGVhZGVyID1cbiAgICAgICAgICAgIGdldEhlYWRlck5hbWUocmVxdWVzdC5oZWFkZXJzT2JqLCAnY29udGVudC10eXBlJykgfHwgJ2NvbnRlbnQtdHlwZSc7XG5cbiAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNPYmpbY29udGVudFR5cGVIZWFkZXJdID0gYG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSR7Ym91bmRhcnl9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgaWYgKCFyZXF1ZXN0LnBvc3REYXRhLnBhcmFtcykge1xuICAgICAgICAgIHJlcXVlc3QucG9zdERhdGEudGV4dCA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIGBoYXItZm9ybWF0YCB0eXBlcyBtYWtlIHRoaXMgY2hhbGxlbmdpbmdcbiAgICAgICAgICByZXF1ZXN0LnBvc3REYXRhLnBhcmFtc09iaiA9IHJlcXVlc3QucG9zdERhdGEucGFyYW1zLnJlZHVjZShyZWR1Y2VyLCB7fSk7XG5cbiAgICAgICAgICAvLyBhbHdheXMgb3ZlcndyaXRlXG4gICAgICAgICAgcmVxdWVzdC5wb3N0RGF0YS50ZXh0ID0gcXVlcnlTdHJpbmdpZnkocmVxdWVzdC5wb3N0RGF0YS5wYXJhbXNPYmopO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0ZXh0L2pzb24nOlxuICAgICAgY2FzZSAndGV4dC94LWpzb24nOlxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vanNvbic6XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi94LWpzb24nOlxuICAgICAgICByZXF1ZXN0LnBvc3REYXRhLm1pbWVUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnBvc3REYXRhLnRleHQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVxdWVzdC5wb3N0RGF0YS5qc29uT2JqID0gSlNPTi5wYXJzZShyZXF1ZXN0LnBvc3REYXRhLnRleHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnLmluZm8oZSk7XG5cbiAgICAgICAgICAgIC8vIGZvcmNlIGJhY2sgdG8gYHRleHQvcGxhaW5gIGlmIGhlYWRlcnMgaGF2ZSBwcm9wZXIgY29udGVudC10eXBlIHZhbHVlLCB0aGVuIHRoaXMgc2hvdWxkIGFsc28gd29ya1xuICAgICAgICAgICAgcmVxdWVzdC5wb3N0RGF0YS5taW1lVHlwZSA9ICd0ZXh0L3BsYWluJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGFsbEhlYWRlcnMgb2JqZWN0XG4gICAgY29uc3QgYWxsSGVhZGVycyA9IHtcbiAgICAgIC4uLnJlcXVlc3QuYWxsSGVhZGVycyxcbiAgICAgIC4uLnJlcXVlc3QuaGVhZGVyc09iaixcbiAgICB9O1xuXG4gICAgY29uc3QgdXJsV2l0aFBhcnNlZFF1ZXJ5ID0gdXJsUGFyc2UocmVxdWVzdC51cmwsIHRydWUsIHRydWUpOyAvLz9cblxuICAgIC8vIHF1ZXJ5IHN0cmluZyBrZXkvdmFsdWUgcGFpcnMgaW4gd2l0aCBsaXRlcmFsIHF1ZXJ5c3RyaW5ncyBjb250YWluZCB3aXRoaW4gdGhlIHVybFxuICAgIHJlcXVlc3QucXVlcnlPYmogPSB7XG4gICAgICAuLi5yZXF1ZXN0LnF1ZXJ5T2JqLFxuICAgICAgLi4uKHVybFdpdGhQYXJzZWRRdWVyeS5xdWVyeSBhcyBSZWR1Y2VkSGVscGVyT2JqZWN0KSxcbiAgICB9OyAvLz9cblxuICAgIC8vIHJlc2V0IHVyaU9iaiB2YWx1ZXMgZm9yIGEgY2xlYW4gdXJsXG4gICAgY29uc3Qgc2VhcmNoID0gcXVlcnlTdHJpbmdpZnkocmVxdWVzdC5xdWVyeU9iaik7XG5cbiAgICBjb25zdCB1cmlPYmogPSB7XG4gICAgICAuLi51cmxXaXRoUGFyc2VkUXVlcnksXG4gICAgICBxdWVyeTogcmVxdWVzdC5xdWVyeU9iaixcbiAgICAgIHNlYXJjaCxcbiAgICAgIHBhdGg6IHNlYXJjaCA/IGAke3VybFdpdGhQYXJzZWRRdWVyeS5wYXRobmFtZX0/JHtzZWFyY2h9YCA6IHVybFdpdGhQYXJzZWRRdWVyeS5wYXRobmFtZSxcbiAgICB9O1xuXG4gICAgLy8ga2VlcCB0aGUgYmFzZSB1cmwgY2xlYW4gb2YgcXVlcnlTdHJpbmdcbiAgICBjb25zdCB1cmwgPSB1cmxGb3JtYXQoe1xuICAgICAgLi4udXJsV2l0aFBhcnNlZFF1ZXJ5LFxuICAgICAgcXVlcnk6IG51bGwsXG4gICAgICBzZWFyY2g6IG51bGwsXG4gICAgfSk7IC8vP1xuXG4gICAgY29uc3QgZnVsbFVybCA9IHVybEZvcm1hdCh7XG4gICAgICAuLi51cmxXaXRoUGFyc2VkUXVlcnksXG4gICAgICAuLi51cmlPYmosXG4gICAgfSk7IC8vP1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlcXVlc3QsXG4gICAgICBhbGxIZWFkZXJzLFxuICAgICAgZnVsbFVybCxcbiAgICAgIHVybCxcbiAgICAgIHVyaU9iaixcbiAgICB9O1xuICB9O1xuXG4gIGNvbnZlcnQgPSAodGFyZ2V0SWQ6IFRhcmdldElkLCBjbGllbnRJZD86IENsaWVudElkLCBvcHRpb25zPzogYW55KSA9PiB7XG4gICAgaWYgKCFvcHRpb25zICYmIGNsaWVudElkKSB7XG4gICAgICBvcHRpb25zID0gY2xpZW50SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0c1t0YXJnZXRJZF07XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnZlcnQgfSA9IHRhcmdldC5jbGllbnRzQnlJZFtjbGllbnRJZCB8fCB0YXJnZXQuaW5mby5kZWZhdWx0XTtcbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5yZXF1ZXN0cy5tYXAocmVxdWVzdCA9PiBjb252ZXJ0KHJlcXVlc3QsIG9wdGlvbnMpKTtcbiAgICByZXR1cm4gcmVzdWx0cy5sZW5ndGggPT09IDEgPyByZXN1bHRzWzBdIDogcmVzdWx0cztcbiAgfTtcbn1cbiJdLCJuYW1lcyI6WyJERUZBVUxUX0lOREVOVEFUSU9OX0NIQVJBQ1RFUiIsIkRFRkFVTFRfTElORV9KT0lOIiwiQ29kZUJ1aWxkZXIiLCJfY3JlYXRlQ2xhc3MiLCJfdGhpcyIsIl9yZWYiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJpbmRlbnQiLCJqb2luIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5IiwibGluZSIsImluZGVudGF0aW9uTGV2ZWwiLCJpbmRlbnRhdGlvbkNoYXJhY3RlciIsInJlcGVhdCIsImNvbmNhdCIsIm5ld0xpbmUiLCJpbmRlbnRMaW5lIiwiY29kZSIsInVuc2hpZnQiLCJwdXNoIiwidXBkYXRlZExpbmUiLCJ1bnJlcGxhY2VkQ29kZSIsImxpbmVKb2luIiwicmVwbGFjZWRPdXRwdXQiLCJwb3N0UHJvY2Vzc29ycyIsInJlZHVjZSIsImFjY3VtdWxhdG9yIiwicmVwbGFjZXIiLCJwb3N0UHJvY2Vzc29yIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiZXNjYXBlU3RyaW5nIiwicmF3VmFsdWUiLCJvcHRpb25zIiwiX29wdGlvbnMkZGVsaW1pdGVyIiwiZGVsaW1pdGVyIiwiX29wdGlvbnMkZXNjYXBlQ2hhciIsImVzY2FwZUNoYXIiLCJfb3B0aW9ucyRlc2NhcGVOZXdsaW4iLCJlc2NhcGVOZXdsaW5lcyIsInN0cmluZ1ZhbHVlIiwidG9TdHJpbmciLCJtYXAiLCJjIiwiSlNPTiIsInN0cmluZ2lmeSIsInNsaWNlIiwiZXNjYXBlRm9yU2luZ2xlUXVvdGVzIiwidmFsdWUiLCJlc2NhcGVGb3JEb3VibGVRdW90ZXMiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCJkZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsImRlc2MiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJmbiIsImFyZyIsInR5cGUiLCJjYWxsIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIm1ldGhvZCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiUHJvbWlzZUltcGwiLCJpbnZva2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVjb3JkIiwicmVzdWx0IiwiX3R5cGVvZiIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInN0YXRlIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsImRvbmUiLCJtZXRob2ROYW1lIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJlbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJpIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsImtleXMiLCJ2YWwiLCJvYmplY3QiLCJyZXZlcnNlIiwicG9wIiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJjaGFyQXQiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJfc2xpY2VkVG9BcnJheSIsImFyciIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJfaSIsIl9zIiwiX2UiLCJfeCIsIl9yIiwiX2FyciIsIl9uIiwiX2QiLCJBcnJheSIsImlzQXJyYXkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIm8iLCJhbGxvd0FycmF5TGlrZSIsIml0IiwiRiIsInMiLCJuIiwiZSIsIl9lMiIsImYiLCJub3JtYWxDb21wbGV0aW9uIiwiZGlkRXJyIiwic3RlcCIsIl9lMyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwiZnJvbSIsInRlc3QiLCJsZW4iLCJhcnIyIiwiY2FycmlhZ2UiLCJkYXNoZXMiLCJOQU1FIiwiaXNCbG9iIiwiYXJyYXlCdWZmZXIiLCJzdHJlYW0iLCJnZXRGb290ZXIiLCJib3VuZGFyeSIsImdldEhlYWRlciIsImZpZWxkIiwiaGVhZGVyIiwiZm9ybURhdGFJdGVyYXRvciIsImZvcm0iLCJfaXRlcmF0b3IiLCJfc3RlcCIsIl9zdGVwJHZhbHVlIiwiZm9ybURhdGFJdGVyYXRvciQiLCJfY29udGV4dCIsInQxIiwiQWp2Iiwic2NoZW1hIiwiSEFSRXJyb3IiLCJfRXJyb3IiLCJlcnJvcnMiLCJfdGhpczIiLCJfY2FsbFN1cGVyIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJfaW5oZXJpdHMiLCJfd3JhcE5hdGl2ZVN1cGVyIiwiYWp2IiwiYWxsRXJyb3JzIiwiYWRkU2NoZW1hIiwidmFsaWRhdGVIYXJSZXF1ZXN0IiwicmVxdWVzdCIsInZhbGlkYXRlIiwiZ2V0U2NoZW1hIiwidmFsaWQiLCJnZXRIZWFkZXJOYW1lIiwiaGVhZGVycyIsImZpbmQiLCJ0b0xvd2VyQ2FzZSIsImhlYWRlck5hbWUiLCJoYXNIZWFkZXIiLCJCb29sZWFuIiwibWltZVR5cGVKc29uIiwiaXNNaW1lVHlwZUpTT04iLCJtaW1lVHlwZSIsInNvbWUiLCJpbmNsdWRlcyIsInJlZHVjZXIiLCJwYWlyIiwiY3VycmVudFZhbHVlIiwicXVvdGUiLCJzYWZlIiwiaXNTaGVsbFNhZmUiLCJyZXBsYWNlIiwiZXNjYXBlIiwidGFyZ2V0cyIsImF2YWlsYWJsZVRhcmdldHMiLCJ0YXJnZXRJZCIsIl9vYmplY3RTcHJlYWQiLCJjbGllbnRzIiwiY2xpZW50c0J5SWQiLCJjbGllbnRJZCIsImV4dG5hbWUiLCJfdGFyZ2V0cyR0YXJnZXRJZCIsImxpYmN1cmwiLCJ0aXRsZSIsImxpbmsiLCJkZXNjcmlwdGlvbiIsImNvbnZlcnQiLCJmdWxsVXJsIiwiaGVhZGVyc09iaiIsImFsbEhlYWRlcnMiLCJwb3N0RGF0YSIsIl9Db2RlQnVpbGRlciIsImJsYW5rIiwidG9VcHBlckNhc2UiLCJjb29raWUiLCJ0ZXh0IiwiS2V5d29yZCIsIkZpbGUiLCJwYXRoIiwianNUeXBlIiwiaW5wdXQiLCJvYmpFbXB0eSIsImZpbHRlckVtcHR5IiwiZmlsdGVyIiwieCIsInBhZEJsb2NrIiwicGFkU2l6ZSIsInBhZGRpbmciLCJqc1RvRWRuIiwianMiLCJzb3VyY2UiLCJ0cmltIiwiY2xqX2h0dHAiLCJxdWVyeU9iaiIsInVybCIsIm1ldGhvZHMiLCJwYXJhbXMiLCJqc29uT2JqIiwicGFyYW1zT2JqIiwiYm9keSIsIm11bHRpcGFydCIsInBhcmFtIiwiZmlsZU5hbWUiLCJjb250ZW50IiwiYWNjZXB0IiwiZm9ybWF0dGVkUGFyYW1zIiwiY2xvanVyZSIsIm5hdGl2ZSIsInJhd01ldGhvZCIsIl9vcHRpb25zJGluc2VjdXJlU2tpcCIsImluc2VjdXJlU2tpcFZlcmlmeSIsImhlYWRlcnNDb250ZXh0IiwiYm9keUNvbnRleHQiLCJzc2xDb250ZXh0IiwiX25hdGl2ZSIsImNyeXN0YWwiLCJnZXREZWNvbXByZXNzaW9uTWV0aG9kcyIsImFjY2VwdEVuY29kaW5ncyIsInN1cHBvcnRlZE1ldGhvZHMiLCJnemlwIiwiZGVmbGF0ZSIsImFjY2VwdEVuY29kaW5nIiwic3BsaXQiLCJlbmNvZGluZyIsIm1hdGNoIiwiZXhlYyIsImh0dHBjbGllbnQiLCJfcG9zdERhdGEkcGFyYW1zIiwiX3Bvc3REYXRhJHBhcmFtczIiLCJvcHRzIiwiY2xpZW50aGFuZGxlciIsImNvb2tpZXMiLCJkZWNvbXByZXNzaW9uTWV0aG9kcyIsInN1YnN0cmluZyIsImNvbnRlbnRUeXBlIiwicmVzdHNoYXJwIiwiaXNTdXBwb3J0ZWRNZXRob2QiLCJfcmVmMiIsImNzaGFycCIsIl9vcHRpb25zJHNob3dCb2lsZXJwbCIsInNob3dCb2lsZXJwbGF0ZSIsIl9vcHRpb25zJGNoZWNrRXJyb3JzIiwiY2hlY2tFcnJvcnMiLCJfb3B0aW9ucyRwcmludEJvZHkiLCJwcmludEJvZHkiLCJfb3B0aW9ucyR0aW1lb3V0IiwidGltZW91dCIsImVycm9yUGxhY2Vob2xkZXIiLCJlcnJvckNoZWNrIiwiaGFzVGltZW91dCIsImhhc0NsaWVudCIsImNsaWVudCIsImdvIiwiQ1JMRiIsImh0dHAxMSIsInVyaU9iaiIsImh0dHBWZXJzaW9uIiwiYWJzb2x1dGVVUkkiLCJhdXRvQ29udGVudExlbmd0aCIsImF1dG9Ib3N0IiwicmVxdWVzdFVybCIsImhlYWRlcktleXMiLCJrZXlDYXBpdGFsaXplZCIsImhvc3QiLCJCdWZmZXIiLCJieXRlTGVuZ3RoIiwiaGVhZGVyU2VjdGlvbiIsIm1lc3NhZ2VCb2R5IiwiaHR0cCIsImFzeW5jaHR0cCIsIm5ldGh0dHAiLCJva2h0dHAiLCJtZXRob2RzV2l0aEJvZHkiLCJ1bmlyZXN0IiwiamF2YSIsInN0cmluZ2lmeU9iamVjdCIsImF4aW9zIiwiYWRkUG9zdFByb2Nlc3NvciIsInJlcXVlc3RPcHRpb25zIiwiZGF0YSIsIm9wdGlvblN0cmluZyIsImlubGluZUNoYXJhY3RlckxpbWl0IiwiZmV0Y2giLCJpbnB1dE9wdHMiLCJjcmVkZW50aWFscyIsImNvbnRlbnRUeXBlSGVhZGVyIiwidHJhbnNmb3JtIiwiXyIsInByb3BlcnR5Iiwib3JpZ2luYWxSZXN1bHQiLCJqcXVlcnkiLCJzZXR0aW5ncyIsImNyb3NzRG9tYWluIiwicHJvY2Vzc0RhdGEiLCJfZ2V0SGVhZGVyIiwic3RyaW5naWZpZWRTZXR0aW5ncyIsInhociIsImphdmFzY3JpcHQiLCJjb3JzIiwia290bGluIiwicmVxT3B0cyIsInN0cmluZ2lmaWVkT3B0aW9ucyIsImluY2x1ZGVGUyIsImNvb2tpZXNTdHJpbmciLCJlbmNvZGVVUklDb21wb25lbnQiLCJfb3B0aW9ucyRpbmRlbnQiLCJob3N0bmFtZSIsInBvcnQiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJwcm90b2NvbCIsInFzIiwianNvbiIsImZvcm1EYXRhIiwiYXR0YWNobWVudCIsImZpbGVuYW1lIiwiamFyIiwibm9kZSIsInBhcnQiLCJuc0RlY2xhcmF0aW9uIiwibnNDbGFzcyIsInBhcmFtZXRlcnMiLCJvcGVuaW5nIiwibGl0ZXJhbCIsImxpdGVyYWxSZXByZXNlbnRhdGlvbiIsImluZGVudGF0aW9uIiwidmFsdWVzUmVwcmVzZW50YXRpb24iLCJrZXlWYWx1ZVBhaXJzIiwiX2xpdGVyYWxSZXByZXNlbnRhdGlvbiIsIm5zdXJsc2Vzc2lvbiIsInByZXR0eSIsInJlcSIsImhhc0hlYWRlcnMiLCJoYXNCb2R5IiwiX3RvQXJyYXkiLCJoZWFkIiwidGFpbCIsInRvRml4ZWQiLCJvYmpjIiwiY29odHRwIiwiaCIsImIiLCJtIiwib2NhbWwiLCJjb252ZXJ0VHlwZSIsImN1cmwiLCJfb3B0aW9ucyRjbG9zaW5nVGFnIiwiY2xvc2luZ1RhZyIsIl9vcHRpb25zJG1heFJlZGlyZWN0cyIsIm1heFJlZGlyZWN0cyIsIl9vcHRpb25zJG5hbWVkRXJyb3JzIiwibmFtZWRFcnJvcnMiLCJfb3B0aW9ucyRub1RhZ3MiLCJub1RhZ3MiLCJfb3B0aW9ucyRzaG9ydFRhZ3MiLCJzaG9ydFRhZ3MiLCJjdXJsT3B0aW9ucyIsImN1cmxvcHRzIiwiY3VybENvb2tpZXMiLCJzb3J0IiwiZ3V6emxlIiwiX0NvZGVCdWlsZGVyMiIsInJlcXVlc3RDb2RlIiwicmVxdWVzdFB1c2giLCJyZXF1ZXN0Sm9pbiIsImZpZWxkcyIsImNvbnRlbnRzIiwiaW5kZXhPZiIsImNvb2tpZVN0cmluZyIsImxhc3RJbmRlbnQiLCJpdGVtIiwiX2NvbnZlcnRUeXBlIiwiaHR0cDEiLCJjb29raWVzT2JqIiwiaHR0cDIiLCJmaWxlcyIsImZpbGUiLCJmb3JtVmFsdWUiLCJwaHAiLCJnZW5lcmF0ZVBvd2Vyc2hlbGxDb252ZXJ0IiwiY29tbWFuZCIsIm1ldGhvZEFyZyIsImNvbW1hbmRPcHRpb25zIiwicmVzdG1ldGhvZCIsIndlYnJlcXVlc3QiLCJwb3dlcnNoZWxsIiwiY29uY2F0VmFsdWVzIiwiY29uY2F0VHlwZSIsImluZGVudExldmVsIiwiY3VycmVudEluZGVudCIsImNsb3NpbmdCcmFjZUluZGVudCIsIm9wZW5pbmdCcmFjZSIsImNsb3NpbmdCcmFjZSIsInYiLCJweXRob24zIiwiX3JlZiR1cmlPYmoiLCJwYXlsb2FkIiwiaGVhZGVyQ291bnQiLCJjb3VudCIsImJ1aWx0SW5NZXRob2RzIiwicmVxdWVzdHMiLCJoYXNGaWxlcyIsImhhc1BheWxvYWQiLCJqc29uUGF5bG9hZCIsInAiLCJub25GaWxlUGF5bG9hZCIsInB5dGhvbiIsImh0dHIiLCJxdWVyeVN0cmluZyIsImVudHJpZXMiLCJlbnRyaWVzQ291bnQiLCJfcmVmMyIsImlzTGFzdEl0ZW0iLCJtYXliZUNvbW1hIiwiY29va2llSGVhZGVyIiwiYWNjZXB0SGVhZGVyIiwic2V0Q29va2llcyIsIlN0cmluZyIsInNldEFjY2VwdCIsInNldENvbnRlbnRUeXBlIiwib3RoZXJIZWFkZXJzIiwiX3JlZjQiLCJfcmVmNSIsIl9yZWY2IiwiX3JlZjciLCJzZXRIZWFkZXJzIiwiaGVhZGVyQWRkaXRpb25zIiwiciIsImZhcmFkYXkiLCJwYXRobmFtZSIsImNhcE1ldGhvZCIsInJ1YnkiLCJ2YWx1ZXNSZXAiLCJyZXF3ZXN0IiwicHVzaFRvTGFzdCIsImhhc1F1ZXJ5IiwiX09iamVjdCRlbnRyaWVzIiwiX09iamVjdCRlbnRyaWVzJF9pIiwiaGFzRm9ybSIsImlzTXVsdGlwYXJ0IiwiZmlsZVRvUGFydFN0cmluZyIsIl9pMiIsIl9PYmplY3QkZW50cmllczIiLCJfT2JqZWN0JGVudHJpZXMyJF9pIiwiX2kzIiwiX09iamVjdCRlbnRyaWVzMyIsIl9PYmplY3QkZW50cmllczMkX2kiLCJfaTQiLCJfT2JqZWN0JGVudHJpZXM0IiwiX09iamVjdCRlbnRyaWVzNCRfaSIsInJ1c3QiLCJnbG9ib2ZmIiwiaW5zZWN1cmUiLCJnZXRBcmciLCJzaG9ydCIsImxvbmdOYW1lIiwic2hvcnROYW1lIiwiX29wdGlvbnMkYmluYXJ5IiwiYmluYXJ5IiwiX29wdGlvbnMkZ2xvYk9mZiIsImdsb2JPZmYiLCJfb3B0aW9ucyRwcmV0dGlmeUpzb24iLCJwcmV0dGlmeUpzb24iLCJfb3B0aW9ucyRzaG9ydCIsImZvcm1hdHRlZFVybCIsInVuZXNjYXBlIiwiY29udGVudFR5cGVIZWFkZXJOYW1lIiwibm9Cb3VuZGFyeSIsInBvc3QiLCJ1bmVuY29kZWQiLCJlbmNvZGVkIiwibmVlZHNFbmNvZGluZyIsImZsYWciLCJidWlsdFBheWxvYWQiLCJjb3VsZEJlSlNPTiIsInBhcnNlIiwiaHR0cGllIiwiY2VydCIsInByaW50IiwicXVlcnlQYXJhbXMiLCJzdHlsZSIsInZlcmJvc2UiLCJ2ZXJpZnkiLCJyYXciLCJmbGFncyIsImNsaUZsYWdzIiwicG9zdERhdGFUZXh0Iiwid2dldCIsInNoZWxsIiwiYnVpbGRTdHJpbmciLCJzdHIiLCJjb25jYXRBcnJheSIsImxpdGVyYWxEZWNsYXJhdGlvbiIsInBhcnNlSW50Iiwic3dpZnQiLCJpc1RhcmdldCIsInRhcmdldCIsImdvdCIsImlzQ2xpZW50IiwiYWRkVGFyZ2V0IiwiYWRkVGFyZ2V0Q2xpZW50IiwiZXZlbnRTdHJlYW1NYXAiLCJGb3JtRGF0YSIsInF1ZXJ5U3RyaW5naWZ5IiwiZm9ybWF0IiwidXJsRm9ybWF0IiwidXJsUGFyc2UiLCJERUJVR19NT0RFIiwiZGVidWciLCJjb25zb2xlIiwiaXNIYXJFbnRyeSIsImxvZyIsIkhUVFBTbmlwcGV0IiwiaGFyUmVxdWVzdCIsIl9yZXF1ZXN0JGNvb2tpZXMiLCJfcmVxdWVzdCRwb3N0RGF0YSIsImh0dHAyVmVyc2lvblJlZ2V4IiwidG9Mb2NhbGVMb3dlckNhc2UiLCJyZWR1Y2VSaWdodCIsIl9yZXF1ZXN0JHBvc3REYXRhMiIsImlzTmF0aXZlRm9ybURhdGEiLCJfYm91bmRhcnkiLCJhcHBlbmQiLCJwaXBlIiwidXJsV2l0aFBhcnNlZFF1ZXJ5IiwicXVlcnkiLCJzZWFyY2giLCJyZXN1bHRzIiwiX3JlcXVlc3QkcG9zdERhdGEzIiwiYm9keVNpemUiLCJoZWFkZXJzU2l6ZSIsInByZXBhcmUiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/controller/controller.cli.go b/controller/controller.cli.go new file mode 100644 index 00000000..3ad0e1ba --- /dev/null +++ b/controller/controller.cli.go @@ -0,0 +1,112 @@ +//go:build cli + +// Package controller coordinates all the other +// components in the `Lama2` project. The high +// level overview of command execution is easily +// understood from this package +package contoller + +import ( + "fmt" + "os" + + "github.com/HexmosTech/gabs/v2" + "github.com/HexmosTech/httpie-go" + "github.com/HexmosTech/lama2/cmdexec" + "github.com/HexmosTech/lama2/codegen" + "github.com/HexmosTech/lama2/lama2cmd" + outputmanager "github.com/HexmosTech/lama2/outputManager" + "github.com/HexmosTech/lama2/parser" + "github.com/HexmosTech/lama2/preprocess" + "github.com/HexmosTech/lama2/prettify" + "github.com/HexmosTech/lama2/utils" + "github.com/rs/zerolog/log" +) + +func HandleParsedFile(parsedAPI *gabs.Container, o *lama2cmd.Opts, dir string) (httpie.ExResponse, *lama2cmd.Opts) { + vm := cmdexec.GetJSVm() + return HandleParsedFileHelper(parsedAPI, o, dir, vm) +} + +// Process initiates the following tasks in the given order: +// 1. Parse command line arguments +// 2. Read API file contents +// 3. Expand environment variables in API file +// 4. Parse the API contents +// 5. Generate API request command +// 6. Execute command & retrieve results +// 7. Optionally, post-process and write results to a JSON file +func Process(version string) { + o := lama2cmd.GetAndValidateCmd(os.Args) + lama2cmd.ArgParsing(o, version) + + apiContent, err := preprocess.GetLamaFileAsString(o.Positional.LamaAPIFile) + if err != nil { + log.Fatal().Str("Type", "Preprocess").Msg(fmt.Sprint("Couldn't read: ", o.Positional.LamaAPIFile)) + } + _, dir, _ := utils.GetFilePathComponents(o.Positional.LamaAPIFile) + oldDir, _ := os.Getwd() + utils.ChangeWorkingDir(dir) + + preprocess.LoadEnvironments(dir) + utils.ChangeWorkingDir(oldDir) + p := parser.NewLama2Parser() + parsedAPI, e := p.Parse(apiContent) + if o.Convert != "" { + codegen.GenerateTargetCode(o.Convert, parsedAPI) + return + } + + if o.Prettify { + prettify.Prettify(parsedAPI, p.Context, p.MarkRange, apiContent, o.Positional.LamaAPIFile) + return + } + + if e != nil { + log.Fatal(). + Str("Type", "Controller"). + Str("LamaFile", o.Positional.LamaAPIFile). + Str("Error", e.Error()). + Msg("Parse Error") + } + log.Debug().Str("Parsed API", parsedAPI.String()).Msg("") + res, out := HandleParsedFile(parsedAPI, o, dir) + if out.Output != "" { + outputmanager.WriteJSONOutput(res, out.Output) + } +} + +func processBlocks(parsedAPIblocks []*gabs.Container, o *lama2cmd.Opts, dir string) (httpie.ExResponse, *lama2cmd.Opts) { + vm := cmdexec.GetJSVm() + var resp httpie.ExResponse + for i, block := range parsedAPIblocks { + log.Debug().Int("Block num", i).Msg("") + log.Debug().Str("Block getting processed", block.String()).Msg("") + blockType := block.S("type").Data().(string) + switch blockType { + case "processor": + ExecuteProcessorBlock(block, vm) + case "Lama2File": + resp = processLama2FileBlock(block, vm, o, dir) + } + } + return resp, o +} + +func ExecuteRequestorBlockHelper(resp httpie.ExResponse, headersString string, e1 error, vm interface{}) httpie.ExResponse { + if e1 == nil { + chainCode := cmdexec.GenerateChainCode(resp.Body) + cmdexec.RunVMCode(chainCode, vm) + } else { + fmt.Printf("Error from ExecCommand", e1) + os.Exit(1) + } + return resp +} + +func ExecuteProcessorBlock(block *gabs.Container, vm interface{}) { + b := block.S("value").Data().(*gabs.Container) + log.Debug().Str("Processor block incoming block", block.String()).Msg("") + script := b.Data().(string) + cmdexec.RunVMCode(script, vm) +} diff --git a/controller/controller.go b/controller/controller.go index 178da418..18143b5d 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -5,108 +5,77 @@ package contoller import ( - "os" + "fmt" "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/httpie-go" "github.com/HexmosTech/lama2/cmdexec" "github.com/HexmosTech/lama2/cmdgen" - "github.com/HexmosTech/lama2/codegen" "github.com/HexmosTech/lama2/lama2cmd" - outputmanager "github.com/HexmosTech/lama2/outputManager" - "github.com/HexmosTech/lama2/parser" "github.com/HexmosTech/lama2/preprocess" - "github.com/HexmosTech/lama2/prettify" - "github.com/HexmosTech/lama2/utils" - "github.com/dop251/goja" - "github.com/rs/zerolog/log" ) func GetParsedAPIBlocks(parsedAPI *gabs.Container) []*gabs.Container { return parsedAPI.S("value").Data().(*gabs.Container).Children() } -func ExecuteProcessorBlock(block *gabs.Container, vm *goja.Runtime) { - b := block.S("value").Data().(*gabs.Container) - log.Debug().Str("Processor block incoming block", block.String()).Msg("") - script := b.Data().(string) - cmdexec.RunVMCode(script, vm) -} +func extractArgs(args []interface{}) (*lama2cmd.Opts, string) { + var o *lama2cmd.Opts + var dir string -func ExecuteRequestorBlock(block *gabs.Container, vm *goja.Runtime, opts *lama2cmd.Opts, dir string) httpie.ExResponse { - preprocess.ProcessVarsInBlock(block, vm) - // TODO - replace stuff in headers, and varjson and json as well - cmd, stdinBody := cmdgen.ConstructCommand(block, opts) - log.Debug().Str("Stdin Body to be passed into httpie", stdinBody).Msg("") - resp, e1 := cmdexec.ExecCommand(cmd, stdinBody, dir) - log.Debug().Str("Response from ExecCommand", resp.Body).Msg("") - if e1 == nil { - chainCode := cmdexec.GenerateChainCode(resp.Body) - cmdexec.RunVMCode(chainCode, vm) - } else { - log.Fatal().Str("Error from ExecCommand", e1.Error()) - os.Exit(1) - } - return resp -} - -func HandleParsedFile(parsedAPI *gabs.Container, o *lama2cmd.Opts, dir string) { - parsedAPIblocks := GetParsedAPIBlocks(parsedAPI) - vm := cmdexec.GetJSVm() - var resp httpie.ExResponse - for i, block := range parsedAPIblocks { - log.Debug().Int("Block num", i).Msg("") - log.Debug().Str("Block getting processed", block.String()).Msg("") - blockType := block.S("type").Data().(string) - if blockType == "processor" { - ExecuteProcessorBlock(block, vm) - } else if blockType == "Lama2File" { - resp = ExecuteRequestorBlock(block, vm, o, dir) + if len(args) > 0 { + for _, arg := range args { + switch v := arg.(type) { + case *lama2cmd.Opts: + o = v + case string: + dir = v + } } } - if o.Output != "" { - outputmanager.WriteJSONOutput(resp, o.Output) - } + return o, dir } -// Process initiates the following tasks in the given order: -// 1. Parse command line arguments -// 2. Read API file contents -// 3. Expand environment variables in API file -// 4. Parse the API contents -// 5. Generate API request command -// 6. Execute command & retrieve results -// 7. Optionally, post-process and write results to a JSON file -func Process(version string) { - o := lama2cmd.GetAndValidateCmd(os.Args) - lama2cmd.ArgParsing(o, version) - - apiContent := preprocess.GetLamaFileAsString(o.Positional.LamaAPIFile) - _, dir, _ := utils.GetFilePathComponents(o.Positional.LamaAPIFile) - oldDir, _ := os.Getwd() - utils.ChangeWorkingDir(dir) +func processLama2FileBlock(block *gabs.Container, vm interface{}, o *lama2cmd.Opts, dir string) httpie.ExResponse { + fmt.Println("WW: block value before:", block.String()) + preprocess.ProcessVarsInBlock(block, vm) + fmt.Println("WW: block value after:", block.String()) - preprocess.LoadEnvironments(dir) - utils.ChangeWorkingDir(oldDir) - p := parser.NewLama2Parser() - parsedAPI, e := p.Parse(apiContent) - if o.Convert != "" { - codegen.GenerateTargetCode(o.Convert, parsedAPI) - return + cmd, stdinBody := cmdgen.ConstructCommand(block, o) + fmt.Println("WW: cmd:", cmd) + fmt.Println("WW: stdinBody:", stdinBody) + var resp httpie.ExResponse + var e1 error + resp, e1 = cmdexec.ExecCommand(cmd, stdinBody, dir) + headers := resp.Headers + var headersString string + for key, value := range headers { + headersString += fmt.Sprintf("%s: %s\n", key, value) } - if o.Prettify { - prettify.Prettify(parsedAPI, p.Context, p.MarkRange, apiContent, o.Positional.LamaAPIFile) - return - } + resp = ExecuteRequestorBlockHelper(resp, headersString, e1, vm) + return resp +} - if e != nil { - log.Fatal(). - Str("Type", "Controller"). - Str("LamaFile", o.Positional.LamaAPIFile). - Str("Error", e.Error()). - Msg("Parse Error") - } - log.Debug().Str("Parsed API", parsedAPI.String()).Msg("") - HandleParsedFile(parsedAPI, o, dir) +// func processBlocks(parsedAPIblocks []*gabs.Container, o *lama2cmd.Opts, dir string) (httpie.ExResponse, *lama2cmd.Opts) { +// vm := cmdexec.GetJSVm() +// var resp httpie.ExResponse +// for i, block := range parsedAPIblocks { +// log.Debug().Int("Block num", i).Msg("") +// log.Debug().Str("Block getting processed", block.String()).Msg("") +// blockType := block.S("type").Data().(string) +// switch blockType { +// case "processor": +// ExecuteProcessorBlock(block, vm) +// case "Lama2File": +// resp = processLama2FileBlock(block, vm, o, dir) +// } +// } +// return resp, o +// } + +func HandleParsedFileHelper(parsedAPI *gabs.Container, args ...interface{}) (httpie.ExResponse, *lama2cmd.Opts) { + parsedAPIblocks := GetParsedAPIBlocks(parsedAPI) + o, dir := extractArgs(args) + return processBlocks(parsedAPIblocks, o, dir) } diff --git a/controller/controller.wasm.go b/controller/controller.wasm.go new file mode 100644 index 00000000..2a6ee8c9 --- /dev/null +++ b/controller/controller.wasm.go @@ -0,0 +1,100 @@ +//go:build wasm + +package contoller + +import ( + "fmt" + "os" + "strings" + + "github.com/HexmosTech/gabs/v2" + "github.com/HexmosTech/httpie-go" + "github.com/rs/zerolog/log" + + "syscall/js" + + "github.com/HexmosTech/lama2/codegen" + "github.com/HexmosTech/lama2/lama2cmd" + "github.com/HexmosTech/lama2/parser" + + "github.com/HexmosTech/lama2/cmdexec" + preprocess "github.com/HexmosTech/lama2/preprocess" +) + +var worker js.Value + +func HandleParsedFile(parsedAPI *gabs.Container) (httpie.ExResponse, *lama2cmd.Opts) { + fmt.Println("HandleParsedFile:") + fmt.Println("HandleParsedFile:", parsedAPI) + return HandleParsedFileHelper(parsedAPI) +} + +func ProcessWasmInput(data string) (httpie.ExResponse, *lama2cmd.Opts) { + apiContent := data + p := parser.NewLama2Parser() + fmt.Printf("apicontent %+v\n", apiContent) + parsedAPI, e := p.Parse(apiContent) + if e != nil { + fmt.Println("Error while parsing API:", e) + } + + // Print the parsedAPI value + fmt.Printf("Parsed API: %+v\n", parsedAPI) + return HandleParsedFile(parsedAPI) +} + +func ProcessConverterInput(data string, ConvertLang string) (string, error) { + apiContent := data + p := parser.NewLama2Parser() + parsedAPI, e := p.Parse(apiContent) + fmt.Println("Parsed API:", parsedAPI) + if e != nil { + fmt.Println("Error while parsing API:", e) + } + snippet := codegen.GenerateTargetCode(ConvertLang, parsedAPI) + fmt.Println("Generated Snippet:", snippet) + return snippet, nil +} + +func ExecuteRequestorBlockHelper(resp httpie.ExResponse, headersString string, e1 error, vm interface{}) httpie.ExResponse { + targetHeader := "text/html" + isTextHTMLPresent := strings.Contains(headersString, targetHeader) + if isTextHTMLPresent { + fmt.Printf("'%s' is present in the headers.\n", targetHeader) + return resp + } else { + fmt.Printf("'%s' is not present in the headers.\n", targetHeader) + if e1 == nil { + chainCode := cmdexec.GenerateChainCode(resp.Body) + preprocess.RunCodeInWorker(chainCode) + } else { + fmt.Println("Error from ExecCommand", e1) + os.Exit(1) + } + } + return resp +} + +func processBlocks(parsedAPIblocks []*gabs.Container, o *lama2cmd.Opts, dir string) (httpie.ExResponse, *lama2cmd.Opts) { + worker = preprocess.InitWebWorker() // Initialize the web worker + var resp httpie.ExResponse + for i, block := range parsedAPIblocks { + log.Debug().Int("Block num", i).Msg("") + log.Debug().Str("Block getting processed", block.String()).Msg("") + blockType := block.S("type").Data().(string) + switch blockType { + case "processor": + ExecuteProcessorBlock(block) + case "Lama2File": + resp = processLama2FileBlock(block, worker, o, dir) + } + } + return resp, o +} + +func ExecuteProcessorBlock(block *gabs.Container) { + b := block.S("value").Data().(*gabs.Container) + log.Debug().Str("Processor block incoming block", block.String()).Msg("") + script := b.Data().(string) + preprocess.RunCodeInWorker(script) +} diff --git a/docs/Lama2/build.sh b/docs/Lama2/build.sh index caea0c09..72937aac 100755 --- a/docs/Lama2/build.sh +++ b/docs/Lama2/build.sh @@ -1,7 +1,8 @@ #!/bin/bash rm -rf site gomarkdoc --output docs/reference/parser.md ../../parser/ -gomarkdoc --output docs/reference/cmdexec.md ../../cmdexec/ +# Tags are not supported by gomarkdoc yet +# gomarkdoc --output docs/reference/cmdexec.md ../../cmdexec/ gomarkdoc --output docs/reference/cmdgen.md ../../cmdgen/ gomarkdoc --output docs/reference/controller.md ../../controller/ gomarkdoc --output docs/reference/lama2cmd.md ../../lama2cmd/ diff --git a/docs/Lama2/site/arrowl2.png b/docs/Lama2/site/arrowl2.png new file mode 100644 index 00000000..4d0338ec Binary files /dev/null and b/docs/Lama2/site/arrowl2.png differ diff --git a/docs/Lama2/site/hexmos_logo.jpeg b/docs/Lama2/site/hexmos_logo.jpeg new file mode 100644 index 00000000..7628db0d Binary files /dev/null and b/docs/Lama2/site/hexmos_logo.jpeg differ diff --git a/examples/0024_vars_multistage/0024_vars_multistage_acess_token.l2 b/examples/0024_vars_multistage/0024_vars_multistage_acess_token.l2 new file mode 100644 index 00000000..497d4d9f --- /dev/null +++ b/examples/0024_vars_multistage/0024_vars_multistage_acess_token.l2 @@ -0,0 +1,31 @@ +url = "http://google.com" +REMOTE_COORD = "https://httpbin.org" +--- +# stage 1 + +POST +${REMOTE_COORD}/anything + +{ + "username": "admin", + "password": "Password@123", + "from": "${LOCAL_COORD}/anything", + "url": "${url}", + "Token": "MySuperSecretToken" +} + +--- + +// filtering, store in var +console.log("@@Result", result) +TOKEN = result["json"]["Token"] +console.log(TOKEN) + +--- + +# stage 2 +GET +${REMOTE_COORD}/bearer + +Authorization: 'Bearer ${TOKEN}' + diff --git a/go.mod b/go.mod index 17a2fa05..e4b406af 100644 --- a/go.mod +++ b/go.mod @@ -5,34 +5,35 @@ go 1.19 require ( github.com/HexmosTech/gabs/v2 v2.6.5 github.com/HexmosTech/godotenv v0.0.0-20230327154318-72e1f3d32ed3 - github.com/HexmosTech/httpie-go v1.0.8 + github.com/HexmosTech/httpie-go v1.0.11 github.com/Vivino/go-autocomplete-trie v0.0.0-20230301121706-da951497d081 github.com/atotto/clipboard v0.1.4 - github.com/dop251/goja v0.0.0-20230216180835-5937a312edda - github.com/dop251/goja_nodejs v0.0.0-20230207183254-2229640ea097 + github.com/dop251/goja v0.0.0-20240516125602-ccbae20bcec2 + github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d github.com/jessevdk/go-flags v1.5.0 - github.com/rs/zerolog v1.29.0 + github.com/rs/zerolog v1.32.0 ) require ( - code.cloudfoundry.org/bytefmt v0.0.0-20211005130812-5bb3c17173e5 // indirect - github.com/VividCortex/ewma v1.2.0 // indirect + code.cloudfoundry.org/bytefmt v0.0.0-20231017140541-3b893ed0421b // indirect + github.com/VividCortex/ewma v1.1.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect - github.com/dlclark/regexp2 v1.8.0 // indirect + github.com/dlclark/regexp2 v1.7.0 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/pprof v0.0.0-20230207041349-798e818bf904 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mtibben/androiddnsfix v0.0.0-20200907095054-ff0280446354 // indirect github.com/pborman/getopt v1.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/rivo/uniseg v0.4.3 // indirect github.com/stretchr/testify v1.8.1 // indirect - github.com/vbauerster/mpb/v5 v5.4.0 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + github.com/vbauerster/mpb/v5 v5.0.2 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/tools v0.22.0 // indirect ) diff --git a/go.sum b/go.sum index 0f353e7d..5b966e20 100644 --- a/go.sum +++ b/go.sum @@ -1,202 +1,129 @@ -code.cloudfoundry.org/bytefmt v0.0.0-20211005130812-5bb3c17173e5 h1:tM5+dn2C9xZw1RzgI6WTQW1rGqdUimKB3RFbyu4h6Hc= -code.cloudfoundry.org/bytefmt v0.0.0-20211005130812-5bb3c17173e5/go.mod h1:v4VVB6oBMz/c9fRY6vZrwr5xKRWOH5NPDjQZlPk0Gbs= +code.cloudfoundry.org/bytefmt v0.0.0-20231017140541-3b893ed0421b h1:/2OEIBwZAaJ8n8iTXrM4v/+bdyLDTLwcW6RZtkO4+r0= +code.cloudfoundry.org/bytefmt v0.0.0-20231017140541-3b893ed0421b/go.mod h1:CKNYSQxmKcMCNIKoRG5rRR4AIgJMIoK65ya+Z5xHnk4= github.com/HexmosTech/gabs/v2 v2.6.5 h1:08ZCTfpH/ZxGwrjOfipdZ7x75t0svRDIw2qjlGyADLk= github.com/HexmosTech/gabs/v2 v2.6.5/go.mod h1:172vE+burNJgaTsFgfbzzqT4wF+FELkL3t2BCmxa2lo= github.com/HexmosTech/godotenv v0.0.0-20230327154318-72e1f3d32ed3 h1:erCSX5e8CH5f9HjQfpp9SMWuTJXD1ikmW9E9ns1DcwA= github.com/HexmosTech/godotenv v0.0.0-20230327154318-72e1f3d32ed3/go.mod h1:sln7CopgjyZgBSuIw7IkdpwIQf72vgZiy1kgYterloo= -github.com/HexmosTech/httpie-go v1.0.8 h1:xeOFcfkeIIPg1604DRof9LT78AIcvIusqoxrdGZU094= -github.com/HexmosTech/httpie-go v1.0.8/go.mod h1:U2lyp7l8mHMJUBR3DAsa79A2eY1b/FtuMOkUw1vKY8s= +github.com/HexmosTech/httpie-go v1.0.10 h1:UBw2nsCs2mPmpGTR7vYJ/LuVSyt7ckB9PpBcyL6NT1U= +github.com/HexmosTech/httpie-go v1.0.10/go.mod h1:U2lyp7l8mHMJUBR3DAsa79A2eY1b/FtuMOkUw1vKY8s= +github.com/HexmosTech/httpie-go v1.0.11 h1:Nxv85Em3O2Cs0qsQn6+8PXfek/qWiK6W01XMYX+vr84= +github.com/HexmosTech/httpie-go v1.0.11/go.mod h1:U2lyp7l8mHMJUBR3DAsa79A2eY1b/FtuMOkUw1vKY8s= +github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= -github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/Vivino/go-autocomplete-trie v0.0.0-20230301121706-da951497d081 h1:CgfvELsx826xvyUI3te9pUu6K/9xc7INVm6QwdbbH6A= github.com/Vivino/go-autocomplete-trie v0.0.0-20230301121706-da951497d081/go.mod h1:cknpiHPHiypnmvUq1EAV3M0SQQeVY2rPjGt32hNCEDs= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dlclark/regexp2 v1.8.0 h1:rJD5HeGIT/2b5CDk63FVCwZA3qgYElfg+oQK7uH5pfE= -github.com/dlclark/regexp2 v1.8.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja v0.0.0-20221118162653-d4bf6fde1b86/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= -github.com/dop251/goja v0.0.0-20230216180835-5937a312edda h1:yWEvdMtib3RbPysHDTNf/c3gerF5r+iMcmhlAeE6hEk= -github.com/dop251/goja v0.0.0-20230216180835-5937a312edda/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= +github.com/dop251/goja v0.0.0-20240516125602-ccbae20bcec2 h1:OFTHt+yJDo/uaIKMGjEKzc3DGhrpQZoqvMUIloZv6ZY= +github.com/dop251/goja v0.0.0-20240516125602-ccbae20bcec2/go.mod h1:o31y53rb/qiIAONF7w3FHJZRqqP3fzHUr1HqanthByw= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= +github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d h1:W1n4DvpzZGOISgp7wWNtraLcHtnmnTwBlJidqtMIuwQ= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= -github.com/dop251/goja_nodejs v0.0.0-20230207183254-2229640ea097 h1:WsLyDk8yHsVT1puf/32883ZxEb6Pgqd19AlQH9mxVK0= -github.com/dop251/goja_nodejs v0.0.0-20230207183254-2229640ea097/go.mod h1:0tlktQL7yHfYEtjcRGi/eiOkbDR5XF7gyFFvbC5//E0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mtibben/androiddnsfix v0.0.0-20200907095054-ff0280446354 h1:aS4S9U7xE7bwYB6gn/X0BteBAasVEfQwPV5k8trGXW4= github.com/mtibben/androiddnsfix v0.0.0-20200907095054-ff0280446354/go.mod h1:Cu3Rcze2YUpuTWfggCBafY8U9/ckCksdAiONQ7XDvB8= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= +github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= +github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= github.com/pborman/getopt v1.1.0 h1:eJ3aFZroQqq0bWmraivjQNt6Dmm5M0h2JcDW38/Azb0= github.com/pborman/getopt v1.1.0/go.mod h1:FxXoW1Re00sQG/+KIkuSqRL/LwQgSkv7uyac+STFsbk= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= -github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/vbauerster/mpb/v5 v5.4.0 h1:n8JPunifvQvh6P1D1HAl2Ur9YcmKT1tpoUuiea5mlmg= -github.com/vbauerster/mpb/v5 v5.4.0/go.mod h1:fi4wVo7BVQ22QcvFObm+VwliQXlV1eBT8JDaKXR4JGI= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/vbauerster/mpb/v5 v5.0.2 h1:J03Y437wGmtK1Yl012mC/PU6+0ZCA1skJ04hgh+Z/rE= +github.com/vbauerster/mpb/v5 v5.0.2/go.mod h1:at3flS9HS2cEMEqoEJZO3p1cCdAT4AMcclJxgCd6jcA= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201218084310-7d0127a74742/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/l2.go b/l2.go index 4165a7f5..99a7aa54 100644 --- a/l2.go +++ b/l2.go @@ -1,3 +1,5 @@ +//go:build cli + package main import ( @@ -5,10 +7,11 @@ import ( ) var version string +var lamawasm string func main() { if len(version) == 0 { version = "vUnset" } contoller.Process(version) -} +} \ No newline at end of file diff --git a/l2.wasm.go b/l2.wasm.go new file mode 100644 index 00000000..a8f0814d --- /dev/null +++ b/l2.wasm.go @@ -0,0 +1,68 @@ +//go:build wasm + +package main + +import ( + "encoding/json" + "fmt" + "syscall/js" + + controller "github.com/HexmosTech/lama2/controller" +) + +var version string + +func init() { + // Initialize version if not set + if len(version) == 0 { + version = "vUnset" + } +} + +func main() { + //Set the global JavaScript property "goWebRequestFunc" to the result of wasmLamaPromise + js.Global().Set("goWebRequestFunc", wasmLamaPromise()) + js.Global().Set("goCmdConvertFunc", wasmCodeConverter()) + + // Block the main function to keep the Go WebAssembly running + select {} +} + +func wasmLamaPromise() js.Func { + return js.FuncOf(func(this js.Value, args []js.Value) interface{} { + inputdata := args[0].String() + handler := js.FuncOf(func(this js.Value, args []js.Value) interface{} { + resolve := args[0] + go func() { + result, _ := controller.ProcessWasmInput(inputdata) + resultJSON, err := json.Marshal(result) + if err != nil { + fmt.Println("Error:", err) + return + } + resolve.Invoke(js.ValueOf(string(resultJSON))) + }() + return nil + }) + promiseConstructor := js.Global().Get("Promise") + return promiseConstructor.New(handler) + }) +} + +func wasmCodeConverter() js.Func { + return js.FuncOf(func(this js.Value, args []js.Value) interface{} { + inputdata := args[0].String() + convertLang := args[1].String() + fmt.Println("inputdata", inputdata) + handler := js.FuncOf(func(this js.Value, args []js.Value) interface{} { + resolve := args[0] + go func() { + result, _ := controller.ProcessConverterInput(inputdata,convertLang) + resolve.Invoke(js.ValueOf(result)) + }() + return nil + }) + promiseConstructor := js.Global().Get("Promise") + return promiseConstructor.New(handler) + }) +} diff --git a/l2env/l2env.go b/l2env/l2env.go index ea27a8b6..8d2f27d2 100644 --- a/l2env/l2env.go +++ b/l2env/l2env.go @@ -5,15 +5,11 @@ import ( "github.com/HexmosTech/lama2/preprocess" trie "github.com/Vivino/go-autocomplete-trie" - "github.com/rs/zerolog/log" ) func ProcessEnvironmentVariables(searchQuery, directory string) interface{} { envMap, err := preprocess.GetL2EnvVariables(directory) if err != nil { - // Potential Errors: - // - JSON marshalling errors. - log.Error().Str("Type", "Preprocess").Msg(err.Error()) os.Exit(0) } if searchQuery == "" { // Handle empty searchQuery: "" diff --git a/l2lsp/methods/lsp_lifecycle.go b/l2lsp/methods/lsp_lifecycle.go index f93c7eaf..d6df260d 100644 --- a/l2lsp/methods/lsp_lifecycle.go +++ b/l2lsp/methods/lsp_lifecycle.go @@ -6,7 +6,7 @@ import ( "github.com/HexmosTech/lama2/l2lsp/request" "github.com/HexmosTech/lama2/l2lsp/response" - "github.com/rs/zerolog/log" + // "github.com/rs/zerolog/log" ) func Initialize(req request.JSONRPCRequest) response.JSONRPCResponse { @@ -41,7 +41,7 @@ func Initialize(req request.JSONRPCRequest) response.JSONRPCResponse { } } */ - log.Info().Msg("L2 LSP initialized") + // log.Info().Msg("L2 LSP initialized") serverCapabilities := response.ServerCapabilities{ TextDocumentSync: 0, @@ -65,7 +65,7 @@ func Shutdown(req request.JSONRPCRequest, isShutdownRequested bool) response.JSO } */ - log.Info().Msg("L2 LSP shutdown requested") + // log.Info().Msg("L2 LSP shutdown requested") isShutdownRequested = true return response.CreateSuccessResponse(req.ID, nil) @@ -80,7 +80,7 @@ func Exit(isShutdownRequested bool) response.JSONRPCResponse { } */ - log.Info().Msg("L2 LSP exit requested") + // log.Info().Msg("L2 LSP exit requested") exitCode := 1 if isShutdownRequested { diff --git a/l2lsp/methods/lsp_suggestEnv.go b/l2lsp/methods/lsp_suggestEnv.go index df10b12d..551e851a 100644 --- a/l2lsp/methods/lsp_suggestEnv.go +++ b/l2lsp/methods/lsp_suggestEnv.go @@ -9,7 +9,6 @@ import ( l2envpackege "github.com/HexmosTech/lama2/l2env" "github.com/HexmosTech/lama2/l2lsp/request" "github.com/HexmosTech/lama2/l2lsp/response" - "github.com/rs/zerolog/log" ) func getSearchQueryString(req request.JSONRPCRequest) string { @@ -41,43 +40,17 @@ func getRequestURI(req request.JSONRPCRequest) (string, int, error) { } else if strings.Contains(uri, "\\") { return "", response.ErrUnsupportedFeature, errors.New("Windows is not supported as of now. To contribute visit here: https://github.com/HexmosTech/Lama2") } else { - // Log the unexpected URI scheme - log.Warn().Str("URI", uri).Msg("Encountered unexpected URI scheme.") return "", response.ErrUnexpectedURIScheme, errors.New("encountered unexpected URI scheme. Ex: 'file:///path/to/workspace/myapi.l2'") } } func SuggestEnvironmentVariables(req request.JSONRPCRequest) response.JSONRPCResponse { - /* - { - "jsonrpc": "2.0", - "id": 2, - "method": "suggest/environmentVariables", - "params": { - "textDocument": { - "uri": "file:///home/lovestaco/repos/Lama2/elfparser/ElfTestSuite/root_variable_override/api/y_0020_root_override.l2" - }, - "position": { - "line": 1, - "character": 2 - }, - "relevantSearchString": "" - } - } - */ - - log.Info().Msg("L2 LSP environment variables suggestion requested") - log.Info().Str("Method", req.Method).Interface("Params", req.Params) - searchQuery := getSearchQueryString(req) - log.Debug().Str("Method", req.Method).Interface("searchQuery", searchQuery) uri, errorCode, err := getRequestURI(req) if err != nil { return response.ErrorResp(req, errorCode, err.Error()) } - log.Debug().Str("Method", req.Method).Interface("uri", uri) parentFolder := filepath.Dir(uri) - log.Debug().Str("Method", req.Method).Interface("parentFolder", parentFolder) res := l2envpackege.ProcessEnvironmentVariables(searchQuery, parentFolder) return response.CreateEnvironmentVariablesResp(req, res) } diff --git a/l2lsp/server.go b/l2lsp/server.go index 03d05f96..4c480b80 100644 --- a/l2lsp/server.go +++ b/l2lsp/server.go @@ -7,17 +7,12 @@ import ( "os" "github.com/HexmosTech/lama2/l2lsp/request" - outputmanager "github.com/HexmosTech/lama2/outputManager" - "github.com/rs/zerolog/log" ) func init() { - outputmanager.ConfigureZeroLog("INFO") } func StartLspServer() { - log.Info().Msg("Started process") - scanner := bufio.NewScanner(os.Stdin) writer := bufio.NewWriter(os.Stdout) @@ -27,17 +22,14 @@ func StartLspServer() { } func handleInput(input string, writer *bufio.Writer) { - log.Info().Msgf("Received input: %s", input) var rpcRequest request.JSONRPCRequest if err := json.Unmarshal([]byte(input), &rpcRequest); err != nil { - log.Error().Err(err).Msg("Error decoding JSON-RPC request") return } rpcResponse := HandleMethod(rpcRequest) if responseData, err := json.Marshal(rpcResponse); err != nil { - log.Error().Err(err).Msg("Error encoding JSON-RPC response") } else { writer.WriteString(string(responseData) + "\n") writer.Flush() diff --git a/lama2cmd/lama2cmd.go b/lama2cmd/lama2cmd.go index a4a92ccf..ac62db0b 100644 --- a/lama2cmd/lama2cmd.go +++ b/lama2cmd/lama2cmd.go @@ -1,3 +1,4 @@ + // Package `lama2cmd` provides CLI argument parsing facilities. // It hosts the `Opts` structure to record user intentions package lama2cmd diff --git a/main_cc_2.wasm b/main_cc_2.wasm new file mode 100755 index 00000000..2dd45ed7 Binary files /dev/null and b/main_cc_2.wasm differ diff --git a/makefile b/makefile index 44e9d208..d62dec15 100644 --- a/makefile +++ b/makefile @@ -2,11 +2,11 @@ all: test lint gofumpt buildme mkdocs buildme: go mod tidy - go build -o build/l2 -ldflags "-X main.version=`git tag --sort=-version:refname | head -n 1`" l2.go + go build -tags=cli -o build/l2 -ldflags "-X main.version=`git tag --sort=-version:refname | head -n 1`" l2.go debug: go mod tidy - go build -gcflags=all="-N -l" -ldflags=-w -ldflags=-compressdwarf=false + go build -tags=cli -gcflags=all="-N -l" -ldflags=-w -ldflags=-compressdwarf=false echo "\033[31m(1) At localhost:8081, set gdbserver address as localhost:8082;\n(2) Also run "monitor exit" from gdb client to terminate the server\033[0m" -pkill -9 gdbgui && true gdbgui -p 8081& @@ -24,7 +24,8 @@ gofumpt: test: make buildme - go test ./tests/ -count=1 -v + go test -tags=cli ./tests/ -count=1 -v + benchmark: go test -bench=. -count 1 -run=^# -benchmem ./tests/ @@ -44,6 +45,6 @@ clean: setbuild: # Use for clearing exising L2 and set built L2 as global go mod tidy - go build -o build/l2 -ldflags "-X main.version=`git tag --sort=-version:refname | head -n 1`" l2.go + go build -tags=cli -o build/l2 -ldflags "-X main.version=`git tag --sort=-version:refname | head -n 1`" l2.go sudo rm -rf /usr/local/bin/l2 sudo cp build/l2 /usr/local/bin/l2 \ No newline at end of file diff --git a/outputManager/output_manager.go b/outputManager/output_manager.go index d8d5bb2a..b6ecbb8b 100644 --- a/outputManager/output_manager.go +++ b/outputManager/output_manager.go @@ -1,3 +1,5 @@ + + // Package `outputmanager` provides facilities for controlling // the logging library as well as capabilities to post-process // API execution results (such as store results as a JSON file) diff --git a/parser/headers.go b/parser/headers.go index 1a35ecdb..a6bb73c1 100644 --- a/parser/headers.go +++ b/parser/headers.go @@ -5,20 +5,17 @@ import ( "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/lama2/utils" - "github.com/rs/zerolog/log" ) var DataInputType string func (p *Lama2Parser) HeaderData() (*gabs.Container, error) { headers, e := p.Match([]string{"Headers"}) - log.Trace().Str("Headers", headers.String()).Msg("") if e != nil { return nil, e } jsond, e2 := p.Match([]string{"DataInput"}) - log.Trace().Str("JSONd", jsond.String()).Msg("") temp := gabs.New() temp = utils.SetJSON(temp, headers, "headers") if e2 == nil { @@ -111,8 +108,5 @@ func (p *Lama2Parser) HeaderPair() (*gabs.Container, error) { valueStr, _ := value.Data().(string) keyStr, _ := key.Data().(string) temp.Set(valueStr, keyStr) - - log.Trace().Str("Header pair", temp.String()).Msg("") - return temp, nil } diff --git a/parser/jsonparser.go b/parser/jsonparser.go index db1b02c0..61306ef5 100644 --- a/parser/jsonparser.go +++ b/parser/jsonparser.go @@ -5,7 +5,6 @@ import ( "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/lama2/utils" - "github.com/rs/zerolog/log" ) // AnyType is the top-most element of a JSON structure @@ -75,7 +74,6 @@ func (p *Lama2Parser) Map() (*gabs.Container, error) { if err != nil { break } - log.Trace().Str("Pair result", item.String()).Msg("") temp.MergeFn(item, CustomPairMerge) _, e = p.Keyword(",", true, true, true) diff --git a/parser/lama2parser.go b/parser/lama2parser.go index 2ec76458..5036033b 100644 --- a/parser/lama2parser.go +++ b/parser/lama2parser.go @@ -6,7 +6,6 @@ import ( "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/lama2/utils" - "github.com/rs/zerolog/log" ) type Lama2Parser struct { @@ -26,7 +25,6 @@ func NewLama2Parser() *Lama2Parser { // Start primarily calls the Lama2File method func (p *Lama2Parser) Start() (*gabs.Container, error) { - log.Trace().Msg("Within the Start function") temp := gabs.New() res, e := p.Match([]string{"Lama2File"}) if e == nil { @@ -40,8 +38,6 @@ func (p *Lama2Parser) Start() (*gabs.Container, error) { func (p *Lama2Parser) Lama2File() (*gabs.Container, error) { // Trying to get: // PSBlock? Requestor [SPSBlock Requestor]* - - log.Trace().Msg("Within Lama2File") temp := gabs.New() tempArr, e1 := temp.Array() if e1 != nil { @@ -59,7 +55,6 @@ func (p *Lama2Parser) Lama2File() (*gabs.Container, error) { } else if procE1 == nil && sepE1 != nil { return nil, utils.NewParseError(p.Pos+1, p.LineNum+1, "Processor without subsequent requestor block found", []string{}) } else { - log.Debug().Str("Found separator", "---").Msg("") } // match requester @@ -70,8 +65,6 @@ func (p *Lama2Parser) Lama2File() (*gabs.Container, error) { tempArr.ArrayAppend(res3) - log.Debug().Str("Parse structure so far", tempArr.String()) - // until file is done: var res4, res5 *gabs.Container var procE2, e5 error @@ -109,10 +102,8 @@ func (p *Lama2Parser) Lama2File() (*gabs.Container, error) { } func (p *Lama2Parser) Processor() (*gabs.Container, error) { - log.Trace().Msg("Within Processor") // A Processor cannot start with any of the HTTP Verbs res := p.LookAhead([]string{"HTTPVerb"}) - log.Debug().Bool("HTTPVerb LookAhead result", res) if res { return nil, utils.NewParseError(p.Pos+1, p.LineNum+1, "HTTPVerb found at start of block; cannot be a Requestor block", []string{}) } @@ -120,13 +111,10 @@ func (p *Lama2Parser) Processor() (*gabs.Container, error) { res2, _ := p.MatchUntil("\n---\n") temp.Set("processor", "type") temp.Set(res2, "value") - log.Debug().Str("Processor block parsed", res2.String()).Msg("") - return temp, nil } func (p *Lama2Parser) Separator() (*gabs.Container, error) { - log.Trace().Msg("Within Separator") temp := gabs.New() s, e := p.Keyword("---\n", false, false, false) temp.Set(string(s)) @@ -139,7 +127,6 @@ func (p *Lama2Parser) Separator() (*gabs.Container, error) { // Requester applies the rule: // HTTPVerb Multipart? TheURL Details? func (p *Lama2Parser) Requester() (*gabs.Container, error) { - log.Trace().Msg("Within Requester") res, e := p.Match([]string{"HTTPVerb"}) temp := gabs.New() if e == nil { @@ -174,27 +161,6 @@ func (p *Lama2Parser) Requester() (*gabs.Container, error) { func (p *Lama2Parser) TheURL() (*gabs.Container, error) { res := []string{} - /* - kw, e := p.Keyword("http", true, false, true) - if e == nil { - res = append(res, string(kw)) - } else { - return nil, utils.NewParseError(p.Pos+1, p.LineNum+1, "Couldn't find URL (starting with http(s)", []string{}) - } - - _, e = p.CharClass("s") - if e == nil { - res = append(res, "s") - } - - _, e = p.Keyword("://", false, false, true) - if e == nil { - res = append(res, "://") - } else { - return nil, utils.NewParseError(p.Pos+1, p.LineNum+1, "Couldn't find URL (starting with http(s)://", []string{}) - } - */ - for { up, err := p.CharClass("A-Za-z0-9-._~:/?#[]@!$&'()*+,;%=}{") if err == nil { @@ -212,7 +178,6 @@ func (p *Lama2Parser) TheURL() (*gabs.Container, error) { } func (p *Lama2Parser) HTTPVerb() (*gabs.Container, error) { - log.Trace().Msg("Within HTTPVerb") verbList := []string{ "get", "head", "post", "put", "delete", "connect", "trace", "patch", diff --git a/parser/match.go b/parser/match.go index 21f9e99e..1dee5dff 100644 --- a/parser/match.go +++ b/parser/match.go @@ -2,12 +2,12 @@ package parser import ( "errors" + "fmt" "reflect" "strings" "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/lama2/utils" - "github.com/rs/zerolog/log" ) // Method Match is the most important of all in the @@ -31,12 +31,9 @@ func (p *Parser) Match(rules []string) (*gabs.Container, error) { for _, rule := range rules { initialPos := p.Pos - log.Trace().Str("Rule", rule).Strs("Rules", rules).Msg("") res := p.ruleMethodMap[rule].Call([]reflect.Value{}) op := res[0].Interface().(*gabs.Container) - log.Trace().Str("Rule res", op.String()).Msg("") e := res[1] - log.Trace().Str("Rule error", e.String()).Msg("") if e.IsNil() { p.eatWhitespace() return op, nil @@ -70,12 +67,10 @@ func (p *Parser) LookAhead(rules []string) bool { for _, rule := range rules { initialPos := p.Pos - log.Trace().Str("Rule", rule).Strs("Rules", rules).Msg("") res := p.ruleMethodMap[rule].Call([]reflect.Value{}) op := res[0].Interface().(*gabs.Container) - log.Trace().Str("Rule res", op.String()).Msg("") + fmt.Println(op.String()) e := res[1] - log.Trace().Str("Rule error", e.String()).Msg("") p.Pos = initialPos if e.IsNil() { p.eatWhitespace() diff --git a/parser/parser.go b/parser/parser.go index 3a43e538..03d9b503 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -89,6 +89,7 @@ func (p *Parser) Parse(text string) (*gabs.Container, error) { p.cache = make(map[string][]string) p.LineNum = 0 res, _ := p.Pm.Start() + // TODO : Getting Null value from Start() function for multistage files _, err := p.assertEnd() if err != nil { return nil, err diff --git a/preprocess/expandvar.cli.go b/preprocess/expandvar.cli.go new file mode 100644 index 00000000..91632e5b --- /dev/null +++ b/preprocess/expandvar.cli.go @@ -0,0 +1,71 @@ +//go:build cli + +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// General environment variables. + +package preprocess + +import ( + "github.com/HexmosTech/lama2/utils" + "github.com/dop251/goja" + "github.com/rs/zerolog/log" +) + + +// Expand replaces ${var} or $var in the string based on the mapping function. +// For example, os.ExpandEnv(s) is equivalent to os.Expand(s, os.Getenv). +func Expand(s string, vm interface{}, mapping map[string]string) string { + var buf []byte + // ${} is all ASCII, so bytes are fine for this operation. + i := 0 + for j := 0; j < len(s); j++ { + if s[j] == '$' && j+1 < len(s) { + if buf == nil { + buf = make([]byte, 0, 2*len(s)) + } + buf = append(buf, s[i:j]...) + name, w := getShellName(s[j+1:]) + //nolint:all + if name == "" && w > 0 { + // Encountered invalid syntax; eat the + // characters. + } else if name == "" { + // Valid syntax, but $ was not followed by a + // name. Leave the dollar character untouched. + buf = append(buf, s[j]) + } else { + buf = getJsValue(vm, name, mapping, buf) + // buf = getJsValue(name, mapping, buf) + } + j += w + i = j + 1 + } + } + res := "" + if buf == nil { + res = s + } else { + res = string(buf) + s[i:] + } + res2 := utils.RemoveUnquotedValueMarker(res) + return res2 +} + +func getJsValue(vm interface{}, name string, mapping map[string]string, buf []byte) []byte { + jsVal := vm.(*goja.Runtime).Get(name) + if jsVal != nil { + buf = append(buf, []byte(jsVal.String())...) + } else { + val, ok := mapping[name] + if ok { + buf = append(buf, val...) + } else { + buf = append(buf, ""...) + log.Warn().Str("Couldn't find the variable `"+name+"`, in both Javascript processor block and environment variables. Replacing with empty string", "").Msg("") + } + } + return buf +} diff --git a/preprocess/expandvar.go b/preprocess/expandvar.go index cfc73919..f1093c42 100644 --- a/preprocess/expandvar.go +++ b/preprocess/expandvar.go @@ -1,3 +1,4 @@ + // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -10,76 +11,8 @@ import ( "os" "strings" - "github.com/HexmosTech/lama2/utils" - "github.com/dop251/goja" - "github.com/rs/zerolog/log" ) -// Expand replaces ${var} or $var in the string based on the mapping function. -// For example, os.ExpandEnv(s) is equivalent to os.Expand(s, os.Getenv). -func Expand(s string, vm *goja.Runtime, mapping map[string]string) string { - var buf []byte - // ${} is all ASCII, so bytes are fine for this operation. - i := 0 - for j := 0; j < len(s); j++ { - if s[j] == '$' && j+1 < len(s) { - if buf == nil { - buf = make([]byte, 0, 2*len(s)) - } - buf = append(buf, s[i:j]...) - name, w := getShellName(s[j+1:]) - //nolint:all - if name == "" && w > 0 { - // Encountered invalid syntax; eat the - // characters. - } else if name == "" { - // Valid syntax, but $ was not followed by a - // name. Leave the dollar character untouched. - buf = append(buf, s[j]) - } else { - jsVal := vm.Get(name) - if jsVal != nil { - buf = append(buf, []byte(jsVal.String())...) - } else { - val, ok := mapping[name] - if ok { - buf = append(buf, val...) - } else { - buf = append(buf, ""...) - log.Warn().Str("Couldn't find the variable `"+name+"`, in both Javascript processor block and environment variables. Replacing with empty string", "").Msg("") - } - } - } - j += w - i = j + 1 - } - } - res := "" - if buf == nil { - res = s - } else { - res = string(buf) + s[i:] - } - res2 := utils.RemoveUnquotedValueMarker(res) - return res2 -} - -func getEnvironMap() map[string]string { - m := make(map[string]string) - for _, e := range os.Environ() { - if i := strings.Index(e, "="); i >= 0 { - m[e[:i]] = e[i+1:] - } - } - return m -} - -// ExpandEnv replaces ${var} or $var in the string according to the values -// of the current environment variables. References to undefined -// variables are replaced by the empty string. -func ExpandEnv(s string, vm *goja.Runtime) string { - return Expand(s, vm, getEnvironMap()) -} // isShellSpecialVar reports whether the character identifies a special // shell variable such as $*. @@ -123,34 +56,19 @@ func getShellName(s string) (string, int) { return s[:i], i } -/* -// Getenv retrieves the value of the environment variable named by the key. -// It returns the value, which will be empty if the variable is not present. -// To distinguish between an empty value and an unset value, use LookupEnv. -func Getenv(key string) string { - testlog.Getenv(key) - v, _ := syscall.Getenv(key) - return v -} - -// LookupEnv retrieves the value of the environment variable named -// by the key. If the variable is present in the environment the -// value (which may be empty) is returned and the boolean is true. -// Otherwise the returned value will be empty and the boolean will -// be false. -func LookupEnv(key string) (string, bool) { - testlog.Getenv(key) - return syscall.Getenv(key) -} - -// Clearenv deletes all environment variables. -func Clearenv() { - syscall.Clearenv() +// ExpandEnv replaces ${var} or $var in the string according to the values +// of the current environment variables. References to undefined +// variables are replaced by the empty string. +func ExpandEnv(s string, vm interface{}) string { + return Expand(s, vm, getEnvironMap()) } -// Environ returns a copy of strings representing the environment, -// in the form "key=value". -func Environ() []string { - return syscall.Environ() -} -*/ +func getEnvironMap() map[string]string { + m := make(map[string]string) + for _, e := range os.Environ() { + if i := strings.Index(e, "="); i >= 0 { + m[e[:i]] = e[i+1:] + } + } + return m +} \ No newline at end of file diff --git a/preprocess/expandvar.wasm.go b/preprocess/expandvar.wasm.go new file mode 100644 index 00000000..d5e17a59 --- /dev/null +++ b/preprocess/expandvar.wasm.go @@ -0,0 +1,73 @@ +//go:build wasm + +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// General environment variables. + +package preprocess + +import ( + "github.com/HexmosTech/lama2/utils" + "github.com/rs/zerolog/log" + "fmt" +) + +// Expand replaces ${var} or $var in the string based on the mapping function. +// For example, os.ExpandEnv(s) is equivalent to os.Expand(s, os.Getenv). +func Expand(s string, vm interface{}, mapping map[string]string) string { + var buf []byte + // ${} is all ASCII, so bytes are fine for this operation. + i := 0 + for j := 0; j < len(s); j++ { + if s[j] == '$' && j+1 < len(s) { + if buf == nil { + buf = make([]byte, 0, 2*len(s)) + } + buf = append(buf, s[i:j]...) + name, w := getShellName(s[j+1:]) + //nolint:all + if name == "" && w > 0 { + // Encountered invalid syntax; eat the + // characters. + } else if name == "" { + // Valid syntax, but $ was not followed by a + // name. Leave the dollar character untouched. + buf = append(buf, s[j]) + } else { + // buf = getJsValue(vm, name, mapping, buf) + buf = getJsValue(name, mapping, buf) + fmt.Println("WW: Buffer value:",name, string(buf)) + } + j += w + i = j + 1 + } + } + res := "" + if buf == nil { + res = s + } else { + res = string(buf) + s[i:] + } + res2 := utils.RemoveUnquotedValueMarker(res) + return res2 +} +func getJsValue(name string, mapping map[string]string, buf []byte) []byte { + log.Debug().Str("WW Getting from worker", name).Msg(""); + jsVal := GetFromWorker(name) + fmt.Println("WW: getjsvalue",name,jsVal) + log.Debug().Str("WW JavaScript Variable Value:", jsVal).Msg(""); + if jsVal != "" { + buf = append(buf, []byte(jsVal)...) + } else { + val, ok := mapping[name] + if ok { + buf = append(buf, val...) + } else { + buf = append(buf, ""...) + log.Warn().Str("Couldn't find the variable `"+name+"`, in both Javascript processor block and environment variables. Replacing with empty string", "").Msg("") + } + } + return buf +} diff --git a/preprocess/preprocess.go b/preprocess/preprocess.go index b102dc38..a21b80a0 100644 --- a/preprocess/preprocess.go +++ b/preprocess/preprocess.go @@ -16,44 +16,9 @@ import ( "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/godotenv" "github.com/HexmosTech/lama2/utils" - "github.com/dop251/goja" "github.com/rs/zerolog/log" ) -func ProcessVarsInBlock(block *gabs.Container, vm *goja.Runtime) { - ExpandURL(block, vm) - ExpandHeaders(block, vm) - ExpandJSON(block, vm) -} - -func ExpandHeaders(block *gabs.Container, vm *goja.Runtime) { - headerMap := block.S("details", "headers") - log.Debug().Str("HeaderMap", headerMap.String()).Msg("") - if headerMap == nil { - return - } - newHeaderMap := gabs.New() - for k, v := range headerMap.ChildrenMap() { - log.Trace().Strs("Header pair", []string{k, " = ", v.String()}).Msg("") - key := ExpandEnv(k, vm) - val := ExpandEnv(v.Data().(*gabs.Container).Data().(string), vm) - valWrap := gabs.New() - valWrap.Set(val) - newHeaderMap.Set(valWrap, key) - } - block.Delete("details", "headers") - block.Set(newHeaderMap, "details", "headers") - log.Debug().Str("Expanded Header block", block.String()).Msg("") -} - -func ExpandURL(block *gabs.Container, vm *goja.Runtime) { - b := block.S("url", "value").Data().(string) - log.Debug().Str("Url block", b).Msg("") - url := ExpandEnv(b, vm) - block.Delete("url", "value") - block.Set(url, "url", "value") -} - func debugOp(str string) { file, err := os.Create("output.txt") if err != nil { @@ -73,32 +38,11 @@ func debugOp(str string) { func escapeString(input string) string { output, err := json.Marshal(input) if err != nil { - log.Error().Str("Error marshaling JSON:", "escapeString()") + fmt.Println("Error marshaling JSON: escapeString()") } return string(output) } -func ExpandJSON(block *gabs.Container, vm *goja.Runtime) { - log.Debug().Str("JSON block to be expanded", block.String()).Msg("") - dataBlock := block.S("details", "ip_data") - if dataBlock == nil { - return - } - dataBlockStr := dataBlock.String() - dataBlockStr = ExpandEnv(dataBlockStr, vm) - // dataBlockStr = escapeString(dataBlockStr) - dataBlockStr = strings.ReplaceAll(dataBlockStr, "\n", "") - log.Debug().Str("Expanded JSON data block", dataBlockStr).Msg("") - processedBlock, err := gabs.ParseJSON([]byte(dataBlockStr)) - if err != nil { - log.Error().Str("Preprocess JSON block issue", "").Msg("") - return - } - block.Delete("details", "ip_data") - block.Set(processedBlock, "details", "ip_data") - log.Debug().Str("Processed JSON block", block.String()).Msg("") -} - func SearchL2ConfigEnv(dir string) (string, error) { parentDir := dir for parentDir != string(filepath.Separator) { @@ -116,14 +60,14 @@ func LoadEnvFile(l2path string) { envFileName := filepath.Base(l2path) err := godotenv.Load(l2path) if err != nil { - log.Info().Str("Type", "Preprocess").Msg("Didn't find " + envFileName + " in the API directory") + fmt.Println("Didn't find " + envFileName + " in the API directory") } } func LoadEnvironments(dir string) { l2ConfigPath, err := SearchL2ConfigEnv(dir) if err != nil { - log.Info().Str("Type", "Preprocess").Msg(err.Error()) + fmt.Println("Type", "Preprocess", err) } else { LoadEnvFile(l2ConfigPath) // Loads global variables from l2config.env } @@ -193,12 +137,13 @@ func GetL2EnvVariables(dir string) (map[string]map[string]interface{}, error) { return finalEnvMap, nil } -func GetLamaFileAsString(path string) string { +func GetLamaFileAsString(path string) (string, error) { b, err := ioutil.ReadFile(path) // just pass the file name if err != nil { - log.Fatal().Str("Type", "Preprocess").Msg(fmt.Sprint("Couldn't read: ", path)) + log.Printf("Couldn't read: %s\n", path) + return "", fmt.Errorf("failed to read file: %w", err) } - return string(b) + return string(b), nil } // LamaFile takes in a path to an API file. @@ -208,7 +153,7 @@ func GetLamaFileAsString(path string) string { // Once done, it reverts back to the original directory, // and returns the processed l2 file. func LamaFile(inputFile string) (string, string) { - content := GetLamaFileAsString(inputFile) + content, _ := GetLamaFileAsString(inputFile) _, dir, _ := utils.GetFilePathComponents(inputFile) oldDir, _ := os.Getwd() @@ -219,3 +164,59 @@ func LamaFile(inputFile string) (string, string) { return content, dir } + +func ProcessVarsInBlock(block *gabs.Container, vm interface{}) { + ExpandURL(block, vm) + ExpandHeaders(block, vm) + ExpandJSON(block, vm) +} + +func ExpandHeaders(block *gabs.Container, vm interface{}) { + headerMap := block.S("details", "headers") + log.Debug().Str("HeaderMap", headerMap.String()).Msg("") + if headerMap == nil { + return + } + newHeaderMap := gabs.New() + for k, v := range headerMap.ChildrenMap() { + log.Trace().Strs("Header pair", []string{k, " = ", v.String()}).Msg("") + key := ExpandEnv(k, vm) + val := ExpandEnv(v.Data().(*gabs.Container).Data().(string), vm) + valWrap := gabs.New() + valWrap.Set(val) + newHeaderMap.Set(valWrap, key) + } + block.Delete("details", "headers") + block.Set(newHeaderMap, "details", "headers") + log.Debug().Str("Expanded Header block", block.String()).Msg("") +} + +func ExpandURL(block *gabs.Container, vm interface{}) { + b := block.S("url", "value").Data().(string) + log.Debug().Str("Url block", b).Msg("") + url := ExpandEnv(b, vm) + fmt.Println("WW: Expanded URL:", url) + block.Delete("url", "value") + block.Set(url, "url", "value") +} + +func ExpandJSON(block *gabs.Container, vm interface{}) { + log.Debug().Str("JSON block to be expanded", block.String()).Msg("") + dataBlock := block.S("details", "ip_data") + if dataBlock == nil { + return + } + dataBlockStr := dataBlock.String() + dataBlockStr = ExpandEnv(dataBlockStr, vm) + // dataBlockStr = escapeString(dataBlockStr) + dataBlockStr = strings.ReplaceAll(dataBlockStr, "\n", "") + log.Debug().Str("Expanded JSON data block", dataBlockStr).Msg("") + processedBlock, err := gabs.ParseJSON([]byte(dataBlockStr)) + if err != nil { + log.Error().Str("Preprocess JSON block issue", "").Msg("") + return + } + block.Delete("details", "ip_data") + block.Set(processedBlock, "details", "ip_data") + log.Debug().Str("Processed JSON block", block.String()).Msg("") +} diff --git a/preprocess/webworker.wasm.go b/preprocess/webworker.wasm.go new file mode 100644 index 00000000..00c3ca29 --- /dev/null +++ b/preprocess/webworker.wasm.go @@ -0,0 +1,111 @@ +//go:build wasm + +package preprocess + +import ( + "fmt" + "syscall/js" + + "github.com/rs/zerolog/log" +) + +var worker js.Value + +func InitWebWorker() js.Value { + if worker.IsUndefined() { + script := ` + var result; + + self.addEventListener("message", function (e) { + const { type, payload } = e.data; + + if (type === "execute") { + console.log("WW: Execute Request!", payload); + try { + const evalresult = eval(payload); + self.postMessage({ status: "success", evalresult }); + } catch (error) { + console.log("WW: Execute Request! Failed:", error.message); + self.postMessage({ status: "error", error: error.message }); + } + } else if (type === "get") { + const variableName = payload; + var value = self[variableName]; + if (value == null) { + value = variableName; + } + console.log("WW: Execute Get!", payload, value); + console.log("WW: getfromworker worker.js", payload, value); + self.postMessage({ status: "success", value }); + } else if (type === "close") { + console.log("WW: Closing worker"); + self.close(); + } else { + console.log("WW: Error Unknown request type"); + self.postMessage({ status: "error", error: "Unknown request type" }); + } + }); + ` + // Convert the script into a Blob and create a new worker + blob := js.Global().Get("Blob").New([]interface{}{script}, map[string]interface{}{"type": "application/javascript"}) + workerURL := js.Global().Get("URL").Call("createObjectURL", blob) + worker = js.Global().Get("Worker").New(workerURL) + + worker.Call("addEventListener", "message", js.FuncOf(func(this js.Value, args []js.Value) interface{} { + result := args[0].Get("data").Get("result") + err := args[0].Get("data").Get("error") + if err.String() != "null" { + fmt.Println("Error from web worker:", err) + } else { + fmt.Println("Result from web worker:", result) + } + return nil + })) + } + return worker +} + + +func RunCodeInWorker(chainCode string) { + // Ensure the worker is initialized + InitWebWorker() + // Send the message to the worker + worker.Call("postMessage", map[string]interface{}{ + "type": "execute", + "payload": chainCode, + }) +} + + +func GetFromWorker(variableName string) string { + + worker := InitWebWorker() + responseChannel := make(chan js.Value,20) + + worker.Call("postMessage", map[string]interface{}{ + "type": "get", + "payload": variableName, + }) + + worker.Call("addEventListener", "message", js.FuncOf(func(this js.Value, args []js.Value) interface{} { + data := args[0].Get("data") + if data.Get("value").IsUndefined() { + log.Error().Msg("WW: data is undefined, skipping write to responseChannel") + return nil + } + + select { + case responseChannel <- data: + log.Debug().Msg("WW: Returning Result from web worker:") + default: + log.Error().Msg("WW: responseChannel is full, cannot write data") + } + return nil + })) + + fmt.Println("WW: Webworker call complete:", variableName) + var result js.Value + result = <-responseChannel + fmt.Println("WW: getfromworker webworker.go", variableName, result.Get("value").String()) + return result.Get("value").String() +} diff --git a/preprocess/webworkerusingeval.txt b/preprocess/webworkerusingeval.txt new file mode 100644 index 00000000..2f64dcad --- /dev/null +++ b/preprocess/webworkerusingeval.txt @@ -0,0 +1,85 @@ +package preprocess + +import ( + "fmt" + "syscall/js" + "log" + "time" +) + +// Initialize and return the eval function +func InitWebWorker() js.Value { + fmt.Println("WW: Running eval function") + global := js.Global() + eval := global.Get("eval") + if eval.IsUndefined() { + log.Fatal("eval function not found") + } + return eval +} + +// Run JavaScript code using eval +func RunCodeInWorker(jsCode string) (string, error) { + eval := InitWebWorker() + + // Define a result channel for handling asynchronous results + resultChan := make(chan string) + + // Create a callback function to receive the result + js.FuncOf(func(this js.Value, p []js.Value) interface{} { + resultChan <- p[0].String() + return nil + }) + + // Execute the JavaScript code + eval.Invoke(jsCode) + + // Wait for the result from the callback + result := <-resultChan + return result, nil +} + +// Get a value from JavaScript using eval +func GetFromWorker(variableName string) (string) { + + // Create a JavaScript code string to retrieve the variable's value + jsCode := fmt.Sprintf("typeof %s !== 'undefined' ? %s : 'undefined'", variableName, variableName) + + // Run the JavaScript code to get the variable's value + result, err := RunCodeInWorker(jsCode) + if err != nil { + return "" + } + return result +} + + +func asyncTask(resultChan0 chan<- string) { + time.Sleep(2 * time.Second) + resultChan0 <- "Task Completed" +} + +func RunCodeInWorker(jsCode string) (string, error) { + global := js.Global() + eval := global.Get("eval") + eval.Invoke(jsCode) + + resultChan0 := make(chan string) + go asyncTask(resultChan0) + results := <-resultChan0 + fmt.Println(results) + + evalAsync := global.Get("evaluateAsync") + if !evalAsync.Truthy() { + return "", fmt.Errorf("evaluateAsync function not found") + } + resultChan := make(chan string) + + callback := js.FuncOf(func(this js.Value, p []js.Value) interface{} { + resultChan <- p[0].String() + return nil + }) + evalAsync.Invoke(jsCode, callback) + result := <-resultChan + return result, nil +} \ No newline at end of file diff --git a/prettify/prettify.go b/prettify/prettify.go index 76c5d32d..a37954da 100644 --- a/prettify/prettify.go +++ b/prettify/prettify.go @@ -7,13 +7,13 @@ import ( "github.com/HexmosTech/gabs/v2" "github.com/HexmosTech/lama2/utils" - "github.com/rs/zerolog/log" + // "github.com/rs/zerolog/log" ) func Prettify(parsedAPI *gabs.Container, context map[string]bool, markRange map[string]int, content string, fPath string) { defer func() { if err := recover(); err != nil { // catch - log.Debug().Msg("Potential issue with prettify") + // log.Debug().Msg("Potential issue with prettify") // os.Exit(0) } }() diff --git a/tests/error_test.go b/tests/error_test.go new file mode 100644 index 00000000..122ea1b0 --- /dev/null +++ b/tests/error_test.go @@ -0,0 +1,28 @@ +package tests + +import ( + "testing" + + "github.com/HexmosTech/lama2/lama2cmd" + "github.com/HexmosTech/lama2/preprocess" +) + +func TestWrongLama2FileFormat(t *testing.T) { + ipArgs := []string{ + "l2", + "xyz", + } + defer func() { + if r := recover(); r != nil { + // This code will execute if GetLamaFileAsString panics + t.Logf("Recovered from panic: %v", r) + } + }() + o := *lama2cmd.GetAndValidateCmd(ipArgs) + _, err := preprocess.GetLamaFileAsString(o.Positional.LamaAPIFile) + if err == nil { + t.Error("Expected failure on faulty file format") + } else { + t.Log("Correctly failed on faulty file format") + } +} diff --git a/tests/js_test.go b/tests/js_test.go index 16ba966e..b677fe0d 100644 --- a/tests/js_test.go +++ b/tests/js_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/HexmosTech/lama2/cmdexec" + "github.com/dop251/goja" ) func TestRunVMCode(_ *testing.T) { @@ -15,7 +16,7 @@ func TestRunVMCode(_ *testing.T) { func TestJSVmNegative(t *testing.T) { vm := cmdexec.GetJSVm() - _, e := vm.RunString("faulty JS code") + _, e := vm.(*goja.Runtime).RunString("faulty JS code") if e == nil { t.Errorf("Expected failure on faulty JS code") } @@ -23,7 +24,7 @@ func TestJSVmNegative(t *testing.T) { func TestJSVm(t *testing.T) { vm := cmdexec.GetJSVm() - _, e := vm.RunString("let x=10") + _, e := vm.(*goja.Runtime).RunString("let x=10") if e != nil { t.Errorf("Expected nil on valid JS code") } diff --git a/tests/lama2_test.go b/tests/lama2_test.go index e73f361d..20b110fe 100644 --- a/tests/lama2_test.go +++ b/tests/lama2_test.go @@ -123,7 +123,7 @@ func TestJsonParserExhaustive(t *testing.T) { } jsonText, e := FileToString(m) if e != nil { - log.Fatal().Str("Error:", e.Error()).Msg("") + // log.Fatal().Str("Error:", e.Error()).Msg("") } gj, e2 := jsonFileToGabs(m) @@ -181,25 +181,25 @@ func TestNegativeJsonParserExhaustive(t *testing.T) { "n_structure_whitespace_formfeed.json", } for _, m := range matchFiles { - log.Trace().Msg("### === === === === ===") + // log.Trace().Msg("### === === === === ===") if utils.ContainsStringPartial(ignoreNames, m) { continue } - log.Trace().Str("m", m).Msg("") + // log.Trace().Str("m", m).Msg("") jsonText, e := FileToString(m) - log.Trace().Str("JSONText", jsonText).Msg("") + // log.Trace().Str("JSONText", jsonText).Msg("") if e != nil { - log.Trace().Msg("fileToString failed") + // log.Trace().Msg("fileToString failed") return } preamble := "POST\nhttp://google.com\n" lamaText := preamble + jsonText - log.Trace().Str("LamaText", lamaText).Msg("") + // log.Trace().Str("LamaText", lamaText).Msg("") _, e3 := PerformParserMatch(lamaText) if e3 == nil { t.Fatalf("Expected parser to fail for %s", m) } - log.Trace().Msg("*** === === === === ===") + // log.Trace().Msg("*** === === === === ===") } } diff --git a/tests/multistage_test.go b/tests/multistage_test.go index 94f17520..ddfa9bd9 100644 --- a/tests/multistage_test.go +++ b/tests/multistage_test.go @@ -3,10 +3,12 @@ package tests import ( "fmt" "os" + "strings" "testing" controller "github.com/HexmosTech/lama2/controller" "github.com/HexmosTech/lama2/parser" + testutils "github.com/HexmosTech/lama2/tests/utils" ) func TestMultiStageCount(t *testing.T) { @@ -79,3 +81,20 @@ func TestUnquotedVars(t *testing.T) { t.Fatalf("Expected requestor block count = 2") } } + +func TestMultiStageResults(t *testing.T) { + fpath := "../examples/0024_vars_multistage/0024_vars_multistage_acess_token.l2" + cmdArgs := []string{fpath} + + output, err := testutils.RunL2CommandAndGetOutput(cmdArgs...) + fmt.Println(output) + if err != nil { + t.Errorf("Error running L2 command: %v", err) + return + } + + expectedOutputPart := "\"authenticated\": true" + if !strings.Contains(output, expectedOutputPart) { + t.Errorf("Expected output to contain %q, but got %q", expectedOutputPart, output) + } +} diff --git a/tests/parser_test.go b/tests/parser_test.go index c679b5b8..ac9f5cbd 100644 --- a/tests/parser_test.go +++ b/tests/parser_test.go @@ -1,12 +1,14 @@ package tests import ( + "fmt" "reflect" "strings" "testing" "github.com/HexmosTech/lama2/parser" "github.com/rs/zerolog/log" + // "github.com/rs/zerolog/log" ) func TestLama2Parser(_ *testing.T) { @@ -108,11 +110,11 @@ func TestMatch(t *testing.T) { got, e := p.Match([]string{"Lama2File"}) if e == nil { log.Debug().Str("Got", got.String()).Msg("") - // fmt.Println(got) - // fmt.Println("===") + fmt.Println(got) + fmt.Println("===") } else { t.Errorf("Error not expected") - // fmt.Println(e) + fmt.Println(e) } } @@ -124,7 +126,7 @@ func TestFailMatch(t *testing.T) { log.Debug().Str("Got", got.String()).Msg("") t.Errorf("Expected an error!") } - // fmt.Println("===") + fmt.Println("===") } func TestLama2Start(_ *testing.T) { diff --git a/tests/utils/test_utils.go b/tests/utils/test_utils.go index ca06b3fb..9eea9959 100644 --- a/tests/utils/test_utils.go +++ b/tests/utils/test_utils.go @@ -7,7 +7,7 @@ import ( "os" "os/exec" - "github.com/rs/zerolog/log" + // "github.com/rs/zerolog/log" ) type EnvData struct { @@ -40,12 +40,12 @@ func runCommand(binPath string, cmdArgs ...string) (string, error) { err := cmd.Run() if err != nil { - log.Error().Str("Error", stderr.String()).Msg("Error running command") + // log.Error().Str("Error", stderr.String()).Msg("Error running command") return "", fmt.Errorf("error running command: %v", err) } output := stdout.String() - log.Debug().Str("Test env_command", output).Msg("Output from command") + // log.Debug().Str("Test env_command", output).Msg("Output from command") return output, nil } diff --git a/todo.md b/todo.md new file mode 100644 index 00000000..ebf1f74e --- /dev/null +++ b/todo.md @@ -0,0 +1 @@ +cmdgen 3 folders dependancy from controller diff --git a/utils/utils.cli.go b/utils/utils.cli.go new file mode 100644 index 00000000..09a87b76 --- /dev/null +++ b/utils/utils.cli.go @@ -0,0 +1,47 @@ +//go:build cli + +// Package `utils` provides useful functions for +// simplifying various programming tasks +package utils + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/rs/zerolog/log" +) + + +// ChangeWorkingDirectory tries to set the CWD; on failure +// it exits with a log error message +func ChangeWorkingDir(dir string) { + if dir == "" { + log.Error(). + Str("Type", "Preprocess"). + Msg("Directory path is empty") + return + } + + log.Debug(). + Str("Type", "Preprocess"). + Str("dir", dir). + Msg("Attempting to change directory") + + err := os.Chdir(dir) + if err != nil { + log.Fatal(). + Str("Type", "Preprocess"). + Str("dir", dir). + Msg("Moving into dir failed") + } +} + +func MarshalAndPrintJSON(data interface{}) { + filteredJSON, err := json.MarshalIndent(data, "", " ") + if err != nil { + log.Error().Str("Type", "Preprocess").Msg(fmt.Sprintf("Failed to marshal JSON: %v", err)) + os.Exit(0) + } + fmt.Println(string(filteredJSON)) +} diff --git a/utils/utils.go b/utils/utils.go index f5e15d7f..1d109afd 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -15,7 +15,6 @@ import ( "unicode" "github.com/HexmosTech/gabs/v2" - "github.com/rs/zerolog/log" ) // The following string fragment is used to mark unquoted @@ -119,18 +118,6 @@ func GetFilePathComponents(name string) (string, string, string) { return fullpath, dir, fname } -// ChangeWorkingDirectory tries to set the CWD; on failure -// it exits with a log error message -func ChangeWorkingDir(dir string) { - err := os.Chdir(dir) - if err != nil { - log.Fatal(). - Str("Type", "Preprocess"). - Str("dir", dir). - Msg(fmt.Sprint("Moving into dir failed")) - } -} - func downloadFile(filepath string, url string) (err error) { // Create the file out, err := os.Create(filepath) @@ -169,12 +156,3 @@ func UpdateSelf() { cmd.Stderr = os.Stderr _ = cmd.Run() } - -func MarshalAndPrintJSON(data interface{}) { - filteredJSON, err := json.MarshalIndent(data, "", " ") - if err != nil { - log.Error().Str("Type", "Preprocess").Msg(fmt.Sprintf("Failed to marshal JSON: %v", err)) - os.Exit(0) - } - fmt.Println(string(filteredJSON)) -} diff --git a/utils/utils.wasm.go b/utils/utils.wasm.go new file mode 100644 index 00000000..f0bd45db --- /dev/null +++ b/utils/utils.wasm.go @@ -0,0 +1,29 @@ +//go:build wasm + +// Package `utils` provides useful functions for +// simplifying various programming tasks +package utils + +import ( + "encoding/json" + "fmt" + + "os" +) + +// ChangeWorkingDirectory tries to set the CWD; on failure +// it exits with a log error message +func ChangeWorkingDir(dir string) { + err := os.Chdir(dir) + if err != nil { + fmt.Println(string(err.Error())) + } +} + +func MarshalAndPrintJSON(data interface{}) { + filteredJSON, err := json.MarshalIndent(data, "", " ") + if err != nil { + os.Exit(0) + } + fmt.Println(string(filteredJSON)) +} diff --git a/wasmbuild.sh b/wasmbuild.sh new file mode 100755 index 00000000..e48a1fc5 --- /dev/null +++ b/wasmbuild.sh @@ -0,0 +1,5 @@ +#!/bin/bash +GOOS=js GOARCH=wasm go build -a -gcflags=all="-l -B -wb=false" -ldflags="-w -s" -o static/main.wasm +cp /home/sreedeep/Downloads/Lama2/static/main.wasm /home/sreedeep/js-widget/dist/main.wasm + +